@agentdevjs/core 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/BasicAgent-UBGLABDV.js +12 -0
  2. package/dist/ExplorerAgent-C62LOUTX.js +12 -0
  3. package/dist/{chunk-BVF7RUXV.js → chunk-KCCLSQC4.js} +1 -1
  4. package/dist/chunk-KCCLSQC4.js.map +1 -0
  5. package/dist/{chunk-KO4DJKM6.js → chunk-OFBE43IS.js} +1 -1
  6. package/dist/{chunk-KO4DJKM6.js.map → chunk-OFBE43IS.js.map} +1 -1
  7. package/dist/{chunk-YFSM6IYU.js → chunk-TKVOWEJ2.js} +154 -49
  8. package/dist/chunk-TKVOWEJ2.js.map +1 -0
  9. package/dist/{chunk-574NG4UB.js → chunk-U3LWOJ3Q.js} +4 -4
  10. package/dist/chunk-U3LWOJ3Q.js.map +1 -0
  11. package/dist/{chunk-UCEIJEM5.js → chunk-V3WM6EII.js} +2 -2
  12. package/dist/chunk-V3WM6EII.js.map +1 -0
  13. package/dist/{chunk-TIJV6GJW.js → chunk-YYNP7MZC.js} +4 -3
  14. package/dist/chunk-YYNP7MZC.js.map +1 -0
  15. package/dist/features/example-feature/templates/example-tool.render.js.map +1 -1
  16. package/dist/features/opencode-basic/templates/edit.render.js +1 -1
  17. package/dist/features/opencode-basic/templates/edit.render.js.map +1 -1
  18. package/dist/features/opencode-basic/templates/glob.render.js.map +1 -1
  19. package/dist/features/opencode-basic/templates/grep.render.js.map +1 -1
  20. package/dist/features/opencode-basic/templates/ls.render.js.map +1 -1
  21. package/dist/features/opencode-basic/templates/read.render.js +1 -1
  22. package/dist/features/opencode-basic/templates/read.render.js.map +1 -1
  23. package/dist/features/opencode-basic/templates/write.render.js +1 -1
  24. package/dist/features/opencode-basic/templates/write.render.js.map +1 -1
  25. package/dist/features/skill/templates/skill.render.js.map +1 -1
  26. package/dist/features/subagent/templates/agent-close.render.js.map +1 -1
  27. package/dist/features/subagent/templates/agent-list.render.js.map +1 -1
  28. package/dist/features/subagent/templates/agent-send.render.js.map +1 -1
  29. package/dist/features/subagent/templates/agent-spawn.render.js.map +1 -1
  30. package/dist/features/subagent/templates/wait.render.js.map +1 -1
  31. package/dist/features/todo/templates/task-clear.render.js.map +1 -1
  32. package/dist/features/todo/templates/task-create.render.js.map +1 -1
  33. package/dist/features/todo/templates/task-list.render.js.map +1 -1
  34. package/dist/features/todo/templates/task-update.render.js.map +1 -1
  35. package/dist/index.d.ts +2276 -2024
  36. package/dist/index.js +519 -205
  37. package/dist/index.js.map +1 -1
  38. package/dist/{notification-5DFBYKKN.js → notification-CASV7QYT.js} +2 -2
  39. package/dist/{resolver-F5SM2RHQ.js → resolver-4JA7VPYP.js} +2 -2
  40. package/dist/{session-events-TETMQI45.js → session-events-S7LMJ6MM.js} +2 -2
  41. package/package.json +55 -55
  42. package/dist/BasicAgent-RPYJHYCM.js +0 -12
  43. package/dist/ExplorerAgent-ITTSJRJI.js +0 -12
  44. package/dist/chunk-574NG4UB.js.map +0 -1
  45. package/dist/chunk-BVF7RUXV.js.map +0 -1
  46. package/dist/chunk-TIJV6GJW.js.map +0 -1
  47. package/dist/chunk-UCEIJEM5.js.map +0 -1
  48. package/dist/chunk-YFSM6IYU.js.map +0 -1
  49. /package/dist/{BasicAgent-RPYJHYCM.js.map → BasicAgent-UBGLABDV.js.map} +0 -0
  50. /package/dist/{ExplorerAgent-ITTSJRJI.js.map → ExplorerAgent-C62LOUTX.js.map} +0 -0
  51. /package/dist/{notification-5DFBYKKN.js.map → notification-CASV7QYT.js.map} +0 -0
  52. /package/dist/{resolver-F5SM2RHQ.js.map → resolver-4JA7VPYP.js.map} +0 -0
  53. /package/dist/{session-events-TETMQI45.js.map → session-events-S7LMJ6MM.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/tool.ts","../src/core/message.ts","../src/core/context-query.ts","../src/core/context.ts","../src/core/logging.ts","../src/core/lifecycle.ts","../src/core/hook-declarations.ts","../src/core/feature-graph.ts","../src/core/feature-preflight.ts","../src/core/capability.ts","../src/core/session-store.ts","../src/template/loader.ts","../src/template/composer.ts","../src/template/data-source.ts","../src/skills/loader.ts","../src/core/tool-result-images.ts","../src/core/api-errors.ts","../src/core/retry.ts","../src/core/hooks-registry.ts","../src/core/checkpoint.ts","../src/core/feature-reload.ts","../src/core/usage.ts","../src/core/agent.ts","../src/core/agent/hooks-executor.ts","../src/core/agent/template-resolver.ts","../src/core/tool-result-display.ts","../src/core/agent/tool-executor.ts","../src/core/agent/react-loop.ts"],"sourcesContent":["/**\r\n * 工具定义\r\n * 简单的工具创建函数\r\n */\r\n\r\nimport type { Tool, ToolRenderConfig, ToolExecutionContext, ToolResultValue } from './types.js';\r\n\r\n/**\r\n * 渲染配置扩展类型\r\n * 支持字符串(模板名称)或配置对象\r\n */\r\nexport type ToolRenderInput = ToolRenderConfig | string;\r\n\r\n/**\r\n * 创建一个工具\r\n * @param config 工具配置\r\n * @param sourceFile 可选:调用此函数的源文件路径(用于自动查找渲染文件)\r\n */\r\nexport function createTool(\r\n config: {\r\n name: string;\r\n description: string;\r\n parameters?: Record<string, unknown>;\r\n execute: (args: Record<string, unknown>, context?: ToolExecutionContext) => Promise<unknown>;\r\n render?: ToolRenderInput;\r\n executionMode?: 'normal' | 'exclusive';\r\n parallelizable?: boolean;\r\n /** 超时契约声明(ticket 023 / ADR-0005),透传到 Tool.timeout */\r\n timeout?: Tool['timeout'];\r\n },\r\n sourceFile?: string\r\n): Tool {\r\n let finalRender: ToolRenderConfig | undefined = undefined;\r\n\r\n if (config.render) {\r\n // 如果 render 是字符串,转换为配置对象(call 和 result 使用同一模板)\r\n if (typeof config.render === 'string') {\r\n finalRender = {\r\n call: config.render,\r\n result: config.render,\r\n };\r\n } else {\r\n finalRender = config.render;\r\n }\r\n } else if (sourceFile) {\r\n // render 未定义时,尝试自动查找同目录下的 .render.ts 文件\r\n // 例如:tools/fs.ts -> tools/fs.render.ts\r\n const renderPath = sourceFile.replace(/\\.ts$/, '.render.ts');\r\n // 使用特殊标记,延迟加载\r\n (finalRender as any) = {\r\n __renderPath: renderPath,\r\n call: undefined,\r\n result: undefined,\r\n };\r\n }\r\n\r\n return {\r\n name: config.name,\r\n description: config.description,\r\n parameters: config.parameters,\r\n execute: config.execute as Tool['execute'],\r\n render: finalRender,\r\n ...(config.executionMode ? { executionMode: config.executionMode } : {}),\r\n ...(config.parallelizable ? { parallelizable: config.parallelizable } : {}),\r\n ...(config.timeout ? { timeout: config.timeout } : {}),\r\n };\r\n}\r\n\r\n/**\r\n * 工具注册表 - 管理多个工具\r\n */\r\nexport class ToolRegistry {\r\n private tools = new Map<string, Tool>();\r\n private enabled = new Set<string>(); // 启用的工具名\r\n private disabled = new Set<string>(); // 禁用(屏蔽)的工具名\r\n private pendingDisabled = new Set<string>(); // 工具注册前的预禁用状态\r\n private pendingRemoved = new Set<string>(); // 工具注册前的预移除状态\r\n private sources = new Map<string, string>(); // 工具来源追踪\r\n private superseded = new Map<string, Array<{ tool: Tool; source?: string }>>(); // 被同名覆盖的旧条目\r\n\r\n /**\r\n * 注册工具(默认启用,记录来源)\r\n */\r\n register(tool: Tool, source?: string): this {\r\n // 追踪被覆盖的旧条目\r\n if (this.tools.has(tool.name)) {\r\n if (!this.superseded.has(tool.name)) {\r\n this.superseded.set(tool.name, []);\r\n }\r\n this.superseded.get(tool.name)!.push({\r\n tool: this.tools.get(tool.name)!,\r\n source: this.sources.get(tool.name),\r\n });\r\n }\r\n\r\n this.tools.set(tool.name, tool);\r\n if (this.pendingRemoved.has(tool.name)) {\r\n this.enabled.delete(tool.name);\r\n this.disabled.delete(tool.name);\r\n } else if (this.pendingDisabled.has(tool.name)) {\r\n this.enabled.delete(tool.name);\r\n this.disabled.add(tool.name);\r\n } else {\r\n this.enabled.add(tool.name); // 默认启用\r\n this.disabled.delete(tool.name);\r\n }\r\n if (source) {\r\n this.sources.set(tool.name, source);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * 禁用工具(LLM 可见,但执行时会被拦截)\r\n */\r\n disable(name: string): boolean {\r\n this.pendingDisabled.add(name);\r\n this.pendingRemoved.delete(name);\r\n if (!this.tools.has(name)) {\r\n return true;\r\n }\r\n this.enabled.delete(name);\r\n this.disabled.add(name);\r\n return true;\r\n }\r\n\r\n /**\r\n * 启用工具\r\n */\r\n enable(name: string): boolean {\r\n this.pendingDisabled.delete(name);\r\n this.pendingRemoved.delete(name);\r\n this.disabled.delete(name);\r\n if (this.tools.has(name)) {\r\n this.enabled.add(name);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 移除工具(LLM 不可见,承接旧 disable 行为)\r\n */\r\n remove(name: string): boolean {\r\n this.pendingRemoved.add(name);\r\n this.pendingDisabled.delete(name);\r\n this.disabled.delete(name);\r\n if (!this.tools.has(name)) {\r\n return true;\r\n }\r\n this.enabled.delete(name);\r\n return true;\r\n }\r\n\r\n /**\r\n * 取消移除工具,恢复为启用状态\r\n */\r\n unremove(name: string): boolean {\r\n return this.enable(name);\r\n }\r\n\r\n /**\r\n * 检查工具是否启用\r\n */\r\n isEnabled(name: string): boolean {\r\n return this.enabled.has(name);\r\n }\r\n\r\n /**\r\n * 检查工具是否禁用(屏蔽)\r\n */\r\n isDisabled(name: string): boolean {\r\n return this.disabled.has(name);\r\n }\r\n\r\n /**\r\n * 检查工具是否移除\r\n */\r\n isRemoved(name: string): boolean {\r\n return this.tools.has(name) && !this.enabled.has(name) && !this.disabled.has(name);\r\n }\r\n\r\n /**\r\n * 检查工具是否为 exclusive 模式\r\n */\r\n isExclusive(name: string): boolean {\r\n const tool = this.tools.get(name);\r\n return tool?.executionMode === 'exclusive';\r\n }\r\n\r\n /**\r\n * 检查工具是否可并行执行\r\n */\r\n isParallelizable(name: string): boolean {\r\n const tool = this.tools.get(name);\r\n return tool?.parallelizable === true && tool?.executionMode !== 'exclusive';\r\n }\r\n\r\n /**\r\n * 获取工具来源(调试用)\r\n */\r\n getSource(name: string): string | undefined {\r\n return this.sources.get(name);\r\n }\r\n\r\n /**\r\n * 获取工具条目(调试快照用)\r\n */\r\n getEntries(): Array<{ tool: Tool; state: 'enabled' | 'disabled' | 'removed' | 'superseded'; enabled: boolean; source?: string }> {\r\n const entries: Array<{ tool: Tool; state: 'enabled' | 'disabled' | 'removed' | 'superseded'; enabled: boolean; source?: string }> =\r\n Array.from(this.tools.entries()).map(([name, tool]) => ({\r\n tool,\r\n state: this.enabled.has(name) ? 'enabled' : this.disabled.has(name) ? 'disabled' : 'removed',\r\n enabled: this.enabled.has(name),\r\n source: this.sources.get(name),\r\n }));\r\n\r\n // 追加被同名覆盖的旧条目\r\n for (const [, list] of this.superseded) {\r\n for (const { tool, source } of list) {\r\n entries.push({ tool, state: 'superseded', enabled: false, source });\r\n }\r\n }\r\n\r\n return entries;\r\n }\r\n\r\n /**\r\n * 获取工具\r\n */\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name);\r\n }\r\n\r\n /**\r\n * 获取所有 LLM 可见工具(启用 + 禁用)\r\n */\r\n getAll(): Tool[] {\r\n return Array.from(new Set([...this.enabled, ...this.disabled]))\r\n .map(name => this.tools.get(name))\r\n .filter((t): t is Tool => t !== undefined);\r\n }\r\n\r\n /**\r\n * 检查工具是否存在\r\n */\r\n has(name: string): boolean {\r\n return this.tools.has(name);\r\n }\r\n\r\n /**\r\n * 获取工具的渲染配置\r\n */\r\n getRenderConfig(name: string): ToolRenderConfig | undefined {\r\n const tool = this.tools.get(name);\r\n return tool?.render;\r\n }\r\n}\r\n","/**\n * 消息创建工具\n * 简单的工厂函数,直观易懂\n */\n\nimport type { Message, MessageRole, ToolCall } from './types.js';\n\n/**\n * 创建消息\n */\nexport function createMessage(role: MessageRole, content: string, toolCalls?: ToolCall[], reasoning?: string, tag?: string): Message {\n return { role, content, toolCalls, reasoning, ...(tag ? { tag } : {}) };\n}\n\n/**\n * 创建系统消息\n */\nexport function system(content: string): Message {\n return createMessage('system', content);\n}\n\n/**\n * 创建用户消息\n */\nexport function user(content: string): Message {\n return createMessage('user', content);\n}\n\n/**\n * 创建助手消息\n */\nexport function assistant(content: string, toolCalls?: ToolCall[], reasoning?: string): Message {\n return createMessage('assistant', content, toolCalls, reasoning);\n}\n\n/**\n * 创建工具返回消息\n */\nexport function toolResult(toolCallId: string, content: string): Message {\n return { role: 'tool', content, toolCallId };\n}\n\n/**\n * 克隆消息数组\n */\nexport function cloneMessages(messages: Message[]): Message[] {\n return messages.map(m => ({ ...m }));\n}\n","/**\n * 上下文查询构建器\n *\n * 提供链式 API 用于过滤和聚合消息\n * 从 ContextFeature 移植到内核,作为 Context 的原生能力\n */\n\nimport type { EnrichedMessage, MessageTag } from './types.js';\n\n/**\n * 上下文查询构建器\n *\n * 提供链式 API 用于过滤和聚合消息\n */\nexport class ContextQuery {\n constructor(\n private messages: EnrichedMessage[],\n private indexes: Map<string, Set<string>>\n ) {\n this.result = [...messages];\n }\n\n private result: EnrichedMessage[];\n\n // ========== 过滤方法 ==========\n\n /**\n * 按角色过滤\n */\n byRole(...roles: string[]): this {\n this.result = this.result.filter(m => roles.includes(m.role));\n return this;\n }\n\n /**\n * 按标签过滤(可组合)\n */\n byTag(...tags: MessageTag[]): this {\n this.result = this.result.filter(m =>\n m.tags?.some(t => tags.includes(t))\n );\n return this;\n }\n\n /**\n * 按工具名过滤(使用索引加速)\n */\n byTool(name: string): this {\n const key = `tool:${name}`;\n const ids = this.indexes.get(key);\n if (ids) {\n this.result = this.result.filter(m => ids.has(m.id));\n }\n return this;\n }\n\n /**\n * 按任务 ID 过滤(使用索引加速)\n */\n byTask(taskId: string): this {\n const key = `task:${taskId}`;\n const ids = this.indexes.get(key);\n if (ids) {\n this.result = this.result.filter(m => ids.has(m.id));\n }\n return this;\n }\n\n /**\n * 按子代理 ID 过滤\n */\n byAgentId(agentId: string): this {\n this.result = this.result.filter(m => m.agentId === agentId);\n return this;\n }\n\n /**\n * 按时间起点过滤\n */\n since(timestamp: number): this {\n this.result = this.result.filter(m => m.timestamp >= timestamp);\n return this;\n }\n\n /**\n * 按轮次范围过滤\n */\n inTurns(from: number, to?: number): this {\n this.result = this.result.filter(m => {\n if (to === undefined) return m.turn >= from;\n return m.turn >= from && m.turn <= to;\n });\n return this;\n }\n\n /**\n * content 包含指定文本\n */\n containing(text: string): this {\n this.result = this.result.filter(m =>\n m.content.includes(text)\n );\n return this;\n }\n\n /**\n * 最近 N 条\n */\n recent(n: number): this {\n this.result = this.result.slice(-n);\n return this;\n }\n\n // ========== 聚合方法 ==========\n\n /**\n * 执行查询,返回结果数组\n */\n exec(): EnrichedMessage[] {\n return this.result;\n }\n\n /**\n * 获取第一条\n */\n first(): EnrichedMessage | undefined {\n return this.result[0];\n }\n\n /**\n * 获取最后一条\n */\n last(): EnrichedMessage | undefined {\n return this.result[this.result.length - 1];\n }\n\n /**\n * 计数\n */\n count(): number {\n return this.result.length;\n }\n\n /**\n * 时间跨度统计\n */\n timeSpan(): { start: number; end: number; duration: number } {\n if (this.result.length === 0) {\n return { start: 0, end: 0, duration: 0 };\n }\n const start = this.result[0].timestamp;\n const end = this.result[this.result.length - 1].timestamp;\n return { start, end, duration: end - start };\n }\n\n /**\n * 按工具分组统计\n */\n groupByTool(): Record<string, number> {\n const stats: Record<string, number> = {};\n for (const msg of this.result) {\n msg.toolCalls?.forEach(call => {\n stats[call.name] = (stats[call.name] ?? 0) + 1;\n });\n }\n return stats;\n }\n}\n","/**\r\n * 上下文管理器\r\n * 管理消息数组,提供简单的操作方法\r\n *\r\n * 内核化能力:\r\n * - 消息元数据包装(EnrichedMessage)\r\n * - 内容解析和索引\r\n * - 查询接口\r\n */\r\n\r\nimport type {\r\n Message,\r\n ToolCall,\r\n LLMResponse,\r\n EnrichedMessage,\r\n MessageMeta,\r\n MessageTag,\r\n ParsedContent,\r\n ImageInput,\r\n MessageExecutionMeta,\r\n ToolTerminationReason,\r\n} from './types.js';\r\nimport { cloneMessages } from './message.js';\r\nimport { ContextQuery } from './context-query.js';\r\nimport { emitAssistantResponseEvents, emitToolResultEvents } from './session-events.js';\r\n\r\n/**\r\n * 深拷贝 enriched 消息(tags/parsed 独立副本)。\r\n */\r\nfunction cloneEnrichedMessages(messages: EnrichedMessage[]): EnrichedMessage[] {\r\n return messages.map(message => ({\r\n ...message,\r\n tags: [...message.tags],\r\n parsed: { ...message.parsed },\r\n }));\r\n}\r\n\r\n/**\r\n * 深拷贝 tombstone 条目。\r\n */\r\nfunction cloneTombstone(entry: ContextTombstoneEntry): ContextTombstoneEntry {\r\n return {\r\n id: entry.id,\r\n boundary: { ...entry.boundary },\r\n removedMessageCount: entry.removedMessageCount,\r\n truncatedAt: entry.truncatedAt,\r\n removedMessages: cloneMessages(entry.removedMessages),\r\n removedEnrichedMessages: cloneEnrichedMessages(entry.removedEnrichedMessages),\r\n };\r\n}\r\n\r\n/**\r\n * 工具执行结果(用于 addToolMessage)\r\n */\r\nexport interface ToolExecResult {\r\n success: boolean;\r\n result: string | Record<string, any>;\r\n error?: string;\r\n /**\r\n * 终止标注(ticket 023 / ADR-0005):工具被超时/用户打断终止但仍在 settle\r\n * 窗口内收尾时,结果以 success: true 返回并携带此字段。\r\n * reason: 'timeout'(框架统一超时)| 'user'(外部用户中断)。\r\n */\r\n interrupted?: { reason: ToolTerminationReason };\r\n /** 工具返回的图片(注入到 tool 消息,视觉模式下传给 LLM) */\r\n images?: ImageInput[];\r\n /** 前端展示数据(不注入 LLM,仅 tool 消息) */\r\n display?: unknown;\r\n}\r\n\r\n/**\r\n * 上下文快照类型 - 用于序列化\r\n */\r\nexport interface ContextSnapshot {\r\n version: number;\r\n messages: Message[];\r\n enrichedMessages?: EnrichedMessage[];\r\n sequence?: number;\r\n generation?: number;\r\n /** 截断归档(tombstone)。旧快照可能没有该字段,加载时视为空归档。 */\r\n tombstones?: ContextTombstoneEntry[];\r\n}\r\n\r\n/**\r\n * Context 边界快照 — 用于增量 rollback。\r\n *\r\n * 记录某个时间点两个数组的长度、sequence 和 generation,\r\n * 截断时只需按长度切片即可恢复到该边界。\r\n *\r\n * generation 用于防止 ABA 问题:如果 Context 经历了\r\n * clear/apply/restore 等非追加 mutation,generation 会递增,\r\n * 旧 boundary 会被拒绝。\r\n */\r\nexport interface ContextBoundaryV2 {\r\n messagesLength: number;\r\n enrichedMessagesLength: number;\r\n sequence: number;\r\n generation: number;\r\n}\r\n\r\n/**\r\n * Tombstone 摘要 — 轻量元数据,不含消息内容。\r\n */\r\nexport interface ContextTombstoneSummary {\r\n /** 单调递增的 tombstone ID(同一 Context 实例内唯一) */\r\n id: number;\r\n /** 截断恢复到的边界 */\r\n boundary: ContextBoundaryV2;\r\n /** 被截断的消息条数 */\r\n removedMessageCount: number;\r\n /** 截断发生时间(ISO 字符串) */\r\n truncatedAt: string;\r\n}\r\n\r\n/**\r\n * Tombstone 完整条目 — 含被截断的消息内容。\r\n *\r\n * rollback 截断不再物理丢失内容:被截尾部进入 tombstone 归档,\r\n * 可查询(listTombstones / getTombstone),在 Context 仍处于该边界时\r\n * 可完整恢复(restoreTombstone)。\r\n */\r\nexport interface ContextTombstoneEntry extends ContextTombstoneSummary {\r\n removedMessages: Message[];\r\n removedEnrichedMessages: EnrichedMessage[];\r\n}\r\n\r\nexport class Context {\r\n // ========== 字段 ==========\r\n\r\n private messages: Message[] = [];\r\n\r\n // 新增字段:内核化能力\r\n private enrichedMessages: EnrichedMessage[] = [];\r\n private indexes = new Map<string, Set<string>>();\r\n private sequence: number = 0;\r\n\r\n /**\r\n * Lineage generation,用于检测非追加 mutation。\r\n *\r\n * - 纯追加 typed message(addUserMessage 等):不变\r\n * - rollback 的合法截断(truncateToBoundary):不变\r\n * - clear / apply:递增\r\n * - restore:使用 snapshot 携带的 generation,否则递增\r\n */\r\n private generation: number = 0;\r\n\r\n /**\r\n * 截断归档(tombstone)。append-only:clear/apply/restore 不清空,\r\n * 只有 restore(snapshot) 采用快照携带的归档。\r\n */\r\n private tombstones: ContextTombstoneEntry[] = [];\r\n private tombstoneSeq: number = 0;\r\n\r\n /**\r\n * 添加一条消息\r\n */\r\n add(message: Message): this {\r\n this.messages.push({ ...message });\r\n return this;\r\n }\r\n\r\n /**\r\n * 添加多条消息\r\n */\r\n addAll(messages: Message[]): this {\r\n for (const m of messages) {\r\n this.add(m);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * 获取所有消息的副本\r\n */\r\n getAll(): Message[] {\r\n return cloneMessages(this.messages);\r\n }\r\n\r\n /**\r\n * 获取消息数量\r\n */\r\n get length(): number {\r\n return this.messages.length;\r\n }\r\n\r\n /**\r\n * 获取最后一条消息\r\n */\r\n getLast(): Message | undefined {\r\n return this.messages[this.messages.length - 1];\r\n }\r\n\r\n /**\r\n * 清空消息\r\n */\r\n clear(): void {\r\n this.messages = [];\r\n this.generation++;\r\n }\r\n\r\n /**\r\n * 应用中间件处理消息\r\n */\r\n apply(middleware: (messages: Message[]) => Message[]): this {\r\n this.messages = middleware(this.messages);\r\n this.generation++;\r\n return this;\r\n }\r\n\r\n /**\r\n * 过滤消息\r\n */\r\n filter(predicate: (msg: Message) => boolean): Message[] {\r\n return this.messages.filter(predicate);\r\n }\r\n\r\n /**\r\n * 切片\r\n */\r\n slice(start?: number, end?: number): Message[] {\r\n return this.messages.slice(start, end);\r\n }\r\n\r\n /**\r\n * 序列化为快照\r\n */\r\n toJSON(): ContextSnapshot {\r\n return {\r\n version: 2,\r\n messages: cloneMessages(this.messages),\r\n enrichedMessages: cloneEnrichedMessages(this.enrichedMessages),\r\n sequence: this.sequence,\r\n generation: this.generation,\r\n tombstones: this.tombstones.map(cloneTombstone),\r\n };\r\n }\r\n\r\n /**\r\n * 从快照恢复\r\n */\r\n static fromJSON(snapshot: ContextSnapshot): Context {\r\n const ctx = new Context();\r\n ctx.restore(snapshot);\r\n return ctx;\r\n }\r\n\r\n /**\r\n * 用快照原地恢复当前 Context\r\n */\r\n restore(snapshot: ContextSnapshot): this {\r\n this.messages = cloneMessages(snapshot.messages);\r\n this.enrichedMessages = snapshot.enrichedMessages\r\n ? cloneEnrichedMessages(snapshot.enrichedMessages)\r\n : [];\r\n this.sequence = snapshot.sequence ?? this.enrichedMessages.length;\r\n this.generation = snapshot.generation ?? this.generation + 1;\r\n this.tombstones = snapshot.tombstones\r\n ? snapshot.tombstones.map(cloneTombstone)\r\n : [];\r\n this.tombstoneSeq = this.tombstones.reduce((max, t) => Math.max(max, t.id), 0);\r\n this.rebuildIndexes();\r\n return this;\r\n }\r\n\r\n /**\r\n * 序列化为 JSON 字符串\r\n */\r\n serialize(): string {\r\n return JSON.stringify(this.toJSON());\r\n }\r\n\r\n /**\r\n * 从 JSON 字符串反序列化\r\n */\r\n static deserialize(json: string): Context {\r\n return Context.fromJSON(JSON.parse(json));\r\n }\r\n\r\n // ========== 内核化能力:消息包装 ==========\r\n\r\n /**\r\n * 统一消息入口(内部方法)\r\n */\r\n private addMessage(msg: Message, meta: MessageMeta): void {\r\n const enriched = this.enrich(msg, meta);\r\n this.enrichedMessages.push(enriched);\r\n this.updateIndexes(enriched);\r\n }\r\n\r\n /**\r\n * 添加用户消息\r\n */\r\n addUserMessage(content: string, turn: number, images?: ImageInput[]): void {\r\n this.addMessage(\r\n { role: 'user', content, turn, images },\r\n { turn }\r\n );\r\n // 同步到 messages 数组(保持向后兼容)\r\n this.messages.push({ role: 'user', content, turn, images });\r\n }\r\n\r\n /**\r\n * 添加助手响应\r\n *\r\n * 框架合成消息(错误/截断说明)可通过 execution 字段附带执行终态元数据。\r\n */\r\n addAssistantMessage(response: LLMResponse & { execution?: MessageExecutionMeta }, turn: number): void {\r\n // 会话事件流:reasoning / agent_message / tool_call started\r\n emitAssistantResponseEvents(response, turn);\r\n\r\n // 从 LLM 响应中提取用量信息,盖戳到 assistant 消息上\r\n const usage = response.usage\r\n ? { inputTokens: response.usage.inputTokens, outputTokens: response.usage.outputTokens }\r\n : undefined;\r\n // 框架盖戳的执行终态元数据(错误/截断消息)原样透传到消息上\r\n const { execution } = response;\r\n\r\n this.addMessage(\r\n {\r\n role: 'assistant',\r\n content: response.content,\r\n turn,\r\n toolCalls: response.toolCalls,\r\n reasoning: response.reasoning,\r\n thinkingBlocks: response.thinkingBlocks,\r\n usage,\r\n ...(execution ? { execution } : {}),\r\n },\r\n { turn }\r\n );\r\n // 同步到 messages 数组\r\n this.messages.push({\r\n role: 'assistant',\r\n content: response.content,\r\n turn,\r\n toolCalls: response.toolCalls,\r\n reasoning: response.reasoning,\r\n thinkingBlocks: response.thinkingBlocks,\r\n usage,\r\n ...(execution ? { execution } : {}),\r\n });\r\n }\r\n\r\n /**\r\n * 添加工具结果\r\n */\r\n addToolMessage(call: ToolCall, result: ToolExecResult, turn: number): void {\r\n // 会话事件流:tool_call completed\r\n emitToolResultEvents(call, result, turn);\r\n\r\n const content = JSON.stringify({\r\n success: result.success,\r\n result: result.result,\r\n ...(result.error ? { error: result.error } : {}),\r\n ...(result.interrupted ? { interrupted: result.interrupted } : {}),\r\n });\r\n this.addSerializedToolMessage(call.id, content, turn, result.images, result.display);\r\n }\r\n\r\n /**\r\n * 添加已经序列化的工具消息。\r\n *\r\n * 用于 session/handoff 恢复等边界:原始 tool content 已经是 provider 可重放的\r\n * 序列化字符串,不应先解析成 ToolExecResult 再重新编码。该入口同时维护\r\n * messages[] 与 enrichedMessages[],并保留工具返回的图片附件。\r\n */\r\n addSerializedToolMessage(toolCallId: string, content: string, turn: number, images?: ImageInput[], display?: unknown): void {\r\n const normalizedImages = images?.length ? images : undefined;\r\n const message: Message = {\r\n role: 'tool',\r\n turn,\r\n toolCallId,\r\n content,\r\n ...(normalizedImages ? { images: normalizedImages } : {}),\r\n ...(display !== undefined ? { display } : {}),\r\n };\r\n this.addMessage(message, { turn });\r\n this.messages.push({ ...message });\r\n }\r\n\r\n /**\r\n * 添加系统消息\r\n */\r\n addSystemMessage(content: string, turn: number, source?: string, tag?: string): void {\r\n this.addMessage(\r\n { role: 'system', content, turn, ...(tag ? { tag } : {}) },\r\n { turn, source, ...(tag ? { tag } : {}) }\r\n );\r\n // 同步到 messages 数组\r\n this.messages.push({ role: 'system', content, turn, ...(source ? { source } : {}), ...(tag ? { tag } : {}) });\r\n }\r\n\r\n // ========== 内核化能力:查询接口 ==========\r\n\r\n /**\r\n * 查询构建器\r\n */\r\n query(): ContextQuery {\r\n return new ContextQuery(this.enrichedMessages, this.indexes);\r\n }\r\n\r\n /**\r\n * 按轮次获取消息\r\n */\r\n getByTurn(turn: number): EnrichedMessage[] {\r\n return this.enrichedMessages.filter(m => m.turn === turn);\r\n }\r\n\r\n /**\r\n * 获取最近 N 条消息\r\n */\r\n getRecent(n: number): EnrichedMessage[] {\r\n return this.enrichedMessages.slice(-n);\r\n }\r\n\r\n /**\r\n * 获取所有丰富化消息(内部使用)\r\n */\r\n getAllEnriched(): EnrichedMessage[] {\r\n return [...this.enrichedMessages];\r\n }\r\n\r\n // ========== 私有方法 ==========\r\n\r\n /**\r\n * 丰富化消息:添加元数据\r\n */\r\n private enrich(message: Message, meta: MessageMeta): EnrichedMessage {\r\n const id = this.generateId();\r\n const timestamp = Date.now();\r\n\r\n return {\r\n // 原始字段\r\n role: message.role,\r\n content: message.content,\r\n toolCallId: message.toolCallId,\r\n toolCalls: message.toolCalls,\r\n reasoning: message.reasoning,\r\n thinkingBlocks: message.thinkingBlocks,\r\n images: message.images,\r\n\r\n // 元数据字段\r\n id,\r\n timestamp,\r\n turn: meta.turn,\r\n sequence: this.sequence++,\r\n agentId: meta.agentId,\r\n source: meta.source,\r\n tag: message.tag ?? meta.tag,\r\n\r\n // 分类标签\r\n tags: this.inferTags(message),\r\n\r\n // 解析结果\r\n parsed: this.parseContent(message),\r\n };\r\n }\r\n\r\n /**\r\n * 推断消息标签\r\n */\r\n private inferTags(message: Message): MessageTag[] {\r\n const tags: MessageTag[] = [];\r\n\r\n if (message.role === 'user') {\r\n tags.push('user');\r\n } else if (message.role === 'system') {\r\n tags.push('system');\r\n } else if (message.role === 'assistant') {\r\n tags.push('assistant');\r\n if (message.toolCalls && message.toolCalls.length > 0) {\r\n tags.push('tool-call');\r\n }\r\n } else if (message.role === 'tool') {\r\n tags.push('tool-result');\r\n }\r\n\r\n return tags;\r\n }\r\n\r\n /**\r\n * 解析 content 提取结构化信息\r\n */\r\n private parseContent(message: Message): ParsedContent {\r\n const content = message.content;\r\n\r\n // 提取 taskId: 匹配 \"taskId\":\"xxx\" 或 'taskId':'xxx'\r\n const taskIdRegex = /[\"']taskId[\"']\\s*:\\s*[\"']([^\"']+)[\"']/g;\r\n const taskIds: string[] = [];\r\n let match;\r\n while ((match = taskIdRegex.exec(content)) !== null) {\r\n taskIds.push(match[1]);\r\n }\r\n\r\n // 提取工具调用名:从 toolCalls 或 content 中提取\r\n const toolCalls: string[] = [];\r\n if (message.toolCalls) {\r\n message.toolCalls.forEach(call => toolCalls.push(call.name));\r\n }\r\n\r\n // 提取 @ 提及\r\n const mentions: string[] = [];\r\n const mentionRegex = /@(\\w+)/g;\r\n while ((match = mentionRegex.exec(content)) !== null) {\r\n mentions.push(match[1]);\r\n }\r\n\r\n return { taskIds, toolCalls, mentions };\r\n }\r\n\r\n /**\r\n * 更新索引\r\n */\r\n private updateIndexes(message: EnrichedMessage): void {\r\n // 按工具名索引\r\n message.toolCalls?.forEach(call => {\r\n const key = `tool:${call.name}`;\r\n const set = this.indexes.get(key) ?? new Set<string>();\r\n set.add(message.id);\r\n this.indexes.set(key, set);\r\n });\r\n\r\n // 按 taskId 索引\r\n message.parsed.taskIds.forEach(taskId => {\r\n const key = `task:${taskId}`;\r\n const set = this.indexes.get(key) ?? new Set<string>();\r\n set.add(message.id);\r\n this.indexes.set(key, set);\r\n });\r\n }\r\n\r\n /**\r\n * 从 enrichedMessages 重建索引\r\n */\r\n private rebuildIndexes(): void {\r\n this.indexes = new Map<string, Set<string>>();\r\n for (const message of this.enrichedMessages) {\r\n this.updateIndexes(message);\r\n }\r\n }\r\n\r\n /**\r\n * 生成唯一 ID\r\n */\r\n private generateId(): string {\r\n return `msg_${Date.now()}_${this.sequence}`;\r\n }\r\n\r\n // ========== 边界原语(增量 rollback) ==========\r\n\r\n /**\r\n * 捕获当前 Context 的前缀边界。\r\n *\r\n * 返回一个轻量快照,记录两个数组的长度、sequence 和 generation。\r\n * 后续可传给 truncateToBoundary() 恢复到此边界。\r\n *\r\n * generation 不变:纯读取操作。\r\n */\r\n captureBoundary(): ContextBoundaryV2 {\r\n return {\r\n messagesLength: this.messages.length,\r\n enrichedMessagesLength: this.enrichedMessages.length,\r\n sequence: this.sequence,\r\n generation: this.generation,\r\n };\r\n }\r\n\r\n /**\r\n * 校验 boundary 是否与当前 Context 兼容。\r\n *\r\n * @throws 如果 generation 不匹配、长度非法或超出当前数组。\r\n */\r\n private assertBoundaryCompatible(boundary: ContextBoundaryV2): void {\r\n if (boundary.generation !== this.generation) {\r\n throw new Error(\r\n `Context boundary generation mismatch: boundary=${boundary.generation}, current=${this.generation}. ` +\r\n 'Context has been mutated by clear/apply/restore since the boundary was captured.',\r\n );\r\n }\r\n if (!Number.isInteger(boundary.messagesLength) || boundary.messagesLength < 0) {\r\n throw new Error(\r\n `Context boundary messagesLength must be a non-negative integer, got ${boundary.messagesLength}`,\r\n );\r\n }\r\n if (\r\n !Number.isInteger(boundary.enrichedMessagesLength) ||\r\n boundary.enrichedMessagesLength < 0\r\n ) {\r\n throw new Error(\r\n `Context boundary enrichedMessagesLength must be a non-negative integer, got ${boundary.enrichedMessagesLength}`,\r\n );\r\n }\r\n if (boundary.messagesLength > this.messages.length) {\r\n throw new Error(\r\n `Context boundary messagesLength (${boundary.messagesLength}) exceeds current length (${this.messages.length})`,\r\n );\r\n }\r\n if (boundary.enrichedMessagesLength > this.enrichedMessages.length) {\r\n throw new Error(\r\n `Context boundary enrichedMessagesLength (${boundary.enrichedMessagesLength}) exceeds current length (${this.enrichedMessages.length})`,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * 将两个数组截断到指定边界。\r\n *\r\n * 这是合法的 rollback 操作:generation 保持不变,\r\n * 截断后同一 lineage 的旧 boundary 仍然可以继续使用。\r\n *\r\n * 被截尾部进入 tombstone 归档(不物理丢失):\r\n * 通过 listTombstones() / getTombstone() 查询,\r\n * Context 仍处于该边界时可通过 restoreTombstone() 完整恢复。\r\n *\r\n * @throws 如果 boundary 与当前 Context 不兼容(generation 不匹配或长度越界)。\r\n */\r\n truncateToBoundary(boundary: ContextBoundaryV2): void {\r\n this.assertBoundaryCompatible(boundary);\r\n\r\n const removedMessages = this.messages.slice(boundary.messagesLength);\r\n const removedEnrichedMessages = this.enrichedMessages.slice(\r\n boundary.enrichedMessagesLength,\r\n );\r\n\r\n if (removedMessages.length > 0 || removedEnrichedMessages.length > 0) {\r\n this.tombstones.push({\r\n id: ++this.tombstoneSeq,\r\n boundary: { ...boundary },\r\n truncatedAt: new Date().toISOString(),\r\n removedMessageCount: removedMessages.length,\r\n removedMessages: cloneMessages(removedMessages),\r\n removedEnrichedMessages: cloneEnrichedMessages(removedEnrichedMessages),\r\n });\r\n }\r\n\r\n this.messages = this.messages.slice(0, boundary.messagesLength);\r\n this.enrichedMessages = this.enrichedMessages.slice(\r\n 0,\r\n boundary.enrichedMessagesLength,\r\n );\r\n this.sequence = boundary.sequence;\r\n this.rebuildIndexes();\r\n }\r\n\r\n // ========== Tombstone 归档(诚实反悔:被截内容不物理丢失) ==========\r\n\r\n /**\r\n * 列出 tombstone 摘要(不含消息内容)。\r\n */\r\n listTombstones(): ContextTombstoneSummary[] {\r\n return this.tombstones.map(entry => ({\r\n id: entry.id,\r\n boundary: { ...entry.boundary },\r\n removedMessageCount: entry.removedMessageCount,\r\n truncatedAt: entry.truncatedAt,\r\n }));\r\n }\r\n\r\n /**\r\n * 按 ID 取回 tombstone 完整内容(深拷贝,修改返回值不影响归档)。\r\n */\r\n getTombstone(id: number): ContextTombstoneEntry | undefined {\r\n const entry = this.tombstones.find(t => t.id === id);\r\n return entry ? cloneTombstone(entry) : undefined;\r\n }\r\n\r\n /**\r\n * 从 tombstone 恢复被截尾部。\r\n *\r\n * 仅当 Context 仍精确处于该 tombstone 的边界时允许\r\n * (generation、两个数组长度、sequence 全部匹配)——此时恢复是\r\n * 截断的精确逆操作,不破坏 lineage。\r\n *\r\n * 恢复后 sequence 续接被截尾部的最大序号,generation 不变。\r\n *\r\n * @throws 如果 Context 已离开该边界(例如截断后追加了新消息)。\r\n * 此时内容仍可通过 getTombstone() 提取,由调用方决定如何重组。\r\n */\r\n restoreTombstone(id: number): void {\r\n const entry = this.tombstones.find(t => t.id === id);\r\n if (!entry) {\r\n throw new Error(`Tombstone ${id} not found`);\r\n }\r\n\r\n const b = entry.boundary;\r\n const atBoundary =\r\n b.generation === this.generation &&\r\n b.messagesLength === this.messages.length &&\r\n b.enrichedMessagesLength === this.enrichedMessages.length &&\r\n b.sequence === this.sequence;\r\n\r\n if (!atBoundary) {\r\n throw new Error(\r\n `Cannot restore tombstone ${id}: context is no longer at the tombstone boundary ` +\r\n `(boundary: generation=${b.generation}, messagesLength=${b.messagesLength}, ` +\r\n `enrichedMessagesLength=${b.enrichedMessagesLength}, sequence=${b.sequence}; ` +\r\n `current: generation=${this.generation}, messagesLength=${this.messages.length}, ` +\r\n `enrichedMessagesLength=${this.enrichedMessages.length}, sequence=${this.sequence}). ` +\r\n 'Extract the content via getTombstone() instead.',\r\n );\r\n }\r\n\r\n this.messages = [...this.messages, ...cloneMessages(entry.removedMessages)];\r\n this.enrichedMessages = [\r\n ...this.enrichedMessages,\r\n ...cloneEnrichedMessages(entry.removedEnrichedMessages),\r\n ];\r\n const lastRestored =\r\n entry.removedEnrichedMessages[entry.removedEnrichedMessages.length - 1];\r\n if (lastRestored) {\r\n this.sequence = lastRestored.sequence + 1;\r\n }\r\n this.rebuildIndexes();\r\n }\r\n}\r\n","import { AsyncLocalStorage } from 'async_hooks';\nimport { format, inspect } from 'util';\nimport { DebugHub } from './debug-hub.js';\nimport type { DebugLogEntry, LogContextRef, LogLevel, Notification } from './types.js';\n\nexport interface LoggerBindings extends LogContextRef {\n tags?: string[];\n}\n\ninterface LoggerOptions {\n namespace?: string;\n bindings?: LoggerBindings;\n}\n\nexport interface Logger {\n trace(message: string, data?: unknown): void;\n debug(message: string, data?: unknown): void;\n info(message: string, data?: unknown): void;\n warn(message: string, data?: unknown): void;\n error(message: string, data?: unknown): void;\n child(options?: LoggerBindings & { namespace?: string }): Logger;\n}\n\ninterface InternalLogScope extends LogContextRef {\n namespace?: string;\n minLevel?: LogLevel;\n}\n\nconst scopeStorage = new AsyncLocalStorage<InternalLogScope>();\n\nconst LOG_LEVEL_WEIGHT: Record<LogLevel, number> = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n};\n\nlet nextLogId = 1;\nlet consoleBridgeInstalled = false;\nlet bridgeReentry = false;\n\n/**\n * Delivery contract (single write, dual sink):\n * - hub connected: push to hub (Web UI / query_logs — visible and\n * controllable monitoring surface); stdio mirror is OFF by default so a\n * foreground host terminal (e.g. `npm start`) stays quiet.\n * Set AGENTDEV_LOG_CONSOLE_MIRROR=on to mirror hub-delivered logs to stdio\n * (e.g. watching a hub-attached agent from the CLI).\n * - hub unavailable / no agent context: stdio only (headless CLI fallback).\n *\n * stdio stream routing (AGENTDEV_LOG_STREAM = 'auto' | 'stderr', default auto):\n * - auto: trace/debug/info → stdout; warn/error → stderr\n * - stderr: ALL levels → stderr. Headless mode treats the agent as an\n * auditable component of other software — stdout is reserved exclusively\n * for program output/results, logs never pollute it. Headless entry\n * scripts are responsible for setting this env.\n *\n * Env values are read per call so config changes apply immediately (cheap\n * process.env lookup).\n */\nfunction shouldMirrorConsoleToStdio(): boolean {\n return (process.env.AGENTDEV_LOG_CONSOLE_MIRROR ?? 'off').trim().toLowerCase() === 'on';\n}\n\nfunction resolveStdioStream(level: LogLevel): NodeJS.WriteStream {\n const mode = (process.env.AGENTDEV_LOG_STREAM ?? 'auto').trim().toLowerCase();\n if (mode === 'stderr') {\n return process.stderr;\n }\n return level === 'warn' || level === 'error' ? process.stderr : process.stdout;\n}\n\nexport function installConsoleBridge(): void {\n if (consoleBridgeInstalled) return;\n consoleBridgeInstalled = true;\n\n console.log = (...args: unknown[]) => bridgeConsole('info', args);\n console.info = (...args: unknown[]) => bridgeConsole('info', args);\n console.warn = (...args: unknown[]) => bridgeConsole('warn', args);\n console.error = (...args: unknown[]) => bridgeConsole('error', args);\n console.debug = (...args: unknown[]) => bridgeConsole('debug', args);\n}\n\nfunction bridgeConsole(level: LogLevel, args: unknown[]): void {\n const scope = scopeStorage.getStore();\n if (!scope || bridgeReentry) {\n writeRawConsole(level, args);\n return;\n }\n\n bridgeReentry = true;\n try {\n const { message, data } = normalizeConsoleArgs(args);\n emitLog(level, message, data, {\n namespace: scope.namespace || 'console',\n context: scope,\n });\n } finally {\n bridgeReentry = false;\n }\n}\n\nfunction writeRawConsole(level: LogLevel, args: unknown[]): void {\n // Direct stream writes bypass any console patching (installConsoleBridge)\n // and make stream routing testable.\n const stream = resolveStdioStream(level);\n stream.write(format(...args) + '\\n');\n}\n\nfunction normalizeConsoleArgs(args: unknown[]): { message: string; data?: unknown } {\n if (args.length === 0) {\n return { message: '' };\n }\n\n const [first, ...rest] = args;\n if (typeof first === 'string') {\n if (rest.length === 0) {\n return { message: first };\n }\n return {\n message: first,\n data: rest.length === 1 ? rest[0] : rest,\n };\n }\n\n return {\n message: args.map((item) => stringifyForLog(item)).join(' '),\n data: args.length === 1 ? first : args,\n };\n}\n\nfunction stringifyForLog(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean' || value == null) {\n return String(value);\n }\n try {\n return inspect(value, { depth: 4, breakLength: 120 });\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction mergeTags(...tagSets: Array<string[] | undefined>): string[] | undefined {\n const merged = new Set<string>();\n for (const tags of tagSets) {\n for (const tag of tags || []) {\n if (tag) merged.add(tag);\n }\n }\n return merged.size > 0 ? Array.from(merged) : undefined;\n}\n\nfunction mergeScope(base: InternalLogScope | undefined, patch: InternalLogScope | undefined): InternalLogScope {\n return {\n ...(base || {}),\n ...(patch || {}),\n tags: mergeTags(base?.tags, patch?.tags),\n };\n}\n\nfunction createNotification(entry: DebugLogEntry): Notification {\n return {\n type: 'log.entry',\n category: 'event',\n timestamp: entry.timestamp,\n data: entry,\n };\n}\n\nfunction shouldDrop(level: LogLevel, scope: InternalLogScope | undefined): boolean {\n const minLevel = scope?.minLevel;\n if (!minLevel) return false;\n return LOG_LEVEL_WEIGHT[level] < LOG_LEVEL_WEIGHT[minLevel];\n}\n\nfunction generateLogId(): string {\n return `log-${Date.now()}-${nextLogId++}`;\n}\n\nexport function getCurrentLogScope(): LogContextRef {\n return { ...(scopeStorage.getStore() || {}) };\n}\n\nexport function runWithLogScope<T>(scope: LogContextRef, fn: () => T): T {\n const merged = mergeScope(scopeStorage.getStore(), scope);\n return scopeStorage.run(merged, fn);\n}\n\nexport function emitLog(\n level: LogLevel,\n message: string,\n data?: unknown,\n options?: { namespace?: string; context?: LogContextRef }\n): DebugLogEntry {\n const current = scopeStorage.getStore();\n const mergedContext = mergeScope(current, options?.context);\n if (shouldDrop(level, mergedContext)) {\n return {\n id: generateLogId(),\n timestamp: Date.now(),\n level,\n message,\n namespace: options?.namespace || mergedContext.namespace || 'agent',\n context: {\n ...mergedContext,\n tags: mergedContext.tags ? [...mergedContext.tags] : undefined,\n },\n data,\n delivery: {\n hub: false,\n console: false,\n reason: 'hub-unavailable',\n },\n };\n }\n\n const entry: DebugLogEntry = {\n id: generateLogId(),\n timestamp: Date.now(),\n level,\n message,\n namespace: options?.namespace || mergedContext.namespace || 'agent',\n context: {\n ...mergedContext,\n tags: mergedContext.tags ? [...mergedContext.tags] : undefined,\n },\n data,\n delivery: {\n hub: false,\n console: false,\n reason: 'hub-unavailable',\n },\n };\n\n const agentId = entry.context.agentId;\n if (!agentId) {\n entry.delivery = {\n hub: false,\n console: true,\n reason: 'no-agent-context',\n };\n writeRawConsole(level, [message, ...(data === undefined ? [] : [data])]);\n return entry;\n }\n\n const debugHub = DebugHub.getInstance();\n if (debugHub.isConnected()) {\n const mirror = shouldMirrorConsoleToStdio();\n entry.delivery = {\n hub: true,\n console: mirror,\n reason: 'hub',\n };\n debugHub.pushNotification(agentId, createNotification(entry));\n if (mirror) {\n writeRawConsole(level, [\n `[${entry.namespace}] ${entry.message}`,\n ...(entry.data === undefined ? [] : [entry.data]),\n ]);\n }\n return entry;\n }\n\n entry.delivery = {\n hub: false,\n console: true,\n reason: 'hub-unavailable',\n };\n writeLocalFallback(entry);\n return entry;\n}\n\nfunction writeLocalFallback(entry: DebugLogEntry): void {\n // Headless CLI output doubles as the audit trail for agents running as\n // components of other software — keep the stdio format clean. The delivery\n // reason stays available on entry.delivery for programmatic inspection.\n const prefix = `[${entry.namespace}] ${entry.message}`;\n const args = entry.data === undefined ? [prefix] : [prefix, entry.data];\n writeRawConsole(entry.level, args);\n}\n\nclass BoundLogger implements Logger {\n constructor(\n private readonly namespace: string,\n private readonly bindings: LoggerBindings = {}\n ) {}\n\n trace(message: string, data?: unknown): void {\n emitLog('trace', message, data, { namespace: this.namespace, context: this.bindings });\n }\n\n debug(message: string, data?: unknown): void {\n emitLog('debug', message, data, { namespace: this.namespace, context: this.bindings });\n }\n\n info(message: string, data?: unknown): void {\n emitLog('info', message, data, { namespace: this.namespace, context: this.bindings });\n }\n\n warn(message: string, data?: unknown): void {\n emitLog('warn', message, data, { namespace: this.namespace, context: this.bindings });\n }\n\n error(message: string, data?: unknown): void {\n emitLog('error', message, data, { namespace: this.namespace, context: this.bindings });\n }\n\n child(options: LoggerBindings & { namespace?: string } = {}): Logger {\n const childNamespace = options.namespace || this.namespace;\n const mergedBindings = mergeScope(this.bindings, options);\n delete (mergedBindings as any).namespace;\n return new BoundLogger(childNamespace, mergedBindings);\n }\n}\n\nexport function createLogger(namespace: string, bindings?: LoggerBindings): Logger {\n return new BoundLogger(namespace, bindings);\n}\n","/**\r\n * 生命周期类型定义\r\n * 定义 Agent 生命周期钩子相关的类型\r\n */\r\n\r\nimport type { ToolCall, Tool, LLMResponse, Message } from './types.js';\r\nimport { type Context, type ToolExecResult } from './context.js';\r\nimport type { Agent } from './agent.js';\r\nimport type { AgentFeature } from './feature.js';\r\n\r\n// ========== 概念定义 ==========\r\n/**\r\n * Call(调用): 用户一次完整的输入-输出交互\r\n * - 用户输入 → Agent 处理(可能包含多个 ReAct 步骤) → 返回最终输出\r\n * - 一个 Call 可能包含多个 Step\r\n *\r\n * Step(步骤): ReAct 循环中的单次迭代\r\n * - 一次 LLM 调用 + 工具执行(如果有)\r\n * - Step 是 Call 内部的执行单元\r\n *\r\n * Turn(轮): 从无工具调用开始,到下一次无工具调用结束的完整对话周期\r\n * - 可能包含多个 Step\r\n * - 用于反向钩子决策点\r\n */\r\n\r\n// ========== 核心生命周期枚举 ==========\r\n/**\r\n * 核心生命周期枚举\r\n *\r\n * 三级结构:Agent 级 > Call 级 > Step 级 > Tool 级\r\n * 每个生命周期都有配套的正向钩子(通知)和反向钩子(决策/处理)\r\n */\r\nexport enum CoreLifecycle {\r\n // ========== Agent 级 ==========\r\n /** Agent 初始化 */\r\n AgentInitiate = 'AgentInitiate',\r\n\r\n /** Agent 销毁 */\r\n AgentDestroy = 'AgentDestroy',\r\n\r\n // ========== Call 级 ==========\r\n /** Call 开始 */\r\n CallStart = 'CallStart',\r\n\r\n /** Call 结束 */\r\n CallFinish = 'CallFinish',\r\n\r\n // ========== Step 级 ==========\r\n /** Step 开始 */\r\n StepStart = 'StepStart',\r\n\r\n /** Step 结束 */\r\n StepFinish = 'StepFinish',\r\n\r\n // ========== Tool 级 ==========\r\n /** 工具使用前 */\r\n ToolUse = 'ToolUse',\r\n\r\n /** 工具使用后 */\r\n ToolFinished = 'ToolFinished',\r\n\r\n /** 工具结果变换(结果写入 context 前,可修改结果) */\r\n ToolResultTransform = 'ToolResultTransform',\r\n}\r\n\r\n// ========== 决策状态定义 ==========\r\n/**\r\n * 决策状态(反向钩子返回值)\r\n *\r\n * 用于控制执行流程的三个状态\r\n */\r\nexport enum Decision {\r\n /** 批准:确认执行,跳过后续决策 */\r\n Approve = 'approve',\r\n\r\n /** 拒绝:阻止执行,跳过后续决策 */\r\n Deny = 'deny',\r\n\r\n /** 继续:交给下一个决策节点,使用默认行为 */\r\n Continue = 'continue',\r\n}\r\n\r\n/**\r\n * 决策结果类型\r\n */\r\nexport type DecisionResult =\r\n | Decision\r\n | {\r\n /** 决策动作 */\r\n action: Decision;\r\n\r\n /** 拒绝原因(用于日志/调试) */\r\n reason?: string;\r\n\r\n /** 附加元数据 */\r\n metadata?: Record<string, any>;\r\n };\r\n\r\n/**\r\n * 将 DecisionResult 转换为标准 Decision\r\n */\r\nexport function normalizeDecision(result: DecisionResult): Decision {\r\n if (typeof result === 'string') {\r\n return result;\r\n }\r\n return result.action;\r\n}\r\n\r\n// ========== Agent 级别 ==========\r\n\r\n/**\r\n * Agent 初始化上下文\r\n */\r\nexport interface AgentInitiateContext {\r\n /** 消息上下文 */\r\n context: Context;\r\n}\r\n\r\n/**\r\n * Agent 销毁上下文\r\n */\r\nexport interface AgentDestroyContext {\r\n /** 消息上下文 */\r\n context: Context;\r\n}\r\n\r\n// ========== Call 级别 ==========\r\n\r\n/**\r\n * Call 开始上下文\r\n */\r\nexport interface CallStartContext {\r\n /** 用户输入 */\r\n input: string;\r\n /** 消息上下文 */\r\n context: Context;\r\n /** 是否首次调用 */\r\n isFirstCall: boolean;\r\n /** Agent 实例(用于访问 setUserInput/getUserInput 等 API) */\r\n agent?: any;\r\n}\r\n\r\n/**\r\n * 执行单元的终态。它只表达执行是否完成、失败、取消或移交给后续单元;\r\n * 不复用模型厂商的 stop reason,也不推断宿主任务的业务状态。\r\n */\r\nexport type ExecutionStatus = 'completed' | 'failed' | 'cancelled' | 'continued';\r\n\r\n/**\r\n * 执行终止的框架级原因。\r\n *\r\n * `reason` 描述生命周期语义,错误来源由 `error.category` 表达,避免一个字段\r\n * 同时承担供应商协议、框架控制流和宿主业务状态三种含义。\r\n */\r\nexport type ExecutionReason =\r\n | 'completed'\r\n | 'cancelled'\r\n | 'limit_reached'\r\n | 'continued'\r\n | 'error';\r\n\r\n/** 可序列化的错误事实。category 是稳定的机器分类,message 只供展示。 */\r\nexport interface ExecutionError {\r\n category: string;\r\n message: string;\r\n code?: string;\r\n statusCode?: number;\r\n retryable?: boolean;\r\n}\r\n\r\n/** 单次模型请求的来源信息;不决定 Call 的终态。 */\r\nexport interface ModelRequestOutcome {\r\n providerStopReason?: string | null;\r\n}\r\n\r\n/**\r\n * 一次 Agent Call(而非宿主任务)的结构化终态。\r\n * 该对象可安全持久化、跨进程传输和用于 JSONL/CLI 消费。\r\n */\r\nexport interface CallOutcome {\r\n status: ExecutionStatus;\r\n reason: ExecutionReason;\r\n response: string;\r\n steps: number;\r\n startedAt: number;\r\n finishedAt: number;\r\n error?: ExecutionError;\r\n model?: ModelRequestOutcome;\r\n}\r\n\r\n/** @deprecated 使用 CallOutcome.reason。保留旧 hook/API 的类型兼容。 */\r\nexport type CallFinishReason = ExecutionReason;\r\n\r\n/**\r\n * Call 结束上下文\r\n */\r\nexport interface CallFinishContext {\r\n /** 用户输入 */\r\n input: string;\r\n /** 消息上下文 */\r\n context: Context;\r\n /** 最终响应 */\r\n response: string;\r\n /** 执行的步骤数 */\r\n steps: number;\r\n /** 是否成功完成 */\r\n completed: boolean;\r\n /** 结束原因 */\r\n finishReason: CallFinishReason;\r\n /** 完整的结构化终态 */\r\n outcome: CallOutcome;\r\n}\r\n\r\n// ========== Step 级别 ==========\r\n\r\n/**\r\n * Step 开始上下文\r\n *\r\n * Step 是 ReAct 循环中的单次迭代\r\n */\r\nexport interface StepStartContext {\r\n /** 当前步骤序号(从 0 开始) */\r\n step: number;\r\n /** 当前调用序号(用户交互次数,从 0 开始) */\r\n callIndex: number;\r\n /** 消息上下文 */\r\n context: Context;\r\n /** 原始用户输入 */\r\n input: string;\r\n /** Agent 实例(用于访问当前会话中的 Feature、工具和输入状态) */\r\n agent?: any;\r\n}\r\n\r\n/**\r\n * Step 结束上下文\r\n */\r\nexport interface StepFinishedContext extends StepStartContext {\r\n /** LLM 响应 */\r\n llmResponse: LLMResponse;\r\n /** 执行的工具调用数量 */\r\n toolCallsCount: number;\r\n}\r\n\r\n// ========== Tool 级别 ==========\r\n\r\n/**\r\n * 工具上下文 - onToolUse 钩子的参数\r\n *\r\n * 提供工具调用时的完整上下文信息\r\n */\r\nexport interface ToolContext {\r\n /** 工具调用 */\r\n call: ToolCall;\r\n /** 工具定义 */\r\n tool: Tool;\r\n /** 当前步骤序号 */\r\n step: number;\r\n /** 用户输入 */\r\n input: string;\r\n /** 消息上下文(可读写) */\r\n context: Context;\r\n /** 获取其他 Feature */\r\n getFeature<T extends AgentFeature>(name: string): T | undefined;\r\n}\r\n\r\n/**\r\n * 工具结果 - onToolFinished 钩子的参数\r\n *\r\n * 提供工具执行后的完整结果信息\r\n */\r\nexport interface ToolResult {\r\n /** 是否成功 */\r\n success: boolean;\r\n /** 经过 ToolResultTransform 后、实际写入模型上下文的最终结果。 */\r\n delivered?: ToolExecResult;\r\n /** 返回数据 */\r\n data: unknown;\r\n /** 错误信息(如果失败) */\r\n error?: string;\r\n /** 执行耗时(ms) */\r\n duration: number;\r\n /** 工具调用 */\r\n call: ToolCall;\r\n /** 工具定义 */\r\n tool: Tool;\r\n /** 当前步骤序号 */\r\n step: number;\r\n /** 用户输入 */\r\n input: string;\r\n /** 消息上下文 */\r\n context: Context;\r\n /** 获取其他 Feature */\r\n getFeature<T extends AgentFeature>(name: string): T | undefined;\r\n}\r\n\r\n/**\r\n * 钩子返回值类型(扩展版)\r\n *\r\n * 统一的生命周期钩子控制流指令\r\n *\r\n * - { action: 'block' }: 阻止工具执行(工具级)\r\n * - { action: 'allow' }: 允许工具执行(工具级)\r\n * - undefined: 默认行为\r\n */\r\nexport type HookResult =\r\n | { action: 'block'; reason?: string }\r\n | { action: 'allow' }\r\n | undefined;\r\n\r\n// ========== SubAgent 级别 ==========\r\n\r\n/**\r\n * 子代理状态\r\n */\r\nexport type SubAgentStatus = 'idle' | 'busy' | 'completed' | 'failed' | 'terminated';\r\n\r\n/**\r\n * 子代理创建上下文\r\n */\r\nexport interface SubAgentSpawnContext {\r\n /** 子代理 ID */\r\n agentId: string;\r\n /** 子代理类型 */\r\n type: string;\r\n /** 初始指令 */\r\n instruction: string;\r\n /** 子代理实例 */\r\n agent: Agent;\r\n}\r\n\r\n/**\r\n * 子代理状态更新上下文\r\n */\r\nexport interface SubAgentUpdateContext {\r\n /** 子代理 ID */\r\n agentId: string;\r\n /** 子代理类型 */\r\n type: string;\r\n /** 旧状态 */\r\n oldStatus: SubAgentStatus;\r\n /** 新状态 */\r\n newStatus: SubAgentStatus;\r\n /** 执行结果(完成时) */\r\n result?: string;\r\n /** 错误信息(失败时) */\r\n error?: string;\r\n}\r\n\r\n/**\r\n * 子代理销毁上下文\r\n */\r\nexport interface SubAgentDestroyContext {\r\n /** 子代理 ID */\r\n agentId: string;\r\n /** 子代理类型 */\r\n type: string;\r\n /** 销毁原因 */\r\n reason: 'manual' | 'parent_dispose' | 'error';\r\n}\r\n\r\n/**\r\n * Agent 中断上下文\r\n */\r\nexport interface AgentInterruptContext {\r\n /** 中断原因 */\r\n reason: 'limit_reached' | 'error' | 'cancelled';\r\n /** 当前步骤序号 */\r\n step: number;\r\n /** 当前消息上下文 */\r\n context: Context;\r\n}\r\n\r\n/**\r\n * 子代理中断上下文\r\n */\r\nexport interface SubAgentInterruptContext {\r\n /** 子代理 ID */\r\n agentId: string;\r\n /** 子代理类型 */\r\n type: string;\r\n /** 中断原因 */\r\n reason: 'limit_reached' | 'error' | 'cancelled';\r\n /** 中断时的结果 */\r\n result: string;\r\n}\r\n\r\n// ========== 决策上下文类型(反向钩子专用)==========\r\n\r\n/**\r\n * Step 结束决策上下文(反向钩子)\r\n *\r\n * 用于在 Step 结束后进行流程控制决策\r\n */\r\nexport interface StepFinishDecisionContext extends StepFinishedContext {\r\n /** 是否有活跃的子代理(busy 状态) */\r\n hasActiveSubAgents?: boolean;\r\n\r\n /** 是否有待处理的子代理消息 */\r\n hasPendingMessages?: boolean;\r\n\r\n /** 是否调用了 wait 工具 */\r\n waitCalled?: boolean;\r\n}\r\n\r\n/**\r\n * 工具完成决策上下文(反向钩子)\r\n *\r\n * 用于在工具执行完成后进行流程控制决策\r\n */\r\nexport interface ToolFinishedDecisionContext extends ToolResult {\r\n /** 刚才执行的工具名称 */\r\n toolName: string;\r\n}\r\n\r\n/**\r\n * 工具结果变换上下文(反向钩子)\r\n *\r\n * 在工具执行完成、结果写入 context 之前,允许 Feature 对结果进行变换。\r\n * 典型用途:输出截断(OutputGuard)、脱敏、格式清理等。\r\n *\r\n * 钩子返回 undefined 表示不修改;返回 ToolExecResult 表示用新结果替换。\r\n * 多个钩子按注册顺序链式执行,前一个钩子的输出作为后一个钩子的输入。\r\n */\r\nexport interface ToolResultTransformContext {\r\n /** 工具名称 */\r\n toolName: string;\r\n /** 工具调用 */\r\n call: ToolCall;\r\n /** 当前结果(可能已被前一个变换钩子修改) */\r\n result: ToolExecResult;\r\n /** 当前步骤序号 */\r\n step: number;\r\n}\r\n","/**\n * 静态钩子声明(三原语)\n *\n * 工作项 A1:钩子 kind 由作者在类定义时静态声明,替代 lifecycle 硬编码推导。\n *\n * Feature 类通过静态属性声明反向钩子:\n *\n * ```typescript\n * class MyFeature implements AgentFeature {\n * name = 'my-feature';\n * static hooks: HookDeclarations = {\n * beforeTool: { lifecycle: CoreLifecycle.ToolUse, kind: 'guard', role: 'policy' },\n * onStepStart: { lifecycle: CoreLifecycle.StepStart, kind: 'observe' },\n * };\n * beforeTool(ctx: ToolContext) { return Decision.Continue; }\n * onStepStart(ctx: StepStartContext): void {}\n * }\n * ```\n *\n * 设计约束(战略文档 §4.A):\n * - 不使用 @ 装饰器:Claw 预制 agent 为纯 .js 无法消费装饰器;\n * 静态声明对 JS/TS 等价、零运行时依赖,且装配时静态可读。\n * - 这是装配预检(工作项 D)能查的东西:声明可在不实例化消费路径的情况下校验。\n */\n\nimport { CoreLifecycle, type DecisionResult } from './lifecycle.js';\nimport type {\n AgentInitiateContext,\n AgentDestroyContext,\n CallStartContext,\n CallFinishContext,\n StepStartContext,\n ToolContext,\n ToolFinishedDecisionContext,\n StepFinishDecisionContext,\n ToolResultTransformContext,\n} from './lifecycle.js';\nimport type { AgentFeature } from './feature.js';\nimport type { ToolExecResult } from './context.js';\n\n// ========== 类型定义 ==========\n\n/** 三原语:观察 / 拦截 / 改写 */\nexport type HookKind = 'observe' | 'guard' | 'transform';\n\n/** guard 钩子角色:policy(策略方,先执行)| advisor(顾问方,后执行) */\nexport type GuardRole = 'policy' | 'advisor';\n\n/** 单个钩子的静态声明 */\nexport interface HookDeclaration {\n /** 挂载的生命周期 */\n lifecycle: CoreLifecycle;\n /** 原语类型 */\n kind: HookKind;\n /**\n * guard 角色,仅 kind === 'guard' 时合法。\n * 未声明时默认 'advisor'。一次装配中 policy 至多一个。\n */\n role?: GuardRole;\n}\n\n/** 方法名 → 声明 */\nexport type HookDeclarations = Record<string, HookDeclaration>;\n\n/** 结构化校验问题(供装配预检与运行时注册共用,不乱命名) */\nexport type HookDeclarationIssueCode =\n | 'method_missing'\n | 'method_not_function'\n | 'invalid_kind'\n | 'invalid_lifecycle'\n | 'invalid_kind_lifecycle'\n | 'role_on_non_guard'\n | 'duplicate_policy'\n | 'invalid_hooks_shape';\n\nexport interface HookDeclarationIssue {\n feature: string;\n method: string;\n code: HookDeclarationIssueCode;\n /** 含修复建议的完整描述 */\n message: string;\n /** 跨 feature 检查(如 duplicate_policy)涉及的全部 feature 名 */\n involvedFeatures?: string[];\n}\n\n// ========== kind 与 lifecycle 的合法组合 ==========\n//\n// guard 只出现在有流程控制能力的生命周期(ToolUse / StepFinish);\n// transform 只出现在 ToolResultTransform;\n// observe 可挂在任意生命周期。\n\nconst GUARD_LIFECYCLES = new Set<CoreLifecycle>([\n CoreLifecycle.ToolUse,\n CoreLifecycle.StepFinish,\n]);\n\nconst TRANSFORM_LIFECYCLES = new Set<CoreLifecycle>([\n CoreLifecycle.ToolResultTransform,\n]);\n\nconst VALID_KINDS = new Set<HookKind>(['observe', 'guard', 'transform']);\nconst VALID_ROLES = new Set<GuardRole>(['policy', 'advisor']);\n\n// ========== 读取 ==========\n\n/**\n * 读取 Feature 的静态钩子声明(含默认值补齐)。\n *\n * 无声明的 Feature 返回空对象(走装饰器回退路径,由 HooksRegistry 处理)。\n */\nexport function readHookDeclarations(feature: AgentFeature): HookDeclarations {\n const raw = (feature.constructor as any)?.hooks;\n if (!raw || typeof raw !== 'object') return {};\n\n const result: HookDeclarations = {};\n for (const [method, decl] of Object.entries(raw as Record<string, HookDeclaration>)) {\n if (!decl || typeof decl !== 'object') continue;\n result[method] = {\n lifecycle: decl.lifecycle,\n kind: decl.kind,\n // guard 未声明 role 时默认 advisor;\n // 非 guard 上的 role 原样保留(哪怕非法)——校验器需要看到它才能报告 role_on_non_guard\n role: decl.kind === 'guard' ? (decl.role ?? 'advisor') : decl.role,\n };\n }\n return result;\n}\n\n// ========== 校验 ==========\n\n/**\n * 校验单个 Feature 的静态声明。\n *\n * 返回问题列表;空数组 = 通过。\n * 每个问题都是结构化的(feature/method/code),供装配预检直接消费。\n */\nexport function validateHookDeclarations(feature: AgentFeature): HookDeclarationIssue[] {\n // 形状快检:static hooks 必须是「方法名 → 声明」的对象映射。\n // 数组会被 Object.entries 当作 {'0': ...} 遍历,产生误导性的 method_missing\n // (指向索引而非真实方法名),这里直接给出形状级错误。\n const raw = (feature.constructor as any)?.hooks;\n if (Array.isArray(raw)) {\n return [{\n feature: feature.name,\n method: '(static hooks)',\n code: 'invalid_hooks_shape',\n message: `Feature '${feature.name}' 的 static hooks 是数组,但合法形状是对象映射(键=方法名,条目={lifecycle, kind, role?})。修复示例:static hooks = { onCallStart: { lifecycle: 'CallStart', kind: 'observe' } };纯工具型 Feature 写 static hooks = {} 或直接省略。`,\n }];\n }\n\n const declarations = readHookDeclarations(feature);\n if (Object.keys(declarations).length === 0) return [];\n\n const issues: HookDeclarationIssue[] = [];\n const featureName = feature.name;\n\n for (const [method, decl] of Object.entries(declarations)) {\n // 方法存在性与类型\n const value = (feature as any)[method];\n if (value === undefined) {\n issues.push({\n feature: featureName,\n method,\n code: 'method_missing',\n message: `Feature '${featureName}' 的钩子声明 '${method}' 指向的方法不存在。修复:在类中实现该方法,或从 static hooks 中删除该声明。`,\n });\n continue;\n }\n if (typeof value !== 'function') {\n issues.push({\n feature: featureName,\n method,\n code: 'method_not_function',\n message: `Feature '${featureName}' 的钩子声明 '${method}' 指向的成员不是函数(实际为 ${typeof value})。修复:将该成员改为方法。`,\n });\n continue;\n }\n\n // kind 合法性\n if (!VALID_KINDS.has(decl.kind)) {\n issues.push({\n feature: featureName,\n method,\n code: 'invalid_kind',\n message: `Feature '${featureName}' 的钩子 '${method}' 声明了非法 kind '${String(decl.kind)}'。修复:kind 只能是 'observe' | 'guard' | 'transform'。`,\n });\n continue;\n }\n\n // lifecycle 合法性\n if (!Object.values(CoreLifecycle).includes(decl.lifecycle)) {\n issues.push({\n feature: featureName,\n method,\n code: 'invalid_lifecycle',\n message: `Feature '${featureName}' 的钩子 '${method}' 声明了非法 lifecycle '${String(decl.lifecycle)}'。修复:使用 CoreLifecycle 枚举值。`,\n });\n continue;\n }\n\n // role 只允许出现在 guard 上\n if (decl.role !== undefined && decl.kind !== 'guard') {\n issues.push({\n feature: featureName,\n method,\n code: 'role_on_non_guard',\n message: `Feature '${featureName}' 的钩子 '${method}'(kind='${decl.kind}')声明了 role '${decl.role}'。修复:role 仅对 kind='guard' 合法,请删除 role 字段。`,\n });\n }\n\n // guard role 值合法性(默认补齐后 guard 一定有 role)\n if (decl.kind === 'guard' && decl.role !== undefined && !VALID_ROLES.has(decl.role)) {\n issues.push({\n feature: featureName,\n method,\n code: 'invalid_kind',\n message: `Feature '${featureName}' 的 guard 钩子 '${method}' 声明了非法 role '${String(decl.role)}'。修复:role 只能是 'policy' | 'advisor'。`,\n });\n }\n\n // kind 与 lifecycle 的合法组合\n const lifecycleValid =\n decl.kind === 'guard'\n ? GUARD_LIFECYCLES.has(decl.lifecycle)\n : decl.kind === 'transform'\n ? TRANSFORM_LIFECYCLES.has(decl.lifecycle)\n : true; // observe 任意 lifecycle\n if (!lifecycleValid) {\n const expected =\n decl.kind === 'guard'\n ? 'ToolUse / StepFinish'\n : 'ToolResultTransform';\n issues.push({\n feature: featureName,\n method,\n code: 'invalid_kind_lifecycle',\n message: `Feature '${featureName}' 的钩子 '${method}':kind='${decl.kind}' 不能挂在 lifecycle '${decl.lifecycle}' 上(合法值:${expected})。修复:更换 kind 或 lifecycle 使组合合法。`,\n });\n }\n }\n\n return issues;\n}\n\n/**\n * 装配级校验:一次装配中每个 lifecycle 的 policy 至多一个。\n *\n * 两个 policy 意味着策略裁决权分裂——这是装配错误,\n * 必须在装配时报出(报名报错),不许运行时碰运气。\n */\nexport function validatePolicyUniqueness(features: AgentFeature[]): HookDeclarationIssue[] {\n const issues: HookDeclarationIssue[] = [];\n\n // lifecycle → policy 声明列表\n const policiesByLifecycle = new Map<CoreLifecycle, Array<{ feature: string; method: string }>>();\n\n for (const feature of features) {\n const declarations = readHookDeclarations(feature);\n for (const [method, decl] of Object.entries(declarations)) {\n if (decl.kind !== 'guard' || decl.role !== 'policy') continue;\n if (!GUARD_LIFECYCLES.has(decl.lifecycle)) continue; // 组合非法由单 feature 校验报告\n const list = policiesByLifecycle.get(decl.lifecycle) ?? [];\n list.push({ feature: feature.name, method });\n policiesByLifecycle.set(decl.lifecycle, list);\n }\n }\n\n for (const [lifecycle, list] of policiesByLifecycle) {\n if (list.length <= 1) continue;\n const names = list.map(p => `'${p.feature}#${p.method}'`).join('、');\n issues.push({\n feature: list[0].feature,\n method: list[0].method,\n code: 'duplicate_policy',\n message: `lifecycle '${lifecycle}' 上出现了 ${list.length} 个 policy guard:${names}。一次装配中每个 lifecycle 至多一个 policy。修复:保留一个 policy,其余改为 role: 'advisor'(advisor 在 policy 之后执行,不具裁决优先权)。`,\n involvedFeatures: list.map(p => p.feature),\n });\n }\n\n return issues;\n}\n\n/**\n * 将问题列表转成单一 Error(运行时注册路径使用)。\n */\nexport function issuesToError(issues: HookDeclarationIssue[]): Error {\n const lines = issues.map(i => `[${i.code}] ${i.message}`);\n return new Error(`钩子声明校验失败(${issues.length} 个问题):\\n${lines.join('\\n')}`);\n}\n\n// ========== 钩子方法类型别名 ==========\n\n/**\n * 反向钩子方法类型(供声明方法的签名标注使用)\n */\ntype HookMethod<TContext, TReturn> = (ctx: TContext) => TReturn;\n\nexport type AgentInitiateHook = HookMethod<AgentInitiateContext, void | Promise<void>>;\nexport type AgentDestroyHook = HookMethod<AgentDestroyContext, void | Promise<void>>;\nexport type CallStartHook = HookMethod<CallStartContext, void | Promise<void>>;\nexport type CallFinishHook = HookMethod<CallFinishContext, void | Promise<void>>;\nexport type StepStartHook = HookMethod<StepStartContext, void | Promise<void>>;\nexport type StepFinishHook = HookMethod<StepFinishDecisionContext, DecisionResult | Promise<DecisionResult>>;\nexport type ToolUseHook = HookMethod<ToolContext, DecisionResult | Promise<DecisionResult>>;\nexport type ToolFinishedHook = HookMethod<ToolFinishedDecisionContext, void | Promise<void>>;\nexport type ToolResultTransformHook = HookMethod<\n ToolResultTransformContext,\n ToolExecResult | undefined | Promise<ToolExecResult | undefined>\n>;\n","/**\n * Feature 依赖拓扑排序(工作项 A3)\n *\n * Feature 类通过静态属性声明依赖:\n *\n * ```typescript\n * class RouterFeature implements AgentFeature {\n * name = 'router';\n * static inject = ['storage', 'auth'];\n * }\n * ```\n *\n * 装配时(ensureFeatureTools 前)解析依赖图:\n * - 拓扑排序决定初始化顺序(依赖先于依赖方)\n * - 缺失依赖 / 循环依赖 = 启动错误,带修复建议与环路径\n * - 无声明时保持装配顺序(use() 插入序)\n *\n * 静态可读是关键:声明挂在 constructor 上,装配预检(工作项 D)\n * 无需运行 feature 代码即可校验依赖完整性——这是与\n * 运行时软失败 locator(getFeature 延迟爆炸)的本质区别。\n */\n\nimport type { AgentFeature } from './feature.js';\n\n/** 结构化装配错误(供启动报错与装配预检共用) */\nexport type FeatureOrderErrorCode =\n | 'missing_dependency'\n | 'circular_dependency'\n | 'duplicate_feature_name';\n\nexport interface FeatureOrderError {\n code: FeatureOrderErrorCode;\n message: string;\n}\n\nexport interface FeatureOrderResult {\n /** 拓扑排序后的初始化顺序。有错误时为空数组。 */\n order: AgentFeature[];\n errors: FeatureOrderError[];\n}\n\n/**\n * 读取 Feature 的静态 inject 声明。\n *\n * 无声明返回空数组(该 feature 无依赖约束)。\n */\nexport function readInjectDeclarations(feature: AgentFeature): string[] {\n const raw = (feature.constructor as any)?.inject;\n if (!Array.isArray(raw)) return [];\n return raw.filter((d): d is string => typeof d === 'string' && d.length > 0);\n}\n\n/**\n * 解析 feature 列表的初始化顺序(拓扑排序)。\n *\n * 稳定性:同层(互不依赖)feature 保持装配顺序。\n * 任何错误发生时不输出部分顺序(order 为空),由调用方决定报错方式。\n */\nexport function resolveFeatureOrder(features: AgentFeature[]): FeatureOrderResult {\n const errors: FeatureOrderError[] = [];\n\n // 重名校验:名字是依赖图的节点键,重名意味着图本身不成立\n const byName = new Map<string, AgentFeature>();\n for (const feature of features) {\n if (byName.has(feature.name)) {\n errors.push({\n code: 'duplicate_feature_name',\n message: `装配中出现了两个名为 '${feature.name}' 的 Feature。修复:Feature name 是依赖图与工具来源的键,必须唯一。`,\n });\n }\n byName.set(feature.name, feature);\n }\n if (errors.length > 0) {\n return { order: [], errors };\n }\n\n // 建图:name → 依赖列表(只含装配内存在的依赖;缺失的单独报错)\n const graph = new Map<string, string[]>();\n for (const feature of features) {\n const inject = readInjectDeclarations(feature);\n const valid: string[] = [];\n for (const dep of inject) {\n if (!byName.has(dep)) {\n errors.push({\n code: 'missing_dependency',\n message: `Feature '${feature.name}' 声明了 static inject = [..., '${dep}', ...],但装配中不存在名为 '${dep}' 的 Feature。修复:先 use() 该依赖,或从 static inject 中移除 '${dep}'。`,\n });\n continue;\n }\n valid.push(dep);\n }\n graph.set(feature.name, valid);\n }\n if (errors.length > 0) {\n return { order: [], errors };\n }\n\n // 循环依赖检测(DFS 三色标记,输出环路径)\n const cycleError = detectCycle(features.map(f => f.name), graph);\n if (cycleError) {\n return { order: [], errors: [cycleError] };\n }\n\n // DFS 后序展开(装配序驱动):\n // 按装配顺序访问每个 feature,未就绪的依赖先递归展开。\n // 结果语义 = 最小移动:只把依赖提前到首个依赖方之前,其余相对序完全保持——\n // 装配序是作者显式意图(工具注册序、observe 日志序),拓扑排序只做必要调整。\n const ordered: string[] = [];\n const visited = new Set<string>();\n const visit = (name: string): void => {\n if (visited.has(name)) return;\n visited.add(name);\n for (const dep of graph.get(name) ?? []) {\n visit(dep);\n }\n ordered.push(name);\n };\n for (const feature of features) {\n visit(feature.name);\n }\n\n return { order: ordered.map(name => byName.get(name)!), errors: [] };\n}\n\n/**\n * DFS 三色标记环检测。\n *\n * 返回带环路径的错误(如 \"a → b → c → a\"),未发现环返回 undefined。\n */\nfunction detectCycle(names: string[], graph: Map<string, string[]>): FeatureOrderError | undefined {\n const WHITE = 0;\n const GRAY = 1;\n const BLACK = 2;\n\n const color = new Map<string, number>(names.map(n => [n, WHITE]));\n const path: string[] = [];\n\n function dfs(node: string): string[] | undefined {\n color.set(node, GRAY);\n path.push(node);\n\n for (const dep of graph.get(node) ?? []) {\n if (color.get(dep) === GRAY) {\n // 从 path 中 dep 第一次出现处截取,得到完整环\n const start = path.indexOf(dep);\n return [...path.slice(start), dep];\n }\n if (color.get(dep) === WHITE) {\n const cycle = dfs(dep);\n if (cycle) return cycle;\n }\n }\n\n path.pop();\n color.set(node, BLACK);\n return undefined;\n }\n\n for (const name of names) {\n if (color.get(name) !== WHITE) continue;\n const cycle = dfs(name);\n if (cycle) {\n return {\n code: 'circular_dependency',\n message: `Feature 依赖成环:${cycle.join(' → ')}。修复:环上的某个 static inject 声明有误,请检查依赖方向;跨 feature 的循环协作应改用运行时 getFeature 软查找。`,\n };\n }\n }\n return undefined;\n}\n\n/**\n * 将装配错误转成单一 Error(启动路径使用)。\n */\nexport function orderErrorsToError(errors: FeatureOrderError[]): Error {\n const lines = errors.map(e => `[${e.code}] ${e.message}`);\n return new Error(`Feature 装配校验失败(${errors.length} 个问题):\\n${lines.join('\\n')}`);\n}\n","/**\n * 装配预检(工作项 D):四查 + 修复建议 + dry-run\n *\n * 战略文档 §4.D:dsh 要 mount 时才报的错,ADV 在装配编辑时就亮红。\n * preflightAssembly 不实例化副作用、不挂载、不注册——纯静态读取声明与清单,\n * 供装配 UI(编辑时亮红)与 feature-creator(挂载前自检)消费。\n *\n * 四查:\n * 1. inject-graph 依赖完整性(缺失/成环),复用 resolveFeatureOrder\n * 2. policy-uniqueness 同一 lifecycle 上的 policy guard 唯一性\n * 3. tool-name-conflict 工具重名(warning:覆盖是既有语义,可能有意)\n * 4. manifest getFeatureManifest() 结构合法性(error:破坏配置面板)\n *\n * dry-run:合法装配返回拓扑序 + 工具归属 + 钩子清单(kind/role)。\n * 存在 error 时不返回 assembly(装配必然不成立)。\n */\n\nimport { resolveFeatureOrder } from './feature-graph.js';\nimport { readHookDeclarations, validatePolicyUniqueness } from './hook-declarations.js';\nimport type { AgentFeature } from './feature.js';\nimport { CoreLifecycle } from './lifecycle.js';\n\nexport type PreflightCheck =\n | 'inject-graph'\n | 'policy-uniqueness'\n | 'tool-name-conflict'\n | 'manifest';\n\nexport interface PreflightIssue {\n severity: 'error' | 'warning';\n check: PreflightCheck;\n /** 问题说明 + 修复建议(一句话可执行) */\n message: string;\n /** 涉及的 feature 名 */\n features: string[];\n}\n\nexport interface PreflightAssembly {\n /** 拓扑排序后的装配序(依赖先于依赖方) */\n order: string[];\n /** 工具清单:装配后将存在的工具及其来源 feature */\n tools: { name: string; feature: string }[];\n /** 钩子清单:声明将被收集的钩子(按 lifecycle 排序,组内按装配序) */\n hooks: {\n lifecycle: string;\n feature: string;\n methodName: string;\n kind: string;\n role?: string;\n }[];\n}\n\nexport interface PreflightResult {\n /** 无 error 级 issue */\n ok: boolean;\n issues: PreflightIssue[];\n /** dry-run 清单;存在 error 时为 null */\n assembly: PreflightAssembly | null;\n}\n\n/** manifest properties 支持的 type 枚举(与 FeatureManifestSettingProperty 类型对齐) */\nconst MANIFEST_PROPERTY_TYPES = new Set([\n 'string', 'number', 'boolean', 'select', 'file', 'directory', 'group',\n] as const);\n\nexport function preflightAssembly(features: AgentFeature[]): PreflightResult {\n const issues: PreflightIssue[] = [];\n\n // ── 查 1:inject 依赖完整性(缺失/成环),复用拓扑排序的诊断 ──\n const orderResult = resolveFeatureOrder(features);\n for (const err of orderResult.errors) {\n issues.push({\n severity: 'error',\n check: 'inject-graph',\n message: err.message,\n features: featureNamesFromMessage(features, err.message),\n });\n }\n\n // ── 查 2:policy guard 唯一性(复用 validatePolicyUniqueness,跨 feature 聚合) ──\n for (const issue of validatePolicyUniqueness(features)) {\n issues.push({\n severity: 'error',\n check: 'policy-uniqueness',\n message: issue.message,\n features: issue.involvedFeatures ?? [issue.feature],\n });\n }\n\n // ── 查 3:工具重名(warning:后注册覆盖是既有语义,可能有意) ──\n const toolOwners = new Map<string, string[]>();\n for (const feature of features) {\n for (const tool of feature.getTools?.() ?? []) {\n const owners = toolOwners.get(tool.name) ?? [];\n owners.push(feature.name);\n toolOwners.set(tool.name, owners);\n }\n }\n for (const [toolName, owners] of toolOwners) {\n if (owners.length > 1) {\n issues.push({\n severity: 'warning',\n check: 'tool-name-conflict',\n message:\n `工具 '${toolName}' 被 ${owners.length} 个 feature 重复提供(${owners.join(', ')})。` +\n '装配后后注册者生效(先注册者进入 superseded)。若非有意覆盖,请重命名其中之一。',\n features: owners,\n });\n }\n }\n\n // ── 查 4:manifest 结构合法性 ──\n for (const feature of features) {\n if (typeof (feature as any).getFeatureManifest !== 'function') continue;\n let manifest: unknown;\n try {\n manifest = (feature as any).getFeatureManifest();\n } catch (error) {\n issues.push({\n severity: 'error',\n check: 'manifest',\n message: `feature '${feature.name}' 的 getFeatureManifest() 抛出异常:${error instanceof Error ? error.message : String(error)}。修复:确保 getter 纯返回,无副作用。`,\n features: [feature.name],\n });\n continue;\n }\n issues.push(...validateManifest(feature.name, manifest));\n }\n\n const ok = !issues.some(i => i.severity === 'error');\n const assembly = ok ? buildAssembly(orderResult.order) : null;\n return { ok, issues, assembly };\n}\n\n/** 从 inject-graph 错误消息中提取涉及的 feature 名(消息由 feature-graph 生成,含全部名称) */\nfunction featureNamesFromMessage(features: AgentFeature[], message: string): string[] {\n return features.map(f => f.name).filter(name => message.includes(name));\n}\n\nfunction validateManifest(featureName: string, manifest: unknown): PreflightIssue[] {\n const issues: PreflightIssue[] = [];\n const settings = (manifest as any)?.settings;\n const properties = settings?.properties;\n\n if (!properties || typeof properties !== 'object') return issues;\n\n issues.push(...validateManifestProperties(featureName, '', properties));\n\n // sections 引用完整性\n const sections = settings?.sections;\n if (Array.isArray(sections)) {\n for (const section of sections) {\n for (const key of section?.properties ?? []) {\n if (!(key in properties)) {\n issues.push({\n severity: 'error',\n check: 'manifest',\n message: `feature '${featureName}' manifest section '${section?.id}' 引用了不存在的属性 '${key}'。修复:在 settings.properties 中补充定义,或从 section 中移除。`,\n features: [featureName],\n });\n }\n }\n }\n }\n\n return issues;\n}\n\n/** 属性结构校验(group 递归其嵌套 properties) */\nfunction validateManifestProperties(\n featureName: string,\n prefix: string,\n properties: Record<string, any>,\n): PreflightIssue[] {\n const issues: PreflightIssue[] = [];\n for (const [key, def] of Object.entries(properties)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (!def || typeof def !== 'object') {\n issues.push({\n severity: 'error',\n check: 'manifest',\n message: `feature '${featureName}' manifest 属性 '${path}' 的定义不是对象。修复:提供 { type, title, ... } 形态。`,\n features: [featureName],\n });\n continue;\n }\n if (typeof def.type !== 'string' || !MANIFEST_PROPERTY_TYPES.has(def.type)) {\n issues.push({\n severity: 'error',\n check: 'manifest',\n message: `feature '${featureName}' manifest 属性 '${path}' 的 type '${def.type}' 不在支持枚举内(${[...MANIFEST_PROPERTY_TYPES].join('/')})。修复:改用受支持的 type。`,\n features: [featureName],\n });\n }\n if (def.type === 'group' && def.properties && typeof def.properties === 'object') {\n issues.push(...validateManifestProperties(featureName, path, def.properties));\n }\n }\n return issues;\n}\n\nfunction buildAssembly(orderedFeatures: AgentFeature[]): PreflightAssembly {\n const order = orderedFeatures.map(f => f.name);\n\n const tools: PreflightAssembly['tools'] = [];\n for (const feature of orderedFeatures) {\n for (const tool of feature.getTools?.() ?? []) {\n tools.push({ name: tool.name, feature: feature.name });\n }\n }\n\n const hooks: PreflightAssembly['hooks'] = [];\n for (const feature of orderedFeatures) {\n const declarations = readHookDeclarations(feature);\n for (const [method, decl] of Object.entries(declarations)) {\n hooks.push({\n lifecycle: decl.lifecycle,\n feature: feature.name,\n methodName: method,\n kind: decl.kind,\n role: decl.role,\n });\n }\n }\n // 按 lifecycle 排序(面板按生命周期分组展示),组内保持装配序(稳定排序)\n const lifecycleOrder = Object.values(CoreLifecycle);\n hooks.sort((a, b) => {\n const ia = lifecycleOrder.indexOf(a.lifecycle as CoreLifecycle);\n const ib = lifecycleOrder.indexOf(b.lifecycle as CoreLifecycle);\n return (ia === -1 ? 999 : ia) - (ib === -1 ? 999 : ib);\n });\n\n return { order, tools, hooks };\n}\n","/**\n * Capability System - 统一能力控制面(P1:command)\n *\n * Feature 通过 getCapabilities() 声明可被显式调用的命令,注册表提供\n * 平面寻址(`featureName.commandName`)与三动词中的 invoke 语义。\n *\n * 设计裁决(详见 AgentDevClaw docs/adr capability-registry-as-control-plane):\n * - 命令式优先:只有 invoke / query / emit,不存在 bind / reactive / watch。\n * 共享权威状态与跨 feature 事务是负面清单,不做。\n * - entryPoints 是契约约束而非安全边界:声明不含请求入口的 command 被\n * invoke 时返回 entry_point_denied(结构化错误,非静默失败)。绕过\n * 路径(getFeature 直引)依旧存在,这是已知边界而非漏洞。\n * - 进程内语义:args 是普通 JS 值,不为序列化设计。跨进程投递是宿主层\n * 职责,注册表不为其建模。\n * - 注册表是哑的:不做参数校验(schema 服务于消费端渲染表单)、不含\n * 派发策略、不管依赖管理。\n * - 命令超时即失败:超时返回 timeout,但执行体可能仍在进行(Promise\n * 无法取消),不保证中断,只保证调用方不挂死。\n */\n\nimport type { AgentFeature, FeatureManifestSettingProperty } from './feature.js';\nimport type { Logger } from './logging.js';\n\n/**\n * 能力入口类型\n *\n * - 'slash':出现在用户命令菜单(宿主下发清单时过滤)\n * - 'feature':可被其他 feature(或经宿主转发的等价调用)invoke\n */\nexport type CapabilityEntryPoint = 'slash' | 'feature';\n\n/**\n * 命令类型。框架层仅定义形状并透传——两种 kind 在框架眼里同质\n * (收到 invoke 一律执行 execute);行为差异(表单/pill/toast/触发\n * 时机)由应用层(宿主前端)按 kind 消费。\n *\n * - invoke(缺省):选中即执行的触发型命令(配置开关等)\n * - prompt:调用指令以文本形式嵌入输入的命令(skill 等),\n * 应用层负责其呈现与发送时机,feature 在自身生命周期内消费\n */\nexport type CapabilityKind = 'invoke' | 'prompt';\n\n/**\n * Feature 声明的可调用命令\n */\nexport interface CapabilityDefinition {\n /** 命令名(标识符),注册表内以 `featureName.commandName` 寻址 */\n name: string;\n /** 命令类型,缺省 'invoke'。框架透传不解释,语义由应用层消费 */\n kind?: CapabilityKind;\n /** 菜单显示标题,缺省用 name */\n title?: string;\n /** 菜单描述 */\n description?: string;\n /**\n * 参数 schema,复用 FeatureManifestSettingProperty 词汇表,\n * 与 feature-setup 配置表单、flow 交互选项共用一套渲染基底。\n */\n parameters?: Record<string, FeatureManifestSettingProperty>;\n /**\n * 可见入口,缺省 ['feature'](最小暴露)。\n * 进 slash 菜单必须是显式主动行为。\n */\n entryPoints?: CapabilityEntryPoint[];\n /**\n * 参数当前生效值(配置回显):参数表单打开时优先于 parameters 的\n * default 显示。返回普通对象,键与 parameters 对齐;缺省或抛错\n * 时表单回退 default。读取必须无副作用。\n */\n readCurrentValues?: () => Record<string, unknown>;\n /** 执行体。抛出的任何错误归一为 execute_failed */\n execute(args: Record<string, unknown>, ctx: CapabilityContext): Promise<unknown>;\n}\n\n/**\n * 命令执行上下文(进程内)\n */\nexport interface CapabilityContext {\n agentId: string;\n getFeature<T extends AgentFeature>(name: string): T | undefined;\n logger: Logger;\n}\n\n/**\n * invoke 的结构化结果。错误码是稳定契约:\n * - not_found:ref 未注册\n * - entry_point_denied:该入口不在 entryPoints 中\n * - execute_failed:执行体抛错\n * - timeout:超过时限(执行体不保证被取消)\n */\nexport type CapabilityInvokeResult =\n | { ok: true; result: unknown }\n | { ok: false; code: 'not_found' | 'entry_point_denied' | 'execute_failed' | 'timeout'; message: string };\n\n/**\n * 清单快照条目(下发宿主 / 前端菜单消费的数据形态,纯数据)\n */\nexport interface CapabilitySnapshot {\n feature: string;\n name: string;\n ref: string;\n /** 命令类型(缺省 'invoke'),透传给应用层消费 */\n kind: CapabilityKind;\n title: string;\n description?: string;\n parameters?: Record<string, FeatureManifestSettingProperty>;\n entryPoints: CapabilityEntryPoint[];\n /** 参数当前生效值(readCurrentValues 收集;读取失败时缺省) */\n currentValues?: Record<string, unknown>;\n}\n\nconst NAME_PATTERN = /^[a-zA-Z][\\w-]*$/;\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction normalizeEntryPoints(entryPoints?: CapabilityEntryPoint[]): CapabilityEntryPoint[] {\n return entryPoints && entryPoints.length > 0 ? entryPoints : ['feature'];\n}\n\n/**\n * 能力注册表(per-Agent 实例)\n */\nexport class CapabilityRegistry {\n private defs = new Map<string, { feature: string; def: CapabilityDefinition }>();\n\n /**\n * 注册 feature 的命令。ref(`feature.name`)重复视为装配错误,直接抛出,\n * 对齐 feature-graph 的报错哲学。\n */\n register(featureName: string, def: CapabilityDefinition): void {\n if (!NAME_PATTERN.test(def.name)) {\n throw new Error(`[capability] invalid command name \"${def.name}\" (must match ${NAME_PATTERN})`);\n }\n if (NAME_PATTERN.test(featureName) === false) {\n throw new Error(`[capability] invalid feature name \"${featureName}\"`);\n }\n const ref = `${featureName}.${def.name}`;\n if (this.defs.has(ref)) {\n throw new Error(`[capability] duplicate capability ref \"${ref}\"`);\n }\n this.defs.set(ref, { feature: featureName, def });\n }\n\n has(ref: string): boolean {\n return this.defs.has(ref);\n }\n\n /** ref → 所属 feature 名(dispatchTurnActivations 按 owner 分组派发用) */\n ownerOf(ref: string): string | null {\n return this.defs.get(ref)?.feature ?? null;\n }\n\n /** ref → 命令类型(缺省 'invoke');未注册返回 null */\n kindOf(ref: string): CapabilityKind | null {\n const entry = this.defs.get(ref);\n return entry ? (entry.def.kind ?? 'invoke') : null;\n }\n\n /**\n * 移除指定 feature 的全部命令(幂等)。\n * initSingleFeature 重挂路径先调它,避免热载时误报 duplicate ref。\n */\n unregisterFeature(featureName: string): void {\n for (const [ref, entry] of this.defs) {\n if (entry.feature === featureName) this.defs.delete(ref);\n }\n }\n\n /**\n * 清单快照。传入 entryPoint 时过滤出该入口可见的命令\n * (宿主下发 slash 菜单清单时用 { entryPoint: 'slash' })。\n */\n list(filter?: { entryPoint?: CapabilityEntryPoint }): CapabilitySnapshot[] {\n const snapshots: CapabilitySnapshot[] = [];\n for (const { feature, def } of this.defs.values()) {\n const entryPoints = normalizeEntryPoints(def.entryPoints);\n if (filter?.entryPoint && !entryPoints.includes(filter.entryPoint)) continue;\n let currentValues: Record<string, unknown> | undefined;\n if (typeof def.readCurrentValues === 'function') {\n try {\n const values = def.readCurrentValues();\n if (values && typeof values === 'object') currentValues = values;\n } catch {\n // 回显失败不影响清单下发,表单回退 default\n }\n }\n snapshots.push({\n feature,\n name: def.name,\n ref: `${feature}.${def.name}`,\n kind: def.kind ?? 'invoke',\n title: def.title ?? def.name,\n description: def.description,\n parameters: def.parameters,\n entryPoints,\n currentValues,\n });\n }\n return snapshots;\n }\n\n /**\n * 调用命令。entryPoint 必填——调用方声明自己以哪个入口进来,\n * 注册表据此执行 entryPoints 契约检查。\n */\n async invoke(\n ref: string,\n opts: { args?: Record<string, unknown>; entryPoint: CapabilityEntryPoint; timeoutMs?: number },\n ctx: CapabilityContext,\n ): Promise<CapabilityInvokeResult> {\n const entry = this.defs.get(ref);\n if (!entry) {\n return { ok: false, code: 'not_found', message: `capability \"${ref}\" is not registered` };\n }\n const entryPoints = normalizeEntryPoints(entry.def.entryPoints);\n if (!entryPoints.includes(opts.entryPoint)) {\n return {\n ok: false,\n code: 'entry_point_denied',\n message: `capability \"${ref}\" does not accept entry point \"${opts.entryPoint}\" (declared: [${entryPoints.join(', ')}])`,\n };\n }\n const args = opts.args ?? {};\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const result = await Promise.race([\n entry.def.execute(args, ctx),\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error('__capability_timeout__')), timeoutMs);\n }),\n ]);\n return { ok: true, result };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message === '__capability_timeout__') {\n return { ok: false, code: 'timeout', message: `capability \"${ref}\" timed out after ${timeoutMs}ms` };\n }\n return { ok: false, code: 'execute_failed', message };\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n }\n}\n","import { copyFile, mkdir, readFile, readdir, rename, rm, unlink, writeFile } from 'fs/promises';\r\nimport { resolve } from 'path';\r\nimport { cwd } from 'process';\r\nimport type { ContextSnapshot, ContextBoundaryV2 } from './context.js';\r\nimport type { FeatureCheckpoint } from './checkpoint.js';\r\nimport type { UsageStatsSnapshot } from './usage.js';\r\n\r\nexport interface AgentRuntimeSnapshot {\r\n initialized: boolean;\r\n callIndex: number;\r\n context?: ContextSnapshot;\r\n featureStates: FeatureCheckpoint[];\r\n usageStats?: UsageStatsSnapshot;\r\n /** 最近一次已结束 Call 的结构化终态。旧会话缺省为 undefined。 */\r\n lastCallOutcome?: import('./lifecycle.js').CallOutcome;\r\n}\r\n\r\n/**\r\n * Runtime 状态(不含 Context),用于增量 checkpoint。\r\n *\r\n * rollback 截断 Context 后,需要恢复 Feature / usage / callIndex 等\r\n * 非消息运行态。这些字段不能从消息长度推导,必须完整保存。\r\n */\r\nexport interface RuntimeStateWithoutContext {\r\n initialized: boolean;\r\n callIndex: number;\r\n featureStates: FeatureCheckpoint[];\r\n usageStats?: UsageStatsSnapshot;\r\n lastCallOutcome?: import('./lifecycle.js').CallOutcome;\r\n}\r\n\r\n/**\r\n * v1 call rollback snapshot — 完整 runtime 深拷贝。\r\n *\r\n * 保留用于向后兼容:老会话文件中的 checkpoint 都是这种格式,\r\n * 以及 v2 迁移时无法安全转换为 boundary 的 checkpoint。\r\n */\r\nexport interface LegacyCallRollbackSnapshot {\r\n kind: 'legacy-full-snapshot';\r\n callIndex: number;\r\n draftInput: string;\r\n runtime: AgentRuntimeSnapshot;\r\n legacyReason?: string;\r\n}\r\n\r\n/**\r\n * v2 增量 call rollback snapshot — 只存边界 + 运行态。\r\n *\r\n * 不再嵌入完整 Context 深拷贝,而是记录两个数组的长度边界。\r\n * rollback 时通过 truncateToBoundary() 按长度截断当前 Context。\r\n */\r\nexport interface IncrementalCallRollbackSnapshot {\r\n kind: 'context-boundary';\r\n callIndex: number;\r\n draftInput: string;\r\n contextBoundary: ContextBoundaryV2;\r\n runtimeState: RuntimeStateWithoutContext;\r\n}\r\n\r\n/**\r\n * Call rollback checkpoint — v1/v2 union type。\r\n *\r\n * 新 checkpoint 总是 'context-boundary';\r\n * 从老会话加载的 checkpoint 可能是 'legacy-full-snapshot'。\r\n */\r\nexport type CallRollbackSnapshotV2 =\r\n | IncrementalCallRollbackSnapshot\r\n | LegacyCallRollbackSnapshot;\r\n\r\n/**\r\n * @deprecated 使用 CallRollbackSnapshotV2 代替。\r\n * 保留用于 v1 会话文件的反序列化兼容。\r\n */\r\nexport interface CallRollbackSnapshot {\r\n callIndex: number;\r\n draftInput: string;\r\n runtime: AgentRuntimeSnapshot;\r\n}\r\n\r\n/**\r\n * 命名检查点 — 由 Agent 自主建立的可恢复快照\r\n *\r\n * 与 CallRollbackSnapshot 的区别:\r\n * - CallRollbackSnapshot 面向\"回到某个用户 call 之前\",是 onCall 的副产品\r\n * - NamedCheckpoint 面向\"Agent 主动建立的恢复点\",有稳定 ID,可跨 segment 引用\r\n *\r\n * checkpoint 表示控制工具执行完成、tool result 已写入、\r\n * 当前 segment 已完全结束之后的 runtime 状态(协议完整)。\r\n */\r\nexport interface NamedCheckpoint {\r\n /** 全局唯一的 checkpoint ID(由 Agent 提供) */\r\n id: string;\r\n /** 创建时间戳 */\r\n createdAt: number;\r\n /** 创建时的 callIndex */\r\n sourceCallIndex: number;\r\n /** 完整的 runtime snapshot */\r\n runtime: AgentRuntimeSnapshot;\r\n}\r\n\r\nexport interface AgentSessionSnapshot {\r\n version: number;\r\n sessionId: string;\r\n savedAt: number;\r\n agentType: string;\r\n runtime: AgentRuntimeSnapshot;\r\n rollbackHistory: CallRollbackSnapshotV2[];\r\n /** 命名检查点列表(可选,用于 checkpoint/rollback 能力) */\r\n namedCheckpoints?: NamedCheckpoint[];\r\n}\r\n\r\nexport interface SessionStore {\r\n save(sessionId: string, snapshot: AgentSessionSnapshot): Promise<string>;\r\n load(sessionId: string): Promise<AgentSessionSnapshot>;\r\n list(): Promise<string[]>;\r\n delete(sessionId: string): Promise<void>;\r\n}\r\n\r\nconst DEFAULT_SESSION_DIR = resolve(cwd(), '.agentdev', 'sessions');\r\n\r\nexport class FileSessionStore implements SessionStore {\r\n constructor(private readonly baseDir: string = DEFAULT_SESSION_DIR) {}\r\n\r\n async save(sessionId: string, snapshot: AgentSessionSnapshot): Promise<string> {\r\n await mkdir(this.baseDir, { recursive: true });\r\n const filePath = this.resolvePath(sessionId);\r\n await this.atomicWriteJson(filePath, snapshot);\r\n return filePath;\r\n }\r\n\r\n /**\r\n * 原子写 JSON:先写临时文件,再 rename 到目标路径。\r\n *\r\n * 对齐 Claw 侧 server/thread-control/thread-store.js 的 _atomicWriteJson 模式,\r\n * 避免直接 writeFile 目标文件在进程崩溃/断电时留下半截损坏的 JSON(JSON.parse 会失败,\r\n * 且 Claw 侧会在加载时静默丢弃损坏会话)。处理跨平台差异:\r\n * - EPERM / EACCES:Windows 上 rename 覆盖已存在文件可能失败,先 unlink 再 rename。\r\n * - EXDEV:临时文件与目标位于不同设备(如不同挂载点),回退 copyFile + unlink。\r\n */\r\n private async atomicWriteJson(filePath: string, data: unknown): Promise<void> {\r\n const tmpPath = `${filePath}.tmp`;\r\n await writeFile(tmpPath, JSON.stringify(data, null, 2), 'utf-8');\r\n try {\r\n await rename(tmpPath, filePath);\r\n } catch (err) {\r\n const code = (err as NodeJS.ErrnoException).code;\r\n if (code === 'EPERM' || code === 'EACCES') {\r\n await unlink(filePath).catch(() => {});\r\n await rename(tmpPath, filePath);\r\n } else if (code === 'EXDEV') {\r\n await copyFile(tmpPath, filePath);\r\n await unlink(tmpPath).catch(() => {});\r\n } else {\r\n throw err;\r\n }\r\n }\r\n }\r\n\r\n async load(sessionId: string): Promise<AgentSessionSnapshot> {\r\n const filePath = this.resolvePath(sessionId);\r\n const content = await readFile(filePath, 'utf-8');\r\n return JSON.parse(content) as AgentSessionSnapshot;\r\n }\r\n\r\n async list(): Promise<string[]> {\r\n await mkdir(this.baseDir, { recursive: true });\r\n const entries = await readdir(this.baseDir, { withFileTypes: true });\r\n return entries\r\n .filter(entry => entry.isFile() && entry.name.endsWith('.json'))\r\n .map(entry => entry.name.replace(/\\.json$/i, ''))\r\n .sort();\r\n }\r\n\r\n async delete(sessionId: string): Promise<void> {\r\n await rm(this.resolvePath(sessionId), { force: true });\r\n }\r\n\r\n private resolvePath(sessionId: string): string {\r\n return resolve(this.baseDir, `${sessionId}.json`);\r\n }\r\n}\r\n\r\nlet defaultSessionStore: SessionStore | undefined;\r\n\r\nexport function getDefaultSessionStore(): SessionStore {\r\n if (!defaultSessionStore) {\r\n defaultSessionStore = new FileSessionStore();\r\n }\r\n return defaultSessionStore;\r\n}\r\n","/**\n * 模板加载器\n * 从文件系统读取和缓存模板文件\n */\n\nimport { readFile } from 'fs/promises';\nimport { resolve, dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'fs';\nimport type {\n TemplateLoaderOptions,\n CacheStats,\n TemplateError,\n} from './types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst projectRoot = resolve(dirname(__filename), '..');\n\n/**\n * 模板加载器\n */\nexport class TemplateLoader {\n private cache: Map<string, string>;\n private searchDirs: string[];\n private enabled: boolean;\n private stats = { hits: 0, misses: 0 };\n\n constructor(options: TemplateLoaderOptions = {}) {\n this.cache = new Map();\n this.searchDirs = options.searchDirs ?? [];\n this.enabled = options.cacheEnabled !== false;\n }\n\n /**\n * 加载模板(异步)\n */\n async load(templatePath: string): Promise<string> {\n const absolutePath = this.resolvePath(templatePath);\n\n // 检查缓存\n if (this.enabled && this.cache.has(absolutePath)) {\n this.stats.hits++;\n return this.cache.get(absolutePath)!;\n }\n\n this.stats.misses++;\n\n // 验证文件格式\n if (!absolutePath.endsWith('.txt') && !absolutePath.endsWith('.md')) {\n const error: TemplateError = new Error(\n `Unsupported file format: ${absolutePath}. Only .txt and .md are supported.`\n ) as TemplateError;\n (error as any).code = 'UNSUPPORTED_FORMAT';\n (error as any).path = absolutePath;\n throw error;\n }\n\n // 读取文件\n try {\n const content = await readFile(absolutePath, 'utf-8');\n\n // 缓存\n if (this.enabled) {\n this.cache.set(absolutePath, content);\n }\n\n return content;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n const error: TemplateError = new Error(\n `Template file not found: ${absolutePath}\\n` +\n `Working directory: ${process.cwd()}\\n` +\n `Please ensure the file exists.`\n ) as TemplateError;\n (error as any).code = 'FILE_NOT_FOUND';\n (error as any).path = absolutePath;\n throw error;\n }\n const error: TemplateError = new Error(\n `Failed to read template file: ${absolutePath}`\n ) as TemplateError;\n (error as any).code = 'READ_ERROR';\n (error as any).path = absolutePath;\n (error as any).cause = err;\n throw error;\n }\n }\n\n /**\n * 加载模板(同步)\n */\n loadSync(templatePath: string): string {\n throw new Error('Synchronous load not implemented. Use async load() instead.');\n }\n\n /**\n * 解析路径为绝对路径\n * @param templatePath 模板路径\n * @returns 解析后的绝对路径\n * @throws TemplateError 如果文件格式不支持\n */\n resolvePath(templatePath: string): string {\n // 如果是绝对路径,直接使用\n if (this.isAbsolute(templatePath)) {\n return templatePath;\n }\n\n // 相对路径:以 cwd 为基准目录\n const cwd = process.cwd();\n\n // 1. 优先尝试 cwd/.agentdev/prompts\n const agentDir = resolve(cwd, '.agentdev', 'prompts');\n const agentCandidate = resolve(agentDir, templatePath);\n if (this.fileExists(agentCandidate)) {\n return agentCandidate;\n }\n if (this.fileExists(agentCandidate + '.md')) {\n return agentCandidate + '.md';\n }\n if (this.fileExists(agentCandidate + '.txt')) {\n return agentCandidate + '.txt';\n }\n\n // 2. 其次直接用 cwd 作为基准目录\n const fallbackCandidate = resolve(cwd, templatePath);\n if (this.fileExists(fallbackCandidate)) {\n return fallbackCandidate;\n }\n if (this.fileExists(fallbackCandidate + '.md')) {\n return fallbackCandidate + '.md';\n }\n if (this.fileExists(fallbackCandidate + '.txt')) {\n return fallbackCandidate + '.txt';\n }\n\n // 3. 如果还找不到,抛出错误\n throw new Error(\n `Template file not found: ${templatePath}\\n` +\n `Searched in:\\n` +\n ` - ${this.searchDirs.map(d => resolve(cwd, d)).join('\\n - ')}\\n` +\n ` - ${agentDir}\\n` +\n ` - ${resolve(cwd, templatePath)} (cwd base)\\n` +\n `Working directory: ${cwd}`\n );\n }\n\n /**\n * 清除缓存\n */\n clearCache(pattern?: string): void {\n if (!pattern) {\n this.cache.clear();\n this.stats = { hits: 0, misses: 0 };\n return;\n }\n\n // 按模式清除(简单通配符匹配)\n const regex = new RegExp(\n '^' + pattern.replace(/\\*/g, '.*').replace(/\\?/g, '.') + '$'\n );\n\n for (const key of this.cache.keys()) {\n if (regex.test(key)) {\n this.cache.delete(key);\n }\n }\n }\n\n /**\n * 批量加载\n */\n async loadMultiple(paths: string[]): Promise<Map<string, string>> {\n const result = new Map<string, string>();\n for (const path of paths) {\n try {\n result.set(path, await this.load(path));\n } catch {\n // 跳过加载失败的文件\n }\n }\n return result;\n }\n\n /**\n * 获取缓存统计\n */\n getStats(): CacheStats {\n const total = this.stats.hits + this.stats.misses;\n return {\n size: this.cache.size,\n hits: this.stats.hits,\n misses: this.stats.misses,\n hitRate: total > 0 ? this.stats.hits / total : 0,\n };\n }\n\n /**\n * 检查是否是绝对路径\n */\n private isAbsolute(path: string): boolean {\n return path.startsWith('/') || !!path.match(/^[A-Za-z]:\\\\/);\n }\n\n /**\n * 简单检查文件是否存在(同步,不进行实际IO)\n */\n private fileExists(path: string): boolean {\n return existsSync(path);\n }\n}\n","/**\n * 模板组合器\n * 支持流式 API 和灵活拼接\n */\n\nimport type { TemplateSource, PlaceholderContext, TemplateResult } from './types.js';\nimport { TemplateLoader } from './loader.js';\nimport { PlaceholderResolver } from './resolver.js';\nimport type { DataSourceRegistry } from './data-source.js';\n\n/**\n * 模板片段类型\n */\ntype TemplatePart =\n | { type: 'static'; value: string }\n | { type: 'file'; path: string }\n | { type: 'dataSource'; name: string; template: string }\n | { type: 'composer'; composer: TemplateComposer }\n | { type: 'conditional'; condition: (ctx: PlaceholderContext) => boolean; part: TemplatePart };\n\n/**\n * 模板组合器\n */\nexport class TemplateComposer {\n private parts: TemplatePart[] = [];\n private separator: string = '';\n private loader: TemplateLoader;\n private _dataSourceRegistry?: DataSourceRegistry;\n\n constructor(loader?: TemplateLoader) {\n this.loader = loader ?? new TemplateLoader();\n }\n\n /**\n * 设置 Agent 级数据源注册表实例\n * 由 TemplateResolver 在渲染前调用,嵌套 composer 会自动继承。\n */\n setDataSourceRegistry(registry?: DataSourceRegistry): this {\n this._dataSourceRegistry = registry;\n return this;\n }\n\n // ========== 核心拼接 API ==========\n\n /**\n * 添加模板源\n */\n add(source: TemplateSource | TemplateComposer): this {\n this.parts.push(this.toPart(source));\n return this;\n }\n\n /**\n * 添加模板源(别名)\n */\n append(source: TemplateSource | TemplateComposer): this {\n return this.add(source);\n }\n\n /**\n * 在头部插入\n */\n prepend(source: TemplateSource | TemplateComposer): this {\n this.parts.unshift(this.toPart(source));\n return this;\n }\n\n /**\n * 添加多个模板源\n */\n addAll(...sources: (TemplateSource | TemplateComposer)[]): this {\n for (const source of sources) {\n this.add(source);\n }\n return this;\n }\n\n // ========== 分隔符控制 ==========\n\n /**\n * 设置分隔符\n */\n joinWith(sep: string): this {\n this.separator = sep;\n return this;\n }\n\n // ========== 条件拼接 ==========\n\n /**\n * 条件添加\n */\n when(\n condition: boolean | ((ctx: PlaceholderContext) => boolean),\n source: TemplateSource | TemplateComposer\n ): this {\n const testFn = typeof condition === 'function' ? condition : () => condition;\n this.parts.push({\n type: 'conditional',\n condition: testFn,\n part: this.toPart(source),\n });\n return this;\n }\n\n /**\n * 条件分支(三目运算语法糖)\n */\n either(\n condition: boolean | ((ctx: PlaceholderContext) => boolean),\n trueSource: TemplateSource | TemplateComposer,\n falseSource?: TemplateSource | TemplateComposer\n ): this {\n this.when(condition, trueSource);\n if (falseSource) {\n this.when(\n typeof condition === 'function'\n ? (ctx) => !condition(ctx)\n : !condition,\n falseSource\n );\n }\n return this;\n }\n\n // ========== 嵌套组合 ==========\n\n /**\n * 嵌套子组合器\n */\n nest(composer: TemplateComposer): this {\n this.parts.push({ type: 'composer', composer });\n return this;\n }\n\n /**\n * 条件嵌套\n */\n nestIf(\n condition: boolean | ((ctx: PlaceholderContext) => boolean),\n composer: TemplateComposer\n ): this {\n return this.when(condition, composer);\n }\n\n // ========== 工具方法 ==========\n\n /**\n * 清空所有模板\n */\n clear(): this {\n this.parts = [];\n this.separator = '';\n return this;\n }\n\n /**\n * 获取当前模板数量\n */\n get size(): number {\n return this.parts.length;\n }\n\n /**\n * 获取所有模板源\n */\n getSources(): TemplateSource[] {\n return this.parts.map((p) => {\n switch (p.type) {\n case 'static':\n return p.value;\n case 'file':\n return { file: p.path };\n case 'dataSource':\n return { [p.name]: p.template };\n case 'composer':\n case 'conditional':\n return '';\n }\n });\n }\n\n // ========== 渲染 API ==========\n\n /**\n * 渲染最终模板\n */\n async render(context: PlaceholderContext = {}): Promise<TemplateResult> {\n const sources: string[] = [];\n const fragments: string[] = [];\n\n for (const part of this.parts) {\n // 处理条件片段\n if (part.type === 'conditional') {\n if (!part.condition(context)) {\n continue;\n }\n const content = await this.renderPart(part.part, context, sources);\n fragments.push(content);\n continue;\n }\n\n // 渲染普通片段\n const content = await this.renderPart(part, context, sources);\n fragments.push(content);\n }\n\n // 用分隔符拼接\n const content = fragments.join(this.separator);\n\n return { content, sources };\n }\n\n /**\n * 渲染单个片段\n */\n private async renderPart(\n part: TemplatePart,\n context: PlaceholderContext,\n sources: string[]\n ): Promise<string> {\n switch (part.type) {\n case 'static':\n // 静态字符串,替换占位符\n return PlaceholderResolver.resolve(part.value, context);\n\n case 'file': {\n sources.push(part.path);\n // 从文件加载,然后替换占位符\n const fileContent = await this.loader.load(part.path);\n return PlaceholderResolver.resolve(fileContent, context);\n }\n\n case 'dataSource':\n // 使用 Agent 级数据源注册表渲染(per-Agent 实例,非进程全局)\n if (this._dataSourceRegistry) {\n return await this._dataSourceRegistry.render(part.name, part.template, context);\n }\n return '';\n\n case 'composer': {\n // 嵌套组合器,递归渲染(继承父级数据源注册表)\n part.composer.setDataSourceRegistry(this._dataSourceRegistry);\n const result = await part.composer.render(context);\n sources.push(...result.sources);\n return result.content;\n }\n\n case 'conditional':\n // 不会到这里,已在 render 中处理\n return '';\n }\n }\n\n /**\n * 转换为 TemplatePart\n */\n private toPart(source: TemplateSource | TemplateComposer): TemplatePart {\n if (typeof source === 'string') {\n return { type: 'static', value: source };\n }\n\n if (source instanceof TemplateComposer) {\n return { type: 'composer', composer: source };\n }\n\n // 到这里,source 应该是对象类型的 TemplateSource\n // 但由于 TypeScript 的类型系统限制,我们需要断言\n const objSource = source as Exclude<TemplateSource, string> & { file?: string; conditional?: import('./types.js').ConditionalSource };\n\n // { conditional: ... }\n if (objSource.conditional) {\n return {\n type: 'conditional',\n condition: objSource.conditional.condition,\n part: this.toPart(objSource.conditional.part),\n };\n }\n\n // { file: string }\n if (objSource.file) {\n return { type: 'file', path: objSource.file };\n }\n\n // 其他键值对 -> 数据源\n // 例如: { skills: 'template' }, { tasks: 'template' }\n const entries = Object.entries(objSource);\n if (entries.length === 1) {\n const [name, template] = entries[0];\n if (typeof template === 'string') {\n return { type: 'dataSource', name, template };\n }\n }\n\n // 兜底:当作静态字符串\n return { type: 'static', value: String(source) };\n }\n}\n","/**\n * 数据源注册系统\n *\n * 提供通用的列表数据渲染能力,Feature 可以注册自定义数据源\n * 然后在 TemplateComposer 中使用 `{ dataSourceName: 'template' }` 语法\n *\n * @example\n * ```typescript\n * // 注册数据源\n * DataSourceRegistry.register({\n * name: 'tasks',\n * getData: async () => [{ id: 1, title: 'Task 1', priority: 'high' }],\n * renderItem: (item, template, ctx) => {\n * return PlaceholderResolver.resolve(template, { ...ctx, ...item });\n * },\n * });\n *\n * // 在模板中使用\n * composer.add({ tasks: '- {{title}} ({{priority}})' });\n * ```\n */\n\nimport type { PlaceholderContext } from './types.js';\nimport { PlaceholderResolver } from './resolver.js';\n\n/**\n * 数据源渲染器接口\n */\nexport interface DataSourceRenderer<T = any> {\n /** 数据源唯一标识 */\n name: string;\n\n /**\n * 获取数据列表\n * @param context 渲染上下文\n * @returns 数据数组(可以是异步的)\n */\n getData(context: PlaceholderContext): Promise<T[]> | T[];\n\n /**\n * 渲染单个数据项\n * @param item 数据项\n * @param template 模板字符串\n * @param context 渲染上下文\n * @returns 渲染后的字符串\n */\n renderItem(item: T, template: string, context: PlaceholderContext): string;\n\n /**\n * 可选:判断是否启用该数据源\n * @param context 渲染上下文\n * @returns 是否启用(默认 true)\n */\n isEnabled?(context: PlaceholderContext): boolean;\n}\n\n/**\n * 数据源注册中心(per-Agent 实例)\n *\n * 历史上此类是 static(进程全局),在共享进程模式下多个 Agent 实例\n * 会互相覆盖数据源。现已改为实例化:每个 Agent 持有独立的注册表,\n * 由 FeatureInitContext.dataSourceRegistry 传递给各 Feature。\n */\nexport class DataSourceRegistry {\n private sources = new Map<string, DataSourceRenderer>();\n\n /**\n * 注册数据源\n */\n register(renderer: DataSourceRenderer): void {\n if (this.sources.has(renderer.name)) {\n console.warn(`[DataSourceRegistry] Data source \"${renderer.name}\" is being overridden.`);\n }\n this.sources.set(renderer.name, renderer);\n }\n\n /**\n * 注销数据源\n */\n unregister(name: string): boolean {\n return this.sources.delete(name);\n }\n\n /**\n * 获取数据源\n */\n get(name: string): DataSourceRenderer | undefined {\n return this.sources.get(name);\n }\n\n /**\n * 检查数据源是否存在\n */\n has(name: string): boolean {\n return this.sources.has(name);\n }\n\n /**\n * 获取所有已注册的数据源名称\n */\n names(): string[] {\n return Array.from(this.sources.keys());\n }\n\n /**\n * 渲染数据源\n * @param name 数据源名称\n * @param template 模板字符串\n * @param context 渲染上下文\n * @returns 渲染后的字符串\n */\n async render(\n name: string,\n template: string,\n context: PlaceholderContext = {}\n ): Promise<string> {\n const renderer = this.sources.get(name);\n\n if (!renderer) {\n console.warn(`[DataSourceRegistry] Unknown data source: \"${name}\"`);\n return '';\n }\n\n // 检查是否启用\n if (renderer.isEnabled && !renderer.isEnabled(context)) {\n return '';\n }\n\n // 获取数据\n const items = await renderer.getData(context);\n\n if (!items || items.length === 0) {\n return '';\n }\n\n // 渲染每个项目\n return items.map(item => renderer.renderItem(item, template, context)).join('\\n');\n }\n\n /**\n * 清空所有数据源(主要用于测试)\n */\n clear(): void {\n this.sources.clear();\n }\n}\n\n/**\n * 创建列表渲染器的工厂函数\n * 简化常见数据源的注册\n *\n * @example\n * ```typescript\n * DataSourceRegistry.register(createListRenderer({\n * name: 'tasks',\n * getData: (ctx) => ctx.tasks as Task[],\n * // 默认 renderItem 会将 item 合并到 context 中\n * }));\n * ```\n */\nexport function createListRenderer<T = any>(\n config: Omit<DataSourceRenderer<T>, 'renderItem'> & {\n /** 自定义渲染函数(可选) */\n renderItem?: DataSourceRenderer<T>['renderItem'];\n /** 是否合并 item 到 context(默认 true) */\n mergeItem?: boolean;\n }\n): DataSourceRenderer<T> {\n const { mergeItem = true, renderItem, ...baseConfig } = config;\n\n return {\n ...baseConfig,\n renderItem: renderItem ?? ((item, template, context) => {\n // 默认行为:将 item 的属性合并到 context 中\n const merged = mergeItem ? (item as Record<string, unknown>) : {};\n const itemContext: PlaceholderContext = {\n ...context,\n ...merged,\n this: item as any,\n };\n return PlaceholderResolver.resolve(template, itemContext);\n }),\n };\n}\n","/**\n * Agent Skills 加载器\n * 扫描目录,解析 SKILL.md 文件\n */\n\nimport { readdir, readFile } from 'fs/promises';\nimport { resolve, isAbsolute, join, normalize, dirname, isAbsolute as pathIsAbsolute } from 'path';\nimport { existsSync } from 'fs';\nimport type { SkillMetadata, SkillsOptions } from './types.js';\nimport { cwd as processCwd } from 'process';\nimport yaml from 'js-yaml';\n\n/**\n * 解析 SKILL.md 文件的 YAML frontmatter\n * @param content 文件内容\n * @returns Skill 元数据或 null\n */\nfunction parseSkillFrontmatter(content: string, path: string): SkillMetadata | null {\n // 检查是否有 YAML frontmatter(以 --- 开头)\n if (!content.trimStart().startsWith('---')) {\n return null;\n }\n\n // 提取 frontmatter 部分\n const frontmatterEnd = content.indexOf('---', 3);\n if (frontmatterEnd === -1) {\n return null;\n }\n\n const frontmatterStr = content.slice(3, frontmatterEnd).trim();\n\n let parsed: Record<string, unknown>;\n try {\n parsed = yaml.load(frontmatterStr) as Record<string, unknown>;\n } catch (err) {\n // YAML 解析失败(常见于多行 description 中含 \"key: value\" 模式,\n // 如 \"Use when:\" 被 YAML 误解为映射条目)。\n // 尝试 fallback:逐行提取 name 和 description。\n const fallback = parseFrontmatterFallback(frontmatterStr, path);\n if (fallback) {\n console.warn(\n `[skills/loader] YAML frontmatter parse failed for ${path}, used fallback parser. ` +\n `Consider quoting multi-line descriptions or using block scalar (|).` +\n (err instanceof Error ? ` Error: ${err.message.split('\\n')[0]}` : '')\n );\n return fallback;\n }\n return null;\n }\n\n if (!parsed || typeof parsed !== 'object') return null;\n\n const name = typeof parsed.name === 'string' ? parsed.name.trim() : null;\n const description = typeof parsed.description === 'string' ? parsed.description.trim() : null;\n\n if (!name || !description) return null;\n\n return { name, description, path };\n}\n\n/**\n * Fallback frontmatter 解析器\n *\n * 当 js-yaml 因格式问题(如多行 description 中的冒号)解析失败时,\n * 使用逐行匹配提取 name 和 description 字段。\n * description 的值会被拼接为单行文本(空格分隔续行)。\n */\nfunction parseFrontmatterFallback(frontmatterStr: string, path: string): SkillMetadata | null {\n const lines = frontmatterStr.split('\\n');\n let name: string | null = null;\n let description: string | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const nameMatch = line.match(/^name:\\s*(.+)$/);\n if (nameMatch && !name) {\n name = nameMatch[1].trim();\n continue;\n }\n const descMatch = line.match(/^description:\\s*(.*)$/);\n if (descMatch && !description) {\n // 收集 description 值和所有缩进的续行\n const descParts: string[] = [];\n if (descMatch[1].trim()) descParts.push(descMatch[1].trim());\n for (let j = i + 1; j < lines.length; j++) {\n const nextLine = lines[j];\n // 续行以空格开头(缩进);顶格行是新 key,停止收集\n if (/^\\s/.test(nextLine)) {\n descParts.push(nextLine.trim());\n } else {\n break;\n }\n }\n description = descParts.join(' ').trim();\n }\n }\n\n if (!name || !description) return null;\n return { name, description, path };\n}\n\n/**\n * 拆分 SKILL.md 开头的 YAML frontmatter,返回 [frontmatter 原文, 正文]。\n *\n * frontmatter 含 name/description 之外的用户元数据,注入时必须原样保留;\n * 但若直接拼进 markdown,开头的 `---` 会被渲染成水平线、紧随的 YAML 文本\n * 被 setext 语法解析成大标题。调用方应将 frontmatter 包进 ```yaml 围栏\n * 代码块后再拼接,使其渲染为代码块。\n */\nexport function splitFrontmatter(content: string): { frontmatter: string; body: string } {\n const trimmed = content.trimStart();\n if (!trimmed.startsWith('---')) return { frontmatter: '', body: content };\n\n const frontmatterEnd = trimmed.indexOf('\\n---', 3);\n if (frontmatterEnd === -1) return { frontmatter: '', body: content };\n\n const rest = trimmed.slice(trimmed.indexOf('\\n', frontmatterEnd + 1) + 1);\n return {\n frontmatter: trimmed.slice(0, frontmatterEnd + 4).trim(),\n body: rest.trimStart(),\n };\n}\n\n/**\n * 扫描目录下的 SKILL.md 文件(仅一级结构)\n *\n * 标准结构:每个一级子目录代表一个 skill,其内部直接包含 SKILL.md。\n * 同时兼容 SKILL.md 直接放在 skills 根目录的情况。\n * 不做递归深入。\n */\nasync function collectSkillFiles(dir: string): Promise<string[]> {\n const skillFiles: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n // SKILL.md 直接放在根目录的情况\n if (entry.isFile() && entry.name === 'SKILL.md') {\n skillFiles.push(normalize(fullPath));\n continue;\n }\n\n // 一级子目录(含指向目录的符号链接):检查其直接子项是否包含 SKILL.md\n let isDir = entry.isDirectory();\n if (!isDir && entry.isSymbolicLink()) {\n try {\n const stats = await readFileStats(fullPath);\n isDir = stats.isDirectory();\n } catch {\n continue;\n }\n }\n\n if (isDir) {\n try {\n const subEntries = await readdir(fullPath, { withFileTypes: true });\n for (const subEntry of subEntries) {\n if (subEntry.isFile() && subEntry.name === 'SKILL.md') {\n skillFiles.push(normalize(join(fullPath, 'SKILL.md')));\n break; // 每个 skill 目录只取一个 SKILL.md\n }\n }\n } catch {\n // 容错:跳过无法访问的子目录\n }\n }\n }\n } catch {\n // 容错:跳过无法访问的目录\n }\n\n return skillFiles;\n}\n\n/**\n * 安全地读取文件状态(支持符号链接)\n */\nasync function readFileStats(path: string): Promise<{ isDirectory(): boolean }> {\n const { stat } = await import('fs/promises');\n return stat(path);\n}\n\n/**\n * 发现并加载指定目录下的所有 skills\n * @param options Skills 配置选项\n * @returns Skill 元数据列表\n */\nexport async function discover(options: SkillsOptions = {}): Promise<SkillMetadata[]> {\n const { dir, baseDir } = options;\n\n // 解析 skills 目录路径\n const skillsDir = resolveSkillsDir(dir, baseDir);\n\n // 检查目录是否存在\n if (!existsSync(skillsDir)) {\n return [];\n }\n\n const skills: SkillMetadata[] = [];\n\n try {\n // 扫描一级目录结构(每个子目录一个 skill)\n const skillFiles = await collectSkillFiles(skillsDir);\n\n for (const fullPath of skillFiles) {\n try {\n const content = await readFile(fullPath, 'utf-8');\n const metadata = parseSkillFrontmatter(content, fullPath);\n\n if (metadata) {\n skills.push(metadata);\n }\n } catch {\n // 容错:跳过读取失败的文件\n }\n }\n } catch {\n // 容错:目录扫描失败时返回空数组\n return [];\n }\n\n return skills;\n}\n\n/**\n * 解析 skills 目录路径\n * @param dir 用户指定的目录路径\n * @param baseDir 相对路径基准目录,默认 process.cwd()\n * @returns 解析后的绝对路径\n */\nfunction resolveSkillsDir(dir?: string, baseDir?: string): string {\n const resolvedBase = baseDir ?? process.cwd();\n\n // 如果用户指定了目录\n if (dir) {\n // 绝对路径直接使用\n if (isAbsolute(dir)) {\n return dir;\n }\n // 相对路径以 baseDir 为基准\n return resolve(resolvedBase, dir);\n }\n\n // 默认使用 baseDir/.agentdev/skills\n return resolve(resolvedBase, '.agentdev', 'skills');\n}\n\n/**\n * 对同名 skill 添加序号后缀:第一个保持原名,后续加 (1)、(2)...\n */\nfunction deduplicateSkills(skills: SkillMetadata[]): SkillMetadata[] {\n const nameCount = new Map<string, number>();\n return skills.map(skill => {\n const count = nameCount.get(skill.name) || 0;\n nameCount.set(skill.name, count + 1);\n if (count === 0) return skill;\n return { ...skill, name: `${skill.name} (${count})` };\n });\n}\n\n/**\n * 多目录发现:按配置扫描 .agentdev/skills、.claude/skills 及额外目录,\n * 合并结果并对同名 skill 自动加后缀。\n */\nexport async function discoverMulti(options: SkillsOptions = {}): Promise<SkillMetadata[]> {\n const {\n dir,\n scanAgentdevDir = true,\n scanClaudeDir = false,\n extraDirs = [],\n baseDir,\n } = options;\n const resolvedBase = baseDir ?? processCwd();\n const directories: string[] = [];\n\n // Explicitly specified dir takes highest priority\n if (dir) {\n directories.push(isAbsolute(dir) ? dir : resolve(resolvedBase, dir));\n }\n\n if (scanAgentdevDir) {\n directories.push(resolve(resolvedBase, '.agentdev', 'skills'));\n }\n if (scanClaudeDir) {\n directories.push(resolve(resolvedBase, '.claude', 'skills'));\n }\n const limitedExtras = extraDirs.filter(Boolean).slice(0, 5);\n for (const d of limitedExtras) {\n directories.push(isAbsolute(d) ? d : resolve(resolvedBase, d));\n }\n\n // Deduplicate directories — on Windows the same physical path can appear\n // with different drive-letter casing (e.g. \"D:\\…\" vs \"d:\\…\").\n const isWin = process.platform === 'win32';\n const seen = new Set<string>();\n const uniqueDirs = directories.filter(d => {\n const key = isWin ? d.toLowerCase() : d;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n const allSkills: SkillMetadata[] = [];\n for (const dir of uniqueDirs) {\n const skills = await discover({ dir });\n allSkills.push(...skills);\n }\n\n return deduplicateSkills(allSkills);\n}\n","/**\n * Utility for tools to return images alongside text results.\n *\n * Tools call {@link withImages} in their `execute()` function to declare\n * that the result carries image data. The tool-executor detects the\n * `__withImages` marker and routes the images into {@link ToolExecResult.images},\n * which is then propagated to the tool message in context.\n *\n * The text portion is stored as the normal tool result string, while the\n * images bypass `JSON.stringify` and are attached directly to the message —\n * the LLM compilers handle them per-provider (image blocks for vision models,\n * text placeholders for non-vision models).\n */\n\nimport type { ImageInput } from './types.js';\n\nconst TOOL_IMAGES_MARKER = '__withImages';\n\n/**\n * Structured return shape recognized by the tool-executor.\n * Tools should not construct this object manually — use {@link withImages} instead.\n */\nexport interface WithImagesResult {\n /** Marker field — always `true`. Do not set manually. */\n readonly __withImages: true;\n /** Text result returned to the LLM as the normal tool output. */\n readonly text: string;\n /** Images to inject into the conversation context. */\n readonly images: ImageInput[];\n}\n\n/**\n * Wrap a text result with images so the framework knows to inject them\n * into the conversation context alongside the tool output.\n *\n * @example\n * ```ts\n * execute: async ({ path }) => {\n * return withImages(`Read image: ${path}`, [{ path, mediaType: 'image/png', source: path }]);\n * }\n * ```\n *\n * The returned object is recognized by the tool-executor via the\n * `__withImages` marker. Tools that don't need images should simply\n * return a normal value (string, object, etc.) — no wrapper needed.\n */\nexport function withImages(text: string, images: ImageInput[]): WithImagesResult {\n return { __withImages: true, text, images };\n}\n\n/**\n * Type guard: does this value carry the `__withImages` marker?\n */\nexport function isWithImagesResult(data: unknown): data is WithImagesResult {\n return (\n typeof data === 'object' &&\n data !== null &&\n !Array.isArray(data) &&\n (data as Record<string, unknown>)[TOOL_IMAGES_MARKER] === true\n );\n}\n","/**\r\n * API 错误分类与用户友好消息\r\n *\r\n * 对标 Claude Code errors.ts + errorUtils.ts 的通用化实现:\r\n * - 标准错误分类(classifyAPIError)\r\n * - 用户友好消息映射(getUserFriendlyMessage)\r\n * - 连接错误详情提取(extractConnectionErrorDetails)\r\n * - 自定义 ClassifiedAPIError 异常类\r\n */\r\n\r\n// ========== 错误类型枚举 ==========\r\n\r\nexport type APIErrorType =\r\n | 'connection_error' // DNS/网络连接错误 (ENOTFOUND, ECONNREFUSED, ECONNRESET...)\r\n | 'connection_timeout' // 连接超时 (ETIMEDOUT, UND_ERR_CONNECT_TIMEOUT...)\r\n | 'rate_limit' // HTTP 429 限流\r\n | 'server_overload' // HTTP 529 服务过载 / overloaded_error\r\n | 'server_error' // HTTP 5xx 服务端错误\r\n | 'client_error' // HTTP 4xx 客户端错误(非特定)\r\n | 'auth_error' // HTTP 401/403 认证失败\r\n | 'prompt_too_long' // 提示词/token 超长\r\n | 'invalid_api_key' // API Key 无效\r\n | 'ssl_cert_error' // SSL/TLS 证书错误\r\n | 'unknown'; // 未知错误\r\n\r\n// ========== 自定义异常类 ==========\r\n\r\n/**\r\n * 分类后的 API 错误\r\n *\r\n * 携带标准化的 errorType 和用户友好的 userMessage,\r\n * 上层(react-loop、UI)可据此展示不同级别的提示。\r\n */\r\nexport class ClassifiedAPIError extends Error {\r\n readonly errorType: APIErrorType;\r\n readonly userMessage: string;\r\n readonly originalError: Error;\r\n readonly statusCode?: number;\r\n\r\n constructor(\r\n errorType: APIErrorType,\r\n userMessage: string,\r\n originalError: Error,\r\n statusCode?: number,\r\n ) {\r\n super(userMessage);\r\n this.name = 'ClassifiedAPIError';\r\n this.errorType = errorType;\r\n this.userMessage = userMessage;\r\n this.originalError = originalError;\r\n this.statusCode = statusCode;\r\n this.cause = originalError;\r\n }\r\n}\r\n\r\n// ========== SSL/TLS 错误码(来自 OpenSSL) ==========\r\n\r\nconst SSL_ERROR_CODES: ReadonlySet<string> = new Set([\r\n // 证书验证错误\r\n 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\r\n 'UNABLE_TO_GET_ISSUER_CERT',\r\n 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY',\r\n 'CERT_SIGNATURE_FAILURE',\r\n 'CERT_NOT_YET_VALID',\r\n 'CERT_HAS_EXPIRED',\r\n 'CERT_REVOKED',\r\n 'CERT_REJECTED',\r\n 'CERT_UNTRUSTED',\r\n // 自签名证书\r\n 'DEPTH_ZERO_SELF_SIGNED_CERT',\r\n 'SELF_SIGNED_CERT_IN_CHAIN',\r\n // 证书链错误\r\n 'CERT_CHAIN_TOO_LONG',\r\n 'PATH_LENGTH_EXCEEDED',\r\n // 主机名/altname 错误\r\n 'ERR_TLS_CERT_ALTNAME_INVALID',\r\n 'HOSTNAME_MISMATCH',\r\n // TLS 握手错误\r\n 'ERR_TLS_HANDSHAKE_TIMEOUT',\r\n 'ERR_SSL_WRONG_VERSION_NUMBER',\r\n 'ERR_SSL_DECRYPTION_FAILED_OR_BAD_RECORD_MAC',\r\n // EPROTO(通常也是 SSL 问题)\r\n 'EPROTO',\r\n]);\r\n\r\n// ========== DNS/连接错误码 ==========\r\n\r\nconst DNS_ERROR_CODES: ReadonlySet<string> = new Set([\r\n 'ENOTFOUND',\r\n 'EAI_AGAIN',\r\n 'EAI_NONAME',\r\n 'EAI_NODATA',\r\n]);\r\n\r\nconst TIMEOUT_ERROR_CODES: ReadonlySet<string> = new Set([\r\n 'ETIMEDOUT',\r\n 'UND_ERR_CONNECT_TIMEOUT',\r\n 'UND_ERR_HEADERS_TIMEOUT',\r\n 'UND_ERR_BODY_TIMEOUT',\r\n 'ECONNABORTED',\r\n]);\r\n\r\nconst CONNECTION_ERROR_CODES: ReadonlySet<string> = new Set([\r\n 'ECONNRESET',\r\n 'ECONNREFUSED',\r\n 'EHOSTUNREACH',\r\n 'ENETUNREACH',\r\n 'EPIPE',\r\n 'UND_ERR_SOCKET',\r\n]);\r\n\r\n// ========== 连接错误详情提取 ==========\r\n\r\nexport interface ConnectionErrorDetails {\r\n code: string;\r\n message: string;\r\n hostname?: string;\r\n isSSLError: boolean;\r\n isDNSError: boolean;\r\n isTimeoutError: boolean;\r\n}\r\n\r\n/**\r\n * 从错误 cause 链中提取连接错误详情\r\n *\r\n * 遍历 error.cause 链(最多5层),找到第一个有 code 属性的节点。\r\n */\r\nexport function extractConnectionErrorDetails(\r\n error: unknown,\r\n): ConnectionErrorDetails | null {\r\n if (!error || typeof error !== 'object') return null;\r\n\r\n let current: unknown = error;\r\n const maxDepth = 5;\r\n let depth = 0;\r\n\r\n while (current && depth < maxDepth) {\r\n if (\r\n current instanceof Error &&\r\n 'code' in current &&\r\n typeof (current as any).code === 'string'\r\n ) {\r\n const code = (current as any).code as string;\r\n const message = current.message || '';\r\n const hostname = (current as any).hostname as string | undefined;\r\n return {\r\n code,\r\n message,\r\n hostname,\r\n isSSLError: SSL_ERROR_CODES.has(code),\r\n isDNSError: DNS_ERROR_CODES.has(code),\r\n isTimeoutError: TIMEOUT_ERROR_CODES.has(code),\r\n };\r\n }\r\n\r\n if (\r\n current instanceof Error &&\r\n 'cause' in current &&\r\n (current as any).cause !== current\r\n ) {\r\n current = (current as any).cause;\r\n depth++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// ========== 错误分类 ==========\r\n\r\n/**\r\n * 将任意 API 错误分类为标准化的 APIErrorType\r\n *\r\n * 分类优先级(对标 Claude Code classifyAPIError):\r\n * 1. HTTP 状态码(429/529/401/403/5xx/4xx)\r\n * 2. overloaded_error 消息匹配(流式 529 可能丢失状态码)\r\n * 3. 连接错误详情(SSL/DNS/Timeout/Connection)\r\n * 4. 消息关键字匹配(prompt_too_long, invalid_api_key 等)\r\n * 5. 兜底 unknown\r\n */\r\nexport function classifyAPIError(error: unknown, status?: number): APIErrorType {\r\n // --- 1. 基于 HTTP 状态码 ---\r\n\r\n // 429 限流\r\n if (status === 429) return 'rate_limit';\r\n\r\n // 529 服务过载\r\n if (status === 529) return 'server_overload';\r\n\r\n // 401/403 认证失败\r\n if (status === 401 || status === 403) return 'auth_error';\r\n\r\n // 5xx 服务端错误\r\n if (status !== undefined && status >= 500) return 'server_error';\r\n\r\n // 4xx 客户端错误(非特定)\r\n if (status !== undefined && status >= 400) return 'client_error';\r\n\r\n // --- 2. overloaded_error 消息匹配 ---\r\n if (\r\n error instanceof Error &&\r\n error.message.includes('\"type\":\"overloaded_error\"')\r\n ) {\r\n return 'server_overload';\r\n }\r\n\r\n // --- 3. 连接错误详情 ---\r\n const connDetails = extractConnectionErrorDetails(error);\r\n if (connDetails) {\r\n if (connDetails.isSSLError) return 'ssl_cert_error';\r\n if (connDetails.isDNSError) return 'connection_error';\r\n if (connDetails.isTimeoutError) return 'connection_timeout';\r\n if (CONNECTION_ERROR_CODES.has(connDetails.code)) return 'connection_error';\r\n }\r\n\r\n // --- 4. 消息关键字匹配 ---\r\n\r\n if (error instanceof Error) {\r\n const msg = error.message.toLowerCase();\r\n\r\n // 提示词过长\r\n if (\r\n msg.includes('prompt is too long') ||\r\n msg.includes('prompt too long') ||\r\n msg.includes('maximum context length') ||\r\n msg.includes('token limit') ||\r\n msg.includes('context window')\r\n ) {\r\n return 'prompt_too_long';\r\n }\r\n\r\n // API Key 无效\r\n if (msg.includes('invalid api key') || msg.includes('invalid x-api-key')) {\r\n return 'invalid_api_key';\r\n }\r\n\r\n // fetch failed(Undici 通用网络错误包装)\n if (msg.includes('fetch failed')) return 'connection_error';\n\n // OpenAI SDK may intentionally hide the underlying socket error and only\n // expose this stable message. Preserve the network classification instead\n // of reporting it as an unknown API failure.\n if (msg.includes('connection error')) return 'connection_error';\n\r\n // 超时关键字\r\n if (msg.includes('timeout') || msg.includes('timed out')) {\r\n return 'connection_timeout';\r\n }\r\n }\r\n\r\n // --- 5. 兜底 ---\r\n return 'unknown';\r\n}\r\n\r\n// ========== 用户友好消息映射 ==========\r\n\r\n/**\r\n * 根据错误类型生成用户友好的中文消息\r\n *\r\n * 对标 Claude Code getAssistantMessageFromError / formatAPIError,\r\n * 但使用中文且去掉 Max/Pro/Enterprise 等订阅相关逻辑。\r\n */\r\nexport function getUserFriendlyMessage(\r\n errorType: APIErrorType,\r\n error: Error,\r\n status?: number,\r\n): string {\r\n const connDetails = extractConnectionErrorDetails(error);\r\n\r\n switch (errorType) {\r\n case 'connection_error': {\r\n if (connDetails) {\r\n // DNS 解析失败\r\n if (connDetails.isDNSError) {\r\n const host = connDetails.hostname || '服务器';\r\n return `无法连接到 API 服务器 (${host}):DNS 解析失败,请检查网络连接或 API 地址配置`;\r\n }\r\n // 连接被拒绝/重置\r\n if (CONNECTION_ERROR_CODES.has(connDetails.code)) {\r\n const host = connDetails.hostname || '';\r\n return `网络连接错误 (${connDetails.code})${host ? `,目标: ${host}` : ''},请检查网络连接或代理设置`;\r\n }\r\n }\r\n return '无法连接到 API 服务器,请检查网络连接';\r\n }\r\n\r\n case 'connection_timeout': {\r\n if (connDetails) {\r\n return `请求超时 (${connDetails.code}),请检查网络连接或代理设置`;\r\n }\r\n return '请求超时,请检查网络连接';\r\n }\r\n\r\n case 'ssl_cert_error': {\r\n if (connDetails) {\r\n switch (connDetails.code) {\r\n case 'UNABLE_TO_VERIFY_LEAF_SIGNATURE':\r\n case 'UNABLE_TO_GET_ISSUER_CERT':\r\n case 'UNABLE_TO_GET_ISSUER_CERT_LOCALLY':\r\n return 'SSL 证书验证失败,如果在使用企业代理,请设置 NODE_EXTRA_CA_CERTS 环境变量';\r\n case 'CERT_HAS_EXPIRED':\r\n return 'SSL 证书已过期';\r\n case 'SELF_SIGNED_CERT_IN_CHAIN':\r\n case 'DEPTH_ZERO_SELF_SIGNED_CERT':\r\n return '检测到自签名证书,请检查代理或企业 SSL 证书配置';\r\n case 'ERR_TLS_CERT_ALTNAME_INVALID':\r\n case 'HOSTNAME_MISMATCH':\r\n return 'SSL 证书主机名不匹配';\r\n case 'EPROTO':\r\n return 'SSL/TLS 协议错误,可能是代理或防火墙拦截了 HTTPS 连接';\r\n default:\r\n return `SSL 错误 (${connDetails.code}),请检查网络和证书配置`;\r\n }\r\n }\r\n return 'SSL 证书错误,请检查网络和证书配置';\r\n }\r\n\r\n case 'rate_limit':\r\n return 'API 请求频率超限 (429),请稍后重试';\r\n\r\n case 'server_overload':\r\n return 'API 服务过载 (529),请稍后重试';\r\n\r\n case 'server_error':\r\n return `API 服务端错误 (${status ?? '5xx'}),请稍后重试`;\r\n\r\n case 'auth_error':\r\n if (error.message.toLowerCase().includes('invalid api key') ||\r\n error.message.toLowerCase().includes('x-api-key')) {\r\n return 'API Key 无效,请检查配置中的 API Key';\r\n }\r\n return `认证失败 (${status ?? '401/403'}),请检查 API Key 或登录状态`;\r\n\r\n case 'invalid_api_key':\r\n return 'API Key 无效,请检查配置中的 API Key';\r\n\r\n case 'prompt_too_long':\r\n return '提示词/上下文超长,请减少对话内容或启用上下文压缩';\r\n\r\n case 'client_error':\r\n return `API 请求错误 (${status ?? '4xx'}):${sanitizeErrorMessage(error.message)}`;\r\n\r\n case 'unknown':\r\n return `API 调用失败:${sanitizeErrorMessage(error.message)}`;\r\n\r\n default:\r\n return `API 调用失败:${sanitizeErrorMessage(error.message)}`;\r\n }\r\n}\r\n\r\n// ========== 辅助函数 ==========\r\n\r\n/**\r\n * 清理错误消息中的 HTML 内容(如 CloudFlare 错误页)\r\n */\r\nfunction sanitizeErrorMessage(message: string): string {\r\n if (!message) return '未知错误';\r\n // 检测 HTML 内容\r\n if (message.includes('<!DOCTYPE html') || message.includes('<html')) {\r\n const titleMatch = message.match(/<title>([^<]+)<\\/title>/);\r\n if (titleMatch && titleMatch[1]) {\r\n return titleMatch[1].trim();\r\n }\r\n return '服务器返回了 HTML 错误页';\r\n }\r\n // 截断过长消息\r\n if (message.length > 300) {\r\n return message.slice(0, 300) + '...';\r\n }\r\n return message;\r\n}\r\n\r\n// ========== 顶层组合函数 ==========\r\n\r\n/**\r\n * 对任意错误进行分类并生成 ClassifiedAPIError\r\n *\r\n * 这是最常用的入口函数,在 LLM catch 块中调用。\r\n */\r\nexport function classifyAndWrapError(\r\n error: unknown,\r\n status?: number,\r\n): ClassifiedAPIError {\r\n const originalError = error instanceof Error ? error : new Error(String(error));\r\n const errorType = classifyAPIError(error, status);\r\n const userMessage = getUserFriendlyMessage(errorType, originalError, status);\r\n\r\n return new ClassifiedAPIError(errorType, userMessage, originalError, status);\r\n}\r\n","/**\r\n * LLM API 重试机制\r\n *\r\n * 对标 Claude Code withRetry 的同款实现:\r\n * - HTTP 状态码驱动的重试决策\r\n * - 指数退避 + 25% 随机抖动\r\n * - Retry-After 响应头优先\r\n * - 网络错误码匹配(Undici/Node.js)\r\n */\r\n\r\n/**\r\n * 默认最大重试次数(与 Claude Code 一致)\r\n */\r\nexport const DEFAULT_MAX_RETRIES = 10;\r\n\r\n/**\r\n * 模型调用默认最大重试次数(ModelConfig.maxRetries 缺省时由 LLM 工厂填充)\r\n */\r\nexport const DEFAULT_MODEL_MAX_RETRIES = 10;\r\n\r\n/**\r\n * 模型调用默认整体时限:10 分钟(ModelConfig.timeoutMs 缺省时由 LLM 工厂填充)。\r\n * 与 OpenAI SDK 默认单请求 timeout 对齐;流式传输全程受此 deadline 约束。\r\n */\r\nexport const DEFAULT_MODEL_TIMEOUT_MS = 600_000;\r\n\r\n/**\r\n * 基础退避延迟 500ms(与 Claude Code 一致)\r\n */\r\nconst BASE_DELAY_MS = 500;\r\n\r\n/**\r\n * 最大退避延迟 32s(与 Claude Code 一致)\r\n */\r\nconst MAX_DELAY_MS = 32000;\r\n\r\n/**\r\n * 可重试的 HTTP 状态码集合\r\n */\r\nconst RETRYABLE_STATUS_CODES: ReadonlySet<number> = new Set([\r\n 408, // Request Timeout\r\n 409, // Conflict / Lock timeout\r\n 429, // Rate Limit\r\n 529, // Overloaded (Anthropic 特有,但对其他 API 也可重试)\r\n]);\r\n\r\n/**\r\n * 可重试的网络底层错误码(Undici / Node.js fetch)\r\n */\r\nconst RETRYABLE_ERROR_CODES: ReadonlySet<string> = new Set([\r\n // Undici 错误\r\n 'UND_ERR_CONNECT_TIMEOUT',\r\n 'UND_ERR_SOCKET',\r\n 'UND_ERR_HEADERS_TIMEOUT',\r\n 'UND_ERR_BODY_TIMEOUT',\r\n // 系统级网络错误\r\n 'ETIMEDOUT',\r\n 'ECONNRESET',\r\n 'ECONNREFUSED',\r\n 'ECONNABORTED',\r\n 'ENOTFOUND',\r\n 'EHOSTUNREACH',\r\n 'ENETUNREACH',\r\n 'EAI_AGAIN',\r\n // 协议层错误\r\n 'EPROTO',\r\n 'EPIPE',\r\n]);\r\n\r\ntype HeaderMap = Record<string, string | number | string[] | undefined>;\r\ntype HeadersLike = Headers | HeaderMap | undefined;\r\n\r\n/**\r\n * 从 Response Headers 解析 Retry-After(秒),返回毫秒\r\n *\r\n * OpenAI SDK 的错误对象会把 headers 暴露成普通对象,而 fetch response\r\n * 暴露的是 Headers 实例。这里同时兼容两种形态,避免错误处理本身盖住真实 API 错误。\r\n */\r\nexport function parseRetryAfter(headers: HeadersLike): number | undefined {\r\n const retryAfter = getHeaderValue(headers, 'retry-after');\r\n if (retryAfter) {\r\n const seconds = parseInt(retryAfter, 10);\r\n if (!isNaN(seconds) && seconds > 0) {\r\n return seconds * 1000;\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction getHeaderValue(headers: HeadersLike, name: string): string | undefined {\r\n if (!headers) return undefined;\r\n\r\n if (typeof (headers as Headers).get === 'function') {\r\n return (headers as Headers).get(name) || undefined;\r\n }\r\n\r\n const lowerName = name.toLowerCase();\r\n for (const [key, value] of Object.entries(headers as HeaderMap)) {\r\n if (key.toLowerCase() !== lowerName || value === undefined) continue;\r\n if (Array.isArray(value)) {\r\n return value.join(', ');\r\n }\r\n return String(value);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * 指数退避 + 随机抖动\r\n *\r\n * 公式: min(500ms * 2^(attempt-1), 32000ms) + [0, 25%) 随机抖动\r\n * 如果传入了 retryAfterMs 则优先使用服务端指令\r\n */\r\nexport function getRetryDelay(attempt: number, retryAfterMs?: number): number {\r\n // 优先遵循服务端 Retry-After 指令\r\n if (retryAfterMs !== undefined && retryAfterMs > 0) {\r\n return retryAfterMs;\r\n }\r\n\r\n // 指数退避: 500ms * 2^(attempt-1),上限 32s\r\n const baseDelay = Math.min(BASE_DELAY_MS * Math.pow(2, attempt - 1), MAX_DELAY_MS);\r\n // 25% 随机抖动\r\n const jitter = Math.random() * 0.25 * baseDelay;\r\n return baseDelay + jitter;\r\n}\r\n\r\n/**\r\n * 判断错误是否可重试\r\n *\r\n * 检查顺序:\r\n * 1. HTTP 5xx 服务端错误\r\n * 2. 特定可重试状态码 (408/409/429/529)\r\n * 3. overloaded_error(529 在流式请求中可能丢状态码)\r\n * 4. 网络底层错误码\r\n */\r\nexport function shouldRetry(\r\n error: unknown,\r\n status?: number,\r\n): boolean {\r\n // 1. 服务端错误 5xx 始终重试\r\n if (status !== undefined && status >= 500) {\r\n return true;\r\n }\r\n\r\n // 2. 特定可重试状态码\r\n if (status !== undefined && RETRYABLE_STATUS_CODES.has(status)) {\r\n return true;\r\n }\r\n\r\n // 3. overloaded_error(SDK 在流式请求中可能丢 529 状态码,\r\n // 但错误消息中会包含 \"type\":\"overloaded_error\")\r\n if (error instanceof Error && error.message.includes('\"type\":\"overloaded_error\"')) {\r\n return true;\r\n }\r\n\r\n // 4. 网络底层错误码(遍历 cause 链)\r\n const code = extractErrorCode(error);\r\n if (typeof code === 'string' && RETRYABLE_ERROR_CODES.has(code)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * 从错误对象中提取错误码(遍历 cause 链找到第一个有 code 的属性)\r\n */\r\nexport function extractErrorCode(error: unknown): string | undefined {\r\n if (!error || typeof error !== 'object') return undefined;\r\n\r\n let current: unknown = error;\r\n const maxDepth = 5;\r\n let depth = 0;\r\n\r\n while (current && depth < maxDepth) {\r\n if (current instanceof Error && 'code' in current && typeof (current as any).code === 'string') {\r\n return (current as any).code as string;\r\n }\r\n if (current instanceof Error && 'cause' in current && (current as any).cause !== current) {\r\n current = (current as any).cause;\r\n depth++;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * retry sleep — 可中断的 sleep\r\n */\r\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (signal?.aborted) {\r\n reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));\r\n return;\r\n }\r\n const onAbort = () => {\r\n clearTimeout(timer);\r\n reject(signal!.reason ?? new DOMException('Aborted', 'AbortError'));\r\n };\r\n const timer = setTimeout(() => {\r\n signal?.removeEventListener('abort', onAbort);\r\n resolve();\r\n }, ms);\r\n signal?.addEventListener('abort', onAbort, { once: true });\r\n });\r\n}\r\n\r\n/**\r\n * 合并外部中断信号与整体时限为单一 AbortSignal。\r\n *\r\n * - 任一先触发即生效;deadline 到达时以 TimeoutError DOMException 中止,\r\n * 上游按 AbortError 处理(不重试、直接传播)。\r\n * - timeoutMs 为 undefined / Infinity 时仅透传外部信号(不额外建 controller)。\r\n */\r\nexport function withDeadline(signal: AbortSignal | undefined, timeoutMs?: number): AbortSignal | undefined {\r\n if (!timeoutMs || timeoutMs === Infinity || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\r\n return signal;\r\n }\r\n const merged = new AbortController();\r\n if (signal) {\r\n if (signal.aborted) {\r\n merged.abort(signal.reason);\r\n return merged.signal;\r\n }\r\n signal.addEventListener('abort', () => merged.abort(signal.reason), { once: true });\r\n }\r\n const timer = setTimeout(\r\n () => merged.abort(new DOMException(`Model call deadline exceeded after ${timeoutMs}ms`, 'TimeoutError')),\r\n timeoutMs,\r\n );\r\n // deadline 触发后定时器自然释放;提前结束时由 GC 回收,无需显式清理\r\n void timer;\r\n return merged.signal;\r\n}\r\n\r\n/**\r\n * 从 ModelConfig 解析生效的重试上限与整体时限,缺省时填充框架默认值。\r\n */\r\nexport function resolveModelCallPolicy(config?: { maxRetries?: number; timeoutMs?: number }): {\r\n maxRetries: number;\r\n timeoutMs: number | undefined;\r\n} {\r\n let maxRetries = DEFAULT_MODEL_MAX_RETRIES;\r\n if (typeof config?.maxRetries === 'number' && Number.isFinite(config.maxRetries) && config.maxRetries >= 0) {\r\n maxRetries = Math.floor(config.maxRetries);\r\n }\r\n let timeoutMs: number | undefined = DEFAULT_MODEL_TIMEOUT_MS;\r\n if (config?.timeoutMs !== undefined) {\r\n const v = config.timeoutMs;\r\n timeoutMs = typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : undefined;\r\n }\r\n return { maxRetries, timeoutMs };\r\n}\r\n","/**\r\n * 反向钩子注册表\r\n *\r\n * 管理反向钩子的注册、发现和执行\r\n */\r\n\r\nimport type { AgentFeature } from './feature.js';\r\nimport { CoreLifecycle, Decision, type DecisionResult, normalizeDecision } from './lifecycle.js';\r\nimport {\r\n readHookDeclarations,\r\n validateHookDeclarations,\r\n issuesToError,\r\n type HookKind,\r\n type GuardRole,\r\n} from './hook-declarations.js';\r\nimport type { DecisionContext, HookLifecycleSnapshot } from './types.js';\r\nimport { createLogger, runWithLogScope } from './logging.js';\r\n\r\nconst logger = createLogger('agent.reverse-hook');\r\n\r\n/**\r\n * 钩子执行结果\r\n */\r\nexport interface HookExecutionResult {\r\n /** 是否有钩子被处理 */\r\n handled: boolean;\r\n /** 决策结果(仅当有流程控制能力时) */\r\n decision?: Decision;\r\n /** 拒绝原因(如果被拒绝) */\r\n reason?: string;\r\n /** 附加元数据 */\r\n metadata?: Record<string, any>;\r\n}\r\n\r\nexport interface HookInvocation {\r\n featureName: string;\r\n methodName: string;\r\n lifecycle: CoreLifecycle;\r\n kind: HookKind;\r\n role?: GuardRole;\r\n durationMs: number;\r\n decision?: Decision;\r\n /** 关联对象(如工具名):ToolUse/ToolResultTransform 等工具级生命周期携带 */\r\n subject?: string;\r\n}\r\n\r\nexport type HookInvocationObserver = (invocation: HookInvocation) => void;\r\n\r\nexport interface RegisteredHook {\r\n feature: AgentFeature;\r\n methodName: string;\r\n source?: { file?: string; line?: number; column?: number; display: string };\r\n enabled: boolean;\r\n /** 三原语:来自静态声明(static hooks) */\r\n kind: HookKind;\r\n /** guard 角色(policy 先于 advisor)。仅 kind='guard' 条目存在。 */\r\n role?: GuardRole;\r\n}\r\n\r\n/**\r\n * 钩子注册表\r\n *\r\n * 管理所有 Feature 的反向钩子\r\n */\r\nexport class HooksRegistry {\r\n /** 生命周期 → Feature 映射 → 方法名 */\r\n private hooks = new Map<CoreLifecycle, Array<RegisteredHook>>();\r\n private invocationObservers = new Set<HookInvocationObserver>();\r\n\r\n observeInvocations(observer: HookInvocationObserver): () => void {\r\n this.invocationObservers.add(observer);\r\n return () => this.invocationObservers.delete(observer);\r\n }\r\n\r\n private notifyInvocation(invocation: HookInvocation): void {\r\n for (const observer of this.invocationObservers) {\r\n try {\r\n observer(invocation);\r\n } catch {\r\n // 观察者不得影响 Hook 执行路径。\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 从 Feature 收集反向钩子\r\n *\r\n * 唯一入口:静态声明(static hooks)。\r\n * 没有声明 = 没有反向钩子,不存在第二条注册路径。\r\n * 声明校验失败直接抛错——装配错误不许运行时碰运气。\r\n *\r\n * @param feature Feature 实例\r\n */\r\n collectFromFeature(feature: AgentFeature): void {\r\n const declarations = readHookDeclarations(feature);\r\n\r\n if (Object.keys(declarations).length === 0) {\r\n return;\r\n }\r\n\r\n const issues = validateHookDeclarations(feature);\r\n if (issues.length > 0) {\r\n throw issuesToError(issues);\r\n }\r\n\r\n // policy 唯一性防守(覆盖 mountFeature 动态挂载场景;\r\n // 全量装配路径由 validatePolicyUniqueness 在 ensureFeatureTools 前置校验)\r\n for (const [method, decl] of Object.entries(declarations)) {\r\n if (decl.kind !== 'guard' || decl.role !== 'policy') continue;\r\n const existing = (this.hooks.get(decl.lifecycle) || [])\r\n .find(h => h.kind === 'guard' && h.role === 'policy' && h.feature !== feature);\r\n if (existing) {\r\n throw issuesToError([{\r\n feature: feature.name,\r\n method,\r\n code: 'duplicate_policy',\r\n message: `lifecycle '${decl.lifecycle}' 已有 '${existing.feature.name}#${existing.methodName}' 注册为 policy guard,'${feature.name}#${method}' 不能再次注册。修复:保留一个 policy,其余改为 role: 'advisor'。`,\r\n }]);\r\n }\r\n }\r\n\r\n for (const [method, decl] of Object.entries(declarations)) {\r\n if (!this.hooks.has(decl.lifecycle)) {\r\n this.hooks.set(decl.lifecycle, []);\r\n }\r\n this.hooks.get(decl.lifecycle)!.push({\r\n feature,\r\n methodName: method,\r\n source: undefined,\r\n enabled: true,\r\n kind: decl.kind,\r\n role: decl.role,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 移除 Feature 的所有钩子\r\n *\r\n * @param feature Feature 实例\r\n */\r\n removeFromFeature(feature: AgentFeature): void {\r\n for (const hooks of this.hooks.values()) {\r\n // 过滤掉属于该 Feature 的所有钩子\r\n const filtered = hooks.filter(h => h.feature !== feature);\r\n hooks.length = 0;\r\n hooks.push(...filtered);\r\n }\r\n }\r\n\r\n /**\r\n * 检查是否有指定的钩子\r\n *\r\n * @param lifecycle 生命周期类型\r\n * @returns 是否存在钩子\r\n */\r\n has(lifecycle: CoreLifecycle): boolean {\r\n const hooks = this.hooks.get(lifecycle);\r\n return hooks !== undefined && hooks.length > 0;\r\n }\r\n\r\n /**\r\n * 获取指定生命周期的所有钩子\r\n *\r\n * @param lifecycle 生命周期类型\r\n * @returns 钩子列表\r\n */\r\n get(lifecycle: CoreLifecycle): Array<RegisteredHook> {\r\n return this.hooks.get(lifecycle) || [];\r\n }\r\n\r\n /**\r\n * 禁用钩子(运行时跳过执行,不影响注册状态)\r\n *\r\n * @returns 是否成功(钩子存在且之前为启用状态)\r\n */\r\n disableHook(lifecycle: CoreLifecycle, featureName: string, methodName: string): boolean {\r\n const hooks = this.hooks.get(lifecycle);\r\n if (!hooks) return false;\r\n\r\n const entry = hooks.find(h => h.feature.name === featureName && h.methodName === methodName);\r\n if (!entry || !entry.enabled) return false;\r\n\r\n entry.enabled = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * 启用钩子\r\n *\r\n * @returns 是否成功(钩子存在且之前为禁用状态)\r\n */\r\n enableHook(lifecycle: CoreLifecycle, featureName: string, methodName: string): boolean {\r\n const hooks = this.hooks.get(lifecycle);\r\n if (!hooks) return false;\r\n\r\n const entry = hooks.find(h => h.feature.name === featureName && h.methodName === methodName);\r\n if (!entry || entry.enabled) return false;\r\n\r\n entry.enabled = true;\r\n return true;\r\n }\r\n\r\n getSnapshot(): HookLifecycleSnapshot[] {\r\n return Object.values(CoreLifecycle).map((lifecycle) => {\r\n const registered = this.hooks.get(lifecycle) || [];\r\n const entries = registered.map((hook, index) => ({\r\n order: index + 1,\r\n featureName: hook.feature.name,\r\n methodName: hook.methodName,\r\n lifecycle,\r\n kind: hook.kind,\r\n role: hook.role,\r\n source: hook.source,\r\n description: typeof (hook.feature as any).getHookDescription === 'function'\r\n ? (hook.feature as any).getHookDescription(lifecycle, hook.methodName)\r\n : undefined,\r\n enabled: hook.enabled,\r\n }));\r\n\r\n return {\r\n lifecycle,\r\n // 生命周期级三原语汇总(桶内有 guard → guard,有 transform → transform,否则 observe)\r\n kind: summarizeLifecycleKind(registered.map(h => h.kind)),\r\n entries,\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * 执行指定生命周期的所有反向钩子\r\n *\r\n * @param lifecycle 生命周期类型\r\n * @param context 决策上下文\r\n * @returns 执行结果\r\n */\r\n async execute(lifecycle: CoreLifecycle, context: DecisionContext): Promise<HookExecutionResult> {\r\n const allHooks = this.hooks.get(lifecycle);\r\n\r\n if (!allHooks || allHooks.length === 0) {\r\n return { handled: false };\r\n }\r\n\r\n // 入口快照:冻结本次 dispatch 的有效钩子\r\n // mid-dispatch 的 enable/disable 不影响本次执行,从下一次生命周期触发生效\r\n const activeHooks = allHooks.filter(h => h.enabled);\r\n\r\n if (activeHooks.length === 0) {\r\n return { handled: false };\r\n }\r\n\r\n // 三原语顺序法则(工作项 A1):\r\n // - guard:policy 先于 advisor(组内保持注册序)\r\n // - observe:无序(框架按注册序执行仅为日志可复现)\r\n const orderedHooks = orderHooks(activeHooks);\r\n\r\n // 按顺序执行所有钩子\r\n for (const { feature, methodName, source, kind, role } of orderedHooks) {\r\n try {\r\n const method = (feature as any)[methodName];\r\n if (typeof method !== 'function') {\r\n console.warn(\r\n `[HooksRegistry] 钩子方法 ${methodName} 在 Feature ${feature.name} 中不存在`\r\n );\r\n continue;\r\n }\r\n\r\n const invocationStartedAt = Date.now();\r\n const result = await runWithLogScope({\r\n feature: feature.name,\r\n lifecycle,\r\n hookMethod: methodName,\r\n hookKind: kind,\r\n sourceFile: source?.file,\r\n sourceLine: source?.line,\r\n namespace: 'agent.reverse-hook',\r\n tags: [\r\n 'reverse-hook',\r\n `feature:${feature.name}`,\r\n `hook:${lifecycle}`,\r\n `hook-method:${methodName}`,\r\n ],\r\n }, async () => {\r\n const startedAt = Date.now();\r\n try {\r\n return await method.call(feature, context);\r\n } finally {\r\n // feature 事件流(C 项):hook.invoked 事件,context 由本 scope 提供\r\n logger.info(`${feature.name}.${methodName} invoked (${lifecycle})`, {\r\n event: 'hook.invoked',\r\n durationMs: Date.now() - startedAt,\r\n });\r\n }\r\n });\r\n\r\n const decision = kind === 'guard' ? normalizeDecision(result) : undefined;\r\n const subject = (context as { toolName?: unknown; call?: { name?: unknown } })?.toolName\r\n ?? (context as { call?: { name?: unknown } })?.call?.name;\r\n this.notifyInvocation({\r\n featureName: feature.name,\r\n methodName,\r\n lifecycle,\r\n kind,\r\n role,\r\n durationMs: Date.now() - invocationStartedAt,\r\n ...(decision ? { decision } : {}),\r\n ...(typeof subject === 'string' && subject ? { subject } : {}),\r\n });\r\n\r\n // observe / transform 条目:返回值由框架直接丢弃。\r\n // 消灭已知坑:void 钩子意外返回 'approve' 字符串静默短路同批观察者。\r\n // (transform 的正确调度是 executeTransform 链式执行)\r\n if (kind !== 'guard') {\r\n continue;\r\n }\r\n\r\n // guard:Approve 或 Deny 立即停止;Continue 继续下一个钩子。\r\n if (decision === Decision.Approve || decision === Decision.Deny) {\r\n logger.info('Reverse hook decided flow', {\r\n feature: feature.name,\r\n lifecycle,\r\n methodName,\r\n decision,\r\n });\r\n return {\r\n handled: true,\r\n decision,\r\n reason: typeof result === 'object' && result.reason ? result.reason : undefined,\r\n metadata: typeof result === 'object' && result.metadata ? result.metadata : undefined,\r\n };\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n logger.error('Reverse hook execution failed', {\r\n feature: feature.name,\r\n lifecycle,\r\n methodName,\r\n message,\r\n });\r\n console.error(\r\n `[HooksRegistry] 执行钩子 ${CoreLifecycle[lifecycle]}#${methodName} 时出错: ${message}`\r\n );\r\n // 继续执行下一个钩子\r\n }\r\n }\r\n\r\n // 所有钩子都返回 Continue 或没有明确返回值\r\n return { handled: true, decision: Decision.Continue };\r\n }\r\n\r\n /**\r\n * 执行有流程控制能力的钩子(返回 DecisionResult)\r\n *\r\n * @param lifecycle 生命周期类型\r\n * @param context 决策上下文\r\n * @returns 决策结果\r\n */\r\n async executeDecision(\r\n lifecycle: CoreLifecycle,\r\n context: DecisionContext\r\n ): Promise<DecisionResult> {\r\n const result = await this.execute(lifecycle, context);\r\n\r\n if (!result.handled) {\r\n return Decision.Continue;\r\n }\r\n\r\n if (result.decision === Decision.Approve) {\r\n return { action: Decision.Approve, reason: result.reason, metadata: result.metadata };\r\n }\r\n\r\n if (result.decision === Decision.Deny) {\r\n return { action: Decision.Deny, reason: result.reason, metadata: result.metadata };\r\n }\r\n\r\n return Decision.Continue;\r\n }\r\n\r\n /**\r\n * 执行无流程控制能力的钩子(返回 void)\r\n *\r\n * @param lifecycle 生命周期类型\r\n * @param context 决策上下文\r\n */\r\n async executeVoid(lifecycle: CoreLifecycle, context: DecisionContext): Promise<void> {\r\n await this.execute(lifecycle, context);\r\n }\r\n\r\n /**\r\n * 执行数据变换钩子(链式,返回变换后的数据)\r\n *\r\n * 每个钩子接收上下文(其中包含当前 result),返回新的 result 替换之。\r\n * 返回 undefined 表示不修改,继续传递当前值。\r\n * 某个钩子抛异常时跳过该钩子,继续传递当前值(不中断链)。\r\n *\r\n * @param lifecycle 生命周期类型(应为 ToolResultTransform)\r\n * @param initialResult 初始结果\r\n * @param buildContext 根据当前结果构建上下文的函数\r\n * @returns 变换后的结果\r\n */\r\n async executeTransform<T>(\r\n lifecycle: CoreLifecycle,\r\n initialResult: T,\r\n buildContext: (current: T) => DecisionContext,\r\n ): Promise<T> {\r\n const allHooks = this.hooks.get(lifecycle);\r\n\r\n if (!allHooks || allHooks.length === 0) {\r\n return initialResult;\r\n }\r\n\r\n // 入口快照:冻结本次 dispatch 的有效钩子\r\n const activeHooks = allHooks.filter(h => h.enabled);\r\n\r\n if (activeHooks.length === 0) {\r\n return initialResult;\r\n }\r\n\r\n let current = initialResult;\r\n\r\n for (const { feature, methodName, source } of activeHooks) {\r\n try {\r\n const method = (feature as any)[methodName];\r\n if (typeof method !== 'function') {\r\n console.warn(\r\n `[HooksRegistry] 变换钩子方法 ${methodName} 在 Feature ${feature.name} 中不存在`\r\n );\r\n continue;\r\n }\r\n\r\n const ctx = buildContext(current);\r\n const invocationStartedAt = Date.now();\r\n const returned = await runWithLogScope({\r\n feature: feature.name,\r\n lifecycle,\r\n hookMethod: methodName,\r\n hookKind: 'transform',\r\n sourceFile: source?.file,\r\n sourceLine: source?.line,\r\n namespace: 'agent.reverse-hook',\r\n tags: [\r\n 'transform-hook',\r\n `feature:${feature.name}`,\r\n `hook:${lifecycle}`,\r\n `hook-method:${methodName}`,\r\n ],\r\n }, async () => {\r\n const startedAt = Date.now();\r\n try {\r\n return await method.call(feature, ctx);\r\n } finally {\r\n // feature 事件流(C 项):hook.invoked 事件\r\n logger.info(`${feature.name}.${methodName} invoked (${lifecycle})`, {\r\n event: 'hook.invoked',\r\n durationMs: Date.now() - startedAt,\r\n });\r\n }\r\n });\r\n\r\n const transformSubject = (ctx as { toolName?: unknown }).toolName;\r\n this.notifyInvocation({\r\n featureName: feature.name,\r\n methodName,\r\n lifecycle,\r\n kind: 'transform',\r\n durationMs: Date.now() - invocationStartedAt,\r\n ...(typeof transformSubject === 'string' && transformSubject ? { subject: transformSubject } : {}),\r\n });\r\n if (returned !== undefined) {\r\n current = returned as T;\r\n }\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n logger.error('Transform hook execution failed', {\r\n feature: feature.name,\r\n lifecycle,\r\n methodName,\r\n message,\r\n });\r\n console.error(\r\n `[HooksRegistry] 执行变换钩子 ${CoreLifecycle[lifecycle]}#${methodName} 时出错: ${message}`\r\n );\r\n // 继续传递当前值,不中断链\r\n }\r\n }\r\n\r\n return current;\r\n }\r\n\r\n /**\r\n * 清空所有钩子\r\n */\r\n clear(): void {\r\n this.hooks.clear();\r\n }\r\n}\r\n\r\n// ========== 工具函数 ==========\r\n\r\n/**\r\n * guard 顺序法则:policy 先于 advisor,组内保持注册序(稳定分区)。\r\n *\r\n * observe/transform 条目不参与裁决,排在 guard 之后保持注册序\r\n * (observe 无序;transform 不应出现在 execute() 调度中)。\r\n */\r\nexport function orderHooks(hooks: Array<RegisteredHook>): Array<RegisteredHook> {\r\n const policies: Array<RegisteredHook> = [];\r\n const advisors: Array<RegisteredHook> = [];\r\n const rest: Array<RegisteredHook> = [];\r\n\r\n for (const hook of hooks) {\r\n if (hook.kind === 'guard' && hook.role === 'policy') {\r\n policies.push(hook);\r\n } else if (hook.kind === 'guard') {\r\n advisors.push(hook);\r\n } else {\r\n rest.push(hook);\r\n }\r\n }\r\n\r\n return [...policies, ...advisors, ...rest];\r\n}\r\n\r\n/** 生命周期级三原语汇总:桶内有 guard → guard,有 transform → transform,否则 observe */\r\nfunction summarizeLifecycleKind(kinds: Array<RegisteredHook['kind']>): HookKind {\r\n if (kinds.some(k => k === 'guard')) return 'guard';\r\n if (kinds.some(k => k === 'transform')) return 'transform';\r\n return 'observe';\r\n}\r\n\r\n/**\r\n * 创建全局钩子注册表\r\n */\r\nexport function createHooksRegistry(): HooksRegistry {\r\n return new HooksRegistry();\r\n}\r\n","import type { Context, ContextSnapshot } from './context.js';\nimport type { AgentFeature, FeatureStateSnapshot } from './feature.js';\n\nexport interface FeatureCheckpoint {\n featureName: string;\n snapshot: FeatureStateSnapshot;\n}\n\nexport interface StepCheckpoint {\n context: ContextSnapshot;\n features: FeatureCheckpoint[];\n}\n\nfunction cloneFeatureSnapshot(snapshot: FeatureStateSnapshot): FeatureStateSnapshot {\n if (typeof structuredClone === 'function') {\n return structuredClone(snapshot);\n }\n return JSON.parse(JSON.stringify(snapshot)) as FeatureStateSnapshot;\n}\n\nexport function createStepCheckpoint(\n context: Context,\n features?: Map<string, AgentFeature>,\n): StepCheckpoint {\n return {\n context: context.toJSON(),\n features: captureFeatureSnapshots(features),\n };\n}\n\nexport async function rollbackToStepCheckpoint(\n checkpoint: StepCheckpoint,\n context: Context,\n features?: Map<string, AgentFeature>,\n): Promise<void> {\n await restoreFeatureSnapshots(checkpoint.features, features, {\n beforeEach: async (feature, snapshot) => {\n await feature.beforeRollback?.(snapshot);\n },\n afterEach: async (feature, snapshot) => {\n await feature.afterRollback?.(snapshot);\n },\n });\n context.restore(checkpoint.context);\n}\n\nexport async function restoreFeatureSnapshots(\n checkpoints: FeatureCheckpoint[],\n features?: Map<string, AgentFeature>,\n hooks?: {\n beforeEach?: (feature: AgentFeature, snapshot: FeatureStateSnapshot) => Promise<void>;\n afterEach?: (feature: AgentFeature, snapshot: FeatureStateSnapshot) => Promise<void>;\n },\n): Promise<void> {\n const featureMap = features ?? new Map<string, AgentFeature>();\n\n for (const entry of checkpoints) {\n const feature = featureMap.get(entry.featureName);\n if (!feature || !feature.restoreState) continue;\n const snapshot = cloneFeatureSnapshot(entry.snapshot);\n await hooks?.beforeEach?.(feature, snapshot);\n await feature.restoreState(snapshot);\n await hooks?.afterEach?.(feature, snapshot);\n }\n}\n\nexport function captureFeatureSnapshots(features?: Map<string, AgentFeature>): FeatureCheckpoint[] {\n if (!features) return [];\n\n const checkpoints: FeatureCheckpoint[] = [];\n for (const [featureName, feature] of features.entries()) {\n if (!feature.captureState || !feature.restoreState) {\n continue;\n }\n checkpoints.push({\n featureName,\n snapshot: cloneFeatureSnapshot(feature.captureState()),\n });\n }\n return checkpoints;\n}\n","/**\n * Feature 热载(reload)— 模块加载与导出解析\n *\n * reloadFeature 的纯函数部分:\n * - resolveFeatureExport:从模块导出中定位 feature 类\n * - loadFeatureModule:cache-busting 动态 import(同路径重写后可拿到新代码)\n */\n\nimport { pathToFileURL } from 'url';\nimport { isAbsolute, resolve as resolvePath } from 'path';\nimport type { AgentFeature } from './feature.js';\n\n/**\n * reloadFeature 的结果。\n */\nexport interface FeatureReloadResult {\n featureName: string;\n /** captureState/restoreState 齐备且已完成迁移;false = 无状态契约(热载丢内存状态) */\n stateTransferred: boolean;\n /** 失败回退后为 true(reloadFeature 正常路径恒 false,失败时 throw) */\n rolledBack: false;\n durationMs: number;\n}\n\n/** reloadFeature 的可选行为开关。 */\nexport interface FeatureReloadOptions {\n /**\n * 严格初始化:getAsyncTools / onInitiate 失败视为 reload 失败并自动回退,\n * 而不是 warn 后继续以半初始化状态挂载。默认 false(保持既有语义)。\n */\n strictInit?: boolean;\n}\n\n/** initSingleFeature 严格模式抛出的错误标记(reload 据此标注 'init' 阶段)。 */\nexport interface FeatureInitFailureError extends Error {\n featureInitStage: 'getAsyncTools' | 'onInitiate';\n}\n\nexport function isFeatureInitFailureError(error: unknown): error is FeatureInitFailureError {\n return error instanceof Error && 'featureInitStage' in error;\n}\n\n/** reloadFeature 失败回退后重新抛出的错误标记(调用方可结构化消费)。 */\nexport interface FeatureReloadFailureError extends Error {\n /** 失败阶段:import / instantiate / state-transfer / mount / init */\n reloadStage: string;\n /** 恒 true:旧实例已恢复 */\n rolledBack: true;\n}\n\ntype FeatureConstructor = new (...args: never[]) => AgentFeature;\n\nfunction isConstructorLike(value: unknown): value is FeatureConstructor {\n return typeof value === 'function' && /^\\s*class\\s+/.test(\n Function.prototype.toString.call(value),\n );\n}\n\n/**\n * 从模块导出中定位 feature 类。\n *\n * 解析顺序:\n * 1. 与旧实例构造器同名的具名导出(零歧义,优先)\n * 2. 模块中唯一的 class 导出(热载模块的常见形态)\n * 3. default 导出(须为 class)\n *\n * 定位到的类在实例化后还会以 feature 的 name 属性做身份校验\n * (见 reloadFeature),类名不是最终身份锚点。\n */\nexport function resolveFeatureExport(\n moduleExports: Record<string, unknown>,\n className?: string,\n): FeatureConstructor {\n if (className && isConstructorLike(moduleExports[className])) {\n return moduleExports[className];\n }\n const classExports = Object.entries(moduleExports).filter(\n (entry): entry is [string, FeatureConstructor] => isConstructorLike(entry[1]),\n );\n if (classExports.length === 1) {\n return classExports[0][1];\n }\n if (isConstructorLike(moduleExports.default)) {\n return moduleExports.default;\n }\n const available = Object.keys(moduleExports).filter(k => k !== 'default');\n throw new Error(\n `Feature reload failed: no matching export${className ? ` for class '${className}'` : ''} ` +\n `(candidates must be a single class export, a matching name, or a class default export). ` +\n `available exports: ${available.join(', ') || '(none)'}`,\n );\n}\n\n/**\n * cache-busting 动态 import。\n *\n * 同一路径重写模块源码后,ESM 默认按 URL 缓存模块——\n * 追加时间戳 query 强制重新加载,这是热载语义的核心。\n *\n * @param modulePath 绝对路径或 file:// URL\n */\nexport async function importFeatureModuleFresh(modulePath: string): Promise<Record<string, unknown>> {\n const url = modulePath.startsWith('file://')\n ? modulePath\n : pathToFileURL(isAbsolute(modulePath) ? modulePath : resolvePath(modulePath)).href;\n const bustingUrl = `${url}${url.includes('?') ? '&' : '?'}reload=${Date.now()}`;\n const mod = await import(/* @vite-ignore */ bustingUrl);\n return mod as Record<string, unknown>;\n}\n\n/**\n * 加载模块并解析 feature 类。\n */\nexport async function loadFeatureModule(\n modulePath: string,\n className?: string,\n): Promise<FeatureConstructor> {\n const moduleExports = await importFeatureModuleFresh(modulePath);\n return resolveFeatureExport(moduleExports, className);\n}\n","/**\n * UsageStats - 用量统计系统\n *\n * 职责:\n * - 记录 LLM 调用的 token 用量\n * - 聚合 session/call/step 三级统计\n * - 提供快照序列化和恢复\n * - 格式化用量报告\n *\n * 设计原则:\n * - 框架内置,不是 Feature\n * - 自动收集,不需要手动干预\n * - 快照包含 session 级数据,用于会话恢复\n */\n\n/**\n * 统一用量格式(兼容 Anthropic 和 OpenAI)\n */\nexport interface UsageInfo {\n /** 输入 token 数 */\n inputTokens: number;\n /** 输出 token 数 */\n outputTokens: number;\n /** 总 token 数 */\n totalTokens: number;\n\n // ========== Anthropic 特有(可选)==========\n /** 创建缓存消耗的 token 数 */\n cacheCreationTokens?: number;\n /** 从缓存读取的 token 数 */\n cacheReadTokens?: number;\n\n // ========== OpenAI 特有(可选)==========\n /** 推理 token 数(prompt_tokens_details 或 completion_tokens_details) */\n reasoningTokens?: number;\n /** 音频 token 数 */\n audioTokens?: number;\n}\n\n/**\n * 单步用量记录\n */\ninterface StepUsageRecord {\n callIndex: number;\n step: number;\n usage: UsageInfo;\n timestamp: number;\n}\n\n/**\n * 单次 Call 用量汇总\n */\nexport interface CallUsageSummary {\n callIndex: number;\n totalUsage: UsageInfo;\n stepCount: number;\n cacheHitRequests: number;\n startTime: number;\n endTime?: number;\n}\n\n/**\n * Session 用量快照(用于序列化)\n */\nexport interface UsageStatsSnapshot {\n /** Session 级累计用量 */\n totalUsage: UsageInfo;\n /** 各 Call 的用量汇总 */\n calls: CallUsageSummary[];\n /** 总请求数(LLM 调用次数) */\n totalRequests: number;\n /** 命中缓存的请求数(request-level) */\n totalCacheHitRequests: number;\n /** 最后一次请求的用量(用于显示当前上下文占用) */\n lastRequestUsage?: UsageInfo;\n}\n\n/**\n * 用量统计类\n */\nexport class UsageStats {\n /** Session 级累计用量 */\n private totalUsage: UsageInfo = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n\n /** 当前活跃 Call 的用量记录 */\n private currentCallUsage: Map<number, CallUsageSummary> = new Map();\n\n /** 总 LLM 调用次数 */\n private totalRequests: number = 0;\n\n /** 命中缓存的总请求数 */\n private totalCacheHitRequests: number = 0;\n\n /** 当前 Call 的 Step 记录(临时,用于聚合) */\n private currentStepRecords: StepUsageRecord[] = [];\n\n /** 最后一次 LLM 调用的用量(用于显示当前上下文占用) */\n private lastRequestUsage: UsageInfo | null = null;\n\n /**\n * 记录一次 LLM 调用的用量\n * @param callIndex Call 序号\n * @param step Step 序号\n * @param usage 用量数据\n */\n record(callIndex: number, step: number, usage: UsageInfo): void {\n // 累加到总计\n this.totalUsage.inputTokens += usage.inputTokens;\n this.totalUsage.outputTokens += usage.outputTokens;\n this.totalUsage.totalTokens += usage.totalTokens;\n\n // 累加可选字段\n if (usage.cacheCreationTokens) {\n this.totalUsage.cacheCreationTokens = (this.totalUsage.cacheCreationTokens || 0) + usage.cacheCreationTokens;\n }\n if (usage.cacheReadTokens) {\n this.totalUsage.cacheReadTokens = (this.totalUsage.cacheReadTokens || 0) + usage.cacheReadTokens;\n }\n if (usage.reasoningTokens) {\n this.totalUsage.reasoningTokens = (this.totalUsage.reasoningTokens || 0) + usage.reasoningTokens;\n }\n if (usage.audioTokens) {\n this.totalUsage.audioTokens = (this.totalUsage.audioTokens || 0) + usage.audioTokens;\n }\n\n // 记录 Step\n this.currentStepRecords.push({\n callIndex,\n step,\n usage,\n timestamp: Date.now(),\n });\n\n this.totalRequests++;\n\n // 更新当前 Call 的汇总\n let callSummary = this.currentCallUsage.get(callIndex);\n if (!callSummary) {\n callSummary = {\n callIndex,\n totalUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n stepCount: 0,\n cacheHitRequests: 0,\n startTime: Date.now(),\n };\n this.currentCallUsage.set(callIndex, callSummary);\n }\n\n callSummary.totalUsage.inputTokens += usage.inputTokens;\n callSummary.totalUsage.outputTokens += usage.outputTokens;\n callSummary.totalUsage.totalTokens += usage.totalTokens;\n callSummary.stepCount++;\n\n // 累加可选字段到 Call 级\n if (usage.cacheCreationTokens) {\n callSummary.totalUsage.cacheCreationTokens = (callSummary.totalUsage.cacheCreationTokens || 0) + usage.cacheCreationTokens;\n }\n if (usage.cacheReadTokens) {\n callSummary.totalUsage.cacheReadTokens = (callSummary.totalUsage.cacheReadTokens || 0) + usage.cacheReadTokens;\n callSummary.cacheHitRequests++;\n this.totalCacheHitRequests++;\n }\n if (usage.reasoningTokens) {\n callSummary.totalUsage.reasoningTokens = (callSummary.totalUsage.reasoningTokens || 0) + usage.reasoningTokens;\n }\n if (usage.audioTokens) {\n callSummary.totalUsage.audioTokens = (callSummary.totalUsage.audioTokens || 0) + usage.audioTokens;\n }\n\n // 更新最后一次请求的用量(用于UI显示当前上下文占用)\n this.lastRequestUsage = { ...usage };\n }\n\n /**\n * 标记 Call 结束\n * @param callIndex Call 序号\n */\n endCall(callIndex: number): void {\n const callSummary = this.currentCallUsage.get(callIndex);\n if (callSummary) {\n callSummary.endTime = Date.now();\n }\n }\n\n /**\n * 获取 Session 级累计用量\n */\n getTotalUsage(): UsageInfo {\n return { ...this.totalUsage };\n }\n\n /**\n * 获取指定 Call 的用量汇总\n * @param callIndex Call 序号\n */\n getCallUsage(callIndex: number): CallUsageSummary | undefined {\n const summary = this.currentCallUsage.get(callIndex);\n return summary ? { ...summary, totalUsage: { ...summary.totalUsage } } : undefined;\n }\n\n /**\n * 获取所有 Call 的用量汇总\n */\n getAllCallUsage(): CallUsageSummary[] {\n return Array.from(this.currentCallUsage.values()).map(s => ({ ...s, totalUsage: { ...s.totalUsage } }));\n }\n\n /**\n * 获取总请求次数\n */\n getTotalRequests(): number {\n return this.totalRequests;\n }\n\n getTotalCacheHitRequests(): number {\n return this.totalCacheHitRequests;\n }\n\n /**\n * 获取最后一次请求的用量(用于显示当前上下文占用)\n */\n getLastRequestUsage(): UsageInfo | null {\n return this.lastRequestUsage ? { ...this.lastRequestUsage } : null;\n }\n\n /**\n * 获取格式化的用量报告\n */\n getReport(): string {\n const u = this.totalUsage;\n const parts = [\n `Total: ${u.totalTokens.toLocaleString()} tokens`,\n ` Input: ${u.inputTokens.toLocaleString()}`,\n ` Output: ${u.outputTokens.toLocaleString()}`,\n ];\n\n if (u.cacheCreationTokens || u.cacheReadTokens) {\n parts.push(\n ` Cache Read: ${u.cacheReadTokens?.toLocaleString() || 0}`,\n ` Cache Creation: ${u.cacheCreationTokens?.toLocaleString() || 0}`\n );\n }\n\n if (u.reasoningTokens) {\n parts.push(` Reasoning: ${u.reasoningTokens.toLocaleString()}`);\n }\n\n parts.push(`Requests: ${this.totalRequests.toLocaleString()}`);\n\n return parts.join('\\n');\n }\n\n /**\n * 创建快照(用于序列化)\n */\n toSnapshot(): UsageStatsSnapshot {\n return {\n totalUsage: { ...this.totalUsage },\n calls: this.getAllCallUsage(),\n totalRequests: this.totalRequests,\n totalCacheHitRequests: this.totalCacheHitRequests,\n lastRequestUsage: this.lastRequestUsage ? { ...this.lastRequestUsage } : undefined,\n };\n }\n\n /**\n * 从快照恢复\n */\n fromSnapshot(snapshot: UsageStatsSnapshot): void {\n this.totalUsage = { ...snapshot.totalUsage };\n this.totalRequests = snapshot.totalRequests;\n this.totalCacheHitRequests = snapshot.totalCacheHitRequests ?? 0;\n this.currentCallUsage.clear();\n for (const call of snapshot.calls) {\n this.currentCallUsage.set(call.callIndex, { ...call });\n }\n // 恢复最后一次请求的用量\n this.lastRequestUsage = snapshot.lastRequestUsage ? { ...snapshot.lastRequestUsage } : null;\n // Step 记录不恢复,因为它是临时的中间数据\n this.currentStepRecords = [];\n }\n\n /**\n * 重置统计(谨慎使用)\n */\n reset(): void {\n this.totalUsage = {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n this.currentCallUsage.clear();\n this.currentStepRecords = [];\n this.totalRequests = 0;\n this.totalCacheHitRequests = 0;\n this.lastRequestUsage = null;\n }\n}\n","/**\r\n * Agent - 组装所有组件\r\n * 提供简单的使用接口 - v4 重构版\r\n *\r\n * 重构说明:\r\n * - 钩子执行器移至 agent/hooks-executor.ts\r\n * - 生命周期钩子移至 agent/lifecycle-hooks.ts(使用 Mixin 模式)\r\n * - 模板解析器移至 agent/template-resolver.ts\r\n * - 工具执行器移至 agent/tool-executor.ts\r\n * - ReAct 循环移至 agent/react-loop.ts\r\n */\r\n\r\nimport type { AgentConfig, ToolCall, Tool, Message, HookInspectorSnapshot, UsageInfo, AgentOverviewSnapshot, ImageInput, LLMMeta } from './types.js';\r\nimport type { AgentFeature, FeatureInitContext, FeatureContext, ContextInjector } from './feature.js';\r\nimport type { TemplateSource, PlaceholderContext } from '../template/types.js';\r\nimport { ToolRegistry } from './tool.js';\r\nimport { Context, type ContextSnapshot } from './context.js';\r\nimport { DebugHub } from './debug-hub.js';\r\nimport { createLogger, installConsoleBridge, runWithLogScope } from './logging.js';\r\nimport { runWithNotificationScope } from './notification.js';\r\nimport { captureFeatureSnapshots, restoreFeatureSnapshots } from './checkpoint.js';\r\nimport { loadFeatureModule, isFeatureInitFailureError, type FeatureReloadOptions, type FeatureReloadResult, type FeatureInitFailureError, type FeatureReloadFailureError } from './feature-reload.js';\r\nimport { preflightAssembly } from './feature-preflight.js';\r\nimport { CapabilityRegistry } from './capability.js';\r\nimport type {\r\n CapabilityContext,\r\n CapabilityEntryPoint,\r\n CapabilityInvokeResult,\r\n CapabilitySnapshot,\r\n} from './capability.js';\r\nimport type { CallContinuationRequest } from './continuation.js';\r\nimport {\r\n getDefaultSessionStore,\r\n type AgentRuntimeSnapshot,\r\n type RuntimeStateWithoutContext,\r\n type AgentSessionSnapshot,\r\n type SessionStore,\r\n type CallRollbackSnapshot,\r\n type CallRollbackSnapshotV2,\r\n type NamedCheckpoint,\r\n} from './session-store.js';\r\nimport type { ContextBoundaryV2 } from './context.js';\r\nimport { UsageStats, type UsageStatsSnapshot } from './usage.js';\r\nimport type {\r\n ToolContext,\r\n ToolResult,\r\n HookResult,\r\n AgentInitiateContext,\r\n AgentDestroyContext,\r\n AgentInterruptContext,\r\n CallStartContext,\r\n CallFinishContext,\r\n StepStartContext,\r\n StepFinishedContext,\r\n SubAgentSpawnContext,\r\n SubAgentUpdateContext,\r\n SubAgentDestroyContext,\r\n SubAgentInterruptContext,\r\n} from './lifecycle.js';\r\nimport { TemplateComposer } from '../template/composer.js';\r\nimport { DataSourceRegistry } from '../template/data-source.js';\r\nimport { TemplateLoader } from '../template/loader.js';\r\nimport { discover } from '../skills/loader.js';\r\nimport type { SkillMetadata } from '../skills/types.js';\r\nimport { existsSync, realpathSync } from 'fs';\r\nimport { dirname, join, relative, sep } from 'path';\r\nimport { fileURLToPath } from 'url';\r\n\r\n// 导入重构后的模块\r\nimport { HookErrorHandling, executeHook } from './agent/hooks-executor.js';\r\nimport { type LifecycleHooks } from './agent/lifecycle-hooks.js';\r\nimport { TemplateResolver } from './agent/template-resolver.js';\r\nimport { resolveFeatureOrder, orderErrorsToError } from './feature-graph.js';\r\nimport { validatePolicyUniqueness, issuesToError } from './hook-declarations.js';\r\nimport { ToolExecutor } from './agent/tool-executor.js';\r\nimport { ReActLoopRunner } from './agent/react-loop.js';\r\nimport type { DebugPusher } from './agent/types.js';\r\n\r\n// 导入钩子注册表\r\nimport { HooksRegistry, type HookExecutionResult, type HookInvocationObserver } from './hooks-registry.js';\r\nimport { CoreLifecycle, Decision } from './lifecycle.js';\r\n\r\n// Re-export ContextSnapshot and HookErrorHandling for convenience\r\nexport type { ContextSnapshot };\r\nexport { HookErrorHandling };\r\nexport type { AgentSessionSnapshot, SessionStore };\r\n\r\n/**\r\n * 内部 call checkpoint 类型 — v2 union。\r\n * 新 checkpoint 为 'context-boundary',从老会话加载的为 'legacy-full-snapshot'。\r\n */\r\ntype CallRollbackCheckpoint = CallRollbackSnapshotV2;\r\n\r\n// 基础类(不含生命周期钩子)\r\nclass AgentBase {\r\n protected readonly logger = createLogger('agent.runtime');\r\n\r\n /**\r\n * feature 事件流 logger(C 项):生命周期事件必须自带 agentId/agentName\r\n * (mount/remove/reload 常在 onCall 之外调用,日志 scope 中没有 agent 上下文)\r\n */\r\n private featureEventLogger(featureName: string) {\r\n return this.logger.child({\r\n namespace: 'agent.features',\r\n feature: featureName,\r\n agentId: this.agentId,\r\n agentName: this.config?.name || this.constructor.name,\r\n });\r\n }\r\n // ========== 属性 ==========\r\n\r\n protected llm: AgentConfig['llm'];\r\n protected tools: ToolRegistry;\r\n protected maxTurns: number;\r\n protected systemMessage?: string | TemplateSource;\r\n protected config: AgentConfig;\r\n protected templateLoader: TemplateLoader;\r\n protected persistentContext?: Context;\r\n protected debugHub?: DebugHub;\r\n /** Stable process-local identity; Viewer attachment reuses this exact ID. */\r\n protected readonly agentId: string;\r\n protected debugEnabled: boolean = false;\r\n\r\n // 子代理相关\r\n protected _agentId?: string;\r\n protected _parentPool?: any; // AgentPool reference from parent\r\n\r\n // Agent 类型注册表(实例级,由子类构造函数自行注册可创建的子代理类型)\r\n private _agentTypeRegistry = new Map<string, () => AgentBase | Promise<AgentBase>>();\r\n\r\n // Feature 系统\r\n private features = new Map<string, AgentFeature>();\r\n private contextInjectors: Array<{\r\n pattern: string | RegExp;\r\n injector: ContextInjector;\r\n }> = [];\r\n private featureToolsReady: boolean = false;\r\n private featureToolsReadyPromise?: Promise<void>;\r\n\r\n // Capability 注册表(统一控制面,Feature 声明的命令平面寻址)\r\n private capabilities = new CapabilityRegistry();\r\n\r\n // 同一 Agent 实例维护单条会话状态链,因此 call 必须按提交顺序执行。\r\n // 队列始终被错误吸收,避免一次失败阻塞后续调用。\r\n private _callQueue: Promise<void> = Promise.resolve();\r\n private _activeCallPromise?: Promise<void>;\r\n private _lifecycleState: 'active' | 'disposing' | 'disposed' = 'active';\r\n private _disposePromise?: Promise<void>;\r\n\r\n // 反向钩子注册表\r\n private hooksRegistry = new HooksRegistry();\r\n\r\n // 生命周期状态\r\n protected _initialized: boolean = false;\r\n protected _currentCallInput?: string;\r\n protected _currentStep: number = 0; // ReAct 循环步骤序号\r\n protected _callIndex: number = -1; // 用户交互序号(onCall 次数)\r\n protected _callStartTimes: Map<number, number> = new Map();\r\n protected _callCheckpoints: CallRollbackCheckpoint[] = [];\r\n protected _namedCheckpoints: NamedCheckpoint[] = [];\r\n\r\n // 用量统计\r\n protected usageStats: UsageStats = new UsageStats();\r\n\r\n // Continuation request(控制工具通过 registerContinuationRequest 登记)\r\n private _continuationRequest: CallContinuationRequest | null = null;\r\n\r\n // 用户输入缓存(用于 Feature 修改待注入的输入内容)\r\n private _pendingInput: string | null = null;\r\n\r\n // 中断控制:外部可通过 interrupt() 中断正在运行的 onCall\r\n private _abortController: AbortController | null = null;\r\n private _lastCallOutcome: import('./lifecycle.js').CallOutcome | null = null;\r\n\r\n // Step 级自动保存配置\r\n private _stepAutoSave?: { sessionId: string; store: SessionStore };\r\n\r\n // 模块实例(延迟初始化)\r\n private templateResolver?: TemplateResolver;\r\n private toolExecutor?: ToolExecutor;\r\n private reactRunner?: ReActLoopRunner;\r\n\r\n /** Agent 级数据源注册表(per-Agent 实例,非进程全局) */\r\n private _dataSourceRegistry = new DataSourceRegistry();\r\n\r\n // ========== LLM 热切换 ==========\r\n /** 与 LLMClient 实例解耦的模型元数据 */\r\n private _llmMeta: LLMMeta = {};\r\n /** 外部消费者通过 onLLMSwap() 注册的回调 */\r\n private _llmSwapCallbacks: Array<(newLLM: AgentConfig['llm'], oldLLM: AgentConfig['llm']) => void> = [];\r\n\r\n constructor(config: AgentConfig) {\r\n installConsoleBridge();\r\n this.agentId = DebugHub.getInstance().allocateAgentId();\r\n this.config = config;\r\n this.llm = config.llm;\r\n this.maxTurns = config.maxTurns ?? 10;\r\n this.systemMessage = config.systemMessage;\r\n this.templateLoader = new TemplateLoader();\r\n this.tools = new ToolRegistry();\r\n\r\n // 如果 systemMessage 是 TemplateComposer,保存引用\r\n const templateComposer = config.systemMessage instanceof TemplateComposer\r\n ? config.systemMessage\r\n : undefined;\r\n\r\n // 初始化 TemplateResolver\r\n this.templateResolver = new TemplateResolver(\r\n this.systemMessage,\r\n undefined, // systemContext 将在 setSystemContext 中设置\r\n templateComposer,\r\n this.templateLoader,\r\n this._dataSourceRegistry\r\n );\r\n\r\n // 注册工具\r\n if (config.tools) {\r\n for (const tool of config.tools) {\r\n this.tools.register(tool);\r\n }\r\n }\r\n }\r\n\r\n observeHookInvocations(observer: HookInvocationObserver): () => void {\r\n return this.hooksRegistry.observeInvocations(observer);\r\n }\r\n\r\n // ========== 钩子错误处理策略 ============\r\n /**\r\n * 获取钩子的错误处理策略(可被子类覆盖)\r\n */\r\n public getHookErrorHandling(hookName: string): HookErrorHandling {\r\n const propagateHooks = [\r\n 'onCallStart', 'onCallFinish',\r\n 'onLLMStart', 'onLLMFinish',\r\n 'onToolUse', 'onToolFinished',\r\n ];\r\n return propagateHooks.includes(hookName) ? HookErrorHandling.Propagate : HookErrorHandling.Silent;\r\n }\r\n\r\n // ========== 公开方法 ==========\r\n\r\n /**\r\n * 设置待注入的用户输入\r\n *\r\n * Feature 可以在 CallStart 钩子中调用此方法来修改即将注入到上下文的输入内容\r\n * 典型用法:处理斜杠命令,去除命令前缀后更新输入\r\n *\r\n * @param input 新的输入内容\r\n */\r\n setUserInput(input: string): void {\r\n this._pendingInput = input;\r\n }\r\n\r\n /**\r\n * 获取当前待注入的用户输入\r\n *\r\n * Feature 可以在 CallStart 钩子中调用此方法来获取当前输入缓存\r\n * 用于链式处理或条件判断\r\n *\r\n * @returns 当前输入缓存,如果未设置则返回空字符串\r\n */\r\n getUserInput(): string {\r\n return this._pendingInput ?? '';\r\n }\r\n\r\n /**\r\n * 登记一个 continuation request\r\n *\r\n * 控制工具(如 checkpoint、rollback)在正常完成执行后调用此方法,\r\n * 使当前 onCall 在工具结果闭合后停止,并将请求传递给宿主。\r\n *\r\n * 该方法仅在 onCall 执行期间有效。onCall 开始时会清理上一次的遗留请求。\r\n */\r\n registerContinuationRequest(request: CallContinuationRequest): void {\r\n if (this._continuationRequest) {\r\n throw new Error(\r\n `Continuation request already registered: kind=${this._continuationRequest.kind}. ` +\r\n `Only one continuation request per onCall is allowed.`\r\n );\r\n }\r\n this._continuationRequest = request;\r\n this.logger.info('Continuation request registered', { kind: request.kind });\r\n }\r\n\r\n /**\r\n * 消费当前 continuation request(一次性)\r\n *\r\n * 宿主(如 CallArbiter)在 onCall 返回后调用此方法,\r\n * 判断是否需要在同一逻辑 envelope 内启动下一个 segment。\r\n *\r\n * - 请求只能消费一次,消费后自动清除。\r\n * - onCall 开始时也会清理上次未消费的请求。\r\n *\r\n * @returns 当前 continuation request,如果没有则返回 null\r\n */\r\n consumeContinuationRequest(): CallContinuationRequest | null {\r\n const request = this._continuationRequest;\r\n this._continuationRequest = null;\r\n return request;\r\n }\r\n\r\n /**\r\n * 唯一的公开入口 - 执行 Agent。\r\n *\r\n * 同一实例的会话状态不可并发访问;后续调用会按提交顺序排队。\r\n */\r\n async onCall(input: string, images?: ImageInput[], activations?: string[]): Promise<string> {\r\n const outcome = await this.onCallDetailed(input, images, activations);\r\n return outcome.response;\r\n }\r\n\r\n /**\r\n * 执行一次 Agent Call 并返回结构化终态。\r\n *\r\n * `onCall()` 保持字符串返回以兼容既有 Agent;宿主、CLI 与自动化调用\r\n * 应使用本方法根据 status/reason/error 判断实际执行结果。\r\n *\r\n * `activations` 是随本条输入流动的能力激活通知(capability refs),\r\n * 由输入管线(user-turn 元数据)携带,在 CallStart 反向钩子前派发给\r\n * 对应 feature 消费(见 dispatchTurnActivations)。\r\n */\r\n async onCallDetailed(input: string, images?: ImageInput[], activations?: string[]): Promise<import('./lifecycle.js').CallOutcome> {\r\n if (this._lifecycleState !== 'active') {\r\n throw new Error('Agent is disposing or has been disposed');\r\n }\r\n\r\n const queuedCall = this._callQueue.then(async () => {\r\n if (this._lifecycleState !== 'active') {\r\n throw new Error('Agent is disposing or has been disposed');\r\n }\r\n\r\n const execution = this.executeCall(input, images, activations);\r\n const completion = execution.then(() => undefined, () => undefined);\r\n this._activeCallPromise = completion;\r\n try {\r\n return await execution;\r\n } finally {\r\n if (this._activeCallPromise === completion) {\r\n this._activeCallPromise = undefined;\r\n }\r\n }\r\n });\r\n\r\n // 保持内部队列可继续推进,即使某个 call 失败。\r\n this._callQueue = queuedCall.then(() => undefined, () => undefined);\r\n return queuedCall;\r\n }\r\n\r\n /** 最近一次已结束 Call 的结构化终态;没有执行历史时返回 null。 */\r\n getLastCallOutcome(): import('./lifecycle.js').CallOutcome | null {\r\n return this._lastCallOutcome ? { ...this._lastCallOutcome } : null;\r\n }\r\n\r\n private async executeCall(input: string, images?: ImageInput[], activations?: string[]): Promise<import('./lifecycle.js').CallOutcome> {\r\n // 确保 Feature 工具已注册\r\n await this.ensureFeatureTools();\r\n if (this._lifecycleState !== 'active') {\r\n throw new Error('Agent is disposing or has been disposed');\r\n }\r\n\r\n // 清理上次 onCall 遗留的 continuation request\r\n this._continuationRequest = null;\r\n\r\n // ========== Call Start ==========\r\n const context = this.persistentContext ?? new Context();\r\n // Ensure persistentContext points to the active context immediately,\r\n // so that stepSaveFn (triggered after each ReAct step) saves the\r\n // correct context rather than a stale reference.\r\n this.persistentContext = context;\r\n const nextCallIndex = this._callIndex + 1;\r\n const isFirstCall = nextCallIndex === 0;\r\n const callStartTime = Date.now();\r\n const callId = Date.now();\r\n\r\n // 创建 AbortController 用于本次 call 的中断控制\r\n this._abortController = new AbortController();\r\n\r\n // 递增 callIndex(用户交互序号)\r\n this._callIndex = nextCallIndex;\r\n\r\n this._currentCallInput = input;\r\n this._callStartTimes.set(callId, callStartTime);\r\n\r\n const agentName = this.config.name || this.constructor.name;\r\n\r\n return runWithNotificationScope(this.agentId!, () =>\r\n runWithLogScope({\r\n agentId: this.agentId,\r\n agentName,\r\n callIndex: this._callIndex,\r\n tags: ['agent-call'],\r\n namespace: 'agent.call',\r\n }, async () => {\r\n this.logger.info('Call started', {\r\n isFirstCall,\r\n inputPreview: input.slice(0, 160),\r\n });\r\n\r\n // 触发 onCallStart(正向钩子)\r\n await executeHook(\r\n this,\r\n () => (this as any).onCallStart({ input, context, isFirstCall }),\r\n { hookName: 'onCallStart', input }\r\n );\r\n\r\n let preCallBoundary: ContextBoundaryV2 | undefined;\r\n let preCallRuntimeState: RuntimeStateWithoutContext | undefined;\r\n let finalInput: string | undefined;\r\n try {\r\n // ========== Agent Initiate(仅首次)==========\r\n if (!this._initialized) {\r\n // 先触发 onInitiate\r\n await executeHook(\r\n this,\r\n () => (this as any).onInitiate({ context }),\r\n { hookName: 'onInitiate', input }\r\n );\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n\r\n // 加载系统提示词(必须在反向钩子之前,确保 context 为空)\r\n if (this.templateResolver && context.getAll().length === 0) {\r\n const systemMsg = await this.templateResolver.resolve();\r\n if (systemMsg) {\r\n context.addSystemMessage(systemMsg, this._callIndex);\r\n }\r\n }\r\n\r\n this._initialized = true;\r\n }\r\n\r\n\r\n // ========== CallStart 反向钩子 ==========\r\n // 在系统提示词之后、用户输入之前调用,确保 Feature 可以正确注入消息\r\n\r\n // 设置输入缓存(Feature 可以在钩子中通过 setUserInput 修改)\r\n this._pendingInput = input;\r\n\r\n // 随本条输入流动的能力激活通知:在用户消息之前派发,feature 注入\r\n // 的内容(skill 文档等)得以先于触发它的消息落位\r\n if (activations && activations.length > 0) {\r\n await this.dispatchTurnActivations(activations, context);\r\n }\r\n\r\n // 执行反向钩子,Feature 可以在此期间修改 _pendingInput\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.CallStart, { input, context, isFirstCall, agent: this });\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n\r\n // 在 CallStart 钩子之后、用户消息之前捕获边界,\r\n // 确保 checkpoint 包含 Feature 注入的内容(CLAUDE.md、交接摘要等)。\r\n preCallBoundary = context.captureBoundary();\r\n preCallRuntimeState = await this.captureRuntimeStateWithoutContext(this._callIndex - 1);\r\n\r\n // 发送 call.start 通知(供前端消费 agent 运行状态)\r\n try {\r\n const { emitNotification, createCallStart } = await import('./notification.js');\r\n emitNotification(createCallStart());\r\n } catch { /* notification 模块不可用 */ }\r\n\r\n // 会话事件流:turn.started\r\n try {\r\n const { emitSessionEvent } = await import('./session-events.js');\r\n emitSessionEvent({ type: 'turn.started', turn: this._callIndex });\r\n } catch { /* session-events 模块不可用 */ }\r\n\r\n // 添加用户输入(使用可能被 Feature 修改过的缓存)\r\n finalInput = this._pendingInput ?? input;\r\n context.addUserMessage(finalInput, this._callIndex, images);\r\n this.pushToDebug(context.getAll());\r\n\r\n // 提前提交 rollback checkpoint:确保在 ReAct 循环中的 step auto-save\r\n // 持久化时,当前 call 的 checkpoint 已存在。这消除了\"消息已持久化但\r\n // checkpoint 缺失\"的竞态窗口。\r\n this.commitCallCheckpoint({\r\n kind: 'context-boundary',\r\n callIndex: this._callIndex,\r\n draftInput: finalInput,\r\n contextBoundary: preCallBoundary,\r\n runtimeState: preCallRuntimeState,\r\n });\r\n\r\n // ========== 初始化执行器(延迟初始化)==========\r\n this.ensureExecutorsInitialized();\r\n\r\n // ========== ReAct 循环 ==========\r\n const result = await this.reactRunner!.run(input, context, { isFirstCall, callIndex: this._callIndex, signal: this._abortController?.signal });\r\n\r\n // 保存上下文\r\n this.persistentContext = context;\r\n const outcome = this.createCallOutcome(result, callStartTime);\r\n this._lastCallOutcome = outcome;\r\n\r\n // ========== Call Finish(成功)==========\r\n await executeHook(\r\n this,\r\n () => (this as any).onCallFinish({\r\n input,\r\n context,\r\n response: result.finalResponse,\r\n turns: result.turns,\r\n completed: result.completed,\r\n finishReason: result.finishReason,\r\n outcome,\r\n }),\r\n { hookName: 'onCallFinish', input }\r\n );\r\n\r\n // ========== CallFinish 反向钩子 ==========\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.CallFinish, {\r\n input,\r\n context,\r\n response: result.finalResponse,\r\n steps: result.turns,\r\n completed: result.completed,\r\n finishReason: result.finishReason,\r\n outcome,\r\n });\r\n\r\n // 发送 call.finish 通知(成功)\r\n try {\r\n const { emitNotification, createCallFinish } = await import('./notification.js');\r\n emitNotification(createCallFinish(outcome));\r\n } catch { /* notification 模块不可用 */ }\r\n\r\n // 会话事件流:turn.completed / turn.failed\r\n try {\r\n const { emitSessionEvent, emitTurnCompleted, emitTurnFailed } = await import('./session-events.js');\r\n if (result.completed) {\r\n const callUsage = this.usageStats.getCallUsage(this._callIndex)?.totalUsage;\r\n emitTurnCompleted(\r\n this._callIndex,\r\n callUsage && {\r\n inputTokens: callUsage.inputTokens,\r\n outputTokens: callUsage.outputTokens,\r\n totalTokens: callUsage.totalTokens,\r\n },\r\n );\r\n } else {\r\n emitTurnFailed(this._callIndex, outcome);\r\n }\r\n } catch { /* session-events 模块不可用 */ }\r\n\r\n this.logger.info('Call completed', {\r\n completed: result.completed,\r\n turns: result.turns,\r\n durationMs: Date.now() - callStartTime,\r\n });\r\n return outcome;\r\n\r\n } catch (error) {\r\n // ========== Call Finish(异常)==========\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n\r\n // 保留异常发生后最新的上下文状态。\r\n // 如果 step-level rollback 已触发,这里保存的就是回滚后的上下文。\r\n this.persistentContext = context;\r\n\r\n // 失败调用也提交 checkpoint,保持与成功调用对称\r\n if (preCallBoundary && preCallRuntimeState && finalInput !== undefined) {\r\n this.commitCallCheckpoint({\r\n kind: 'context-boundary',\r\n callIndex: this._callIndex,\r\n draftInput: finalInput,\r\n contextBoundary: preCallBoundary,\r\n runtimeState: preCallRuntimeState,\r\n });\r\n }\r\n\r\n // 如果是子代理,报告错误中断给父代理\r\n if (this._agentId && this._parentPool) {\r\n const errorResult = `[执行出错: ${errorMsg}]`;\r\n await this._parentPool.handleInterrupt(\r\n this._agentId,\r\n 'error',\r\n errorResult\r\n );\r\n }\r\n\r\n const outcome: import('./lifecycle.js').CallOutcome = {\r\n status: 'failed',\r\n reason: 'error',\r\n response: errorMsg,\r\n steps: this._currentStep + 1,\r\n startedAt: callStartTime,\r\n finishedAt: Date.now(),\r\n error: { category: 'exception', message: errorMsg },\r\n };\r\n this._lastCallOutcome = outcome;\r\n\r\n await executeHook(\r\n this,\r\n () => (this as any).onCallFinish({\r\n input,\r\n context,\r\n response: errorMsg,\r\n turns: this._currentStep + 1,\r\n completed: false,\r\n finishReason: outcome.reason,\r\n outcome,\r\n }),\r\n { hookName: 'onCallFinish', input }\r\n );\r\n\r\n // ========== CallFinish 反向钩子(异常)==========\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.CallFinish, {\r\n input,\r\n context,\r\n response: errorMsg,\r\n steps: this._currentStep + 1,\r\n completed: false,\r\n finishReason: outcome.reason,\r\n outcome,\r\n });\r\n\r\n // 发送 call.finish 通知(异常)\r\n try {\r\n const { emitNotification, createCallFinish } = await import('./notification.js');\r\n emitNotification(createCallFinish(outcome));\r\n } catch { /* notification 模块不可用 */ }\r\n\r\n // 会话事件流:turn.failed(异常路径)\r\n try {\r\n const { emitTurnFailed } = await import('./session-events.js');\r\n emitTurnFailed(this._callIndex, outcome);\r\n } catch { /* session-events 模块不可用 */ }\r\n\r\n this.logger.error('Call failed', {\r\n error: errorMsg,\r\n durationMs: Date.now() - callStartTime,\r\n });\r\n throw error;\r\n\r\n } finally {\r\n this._callStartTimes.delete(callId);\r\n this._currentCallInput = undefined;\r\n this._currentStep = 0;\r\n\r\n // 清理输入缓存\r\n this._pendingInput = null;\r\n\r\n // 不清理 _abortController,让它保持可用以便 interrupt 调用\r\n // 下次 onCall 会创建新的 AbortController 并覆盖旧的\r\n\r\n }\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * 启用可视化查看器\r\n */\r\n async withViewer(\r\n name?: string,\r\n port?: number,\r\n openBrowser?: boolean,\r\n options?: { projectRoot?: string; inputPolicy?: 'standard' | 'none' }\r\n ): Promise<this> {\r\n this.debugHub = DebugHub.getInstance();\r\n this.debugEnabled = true;\r\n\r\n // `currentAgentId` belongs to Viewer focus and says nothing about whether\r\n // this host process has a usable transport. Every Agent attachment joins\r\n // the same DebugHub connection barrier; start() is idempotent once ready.\r\n await this.debugHub.start(port, openBrowser);\r\n\r\n // 收集 Feature 模板装载信息(mount 协议:注册事实,不推导 URL)\r\n // mount root 来自 feature.getPackageInfo()(唯一权威来源),realpath 解析\r\n // junction / 符号链接;模板文件按包内两种布局探测(dist/templates 与\r\n // dist/features/<feature>/templates)。声明了但磁盘不存在的模板不上报,\r\n // 由 viewer-worker 在注册时做最终存在性验证并告警。\r\n const templateMounts: string[] = [];\r\n const templateEntries: Record<string, { mount: number; rel: string }> = {};\r\n\r\n for (const feature of this.features.values()) {\r\n if (!feature.getPackageInfo || !feature.getTemplateNames) continue;\r\n const pkgInfo = feature.getPackageInfo();\r\n const templateNames = feature.getTemplateNames();\r\n if (!pkgInfo || templateNames.length === 0) continue;\r\n\r\n let mountRoot: string;\r\n try {\r\n mountRoot = realpathSync(pkgInfo.root);\r\n } catch {\r\n continue; // 包根不可达(异常装配),该 feature 的模板整体不上报\r\n }\r\n let mountIndex = templateMounts.indexOf(mountRoot);\r\n if (mountIndex < 0) {\r\n templateMounts.push(mountRoot);\r\n mountIndex = templateMounts.length - 1;\r\n }\r\n\r\n for (const templateName of templateNames) {\r\n const candidates = [\r\n join(pkgInfo.root, 'dist', 'templates', `${templateName}.render.js`),\r\n join(pkgInfo.root, 'dist', 'features', feature.name, 'templates', `${templateName}.render.js`),\r\n ];\r\n const templatePath = candidates.find((p) => existsSync(p));\r\n if (!templatePath) continue;\r\n // rel 基于 realpath 后的 mount root 计算,与 worker 服务端的磁盘读取同源\r\n templateEntries[templateName] = {\r\n mount: mountIndex,\r\n rel: relative(mountRoot, realpathSync(templatePath)).split(sep).join('/'),\r\n };\r\n }\r\n }\r\n\r\n const wasRegistered = this.debugHub.isAgentRegistered(this.agentId);\r\n const registeredAgentId = this.debugHub.registerAgent(\r\n this,\r\n name || this.constructor.name,\r\n templateMounts,\r\n templateEntries,\r\n this.buildHookInspectorSnapshot(),\r\n this.buildOverviewSnapshot(),\r\n options?.projectRoot ?? this.config.projectRoot,\r\n this.agentId,\r\n options?.inputPolicy,\r\n );\r\n if (registeredAgentId !== this.agentId) {\r\n throw new Error(`DebugHub registered unexpected Agent ID '${registeredAgentId}'`);\r\n }\r\n\r\n try {\r\n await this.ensureFeatureTools();\r\n\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n for (const feature of this.features.values()) {\r\n const maybePushSnapshot = (feature as any).pushDebugSnapshot;\r\n if (typeof maybePushSnapshot === 'function') {\r\n try {\r\n maybePushSnapshot.call(feature, this.agentId);\r\n } catch (error) {\r\n console.warn(`[Agent] Feature '${feature.name}' debug snapshot push failed: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n }\r\n }\r\n if (this.persistentContext) {\r\n this.pushToDebug(this.persistentContext.getAll());\r\n }\r\n } catch (error) {\r\n if (!wasRegistered) {\r\n this.debugHub.unregisterAgent(this.agentId);\r\n }\r\n this.debugEnabled = wasRegistered;\r\n throw error;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * 设置上下文\r\n */\r\n withContext(context: Context): this {\r\n this.persistentContext = context;\r\n return this;\r\n }\r\n\r\n /**\r\n * 从快照加载上下文\r\n */\r\n load(snapshot: ContextSnapshot): this {\r\n this.persistentContext = Context.fromJSON(snapshot);\r\n return this;\r\n }\r\n\r\n /**\r\n * 保存上下文为快照\r\n */\r\n save(): ContextSnapshot | undefined {\r\n return this.persistentContext?.toJSON();\r\n }\r\n\r\n /**\r\n * 生成当前会话快照\r\n */\r\n async createSessionSnapshot(sessionId: string): Promise<AgentSessionSnapshot> {\r\n await this.ensureFeatureTools();\r\n const runtime = await this.captureRuntimeSnapshot(this.persistentContext, this._callIndex);\r\n\r\n return {\r\n version: 2,\r\n sessionId,\r\n savedAt: Date.now(),\r\n agentType: this.constructor.name,\r\n runtime,\r\n rollbackHistory: this._callCheckpoints,\r\n ...(this._namedCheckpoints.length > 0\r\n ? { namedCheckpoints: this._namedCheckpoints.map(cp => ({ ...cp, runtime: { ...cp.runtime } })) }\r\n : {}),\r\n };\r\n }\r\n\r\n /**\r\n * 从会话快照恢复\r\n */\r\n async restoreSessionSnapshot(snapshot: AgentSessionSnapshot): Promise<this> {\r\n await this.ensureFeatureTools();\r\n const normalized = this.normalizeSessionSnapshot(snapshot as AgentSessionSnapshot & Record<string, unknown>);\r\n await this.restoreRuntimeSnapshot(normalized.runtime);\r\n\r\n // 恢复 rollback history,处理 v1/v2 混合格式\r\n const rawHistory = normalized.rollbackHistory as unknown as Array<Record<string, unknown>>;\r\n this._callCheckpoints = rawHistory.map(entry => this.normalizeCheckpointEntry(entry));\r\n\r\n // 恢复命名检查点(如果快照中包含)\r\n this._namedCheckpoints = (snapshot as AgentSessionSnapshot).namedCheckpoints\r\n ? [...(snapshot as AgentSessionSnapshot).namedCheckpoints!]\r\n : [];\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * 中断正在运行的 onCall\r\n * 会触发 AbortController,在下一个检查点(step 间或 tool 执行中)优雅停止\r\n * 返回 true 表示成功触发中断,false 表示当前没有正在运行的 call\r\n */\r\n interrupt(): boolean {\r\n if (this.isRunning() && this._abortController && !this._abortController.signal.aborted) {\r\n this._abortController.abort(new Error('Interrupted by user'));\r\n this.logger.info('Interrupt triggered', { callIndex: this._callIndex });\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 当前是否正在执行 onCall\r\n */\r\n isRunning(): boolean {\r\n return this._currentCallInput !== undefined;\r\n }\r\n\r\n // ========== LLM 热切换 ==========\r\n\r\n /**\r\n * 热替换 LLM 实例\r\n *\r\n * - 更新 Agent.llm + ReActLoopRunner 内部引用\r\n * - 更新模型元数据(_llmMeta)\r\n * - 触发 Feature.onLLMSwap() 和已注册的回调\r\n * - 更新 SystemContext 中的 SYSTEM_CURRENT_MODEL\r\n * - 推送 Overview Snapshot(使前端立即看到新模型名)\r\n *\r\n * @param llm 新的 LLM 实例\r\n * @param meta 可选:模型元数据(contextLength、compressRatio 等)\r\n *\r\n * 允许在 onCall 运行期间调用(mid-turn swap)。在途的 LLM 请求由旧实例的\r\n * Promise 持有,不受引用替换影响;下一个 ReAct step 会同步读取新引用。\r\n */\r\n setLLM(llm: AgentConfig['llm'], meta?: LLMMeta): void {\r\n const oldLLM = this.llm;\r\n this.llm = llm;\r\n\r\n if (meta) {\r\n this._llmMeta = { ...meta };\r\n }\r\n\r\n // 更新 SystemContext 中的模型名(为将来可能的模板重解析做准备)\r\n if (meta?.modelName) {\r\n const ctx = this.templateResolver?.getSystemContext();\r\n if (ctx) {\r\n ctx.SYSTEM_CURRENT_MODEL = meta.modelName;\r\n }\r\n }\r\n\r\n // 同步 ReActLoopRunner 内部持有的 LLM 引用(消除引用快照卡点)\r\n if (this.reactRunner) {\r\n this.reactRunner.swapLLM(llm);\r\n }\r\n\r\n // 触发 Feature 的 onLLMSwap 钩子\r\n for (const feature of this.features.values()) {\r\n if (typeof feature.onLLMSwap === 'function') {\r\n try {\r\n feature.onLLMSwap(llm, oldLLM);\r\n } catch (error) {\r\n this.logger.warn(`Feature ${feature.name} onLLMSwap error`, { error });\r\n }\r\n }\r\n }\r\n\r\n // 触发外部注册的回调\r\n for (const callback of this._llmSwapCallbacks) {\r\n try {\r\n callback(llm, oldLLM);\r\n } catch (error) {\r\n this.logger.warn('onLLMSwap callback error', { error });\r\n }\r\n }\r\n\r\n // 推送新 Overview Snapshot\r\n this.pushOverviewSnapshot();\r\n\r\n this.logger.info('LLM swapped', {\r\n newModel: (llm as any)?.modelName,\r\n oldModel: (oldLLM as any)?.modelName,\r\n });\r\n }\r\n\r\n /**\r\n * 注册 LLM 变更回调\r\n *\r\n * 外部消费者(如 Claw 的 run-prebuilt-agent.js)可在 setLLM 时收到通知。\r\n * 回调在 Feature.onLLMSwap 之后同步执行。\r\n */\r\n onLLMSwap(callback: (newLLM: AgentConfig['llm'], oldLLM: AgentConfig['llm']) => void): void {\r\n this._llmSwapCallbacks.push(callback);\r\n }\r\n\r\n /**\r\n * 获取当前模型元数据(不可变副本)\r\n */\r\n getLLMMeta(): LLMMeta {\r\n return { ...this._llmMeta };\r\n }\r\n\r\n async rollbackToCall(callIndex: number): Promise<{ draftInput: string }> {\r\n await this.ensureFeatureTools();\r\n const checkpoint = this._callCheckpoints.find(entry => entry.callIndex === callIndex);\r\n if (!checkpoint) {\r\n throw new Error(`Rollback checkpoint for call ${callIndex} not found`);\r\n }\r\n\r\n if (checkpoint.kind === 'context-boundary') {\r\n // v2 增量 rollback:截断 Context + 恢复运行态\r\n const context = this.getContext();\r\n context.truncateToBoundary(checkpoint.contextBoundary);\r\n await this.restoreRuntimeStateWithoutContext(checkpoint.runtimeState);\r\n } else {\r\n // v1 legacy rollback:完整 runtime 恢复\r\n await this.restoreRuntimeSnapshot(checkpoint.runtime);\r\n }\r\n\r\n this._callCheckpoints = this._callCheckpoints.filter(entry => entry.callIndex < callIndex);\r\n this.pushToDebug(this.getContext().getAll());\r\n this.pushInspectorSnapshot();\r\n\r\n return { draftInput: checkpoint.draftInput };\r\n }\r\n\r\n /**\r\n * 预注入 CallStart 钩子内容(不触发完整 onCall 流程)。\r\n *\r\n * 用于新 session 在首次用户输入前就能展示注入的上下文(如 handoff 摘要、CLAUDE.md)。\r\n * 执行初始化(如果尚未初始化)和 CallStart 钩子,但不添加用户消息、不进入 ReAct 循环。\r\n * Feature 的状态守卫(如 injected 标志)确保后续真实 onCall 时不会重复注入。\r\n */\r\n async preInjectCallStart(): Promise<void> {\r\n await this.ensureFeatureTools();\r\n\r\n const context = this.persistentContext ?? new Context();\r\n this.persistentContext = context;\r\n\r\n // 首次初始化(与 onCall 中的逻辑一致)\r\n if (!this._initialized) {\r\n await executeHook(\r\n this,\r\n () => (this as any).onInitiate({ context }),\r\n { hookName: 'onInitiate', input: '' }\r\n );\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n\r\n if (this.templateResolver && context.getAll().length === 0) {\r\n const systemMsg = await this.templateResolver.resolve();\r\n if (systemMsg) {\r\n context.addSystemMessage(systemMsg, this._callIndex);\r\n }\r\n }\r\n\r\n this._initialized = true;\r\n }\r\n\r\n // 执行 CallStart 钩子(isFirstCall = true)\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.CallStart, {\r\n input: '',\r\n context,\r\n isFirstCall: true,\r\n agent: this,\r\n });\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n }\r\n\r\n /**\r\n * 创建一个命名检查点\r\n *\r\n * 捕获当前完整 runtime snapshot 并将其与 checkpointId 关联。\r\n * 应在 onCall 完全退出后、由宿主(CallArbiter)的 checkpoint barrier 调用。\r\n *\r\n * @param id 全局唯一的 checkpoint ID\r\n * @returns 创建的 NamedCheckpoint\r\n */\r\n async createNamedCheckpoint(id: string): Promise<NamedCheckpoint> {\r\n await this.ensureFeatureTools();\r\n\r\n if (this._namedCheckpoints.some(cp => cp.id === id)) {\r\n throw new Error(`Named checkpoint \"${id}\" already exists`);\r\n }\r\n\r\n const runtime = await this.captureRuntimeSnapshot(this.persistentContext, this._callIndex);\r\n const checkpoint: NamedCheckpoint = {\r\n id,\r\n createdAt: Date.now(),\r\n sourceCallIndex: this._callIndex,\r\n runtime,\r\n };\r\n this._namedCheckpoints.push(checkpoint);\r\n this.logger.info('Named checkpoint created', { id, callIndex: this._callIndex });\r\n return checkpoint;\r\n }\r\n\r\n /**\r\n * 回退到命名检查点\r\n *\r\n * 恢复到指定 checkpoint 的 runtime snapshot,\r\n * 并剪除该 checkpoint 之后创建的所有命名检查点。\r\n * 应在 onCall 完全退出后、由宿主(CallArbiter)的 rollback barrier 调用。\r\n *\r\n * @param id 目标 checkpoint ID\r\n * @throws 如果 checkpoint 不存在\r\n */\r\n async rollbackToNamedCheckpoint(id: string): Promise<void> {\r\n await this.ensureFeatureTools();\r\n\r\n const targetIndex = this._namedCheckpoints.findIndex(cp => cp.id === id);\r\n if (targetIndex === -1) {\r\n throw new Error(`Named checkpoint \"${id}\" not found`);\r\n }\r\n\r\n const checkpoint = this._namedCheckpoints[targetIndex];\r\n await this.restoreRuntimeSnapshot(checkpoint.runtime);\r\n\r\n // 剪除该 checkpoint 之后创建的所有命名检查点(基于位置,避免时间戳精度问题)\r\n this._namedCheckpoints = this._namedCheckpoints.slice(0, targetIndex + 1);\r\n\r\n this.pushToDebug(this.getContext().getAll());\r\n this.pushInspectorSnapshot();\r\n this.logger.info('Rolled back to named checkpoint', { id, callIndex: checkpoint.sourceCallIndex });\r\n }\r\n\r\n /**\r\n * 获取所有命名检查点(只读视图)\r\n */\r\n getNamedCheckpoints(): readonly NamedCheckpoint[] {\r\n return this._namedCheckpoints;\r\n }\r\n\r\n /**\r\n * 清除所有命名检查点\r\n *\r\n * 用于单 checkpoint 模式:创建新 checkpoint 前清除旧的。\r\n */\r\n clearNamedCheckpoints(): void {\r\n this._namedCheckpoints = [];\r\n }\r\n\r\n /**\r\n * 保存会话到持久化存储\r\n */\r\n async saveSession(sessionId: string, store: SessionStore = getDefaultSessionStore()): Promise<string> {\r\n const snapshot = await this.createSessionSnapshot(sessionId);\r\n return store.save(sessionId, snapshot);\r\n }\r\n\r\n /**\r\n * 启用 Step 级自动保存:每个 ReAct step 完成后自动将 session 快照写入磁盘。\r\n * 不会替换 CallFinish 后的 saveSession 调用——后者仍作为兜底全量保存。\r\n */\r\n enableStepAutoSave(sessionId: string, store: SessionStore): void {\r\n this._stepAutoSave = { sessionId, store };\r\n // 传播到 reactRunner(如果已初始化)\r\n if (this.reactRunner) {\r\n (this.reactRunner as any).agent.stepSaveFn = this._createStepSaveFn();\r\n }\r\n }\r\n\r\n /**\r\n * 禁用 Step 级自动保存\r\n */\r\n disableStepAutoSave(): void {\r\n this._stepAutoSave = undefined;\r\n if (this.reactRunner) {\r\n (this.reactRunner as any).agent.stepSaveFn = undefined;\r\n }\r\n }\r\n\r\n private _createStepSaveFn(): (() => Promise<void>) | undefined {\r\n if (!this._stepAutoSave) return undefined;\r\n const { sessionId, store } = this._stepAutoSave;\r\n return async () => {\r\n await this.saveSession(sessionId, store);\r\n };\r\n }\r\n\r\n /**\r\n * 从持久化存储加载会话\r\n */\r\n async loadSession(sessionId: string, store: SessionStore = getDefaultSessionStore()): Promise<this> {\r\n const snapshot = await store.load(sessionId);\r\n return this.restoreSessionSnapshot(snapshot);\r\n }\r\n\r\n /**\r\n * 重置上下文\r\n */\r\n reset(): this {\r\n this.persistentContext = undefined;\r\n this._callCheckpoints = [];\r\n this._namedCheckpoints = [];\r\n this._callIndex = -1;\r\n this._currentStep = 0;\r\n this._initialized = false;\r\n return this;\r\n }\r\n\r\n // ========== 模板系统 API ==========\r\n\r\n /**\r\n * 设置系统提示词模板\r\n */\r\n setSystemPrompt(prompt: string | TemplateSource): this {\r\n this.templateResolver?.setSystemMessage(prompt);\r\n return this;\r\n }\r\n\r\n /**\r\n * 设置占位符上下文变量\r\n */\r\n setSystemContext(context: PlaceholderContext): this {\r\n this.templateResolver?.setSystemContext(context);\r\n return this;\r\n }\r\n\r\n // ========== 向后兼容 API ==========\r\n\r\n /**\r\n * 获取上下文(用于调试,向后兼容)\r\n */\r\n getContext(): Context {\r\n return this.persistentContext ?? new Context();\r\n }\r\n\r\n /**\r\n * 获取工具列表(向后兼容)\r\n */\r\n getTools(): ToolRegistry {\r\n return this.tools;\r\n }\r\n\r\n // ========== 用量统计 ==========\r\n\r\n /**\r\n * 获取用量统计\r\n */\r\n getUsage(): UsageStats {\r\n return this.usageStats;\r\n }\r\n\r\n /**\r\n * 记录一次 LLM 调用的用量\r\n * @param callIndex Call 序号\r\n * @param step Step 序号\r\n * @param usage 用量数据\r\n */\r\n recordUsage(callIndex: number, step: number, usage: UsageInfo): void {\r\n this.usageStats.record(callIndex, step, usage);\r\n this.pushOverviewSnapshot();\r\n }\r\n\r\n /**\r\n * 标记 Call 结束\r\n * @param callIndex Call 序号\r\n */\r\n endCallUsage(callIndex: number): void {\r\n this.usageStats.endCall(callIndex);\r\n this.pushOverviewSnapshot();\r\n }\r\n\r\n // ========== 子代理管理 ==========\r\n\r\n /**\r\n * 子代理向父代理回传消息\r\n */\r\n protected async reportToParent(message: string): Promise<void> {\r\n if (!this._parentPool || !this._agentId) {\r\n return;\r\n }\r\n await this._parentPool.report(this._agentId, message);\r\n }\r\n\r\n /**\r\n * 注册一个可创建的子代理类型\r\n *\r\n * 通常在 Agent 子类的构造函数中调用:\r\n * this.registerAgentType('MyAgent', () => new MyAgent({ llm: this.llm }));\r\n */\r\n public registerAgentType(name: string, factory: () => AgentBase | Promise<AgentBase>): this {\r\n this._agentTypeRegistry.set(name, factory);\r\n return this;\r\n }\r\n\r\n /**\r\n * 获取当前已注册的所有子代理类型名\r\n */\r\n public getRegisteredAgentTypes(): string[] {\r\n return Array.from(this._agentTypeRegistry.keys());\r\n }\r\n\r\n /**\r\n * 创建 Agent 实例\r\n *\r\n * 优先从实例注册表查找,未命中则 fallback 到内置类型(向后兼容)。\r\n * 子类无需覆盖此方法,通过 registerAgentType() 即可扩展。\r\n */\r\n public async createAgentByType(type: string): Promise<AgentBase> {\r\n // 优先查实例注册表\r\n const factory = this._agentTypeRegistry.get(type);\r\n if (factory) return factory();\r\n\r\n // fallback: 内置类型(向后兼容)\r\n switch (type) {\r\n case 'ExplorerAgent': {\r\n const { ExplorerAgent } = await import('../agents/system/ExplorerAgent.js');\r\n return new ExplorerAgent({\r\n llm: this.llm,\r\n });\r\n }\r\n case 'BasicAgent':\r\n default: {\r\n const { BasicAgent } = await import('../agents/system/BasicAgent.js');\r\n return new BasicAgent({\r\n llm: this.llm,\r\n tools: this.tools.getAll().slice(0, 3),\r\n });\r\n }\r\n }\r\n }\r\n\r\n // ========== 清理 ==========\r\n\r\n /**\r\n * 清理资源\r\n */\r\n async dispose(): Promise<void> {\r\n if (this._disposePromise) {\r\n return this._disposePromise;\r\n }\r\n\r\n this._lifecycleState = 'disposing';\r\n this._disposePromise = this.disposeInternal();\r\n return this._disposePromise;\r\n }\r\n\r\n private async disposeInternal(): Promise<void> {\r\n // 已开始的 call 先中断,再等待活动调用和已排队调用收敛。\r\n // 排队调用会在开始前观察到 disposing 状态并明确失败。\r\n this.interrupt();\r\n await this._activeCallPromise;\r\n await this._callQueue;\r\n\r\n // 触发 onDestroy 钩子(SubAgentFeature 的清理会在 Feature.onDestroy 中处理)\r\n const context = this.persistentContext ?? new Context();\r\n\r\n try {\r\n await executeHook(\r\n this,\r\n () => (this as any).onDestroy({ context }),\r\n { hookName: 'onDestroy' }\r\n );\r\n } catch (error) {\r\n console.warn('[Agent] onDestroy hook error:', error);\r\n }\r\n\r\n // 清理 Features\r\n for (const feature of this.features.values()) {\r\n if (feature.onDestroy) {\r\n try {\r\n await feature.onDestroy({\r\n agentId: this.agentId,\r\n config: this.config,\r\n getFeature: <T extends AgentFeature>(featureName: string): T | undefined => {\r\n return this.features.get(featureName) as T | undefined;\r\n },\r\n });\r\n } catch (error) {\r\n console.warn(`[Agent] Feature ${feature.name} cleanup error:`, error);\r\n }\r\n }\r\n }\r\n\r\n // 注销 DebugHub\r\n if (this.debugEnabled && this.agentId && this.debugHub) {\r\n this.debugHub.unregisterAgent(this.agentId);\r\n this.debugEnabled = false;\r\n }\r\n\r\n // 重置状态\r\n this._initialized = false;\r\n this.persistentContext = undefined;\r\n this._callCheckpoints = [];\r\n this._lifecycleState = 'disposed';\r\n }\r\n\r\n // ========== Feature 系统 ==========\r\n\r\n /**\r\n * 使用 Feature(链式调用)\r\n */\r\n use(feature: AgentFeature): this {\r\n this.features.set(feature.name, feature);\r\n\r\n // 如果是 SubAgentFeature,设置父代理引用\r\n if (feature.name === 'subagent' && (feature as any)._setParentAgent) {\r\n (feature as any)._setParentAgent(this);\r\n }\r\n\r\n if (feature.getContextInjectors) {\r\n for (const [pattern, injector] of feature.getContextInjectors()) {\r\n this.contextInjectors.push({ pattern, injector });\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * 彻底移除一个 Feature:移除其工具并从 features Map 中删除\r\n *\r\n * @example\r\n * agent.removeFeature('subagent') // 移除 SubAgentFeature\r\n */\r\n removeFeature(featureName: string): this {\r\n const feature = this.features.get(featureName);\r\n if (!feature) {\r\n console.warn(`[Agent] Feature '${featureName}' 不存在`);\r\n return this;\r\n }\r\n\r\n // 移除工具\r\n const tools = feature.getTools?.() ?? [];\r\n let count = 0;\r\n for (const tool of tools) {\r\n if (this.tools.remove(tool.name)) {\r\n count++;\r\n }\r\n }\r\n\r\n // 移除反向钩子\r\n this.hooksRegistry.removeFromFeature(feature);\r\n\r\n // 清理 contextInjectors\r\n if (feature.getContextInjectors) {\r\n const injectors = feature.getContextInjectors();\r\n for (const [pattern] of injectors) {\r\n const idx = this.contextInjectors.findIndex(ci => ci.pattern === pattern && ci.injector);\r\n if (idx !== -1) {\r\n this.contextInjectors.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n // 从 features Map 中移除\r\n this.features.delete(featureName);\r\n\r\n // 调用 onDestroy 清理资源\r\n if (typeof feature.onDestroy === 'function') {\r\n try {\r\n feature.onDestroy({\r\n agentId: this.agentId,\r\n config: this.config,\r\n getFeature: <T extends AgentFeature>(name: string): T | undefined => {\r\n return this.features.get(name) as T | undefined;\r\n },\r\n });\r\n } catch (err) {\r\n console.warn(`[Agent] Feature '${featureName}' onDestroy error:`, err);\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n this.syncRegisteredToolsToDebug();\r\n }\r\n this.featureEventLogger(featureName).info(\r\n `feature '${featureName}' removed (${count} tools + hooks + feature instance)`,\r\n { event: 'feature.removed', toolCount: count }\r\n );\r\n this.pushInspectorSnapshot();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * 启用 Feature 的所有工具\r\n *\r\n * @example\r\n * agent.enable('mcp') // 启用 MCP 工具\r\n */\r\n enable(featureName: string): this {\r\n const feature = this.features.get(featureName);\r\n if (!feature) {\r\n console.warn(`[Agent] Feature '${featureName}' 不存在`);\r\n return this;\r\n }\r\n\r\n const tools = feature.getTools?.() ?? [];\r\n let count = 0;\r\n for (const tool of tools) {\r\n if (this.tools.enable(tool.name)) {\r\n count++;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n this.featureEventLogger(featureName).info(\r\n `feature '${featureName}' tools enabled (${count})`,\r\n { event: 'feature.tool_state_changed', action: 'enabled', toolCount: count }\r\n );\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * 禁用 Feature 的所有工具\r\n *\r\n * @example\r\n * agent.disable('mcp') // 禁用 MCP 工具\r\n */\r\n disable(featureName: string): this {\r\n const feature = this.features.get(featureName);\r\n if (!feature) {\r\n console.warn(`[Agent] Feature '${featureName}' 不存在`);\r\n return this;\r\n }\r\n\r\n const tools = feature.getTools?.() ?? [];\r\n let count = 0;\r\n for (const tool of tools) {\r\n if (this.tools.disable(tool.name)) {\r\n count++;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n this.featureEventLogger(featureName).info(\r\n `feature '${featureName}' tools disabled (${count})`,\r\n { event: 'feature.tool_state_changed', action: 'disabled', toolCount: count }\r\n );\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * 移除 Feature 的所有工具(从 LLM 工具列表物理移除)\r\n *\r\n * @example\r\n * agent.remove('mcp') // 移除 MCP 工具\r\n */\r\n remove(featureName: string): this {\r\n const feature = this.features.get(featureName);\r\n if (!feature) {\r\n console.warn(`[Agent] Feature '${featureName}' 不存在`);\r\n return this;\r\n }\r\n\r\n const tools = feature.getTools?.() ?? [];\r\n let count = 0;\r\n for (const tool of tools) {\r\n if (this.tools.remove(tool.name)) {\r\n count++;\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n this.featureEventLogger(featureName).info(\r\n `feature '${featureName}' tools removed (${count})`,\r\n { event: 'feature.tool_state_changed', action: 'removed', toolCount: count }\r\n );\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * 检查 Feature 是否启用\r\n *\r\n * @example\r\n * if (agent.isEnabled('mcp')) { ... }\r\n */\r\n isEnabled(featureName: string): boolean {\r\n const feature = this.features.get(featureName);\r\n if (!feature) return false;\r\n\r\n const tools = feature.getTools?.() ?? [];\r\n if (tools.length === 0) return true; // 空工具视为启用\r\n\r\n return tools.every(t => this.tools.isEnabled(t.name));\r\n }\r\n\r\n // ========== 反向钩子运行时控制 ==========\r\n\r\n /**\r\n * 禁用指定的反向钩子\r\n *\r\n * @example\r\n * agent.disableHook('ToolUse', 'audit', 'onToolUse')\r\n */\r\n disableHook(lifecycle: string, featureName: string, methodName: string): this {\r\n const lc = lifecycle as CoreLifecycle;\r\n if (this.hooksRegistry.disableHook(lc, featureName, methodName)) {\r\n this.logger.child({\r\n namespace: 'agent.features',\r\n feature: featureName,\r\n agentId: this.agentId,\r\n agentName: this.config?.name || this.constructor.name,\r\n lifecycle,\r\n hookMethod: methodName,\r\n }).info(\r\n `hook ${lifecycle}:${featureName}.${methodName} disabled`,\r\n { event: 'feature.hook_state_changed', action: 'disabled' }\r\n );\r\n this.pushInspectorSnapshot();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * 启用指定的反向钩子\r\n *\r\n * @example\r\n * agent.enableHook('ToolUse', 'audit', 'onToolUse')\r\n */\r\n enableHook(lifecycle: string, featureName: string, methodName: string): this {\r\n const lc = lifecycle as CoreLifecycle;\r\n if (this.hooksRegistry.enableHook(lc, featureName, methodName)) {\r\n this.logger.child({\r\n namespace: 'agent.features',\r\n feature: featureName,\r\n agentId: this.agentId,\r\n agentName: this.config?.name || this.constructor.name,\r\n lifecycle,\r\n hookMethod: methodName,\r\n }).info(\r\n `hook ${lifecycle}:${featureName}.${methodName} enabled`,\r\n { event: 'feature.hook_state_changed', action: 'enabled' }\r\n );\r\n this.pushInspectorSnapshot();\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * 按名称获取已挂载的 Feature 实例\r\n */\r\n getFeature<T extends AgentFeature>(featureName: string): T | undefined {\r\n return this.features.get(featureName) as T | undefined;\r\n }\r\n\r\n /**\r\n * 确保 Feature 工具已注册。\r\n *\r\n * @param opts.strict 严格模式:feature 的 getAsyncTools / onInitiate 失败\r\n * 直接抛出(带 featureInitStage 标记),而非 warn 后继续。供 Test Runtime\r\n * 等宿主在启动期显式验证初始化;onCall 内部调用保持默认非严格。\r\n */\r\n async ensureFeatureTools(opts?: { strict?: boolean }): Promise<void> {\r\n if (this.featureToolsReady) return;\r\n if (this.featureToolsReadyPromise) {\r\n return this.featureToolsReadyPromise;\r\n }\r\n\r\n const initialization = (async () => {\r\n // 装配校验(工作项 A1/A3):依赖拓扑 + policy 唯一性。\r\n // 错误在此处爆出(装配时),不许运行时碰运气。\r\n const featureList = Array.from(this.features.values());\r\n const { order, errors: orderErrors } = resolveFeatureOrder(featureList);\r\n if (orderErrors.length > 0) {\r\n throw orderErrorsToError(orderErrors);\r\n }\r\n const policyIssues = validatePolicyUniqueness(featureList);\r\n if (policyIssues.length > 0) {\r\n throw issuesToError(policyIssues);\r\n }\r\n\r\n // 预收集所有 Feature 自带的 skills,在 onInitiate 之前注入 SkillFeature\r\n const featureSkills = await this.collectFeatureSkills();\r\n if (featureSkills.length > 0) {\r\n const skillFeature = this.features.get('skill') as any;\r\n if (skillFeature?.addFeatureSkills) {\r\n skillFeature.addFeatureSkills(featureSkills);\r\n }\r\n }\r\n\r\n for (const feature of order) {\r\n await this.initSingleFeature(feature.name, feature, { strict: opts?.strict === true });\r\n }\r\n\r\n // 子类可在此 hook 中注册额外工具(如统一代理工具)\r\n await this.onFeatureToolsReady();\r\n\r\n this.featureToolsReady = true;\r\n this.pushInspectorSnapshot();\r\n })();\r\n\r\n this.featureToolsReadyPromise = initialization;\r\n try {\r\n await initialization;\r\n } finally {\r\n if (this.featureToolsReadyPromise === initialization) {\r\n this.featureToolsReadyPromise = undefined;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 调用已注册的 capability 命令。\r\n *\r\n * entryPoint 由调用方声明:进程内 Feature 调用传 'feature',\r\n * 宿主前端转发的用户触发传 'slash'。注册表据此执行 entryPoints\r\n * 契约检查(不匹配返回 entry_point_denied)。\r\n */\r\n async invokeCapability(\r\n ref: string,\r\n args: Record<string, unknown>,\r\n entryPoint: CapabilityEntryPoint,\r\n opts?: { timeoutMs?: number },\r\n ): Promise<CapabilityInvokeResult> {\r\n await this.ensureFeatureTools();\r\n const logger = createLogger('capability', { agentId: this.agentId });\r\n const ctx: CapabilityContext = {\r\n agentId: this.agentId,\r\n getFeature: <T extends AgentFeature>(featureName: string): T | undefined => {\r\n return this.features.get(featureName) as T | undefined;\r\n },\r\n logger,\r\n };\r\n // 审计兜底:invoke 生命周期不依赖 Feature 自觉写日志,在此统一落\r\n // DebugHub(Web UI query_logs / debugger MCP 可查;无头时 stdio)。\r\n const startedAt = Date.now();\r\n const result = await this.capabilities.invoke(ref, { args, entryPoint, timeoutMs: opts?.timeoutMs }, ctx);\r\n const base = {\r\n ref,\r\n entryPoint,\r\n durationMs: Date.now() - startedAt,\r\n argKeys: Object.keys(args ?? {}),\r\n };\r\n if (result.ok) {\r\n logger.info('capability invoked', base);\r\n // feature 入口的 prompt 型命令没有后续 user-turn 携带激活通知,\r\n // 在当前上下文即时派发(slash 入口由宿主输入管线随消息投递,\r\n // 此处不重复派发)\r\n if (entryPoint === 'feature') {\r\n if (this.capabilities.kindOf(ref) === 'prompt' && this.persistentContext) {\r\n await this.dispatchTurnActivations([ref], this.persistentContext);\r\n }\r\n }\r\n } else if (result.code === 'not_found' || result.code === 'entry_point_denied') {\r\n logger.warn('capability invoke rejected', { ...base, code: result.code, message: result.message });\r\n } else {\r\n logger.error('capability invoke failed', { ...base, code: result.code, message: result.message });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Capability 清单快照。宿主下发用户命令菜单时用\r\n * { entryPoint: 'slash' } 过滤;确保 Feature 初始化完成后返回。\r\n */\r\n async getCapabilitySnapshot(filter?: { entryPoint?: CapabilityEntryPoint }): Promise<CapabilitySnapshot[]> {\r\n await this.ensureFeatureTools();\r\n return this.capabilities.list(filter);\r\n }\r\n\r\n /**\r\n * 把\"随消息到达的能力激活通知\"派发给对应 feature 消费。\r\n *\r\n * 两个调用点:executeCall(新 call 的激活,onCall 第三参)与\r\n * react-loop 的排队消息步边界注入(busy 时排队的消息不触发新 call,\r\n * 激活随注入点派发)。refs 按 capability registry 的归属分组,逐\r\n * feature 调用可选方法 onCapabilityActivations;单个 feature 失败\r\n * 不阻断其余派发,也不阻断本轮 call。\r\n */\r\n async dispatchTurnActivations(refs: string[], context: import('./context.js').Context): Promise<void> {\r\n if (!Array.isArray(refs) || refs.length === 0) return;\r\n // 直接调用(测试 / 宿主工具)时 registry 可能尚未收集,确保幂等初始化\r\n await this.ensureFeatureTools();\r\n const logger = createLogger('capability', { agentId: this.agentId });\r\n\r\n const byFeature = new Map<string, string[]>();\r\n const unknown: string[] = [];\r\n for (const ref of refs) {\r\n if (typeof ref !== 'string') continue;\r\n const owner = this.capabilities.ownerOf(ref);\r\n if (!owner) {\r\n unknown.push(ref);\r\n continue;\r\n }\r\n const group = byFeature.get(owner) ?? [];\r\n if (!group.includes(ref)) group.push(ref);\r\n byFeature.set(owner, group);\r\n }\r\n if (unknown.length > 0) {\r\n logger.warn('turn activations ignored (refs not registered)', { refs: unknown });\r\n }\r\n for (const [featureName, groupRefs] of byFeature) {\r\n const feature = this.features.get(featureName) as AgentFeature | undefined;\r\n if (!feature || typeof (feature as any).onCapabilityActivations !== 'function') continue;\r\n try {\r\n await (feature as any).onCapabilityActivations(groupRefs, { context });\r\n logger.info('turn activations dispatched', { feature: featureName, refs: groupRefs });\r\n } catch (error) {\r\n logger.error('turn activation dispatch failed', {\r\n feature: featureName,\r\n refs: groupRefs,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 为单个 Feature 执行工具注册、onInitiate 和 hooks 收集。\r\n *\r\n * 被 ensureFeatureTools() 和 mountFeature() 共用。\r\n *\r\n * @param opts.strict 严格模式:getAsyncTools / onInitiate 失败直接抛出\r\n * (标记 featureInitStage),而非 warn 后以半初始化状态继续。\r\n */\r\n private async initSingleFeature(\r\n name: string,\r\n feature: AgentFeature,\r\n opts?: { strict?: boolean },\r\n ): Promise<void> {\r\n const featureLogger = createLogger(`feature.${name}`, {\r\n agentId: this.agentId,\r\n agentName: this.config.name || this.constructor.name,\r\n feature: name,\r\n tags: [`feature:${name}`],\r\n });\r\n\r\n // 为每个 Feature 创建独立的 initContext\r\n const initContext: FeatureInitContext = {\r\n agentId: this.agentId,\r\n config: this.config,\r\n logger: featureLogger,\r\n featureConfig: this.config.features?.[name],\r\n getFeature: <T extends AgentFeature>(featureName: string): T | undefined => {\r\n return this.features.get(featureName) as T | undefined;\r\n },\r\n registerTool: (tool) => this.tools.register(tool, name),\r\n dataSourceRegistry: this._dataSourceRegistry,\r\n };\r\n\r\n if (feature.getTools) {\r\n for (const tool of runWithLogScope({ feature: name, namespace: `feature.${name}`, tags: [`feature:${name}`] }, () => feature.getTools!()) || []) {\r\n this.tools.register(tool, name); // 传递来源\r\n }\r\n }\r\n\r\n if (feature.getAsyncTools) {\r\n try {\r\n const tools = await runWithLogScope({\r\n feature: name,\r\n namespace: `feature.${name}`,\r\n tags: [`feature:${name}`],\r\n }, () => feature.getAsyncTools!(initContext));\r\n for (const tool of tools) {\r\n this.tools.register(tool, name); // 传递来源\r\n }\r\n } catch (error) {\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n if (opts?.strict) {\r\n const initError = new Error(\r\n `Feature ${name} failed to load tools: ${errorMsg}`,\r\n { cause: error },\r\n ) as FeatureInitFailureError;\r\n initError.featureInitStage = 'getAsyncTools';\r\n throw initError;\r\n }\r\n console.warn(`[Agent] Feature ${name} failed to load tools: ${errorMsg}`);\r\n }\r\n }\r\n\r\n if (feature.onInitiate) {\r\n try {\r\n await runWithLogScope({\r\n feature: name,\r\n namespace: `feature.${name}`,\r\n tags: [`feature:${name}`],\r\n }, () => feature.onInitiate!(initContext));\r\n } catch (error) {\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n if (opts?.strict) {\r\n const initError = new Error(\r\n `Feature ${name} onInitiate failed: ${errorMsg}`,\r\n { cause: error },\r\n ) as FeatureInitFailureError;\r\n initError.featureInitStage = 'onInitiate';\r\n throw initError;\r\n }\r\n console.warn(`[Agent] Feature ${name} onInitiate failed: ${errorMsg}`);\r\n }\r\n }\r\n\r\n // Capability 收集(onInitiate 之后):能力可依赖初始化产物(如 SkillFeature\r\n // 的 skills 扫描在 onInitiate 中完成)。strict 模式下 init 失败会先抛出,\r\n // 自然跳过收集。先清该 feature 旧条目再注册,热载重挂路径不误报 duplicate。\r\n this.capabilities.unregisterFeature(name);\r\n if (feature.getCapabilities) {\r\n for (const def of runWithLogScope({ feature: name, namespace: `feature.${name}` }, () => feature.getCapabilities!()) || []) {\r\n this.capabilities.register(name, def);\r\n }\r\n }\r\n\r\n // 收集反向钩子\r\n this.hooksRegistry.collectFromFeature(feature);\r\n }\r\n\r\n /**\r\n * 动态挂载 Feature(运行时)\r\n *\r\n * 与 use() 不同,mountFeature 会在 agent 已初始化的情况下\r\n * 立即对新 feature 执行工具注册、onInitiate 和 hooks 收集。\r\n *\r\n * 如果 agent 尚未初始化(未发生首次 onCall),feature 会被加入 Map,\r\n * 后续由 ensureFeatureTools() 统一处理。\r\n *\r\n * @example\r\n * await agent.mountFeature(new SomeFeature());\r\n */\r\n async mountFeature(feature: AgentFeature, opts?: { strictInit?: boolean }): Promise<this> {\r\n // 装配预检(工作项 D):增量挂载点拦截 error 级问题(policy 冲突等)。\r\n // warning 不阻断(如工具重名覆盖可能是既有语义)。\r\n const nextAssembly = [...this.features.values(), feature];\r\n const preflight = preflightAssembly(nextAssembly);\r\n const errors = preflight.issues.filter(i => i.severity === 'error');\r\n if (errors.length > 0) {\r\n throw new Error(\r\n `mountFeature preflight failed for '${feature.name}':\\n` +\r\n errors.map(e => ` [${e.check}] ${e.message}`).join('\\n'),\r\n );\r\n }\r\n\r\n this.use(feature);\r\n this.featureEventLogger(feature.name).info(\r\n `feature '${feature.name}' mounted${this.featureToolsReady ? ' (immediate init)' : ' (deferred to first call)'}`,\r\n { event: 'feature.mounted', toolCount: feature.getTools?.()?.length ?? 0 }\r\n );\r\n\r\n // agent 尚未初始化,feature 会在首次 ensureFeatureTools 时统一处理\r\n if (!this.featureToolsReady) {\r\n return this;\r\n }\r\n\r\n // agent 已初始化,立即对新 feature 执行完整初始化\r\n await this.initSingleFeature(feature.name, feature, { strict: opts?.strictInit === true });\r\n this.pushInspectorSnapshot();\r\n return this;\r\n }\r\n\r\n /**\r\n * 热载一个 Feature:不重启 Agent、不丢失会话上下文。\r\n *\r\n * 流程(任一步失败自动回退旧实例):\r\n * 1. captureState 旧实例(removeFeature 会触发 onDestroy,状态须先取出)\r\n * 2. removeFeature 卸载旧实例(工具/钩子/injectors)\r\n * 3. cache-busting 动态 import 加载新模块代码\r\n * 4. 新实例 restoreState 迁移状态(无状态契约则显式标记丢失)\r\n * 5. mountFeature 挂载(工具注册 + onInitiate + 钩子收集 + inspector 推送)\r\n *\r\n * @param featureName 已挂载的 feature 名\r\n * @param modulePath 新代码的绝对路径或 file:// URL;\r\n * 缺省时读取旧实例构造器上的静态 reloadPath 声明\r\n * @param opts.strictInit 严格初始化:getAsyncTools / onInitiate 失败视为\r\n * reload 失败并自动回退(阶段标注 'init')\r\n * @throws mount/import/init 阶段失败时回退旧实例后重新抛出(错误带\r\n * reloadStage / rolledBack 标记,错误信息标注失败阶段)\r\n */\r\n async reloadFeature(\r\n featureName: string,\r\n modulePath?: string,\r\n opts?: FeatureReloadOptions,\r\n ): Promise<FeatureReloadResult> {\r\n const startedAt = Date.now();\r\n const oldFeature = this.features.get(featureName);\r\n if (!oldFeature) {\r\n throw new Error(\r\n `Feature reload failed: feature '${featureName}' is not mounted. ` +\r\n 'Mounted features: ' + Array.from(this.features.keys()).join(', '),\r\n );\r\n }\r\n\r\n const resolvedModulePath = modulePath\r\n ?? (oldFeature.constructor as unknown as { reloadPath?: string }).reloadPath;\r\n if (!resolvedModulePath) {\r\n throw new Error(\r\n `Feature reload failed: no modulePath for '${featureName}'. ` +\r\n 'Pass the module path explicitly, or declare `static reloadPath` on the feature class.',\r\n );\r\n }\r\n\r\n const oldClassName = oldFeature.constructor.name;\r\n const canTransferState =\r\n typeof oldFeature.captureState === 'function' &&\r\n typeof oldFeature.restoreState === 'function';\r\n\r\n // 捕获旧实例工具的用户决策状态(enabled/disabled/removed)。\r\n // removeFeature 会把工具打入 pendingRemoved;register() 尊重该标记\r\n // (用户移除决策跨重注册保持),因此 reload 必须在挂载后恢复原状态——\r\n // 否则被程序性移除的工具在热载后永久消失。\r\n const toolStates = new Map<string, 'enabled' | 'disabled' | 'removed'>();\r\n for (const tool of oldFeature.getTools?.() ?? []) {\r\n toolStates.set(\r\n tool.name,\r\n this.tools.isEnabled(tool.name)\r\n ? 'enabled'\r\n : this.tools.isDisabled(tool.name)\r\n ? 'disabled'\r\n : 'removed',\r\n );\r\n }\r\n\r\n // 1. 先取状态(removeFeature 的 onDestroy 可能释放资源)\r\n let capturedState: unknown;\r\n if (canTransferState) {\r\n capturedState = oldFeature.captureState!();\r\n } else {\r\n this.logger?.warn(\r\n `Feature '${featureName}' has no captureState/restoreState contract; ` +\r\n 'in-memory state will be lost on reload',\r\n );\r\n }\r\n\r\n // 2. 卸载旧实例\r\n this.removeFeature(featureName);\r\n\r\n const rollback = (stage: string, error: unknown): never => {\r\n // 回退:旧实例重新挂载 + 状态回灌。回退本身的失败向上抛出(状态已不安全)。\r\n try {\r\n this.mountFeatureSync(oldFeature);\r\n if (canTransferState && capturedState !== undefined) {\r\n oldFeature.restoreState!(capturedState);\r\n }\r\n this.restoreToolStates(toolStates);\r\n } catch (rollbackError) {\r\n throw new Error(\r\n `Feature '${featureName}' reload failed at stage '${stage}', and rollback also failed. ` +\r\n `Original error: ${error instanceof Error ? error.message : String(error)}. ` +\r\n `Rollback error: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`,\r\n { cause: error },\r\n );\r\n }\r\n const message = error instanceof Error ? error.message : String(error);\r\n this.featureEventLogger(featureName).warn(\r\n `feature '${featureName}' reload failed at stage '${stage}', previous instance restored`,\r\n { event: 'feature.reload_reverted', reason: `${stage}: ${message}`, durationMs: Date.now() - startedAt }\r\n );\r\n const failure = new Error(\r\n `Feature '${featureName}' reload failed at stage '${stage}': ${message}. ` +\r\n 'Previous instance has been restored.',\r\n { cause: error },\r\n ) as FeatureReloadFailureError;\r\n failure.reloadStage = stage;\r\n failure.rolledBack = true;\r\n throw failure;\r\n };\r\n\r\n // 3. 加载新模块\r\n let NewCtor: (new () => AgentFeature) | undefined;\r\n try {\r\n NewCtor = await loadFeatureModule(resolvedModulePath, oldClassName) as new () => AgentFeature;\r\n } catch (error) {\r\n rollback('import', error);\r\n }\r\n\r\n // 4-5. 新实例 + 状态迁移 + 挂载\r\n let newFeature: AgentFeature;\r\n try {\r\n newFeature = new NewCtor!();\r\n if (newFeature.name !== featureName) {\r\n throw new Error(\r\n `reloaded feature reports name '${newFeature.name}', expected '${featureName}'`,\r\n );\r\n }\r\n } catch (error) {\r\n rollback('instantiate', error);\r\n }\r\n\r\n // 状态迁移要求新旧双侧都有契约(与 checkpoint.ts 的采集规则一致)\r\n const newStateCapable =\r\n typeof newFeature!.captureState === 'function' &&\r\n typeof newFeature!.restoreState === 'function';\r\n let stateTransferred = false;\r\n if (newStateCapable && canTransferState && capturedState !== undefined) {\r\n try {\r\n await newFeature!.restoreState!(capturedState);\r\n stateTransferred = true;\r\n } catch (error) {\r\n rollback('state-transfer', error);\r\n }\r\n } else if (canTransferState && !newStateCapable) {\r\n this.logger?.warn(\r\n `Feature '${featureName}' new code drops the captureState/restoreState contract; ` +\r\n 'previous state could not be transferred',\r\n );\r\n }\r\n\r\n try {\r\n await this.mountFeature(newFeature!, opts?.strictInit ? { strictInit: true } : undefined);\r\n this.restoreToolStates(toolStates);\r\n } catch (error) {\r\n rollback(isFeatureInitFailureError(error) ? 'init' : 'mount', error);\r\n }\r\n\r\n const reloadDurationMs = Date.now() - startedAt;\r\n this.featureEventLogger(featureName).info(\r\n `feature '${featureName}' reloaded in ${reloadDurationMs}ms (state ${stateTransferred ? 'transferred' : 'not transferred'})`,\r\n { event: 'feature.reloaded', durationMs: reloadDurationMs, stateTransferred }\r\n );\r\n\r\n return {\r\n featureName,\r\n stateTransferred,\r\n rolledBack: false,\r\n durationMs: Date.now() - startedAt,\r\n };\r\n }\r\n\r\n /**\r\n * 恢复工具的用户决策状态(reloadFeature 专用)。\r\n *\r\n * 新代码注册后,工具名若与旧版本一致,恢复 reload 前的\r\n * enabled/disabled/removed 状态;新工具保持注册默认值。\r\n */\r\n private restoreToolStates(states: Map<string, 'enabled' | 'disabled' | 'removed'>): void {\r\n for (const [name, state] of states) {\r\n if (state === 'enabled') {\r\n this.tools.enable(name);\r\n } else if (state === 'disabled') {\r\n this.tools.disable(name);\r\n } else {\r\n this.tools.remove(name);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * mountFeature 的同步回退通道:reloadFeature 失败时恢复旧实例。\r\n *\r\n * 与 mountFeature 的区别:不做 inspector 推送延迟(立即同步注册),\r\n * 供回退路径在抛错前完成恢复。\r\n */\r\n private mountFeatureSync(feature: AgentFeature): void {\r\n this.use(feature);\r\n if (this.featureToolsReady) {\r\n this.initSingleFeatureSync(feature);\r\n }\r\n }\r\n\r\n /**\r\n * initSingleFeature 的同步变体(回退路径专用,不等待异步初始化)。\r\n */\r\n private initSingleFeatureSync(feature: AgentFeature): void {\r\n if (feature.getTools) {\r\n for (const tool of feature.getTools() || []) {\r\n this.tools.register(tool, feature.name);\r\n }\r\n }\r\n this.hooksRegistry.collectFromFeature(feature);\r\n this.pushInspectorSnapshot();\r\n }\r\n\r\n /**\r\n * 在所有 Feature 工具注册完毕后、inspector snapshot 推送之前调用。\r\n * 子类可重写此方法注册额外工具(如统一代理工具覆盖同名 feature 工具)。\r\n */\r\n protected async onFeatureToolsReady(): Promise<void> {}\r\n\r\n /**\r\n * 收集所有 Feature 自带的 skills\r\n * 约定:Feature source 同级目录下存在 skills/ 目录则自动发现\r\n */\r\n private async collectFeatureSkills(): Promise<SkillMetadata[]> {\r\n const collected: SkillMetadata[] = [];\r\n\r\n for (const [name, feature] of this.features) {\r\n if (name === 'skill') continue;\r\n if (!feature.source) continue;\r\n\r\n const filePath = feature.source.startsWith('file://')\r\n ? fileURLToPath(feature.source) : feature.source;\r\n const skillsDir = join(dirname(filePath), 'skills');\r\n if (!existsSync(skillsDir)) continue;\r\n\r\n const found = await discover({ dir: skillsDir });\r\n if (found.length > 0) {\r\n collected.push(...found);\r\n }\r\n }\r\n\r\n return collected;\r\n }\r\n\r\n // ========== 内部方法 ==========\r\n\r\n /**\r\n * 解析相对路径(处理 ./ 和 ../)\r\n * @param baseDir 基础目录\r\n * @param relativePath 相对路径\r\n * @returns 绝对路径\r\n */\r\n private resolveRelativePath(baseDir: string, relativePath: string): string {\r\n // 规范化路径(统一使用 / 分隔符)\r\n const normalizedBase = baseDir.replace(/\\\\/g, '/');\r\n const normalizedRelative = relativePath.replace(/\\\\/g, '/');\r\n \r\n // 分割路径\r\n const baseParts = normalizedBase.split('/').filter(p => p.length > 0);\r\n const relativeParts = normalizedRelative.split('/');\r\n \r\n // 处理每个部分\r\n for (const part of relativeParts) {\r\n if (part === '.') {\r\n // 当前目录,忽略\r\n continue;\r\n } else if (part === '..') {\r\n // 上级目录\r\n if (baseParts.length > 0) {\r\n baseParts.pop();\r\n }\r\n } else {\r\n baseParts.push(part);\r\n }\r\n }\r\n \r\n // 重建路径\r\n const result = '/' + baseParts.join('/');\r\n return result;\r\n }\r\n\r\n /**\r\n * 确保执行器已初始化(延迟初始化)\r\n */\r\n private ensureExecutorsInitialized(): void {\r\n if (this.toolExecutor && this.reactRunner) return;\r\n\r\n // Debug 推送接口\r\n const debugPusher: DebugPusher = {\r\n pushMessages: (agentId: string, messages: Message[]) => {\r\n if (this.debugHub) {\r\n this.debugHub.pushMessages(agentId, messages);\r\n }\r\n },\r\n };\r\n\r\n // 初始化 ToolExecutor\r\n this.toolExecutor = new ToolExecutor(\r\n this.tools,\r\n this.contextInjectors,\r\n this,\r\n (hookName, hookFn, options) => executeHook(this, hookFn, { hookName, ...options }),\r\n (ctx) => (this as any).onToolUse(ctx),\r\n (result) => (this as any).onToolFinished(result),\r\n this.hooksRegistry\r\n );\r\n\r\n // 初始化 ReActLoopRunner\r\n this.reactRunner = new ReActLoopRunner(\r\n {\r\n llm: this.llm,\r\n tools: this.tools,\r\n maxTurns: this.maxTurns,\r\n debugEnabled: this.debugEnabled,\r\n agentId: this.agentId,\r\n _currentStep: this._currentStep,\r\n _agentId: this._agentId,\r\n _parentPool: this._parentPool,\r\n debugPusher,\r\n features: this.features,\r\n hooksRegistry: this.hooksRegistry,\r\n recordUsage: (callIndex: number, step: number, usage: UsageInfo) => this.recordUsage(callIndex, step, usage),\r\n endCallUsage: (callIndex: number) => this.endCallUsage(callIndex),\r\n dispatchTurnActivations: (refs: string[], context: import('./context.js').Context) => this.dispatchTurnActivations(refs, context),\r\n stepSaveFn: this._createStepSaveFn(),\r\n peekContinuationRequest: () => this._continuationRequest,\r\n },\r\n (hookName, hookFn, options) => executeHook(this, hookFn, { hookName, ...options }),\r\n (call, input, context, step, callIndex) => this.toolExecutor!.execute(call, input, context, step, callIndex),\r\n (ctx) => (this as any).onStepStart(ctx),\r\n (ctx) => (this as any).onStepFinished(ctx),\r\n (ctx) => (this as any).onInterrupt(ctx)\r\n );\r\n }\r\n\r\n /**\r\n * 推送到 DebugHub\r\n */\r\n private pushToDebug(messages: Message[]): void {\r\n if (this.debugEnabled && this.agentId && this.debugHub) {\r\n this.debugHub.pushMessages(this.agentId, messages);\r\n this.debugHub.updateAgentOverview(this.agentId, this.buildOverviewSnapshot());\r\n }\r\n }\r\n\r\n private pushOverviewSnapshot(): void {\r\n if (this.debugEnabled && this.agentId && this.debugHub) {\r\n this.debugHub.updateAgentOverview(this.agentId, this.buildOverviewSnapshot());\r\n }\r\n }\r\n\r\n private createCallOutcome(\r\n result: import('./agent/types.js').ReActResult,\r\n startedAt: number,\r\n ): import('./lifecycle.js').CallOutcome {\r\n const status = result.completed\r\n ? 'completed'\r\n : result.finishReason === 'cancelled'\r\n ? 'cancelled'\r\n : result.finishReason === 'continued'\r\n ? 'continued'\r\n : 'failed';\r\n return {\r\n status,\r\n reason: result.finishReason,\r\n response: result.finalResponse,\r\n steps: result.turns,\r\n startedAt,\r\n finishedAt: Date.now(),\r\n ...(result.error ? { error: result.error } : {}),\r\n ...(result.model ? { model: result.model } : {}),\r\n };\r\n }\r\n\r\n private async captureRuntimeSnapshot(context?: Context, callIndexOverride?: number): Promise<AgentRuntimeSnapshot> {\r\n await this.ensureFeatureTools();\r\n return {\r\n initialized: this._initialized,\r\n callIndex: callIndexOverride ?? this._callIndex,\r\n context: context?.toJSON(),\r\n featureStates: captureFeatureSnapshots(this.features),\r\n usageStats: this.usageStats.toSnapshot(),\r\n ...(this._lastCallOutcome ? { lastCallOutcome: this._lastCallOutcome } : {}),\r\n };\r\n }\r\n\r\n private async restoreRuntimeSnapshot(snapshot: AgentRuntimeSnapshot): Promise<void> {\r\n if (snapshot.context) {\r\n this.persistentContext = Context.fromJSON(snapshot.context);\r\n } else {\r\n this.persistentContext = undefined;\r\n }\r\n await restoreFeatureSnapshots(snapshot.featureStates, this.features);\r\n this._initialized = snapshot.initialized;\r\n this._callIndex = snapshot.callIndex;\r\n this._currentStep = 0;\r\n\r\n // 恢复用量统计\r\n if (snapshot.usageStats) {\r\n this.usageStats.fromSnapshot(snapshot.usageStats);\r\n }\r\n\r\n // 恢复最近一次 Call 的结构化终态\r\n this._lastCallOutcome = snapshot.lastCallOutcome ?? null;\r\n }\r\n\r\n private commitCallCheckpoint(checkpoint: CallRollbackCheckpoint): void {\r\n this._callCheckpoints = this._callCheckpoints\r\n .filter(entry => entry.callIndex < checkpoint.callIndex)\r\n .concat(checkpoint);\r\n }\r\n\r\n /**\r\n * 将反序列化的 checkpoint entry 归一化为 v2 union 格式。\r\n *\r\n * - 有 `kind` 字段 → 已是 v2 格式,直接断言返回\r\n * - 无 `kind` 但有 `runtime` → v1 格式,尝试 lazy migration 转 boundary;\r\n * 无法安全转换的保留为 legacy-full-snapshot\r\n */\r\n private normalizeCheckpointEntry(entry: Record<string, unknown>): CallRollbackCheckpoint {\r\n if (entry.kind === 'context-boundary' || entry.kind === 'legacy-full-snapshot') {\r\n return entry as unknown as CallRollbackCheckpoint;\r\n }\r\n\r\n // v1 格式:{ callIndex, draftInput, runtime }\r\n const callIndex = typeof entry.callIndex === 'number' ? entry.callIndex : -1;\r\n const draftInput = typeof entry.draftInput === 'string' ? entry.draftInput : '';\r\n const runtime = entry.runtime as AgentRuntimeSnapshot | undefined;\r\n\r\n if (!runtime) {\r\n return {\r\n kind: 'legacy-full-snapshot',\r\n callIndex,\r\n draftInput,\r\n runtime: { initialized: false, callIndex, context: undefined, featureStates: [] },\r\n legacyReason: 'v1 entry missing runtime',\r\n };\r\n }\r\n\r\n // 尝试 lazy migration:如果 runtime.context.messages 是当前 Context 的前缀,\r\n // 转为 boundary;否则保留 legacy\r\n const context = this.persistentContext;\r\n const cpContext = runtime.context;\r\n const cpMessages = cpContext?.messages;\r\n if (context && cpContext && Array.isArray(cpMessages)) {\r\n const currentMessages = context.getAll();\r\n if (cpMessages.length <= currentMessages.length) {\r\n const currentGen = context.captureBoundary().generation;\r\n const enrichedLen = Array.isArray(cpContext.enrichedMessages)\r\n ? cpContext.enrichedMessages.length\r\n : cpMessages.length;\r\n return {\r\n kind: 'context-boundary',\r\n callIndex,\r\n draftInput,\r\n contextBoundary: {\r\n messagesLength: cpMessages.length,\r\n enrichedMessagesLength: enrichedLen,\r\n sequence: cpContext.sequence ?? enrichedLen,\r\n generation: currentGen,\r\n },\r\n runtimeState: {\r\n initialized: runtime.initialized,\r\n callIndex: runtime.callIndex,\r\n featureStates: runtime.featureStates ?? [],\r\n usageStats: runtime.usageStats,\r\n },\r\n };\r\n }\r\n }\r\n\r\n return {\r\n kind: 'legacy-full-snapshot',\r\n callIndex,\r\n draftInput,\r\n runtime,\r\n legacyReason: 'v1 checkpoint not a prefix of current context',\r\n };\r\n }\r\n\r\n /**\r\n * 捕获不含 Context 的运行态(用于增量 checkpoint)。\r\n */\r\n private async captureRuntimeStateWithoutContext(callIndexOverride?: number): Promise<RuntimeStateWithoutContext> {\r\n await this.ensureFeatureTools();\r\n return {\r\n initialized: this._initialized,\r\n callIndex: callIndexOverride ?? this._callIndex,\r\n featureStates: captureFeatureSnapshots(this.features),\r\n usageStats: this.usageStats.toSnapshot(),\r\n ...(this._lastCallOutcome ? { lastCallOutcome: this._lastCallOutcome } : {}),\r\n };\r\n }\r\n\r\n /**\r\n * 恢复不含 Context 的运行态(用于增量 rollback)。\r\n * 调用前应已通过 truncateToBoundary 截断 Context。\r\n */\r\n private async restoreRuntimeStateWithoutContext(state: RuntimeStateWithoutContext): Promise<void> {\r\n await restoreFeatureSnapshots(state.featureStates, this.features);\r\n this._initialized = state.initialized;\r\n this._callIndex = state.callIndex;\r\n this._currentStep = 0;\r\n if (state.usageStats) {\r\n this.usageStats.fromSnapshot(state.usageStats);\r\n }\r\n }\r\n\r\n private normalizeSessionSnapshot(snapshot: AgentSessionSnapshot & Record<string, unknown>): AgentSessionSnapshot {\r\n if ('runtime' in snapshot && snapshot.runtime) {\r\n return snapshot;\r\n }\r\n\r\n const legacyContext = snapshot.context as ContextSnapshot | undefined;\r\n const legacyFeatureStates = Array.isArray(snapshot.featureStates) ? snapshot.featureStates : [];\r\n const legacyCallIndex = typeof snapshot.callIndex === 'number' ? snapshot.callIndex : -1;\r\n\r\n return {\r\n version: typeof snapshot.version === 'number' ? snapshot.version : 1,\r\n sessionId: typeof snapshot.sessionId === 'string' ? snapshot.sessionId : 'legacy-session',\r\n savedAt: typeof snapshot.savedAt === 'number' ? snapshot.savedAt : Date.now(),\r\n agentType: typeof snapshot.agentType === 'string' ? snapshot.agentType : this.constructor.name,\r\n runtime: {\r\n initialized: Boolean(snapshot.initialized),\r\n callIndex: legacyCallIndex,\r\n context: legacyContext,\r\n featureStates: legacyFeatureStates,\r\n },\r\n rollbackHistory: [],\r\n };\r\n }\r\n\r\n private syncRegisteredToolsToDebug(): void {\r\n if (this.debugEnabled && this.agentId && this.debugHub) {\r\n this.debugHub.registerAgentTools(this.agentId, this.tools.getAll());\r\n }\r\n }\r\n\r\n private pushInspectorSnapshot(): void {\r\n if (this.debugEnabled && this.agentId && this.debugHub) {\r\n this.debugHub.updateAgentInspector(this.agentId, this.buildHookInspectorSnapshot());\r\n }\r\n }\r\n\r\n private buildOverviewSnapshot(): AgentOverviewSnapshot {\r\n const messages = this.getContext().getAll();\r\n const contextChars = messages.reduce((sum, message) => {\r\n const contentLength = typeof message.content === 'string' ? message.content.length : 0;\r\n const reasoningLength = typeof message.reasoning === 'string' ? message.reasoning.length : 0;\r\n const thinkingLength = Array.isArray(message.thinkingBlocks)\r\n ? message.thinkingBlocks.reduce((blockSum, block) => blockSum + (block.thinking?.length || 0), 0)\r\n : 0;\r\n const toolCallLength = Array.isArray(message.toolCalls)\r\n ? JSON.stringify(message.toolCalls).length\r\n : 0;\r\n return sum + contentLength + reasoningLength + thinkingLength + toolCallLength;\r\n }, 0);\r\n\r\n const toolCallCount = messages.reduce((sum, message) => sum + (message.toolCalls?.length || 0), 0);\r\n const turnCount = messages.reduce((maxTurn, message) => Math.max(maxTurn, typeof message.turn === 'number' ? message.turn + 1 : maxTurn), 0);\r\n\r\n return {\r\n updatedAt: Date.now(),\r\n context: {\r\n messageCount: messages.length,\r\n charCount: contextChars,\r\n toolCallCount,\r\n turnCount,\r\n },\r\n usageStats: this.usageStats.toSnapshot(),\r\n ...(typeof (this.llm as any)?.modelName === 'string'\r\n ? { modelName: (this.llm as any).modelName }\r\n : {}),\r\n ...(typeof this._llmMeta.presetName === 'string' && this._llmMeta.presetName\r\n ? { presetName: this._llmMeta.presetName }\r\n : {}),\r\n ...(this._llmMeta.thinkingEffort != null\r\n ? { thinkingEffort: this._llmMeta.thinkingEffort }\r\n : {}),\r\n ...(typeof this._llmMeta.contextLength === 'number' && this._llmMeta.contextLength > 0\r\n ? { contextLength: this._llmMeta.contextLength }\r\n : {}),\r\n ...(typeof this._llmMeta.compressRatio === 'number' && this._llmMeta.compressRatio > 0\r\n ? { compressRatio: this._llmMeta.compressRatio }\r\n : {}),\r\n };\r\n }\r\n\r\n private buildHookInspectorSnapshot(): HookInspectorSnapshot {\r\n const hookGroups = this.hooksRegistry.getSnapshot();\r\n const hookCountByFeature = new Map<string, number>();\r\n const toolEntriesBySource = new Map<string, Array<{\r\n name: string;\r\n description: string;\r\n state: 'enabled' | 'disabled' | 'removed' | 'superseded';\r\n enabled: boolean;\r\n renderCall?: string;\r\n renderResult?: string;\r\n source?: string;\r\n parameters?: Record<string, unknown>;\r\n }>>();\r\n\r\n const summarizeToolDescription = (description: string | undefined): string => {\r\n if (!description) return '';\r\n const normalized = description\r\n .replace(/\\r\\n/g, '\\n')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n if (!normalized) return '';\r\n return normalized.length > 180 ? `${normalized.slice(0, 177)}...` : normalized;\r\n };\r\n\r\n for (const group of hookGroups) {\r\n for (const entry of group.entries) {\r\n hookCountByFeature.set(entry.featureName, (hookCountByFeature.get(entry.featureName) || 0) + 1);\r\n }\r\n }\r\n\r\n for (const entry of this.tools.getEntries()) {\r\n const sourceKey = entry.source || '__no_source__';\r\n if (!toolEntriesBySource.has(sourceKey)) {\r\n toolEntriesBySource.set(sourceKey, []);\r\n }\r\n\r\n const renderCall = typeof entry.tool.render?.call === 'string'\r\n ? entry.tool.render.call\r\n : entry.tool.render?.call\r\n ? 'inline'\r\n : undefined;\r\n const renderResult = typeof entry.tool.render?.result === 'string'\r\n ? entry.tool.render.result\r\n : entry.tool.render?.result\r\n ? 'inline'\r\n : undefined;\r\n\r\n toolEntriesBySource.get(sourceKey)!.push({\r\n name: entry.tool.name,\r\n description: summarizeToolDescription(entry.tool.description),\r\n state: entry.state,\r\n enabled: entry.state === 'enabled',\r\n renderCall,\r\n renderResult,\r\n source: entry.source,\r\n parameters: entry.tool.parameters,\r\n });\r\n }\r\n\r\n // 已知的 feature name 集合\r\n const featureNames = new Set(this.features.keys());\r\n\r\n const features = Array.from(this.features.values()).map(feature => {\r\n const tools = toolEntriesBySource.get(feature.name) || [];\r\n const enabledToolCount = tools.filter(tool => tool.state === 'enabled').length;\r\n const disabledToolCount = tools.filter(tool => tool.state === 'disabled').length;\r\n const removedToolCount = tools.filter(tool => tool.state === 'removed').length;\r\n const supersededToolCount = tools.filter(tool => tool.state === 'superseded').length;\r\n const activeToolCount = tools.length - supersededToolCount;\r\n const status: 'enabled' | 'disabled' | 'removed' | 'partial' = activeToolCount === 0\r\n ? 'enabled'\r\n : removedToolCount === activeToolCount\r\n ? 'removed'\r\n : disabledToolCount === activeToolCount\r\n ? 'disabled'\r\n : enabledToolCount === activeToolCount\r\n ? 'enabled'\r\n : 'partial';\r\n\r\n return {\r\n name: feature.name,\r\n enabled: status === 'enabled',\r\n status,\r\n hookCount: hookCountByFeature.get(feature.name) || 0,\r\n toolCount: tools.length,\r\n enabledToolCount,\r\n source: typeof (feature as any).source === 'string'\r\n ? (feature as any).source\r\n : hookGroups.flatMap(group => group.entries)\r\n .find(entry => entry.featureName === feature.name)?.source?.file,\r\n description: typeof (feature as any).description === 'string'\r\n ? (feature as any).description\r\n : undefined,\r\n tools,\r\n };\r\n });\r\n\r\n // 收集不属于任何 feature 的工具(游离工具)\r\n const standaloneTools: Array<{\r\n name: string;\r\n description: string;\r\n state: 'enabled' | 'disabled' | 'removed' | 'superseded';\r\n enabled?: boolean;\r\n source?: string;\r\n renderCall?: string;\r\n renderResult?: string;\r\n parameters?: Record<string, unknown>;\r\n }> = [];\r\n for (const [sourceKey, tools] of toolEntriesBySource) {\r\n if (!featureNames.has(sourceKey)) {\r\n for (const tool of tools) {\r\n standaloneTools.push(tool);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n lifecycleOrder: hookGroups.map(group => group.lifecycle),\r\n features,\r\n hooks: hookGroups,\r\n standaloneTools: standaloneTools.length > 0 ? standaloneTools : undefined,\r\n };\r\n }\r\n\r\n // ========== 生命周期钩子(扩展返回值)==========\r\n\r\n // Agent/Call 级:保持 void\r\n protected async onInitiate(_ctx: AgentInitiateContext): Promise<void> {}\r\n protected async onDestroy(_ctx: AgentDestroyContext): Promise<void> {}\r\n protected async onCallStart(_ctx: CallStartContext): Promise<void> {}\r\n protected async onCallFinish(_ctx: CallFinishContext): Promise<void> {}\r\n protected async onStepStart(_ctx: StepStartContext): Promise<void> {}\r\n\r\n /**\r\n * Step 结束钩子(扩展支持流控制)\r\n *\r\n * @returns\r\n * - undefined: 默认行为\r\n * - { action: 'continue' }: 继续下一步\r\n * - { action: 'end' }: 强制结束循环\r\n */\r\n protected async onStepFinished(_ctx: StepFinishedContext): Promise<HookResult | undefined> {\r\n // 移除硬编码依赖:反向钩子通过 HooksRegistry 执行\r\n return undefined;\r\n }\r\n\r\n protected async onToolUse(_ctx: ToolContext): Promise<HookResult | undefined> {\r\n return undefined;\r\n }\r\n\r\n /**\r\n * 工具执行完成钩子\r\n */\r\n protected async onToolFinished(_result: ToolResult): Promise<void> {\r\n // 移除硬编码依赖:反向钩子通过 HooksRegistry 执行\r\n }\r\n\r\n // SubAgent 钩子\r\n public async onSubAgentSpawn(_ctx: SubAgentSpawnContext): Promise<void> {}\r\n public async onSubAgentUpdate(_ctx: SubAgentUpdateContext): Promise<void> {}\r\n public async onSubAgentDestroy(_ctx: SubAgentDestroyContext): Promise<void> {}\r\n public async onSubAgentInterrupt(_ctx: SubAgentInterruptContext): Promise<void> {}\r\n\r\n // 中断钩子\r\n protected async onInterrupt(ctx: AgentInterruptContext): Promise<string> {\r\n return `[执行被中断: ${ctx.reason}]`;\r\n }\r\n}\r\n\r\n// 导出 Agent 类\r\nexport { AgentBase as Agent };\r\n\r\n","/**\n * 钩子执行器\n *\n * 统一的钩子执行包装器,处理错误策略\n */\n\nimport { createLogger, runWithLogScope } from '../logging.js';\n\nconst hookLogger = createLogger('agent.forward-hook');\n\r\n// 定义 Agent 接口,包含必要的钩子错误处理方法\r\nexport interface AgentLike {\r\n getHookErrorHandling?(hookName: string): HookErrorHandling | undefined;\r\n}\r\n\r\n/**\r\n * 钩子错误处理策略\r\n */\r\nexport enum HookErrorHandling {\r\n /** 静默失败:记录警告,不中断主流程 */\r\n Silent = 'silent',\r\n /** 传播异常:中断整个 onCall 流程 */\r\n Propagate = 'propagate',\r\n /** 记录后传播:先记录日志再抛出 */\r\n Logged = 'logged',\r\n}\r\n\r\n/**\r\n * 钩子函数类型\r\n */\r\nexport type HookFunction<T> = () => Promise<T>;\r\n\r\n/**\r\n * 钩子执行选项\r\n */\r\nexport interface HookExecuteOptions {\r\n /** 钩子名称 */\r\n hookName: string;\r\n /** 用户输入 */\r\n input?: string;\r\n /** 当前轮次 */\r\n turn?: number;\r\n}\r\n\r\n/**\r\n * 执行钩子并处理错误\r\n *\r\n * @param agent Agent 实例(需要调用 getHookErrorHandling)\r\n * @param hookFn 钩子函数\r\n * @param options 执行选项\r\n * @returns 钩子返回值,出错时返回 undefined\r\n */\r\nexport async function executeHook<T>(\n agent: AgentLike,\n hookFn: HookFunction<T>,\n options: HookExecuteOptions\n): Promise<T | undefined> {\n const { hookName } = options;\n\r\n // 获取错误处理策略(由 Agent 实现)\r\n const strategy = agent.getHookErrorHandling?.(hookName) ?? HookErrorHandling.Propagate;\r\n\r\n try {\n return await runWithLogScope(\n {\n lifecycle: hookName,\n hookKind: 'forward',\n namespace: 'agent.forward-hook',\n tags: [`forward-hook:${hookName}`],\n },\n async () => await hookFn()\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\r\n switch (strategy) {\r\n case HookErrorHandling.Silent:\n hookLogger.warn(`${hookName} hook error (silenced)`, { message });\n console.warn(`[Agent] ${hookName} hook error (silenced): ${message}`);\n return undefined;\n case HookErrorHandling.Logged:\n hookLogger.error(`${hookName} hook error`, { message });\n console.error(`[Agent] ${hookName} hook error:`, error);\n throw error;\n case HookErrorHandling.Propagate:\n default:\n hookLogger.error(`${hookName} hook error`, { message });\n throw error;\n }\n }\n}\n","/**\r\n * 模板解析器\r\n *\r\n * 负责系统提示词的解析和渲染\r\n */\r\n\r\nimport type { TemplateSource, PlaceholderContext } from '../../template/types.js';\r\nimport { TemplateComposer } from '../../template/composer.js';\r\nimport { type TemplateLoader } from '../../template/loader.js';\r\nimport type { DataSourceRegistry } from '../../template/data-source.js';\r\n\r\n/**\r\n * 模板解析器类\r\n */\r\nexport class TemplateResolver {\r\n private systemMessage?: string | TemplateSource;\r\n private systemContext?: PlaceholderContext;\r\n private templateComposer?: TemplateComposer;\r\n private templateLoader: TemplateLoader;\r\n private dataSourceRegistry: DataSourceRegistry;\r\n\r\n constructor(\r\n systemMessage: string | TemplateSource | undefined,\r\n systemContext: PlaceholderContext | undefined,\r\n templateComposer: TemplateComposer | undefined,\r\n templateLoader: TemplateLoader,\r\n dataSourceRegistry: DataSourceRegistry\r\n ) {\r\n this.systemMessage = systemMessage;\r\n this.systemContext = systemContext;\r\n this.templateComposer = templateComposer;\r\n this.templateLoader = templateLoader;\r\n this.dataSourceRegistry = dataSourceRegistry;\r\n }\r\n\r\n /**\r\n * 设置新的系统消息\r\n */\r\n setSystemMessage(prompt: string | TemplateSource): void {\r\n // TemplateComposer 实例\r\n if (prompt instanceof TemplateComposer) {\r\n this.templateComposer = prompt;\r\n this.systemMessage = undefined;\r\n } else {\r\n // 字符串或 { file: string }\r\n this.systemMessage = prompt;\r\n this.templateComposer = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 设置系统上下文\r\n */\r\n setSystemContext(context: PlaceholderContext): void {\r\n this.systemContext = context;\r\n }\r\n\r\n /**\r\n * 获取当前系统上下文(可变引用)\r\n *\r\n * 供 Agent.setLLM() 更新 SYSTEM_CURRENT_MODEL 等占位符变量。\r\n */\r\n getSystemContext(): PlaceholderContext | undefined {\r\n return this.systemContext;\r\n }\r\n\r\n /**\r\n * 解析系统提示词(渲染模板)\r\n */\r\n async resolve(): Promise<string> {\r\n const context: PlaceholderContext = {\r\n ...this.systemContext,\r\n };\r\n\r\n // 直接字符串\r\n if (typeof this.systemMessage === 'string') {\r\n const { PlaceholderResolver } = await import('../../template/resolver.js');\r\n return PlaceholderResolver.resolve(this.systemMessage, context);\r\n }\r\n\r\n // TemplateComposer 实例\r\n if (this.templateComposer) {\r\n this.templateComposer.setDataSourceRegistry(this.dataSourceRegistry);\r\n const result = await this.templateComposer.render(context);\r\n return result.content;\r\n }\r\n\r\n // 文件路径 { file: string }\r\n if (this.systemMessage && typeof this.systemMessage === 'object' && 'file' in this.systemMessage) {\r\n const content = await this.templateLoader.load(this.systemMessage.file);\r\n const { PlaceholderResolver } = await import('../../template/resolver.js');\r\n return PlaceholderResolver.resolve(content, context);\r\n }\r\n\r\n return '';\r\n }\r\n}\r\n","/**\n * Utility for tools to return a display-only payload alongside a compact text result.\n *\n * Tools call {@link withDisplay} in their `execute()` function to declare\n * a split between what the LLM sees (compact `text`) and what the frontend\n * renders (rich `display` data). The tool-executor detects the\n * `__withDisplay` marker and routes the display data into {@link ToolExecResult.display},\n * which is attached to the tool message without being injected into the LLM prompt.\n *\n * The text portion is stored as the normal tool result string (injected into\n * LLM context), while the display data is stored alongside on the message\n * for frontend rendering only.\n */\n\nconst TOOL_DISPLAY_MARKER = '__withDisplay';\n\n/**\n * Structured return shape recognized by the tool-executor.\n * Tools should not construct this object manually — use {@link withDisplay} instead.\n */\nexport interface WithDisplayResult {\n /** Marker field — always `true`. Do not set manually. */\n readonly __withDisplay: true;\n /** Compact text result returned to the LLM as the normal tool output. */\n readonly text: string;\n /** Rich data for frontend rendering only — never injected into LLM context. */\n readonly display: unknown;\n}\n\n/**\n * Wrap a compact text result with display data so the framework knows to\n * separate the two: text goes to the LLM, display goes to the frontend.\n *\n * @example\n * ```ts\n * execute: async ({ filePath, content }) => {\n * // ... write file ...\n * const diff = createTwoFilesPatch(filePath, filePath, oldContent, content);\n * return withDisplay(\n * JSON.stringify({ filePath, existed, message: 'File created successfully' }),\n * { diff, filePath, existed }\n * );\n * }\n * ```\n *\n * The returned object is recognized by the tool-executor via the\n * `__withDisplay` marker. Tools that don't need display separation should\n * simply return a normal value (string, object, etc.) — no wrapper needed.\n */\nexport function withDisplay(text: string, display: unknown): WithDisplayResult {\n return { __withDisplay: true, text, display };\n}\n\n/**\n * Type guard: does this value carry the `__withDisplay` marker?\n */\nexport function isWithDisplayResult(data: unknown): data is WithDisplayResult {\n return (\n typeof data === 'object' &&\n data !== null &&\n !Array.isArray(data) &&\n (data as Record<string, unknown>)[TOOL_DISPLAY_MARKER] === true\n );\n}\n","/**\r\n * 工具执行器\r\n *\r\n * 封装单个工具的执行逻辑\r\n */\r\n\r\nimport type { ToolCall, Message, ToolExecutionContext, ToolTerminationReason } from '../types.js';\r\nimport type { ToolRegistry } from '../tool.js';\r\nimport type { Context } from '../context.js';\r\nimport type { AgentFeature, ContextInjector } from '../feature.js';\r\nimport type { ToolContext, ToolResult, HookResult, ToolFinishedDecisionContext, ToolResultTransformContext } from '../lifecycle.js';\r\nimport type { ToolExecResult } from '../context.js';\r\nimport type { HooksRegistry } from '../hooks-registry.js';\r\nimport { CoreLifecycle, normalizeDecision, Decision } from '../lifecycle.js';\r\nimport { isWithImagesResult } from '../tool-result-images.js';\r\nimport { isWithDisplayResult } from '../tool-result-display.js';\r\nimport { createLogger, runWithLogScope } from '../logging.js';\r\n\r\nconst logger = createLogger('agent.tool');\r\n\r\n/**\r\n * settle 窗口时长(ticket 023 / ADR-0005)。\r\n *\r\n * 终止信号(超时/用户打断)触发后,不再立即 reject,而是给工具最多这个时长\r\n * 优雅收尾:窗口内 resolve 的结果正常返回(success: true + interrupted 标注);\r\n * 超窗未收尾才降级为 ToolInterruptError 路径。\r\n */\r\nexport const TOOL_TERMINATION_SETTLE_MS = 1000;\r\n\r\n/** 合并 controller 的终止原因 → 结果标注的 reason 映射相同;此处仅约束类型。 */\r\ntype TerminationSource = ToolTerminationReason;\r\n\r\n/** 执行并清空清理函数列表(abort listener / 超时计时器等一次性资源)。 */\r\nfunction runCleanupFns(fns: Array<() => void>): void {\r\n for (const fn of fns.splice(0)) {\r\n try {\r\n fn();\r\n } catch {\r\n // 清理失败不影响主流程\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 工具中断错误\r\n *\r\n * 当 AbortSignal 触发时,Promise.race 中此错误被抛出,\r\n * 使工具执行立即结束,不等实际工具完成。\r\n */\r\nclass ToolInterruptError extends Error {\r\n constructor(public readonly reason: TerminationSource = 'user') {\r\n super(reason === 'timeout' ? 'Tool timed out' : 'Interrupted by user');\r\n this.name = 'AbortError';\r\n }\r\n}\r\n\r\n/**\r\n * 工具执行器类\r\n */\r\nexport class ToolExecutor {\r\n constructor(\r\n private tools: ToolRegistry,\r\n private contextInjectors: Array<{\r\n pattern: string | RegExp;\r\n injector: ContextInjector;\r\n }>,\r\n private parentAgent: any,\r\n private executeHookFn: (\r\n hookName: string,\r\n hookFn: () => Promise<any>,\r\n options: { input?: string; step?: number }\r\n ) => Promise<any>,\r\n private onToolUseFn: (ctx: ToolContext) => Promise<HookResult | undefined>,\r\n private onToolFinishedFn: (result: ToolResult) => Promise<void>,\r\n private hooksRegistry: HooksRegistry\r\n ) {}\r\n\r\n /**\r\n * 工具成功返回值 → ToolExecResult(保留 images / display 分离协议,\r\n * 可选携带终止标注)。\r\n */\r\n private buildSuccessExecResult(\r\n data: unknown,\r\n interrupted?: { reason: TerminationSource },\r\n ): ToolExecResult {\r\n if (isWithImagesResult(data)) {\r\n return {\r\n success: true,\r\n result: data.text,\r\n images: data.images,\r\n ...(interrupted ? { interrupted } : {}),\r\n };\r\n }\r\n if (isWithDisplayResult(data)) {\r\n return {\r\n success: true,\r\n result: data.text,\r\n display: data.display,\r\n ...(interrupted ? { interrupted } : {}),\r\n };\r\n }\r\n return {\r\n success: true,\r\n result: typeof data === 'string' ? data : JSON.stringify(data),\r\n ...(interrupted ? { interrupted } : {}),\r\n };\r\n }\r\n\r\n /**\r\n * 执行单个工具\r\n */\r\n async execute(\r\n call: ToolCall,\r\n input: string,\r\n context: Context,\r\n step: number,\r\n callIndex: number // 用户交互序号\r\n ): Promise<ToolExecResult> {\r\n return await runWithLogScope({\r\n step,\r\n toolName: call.name,\r\n toolCallId: call.id,\r\n feature: this.tools.getSource(call.name),\r\n namespace: 'agent.tool',\r\n tags: [\r\n 'tool',\r\n `tool:${call.name}`,\r\n ...(this.tools.getSource(call.name) ? [`feature:${this.tools.getSource(call.name)}`] : []),\r\n ],\r\n }, async () => {\r\n const tool = this.tools.get(call.name);\r\n const startTime = Date.now();\r\n\r\n const toolCtx: ToolContext = {\r\n call,\r\n tool: tool!,\r\n step,\r\n input,\r\n context,\r\n getFeature: <T extends AgentFeature>(featureName: string): T | undefined => {\r\n return this.parentAgent.getFeature(featureName) as T | undefined;\r\n },\r\n };\r\n\r\n logger.info('Tool execution scheduled', {\r\n toolName: call.name,\r\n arguments: call.arguments,\r\n step,\r\n });\r\n\r\n if (tool && this.tools.isDisabled(call.name)) {\r\n const result: ToolResult = {\r\n success: false,\r\n data: null,\r\n error: 'This tool is currently disabled and cannot be used.',\r\n duration: Date.now() - startTime,\r\n call,\r\n tool,\r\n step,\r\n input,\r\n context,\r\n getFeature: <T extends AgentFeature>(featureName: string): T | undefined => {\r\n return this.parentAgent.getFeature(featureName) as T | undefined;\r\n },\r\n };\r\n\r\n logger.warn('Tool execution blocked', {\r\n toolName: call.name,\r\n reason: result.error,\r\n });\r\n\r\n const errorResult: ToolExecResult = {\r\n success: false,\r\n result: { error: result.error },\r\n };\r\n\r\n await this.executeHookFn(\r\n 'onToolFinished',\r\n () => this.onToolFinishedFn(result),\r\n { input, step }\r\n );\r\n\r\n const decisionCtx: ToolFinishedDecisionContext = {\r\n ...result,\r\n delivered: errorResult,\r\n toolName: call.name,\r\n };\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.ToolFinished, decisionCtx);\r\n\r\n return errorResult;\r\n }\r\n\r\n // ========== ToolUse 正向钩子 ==========\r\n let blocked = false;\r\n let blockReason: string | undefined;\r\n\r\n const hookResult = await this.executeHookFn(\r\n 'onToolUse',\r\n () => this.onToolUseFn(toolCtx),\r\n { input, step }\r\n );\r\n\r\n if (hookResult) {\r\n if (hookResult.action === 'block') {\r\n blocked = true;\r\n blockReason = hookResult.reason;\r\n }\r\n // action: 'allow' 或 undefined 都放行\r\n }\r\n\r\n // ========== ToolUse 反向钩子(流程控制)==========\r\n const useDecisionResult = await this.hooksRegistry.executeDecision(CoreLifecycle.ToolUse, toolCtx);\r\n const useDecision = normalizeDecision(useDecisionResult);\r\n\r\n // 处理反向钩子的决策\r\n if (useDecision === Decision.Deny) {\r\n blocked = true;\r\n blockReason = typeof useDecisionResult === 'object' && useDecisionResult.reason\r\n ? useDecisionResult.reason\r\n : 'Tool blocked by reverse hook';\r\n }\r\n\r\n const result: ToolResult = {\r\n success: false,\r\n data: null,\r\n error: this.tools.isDisabled(call.name)\r\n ? 'This tool is currently disabled and cannot be used.'\r\n : blockReason || (tool ? undefined : `Tool \"${call.name}\" not found`),\r\n duration: Date.now() - startTime,\r\n call,\r\n tool: tool!,\r\n step,\r\n input,\r\n context,\r\n getFeature: <T extends AgentFeature>(featureName: string): T | undefined => {\r\n return this.parentAgent.getFeature(featureName) as T | undefined;\r\n },\r\n };\r\n\r\n if (blocked || !tool || this.tools.isDisabled(call.name)) {\r\n logger.warn('Tool execution blocked', {\r\n toolName: call.name,\r\n reason: result.error,\r\n });\r\n\r\n // 添加阻止结果到上下文\r\n const errorResult: ToolExecResult = {\r\n success: false,\r\n result: { error: result.error || 'Tool not found' },\r\n };\r\n\r\n // ========== ToolFinished 正向钩子 ==========\r\n await this.executeHookFn(\r\n 'onToolFinished',\r\n () => this.onToolFinishedFn(result),\r\n { input, step }\r\n );\r\n\r\n // ========== ToolFinished 反向钩子(纯通知)==========\r\n const decisionCtx: ToolFinishedDecisionContext = {\r\n ...result,\r\n delivered: errorResult,\r\n toolName: call.name,\r\n };\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.ToolFinished, decisionCtx);\r\n\r\n return errorResult;\r\n }\r\n\r\n let execResult: ToolExecResult;\r\n\r\n // 一次性资源清理(超时计时器等);正常路径在 race finally 中清理,\r\n // 异常路径由 catch 兜底,避免计时器泄漏挂住进程退出。\r\n const cleanupFns: Array<() => void> = [];\r\n // 当前 call 的唯一终止事实。所有终止路径(包括 settle 超窗)都消费它,\r\n // 禁止在下游按异常类型猜测 timeout/user。\r\n let terminationReason: TerminationSource | null = null;\r\n let terminationDeadline: number | null = null;\r\n\r\n try {\r\n // 执行工具\r\n // 使用声明的上下文注入器\r\n let toolContext: ToolExecutionContext | undefined = undefined;\r\n\r\n for (const { pattern, injector } of this.contextInjectors) {\r\n if (typeof pattern === 'string' && pattern === call.name) {\r\n toolContext = { ...(toolContext ?? {}), ...injector(call) };\r\n } else if (pattern instanceof RegExp && pattern.test(call.name)) {\r\n toolContext = { ...(toolContext ?? {}), ...injector(call) };\r\n }\r\n }\r\n\r\n // ========== 生效超时值(ticket 023)==========\r\n // clamp(fromArg ? args[fromArg] : defaultMs, 1, maxMs)\r\n // 未声明 timeout 的工具不受框架超时管辖,行为完全不变。\r\n const timeoutSpec = tool?.timeout;\r\n let timeoutMs: number | undefined;\r\n if (timeoutSpec && typeof timeoutSpec.defaultMs === 'number' && typeof timeoutSpec.maxMs === 'number' && timeoutSpec.maxMs > 0) {\r\n const requested = timeoutSpec.fromArg\r\n ? (call.arguments as Record<string, unknown>)?.[timeoutSpec.fromArg]\r\n : timeoutSpec.defaultMs;\r\n timeoutMs = Math.min(\r\n Math.max(Number.isFinite(requested) ? Number(requested) : timeoutSpec.defaultMs, 1),\r\n timeoutSpec.maxMs,\r\n );\r\n }\r\n\r\n // 注入 continuation request sink(供控制工具使用)\r\n toolContext = {\r\n ...(toolContext ?? {}),\r\n registerContinuationRequest: (request: import('../continuation.js').CallContinuationRequest) => {\r\n this.parentAgent.registerContinuationRequest(request);\r\n },\r\n };\r\n\r\n // 注入 callId 与终止原因查询函数(progress 配对 / 工具填写终止元数据)。\r\n // 纯增量注入:未声明 timeout 的工具不读取即无感;legacy 路径下\r\n // termination() 恒返回 null。\r\n toolContext = {\r\n ...toolContext,\r\n ...(call.id !== undefined ? { callId: call.id } : {}),\r\n termination: (): ToolTerminationReason | null => null,\r\n };\r\n\r\n try {\r\n const { emitNotification, createToolStart } = await import('../notification.js');\r\n emitNotification(createToolStart(call.name));\r\n } catch {\r\n // Ignore notification failures.\r\n }\r\n\r\n // ========== 框架级终止(ticket 023 / ADR-0005)==========\r\n let data: unknown;\r\n\r\n if (timeoutMs === undefined) {\r\n // ---------- 未声明 timeout:现状路径,行为与改动前逐字节一致 ----------\r\n const signal = this.parentAgent._abortController?.signal;\r\n if (signal) {\r\n toolContext = { ...toolContext, signal };\r\n }\r\n // 已中断则直接跳过\r\n if (signal?.aborted) {\r\n throw new ToolInterruptError();\r\n }\r\n if (signal) {\r\n // 将工具执行与 abort signal 竞争。\r\n // 当 signal abort 时立即返回,不等待工具完成。\r\n // 工具的实际执行在后台 fire-and-forget,其结果被丢弃。\r\n let removeAbortListener: (() => void) | undefined;\r\n const abortPromise = new Promise<never>((_, reject) => {\r\n const onAbort = () => reject(new ToolInterruptError());\r\n signal.addEventListener('abort', onAbort, { once: true });\r\n removeAbortListener = () => signal.removeEventListener('abort', onAbort);\r\n });\r\n try {\r\n data = await Promise.race([\r\n tool.execute(call.arguments, toolContext),\r\n abortPromise,\r\n ]);\r\n } finally {\r\n removeAbortListener?.();\r\n }\r\n // 如果工具完成后发现已被中断,仍然标记为 interrupted\r\n if (signal.aborted) {\r\n throw new ToolInterruptError();\r\n }\r\n } else {\r\n data = await tool.execute(call.arguments, toolContext);\r\n }\r\n\r\n result.success = true;\r\n result.data = data;\r\n\r\n execResult = this.buildSuccessExecResult(data);\r\n\r\n } else {\r\n // ---------- 声明 timeout:合并 signal + settle 窗口 ----------\r\n const externalSignal = this.parentAgent._abortController?.signal;\r\n\r\n // per-call 合并 AbortController:外部用户中断与框架超时汇入同一个\r\n // 合并 signal 传给工具;终止原因由执行器记录,经 termination()\r\n // 查询(不往 AbortSignal 上挂非标属性)。\r\n const mergedController = new AbortController();\r\n let cleanupExternalListener: (() => void) | undefined;\r\n if (externalSignal) {\r\n const onExternalAbort = () => {\r\n if (terminationReason === null) {\r\n terminationReason = 'user';\r\n terminationDeadline = Date.now() + TOOL_TERMINATION_SETTLE_MS;\r\n }\r\n mergedController.abort(externalSignal.reason);\r\n };\r\n if (externalSignal.aborted) {\r\n onExternalAbort();\r\n } else {\r\n externalSignal.addEventListener('abort', onExternalAbort, { once: true });\r\n cleanupExternalListener = () => externalSignal.removeEventListener('abort', onExternalAbort);\r\n }\r\n }\r\n\r\n const timeoutTimer = setTimeout(() => {\r\n if (!mergedController.signal.aborted) {\r\n terminationReason = 'timeout';\r\n terminationDeadline = Date.now() + TOOL_TERMINATION_SETTLE_MS;\r\n }\r\n mergedController.abort(new Error(`Tool timed out after ${timeoutMs}ms`));\r\n }, timeoutMs);\r\n // 注册到统一清理:覆盖内层 race 之前提前 throw 的路径\r\n // (如下方 signal.aborted 预检查),保证计时器必然被回收\r\n cleanupFns.push(() => clearTimeout(timeoutTimer));\r\n\r\n const signal = mergedController.signal;\r\n toolContext = { ...toolContext, signal };\r\n\r\n // 覆盖 termination():接通本调用的终止原因记录;\r\n // 暴露生效 timeoutMs(进度发射用,ticket 025)\r\n toolContext = {\r\n ...toolContext,\r\n termination: () => terminationReason,\r\n terminationDeadline: () => terminationDeadline,\r\n timeoutMs,\r\n };\r\n\r\n // 终止信号触发后不再立即 reject:先给工具最多 TOOL_TERMINATION_SETTLE_MS\r\n // 的 settle 窗口优雅收尾。窗口内 resolve → 结果正常返回并标注 interrupted;\r\n // 窗口内 throw → 走下方现有 catch;超窗未收尾 → 降级为 ToolInterruptError。\r\n try {\r\n // 已中断则直接跳过 settle(无输出可保留)\r\n if (signal.aborted) {\r\n throw new ToolInterruptError(terminationReason ?? 'user');\r\n }\r\n // 创建 abort 监听 Promise,并在 race 结束后清理 listener\r\n let removeAbortListener: (() => void) | undefined;\r\n const abortPromise = new Promise<'aborted'>((resolve) => {\r\n const onAbort = () => resolve('aborted');\r\n signal.addEventListener('abort', onAbort, { once: true });\r\n removeAbortListener = () => signal.removeEventListener('abort', onAbort);\r\n });\r\n const toolPromise = tool.execute(call.arguments, toolContext);\r\n try {\r\n const raced = await Promise.race([\r\n toolPromise.then(() => 'completed' as const),\r\n abortPromise,\r\n ]);\r\n if (raced === 'completed') {\r\n data = await toolPromise;\r\n } else {\r\n // 进入 settle 窗口:等工具在窗口内自行收尾\r\n let settled = false;\r\n let fireSettleExpiry: (() => void) | undefined;\r\n const settlePromise = new Promise<'expired'>((resolve) => {\r\n fireSettleExpiry = () => resolve('expired');\r\n });\r\n const remainingSettleMs = Math.max(\r\n 0,\r\n (terminationDeadline ?? (Date.now() + TOOL_TERMINATION_SETTLE_MS)) - Date.now(),\r\n );\r\n const settleTimer = setTimeout(() => fireSettleExpiry?.(), remainingSettleMs);\r\n // 工具先收尾时回收窗口定时器(Promise.race 不会取消输家)\r\n cleanupFns.push(() => clearTimeout(settleTimer));\r\n try {\r\n const settleRaced = await Promise.race([\r\n toolPromise.then(() => { settled = true; return 'settled' as const; }),\r\n settlePromise,\r\n ]);\r\n if (settleRaced === 'settled') {\r\n data = await toolPromise;\r\n // settle 窗口内完成但原因缺失(如工具自 abort),以用户中断兜底标注\r\n if (terminationReason === null) {\r\n terminationReason = 'user';\r\n }\r\n }\r\n } finally {\r\n // settle 结束后若工具仍在跑,静默回收其结果/错误,避免 unhandled rejection\r\n if (!settled) {\r\n void toolPromise.catch(() => {});\r\n }\r\n }\r\n if (!settled) {\r\n throw new ToolInterruptError(terminationReason ?? 'user');\r\n }\r\n }\r\n } finally {\r\n removeAbortListener?.();\r\n clearTimeout(timeoutTimer);\r\n cleanupExternalListener?.();\r\n }\r\n } finally {\r\n runCleanupFns(cleanupFns);\r\n }\r\n\r\n result.success = true;\r\n result.data = data;\r\n\r\n const interruptedMeta = terminationReason !== null\r\n ? { reason: terminationReason }\r\n : undefined;\r\n\r\n execResult = this.buildSuccessExecResult(data, interruptedMeta);\r\n }\r\n\r\n } catch (error) {\r\n runCleanupFns(cleanupFns);\r\n const isInterrupt = error instanceof ToolInterruptError\r\n || (error instanceof Error && error.name === 'AbortError');\r\n const interruptReason = error instanceof ToolInterruptError\r\n ? error.reason\r\n : terminationReason;\r\n result.error = isInterrupt\r\n ? (interruptReason === 'timeout' ? 'Tool timed out' : 'Interrupted by user')\r\n : (error instanceof Error ? error.message : String(error));\r\n\r\n execResult = {\r\n success: false,\r\n result: { error: result.error },\r\n ...(isInterrupt && interruptReason && terminationDeadline !== null\r\n ? { interrupted: { reason: interruptReason } }\r\n : {}),\r\n };\r\n }\r\n\r\n // ========== ToolResultTransform 反向钩子(数据变换)==========\r\n // 在结果写入 context 前,允许 Feature 对结果进行变换(如截断、脱敏)。\r\n // 变换在 ToolFinished 通知之前执行,这样通知钩子看到的是最终结果。\r\n execResult = await this.hooksRegistry.executeTransform<ToolExecResult>(\r\n CoreLifecycle.ToolResultTransform,\r\n execResult,\r\n (current) => ({\r\n toolName: call.name,\r\n call,\r\n result: current,\r\n step,\r\n } satisfies ToolResultTransformContext),\r\n );\r\n\r\n result.duration = Date.now() - startTime;\r\n\r\n // feature 事件流(C 项):tool.executed 事件(scope 提供 feature/toolName context)\r\n logger.info(`tool ${call.name} executed`, {\r\n event: 'tool.executed',\r\n durationMs: result.duration,\r\n success: result.success,\r\n });\r\n\r\n try {\r\n const { emitNotification, createToolComplete } = await import('../notification.js');\r\n emitNotification(createToolComplete(call.name, result.success, result.duration));\r\n } catch {\r\n // Ignore notification failures.\r\n }\r\n\r\n // ========== ToolFinished 正向钩子 ==========\r\n await this.executeHookFn(\r\n 'onToolFinished',\r\n () => this.onToolFinishedFn(result),\r\n { input, step }\r\n );\r\n\r\n // ========== ToolFinished 反向钩子(纯通知)==========\r\n const decisionCtx: ToolFinishedDecisionContext = {\r\n ...result,\r\n delivered: execResult,\r\n toolName: call.name,\r\n };\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.ToolFinished, decisionCtx);\r\n\r\n if (result.success) {\r\n logger.info('Tool execution completed', {\r\n toolName: call.name,\r\n duration: result.duration,\r\n });\r\n } else {\r\n logger.error('Tool execution failed', {\r\n toolName: call.name,\r\n duration: result.duration,\r\n error: result.error,\r\n });\r\n }\r\n\r\n return execResult;\r\n });\r\n }\r\n}\r\n","/**\r\n * ReAct 循环执行器\r\n *\r\n * 封装完整的 ReAct 循环逻辑\r\n *\r\n * 概念:\r\n * - Call(调用): 用户一次完整的输入-输出交互\r\n * - Step(步骤): ReAct 循环中的单次迭代(一次 LLM 调用 + 工具执行)\r\n */\r\n\r\nimport type { Context } from '../context.js';\r\nimport type { ToolExecResult } from '../context.js';\r\nimport type { ToolRegistry } from '../tool.js';\r\nimport type { ToolCall, LLMResponse, Message, UsageInfo, ImageInput } from '../types.js';\r\nimport type { ToolResult, HookResult, StepFinishDecisionContext } from '../lifecycle.js';\r\nimport type { CallFinishReason, CallOutcome } from '../lifecycle.js';\r\nimport type { ReActContext, ReActResult, DebugPusher } from './types.js';\r\nimport type { AgentFeature } from '../feature.js';\r\nimport type { HooksRegistry } from '../hooks-registry.js';\r\nimport type { CallContinuationRequest } from '../continuation.js';\r\nimport { CoreLifecycle, Decision, normalizeDecision } from '../lifecycle.js';\r\nimport { createStepCheckpoint, rollbackToStepCheckpoint } from '../checkpoint.js';\r\nimport { createLogger, runWithLogScope } from '../logging.js';\r\nimport { ClassifiedAPIError } from '../api-errors.js';\r\nimport { getRetryDelay, sleep } from '../retry.js';\r\n\r\nconst logger = createLogger('agent.react');\r\n\r\n/**\r\n * ReAct 循环执行器类\r\n */\r\nexport class ReActLoopRunner {\r\n private hooksRegistry: HooksRegistry;\r\n\r\n constructor(\r\n private agent: {\r\n llm: any;\r\n tools: ToolRegistry;\r\n maxTurns: number; // 实际是 maxSteps,但保留兼容性\r\n debugEnabled: boolean;\r\n agentId?: string;\r\n _currentStep: number;\r\n _agentId?: string;\r\n _parentPool?: any;\r\n debugPusher?: DebugPusher;\r\n features?: Map<string, AgentFeature>;\r\n hooksRegistry: HooksRegistry;\r\n recordUsage(callIndex: number, step: number, usage: UsageInfo): void;\r\n endCallUsage(callIndex: number): void;\r\n dispatchTurnActivations(refs: string[], context: Context): Promise<void>;\r\n stepSaveFn?: () => Promise<void>;\r\n peekContinuationRequest?: () => CallContinuationRequest | null;\r\n },\r\n private executeHookFn: (\r\n hookName: string,\r\n hookFn: () => Promise<any>,\r\n options: { input?: string; step?: number }\r\n ) => Promise<any>,\r\n private executeToolFn: (\r\n call: ToolCall,\r\n input: string,\r\n context: Context,\r\n step: number,\r\n callIndex: number\r\n ) => Promise<ToolExecResult>,\r\n private onStepStartFn: (ctx: any) => Promise<void>,\r\n private onStepFinishedFn: (ctx: any) => Promise<HookResult | undefined>,\r\n private onInterruptFn: (ctx: any) => Promise<void>\r\n ) {\r\n this.hooksRegistry = agent.hooksRegistry;\r\n }\r\n\r\n /**\r\n * 热替换内部持有的 LLM 引用\r\n *\r\n * 由 Agent.setLLM() 调用,确保 ReAct 循环在下一次 step 中使用新 LLM。\r\n */\r\n swapLLM(llm: any): void {\r\n this.agent.llm = llm;\r\n }\r\n\r\n /**\r\n * 执行完整的 ReAct 循环\r\n *\r\n * @param input 用户输入\r\n * @param context 对话上下文\r\n * @param options 执行选项\r\n * @returns 执行结果\r\n */\r\n async run(input: string, context: Context, options: {\r\n isFirstCall: boolean;\r\n callIndex: number; // 用户交互序号\r\n signal?: AbortSignal;\r\n }): Promise<ReActResult> {\r\n const { isFirstCall, callIndex, signal } = options;\r\n logger.debug('ReAct loop started', { callIndex, hasSignal: !!signal, signalAborted: signal?.aborted });\r\n\r\n // ========== ReAct 循环 ==========\r\n let completed = false;\r\n let finalResponse = '';\r\n let finishReason: CallFinishReason = 'limit_reached';\r\n let error: CallOutcome['error'];\r\n let providerStopReason: string | null | undefined;\r\n\r\n outerLoop:\r\n for (let step = 0; step < this.agent.maxTurns; step++) {\r\n const stepResult = await runWithLogScope({\r\n step,\r\n namespace: 'agent.step',\r\n tags: ['react-step', `step:${step}`],\r\n }, async () => {\r\n const checkpoint = createStepCheckpoint(context, this.agent.features);\r\n this.agent._currentStep = step;\r\n logger.debug('Step started', { step, callIndex });\r\n\r\n try {\r\n // 检查中断信号\r\n if (signal?.aborted) {\r\n logger.info('Step skipped due to interrupt', { step });\r\n return 'interrupted' as const;\r\n }\r\n\r\n // 推送消息到 DebugHub\r\n this.pushToDebug(context.getAll());\r\n\r\n // ========== Step Start ==========\r\n await this.executeHookFn(\r\n 'onStepStart',\r\n () => this.onStepStartFn({ step, callIndex, context, input, agent: this.agent }),\r\n { input, step }\r\n );\r\n\r\n // 执行反向钩子 @StepStart(void 返回,仅做处理)\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.StepStart, { step, callIndex, context, input, agent: this.agent });\r\n\r\n // 执行 LLM 调用(空响应时 step 内重试)\r\n const MAX_EMPTY_RETRIES = 5;\r\n let response!: LLMResponse;\r\n let hasToolCalls = false;\r\n for (let emptyAttempt = 0; emptyAttempt <= MAX_EMPTY_RETRIES; emptyAttempt++) {\r\n const llmStartTime = Date.now();\r\n response = await runWithLogScope({\r\n lifecycle: 'LLM',\r\n namespace: 'agent.llm',\r\n tags: ['llm'],\r\n }, async () => await this.agent.llm.chat(\r\n context.getAll(),\r\n this.agent.tools.getAll(),\r\n signal ? { signal } : undefined\r\n ));\r\n const llmDuration = Date.now() - llmStartTime;\r\n\r\n logger.debug('LLM response received', {\r\n step,\r\n durationMs: llmDuration,\r\n toolCallsCount: response.toolCalls?.length ?? 0,\r\n hasContent: !!response.content,\r\n stopReason: response.stopReason,\r\n });\r\n providerStopReason = response.stopReason;\r\n\r\n // 收集用量数据\r\n if (response.usage) {\r\n this.agent.recordUsage(callIndex, step, response.usage);\r\n }\r\n\r\n hasToolCalls = !!(response.toolCalls && response.toolCalls.length > 0);\r\n\r\n // 空响应重试逻辑:无 content 且无 toolCalls\r\n if (!response.content && !hasToolCalls) {\r\n const stopReason = response.stopReason;\r\n const isLegitimateEmpty = stopReason === 'end_turn' || stopReason === 'stop';\r\n\r\n // stop_reason=max_tokens: 模型输出被 max_tokens 截断(通常是思考内容耗尽了全部预算)。\r\n // 重试不会改善结果,直接作为截断事件处理。\r\n // (参考 Claude Code claude.ts:2266 的 max_tokens 显式处理)\r\n const isMaxTokensTruncation = stopReason === 'max_tokens';\r\n\r\n if (isLegitimateEmpty) {\r\n // 合法空响应(模型主动结束但无内容),不重试\r\n this.pushToDebug([\r\n ...context.getAll(),\r\n { role: 'assistant', content: '[Info: LLM returned empty response with end_turn]', turn: callIndex },\r\n ]);\r\n break; // 跳出重试循环,进入正常完成流程\r\n }\r\n\r\n if (isMaxTokensTruncation) {\r\n logger.warn('LLM response truncated by max_tokens (empty content)', {\r\n step,\r\n callIndex,\r\n stopReason,\r\n hasReasoning: !!response.reasoning,\r\n });\r\n this.pushToDebug([\r\n ...context.getAll(),\r\n { role: 'assistant', content: '[Warning: LLM output was truncated by max_tokens — thinking consumed the entire token budget and no content was produced]', turn: callIndex },\r\n ]);\r\n break; // 不重试,直接结束本轮\r\n }\r\n\r\n // 异常空响应,尝试重试\r\n if (emptyAttempt < MAX_EMPTY_RETRIES) {\r\n const delayMs = getRetryDelay(emptyAttempt + 1);\r\n logger.info('LLM returned empty response, retrying in step', {\r\n step,\r\n callIndex,\r\n attempt: emptyAttempt + 1,\r\n delayMs,\r\n stopReason,\r\n });\r\n this.pushToDebug([\r\n ...context.getAll(),\r\n { role: 'assistant', content: `[Info: LLM returned empty response (attempt ${emptyAttempt + 1}/${MAX_EMPTY_RETRIES}), retrying...]`, turn: callIndex },\r\n ]);\r\n // 检查中断信号\r\n if (signal?.aborted) {\r\n logger.info('Empty response retry skipped due to interrupt', { step });\r\n break;\r\n }\r\n await sleep(delayMs, signal);\r\n continue; // 重试 LLM 调用\r\n }\r\n\r\n // 重试耗尽\r\n logger.warn('LLM returned empty response after retries', {\r\n step,\r\n callIndex,\r\n attempts: MAX_EMPTY_RETRIES + 1,\r\n stopReason,\r\n });\r\n this.pushToDebug([\r\n ...context.getAll(),\r\n { role: 'assistant', content: '[Error: LLM returned empty response]', turn: callIndex },\r\n ]);\r\n } else {\r\n // 正常响应(有 content 或有 toolCalls),添加到 context\r\n\r\n // ========== max_tokens 截断防御 ==========\r\n // 当 stopReason 指示输出被 token 上限截断(max_tokens / length),\r\n // 且模型返回了 toolCalls 但参数为空对象 {} 时,\r\n // 说明模型在生成工具参数内容时被强制截断,JSON 不完整。\r\n // 此时不应执行这些空参数工具,而是注入明确的错误消息,\r\n // 避免模型陷入\"截断→空参数→报错→重试→再截断\"的死循环。\r\n const isTruncated = response.stopReason === 'max_tokens' || response.stopReason === 'length';\r\n if (isTruncated && hasToolCalls) {\r\n const hasEmptyArgs = response.toolCalls!.some(\r\n call => !call.arguments || Object.keys(call.arguments).length === 0\r\n );\r\n if (hasEmptyArgs) {\r\n logger.warn('LLM output truncated by max_tokens with empty tool arguments', {\r\n step,\r\n callIndex,\r\n stopReason: response.stopReason,\r\n toolCount: response.toolCalls!.length,\r\n });\r\n // 仍然添加 assistant 消息(保持协议完整)\r\n context.addAssistantMessage(response, callIndex);\r\n // 为该响应中的所有工具调用注入截断错误(整个响应被截断,所有工具参数都不可信)\r\n for (const call of response.toolCalls!) {\r\n context.addToolMessage(call, {\r\n success: false,\r\n result: {\r\n error: `[Output truncated by max_tokens] The model output was cut off while generating arguments for tool \"${call.name}\". This usually means maxTokens is too small for the content being generated. Consider increasing maxTokens in the model preset configuration.`,\r\n },\r\n }, callIndex);\r\n }\r\n this.pushToDebug(context.getAll());\r\n return 'next'; // 跳过正常工具执行(防止重复 tool_result),直接进入下一轮 LLM 调用\r\n }\r\n }\r\n\r\n context.addAssistantMessage(response, callIndex);\r\n this.pushToDebug(context.getAll());\r\n }\r\n break; // 正常响应或重试结束,跳出重试循环\r\n }\r\n\r\n if (!hasToolCalls) {\r\n // 无工具调用:执行 StepFinish 钩子\r\n const stepFinishResult = await this.executeHookFn(\r\n 'onStepFinished',\r\n () => this.onStepFinishedFn({\r\n step,\r\n callIndex,\r\n context,\r\n input,\r\n agent: this.agent,\r\n llmResponse: response,\r\n toolCallsCount: 0,\r\n }),\r\n { input, step }\r\n );\r\n\r\n // 执行反向钩子 @StepFinish(有流程控制)\r\n const stepFinishDecisionCtx: StepFinishDecisionContext = {\r\n step,\r\n callIndex,\r\n context,\r\n input,\r\n agent: this.agent,\r\n llmResponse: response,\r\n toolCallsCount: 0,\r\n hasActiveSubAgents: this.checkActiveSubAgents(),\r\n hasPendingMessages: this.checkPendingMessages(),\r\n waitCalled: false,\r\n };\r\n const decisionResult = await this.hooksRegistry.executeDecision(CoreLifecycle.StepFinish, stepFinishDecisionCtx);\r\n const stepFinishDecision = normalizeDecision(decisionResult);\r\n\r\n // 处理钩子返回的控制流指令\r\n if (stepFinishResult?.action === 'end') {\r\n completed = true;\r\n finalResponse = response.content;\r\n finishReason = 'completed';\r\n logger.info('Step ended call via forward hook', { step });\r\n return 'break';\r\n }\r\n\r\n // 处理反向钩子的决策\r\n if (stepFinishDecision === Decision.Deny) {\r\n completed = true;\r\n finalResponse = response.content;\r\n finishReason = 'completed';\r\n logger.info('Step ended call via reverse hook deny', { step });\r\n return 'break';\r\n }\r\n\r\n // 如果反向钩子要求继续(Approve),不结束循环\r\n if (stepFinishDecision === Decision.Approve || stepFinishResult?.action === 'continue') {\r\n logger.debug('Step requested continuation without tools', { step });\r\n return 'continue';\r\n }\r\n\r\n // 真正结束\r\n logger.info('Step completed call naturally', { step });\r\n return { completed: true, finalResponse: response.content, turns: step + 1, finishReason: 'completed' as const };\r\n }\r\n\r\n // hasToolCalls 已确认,提取非空引用\r\n const toolCalls = response.toolCalls!;\r\n\r\n // 执行工具\r\n let waitCalled = false;\r\n let interrupted = false;\r\n let batchRejected = false;\r\n\r\n // ========== Exclusive batch pre-check ==========\r\n // 如果批次中包含 exclusive 工具且不止一个工具调用,整批拒绝执行\r\n if (toolCalls.length > 1) {\r\n const exclusiveNames = toolCalls\r\n .filter(call => this.agent.tools.isExclusive(call.name))\r\n .map(call => call.name);\r\n\r\n if (exclusiveNames.length > 0) {\r\n batchRejected = true;\r\n const namesStr = exclusiveNames.join(', ');\r\n const errorMsg = exclusiveNames.length === 1\r\n ? `The exclusive tool [${namesStr}] must be the only tool call in this assistant turn. No tool in this batch was executed. Retry with only ${namesStr}.`\r\n : `Multiple exclusive tools [${namesStr}] were called together. Each exclusive tool must be the only tool call in its turn. No tool in this batch was executed. Retry with a single exclusive tool.`;\r\n\r\n for (const call of toolCalls) {\r\n const failResult: ToolExecResult = {\r\n success: false,\r\n result: { error: errorMsg },\r\n };\r\n context.addToolMessage(call, failResult, callIndex);\r\n }\r\n this.pushToDebug(context.getAll());\r\n logger.info('Exclusive batch violation, all tools rejected', { step, exclusiveNames, batchSize: toolCalls.length });\r\n }\r\n }\r\n\r\n // ========== 结果收集 Map ==========\r\n const resultsMap = new Map<string, ToolExecResult>();\r\n // 是否有工具以 user 终止收尾(timeout 终止不算,见下方注入循环)\r\n let userTerminated = false;\r\n\r\n if (!batchRejected) {\r\n // ========== 分流 ==========\r\n const parallelCalls = toolCalls.filter(\r\n call => this.agent.tools.isParallelizable(call.name)\r\n );\r\n const serialCalls = toolCalls.filter(\r\n call => !this.agent.tools.isParallelizable(call.name)\r\n );\r\n\r\n // ========== Phase 1: 并发执行 parallelizable 工具 ==========\r\n if (parallelCalls.length > 0) {\r\n if (!signal?.aborted) {\r\n const parallelResults = await Promise.allSettled(\r\n parallelCalls.map(call =>\r\n this.executeToolFn(call, input, context, step, callIndex)\r\n )\r\n );\r\n parallelCalls.forEach((call, i) => {\r\n const settled = parallelResults[i];\r\n if (settled.status === 'fulfilled') {\r\n resultsMap.set(call.id, settled.value);\r\n } else {\r\n const errorMsg = settled.reason instanceof Error\r\n ? settled.reason.message : String(settled.reason);\r\n resultsMap.set(call.id, {\r\n success: false,\r\n result: { error: errorMsg },\r\n });\r\n }\r\n });\r\n } else {\r\n // 中断:为所有 parallelizable 工具补齐 interrupted result\r\n for (const call of parallelCalls) {\r\n resultsMap.set(call.id, {\r\n success: false,\r\n result: { error: 'Interrupted by user' },\r\n });\r\n }\r\n interrupted = true;\r\n }\r\n }\r\n\r\n // ========== Phase 2: 串行执行剩余工具 ==========\r\n for (let i = 0; i < serialCalls.length; i++) {\r\n const call = serialCalls[i];\r\n\r\n // 在执行每个工具前检查中断信号\r\n if (signal?.aborted) {\r\n interrupted = true;\r\n // 为当前及剩余的 serial 工具补齐 interrupted result\r\n for (let j = i; j < serialCalls.length; j++) {\r\n resultsMap.set(serialCalls[j].id, {\r\n success: false,\r\n result: { error: 'Interrupted by user' },\r\n });\r\n logger.info('Tool result padded for interrupt', { toolName: serialCalls[j].name, toolIndex: j });\r\n }\r\n break;\r\n }\r\n\r\n if (call.name === 'wait') {\r\n waitCalled = true;\r\n }\r\n const result = await this.executeToolFn(call, input, context, step, callIndex);\r\n resultsMap.set(call.id, result);\r\n }\r\n\r\n // ========== 统一注入:按原始顺序写入 context ==========\r\n for (const call of toolCalls) {\r\n const result = resultsMap.get(call.id);\r\n if (result) {\r\n context.addToolMessage(call, result, callIndex);\r\n // timeout 终止不退出循环(ADR-0005):模型看到元数据后自行决策\r\n // (重试 / 调大 timeout / 换路线);user 终止才结束当前 call。\r\n if (result.interrupted?.reason === 'user') {\r\n userTerminated = true;\r\n }\r\n } else {\r\n // 安全网:结果缺失\r\n context.addToolMessage(call, {\r\n success: false,\r\n result: { error: 'Tool result missing (internal error)' },\r\n }, callIndex);\r\n }\r\n }\r\n } // end if (!batchRejected)\r\n\r\n // 如果在 tool 执行中被用户中断,结束当前 call。\r\n // 同时检查 signal?.aborted:当 abort 在并行工具 race 或单个工具执行期间触发时,\r\n // interrupted 标志不会被设置(只有 pre-check 和 serial 循环头部会设),\r\n // 但工具已通过 ToolInterruptError 返回了 error result,此时应立即退出。\r\n //\r\n // timeout 终止(interrupted.reason === 'timeout')不在此列:结果已带元数据\r\n // 写入 context,循环继续,由模型决定下一步。\r\n if (interrupted || signal?.aborted || userTerminated) {\r\n this.pushToDebug(context.getAll());\r\n const lastContent = context.getAll().filter(m => m.role === 'assistant' && m.content).pop();\r\n finalResponse = lastContent?.content ?? response.content ?? '';\r\n completed = false;\r\n finishReason = 'cancelled';\r\n logger.info('Call interrupted during tool execution', { step });\r\n return 'interrupted' as const;\r\n }\r\n\r\n // ========== Continuation request check ==========\r\n // 控制工具(checkpoint/rollback)在执行期间可能登记了 continuation request。\r\n // 此时 tool result 已写入 Context,协议完整,可以安全结束当前 onCall segment。\r\n // 宿主将在 onCall 返回后通过 consumeContinuationRequest() 获取请求。\r\n const continuationRequest = this.agent.peekContinuationRequest?.();\r\n if (continuationRequest) {\r\n this.pushToDebug(context.getAll());\r\n const lastContent = context.getAll().filter(m => m.role === 'assistant' && m.content).pop();\r\n finalResponse = lastContent?.content ?? response.content ?? '';\r\n completed = false;\r\n logger.info('Call ending for continuation request', { step, kind: continuationRequest.kind });\r\n return { completed: false, finalResponse, turns: step + 1, continuationRequest, finishReason: 'continued' as const };\r\n }\r\n\r\n // 推送消息到 DebugHub\r\n this.pushToDebug(context.getAll());\r\n\r\n // ========== Step Finished(有工具调用)==========\r\n const stepFinishResult = await this.executeHookFn(\r\n 'onStepFinished',\r\n () => this.onStepFinishedFn({\r\n step,\r\n callIndex,\r\n context,\r\n input,\r\n agent: this.agent,\r\n llmResponse: response,\r\n toolCallsCount: response.toolCalls?.length ?? 0,\r\n }),\r\n { input, step }\r\n );\r\n\r\n // 执行反向钩子 @StepFinish(有流程控制)\r\n const stepFinishDecisionCtx: StepFinishDecisionContext = {\r\n step,\r\n callIndex,\r\n context,\r\n input,\r\n agent: this.agent,\r\n llmResponse: response,\r\n toolCallsCount: response.toolCalls?.length ?? 0,\r\n hasActiveSubAgents: this.checkActiveSubAgents(),\r\n hasPendingMessages: this.checkPendingMessages(),\r\n waitCalled,\r\n };\r\n const stepFinishDecisionResult = await this.hooksRegistry.executeDecision(CoreLifecycle.StepFinish, stepFinishDecisionCtx);\r\n const stepFinishDecision = normalizeDecision(stepFinishDecisionResult);\r\n\r\n // 处理钩子返回的控制流指令\r\n if (stepFinishResult?.action === 'end') {\r\n completed = true;\r\n finalResponse = response.content;\r\n finishReason = 'completed';\r\n logger.info('Step ended call after tools via forward hook', { step });\r\n return 'break';\r\n }\r\n\r\n // 处理反向钩子的决策\r\n if (stepFinishDecision === Decision.Deny) {\r\n completed = true;\r\n finalResponse = response.content;\r\n finishReason = 'completed';\r\n logger.info('Step ended call after tools via reverse hook deny', { step });\r\n return 'break';\r\n }\r\n\r\n if (stepFinishDecision === Decision.Approve || stepFinishResult?.action === 'continue') {\r\n logger.debug('Step requested continuation after tools', { step });\r\n return 'continue';\r\n }\r\n\r\n logger.debug('Step finished with tool calls, continuing loop by default', { step });\r\n return 'next';\r\n } catch (caughtError) {\r\n // 如果是中断导致的错误,不回滚,直接传播\r\n if (signal?.aborted || (caughtError instanceof Error && caughtError.name === 'AbortError')) {\r\n finishReason = 'cancelled';\r\n logger.info('Step aborted by interrupt signal', { step });\r\n return 'interrupted' as const;\r\n }\r\n\r\n await rollbackToStepCheckpoint(checkpoint, context, this.agent.features);\r\n\r\n // 将展示文案与机器语义拆开:错误类型、状态码和可重试性进入 outcome,\r\n // 对话消息只保留用户可读内容,消费端不再解析人为前缀。\r\n const isApiError = caughtError instanceof ClassifiedAPIError;\r\n const errorMsg = isApiError\r\n ? caughtError.userMessage\r\n : (caughtError instanceof Error ? caughtError.message : String(caughtError));\r\n error = isApiError\r\n ? {\r\n category: caughtError.errorType,\r\n message: caughtError.userMessage,\r\n ...(typeof caughtError.statusCode === 'number' ? { statusCode: caughtError.statusCode } : {}),\r\n retryable: caughtError.errorType === 'connection_error'\r\n || caughtError.errorType === 'connection_timeout'\r\n || caughtError.errorType === 'rate_limit'\r\n || caughtError.errorType === 'server_overload'\r\n || caughtError.errorType === 'server_error',\r\n }\r\n : { category: 'runtime_error', message: errorMsg };\r\n\r\n // 错误消息进入 context,保持 context/viewer 一致性。\r\n // execution 元数据盖戳到消息上:展示端据此渲染终态样式,\r\n // 不再依赖文本前缀,且随会话快照持久化、重渲染后稳定。\r\n context.addAssistantMessage({\r\n content: errorMsg,\r\n execution: { status: 'failed', reason: 'error', error },\r\n }, callIndex);\r\n this.pushToDebug(context.getAll());\r\n logger.warn('Step rolled back after failure', { step, errorType: error.category, error: errorMsg });\r\n\r\n // 返回错误消息而非抛出,确保前端能在对话中看到错误说明。\r\n return {\r\n completed: false,\r\n finalResponse: errorMsg,\r\n turns: step + 1,\r\n finishReason: 'error' as const,\r\n error,\r\n ...(providerStopReason !== undefined ? { model: { providerStopReason } } : {}),\r\n };\r\n }\r\n });\r\n\r\n // Step 完成后自动保存 session(如果启用了 stepSave)\r\n if (this.agent.stepSaveFn && stepResult !== 'interrupted') {\r\n try {\r\n await this.agent.stepSaveFn();\r\n } catch (saveError) {\r\n logger.warn('Step auto-save failed', { step, error: saveError instanceof Error ? saveError.message : String(saveError) });\r\n }\r\n }\r\n\r\n if (stepResult === 'break') {\r\n // Hook 触发的完成:检查是否有排队消息,如果有则注入并继续循环\r\n if (await this._drainAndInjectQueuedInputs(context, callIndex, 'Hook 结束后队列检查')) {\r\n continue outerLoop;\r\n }\r\n break;\r\n }\r\n if (stepResult === 'continue') {\r\n continue outerLoop;\r\n }\r\n if (stepResult === 'interrupted') {\r\n // 用户中断:不触发 onInterrupt 钩子(已在上面补齐 tool result)\r\n break;\r\n }\r\n if (typeof stepResult === 'object') {\r\n // 自然完成:检查是否有排队消息,如果有则注入并继续循环\r\n // 否则这些消息会永远卡在队列里(因为 return 后不会再有 step 边界检查)\r\n if (await this._drainAndInjectQueuedInputs(context, callIndex, 'Call 完成后队列检查')) {\r\n continue outerLoop;\r\n }\r\n return stepResult;\r\n }\r\n\r\n // ========== Step 级别队列检查 ==========\r\n // 在每个 step 结束后检查是否有排队消息,如果有则全部注入并继续循环\r\n if (await this._drainAndInjectQueuedInputs(context, callIndex, 'Step 级别队列')) {\r\n continue outerLoop;\r\n }\r\n }\r\n\r\n // 未完成处理(max_steps 或 interrupted)\r\n if (!completed) {\r\n // 区分中断 vs 最大步数:中断时 signal.aborted 为 true\r\n if (signal?.aborted) {\r\n finishReason = 'cancelled';\r\n } else {\r\n finishReason = 'limit_reached';\r\n }\r\n\r\n const partialResult = context.getAll()[context.getAll().length - 1]?.content || '';\r\n\r\n // 触发中断钩子\r\n const interruptResult = await this.executeHookFn(\r\n 'onInterrupt',\r\n () => this.onInterruptFn({\r\n reason: signal?.aborted ? 'cancelled' : 'limit_reached',\r\n step: this.agent._currentStep,\r\n context,\r\n }),\r\n { input, step: this.agent._currentStep }\r\n );\r\n\r\n finalResponse = interruptResult as string ?? partialResult;\r\n }\r\n\r\n // 标记 Call 结束\r\n this.agent.endCallUsage(callIndex);\r\n\r\n return {\r\n finalResponse,\r\n completed,\r\n turns: this.agent._currentStep + 1,\r\n finishReason,\r\n ...(error ? { error } : {}),\r\n ...(providerStopReason !== undefined ? { model: { providerStopReason } } : {}),\r\n };\r\n }\r\n\r\n /**\r\n * 从 ViewerWorker 获取并消费一条排队消息\r\n *\r\n * @param agentId Agent ID\r\n * @returns 排队消息(文本 + 图片),如果没有则返回 null\r\n */\r\n private async fetchQueuedInput(agentId: string): Promise<{ text: string; images?: ImageInput[]; capabilityActivations?: string[] } | null> {\r\n // 从环境变量获取 ViewerWorker 端口\r\n const viewerPort = process.env.AGENTDEV_VIEWER_PORT || '2026';\r\n const viewerUrl = `http://127.0.0.1:${viewerPort}`;\r\n\r\n try {\r\n const res = await fetch(`${viewerUrl}/api/agents/${encodeURIComponent(agentId)}/dequeue-input`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n });\r\n\r\n if (!res.ok) {\r\n return null;\r\n }\r\n\r\n const data = await res.json();\r\n if (data.input && data.input.text) {\r\n return {\r\n text: data.input.text,\r\n ...(Array.isArray(data.input.images) && data.input.images.length > 0\r\n ? { images: data.input.images }\r\n : {}),\r\n ...(Array.isArray(data.input.capabilityActivations) && data.input.capabilityActivations.length > 0\r\n ? { capabilityActivations: data.input.capabilityActivations.filter((a: unknown): a is string => typeof a === 'string') }\r\n : {}),\r\n };\r\n }\r\n return null;\r\n } catch (e) {\r\n // 网络错误或 ViewerWorker 不可用\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 排空所有排队消息并注入到 context。\r\n * 在 step 边界和 call 完成时调用,确保用户在 agent 忙时排队的消息不会丢失。\r\n *\r\n * @returns true 如果有消息被注入(调用方应 continue 循环)\r\n */\r\n private async _drainAndInjectQueuedInputs(\r\n context: Context,\r\n callIndex: number,\r\n logLabel: string,\r\n ): Promise<boolean> {\r\n if (!this.agent.agentId) return false;\r\n try {\r\n const items: Array<{ text: string; images?: ImageInput[]; capabilityActivations?: string[] }> = [];\r\n while (true) {\r\n const qi = await this.fetchQueuedInput(this.agent.agentId);\r\n if (!qi) break;\r\n items.push(qi);\r\n }\r\n if (items.length > 0) {\r\n logger.info(`${logLabel}:注入排队消息`, { count: items.length });\r\n for (const qi of items) {\r\n // 排队消息在 call 内注入(不触发新 onCall),其携带的能力激活\r\n // 通知在此消息落地点派发给对应 feature\r\n if (qi.capabilityActivations?.length) {\r\n await this.agent.dispatchTurnActivations(qi.capabilityActivations, context);\r\n }\r\n context.addUserMessage(qi.text, callIndex, qi.images);\r\n }\r\n this.pushToDebug(context.getAll());\r\n return true;\r\n }\r\n } catch (e) {\r\n logger.debug(`${logLabel}:队列查询失败,忽略`, { error: e instanceof Error ? e.message : String(e) });\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 检查是否有活跃的子代理\r\n */\r\n private checkActiveSubAgents(): boolean {\r\n const subAgentFeature = this.agent.features?.get('subagent') as any;\r\n return subAgentFeature?.agentPool?.hasActiveAgents?.() ?? false;\r\n }\r\n\r\n /**\r\n * 检查是否有待处理的子代理消息\r\n */\r\n private checkPendingMessages(): boolean {\r\n const subAgentFeature = this.agent.features?.get('subagent') as any;\r\n return subAgentFeature?.agentPool?.hasPendingMessages?.() ?? false;\r\n }\r\n\r\n /**\r\n * 推送到 DebugHub\r\n */\r\n private pushToDebug(messages: Message[]): void {\r\n if (this.agent.debugEnabled && this.agent.agentId && this.agent.debugPusher) {\r\n this.agent.debugPusher.pushMessages(this.agent.agentId, messages);\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["CoreLifecycle","Decision","readFile","resolve","error","cwd","sep","content","readdir","readFile","resolve","join","existsSync","dir","resolve","isAbsolute","existsSync","dirname","join","fileURLToPath","PlaceholderResolver","logger","result","decisionCtx","resolve","logger","stepFinishResult","stepFinishDecisionCtx","stepFinishDecision","join","existsSync","logger","fileURLToPath","dirname"]}