diff options
| author | Aiden Cline <[email protected]> | 2025-12-23 19:20:31 -0600 |
|---|---|---|
| committer | Aiden Cline <[email protected]> | 2025-12-23 19:20:31 -0600 |
| commit | 12ee9d51c375b2cb30657c40a234b43d01683a9b (patch) | |
| tree | e694d69d9d7a368f4ef5acad025ceb4fd5cc0ba5 | |
| parent | 2730e0c9cde467c7ebc734ee632be8358f20a3a5 (diff) | |
| download | opencode-12ee9d51c375b2cb30657c40a234b43d01683a9b.tar.gz opencode-12ee9d51c375b2cb30657c40a234b43d01683a9b.zip | |
make 'The socket connection was closed unexpectedly' errors retryable
| -rw-r--r-- | packages/opencode/src/session/message-v2.ts | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index 14542669e..afdef9e89 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/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 |
