Browse Source

tweak: adjust retry check to be more defensive

Aiden Cline 3 weeks ago
parent
commit
f12f7e7718
2 changed files with 27 additions and 17 deletions
  1. 21 17
      packages/opencode/src/session/retry.ts
  2. 6 0
      packages/opencode/test/session/retry.test.ts

+ 21 - 17
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
     }
   }
 }

+ 6 - 0
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()