summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-12-23 19:20:31 -0600
committerAiden Cline <[email protected]>2025-12-23 19:20:31 -0600
commit12ee9d51c375b2cb30657c40a234b43d01683a9b (patch)
treee694d69d9d7a368f4ef5acad025ceb4fd5cc0ba5
parent2730e0c9cde467c7ebc734ee632be8358f20a3a5 (diff)
downloadopencode-12ee9d51c375b2cb30657c40a234b43d01683a9b.tar.gz
opencode-12ee9d51c375b2cb30657c40a234b43d01683a9b.zip
make 'The socket connection was closed unexpectedly' errors retryable
-rw-r--r--packages/opencode/src/session/message-v2.ts16
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