Files
CodeNomad/packages/ui/src/lib/sdk-manager.ts
Shantur Rathore 1377bc6b91 Migrate UI to v2 SDK client
Use v2 OpencodeClient with normalized request handling and rehydrate pending permissions via GET /permission on instance hydration.
2026-01-04 22:02:30 +00:00

52 lines
1.3 KiB
TypeScript

import { createOpencodeClient, type OpencodeClient } from "@opencode-ai/sdk/v2/client"
import { CODENOMAD_API_BASE } from "./api-client"
class SDKManager {
private clients = new Map<string, OpencodeClient>()
createClient(instanceId: string, proxyPath: string): OpencodeClient {
const existing = this.clients.get(instanceId)
if (existing) {
return existing
}
const baseUrl = buildInstanceBaseUrl(proxyPath)
const client = createOpencodeClient({ baseUrl })
this.clients.set(instanceId, client)
return client
}
getClient(instanceId: string): OpencodeClient | null {
return this.clients.get(instanceId) ?? null
}
destroyClient(instanceId: string): void {
this.clients.delete(instanceId)
}
destroyAll(): void {
this.clients.clear()
}
}
export type { OpencodeClient }
function buildInstanceBaseUrl(proxyPath: string): string {
const normalized = normalizeProxyPath(proxyPath)
const base = stripTrailingSlashes(CODENOMAD_API_BASE)
return `${base}${normalized}/`
}
function normalizeProxyPath(proxyPath: string): string {
const withLeading = proxyPath.startsWith("/") ? proxyPath : `/${proxyPath}`
return withLeading.replace(/\/+/g, "/").replace(/\/+$/, "")
}
function stripTrailingSlashes(input: string): string {
return input.replace(/\/+$/, "")
}
export const sdkManager = new SDKManager()