summaryrefslogtreecommitdiffhomepage
path: root/packages/sdk/js/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/sdk/js/src')
-rw-r--r--packages/sdk/js/src/v2/client.ts19
1 files changed, 19 insertions, 0 deletions
diff --git a/packages/sdk/js/src/v2/client.ts b/packages/sdk/js/src/v2/client.ts
index 2d71d8446..8b49e7f10 100644
--- a/packages/sdk/js/src/v2/client.ts
+++ b/packages/sdk/js/src/v2/client.ts
@@ -84,5 +84,24 @@ export function createOpencodeClient(config?: Config & { directory?: string; exp
return response
})
+ // The generated client falls back to throwing a literal `{}` when the server
+ // responds with an empty / unparseable error body, which surfaces as a bare
+ // `{}` in TUI / CLI error output. Wrap ONLY that case in a real Error so
+ // downstream formatters get a useful message — but pass through any parsed
+ // JSON error body unchanged so existing consumers can still inspect fields.
+ client.interceptors.error.use((error, response, request) => {
+ const isEmpty =
+ error === undefined ||
+ error === null ||
+ error === "" ||
+ (typeof error === "object" && !(error instanceof Error) && Object.keys(error).length === 0)
+ if (!isEmpty) return error
+ const method = request?.method ?? "?"
+ const url = request?.url ?? "?"
+ if (!response) return new Error(`opencode server ${method} ${url}: network error (no response)`)
+ const status = response.status
+ const statusText = response.statusText ? " " + response.statusText : ""
+ return new Error(`opencode server ${method} ${url} → ${status}${statusText}: (empty response body)`)
+ })
return new OpencodeClient({ client })
}