mirror of
https://github.com/anomalyco/opencode.git
synced 2026-05-17 10:02:51 +00:00
SDK throwOnError paths now convert structured response bodies into real Error instances while preserving the original body and status in cause.
58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
export * from "./gen/types.gen.js"
|
|
|
|
import { createClient } from "./gen/client/client.gen.js"
|
|
import { type Config } from "./gen/client/types.gen.js"
|
|
import { OpencodeClient } from "./gen/sdk.gen.js"
|
|
import { wrapClientError } from "./error-interceptor.js"
|
|
export { type Config as OpencodeClientConfig, OpencodeClient }
|
|
|
|
function pick(value: string | null, fallback?: string) {
|
|
if (!value) return
|
|
if (!fallback) return value
|
|
if (value === fallback) return fallback
|
|
if (value === encodeURIComponent(fallback)) return fallback
|
|
return value
|
|
}
|
|
|
|
function rewrite(request: Request, directory?: string) {
|
|
if (request.method !== "GET" && request.method !== "HEAD") return request
|
|
|
|
const value = pick(request.headers.get("x-opencode-directory"), directory)
|
|
if (!value) return request
|
|
|
|
const url = new URL(request.url)
|
|
if (!url.searchParams.has("directory")) {
|
|
url.searchParams.set("directory", value)
|
|
}
|
|
|
|
const next = new Request(url, request)
|
|
next.headers.delete("x-opencode-directory")
|
|
return next
|
|
}
|
|
|
|
export function createOpencodeClient(config?: Config & { directory?: string }) {
|
|
if (!config?.fetch) {
|
|
const customFetch: any = (req: any) => {
|
|
// @ts-ignore
|
|
req.timeout = false
|
|
return fetch(req)
|
|
}
|
|
config = {
|
|
...config,
|
|
fetch: customFetch,
|
|
}
|
|
}
|
|
|
|
if (config?.directory) {
|
|
config.headers = {
|
|
...config.headers,
|
|
"x-opencode-directory": encodeURIComponent(config.directory),
|
|
}
|
|
}
|
|
|
|
const client = createClient(config)
|
|
client.interceptors.request.use((request) => rewrite(request, config?.directory))
|
|
client.interceptors.error.use(wrapClientError)
|
|
return new OpencodeClient({ client })
|
|
}
|