import { request, getBaseUrlValue } from './client' export interface ChatMessage { role: 'user' | 'assistant' | 'system' content: string } export interface StartRunRequest { input: string | ChatMessage[] instructions?: string conversation_history?: ChatMessage[] session_id?: string model?: string } export interface StartRunResponse { run_id: string status: string } // SSE event types from /v1/runs/{id}/events export interface RunEvent { event: string run_id?: string delta?: string tool?: string name?: string preview?: string timestamp?: number error?: string } export async function startRun(body: StartRunRequest): Promise { return request('/v1/runs', { method: 'POST', body: JSON.stringify(body), }) } export function streamRunEvents( runId: string, onEvent: (event: RunEvent) => void, onDone: () => void, onError: (err: Error) => void, ) { const baseUrl = getBaseUrlValue() const url = `${baseUrl}/v1/runs/${runId}/events` let closed = false const source = new EventSource(url) source.onmessage = (e) => { if (closed) return try { const parsed = JSON.parse(e.data) onEvent(parsed) if (parsed.event === 'run.completed' || parsed.event === 'run.failed') { closed = true source.close() onDone() } } catch { onEvent({ event: 'message', delta: e.data }) } } source.onerror = () => { if (closed) return closed = true source.close() onError(new Error('SSE connection error')) } // Return AbortController-compatible object return { abort: () => { if (!closed) { closed = true source.close() } }, } as unknown as AbortController } export async function fetchModels(): Promise<{ data: Array<{ id: string }> }> { return request('/v1/models') }