Преглед изворни кода

fix(goal): preserve structured domain error codes

Tianyi Cui пре 2 месеци
родитељ
комит
e9940d35cf
2 измењених фајлова са 8 додато и 5 уклоњено
  1. 6 4
      packages/goal/goal/src/runtime.ts
  2. 2 1
      packages/goal/goal/tests/goal.spec.ts

+ 6 - 4
packages/goal/goal/src/runtime.ts

@@ -1,5 +1,6 @@
 /** Runtime constructors and protocol constants for the goal domain. */
 
+import { HarnessError } from '@deepseek-ai/dsh-llm'
 import type { GoalErrorCode, GoalId as GoalIdType } from './types.ts'
 
 /** Version of the goal change metadata embedded in `context/message`. */
@@ -15,13 +16,14 @@ export function GoalId(id: string): GoalIdType {
 }
 
 /** Error returned by the goal domain boundary. */
-export class GoalError extends Error {
+export class GoalError extends HarnessError {
   /**
    * @param message - human-readable rejection reason.
    * @param code - stable machine-routable classification.
    */
-  constructor(message: string, public readonly code: GoalErrorCode) {
-    super(message)
-    this.name = 'GoalError'
+  // Keep the constructor to narrow HarnessError's string code at this boundary.
+  // eslint-disable-next-line @typescript-eslint/no-useless-constructor -- type-only narrowing
+  constructor(message: string, code: GoalErrorCode) {
+    super(message, code)
   }
 }

+ 2 - 1
packages/goal/goal/tests/goal.spec.ts

@@ -2,7 +2,7 @@ import { describe, expect, it, vi } from 'vitest'
 import { Context } from 'cordis'
 import AgentRegistry, { agentEvents } from '@deepseek-ai/dsh-agent'
 import type { Agent, AgentStatus, InjectOptions } from '@deepseek-ai/dsh-agent'
-import type { ContentBlock, MessageSource } from '@deepseek-ai/dsh-llm'
+import { HarnessError, type ContentBlock, type MessageSource } from '@deepseek-ai/dsh-llm'
 import SessionStore, { Session, SessionId } from '@deepseek-ai/dsh-session'
 import GoalService, {
   GoalError,
@@ -161,6 +161,7 @@ describe('GoalService creation and replay', () => {
       code: 'GOAL_INVALID_MAX_ROUNDS',
     }))
     expect(() => ctx.goals.resolveCreate({ objective: 'x', maxGoalRounds: 1.5 })).toThrow(GoalError)
+    expect(() => ctx.goals.resolveCreate({ objective: 'x', maxGoalRounds: 1.5 })).toThrow(HarnessError)
     expect(() => ctx.goals.resolveCreate({ objective: 'x', maxGoalRounds: Number.MAX_SAFE_INTEGER + 1 })).toThrow(GoalError)
     expect(ctx.goals.create(agent, { objective: 'x' }).maxGoalRounds).toBe(256)
   })