/** * HTTP client for the opencode-bridge server extension. */ import { URLExt } from '@jupyterlab/coreutils'; import { ServerConnection } from '@jupyterlab/services'; import type { OpenCodeProvidersResponse, OpenCodeRequest, OpenCodeResponse } from '../types'; /** * Call POST /opencode-bridge/edit. Returns parsed response (success or failure). * Throws on network error or non-JSON response. */ export async function callOpenCodeEdit( request: OpenCodeRequest, serverSettings: ServerConnection.ISettings ): Promise { const url = URLExt.join( serverSettings.baseUrl, 'opencode-bridge', 'edit' ); const init: RequestInit = { method: 'POST', body: JSON.stringify(request), headers: { 'Content-Type': 'application/json' }, }; let response: Response; try { response = await ServerConnection.makeRequest(url, init, serverSettings); } catch (error) { throw new Error( `network error calling opencode-bridge: ${(error as Error).message}` ); } const text = await response.text(); if (!text) { throw new Error( `empty response from opencode-bridge (status ${response.status})` ); } let parsed: unknown; try { parsed = JSON.parse(text); } catch (e) { throw new Error( `non-JSON response from opencode-bridge (status ${response.status})` ); } return parsed as OpenCodeResponse; } /** * Call GET /opencode-bridge/providers. Returns the parsed JSON response. * Throws on network error or non-2xx status. */ export async function callOpenCodeProviders( serverSettings: ServerConnection.ISettings ): Promise { const url = URLExt.join( serverSettings.baseUrl, 'opencode-bridge', 'providers' ); let response: Response; try { response = await ServerConnection.makeRequest(url, { method: 'GET' }, serverSettings); } catch (error) { throw new Error( `network error calling opencode-bridge/providers: ${(error as Error).message}` ); } if (!response.ok) { throw new Error( `opencode-bridge/providers failed: ${response.status} ${response.statusText}` ); } return (await response.json()) as OpenCodeProvidersResponse; }