diff options
| author | Aiden Cline <[email protected]> | 2026-01-27 11:22:03 -0500 |
|---|---|---|
| committer | Aiden Cline <[email protected]> | 2026-01-27 11:31:02 -0500 |
| commit | f12f7e7718c7cbe3058e0154f37291114bef3f58 (patch) | |
| tree | d8c06367f39cd8b8ab84d6a761133eb841921260 | |
| parent | 0aa93379bd8e52d8fe7b71f7a8a9ace25c3d7695 (diff) | |
| download | opencode-f12f7e7718c7cbe3058e0154f37291114bef3f58.tar.gz opencode-f12f7e7718c7cbe3058e0154f37291114bef3f58.zip | |
tweak: adjust retry check to be more defensive
| -rw-r--r-- | packages/opencode/src/session/retry.ts | 38 | ||||
| -rw-r--r-- | packages/opencode/test/session/retry.test.ts | 6 |
2 files changed, 27 insertions, 17 deletions
diff --git a/packages/opencode/src/session/retry.ts b/packages/opencode/src/session/retry.ts index 8d3f72844..dddeae1cf 100644 --- a/packages/opencode/src/session/retry.ts +++ b/packages/opencode/src/session/retry.ts @@ -76,24 +76,28 @@ export namespace SessionRetry { return undefined } }) - if (!json || typeof json !== "object") return undefined - const code = typeof json.code === "string" ? json.code : "" + try { + if (!json || typeof json !== "object") return undefined + const code = typeof json.code === "string" ? json.code : "" - if (json.type === "error" && json.error?.type === "too_many_requests") { - return "Too Many Requests" - } - if (code.includes("exhausted") || code.includes("unavailable")) { - return "Provider is overloaded" - } - if (json.type === "error" && json.error?.code?.includes("rate_limit")) { - return "Rate Limited" - } - if ( - json.error?.message?.includes("no_kv_space") || - (json.type === "error" && json.error?.type === "server_error") || - !!json.error - ) { - return "Provider Server Error" + if (json.type === "error" && json.error?.type === "too_many_requests") { + return "Too Many Requests" + } + if (code.includes("exhausted") || code.includes("unavailable")) { + return "Provider is overloaded" + } + if (json.type === "error" && json.error?.code?.includes("rate_limit")) { + return "Rate Limited" + } + if ( + json.error?.message?.includes("no_kv_space") || + (json.type === "error" && json.error?.type === "server_error") || + !!json.error + ) { + return "Provider Server Error" + } + } catch { + return undefined } } } diff --git a/packages/opencode/test/session/retry.test.ts b/packages/opencode/test/session/retry.test.ts index 6866b03a1..9cfdd7fca 100644 --- a/packages/opencode/test/session/retry.test.ts +++ b/packages/opencode/test/session/retry.test.ts @@ -102,6 +102,12 @@ describe("session.retry.retryable", () => { expect(SessionRetry.retryable(error)).toBe("Provider Server Error") }) + test("does not throw on numeric error codes", () => { + const error = wrap(JSON.stringify({ type: "error", error: { code: 123 } })) + const result = SessionRetry.retryable(error) + expect(result).toBeUndefined() + }) + test("returns undefined for non-json message", () => { const error = wrap("not-json") expect(SessionRetry.retryable(error)).toBeUndefined() |
