summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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