mirror of
https://github.com/anomalyco/opencode.git
synced 2026-06-01 19:05:38 +00:00
fix(app): enhance error handling by unwrapping SDK-wrapped errors in formatServerError (#27061)
This commit is contained in:
@@ -128,4 +128,17 @@ describe("formatServerError", () => {
|
|||||||
["Modelo nao encontrado: x/y", "Voce quis dizer: x/y2, x/y3", "Revise provider/model no config"].join("\n"),
|
["Modelo nao encontrado: x/y", "Voce quis dizer: x/y2, x/y3", "Revise provider/model no config"].join("\n"),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("unwraps SDK-wrapped errors from cause.body", () => {
|
||||||
|
const body = {
|
||||||
|
name: "ConfigInvalidError",
|
||||||
|
data: {
|
||||||
|
message: "Missing host",
|
||||||
|
},
|
||||||
|
} satisfies ConfigInvalidError
|
||||||
|
|
||||||
|
const wrapped = new Error("ConfigInvalidError", { cause: { body, status: 400 } })
|
||||||
|
|
||||||
|
expect(formatServerError(wrapped, language.t)).toBe("Arquivo de config em config invalido: Missing host")
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -26,14 +26,22 @@ function tr(translator: Translator | undefined, key: string, text: string, vars?
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function formatServerError(error: unknown, translate?: Translator, fallback?: string) {
|
export function formatServerError(error: unknown, translate?: Translator, fallback?: string) {
|
||||||
if (isConfigInvalidErrorLike(error)) return parseReadableConfigInvalidError(error, translate)
|
const unwrapped = unwrapNamedError(error)
|
||||||
if (isProviderModelNotFoundErrorLike(error)) return parseReadableProviderModelNotFoundError(error, translate)
|
if (isConfigInvalidErrorLike(unwrapped)) return parseReadableConfigInvalidError(unwrapped, translate)
|
||||||
|
if (isProviderModelNotFoundErrorLike(unwrapped)) return parseReadableProviderModelNotFoundError(unwrapped, translate)
|
||||||
if (error instanceof Error && error.message) return error.message
|
if (error instanceof Error && error.message) return error.message
|
||||||
if (typeof error === "string" && error) return error
|
if (typeof error === "string" && error) return error
|
||||||
if (fallback) return fallback
|
if (fallback) return fallback
|
||||||
return tr(translate, "error.chain.unknown", "Unknown error")
|
return tr(translate, "error.chain.unknown", "Unknown error")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function unwrapNamedError(error: unknown): unknown {
|
||||||
|
if (error instanceof Error && error.cause && typeof error.cause === "object" && "body" in error.cause) {
|
||||||
|
return (error.cause as Record<string, unknown>).body
|
||||||
|
}
|
||||||
|
return error
|
||||||
|
}
|
||||||
|
|
||||||
function isConfigInvalidErrorLike(error: unknown): error is ConfigInvalidError {
|
function isConfigInvalidErrorLike(error: unknown): error is ConfigInvalidError {
|
||||||
if (typeof error !== "object" || error === null) return false
|
if (typeof error !== "object" || error === null) return false
|
||||||
const o = error as Record<string, unknown>
|
const o = error as Record<string, unknown>
|
||||||
|
|||||||
Reference in New Issue
Block a user