Преглед на файлове

Migrate UI cancel error to tagged error (#27112)

Kit Langton преди 3 месеца
родител
ревизия
3974520742
променени са 4 файла, в които са добавени 10 реда и са изтрити 10 реда
  1. 2 2
      packages/opencode/src/cli/error.ts
  2. 1 2
      packages/opencode/src/cli/ui.ts
  3. 5 0
      packages/opencode/test/cli/error.test.ts
  4. 2 6
      packages/opencode/test/util/error.test.ts

+ 2 - 2
packages/opencode/src/cli/error.ts

@@ -78,8 +78,8 @@ export function FormatError(input: unknown) {
     ].join("\n")
     ].join("\n")
   }
   }
 
 
-  // UICancelledError: void (no data)
-  if (NamedError.hasName(input, "UICancelledError")) {
+  // UICancelledError: user cancelled an interactive CLI prompt
+  if (isTaggedError(input, "UICancelledError") || NamedError.hasName(input, "UICancelledError")) {
     return ""
     return ""
   }
   }
 }
 }

+ 1 - 2
packages/opencode/src/cli/ui.ts

@@ -1,5 +1,4 @@
 import { EOL } from "os"
 import { EOL } from "os"
-import { NamedError } from "@opencode-ai/core/util/error"
 import { Schema } from "effect"
 import { Schema } from "effect"
 import { logo as glyphs } from "./logo"
 import { logo as glyphs } from "./logo"
 
 
@@ -10,7 +9,7 @@ const wordmark = [
   `▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀  ▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀`,
   `▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀  ▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀`,
 ]
 ]
 
 
-export const CancelledError = NamedError.create("UICancelledError", Schema.optional(Schema.Void))
+export class CancelledError extends Schema.TaggedErrorClass<CancelledError>()("UICancelledError", {}) {}
 
 
 export const Style = {
 export const Style = {
   TEXT_HIGHLIGHT: "\x1b[96m",
   TEXT_HIGHLIGHT: "\x1b[96m",

+ 5 - 0
packages/opencode/test/cli/error.test.ts

@@ -1,6 +1,7 @@
 import { describe, expect, test } from "bun:test"
 import { describe, expect, test } from "bun:test"
 import { AccountTransportError } from "../../src/account/schema"
 import { AccountTransportError } from "../../src/account/schema"
 import { FormatError } from "../../src/cli/error"
 import { FormatError } from "../../src/cli/error"
+import { UI } from "../../src/cli/ui"
 
 
 describe("cli.error", () => {
 describe("cli.error", () => {
   test("formats account transport errors clearly", () => {
   test("formats account transport errors clearly", () => {
@@ -15,4 +16,8 @@ describe("cli.error", () => {
     expect(formatted).toContain("This failed before the server returned an HTTP response.")
     expect(formatted).toContain("This failed before the server returned an HTTP response.")
     expect(formatted).toContain("Check your network, proxy, or VPN configuration and try again.")
     expect(formatted).toContain("Check your network, proxy, or VPN configuration and try again.")
   })
   })
+
+  test("formats cancelled UI errors as empty output", () => {
+    expect(FormatError(new UI.CancelledError())).toBe("")
+  })
 })
 })

+ 2 - 6
packages/opencode/test/util/error.test.ts

@@ -1,8 +1,6 @@
 import { describe, expect, test } from "bun:test"
 import { describe, expect, test } from "bun:test"
-import { Schema } from "effect"
 import { NamedError } from "@opencode-ai/core/util/error"
 import { NamedError } from "@opencode-ai/core/util/error"
 import { errorData, errorFormat, errorMessage } from "../../src/util/error"
 import { errorData, errorFormat, errorMessage } from "../../src/util/error"
-import { UI } from "../../src/cli/ui"
 import { MessageError } from "../../src/session/message-error"
 import { MessageError } from "../../src/session/message-error"
 
 
 describe("util.error", () => {
 describe("util.error", () => {
@@ -60,9 +58,7 @@ describe("util.error", () => {
     expect(error.toObject()).toEqual({ name: "ProviderAuthError", data: { providerID: "anthropic", message: "boom" } })
     expect(error.toObject()).toEqual({ name: "ProviderAuthError", data: { providerID: "anthropic", message: "boom" } })
   })
   })
 
 
-  test("void named errors accept JSON without data", () => {
-    const serialized = JSON.parse(JSON.stringify(new UI.CancelledError(undefined).toObject()))
-
-    expect(Schema.decodeUnknownOption(UI.CancelledError.Schema)(serialized)._tag).toBe("Some")
+  test("named errors without fields serialize data", () => {
+    expect(new MessageError.OutputLengthError({}).toObject()).toEqual({ name: "MessageOutputLengthError", data: {} })
   })
   })
 })
 })