同会话目标
标识与生命周期
Section titled “标识与生命周期”GoalId 是品牌化 id。调用方通过 GoalRef 修改一个确切修订版本;每次获准的持久变更都会递增修订号。
/** Compare-and-set identity for one exact goal revision. */interface GoalRef { /** Stable goal identity. */ readonly id: GoalId /** Positive revision; every durable mutation increments it. */ readonly revision: number}持久阶段回答目标发生了什么。进程本地激活状态则另行回答续跑消费方能否开始另一个 Round。
/** Durable continuation phase. Activation is process-local and separate. */type GoalPhase = | 'active' | 'paused' | 'blocked' | 'complete'阻塞是唯一表示「因问题而停止」的持久状态。由策略负责的阻塞原因会携带一个用于路由、稳定且采用 lower-kebab-case 的代码,以及一段供人和模型阅读的自由文本说明。
/** Machine-routable and human-readable explanation for a blocked goal. */interface GoalBlockReason { /** Stable lower-kebab-case classification chosen by the blocking policy. */ readonly code: string /** Non-empty explanation shown to humans and models. */ readonly message: string}/** Full durable state written by every non-clear goal mutation. */interface GoalSnapshot extends GoalRef { /** Human-requested completion objective. */ readonly objective: string /** Durable lifecycle phase. */ readonly phase: GoalPhase /** Present exactly while `phase` is `blocked`. */ readonly blockedReason?: GoalBlockReason /** Total admitted goal-round cap. */ readonly maxGoalRounds: number}/** Current goal projection, including values derived from the session log. */interface GoalView extends GoalSnapshot { /** Highest admitted round number for this goal. */ readonly roundsStarted: number /** Epoch milliseconds of the create mutation. */ readonly createdAt: number /** Epoch milliseconds of the latest mutation. */ readonly updatedAt: number /** Process-local continuation eligibility; never persisted. */ readonly activation: GoalActivation}每次变更都是持久的 goal/change 会话事件,其载荷要么是变更后的完整快照,要么是清除墓碑。严格折叠与持久投影只从这些事件派生生命周期状态;inbox 变更不会影响 goal 状态。
/** Full-snapshot goal mutation committed by a durable `goal/change` event. */interface GoalSnapshotChangeMeta { readonly kind: 'goal/change' readonly version: 1 readonly operation: Exclude<GoalOperation, 'clear'> readonly goal: GoalSnapshot readonly roundsStarted: number readonly createdAt: number readonly updatedAt: number}/** Tombstone retained when the current goal is cleared. */interface GoalClearChangeMeta { readonly kind: 'goal/change' readonly version: 1 readonly operation: 'clear' readonly cleared: GoalRef readonly clearedAt: number}续跑消费方会为每个获准的用户消息轮次标注正数且连续的 Round 编号和当前修订号;只有这些获准的 user/message 事件会推进 roundsStarted。回放会拒绝非正数 Round、编号缺口、陈旧修订号、已停止阶段和超出上限。
/** Message attribution for admitted continuation rounds. */interface GoalMessageSource { readonly kind: 'goal' readonly goalId: GoalId readonly revision: number /** Positive admitted continuation round. */ readonly round: number}创建操作会区分调用方省略字段与采用部署配置值这两种情况,create() 会在内部解析后者。编辑是局部替换,其运行时校验器要求至少提供一个字段。每条变更通知都会携带获准的操作和确切修订号;清除操作不带 goal。
/** Input whose omitted round cap is resolved by the service configuration. */interface CreateGoalRequest { readonly objective: string readonly maxGoalRounds?: number}/** Fields changed by an edit; at least one must be present. */interface EditGoalRequest { readonly objective?: string readonly maxGoalRounds?: number}/** Live notification after one durable goal mutation commits. */interface GoalChanged { readonly operation: GoalOperation readonly ref: GoalRef /** Absent for a clear tombstone. */ readonly goal?: GoalView}GoalService 解析创建默认值、从持久 goal/change 事件执行严格回放折叠、校验传入的 agent(智能体)是注册表中的确切活跃实例、以比较并设置方式执行变更,并发出 goal/changed 通知;监听器故障会被隔离。包 README 定义可调用 API 和面向模型的约定。
Cordis API
Section titled “Cordis API”Generated from source by scripts/gen-cordis-catalog.ts (verified fresh by pnpm run verify-cordis-catalog in doc-sync; regenerate with pnpm run gen-cordis-catalog) — this section is byte-identical in both language sides of the page. Signature blocks use a ts cordis-catalog fence and keep the original source JSDoc; dispatch modes are defined in the primer, and the framework-inherited ctx API lives in cordis-api/inherited.md.
ctx.goals — GoalService
Section titled “ctx.goals — GoalService”Goal service (ctx.goals) backed exclusively by the owning session log.
/** * Read the current goal for one exact live agent. * @param agent - owning live agent. * @returns a fresh view or `undefined` when no goal is current. * @throws {@link GoalError} when the agent is not the registry's live instance. */get(agent: Agent): GoalView | undefined
/** * Remove process-local continuation authority without changing durable goal * phase or revision. Lifecycle owners use this before unloading a driver; * a later human-authorized {@link resume} records the new activation edge. * @param agent - owning live agent. * @returns a fresh disarmed view, or `undefined` when no goal is current. */disarm(agent: Agent): GoalView | undefined
/** * Create and arm a goal. A completed goal may be replaced; every other * current phase must be cleared or resumed instead. * @param agent - owning live agent. * @param request - objective and optional round cap. * @returns the created live view. */create(agent: Agent, request: CreateGoalRequest): GoalView
/** * Edit objective and/or round cap without changing phase. * @param agent - owning live agent. * @param ref - expected current revision. * @param request - at least one replacement field. * @returns the edited view. */@Remote('edit') edit(agent: Agent, ref: GoalRef, request: EditGoalRequest): GoalView
/** * Pause an active goal and disarm automatic continuation. * @param agent - owning live agent. * @param ref - expected current revision. * @returns the paused view. */@Remote('pause') pause(agent: Agent, ref: GoalRef): GoalView
/** * Resume and arm a stopped goal, or rearm an active goal after a * session-start edge, while its round budget still has capacity. * @param agent - owning live agent. * @param ref - expected current revision. * @returns the active view. */@Remote('resume') resume(agent: Agent, ref: GoalRef): GoalView
/** * Mark a current non-complete goal complete and disarm it. * @param agent - owning live agent. * @param ref - expected current revision. * @returns the completed view. */@Remote('complete') complete(agent: Agent, ref: GoalRef): GoalView
/** * Mark an active goal blocked and disarm it. * @param agent - owning live agent. * @param ref - expected current revision. * @param reason - policy-owned stable code and human-readable explanation. * @returns the blocked view with its durable reason. */block(agent: Agent, ref: GoalRef, reason: GoalBlockReason): GoalView
/** * Clear the current goal while retaining a durable tombstone and history. * @param agent - owning live agent. * @param ref - expected current revision. * @returns the tombstone ref whose revision is one past the cleared snapshot. */@Remote('clear') clear(agent: Agent, ref: GoalRef): GoalRef
/** * Create one Goal through the remote boundary. * @param agent - exact live Agent resolved from the wire identity. * @param request - objective and optional round cap. * @returns the created Goal identity. */@Remote('create') remoteExportCreate(agent: Agent, request: CreateGoalRequest): CreateGoalResultTypes: Agent
Source: packages/goal/goal/src/index.ts:183
goal/* events
Section titled “goal/* events”goal/changed — emit
Section titled “goal/changed — emit”Goal mutation accepted by one live agent. The matching goal/change session event has already committed. Listener failures are contained. Scope-filtered dispatch (@deepseek-ai/dsh-scope): agent-scoped listeners receive only that agent.
/** * Goal mutation accepted by one live agent. The matching `goal/change` * session event has already committed. Listener failures are contained. * Scope-filtered dispatch (`@deepseek-ai/dsh-scope`): agent-scoped listeners receive only that agent. * @param payload.agent - agent whose session owns the goal. * @param payload.change - fresh current projection or clear tombstone. * @mode emit */'goal/changed'(this: import('@deepseek-ai/dsh-scope').Scoped<Agent>, payload: { agent: Agent; change: GoalChanged }): void