summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop/src/pages
diff options
context:
space:
mode:
authorAdam <[email protected]>2025-12-22 19:16:50 -0600
committerAdam <[email protected]>2025-12-22 19:16:54 -0600
commit680a63e3dee5bf2748eaf844b4e9b838d2859f16 (patch)
tree9b6c4de0b0f2c664a1075c58e5f1c39b125f4590 /packages/desktop/src/pages
parent3a54ab68d1f9684d86434dd6e890d43c63adf461 (diff)
downloadopencode-680a63e3dee5bf2748eaf844b4e9b838d2859f16.tar.gz
opencode-680a63e3dee5bf2748eaf844b4e9b838d2859f16.zip
fix(desktop): better error messages on connection failure
Diffstat (limited to 'packages/desktop/src/pages')
-rw-r--r--packages/desktop/src/pages/error.tsx40
1 files changed, 31 insertions, 9 deletions
diff --git a/packages/desktop/src/pages/error.tsx b/packages/desktop/src/pages/error.tsx
index c7330c298..9914279ad 100644
--- a/packages/desktop/src/pages/error.tsx
+++ b/packages/desktop/src/pages/error.tsx
@@ -62,27 +62,49 @@ function formatInitError(error: InitError): string {
}
}
-function formatErrorChain(error: unknown, depth = 0): string {
+function formatErrorChain(error: unknown, depth = 0, parentMessage?: string): string {
if (!error) return "Unknown error"
- const indent = depth > 0 ? `\n${"─".repeat(40)}\nCaused by:\n` : ""
-
if (isInitError(error)) {
- return indent + formatInitError(error)
+ const message = formatInitError(error)
+ if (depth > 0 && parentMessage === message) return ""
+ const indent = depth > 0 ? `\n${"─".repeat(40)}\nCaused by:\n` : ""
+ return indent + message
}
if (error instanceof Error) {
- const parts = [indent + `${error.name}: ${error.message}`]
- if (error.stack) {
- parts.push(error.stack)
+ const isDuplicate = depth > 0 && parentMessage === error.message
+ const parts: string[] = []
+ const indent = depth > 0 ? `\n${"─".repeat(40)}\nCaused by:\n` : ""
+
+ if (!isDuplicate) {
+ // Stack already includes error name and message, so prefer it
+ parts.push(indent + (error.stack ?? `${error.name}: ${error.message}`))
+ } else if (error.stack) {
+ // Duplicate message - only show the stack trace lines (skip message)
+ const trace = error.stack.split("\n").slice(1).join("\n").trim()
+ if (trace) {
+ parts.push(trace)
+ }
}
+
if (error.cause) {
- parts.push(formatErrorChain(error.cause, depth + 1))
+ const causeResult = formatErrorChain(error.cause, depth + 1, error.message)
+ if (causeResult) {
+ parts.push(causeResult)
+ }
}
+
return parts.join("\n\n")
}
- if (typeof error === "string") return indent + error
+ if (typeof error === "string") {
+ if (depth > 0 && parentMessage === error) return ""
+ const indent = depth > 0 ? `\n${"─".repeat(40)}\nCaused by:\n` : ""
+ return indent + error
+ }
+
+ const indent = depth > 0 ? `\n${"─".repeat(40)}\nCaused by:\n` : ""
return indent + JSON.stringify(error, null, 2)
}