/** * Shared types for the opencode-bridge frontend. * * Mirrors the Python server's response shapes in `opencode_bridge/routes.py` * and the OpenCode Serve SSE event shape documented in * `/Users/taochen/temp/demo.html` (`handleGlobalEvent` / `processSessionEvent`). * * v4: POST /edit is async (returns immediately with sessionId). The LLM * reply is consumed via the GET /events SSE stream. Each SSE event is * a JSON object with a `type` string; consumers route on `type`. */ export interface ErrorOutput { ename: string; evalue: string; traceback: string[]; } export interface CellContext { notebookPath: string; cellId: string; language: string; cellIndex: number; totalCells: number; source: string; previousCode: string | null; error: ErrorOutput | null; } export interface OpenCodeRequest { prompt: string; context: CellContext; providerId?: string; modelId?: string; } /** * Response from POST /opencode-bridge/edit (async). * The actual assistant reply arrives via the /events SSE stream and is * NOT embedded in this response. */ export interface OpenCodeEditSuccess { ok: true; sessionId: string; notebookPath: string; } export interface OpenCodeEditFailure { ok: false; error: string; } export type OpenCodeEditResponse = OpenCodeEditSuccess | OpenCodeEditFailure; /** * One SSE event from GET /opencode-bridge/events (proxied from OpenCode * Serve's /global/event). The shape is loosely typed because OpenCode's * payload envelope is not strictly documented; we follow demo.html's * defensive property lookup pattern (try top-level then nested under * `payload`). */ export interface OpenCodeEvent { type: string; payload?: { type?: string; properties?: { [k: string]: any }; syncEvent?: { aggregateID?: string }; }; properties?: { [k: string]: any }; syncEvent?: { aggregateID?: string }; } /** Response from GET /opencode-bridge/session-messages?notebook=... . * Projected from OpenCode's {info, parts}[] by the server into a * frontend-friendly {role, content}[]. */ export interface OpenCodeMessage { role: "user" | "assistant"; content: string; } export interface OpenCodeMessagesResponse { messages: OpenCodeMessage[]; } /** Response from GET /opencode-bridge/providers (proxies OpenCode /config/providers). * Each Provider.models is a Record keyed by modelID (NOT an array). */ export interface OpenCodeModel { id: string; name?: string; [k: string]: unknown; } export interface OpenCodeProvider { id: string; name?: string; source?: string; models: { [modelID: string]: OpenCodeModel }; } export interface OpenCodeProvidersResponse { providers: OpenCodeProvider[]; default?: { [providerID: string]: string }; }