export type Metrics = Record; export interface ExperimentSummary { experiment_id: string; strategy_name: string; strategy_version: string; dataset_id: string; period_start: string; period_end_exclusive: string; metrics: Metrics; } export interface EquityPoint { timestamp: string; equity: number; gross_exposure: number; } export interface Trade { symbol: string; entry_time: string; exit_time: string; quantity: number; entry_price: number; exit_price: number; gross_pnl: number; costs: number; net_pnl: number; exit_reason: string; } export interface DatasetAudit { rows: number; symbols: number; first_timestamp: string; last_timestamp: string; invalid_ohlc_rows: number; zero_volume_rows: number; intraday_unexpected_gaps: number; archive_sha256: string; } export interface Health { status: string; completed_experiments: number; dataset_audit_available: boolean; } async function request(path: string): Promise { const response = await fetch(path); if (!response.ok) { throw new Error(`API request failed (${response.status})`); } return response.json() as Promise; } export const api = { health: () => request("/health"), audit: () => request("/api/v1/dataset/audit"), experiments: () => request<{ items: ExperimentSummary[] }>("/api/v1/experiments?limit=100"), equity: (id: string) => request(`/api/v1/experiments/${encodeURIComponent(id)}/equity`), trades: (id: string, offset = 0) => request<{ items: Trade[]; total: number }>( `/api/v1/experiments/${encodeURIComponent(id)}/trades?offset=${offset}&limit=25` ) };