Sfoglia il codice sorgente

make 'The socket connection was closed unexpectedly' errors retryable

Aiden Cline 2 mesi fa
parent
commit
12ee9d51c3
1 ha cambiato i file con 16 aggiunte e 0 eliminazioni
  1. 16 0
      packages/opencode/src/session/message-v2.ts

+ 16 - 0
packages/opencode/src/session/message-v2.ts

@@ -12,6 +12,7 @@ import { Storage } from "@/storage/storage"
 import { ProviderTransform } from "@/provider/transform"
 import { STATUS_CODES } from "http"
 import { iife } from "@/util/iife"
+import { type SystemError } from "bun"
 
 export namespace MessageV2 {
   export const OutputLengthError = NamedError.create("MessageOutputLengthError", z.object({}))
@@ -31,6 +32,7 @@ export namespace MessageV2 {
       isRetryable: z.boolean(),
       responseHeaders: z.record(z.string(), z.string()).optional(),
       responseBody: z.string().optional(),
+      details: z.record(z.string(), z.string()).optional(),
     }),
   )
   export type APIError = z.infer<typeof APIError.Schema>
@@ -609,6 +611,20 @@ export namespace MessageV2 {
           },
           { cause: e },
         ).toObject()
+      case (e as SystemError)?.code === "ECONNRESET" &&
+        (e as SystemError)?.message.includes("The socket connection was closed unexpectedly"):
+        return new MessageV2.APIError(
+          {
+            message: "Connection reset by server",
+            isRetryable: true,
+            details: {
+              code: (e as SystemError).code ?? "",
+              syscall: (e as SystemError).syscall ?? "",
+              message: (e as SystemError).message ?? "",
+            },
+          },
+          { cause: e },
+        ).toObject()
       case APICallError.isInstance(e):
         const message = iife(() => {
           let msg = e.message