From e899b2d4821cbde7b7bc6021ac15714892355158 Mon Sep 17 00:00:00 2001 From: Alex Feies Date: Thu, 27 Aug 2026 22:23:26 -0400 Subject: [PATCH 1/3] Add working devcontainer file --- .devcontainer/devcontainer.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..a9f9f63e --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,16 @@ +{ + "name": "OpenCode Dev", + "image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04", + + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "24" + } + }, + + "postCreateCommand": "curl -fsSL https://bun.sh/install | bash && ~/.bun/bin/bun install", + + "remoteEnv": { + "PATH": "${containerEnv:PATH}:/home/vscode/.bun/bin" + } +} \ No newline at end of file From 0f0a26b2abb45f74f71960961b471608ea52ae2f Mon Sep 17 00:00:00 2001 From: Alex Feies Date: Tue, 8 Sep 2026 00:39:24 +0000 Subject: [PATCH 2/3] Refactor error.ts message function to reduce complexity --- packages/opencode/src/provider/error.ts | 71 +++++++++++++++---------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/packages/opencode/src/provider/error.ts b/packages/opencode/src/provider/error.ts index 21149a2c..d76e2851 100644 --- a/packages/opencode/src/provider/error.ts +++ b/packages/opencode/src/provider/error.ts @@ -29,42 +29,59 @@ function isOpenAiErrorRetryable(e: APICallError) { // Providers not reliably handled in this function: // - z.ai: can accept overflow silently (needs token-count/context-window checks) +function emptyMessage(e: APICallError) { + if (e.message !== "") return undefined + if (e.responseBody) return e.responseBody + if (e.statusCode) { + const err = STATUS_CODES[e.statusCode] + if (err) return err + } + return "Unknown error" +} + +function responseBodyMessage(e: APICallError, msg: string) { + if (!e.responseBody || (e.statusCode && msg !== STATUS_CODES[e.statusCode])) return undefined + + try { + const body = JSON.parse(e.responseBody) + const errMsg = body.message || body.error || body.error?.message + if (errMsg && typeof errMsg === "string") { + return `${msg}: ${errMsg}` + } + } catch {} + + return undefined +} + +function gatewayMessage(e: APICallError, msg: string) { + if (!/^\s*` to re-authenticate." + } + if (e.statusCode === 403) { + return "Forbidden: request was blocked by a gateway or proxy. You may not have permission to access this resource — check your account and provider settings." + } + + return msg +} + function message(providerID: ProviderV2.ID, e: APICallError) { return iife(() => { const msg = e.message - if (msg === "") { - if (e.responseBody) return e.responseBody - if (e.statusCode) { - const err = STATUS_CODES[e.statusCode] - if (err) return err - } - return "Unknown error" - } + + const fallback = emptyMessage(e) + if (fallback) return fallback if (!e.responseBody || (e.statusCode && msg !== STATUS_CODES[e.statusCode])) { return msg } - try { - const body = JSON.parse(e.responseBody) - // try to extract common error message fields - const errMsg = body.message || body.error || body.error?.message - if (errMsg && typeof errMsg === "string") { - return `${msg}: ${errMsg}` - } - } catch {} + const bodyMessage = responseBodyMessage(e, msg) + if (bodyMessage) return bodyMessage - // If responseBody is HTML (e.g. from a gateway or proxy error page), - // provide a human-readable message instead of dumping raw markup - if (/^\s*` to re-authenticate." - } - if (e.statusCode === 403) { - return "Forbidden: request was blocked by a gateway or proxy. You may not have permission to access this resource — check your account and provider settings." - } - return msg - } + const htmlMessage = gatewayMessage(e, msg) + if (htmlMessage) return htmlMessage return `${msg}: ${e.responseBody}` }).trim() From 777871bcf782e26d438eb5d2eb29fa7f3fa7899d Mon Sep 17 00:00:00 2001 From: Alex Feies Date: Tue, 8 Sep 2026 01:24:44 +0000 Subject: [PATCH 3/3] Fix typecheck CI failure --- packages/opencode/src/provider/error.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/opencode/src/provider/error.ts b/packages/opencode/src/provider/error.ts index d76e2851..a2e8a260 100644 --- a/packages/opencode/src/provider/error.ts +++ b/packages/opencode/src/provider/error.ts @@ -54,6 +54,7 @@ function responseBodyMessage(e: APICallError, msg: string) { } function gatewayMessage(e: APICallError, msg: string) { + if (!e.responseBody) return undefined if (!/^\s*