Просмотр исходного кода

fix(tui): 展示服务端错误编号与消息恢复提示

邵勃源 14 часов назад
Родитель
Сommit
465f75da22

+ 5 - 2
packages/tui/src/component/prompt/index.tsx

@@ -1012,8 +1012,10 @@ export function Prompt(props: PromptProps) {
         console.log("Creating a session failed:", res.error)
 
         toast.show({
-          message: "Creating a session failed. Open console for more details.",
+          title: "Failed to create session",
+          message: errorMessage(res.error),
           variant: "error",
+          duration: 15000,
         })
 
         return true
@@ -1112,8 +1114,9 @@ export function Prompt(props: PromptProps) {
         .catch((error) => {
           toast.show({
             title: "Failed to send prompt",
-            message: errorMessage(error),
+            message: `${errorMessage(error)}\n会话:${sessionID}\n输入已保留在提示词历史中。请先检查会话是否已收到消息,再决定重试。`,
             variant: "error",
+            duration: 15000,
           })
         })
       if (editorParts.length > 0) editor.markSelectionSent()

+ 10 - 1
packages/tui/src/util/error.ts

@@ -123,6 +123,14 @@ export function errorFormat(error: unknown): string {
 }
 
 export function errorMessage(error: unknown): string {
+  // HTTP adapters may wrap the structured server response in Error.cause.
+  if (error instanceof Error && isRecord(error.cause) && isRecord(error.cause.body)) {
+    return errorMessage(error.cause.body)
+  }
+
+  const configured = cliErrorMessage(error)
+  if (configured !== undefined) return configured
+
   if (error instanceof Error) {
     if (error.message) return error.message
     if (error.name) return error.name
@@ -133,7 +141,8 @@ export function errorMessage(error: unknown): string {
   }
 
   if (isRecord(error) && isRecord(error.data) && typeof error.data.message === "string" && error.data.message) {
-    return error.data.message
+    const ref = field(error.data, "ref")
+    return error.data.message + (ref ? `\nError reference: ${ref}` : "")
   }
 
   const text = String(error)

+ 25 - 0
packages/tui/test/util/error.test.ts

@@ -2,6 +2,31 @@ import { describe, expect, test } from "bun:test"
 import { errorData, errorFormat, errorMessage } from "../../src/util/error"
 
 describe("util.error", () => {
+  test("keeps the server error reference available for log correlation", () => {
+    const error = {
+      name: "UnknownError",
+      data: {
+        message: "Unexpected server error. Check server logs for details.",
+        ref: "err_1234abcd",
+      },
+    }
+    expect(errorMessage(error)).toBe(
+      "Unexpected server error. Check server logs for details.\nError reference: err_1234abcd",
+    )
+    expect(errorMessage(new Error("HTTP request failed", { cause: { body: error } }))).toBe(errorMessage(error))
+    expect(errorData(error).message).toContain("err_1234abcd")
+  })
+
+  test("explains provider configuration errors instead of displaying an opaque object", () => {
+    expect(
+      errorMessage({
+        name: "ProviderModelNotFoundError",
+        data: { providerID: "test", modelID: "missing", suggestions: ["available"] },
+      }),
+    ).toContain("Did you mean: available")
+    expect(errorMessage({ name: "UnknownError", data: { message: "failure" } })).toBe("failure")
+  })
+
   test("formats native Error instances", () => {
     const err = new Error("boom")
     expect(errorMessage(err)).toBe("boom")