error.test.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { describe, expect, test } from "bun:test"
  2. import { RequestError } from "@agentclientprotocol/sdk"
  3. import { ACPError } from "../../src/acp/error"
  4. describe("acp errors", () => {
  5. test("maps validation failures to invalid params", () => {
  6. const cases: ACPError.Error[] = [
  7. new ACPError.SessionNotFoundError({ sessionId: "ses_missing" }),
  8. new ACPError.InvalidConfigOptionError({ configId: "temperature" }),
  9. new ACPError.InvalidModelError({ providerId: "anthropic", modelId: "claude-missing" }),
  10. new ACPError.InvalidEffortError({ effort: "extreme" }),
  11. new ACPError.InvalidModeError({ mode: "turbo" }),
  12. ]
  13. expect(cases.map((error) => ACPError.toRequestError(error).code)).toEqual([-32602, -32602, -32602, -32602, -32602])
  14. })
  15. test("includes safe validation details", () => {
  16. expect(ACPError.toRequestError(new ACPError.SessionNotFoundError({ sessionId: "ses_123" }))).toMatchObject({
  17. code: -32602,
  18. data: { sessionId: "ses_123" },
  19. })
  20. expect(ACPError.toRequestError(new ACPError.InvalidModelError({ modelId: "gpt-missing" }))).toMatchObject({
  21. code: -32602,
  22. data: { modelId: "gpt-missing" },
  23. })
  24. })
  25. test("maps auth required to the SDK auth error", () => {
  26. const requestError = ACPError.toRequestError(new ACPError.AuthRequiredError())
  27. expect(requestError).toBeInstanceOf(RequestError)
  28. expect(requestError.code).toBe(-32000)
  29. expect(requestError.message).toBe("Authentication required: provider authentication required")
  30. expect(requestError.data).toEqual({})
  31. })
  32. test("maps service failures to safe internal errors", () => {
  33. const requestError = ACPError.toRequestError(
  34. new ACPError.ServiceFailureError({ service: "provider", safeMessage: "Provider request failed" }),
  35. )
  36. expect(requestError.code).toBe(-32603)
  37. expect(requestError.message).toBe("Internal error: Provider request failed")
  38. expect(requestError.data).toEqual({ service: "provider" })
  39. })
  40. test("wraps unknown defects without leaking raw details", () => {
  41. const requestError = ACPError.toRequestError(
  42. ACPError.fromUnknown(new Error("stack has sk-ant-secret and oauth refresh token")),
  43. )
  44. const serialized = JSON.stringify(requestError.toErrorResponse())
  45. expect(requestError.code).toBe(-32603)
  46. expect(requestError.message).toBe("Internal error: Internal service failure")
  47. expect(serialized).not.toContain("sk-ant-secret")
  48. expect(serialized).not.toContain("oauth refresh token")
  49. expect(serialized).not.toContain("stack")
  50. })
  51. })