agentdev 0.1.8 → 0.1.9

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 (186) hide show
  1. package/dist/BasicAgent-UWXLSZP2.js +13 -0
  2. package/dist/ExplorerAgent-LCM3JQS4.js +13 -0
  3. package/dist/{chunk-LQTEETML.js → chunk-5T4C2XRT.js} +12 -7
  4. package/dist/chunk-5T4C2XRT.js.map +1 -0
  5. package/dist/{chunk-OBOU27DM.js → chunk-A354ZCZF.js} +6735 -1822
  6. package/dist/chunk-A354ZCZF.js.map +1 -0
  7. package/dist/{chunk-TSASFMRF.js → chunk-BAP2GCYH.js} +1 -1
  8. package/dist/chunk-BAP2GCYH.js.map +1 -0
  9. package/dist/{chunk-3BPSNNK3.js → chunk-EECW6PYP.js} +11 -9
  10. package/dist/chunk-EECW6PYP.js.map +1 -0
  11. package/dist/chunk-G5ECPY4K.js +551 -0
  12. package/dist/chunk-G5ECPY4K.js.map +1 -0
  13. package/dist/{chunk-LLV3W326.js → chunk-NORTAQIL.js} +67 -20
  14. package/dist/chunk-NORTAQIL.js.map +1 -0
  15. package/dist/{chunk-F3PR7UTL.js → chunk-QFHPUAUQ.js} +5 -3
  16. package/dist/{chunk-F3PR7UTL.js.map → chunk-QFHPUAUQ.js.map} +1 -1
  17. package/dist/cli/server.js +2 -2
  18. package/dist/cli/viewer.js +2 -2
  19. package/dist/features/shell/templates/bash.render.d.ts +1 -1
  20. package/dist/features/websearch/templates/web-fetch.render.d.ts +1 -1
  21. package/dist/index.d.ts +1733 -500
  22. package/dist/index.js +30 -8
  23. package/dist/index.js.map +1 -1
  24. package/dist/{notification-3VEAP7YF.js → notification-NWVOS2WR.js} +3 -3
  25. package/dist/tools-LDR3LIJP.js +14 -0
  26. package/dist/tools-LDR3LIJP.js.map +1 -0
  27. package/dist/{types-DUKIIntb.d.ts → types-CF5UsxD9.d.ts} +3 -0
  28. package/node_modules/@sliverp/qqbot/LICENSE +21 -0
  29. package/node_modules/@sliverp/qqbot/README.md +427 -0
  30. package/node_modules/@sliverp/qqbot/README.standalone.zh.md +77 -0
  31. package/node_modules/@sliverp/qqbot/README.zh.md +423 -0
  32. package/node_modules/@sliverp/qqbot/bin/qqbot-cli.js +227 -0
  33. package/node_modules/@sliverp/qqbot/clawdbot.plugin.json +16 -0
  34. package/node_modules/@sliverp/qqbot/dist/index.d.ts +20 -0
  35. package/node_modules/@sliverp/qqbot/dist/index.js +25 -0
  36. package/node_modules/@sliverp/qqbot/dist/src/agent.d.ts +76 -0
  37. package/node_modules/@sliverp/qqbot/dist/src/agent.js +36 -0
  38. package/node_modules/@sliverp/qqbot/dist/src/api.d.ts +138 -0
  39. package/node_modules/@sliverp/qqbot/dist/src/api.js +523 -0
  40. package/node_modules/@sliverp/qqbot/dist/src/channel.d.ts +3 -0
  41. package/node_modules/@sliverp/qqbot/dist/src/channel.js +349 -0
  42. package/node_modules/@sliverp/qqbot/dist/src/config.d.ts +25 -0
  43. package/node_modules/@sliverp/qqbot/dist/src/config.js +156 -0
  44. package/node_modules/@sliverp/qqbot/dist/src/demo-standalone.d.ts +1 -0
  45. package/node_modules/@sliverp/qqbot/dist/src/demo-standalone.js +125 -0
  46. package/node_modules/@sliverp/qqbot/dist/src/gateway.d.ts +20 -0
  47. package/node_modules/@sliverp/qqbot/dist/src/gateway.js +2156 -0
  48. package/node_modules/@sliverp/qqbot/dist/src/image-server.d.ts +62 -0
  49. package/node_modules/@sliverp/qqbot/dist/src/image-server.js +401 -0
  50. package/node_modules/@sliverp/qqbot/dist/src/known-users.d.ts +100 -0
  51. package/node_modules/@sliverp/qqbot/dist/src/known-users.js +263 -0
  52. package/node_modules/@sliverp/qqbot/dist/src/onboarding.d.ts +10 -0
  53. package/node_modules/@sliverp/qqbot/dist/src/onboarding.js +203 -0
  54. package/node_modules/@sliverp/qqbot/dist/src/openclaw-agent-adapter.d.ts +2 -0
  55. package/node_modules/@sliverp/qqbot/dist/src/openclaw-agent-adapter.js +155 -0
  56. package/node_modules/@sliverp/qqbot/dist/src/outbound.d.ts +150 -0
  57. package/node_modules/@sliverp/qqbot/dist/src/outbound.js +1175 -0
  58. package/node_modules/@sliverp/qqbot/dist/src/proactive.d.ts +170 -0
  59. package/node_modules/@sliverp/qqbot/dist/src/proactive.js +399 -0
  60. package/node_modules/@sliverp/qqbot/dist/src/runtime.d.ts +5 -0
  61. package/node_modules/@sliverp/qqbot/dist/src/runtime.js +16 -0
  62. package/node_modules/@sliverp/qqbot/dist/src/session-store.d.ts +52 -0
  63. package/node_modules/@sliverp/qqbot/dist/src/session-store.js +254 -0
  64. package/node_modules/@sliverp/qqbot/dist/src/types.d.ts +145 -0
  65. package/node_modules/@sliverp/qqbot/dist/src/types.js +1 -0
  66. package/node_modules/@sliverp/qqbot/dist/src/utils/audio-convert.d.ts +73 -0
  67. package/node_modules/@sliverp/qqbot/dist/src/utils/audio-convert.js +645 -0
  68. package/node_modules/@sliverp/qqbot/dist/src/utils/file-utils.d.ts +46 -0
  69. package/node_modules/@sliverp/qqbot/dist/src/utils/file-utils.js +107 -0
  70. package/node_modules/@sliverp/qqbot/dist/src/utils/image-size.d.ts +51 -0
  71. package/node_modules/@sliverp/qqbot/dist/src/utils/image-size.js +234 -0
  72. package/node_modules/@sliverp/qqbot/dist/src/utils/media-tags.d.ts +14 -0
  73. package/node_modules/@sliverp/qqbot/dist/src/utils/media-tags.js +120 -0
  74. package/node_modules/@sliverp/qqbot/dist/src/utils/payload.d.ts +112 -0
  75. package/node_modules/@sliverp/qqbot/dist/src/utils/payload.js +186 -0
  76. package/node_modules/@sliverp/qqbot/dist/src/utils/platform.d.ts +126 -0
  77. package/node_modules/@sliverp/qqbot/dist/src/utils/platform.js +358 -0
  78. package/node_modules/@sliverp/qqbot/dist/src/utils/upload-cache.d.ts +34 -0
  79. package/node_modules/@sliverp/qqbot/dist/src/utils/upload-cache.js +93 -0
  80. package/node_modules/@sliverp/qqbot/dist/standalone.d.ts +6 -0
  81. package/node_modules/@sliverp/qqbot/dist/standalone.js +6 -0
  82. package/node_modules/@sliverp/qqbot/index.ts +30 -0
  83. package/node_modules/@sliverp/qqbot/moltbot.plugin.json +16 -0
  84. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/LICENSE +201 -0
  85. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/README.md +134 -0
  86. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/browser.js +17 -0
  87. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/cjs/browser.js +16 -0
  88. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/cjs/node.js +219 -0
  89. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/index.d.ts +4 -0
  90. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/node.js +223 -0
  91. package/node_modules/@sliverp/qqbot/node_modules/@eshaz/web-worker/package.json +54 -0
  92. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/index.js +5 -0
  93. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/package.json +36 -0
  94. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderCommon.js +231 -0
  95. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/WASMAudioDecoderWorker.js +129 -0
  96. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/puff/README +67 -0
  97. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/puff/build_puff.js +31 -0
  98. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/puff/puff.c +863 -0
  99. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/puff/puff.h +35 -0
  100. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/src/utilities.js +3 -0
  101. package/node_modules/@sliverp/qqbot/node_modules/@wasm-audio-decoders/common/types.d.ts +7 -0
  102. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/README.md +265 -0
  103. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js +185 -0
  104. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/dist/mpg123-decoder.min.js.map +1 -0
  105. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/index.js +8 -0
  106. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/package.json +58 -0
  107. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/src/EmscriptenWasm.js +464 -0
  108. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/src/MPEGDecoder.js +200 -0
  109. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/src/MPEGDecoderWebWorker.js +21 -0
  110. package/node_modules/@sliverp/qqbot/node_modules/mpg123-decoder/types.d.ts +30 -0
  111. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/LICENSE +21 -0
  112. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/README.md +85 -0
  113. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/index.cjs +16 -0
  114. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/index.d.ts +70 -0
  115. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/index.mjs +16 -0
  116. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/silk.wasm +0 -0
  117. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/lib/utils.d.ts +4 -0
  118. package/node_modules/@sliverp/qqbot/node_modules/silk-wasm/package.json +39 -0
  119. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/.github/FUNDING.yml +1 -0
  120. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/.prettierignore +1 -0
  121. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/LICENSE +7 -0
  122. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/README.md +163 -0
  123. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/dist/esm.js +1 -0
  124. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/dist/index.js +1 -0
  125. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/package.json +50 -0
  126. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/rollup.config.js +27 -0
  127. package/node_modules/@sliverp/qqbot/node_modules/simple-yenc/src/simple-yenc.js +302 -0
  128. package/node_modules/@sliverp/qqbot/node_modules/ws/LICENSE +20 -0
  129. package/node_modules/@sliverp/qqbot/node_modules/ws/README.md +548 -0
  130. package/node_modules/@sliverp/qqbot/node_modules/ws/browser.js +8 -0
  131. package/node_modules/@sliverp/qqbot/node_modules/ws/index.js +13 -0
  132. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/buffer-util.js +131 -0
  133. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/constants.js +19 -0
  134. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/event-target.js +292 -0
  135. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/extension.js +203 -0
  136. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/limiter.js +55 -0
  137. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/permessage-deflate.js +528 -0
  138. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/receiver.js +706 -0
  139. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/sender.js +602 -0
  140. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/stream.js +161 -0
  141. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/subprotocol.js +62 -0
  142. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/validation.js +152 -0
  143. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/websocket-server.js +554 -0
  144. package/node_modules/@sliverp/qqbot/node_modules/ws/lib/websocket.js +1393 -0
  145. package/node_modules/@sliverp/qqbot/node_modules/ws/package.json +69 -0
  146. package/node_modules/@sliverp/qqbot/node_modules/ws/wrapper.mjs +8 -0
  147. package/node_modules/@sliverp/qqbot/openclaw.plugin.json +16 -0
  148. package/node_modules/@sliverp/qqbot/package.json +81 -0
  149. package/node_modules/@sliverp/qqbot/skills/qqbot-cron/SKILL.md +513 -0
  150. package/node_modules/@sliverp/qqbot/skills/qqbot-media/SKILL.md +194 -0
  151. package/node_modules/@sliverp/qqbot/src/agent.ts +133 -0
  152. package/node_modules/@sliverp/qqbot/src/api.ts +704 -0
  153. package/node_modules/@sliverp/qqbot/src/channel.ts +380 -0
  154. package/node_modules/@sliverp/qqbot/src/config.ts +182 -0
  155. package/node_modules/@sliverp/qqbot/src/demo-standalone.ts +144 -0
  156. package/node_modules/@sliverp/qqbot/src/gateway.ts +2285 -0
  157. package/node_modules/@sliverp/qqbot/src/image-server.ts +474 -0
  158. package/node_modules/@sliverp/qqbot/src/known-users.ts +353 -0
  159. package/node_modules/@sliverp/qqbot/src/onboarding.ts +274 -0
  160. package/node_modules/@sliverp/qqbot/src/openclaw-agent-adapter.ts +168 -0
  161. package/node_modules/@sliverp/qqbot/src/openclaw-plugin-sdk.d.ts +483 -0
  162. package/node_modules/@sliverp/qqbot/src/outbound.ts +1301 -0
  163. package/node_modules/@sliverp/qqbot/src/proactive.ts +530 -0
  164. package/node_modules/@sliverp/qqbot/src/runtime.ts +22 -0
  165. package/node_modules/@sliverp/qqbot/src/session-store.ts +303 -0
  166. package/node_modules/@sliverp/qqbot/src/types.ts +153 -0
  167. package/node_modules/@sliverp/qqbot/src/utils/audio-convert.ts +738 -0
  168. package/node_modules/@sliverp/qqbot/src/utils/file-utils.ts +122 -0
  169. package/node_modules/@sliverp/qqbot/src/utils/image-size.ts +266 -0
  170. package/node_modules/@sliverp/qqbot/src/utils/media-tags.ts +134 -0
  171. package/node_modules/@sliverp/qqbot/src/utils/payload.ts +265 -0
  172. package/node_modules/@sliverp/qqbot/src/utils/platform.ts +404 -0
  173. package/node_modules/@sliverp/qqbot/src/utils/upload-cache.ts +128 -0
  174. package/node_modules/@sliverp/qqbot/standalone.ts +6 -0
  175. package/node_modules/@sliverp/qqbot/tsconfig.json +16 -0
  176. package/package.json +9 -1
  177. package/dist/BasicAgent-QWEYCLV5.js +0 -12
  178. package/dist/ExplorerAgent-4IT22VB7.js +0 -12
  179. package/dist/chunk-3BPSNNK3.js.map +0 -1
  180. package/dist/chunk-LLV3W326.js.map +0 -1
  181. package/dist/chunk-LQTEETML.js.map +0 -1
  182. package/dist/chunk-OBOU27DM.js.map +0 -1
  183. package/dist/chunk-TSASFMRF.js.map +0 -1
  184. /package/dist/{BasicAgent-QWEYCLV5.js.map → BasicAgent-UWXLSZP2.js.map} +0 -0
  185. /package/dist/{ExplorerAgent-4IT22VB7.js.map → ExplorerAgent-LCM3JQS4.js.map} +0 -0
  186. /package/dist/{notification-3VEAP7YF.js.map → notification-NWVOS2WR.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/session-store.ts","../src/template/loader.ts","../src/template/data-source.ts","../src/template/composer.ts","../src/core/lifecycle.ts","../src/core/hooks-decorator.ts","../src/core/feature.ts","../src/mcp/config.ts","../src/mcp/types.ts","../src/mcp/connection-manager.ts","../src/mcp/mcp-adapter.ts","../src/mcp/client.ts","../src/mcp/mount.ts","../src/features/mcp/index.ts","../src/skills/loader.ts","../src/features/skill/index.ts","../src/features/skill/tools.ts","../src/features/subagent/pool.ts","../src/features/subagent/index.ts","../src/features/subagent/tools.ts","../src/features/todo/index.ts","../src/features/todo/tools.ts","../src/features/user-input/index.ts","../src/features/opencode-basic/index.ts","../src/features/opencode-basic/tools.ts","../src/features/example-feature/index.ts","../src/features/example-feature/tools.ts","../src/core/config.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/index.ts","../src/core/checkpoint.ts","../src/core/usage.ts","../src/core/agent/hooks-executor.ts","../src/core/agent/template-resolver.ts","../src/core/agent/tool-executor.ts","../src/core/agent/react-loop.ts","../src/core/hooks-registry.ts","../src/core/agent.ts"],"sourcesContent":["/**\n * 工具定义\n * 简单的工具创建函数\n */\n\nimport type { Tool, ToolRenderConfig } from './types.js';\n\n/**\n * 渲染配置扩展类型\n * 支持字符串(模板名称)或配置对象\n */\nexport type ToolRenderInput = ToolRenderConfig | string;\n\n/**\n * 创建一个工具\n * @param config 工具配置\n * @param sourceFile 可选:调用此函数的源文件路径(用于自动查找渲染文件)\n */\nexport function createTool(\n config: {\n name: string;\n description: string;\n parameters?: Record<string, any>;\n execute: (args: any, context?: any) => Promise<any>;\n render?: ToolRenderInput;\n },\n sourceFile?: string\n): Tool {\n let finalRender: ToolRenderConfig | undefined = undefined;\n\n if (config.render) {\n // 如果 render 是字符串,转换为配置对象(call 和 result 使用同一模板)\n if (typeof config.render === 'string') {\n finalRender = {\n call: config.render,\n result: config.render,\n };\n } else {\n finalRender = config.render;\n }\n } else if (sourceFile) {\n // render 未定义时,尝试自动查找同目录下的 .render.ts 文件\n // 例如:tools/fs.ts -> tools/fs.render.ts\n const renderPath = sourceFile.replace(/\\.ts$/, '.render.ts');\n // 使用特殊标记,延迟加载\n (finalRender as any) = {\n __renderPath: renderPath,\n call: undefined,\n result: undefined,\n };\n }\n\n return {\n name: config.name,\n description: config.description,\n parameters: config.parameters,\n execute: config.execute,\n render: finalRender,\n };\n}\n\n/**\n * 工具注册表 - 管理多个工具\n */\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n private enabled = new Set<string>(); // 启用的工具名\n private pendingDisabled = new Set<string>(); // 工具注册前的预禁用状态\n private sources = new Map<string, string>(); // 工具来源追踪\n\n /**\n * 注册工具(默认启用,记录来源)\n */\n register(tool: Tool, source?: string): this {\n this.tools.set(tool.name, tool);\n if (this.pendingDisabled.has(tool.name)) {\n this.enabled.delete(tool.name);\n } else {\n this.enabled.add(tool.name); // 默认启用\n }\n if (source) {\n this.sources.set(tool.name, source);\n }\n return this;\n }\n\n /**\n * 禁用工具\n */\n disable(name: string): boolean {\n this.pendingDisabled.add(name);\n if (!this.tools.has(name)) {\n return true;\n }\n return this.enabled.delete(name);\n }\n\n /**\n * 启用工具\n */\n enable(name: string): boolean {\n this.pendingDisabled.delete(name);\n if (this.tools.has(name)) {\n this.enabled.add(name);\n return true;\n }\n return false;\n }\n\n /**\n * 检查工具是否启用\n */\n isEnabled(name: string): boolean {\n return this.enabled.has(name);\n }\n\n /**\n * 获取工具来源(调试用)\n */\n getSource(name: string): string | undefined {\n return this.sources.get(name);\n }\n\n /**\n * 获取工具条目(调试快照用)\n */\n getEntries(): Array<{ tool: Tool; enabled: boolean; source?: string }> {\n return Array.from(this.tools.entries()).map(([name, tool]) => ({\n tool,\n enabled: this.enabled.has(name),\n source: this.sources.get(name),\n }));\n }\n\n /**\n * 获取工具\n */\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n /**\n * 获取所有工具(只返回启用的)\n */\n getAll(): Tool[] {\n return Array.from(this.enabled)\n .map(name => this.tools.get(name))\n .filter((t): t is Tool => t !== undefined);\n }\n\n /**\n * 检查工具是否存在\n */\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n /**\n * 获取工具的渲染配置\n */\n getRenderConfig(name: string): ToolRenderConfig | undefined {\n const tool = this.tools.get(name);\n return tool?.render;\n }\n}\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): Message {\n return { role, content, toolCalls, reasoning };\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","/**\n * 上下文管理器\n * 管理消息数组,提供简单的操作方法\n *\n * 内核化能力:\n * - 消息元数据包装(EnrichedMessage)\n * - 内容解析和索引\n * - 查询接口\n */\n\nimport type {\n Message,\n ToolCall,\n LLMResponse,\n EnrichedMessage,\n MessageMeta,\n MessageTag,\n ParsedContent,\n} from './types.js';\nimport { cloneMessages } from './message.js';\nimport { ContextQuery } from './context-query.js';\n\n/**\n * 工具执行结果(用于 addToolMessage)\n */\nexport interface ToolExecResult {\n success: boolean;\n result: string | Record<string, any>;\n error?: string;\n}\n\n/**\n * 上下文快照类型 - 用于序列化\n */\nexport interface ContextSnapshot {\n version: number;\n messages: Message[];\n enrichedMessages?: EnrichedMessage[];\n sequence?: number;\n}\n\nexport class Context {\n // ========== 字段 ==========\n\n private messages: Message[] = [];\n\n // 新增字段:内核化能力\n private enrichedMessages: EnrichedMessage[] = [];\n private indexes = new Map<string, Set<string>>();\n private sequence: number = 0;\n\n /**\n * 添加一条消息\n */\n add(message: Message): this {\n this.messages.push({ ...message });\n return this;\n }\n\n /**\n * 添加多条消息\n */\n addAll(messages: Message[]): this {\n for (const m of messages) {\n this.add(m);\n }\n return this;\n }\n\n /**\n * 获取所有消息的副本\n */\n getAll(): Message[] {\n return cloneMessages(this.messages);\n }\n\n /**\n * 获取消息数量\n */\n get length(): number {\n return this.messages.length;\n }\n\n /**\n * 获取最后一条消息\n */\n getLast(): Message | undefined {\n return this.messages[this.messages.length - 1];\n }\n\n /**\n * 清空消息\n */\n clear(): void {\n this.messages = [];\n }\n\n /**\n * 应用中间件处理消息\n */\n apply(middleware: (messages: Message[]) => Message[]): this {\n this.messages = middleware(this.messages);\n return this;\n }\n\n /**\n * 过滤消息\n */\n filter(predicate: (msg: Message) => boolean): Message[] {\n return this.messages.filter(predicate);\n }\n\n /**\n * 切片\n */\n slice(start?: number, end?: number): Message[] {\n return this.messages.slice(start, end);\n }\n\n /**\n * 序列化为快照\n */\n toJSON(): ContextSnapshot {\n return {\n version: 2,\n messages: cloneMessages(this.messages),\n enrichedMessages: this.enrichedMessages.map(message => ({\n ...message,\n tags: [...message.tags],\n parsed: { ...message.parsed },\n })),\n sequence: this.sequence,\n };\n }\n\n /**\n * 从快照恢复\n */\n static fromJSON(snapshot: ContextSnapshot): Context {\n const ctx = new Context();\n ctx.restore(snapshot);\n return ctx;\n }\n\n /**\n * 用快照原地恢复当前 Context\n */\n restore(snapshot: ContextSnapshot): this {\n this.messages = cloneMessages(snapshot.messages);\n this.enrichedMessages = snapshot.enrichedMessages\n ? snapshot.enrichedMessages.map(message => ({\n ...message,\n tags: [...message.tags],\n parsed: { ...message.parsed },\n }))\n : [];\n this.sequence = snapshot.sequence ?? this.enrichedMessages.length;\n this.rebuildIndexes();\n return this;\n }\n\n /**\n * 序列化为 JSON 字符串\n */\n serialize(): string {\n return JSON.stringify(this.toJSON());\n }\n\n /**\n * 从 JSON 字符串反序列化\n */\n static deserialize(json: string): Context {\n return Context.fromJSON(JSON.parse(json));\n }\n\n // ========== 内核化能力:消息包装 ==========\n\n /**\n * 统一消息入口(内部方法)\n */\n private addMessage(msg: Message, meta: MessageMeta): void {\n const enriched = this.enrich(msg, meta);\n this.enrichedMessages.push(enriched);\n this.updateIndexes(enriched);\n }\n\n /**\n * 添加用户消息\n */\n addUserMessage(content: string, turn: number): void {\n this.addMessage(\n { role: 'user', content, turn },\n { turn }\n );\n // 同步到 messages 数组(保持向后兼容)\n this.messages.push({ role: 'user', content, turn });\n }\n\n /**\n * 添加助手响应\n */\n addAssistantMessage(response: LLMResponse, turn: number): void {\n this.addMessage(\n {\n role: 'assistant',\n content: response.content,\n turn,\n toolCalls: response.toolCalls,\n reasoning: response.reasoning,\n thinkingBlocks: response.thinkingBlocks,\n },\n { turn }\n );\n // 同步到 messages 数组\n this.messages.push({\n role: 'assistant',\n content: response.content,\n turn,\n toolCalls: response.toolCalls,\n reasoning: response.reasoning,\n thinkingBlocks: response.thinkingBlocks,\n });\n }\n\n /**\n * 添加工具结果\n */\n addToolMessage(call: ToolCall, result: ToolExecResult, turn: number): void {\n const content = JSON.stringify({\n success: result.success,\n result: result.result,\n ...(result.error ? { error: result.error } : {}),\n });\n this.addMessage(\n {\n role: 'tool',\n turn,\n toolCallId: call.id,\n content,\n },\n { turn }\n );\n // 同步到 messages 数组\n this.messages.push({\n role: 'tool',\n turn,\n toolCallId: call.id,\n content,\n });\n }\n\n /**\n * 添加系统消息\n */\n addSystemMessage(content: string, turn: number, source?: string): void {\n this.addMessage(\n { role: 'system', content, turn },\n { turn, source }\n );\n // 同步到 messages 数组\n this.messages.push({ role: 'system', content, turn });\n }\n\n // ========== 内核化能力:查询接口 ==========\n\n /**\n * 查询构建器\n */\n query(): ContextQuery {\n return new ContextQuery(this.enrichedMessages, this.indexes);\n }\n\n /**\n * 按轮次获取消息\n */\n getByTurn(turn: number): EnrichedMessage[] {\n return this.enrichedMessages.filter(m => m.turn === turn);\n }\n\n /**\n * 获取最近 N 条消息\n */\n getRecent(n: number): EnrichedMessage[] {\n return this.enrichedMessages.slice(-n);\n }\n\n /**\n * 获取所有丰富化消息(内部使用)\n */\n getAllEnriched(): EnrichedMessage[] {\n return [...this.enrichedMessages];\n }\n\n // ========== 私有方法 ==========\n\n /**\n * 丰富化消息:添加元数据\n */\n private enrich(message: Message, meta: MessageMeta): EnrichedMessage {\n const id = this.generateId();\n const timestamp = Date.now();\n\n return {\n // 原始字段\n role: message.role,\n content: message.content,\n toolCallId: message.toolCallId,\n toolCalls: message.toolCalls,\n reasoning: message.reasoning,\n thinkingBlocks: message.thinkingBlocks,\n\n // 元数据字段\n id,\n timestamp,\n turn: meta.turn,\n sequence: this.sequence++,\n agentId: meta.agentId,\n source: meta.source,\n\n // 分类标签\n tags: this.inferTags(message),\n\n // 解析结果\n parsed: this.parseContent(message),\n };\n }\n\n /**\n * 推断消息标签\n */\n private inferTags(message: Message): MessageTag[] {\n const tags: MessageTag[] = [];\n\n if (message.role === 'user') {\n tags.push('user');\n } else if (message.role === 'system') {\n tags.push('system');\n } else if (message.role === 'assistant') {\n tags.push('assistant');\n if (message.toolCalls && message.toolCalls.length > 0) {\n tags.push('tool-call');\n }\n } else if (message.role === 'tool') {\n tags.push('tool-result');\n }\n\n return tags;\n }\n\n /**\n * 解析 content 提取结构化信息\n */\n private parseContent(message: Message): ParsedContent {\n const content = message.content;\n\n // 提取 taskId: 匹配 \"taskId\":\"xxx\" 或 'taskId':'xxx'\n const taskIdRegex = /[\"']taskId[\"']\\s*:\\s*[\"']([^\"']+)[\"']/g;\n const taskIds: string[] = [];\n let match;\n while ((match = taskIdRegex.exec(content)) !== null) {\n taskIds.push(match[1]);\n }\n\n // 提取工具调用名:从 toolCalls 或 content 中提取\n const toolCalls: string[] = [];\n if (message.toolCalls) {\n message.toolCalls.forEach(call => toolCalls.push(call.name));\n }\n\n // 提取 @ 提及\n const mentions: string[] = [];\n const mentionRegex = /@(\\w+)/g;\n while ((match = mentionRegex.exec(content)) !== null) {\n mentions.push(match[1]);\n }\n\n return { taskIds, toolCalls, mentions };\n }\n\n /**\n * 更新索引\n */\n private updateIndexes(message: EnrichedMessage): void {\n // 按工具名索引\n message.toolCalls?.forEach(call => {\n const key = `tool:${call.name}`;\n const set = this.indexes.get(key) ?? new Set<string>();\n set.add(message.id);\n this.indexes.set(key, set);\n });\n\n // 按 taskId 索引\n message.parsed.taskIds.forEach(taskId => {\n const key = `task:${taskId}`;\n const set = this.indexes.get(key) ?? new Set<string>();\n set.add(message.id);\n this.indexes.set(key, set);\n });\n }\n\n /**\n * 从 enrichedMessages 重建索引\n */\n private rebuildIndexes(): void {\n this.indexes = new Map<string, Set<string>>();\n for (const message of this.enrichedMessages) {\n this.updateIndexes(message);\n }\n }\n\n /**\n * 生成唯一 ID\n */\n private generateId(): string {\n return `msg_${Date.now()}_${this.sequence}`;\n }\n}\n","import { AsyncLocalStorage } from 'async_hooks';\nimport { 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>();\nconst rawConsole = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n debug: console.debug.bind(console),\n};\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\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 switch (level) {\n case 'warn':\n rawConsole.warn(...args);\n break;\n case 'error':\n rawConsole.error(...args);\n break;\n case 'debug':\n rawConsole.debug(...args);\n break;\n case 'trace':\n case 'info':\n default:\n rawConsole.log(...args);\n break;\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 entry.delivery = {\n hub: true,\n console: false,\n reason: 'hub',\n };\n debugHub.pushNotification(agentId, createNotification(entry));\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 const prefix = `[${entry.namespace}] [local-only:${entry.delivery.reason}] ${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","import { mkdir, readFile, readdir, rm, writeFile } from 'fs/promises';\nimport { resolve } from 'path';\nimport { cwd } from 'process';\nimport type { ContextSnapshot } from './context.js';\nimport type { FeatureCheckpoint } from './checkpoint.js';\nimport type { UsageStatsSnapshot } from './usage.js';\n\nexport interface AgentRuntimeSnapshot {\n initialized: boolean;\n callIndex: number;\n context?: ContextSnapshot;\n featureStates: FeatureCheckpoint[];\n usageStats?: UsageStatsSnapshot;\n}\n\nexport interface CallRollbackSnapshot {\n callIndex: number;\n draftInput: string;\n runtime: AgentRuntimeSnapshot;\n}\n\nexport interface AgentSessionSnapshot {\n version: number;\n sessionId: string;\n savedAt: number;\n agentType: string;\n runtime: AgentRuntimeSnapshot;\n rollbackHistory: CallRollbackSnapshot[];\n}\n\nexport interface SessionStore {\n save(sessionId: string, snapshot: AgentSessionSnapshot): Promise<string>;\n load(sessionId: string): Promise<AgentSessionSnapshot>;\n list(): Promise<string[]>;\n delete(sessionId: string): Promise<void>;\n}\n\nconst DEFAULT_SESSION_DIR = resolve(cwd(), '.agentdev', 'sessions');\n\nexport class FileSessionStore implements SessionStore {\n constructor(private readonly baseDir: string = DEFAULT_SESSION_DIR) {}\n\n async save(sessionId: string, snapshot: AgentSessionSnapshot): Promise<string> {\n await mkdir(this.baseDir, { recursive: true });\n const filePath = this.resolvePath(sessionId);\n await writeFile(filePath, JSON.stringify(snapshot, null, 2), 'utf-8');\n return filePath;\n }\n\n async load(sessionId: string): Promise<AgentSessionSnapshot> {\n const filePath = this.resolvePath(sessionId);\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as AgentSessionSnapshot;\n }\n\n async list(): Promise<string[]> {\n await mkdir(this.baseDir, { recursive: true });\n const entries = await readdir(this.baseDir, { withFileTypes: true });\n return entries\n .filter(entry => entry.isFile() && entry.name.endsWith('.json'))\n .map(entry => entry.name.replace(/\\.json$/i, ''))\n .sort();\n }\n\n async delete(sessionId: string): Promise<void> {\n await rm(this.resolvePath(sessionId), { force: true });\n }\n\n private resolvePath(sessionId: string): string {\n return resolve(this.baseDir, `${sessionId}.json`);\n }\n}\n\nlet defaultSessionStore: SessionStore | undefined;\n\nexport function getDefaultSessionStore(): SessionStore {\n if (!defaultSessionStore) {\n defaultSessionStore = new FileSessionStore();\n }\n return defaultSessionStore;\n}\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 *\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 * 数据源注册中心\n */\nexport class DataSourceRegistry {\n private static sources = new Map<string, DataSourceRenderer>();\n\n /**\n * 注册数据源\n */\n static 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 static unregister(name: string): boolean {\n return this.sources.delete(name);\n }\n\n /**\n * 获取数据源\n */\n static get(name: string): DataSourceRenderer | undefined {\n return this.sources.get(name);\n }\n\n /**\n * 检查数据源是否存在\n */\n static has(name: string): boolean {\n return this.sources.has(name);\n }\n\n /**\n * 获取所有已注册的数据源名称\n */\n static 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 static 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 static 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 * 模板组合器\n * 支持流式 API 和灵活拼接\n */\n\nimport type { TemplateSource, PlaceholderContext, TemplateResult } from './types.js';\nimport { TemplateLoader } from './loader.js';\nimport { PlaceholderResolver } from './resolver.js';\nimport { 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\n constructor(loader?: TemplateLoader) {\n this.loader = loader ?? new TemplateLoader();\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 case 'dataSource':\n // 使用数据源注册中心渲染\n return await DataSourceRegistry.render(part.name, part.template, context);\n\n case 'composer':\n // 嵌套组合器,递归渲染\n const result = await part.composer.render(context);\n sources.push(...result.sources);\n return result.content;\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 * 定义 Agent 生命周期钩子相关的类型\n */\n\nimport type { ToolCall, Tool, LLMResponse, Message } from './types.js';\nimport { Context } from './context.js';\nimport type { Agent } from './agent.js';\n\n// ========== 概念定义 ==========\n/**\n * Call(调用): 用户一次完整的输入-输出交互\n * - 用户输入 → Agent 处理(可能包含多个 ReAct 步骤) → 返回最终输出\n * - 一个 Call 可能包含多个 Step\n *\n * Step(步骤): ReAct 循环中的单次迭代\n * - 一次 LLM 调用 + 工具执行(如果有)\n * - Step 是 Call 内部的执行单元\n *\n * Turn(轮): 从无工具调用开始,到下一次无工具调用结束的完整对话周期\n * - 可能包含多个 Step\n * - 用于反向钩子决策点\n */\n\n// ========== 核心生命周期枚举 ==========\n/**\n * 核心生命周期枚举\n *\n * 三级结构:Agent 级 > Call 级 > Step 级 > Tool 级\n * 每个生命周期都有配套的正向钩子(通知)和反向钩子(决策/处理)\n */\nexport enum CoreLifecycle {\n // ========== Agent 级 ==========\n /** Agent 初始化 */\n AgentInitiate = 'AgentInitiate',\n\n /** Agent 销毁 */\n AgentDestroy = 'AgentDestroy',\n\n // ========== Call 级 ==========\n /** Call 开始 */\n CallStart = 'CallStart',\n\n /** Call 结束 */\n CallFinish = 'CallFinish',\n\n // ========== Step 级 ==========\n /** Step 开始 */\n StepStart = 'StepStart',\n\n /** Step 结束 */\n StepFinish = 'StepFinish',\n\n // ========== Tool 级 ==========\n /** 工具使用前 */\n ToolUse = 'ToolUse',\n\n /** 工具使用后 */\n ToolFinished = 'ToolFinished',\n}\n\n// ========== 决策状态定义 ==========\n/**\n * 决策状态(反向钩子返回值)\n *\n * 用于控制执行流程的三个状态\n */\nexport enum Decision {\n /** 批准:确认执行,跳过后续决策 */\n Approve = 'approve',\n\n /** 拒绝:阻止执行,跳过后续决策 */\n Deny = 'deny',\n\n /** 继续:交给下一个决策节点,使用默认行为 */\n Continue = 'continue',\n}\n\n/**\n * 决策结果类型\n */\nexport type DecisionResult =\n | Decision\n | {\n /** 决策动作 */\n action: Decision;\n\n /** 拒绝原因(用于日志/调试) */\n reason?: string;\n\n /** 附加元数据 */\n metadata?: Record<string, any>;\n };\n\n/**\n * 将 DecisionResult 转换为标准 Decision\n */\nexport function normalizeDecision(result: DecisionResult): Decision {\n if (typeof result === 'string') {\n return result;\n }\n return result.action;\n}\n\n// ========== Agent 级别 ==========\n\n/**\n * Agent 初始化上下文\n */\nexport interface AgentInitiateContext {\n /** 消息上下文 */\n context: Context;\n}\n\n/**\n * Agent 销毁上下文\n */\nexport interface AgentDestroyContext {\n /** 消息上下文 */\n context: Context;\n}\n\n// ========== Call 级别 ==========\n\n/**\n * Call 开始上下文\n */\nexport interface CallStartContext {\n /** 用户输入 */\n input: string;\n /** 消息上下文 */\n context: Context;\n /** 是否首次调用 */\n isFirstCall: boolean;\n /** Agent 实例(用于访问 setUserInput/getUserInput 等 API) */\n agent?: any;\n}\n\n/**\n * Call 结束上下文\n */\nexport interface CallFinishContext {\n /** 用户输入 */\n input: string;\n /** 消息上下文 */\n context: Context;\n /** 最终响应 */\n response: string;\n /** 执行的步骤数 */\n steps: number;\n /** 是否成功完成 */\n completed: boolean;\n}\n\n// ========== Step 级别 ==========\n\n/**\n * Step 开始上下文\n *\n * Step 是 ReAct 循环中的单次迭代\n */\nexport interface StepStartContext {\n /** 当前步骤序号(从 0 开始) */\n step: number;\n /** 当前调用序号(用户交互次数,从 0 开始) */\n callIndex: number;\n /** 消息上下文 */\n context: Context;\n /** 原始用户输入 */\n input: string;\n}\n\n/**\n * Step 结束上下文\n */\nexport interface StepFinishedContext extends StepStartContext {\n /** LLM 响应 */\n llmResponse: LLMResponse;\n /** 执行的工具调用数量 */\n toolCallsCount: number;\n}\n\n// ========== Tool 级别 ==========\n\n/**\n * 工具上下文 - onToolUse 钩子的参数\n *\n * 提供工具调用时的完整上下文信息\n */\nexport interface ToolContext {\n /** 工具调用 */\n call: ToolCall;\n /** 工具定义 */\n tool: Tool;\n /** 当前步骤序号 */\n step: number;\n /** 用户输入 */\n input: string;\n /** 消息上下文(可读写) */\n context: Context;\n}\n\n/**\n * 工具结果 - onToolFinished 钩子的参数\n *\n * 提供工具执行后的完整结果信息\n */\nexport interface ToolResult {\n /** 是否成功 */\n success: boolean;\n /** 返回数据 */\n data: unknown;\n /** 错误信息(如果失败) */\n error?: string;\n /** 执行耗时(ms) */\n duration: number;\n /** 工具调用 */\n call: ToolCall;\n /** 工具定义 */\n tool: Tool;\n /** 当前步骤序号 */\n step: number;\n /** 用户输入 */\n input: string;\n /** 消息上下文 */\n context: Context;\n}\n\n/**\n * 钩子返回值类型(扩展版)\n *\n * 统一的生命周期钩子控制流指令\n *\n * - { action: 'block' }: 阻止工具执行(工具级)\n * - { action: 'allow' }: 允许工具执行(工具级)\n * - undefined: 默认行为\n */\nexport type HookResult =\n | { action: 'block'; reason?: string }\n | { action: 'allow' }\n | undefined;\n\n// ========== SubAgent 级别 ==========\n\n/**\n * 子代理状态\n */\nexport type SubAgentStatus = 'idle' | 'busy' | 'completed' | 'failed' | 'terminated';\n\n/**\n * 子代理创建上下文\n */\nexport interface SubAgentSpawnContext {\n /** 子代理 ID */\n agentId: string;\n /** 子代理类型 */\n type: string;\n /** 初始指令 */\n instruction: string;\n /** 子代理实例 */\n agent: Agent;\n}\n\n/**\n * 子代理状态更新上下文\n */\nexport interface SubAgentUpdateContext {\n /** 子代理 ID */\n agentId: string;\n /** 子代理类型 */\n type: string;\n /** 旧状态 */\n oldStatus: SubAgentStatus;\n /** 新状态 */\n newStatus: SubAgentStatus;\n /** 执行结果(完成时) */\n result?: string;\n /** 错误信息(失败时) */\n error?: string;\n}\n\n/**\n * 子代理销毁上下文\n */\nexport interface SubAgentDestroyContext {\n /** 子代理 ID */\n agentId: string;\n /** 子代理类型 */\n type: string;\n /** 销毁原因 */\n reason: 'manual' | 'parent_dispose' | 'error';\n}\n\n/**\n * Agent 中断上下文\n */\nexport interface AgentInterruptContext {\n /** 中断原因 */\n reason: 'max_steps_reached' | 'error' | 'cancelled';\n /** 当前步骤序号 */\n step: number;\n /** 当前消息上下文 */\n context: Context;\n}\n\n/**\n * 子代理中断上下文\n */\nexport interface SubAgentInterruptContext {\n /** 子代理 ID */\n agentId: string;\n /** 子代理类型 */\n type: string;\n /** 中断原因 */\n reason: 'max_steps_reached' | 'error' | 'cancelled';\n /** 中断时的结果 */\n result: string;\n}\n\n// ========== 决策上下文类型(反向钩子专用)==========\n\n/**\n * Step 结束决策上下文(反向钩子)\n *\n * 用于在 Step 结束后进行流程控制决策\n */\nexport interface StepFinishDecisionContext extends StepFinishedContext {\n /** 是否有活跃的子代理(busy 状态) */\n hasActiveSubAgents?: boolean;\n\n /** 是否有待处理的子代理消息 */\n hasPendingMessages?: boolean;\n\n /** 是否调用了 wait 工具 */\n waitCalled?: boolean;\n}\n\n/**\n * 工具完成决策上下文(反向钩子)\n *\n * 用于在工具执行完成后进行流程控制决策\n */\nexport interface ToolFinishedDecisionContext extends ToolResult {\n /** 刚才执行的工具名称 */\n toolName: string;\n}\n","/**\n * 反向钩子装饰器\n *\n * 使用装饰器标记反向钩子方法,提供编译时和运行时类型检查\n */\n\nimport { CoreLifecycle, Decision, DecisionResult } from './lifecycle.js';\nimport type { HookSourceLocation } from './types.js';\nimport type {\n AgentInitiateContext,\n AgentDestroyContext,\n CallStartContext,\n CallFinishContext,\n StepStartContext,\n StepFinishedContext,\n ToolContext,\n ToolResult,\n StepFinishDecisionContext,\n ToolFinishedDecisionContext,\n} from './lifecycle.js';\n\n// ========== 装饰器元数据 ==========\n\n/**\n * 装饰器元数据存储\n *\n * 存储在类的构造函数上,记录哪些方法被标记为反向钩子\n */\ninterface DecoratorMetadata {\n /** 生命周期 → 方法名 映射 */\n hookDecisions: Map<CoreLifecycle, string>;\n /** 生命周期:方法名 → 源码位置 */\n hookSources: Map<string, HookSourceLocation>;\n /** 生命周期 → 方法签名 映射 */\n hookSignatures: Map<CoreLifecycle, {\n contextType: string;\n returnType: string;\n }>;\n}\n\n// ========== 上下文类型映射 ==========\n\n/**\n * 反向钩子上下文类型映射\n *\n * 每个生命周期对应的决策上下文类型\n */\nconst DecisionContextTypeMap: Record<CoreLifecycle, string> = {\n [CoreLifecycle.AgentInitiate]: 'AgentInitiateContext',\n [CoreLifecycle.AgentDestroy]: 'AgentDestroyContext',\n [CoreLifecycle.CallStart]: 'CallStartContext',\n [CoreLifecycle.CallFinish]: 'CallFinishContext',\n [CoreLifecycle.StepStart]: 'StepStartContext',\n [CoreLifecycle.StepFinish]: 'StepFinishDecisionContext',\n [CoreLifecycle.ToolUse]: 'ToolContext',\n [CoreLifecycle.ToolFinished]: 'ToolFinishedDecisionContext',\n};\n\n// ========== 返回值类型映射 ==========\n\n/**\n * 反向钩子返回值类型映射\n *\n * 每个生命周期对应的返回值类型\n * - 'void': 无返回值或 undefined(仅做处理,不控制流程)\n * - 'DecisionResult': 返回决策结果(有流程控制能力)\n */\nconst DecisionReturnTypeMap: Record<CoreLifecycle, 'void' | 'DecisionResult'> = {\n [CoreLifecycle.AgentInitiate]: 'void',\n [CoreLifecycle.AgentDestroy]: 'void',\n [CoreLifecycle.CallStart]: 'void',\n [CoreLifecycle.CallFinish]: 'void',\n [CoreLifecycle.StepStart]: 'void',\n [CoreLifecycle.StepFinish]: 'DecisionResult', // Step 结束时可以决定是否继续循环\n [CoreLifecycle.ToolUse]: 'DecisionResult', // 工具使用前可以决定是否阻塞执行\n [CoreLifecycle.ToolFinished]: 'void', // 工具完成后仅做通知(无流程控制)\n};\n\n/**\n * 流程控制型钩子集合\n *\n * 这些钩子返回 DecisionResult,在单个 Feature 内只能使用一次\n */\nconst DECISION_HOOKS = new Set<CoreLifecycle>([\n CoreLifecycle.StepFinish,\n CoreLifecycle.ToolUse, // 工具执行前可阻塞\n]);\n\nfunction normalizeSourceFile(filePath: string): string {\n return filePath\n .replace(/\\\\/g, '/')\n .replace(/\\/dist\\//, '/src/')\n .replace(/\\.js$/, '.ts');\n}\n\nfunction captureDecoratorSource(): HookSourceLocation | undefined {\n const stack = new Error().stack;\n if (!stack) return undefined;\n\n const lines = stack.split('\\n').slice(1);\n for (const line of lines) {\n if (\n line.includes('hooks-decorator.') ||\n line.includes('__decorate') ||\n line.includes('Reflect.decorate')\n ) {\n continue;\n }\n\n const trimmedLine = line.trim();\n const match = trimmedLine.match(/^at .* \\((.+):(\\d+):(\\d+)\\)$/) ||\n trimmedLine.match(/^at (.+):(\\d+):(\\d+)$/);\n if (!match) continue;\n\n const [, rawFile, rawLine, rawColumn] = match;\n const file = normalizeSourceFile(rawFile.trim());\n const lineNumber = Number(rawLine);\n const columnNumber = Number(rawColumn);\n\n return {\n file,\n line: Number.isNaN(lineNumber) ? undefined : lineNumber,\n column: Number.isNaN(columnNumber) ? undefined : columnNumber,\n display: `${file}:${rawLine}`,\n };\n }\n\n return undefined;\n}\n\n// ========== 装饰器工厂 ==========\n\n/**\n * 创建反向钩子装饰器\n *\n * @param lifecycle - 生命周期类型\n * @returns 装饰器函数\n */\nfunction createHookDecorator(lifecycle: CoreLifecycle) {\n const expectedContext = DecisionContextTypeMap[lifecycle];\n const expectedReturn = DecisionReturnTypeMap[lifecycle];\n\n return function hookDecorator(\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const constructor = target.constructor;\n\n // ========== 唯一性检查 ==========\n\n // 初始化元数据存储\n if (!constructor._hookDecisions) {\n constructor._hookDecisions = new Map<CoreLifecycle, string>();\n }\n if (!constructor._hookSources) {\n constructor._hookSources = new Map<string, HookSourceLocation>();\n }\n\n // 唯一性检查:流程控制型钩子在类中只能使用一次\n // 非流程控制型钩子(void 返回值)可以使用多次\n if (DECISION_HOOKS.has(lifecycle) && constructor._hookDecisions.has(lifecycle)) {\n throw new Error(\n `流程控制型装饰器 @${lifecycle} 在 ${constructor.name} 中只能使用一次`\n );\n }\n\n // 注册元数据(非流程控制型钩子允许多个方法)\n const existing = constructor._hookDecisions.get(lifecycle);\n if (existing) {\n // 追加方法名(用逗号分隔)\n constructor._hookDecisions.set(lifecycle, `${existing},${propertyKey}`);\n } else {\n constructor._hookDecisions.set(lifecycle, propertyKey);\n }\n\n const source = captureDecoratorSource();\n if (source) {\n constructor._hookSources.set(`${lifecycle}:${propertyKey}`, source);\n }\n\n // 保存期望的签名(供运行时验证)\n constructor._hookSignatures = constructor._hookSignatures || new Map();\n constructor._hookSignatures.set(lifecycle, {\n contextType: expectedContext,\n returnType: expectedReturn,\n });\n\n // ========== 运行时返回值验证 ==========\n\n if (descriptor.value && typeof descriptor.value === 'function') {\n const originalMethod = descriptor.value;\n descriptor.value = function (this: any, ...args: any[]) {\n const result = originalMethod.apply(this, args);\n\n // 验证返回值类型(仅在开发模式)\n if (process.env.NODE_ENV === 'development') {\n if (expectedReturn === 'void') {\n // void 类型:期望无返回值或 undefined\n if (result !== undefined) {\n console.warn(\n `[@${lifecycle}] 方法 ${propertyKey} 应该返回 void 或 undefined,` +\n `但返回了 ${typeof result}`\n );\n }\n } else {\n // DecisionResult 类型:期望 Promise<DecisionResult>\n if (!(result instanceof Promise)) {\n console.warn(\n `[@${lifecycle}] 方法 ${propertyKey} 必须返回 Promise<DecisionResult>` +\n `,但返回了 ${typeof result}`\n );\n }\n }\n }\n\n return result;\n };\n }\n\n return descriptor;\n };\n}\n\n// ========== 导出具体装饰器 ==========\n\n/**\n * Agent 初始化装饰器\n *\n * 标记在 Agent 初始化时执行的方法\n * 返回 void(仅做处理,不控制流程)\n */\nexport const AgentInitiate = createHookDecorator(CoreLifecycle.AgentInitiate);\n\n/**\n * Agent 销毁装饰器\n *\n * 标记在 Agent 销毁时执行的方法\n * 返回 void(仅做处理,不控制流程)\n */\nexport const AgentDestroy = createHookDecorator(CoreLifecycle.AgentDestroy);\n\n/**\n * Call 开始装饰器\n *\n * 标记在 Call 开始时执行的方法\n * 返回 void(仅做处理,不控制流程)\n */\nexport const CallStart = createHookDecorator(CoreLifecycle.CallStart);\n\n/**\n * Call 结束装饰器\n *\n * 标记在 Call 结束时执行的方法\n * 返回 void(仅做处理,不控制流程)\n */\nexport const CallFinish = createHookDecorator(CoreLifecycle.CallFinish);\n\n/**\n * Step 开始装饰器\n *\n * 标记在 Step 开始时执行的方法\n * 返回 void(仅做处理,不控制流程)\n */\nexport const StepStart = createHookDecorator(CoreLifecycle.StepStart);\n\n/**\n * Step 结束装饰器\n *\n * 标记在 Step 结束时执行的方法\n * 返回 DecisionResult(有流程控制能力)\n * - Decision.Approve: 继续循环(即使无工具调用)\n * - Decision.Deny: 结束循环\n * - Decision.Continue: 使用默认行为\n */\nexport const StepFinish = createHookDecorator(CoreLifecycle.StepFinish);\n\n/**\n * 工具使用装饰器\n *\n * 标记在工具使用前执行的方法\n * 返回 DecisionResult(有流程控制能力)\n * - Decision.Approve: 允许工具执行\n * - Decision.Deny: 阻止工具执行(返回错误)\n * - Decision.Continue: 使用默认行为(允许执行)\n */\nexport const ToolUse = createHookDecorator(CoreLifecycle.ToolUse);\n\n/**\n * 工具完成装饰器\n *\n * 标记在工具执行完成后执行的方法\n * 返回 void(仅做处理,不控制流程)\n */\nexport const ToolFinished = createHookDecorator(CoreLifecycle.ToolFinished);\n\n// ========== 导出装饰器元数据访问接口 ==========\n\n/**\n * 获取类的装饰器元数据\n *\n * @param target 类或类实例\n * @returns 装饰器元数据\n */\nexport function getDecoratorMetadata(target: any): DecoratorMetadata {\n const constructor = typeof target === 'function' ? target : target.constructor;\n return {\n hookDecisions: constructor._hookDecisions || new Map<CoreLifecycle, string>(),\n hookSources: constructor._hookSources || new Map<string, HookSourceLocation>(),\n hookSignatures: constructor._hookSignatures || new Map(),\n };\n}\n\n// ========== TypeScript 类型定义(编译时检查)==========\n\n/**\n * 反向钩子方法类型\n */\ntype HookMethod<TContext, TReturn> = (ctx: TContext) => TReturn;\n\n/**\n * AgentInitiate 反向钩子类型\n */\nexport type AgentInitiateHook = HookMethod<AgentInitiateContext, void | Promise<void>>;\n\n/**\n * AgentDestroy 反向钩子类型\n */\nexport type AgentDestroyHook = HookMethod<AgentDestroyContext, void | Promise<void>>;\n\n/**\n * CallStart 反向钩子类型\n */\nexport type CallStartHook = HookMethod<CallStartContext, void | Promise<void>>;\n\n/**\n * CallFinish 反向钩子类型\n */\nexport type CallFinishHook = HookMethod<CallFinishContext, void | Promise<void>>;\n\n/**\n * StepStart 反向钩子类型\n */\nexport type StepStartHook = HookMethod<StepStartContext, void | Promise<void>>;\n\n/**\n * StepFinish 反向钩子类型(有流程控制)\n */\nexport type StepFinishHook = HookMethod<\n StepFinishDecisionContext,\n DecisionResult | Promise<DecisionResult>\n>;\n\n/**\n * ToolUse 反向钩子类型(有流程控制)\n */\nexport type ToolUseHook = HookMethod<\n ToolContext,\n DecisionResult | Promise<DecisionResult>\n>;\n\n/**\n * ToolFinished 反向钩子类型(仅通知)\n */\nexport type ToolFinishedHook = HookMethod<ToolFinishedDecisionContext, void | Promise<void>>;\n\n// ========== 重新导出决策枚举和类型 ==========\n\nexport { CoreLifecycle, Decision, normalizeDecision } from './lifecycle.js';\nexport type { DecisionResult } from './lifecycle.js';\n","/**\n * Feature System - 可外挂功能模块接口\n *\n * Feature 系统允许将功能(MCP、Skills、子代理等)从 Agent 核心中解耦,\n * 实现新功能的声明式注册和统一的生命周期管理。\n */\n\nimport type { Tool } from './types.js';\nimport type { ToolCall } from './types.js';\nimport type { InlineRenderTemplate } from './types.js';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { existsSync, readFileSync } from 'fs';\n\n/**\n * Feature 上下文值类型\n */\nexport type ToolContextValue = Record<string, unknown>;\n\n/**\n * Feature 上下文注入器\n * 返回要注入到 tool.execute() 的额外参数\n */\nexport type ContextInjector = (call: ToolCall) => ToolContextValue;\n\n/**\n * Feature 初始化上下文\n */\nexport interface FeatureInitContext {\n /** Agent ID */\n agentId: string;\n /** Agent 配置 */\n config: import('./types.js').AgentConfig;\n /** Feature 级结构化日志 */\n logger: import('./logging.js').Logger;\n /** Feature 特定配置 */\n featureConfig?: unknown;\n /** 获取其他 Feature */\n getFeature<T extends AgentFeature>(name: string): T | undefined;\n /** 注册工具 */\n registerTool(tool: Tool): void;\n}\n\n/**\n * Feature 运行时上下文\n */\nexport interface FeatureContext {\n agentId: string;\n config: import('./types.js').AgentConfig;\n}\n\n/**\n * Feature 快照状态\n *\n * 第一阶段只支持显式白名单状态:\n * - Feature 自己决定要保存什么\n * - 未声明的状态一律不保证恢复\n */\nexport type FeatureStateSnapshot = unknown;\n\n/**\n * 包信息\n */\nexport interface PackageInfo {\n /** 包名,如 '@agentdev/shell-feature' 或 'agentdev' */\n name: string;\n /** 版本号(可选) */\n version?: string;\n /** 包根目录绝对路径 */\n root: string;\n}\n\n/**\n * 模板信息\n */\nexport interface TemplateInfo {\n /** 包名 */\n packageName: string;\n /** 模板名(不含扩展名) */\n templateName: string;\n}\n\n// ========== 正向钩子(纯通知,void 返回)==========\n\n/**\n * Feature 初始化上下文\n */\nexport interface FeatureInitContext {\n /** Agent ID */\n agentId: string;\n /** Agent 配置 */\n config: import('./types.js').AgentConfig;\n /** Feature 级结构化日志 */\n logger: import('./logging.js').Logger;\n /** Feature 特定配置 */\n featureConfig?: unknown;\n /** 获取其他 Feature */\n getFeature<T extends AgentFeature>(name: string): T | undefined;\n /** 注册工具 */\n registerTool(tool: Tool): void;\n}\n\n/**\n * Agent Feature 接口\n *\n * 可外挂的功能模块,提供工具和上下文注入\n */\nexport interface AgentFeature {\n /** Feature 名称 */\n readonly name: string;\n /** 依赖的其他 Feature */\n readonly dependencies?: string[];\n /** 可选:用于调试器展示的源码位置 */\n readonly source?: string;\n /** 可选:用于调试器展示的 Feature 描述 */\n readonly description?: string;\n\n /**\n * 获取同步工具(已知工具列表)\n */\n getTools?(): Tool[];\n\n /**\n * 获取异步工具(需要连接、发现等)\n */\n getAsyncTools?(ctx: FeatureInitContext): Promise<Tool[]>;\n\n /**\n * 获取包信息\n * \n * 返回 Feature 所在的包信息(包名、版本、根目录)\n * 用于统一模板路径解析和包管理\n * \n * @returns 包信息,如果 Feature 不属于任何包则返回 null\n * \n * @example\n * ```typescript\n * getPackageInfo(): PackageInfo | null {\n * return {\n * name: '@agentdev/shell-feature',\n * version: '1.0.0',\n * root: '/path/to/package/root'\n * };\n * }\n * ```\n */\n getPackageInfo?(): PackageInfo | null;\n\n /**\n * 获取模板名称列表\n * \n * 返回 Feature 提供的模板名称列表(不含扩展名)\n * 模板文件必须位于 {packageRoot}/dist/templates/{templateName}.render.js\n * \n * @returns 模板名称数组\n * \n * @example\n * ```typescript\n * getTemplateNames(): string[] {\n * return ['bash', 'trash-delete', 'trash-list'];\n * }\n * ```\n */\n getTemplateNames?(): string[];\n\n /**\n * 声明渲染模板(推荐方式)\n * 直接返回模板对象,无需文件路径\n *\n * @example\n * ```typescript\n * getRenderTemplates(): Record<string, InlineRenderTemplate> {\n * return {\n * 'bash': {\n * call: (args) => `<div class=\"bash-command\">> ${escapeHtml(args.command)}</div>`,\n * result: (data, success) => success\n * ? `<pre class=\"bash-output\">${escapeHtml(data)}</pre>`\n * : `<div class=\"tool-error\">${escapeHtml(data)}</div>`\n * }\n * };\n * }\n * ```\n */\n getRenderTemplates?(): Record<string, InlineRenderTemplate>;\n\n /**\n * 声明上下文注入器\n */\n getContextInjectors?(): Map<string | RegExp, ContextInjector>;\n\n /**\n * 初始化钩子\n */\n onInitiate?(ctx: FeatureInitContext): Promise<void>;\n\n /**\n * 清理钩子\n */\n onDestroy?(ctx: FeatureContext): Promise<void>;\n\n /**\n * 捕获可回滚的 Feature 状态\n *\n * 仅返回显式声明、可序列化的状态。\n * 未返回的字段不会参与 rollback。\n */\n captureState?(): FeatureStateSnapshot;\n\n /**\n * 从快照恢复 Feature 状态\n */\n restoreState?(snapshot: FeatureStateSnapshot): void | Promise<void>;\n\n /**\n * rollback 前钩子\n */\n beforeRollback?(snapshot: FeatureStateSnapshot): void | Promise<void>;\n\n /**\n * rollback 后钩子\n */\n afterRollback?(snapshot: FeatureStateSnapshot): void | Promise<void>;\n\n /**\n * 可选:为调试器提供 hook 的人类可读说明\n */\n getHookDescription?(lifecycle: string, methodName: string): string | undefined;\n\n // ========== 反向钩子通过装饰器注册,无需接口声明 ==========\n // 使用 hooks-decorator.ts 中提供的装饰器来标记反向钩子方法\n // 例如:@ToolFinished, @LLMFinish, @StepFinish 等\n}\n\n// ========== 辅助函数 ==========\n\n/**\n * 从 Feature 的 source 属性获取包信息\n * \n * 通过向上查找 package.json 文件来确定包信息\n * 支持三种场景:\n * 1. 框架内置 Feature:找到 AgentDev 的 package.json\n * 2. 外部 npm 包:找到包的 package.json\n * 3. 用户本地 Feature:找到用户项目的 package.json\n * \n * @param source Feature 的源文件路径(import.meta.url)\n * @returns 包信息,如果找不到 package.json 则返回 null\n */\nexport function getPackageInfoFromSource(source: string | undefined): PackageInfo | null {\n if (!source) {\n return null;\n }\n\n try {\n // 将 file:// URL 转换为文件系统路径\n const filePath = source.startsWith('file://') ? fileURLToPath(source) : source;\n const featureDir = dirname(filePath);\n \n // 向上查找 package.json\n let currentDir = featureDir;\n const root = process.platform === 'win32' ? currentDir.split(/[/\\\\]/)[0] : '';\n \n while (currentDir && currentDir !== root) {\n try {\n const packageJsonPath = join(currentDir, 'package.json');\n \n // 检查文件是否存在\n if (!existsSync(packageJsonPath)) {\n throw new Error('Not found');\n }\n \n // 读取并解析 package.json\n const content = readFileSync(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(content);\n \n // 找到了 package.json\n return {\n name: packageJson.name || 'unknown',\n version: packageJson.version,\n root: currentDir,\n };\n } catch {\n // 没找到,继续向上查找\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) {\n // 已经到达根目录,停止查找\n break;\n }\n currentDir = parentDir;\n }\n }\n \n return null;\n } catch {\n // 任何错误都返回 null\n return null;\n }\n}\n","import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { basename } from 'path';\nimport { cwd } from 'process';\nimport { isAbsolute, join, resolve } from 'path';\nimport type { MCPConfig, MCPServerConfig } from './types.js';\n\nexport interface LoadAllMCPConfigsOptions {\n excludeServers?: string[];\n}\n\nfunction readConfigFile(configPath: string): unknown {\n try {\n if (!existsSync(configPath)) {\n return undefined;\n }\n\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.warn(`[MCP] Failed to load config \"${configPath}\": ${errorMsg}`);\n return undefined;\n }\n}\n\nfunction isMCPServerConfig(value: unknown): value is MCPServerConfig {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const config = value as Record<string, unknown>;\n if (config.transport === 'stdio') {\n return typeof config.command === 'string' && Array.isArray(config.args);\n }\n\n if (config.transport === 'http') {\n return typeof config.url === 'string';\n }\n\n if (config.transport === 'sse') {\n return typeof config.url === 'string';\n }\n\n return false;\n}\n\nfunction isMCPConfig(value: unknown): value is MCPConfig {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const config = value as Record<string, unknown>;\n return (\n (!!config.servers && typeof config.servers === 'object') ||\n (!!config.mcpServers && typeof config.mcpServers === 'object')\n );\n}\n\nfunction normalizeToMCPConfig(\n value: unknown,\n fallbackServerId: string\n): MCPConfig | undefined {\n if (isMCPConfig(value)) {\n const config = value as unknown as Record<string, unknown>;\n const servers = (config.servers ?? config.mcpServers) as Record<string, MCPServerConfig> | undefined;\n if (!servers) {\n return undefined;\n }\n\n return {\n servers,\n };\n }\n\n if (isMCPServerConfig(value)) {\n return {\n servers: {\n [fallbackServerId]: value,\n },\n };\n }\n\n return undefined;\n}\n\nexport function getDefaultMCPConfigDir(rootDir: string = cwd()): string {\n return join(rootDir, '.agentdev', 'mcps');\n}\n\nexport function loadMCPConfigFromInput(input: string, rootDir: string = cwd()): MCPConfig | undefined {\n let configPath: string;\n let fallbackServerId = 'default';\n\n if (isAbsolute(input)) {\n configPath = input;\n } else if (input.includes('/') || input.includes('\\\\')) {\n configPath = resolve(rootDir, input);\n fallbackServerId = basename(configPath, '.json');\n } else {\n configPath = join(getDefaultMCPConfigDir(rootDir), `${input}.json`);\n fallbackServerId = input;\n }\n\n if (!existsSync(configPath)) {\n console.warn(`[MCP] Config file does not exist: ${configPath}`);\n return undefined;\n }\n\n return normalizeToMCPConfig(readConfigFile(configPath), fallbackServerId);\n}\n\nexport function loadAllMCPConfigs(\n rootDir: string = cwd(),\n options: LoadAllMCPConfigsOptions = {}\n): MCPConfig | undefined {\n const configDir = getDefaultMCPConfigDir(rootDir);\n if (!existsSync(configDir)) {\n return undefined;\n }\n\n const excludedServers = new Set(options.excludeServers ?? []);\n const merged: MCPConfig = { servers: {} };\n const entries = readdirSync(configDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith('.json')) {\n continue;\n }\n\n const configPath = join(configDir, entry.name);\n const config = readConfigFile(configPath);\n if (!config) {\n continue;\n }\n\n if (isMCPConfig(config)) {\n const normalized = normalizeToMCPConfig(config, basename(entry.name, '.json'));\n if (normalized && Object.keys(normalized.servers).length > 0) {\n for (const [serverId, serverConfig] of Object.entries(normalized.servers)) {\n if (!excludedServers.has(serverId)) {\n merged.servers[serverId] = serverConfig;\n }\n }\n continue;\n }\n }\n\n const serverId = basename(entry.name, '.json');\n if (isMCPServerConfig(config)) {\n if (!excludedServers.has(serverId)) {\n merged.servers[serverId] = config;\n }\n continue;\n }\n\n console.warn(`[MCP] Ignoring invalid config file: ${configPath}`);\n }\n\n return Object.keys(merged.servers).length > 0 ? merged : undefined;\n}\n","/**\n * MCP 集成类型定义\n *\n * 定义 MCP 服务器配置、连接管理和工具发现的类型\n */\n\n/**\n * MCP 传输层类型\n */\nexport type MCPTransportType = 'stdio' | 'http' | 'sse';\n\n/**\n * MCP stdio 传输配置\n */\nexport interface MCPSstdioConfig {\n /** 传输类型 */\n transport: 'stdio';\n /** 启动命令 */\n command: string;\n /** 命令参数 */\n args: string[];\n /** 环境变量 (可选) */\n env?: Record<string, string>;\n /** 工作目录 (可选) */\n cwd?: string;\n}\n\n/**\n * MCP HTTP 传输配置\n */\nexport interface MCPHTTPConfig {\n /** 传输类型 */\n transport: 'http';\n /** 服务器 URL */\n url: string;\n /** HTTP 请求头 (可选) */\n headers?: Record<string, string>;\n /** 超时时间 (毫秒,默认 30000) */\n timeout?: number;\n /** 重连次数 (默认 3) */\n retryCount?: number;\n}\n\n/**\n * MCP SSE 传输配置\n */\nexport interface MCPSSEConfig {\n /** 传输类型 */\n transport: 'sse';\n /** 服务器 URL */\n url: string;\n /** HTTP 请求头 (可选) */\n headers?: Record<string, string>;\n /** 重连次数 (默认 3) */\n retryCount?: number;\n}\n\n/**\n * MCP 服务器配置\n */\nexport type MCPServerConfig =\n | MCPSstdioConfig\n | MCPHTTPConfig\n | MCPSSEConfig;\n\n/**\n * MCP 工具映射配置\n */\nexport interface MCPToolMappingConfig {\n /** 渲染模板覆盖 */\n render?: {\n call?: string;\n result?: string;\n };\n /** 工具注解覆盖 */\n annotations?: {\n /** 是否需要用户批准 */\n requiresApproval?: boolean;\n /** 是否为只读工具 */\n readOnly?: boolean;\n /** 是否为破坏性操作 */\n destructive?: boolean;\n };\n /** 是否禁用该工具 */\n disabled?: boolean;\n}\n\n/**\n * MCP 主配置\n */\nexport interface MCPConfig {\n /** 是否启用 MCP (默认 true) */\n enabled?: boolean;\n /** MCP 服务器配置 */\n servers: Record<string, MCPServerConfig>;\n /** 旧格式兼容 */\n mcpServers?: Record<string, MCPServerConfig>;\n /** 工具级别配置映射 */\n toolMapping?: Record<string, MCPToolMappingConfig>;\n /** 全局超时 (毫秒) */\n timeout?: number;\n /** 是否启用工具缓存 */\n enableCache?: boolean;\n}\n\n/**\n * MCP 连接状态\n */\nexport const enum MCPConnectionState {\n /** 未连接 */\n Disconnected = 'disconnected',\n /** 连接中 */\n Connecting = 'connecting',\n /** 已连接 */\n Connected = 'connected',\n /** 连接错误 */\n Error = 'error',\n}\n\n/**\n * MCP 连接信息\n */\nexport interface MCPConnectionInfo {\n /** 服务器名称 */\n name: string;\n /** 连接状态 */\n state: MCPConnectionState;\n /** 连接时间 */\n connectedAt?: number;\n /** 最后错误 */\n lastError?: string;\n /** 工具数量 */\n toolCount: number;\n}\n\n/**\n * MCP 工具调用结果\n */\nexport interface MCPToolResult {\n /** 是否成功 */\n success: boolean;\n /** 结果内容 */\n content?: string;\n /** 结构化数据 (如果可用) */\n structuredContent?: any;\n /** 错误信息 */\n error?: string;\n /** MCP 服务器名称 */\n server: string;\n /** 调用耗时 (毫秒) */\n duration: number;\n /** 图像数据 (如果有) */\n images?: Array<{\n data: string;\n mimeType: string;\n }>;\n /** 资源数据 (如果有) */\n resources?: Array<{\n uri: string;\n mimeType: string;\n text?: string;\n }>;\n}\n\n/**\n * MCP 统计信息\n */\nexport interface MCPStatistics {\n /** 总调用次数 */\n totalCalls: number;\n /** 成功调用次数 */\n successfulCalls: number;\n /** 失败调用次数 */\n failedCalls: number;\n /** 平均耗时 (毫秒) */\n averageDuration: number;\n /** 按服务器统计 */\n byServer: Record<string, {\n totalCalls: number;\n successfulCalls: number;\n failedCalls: number;\n averageDuration: number;\n }>;\n}\n\n/**\n * MCP 客户端配置\n */\nexport interface MCPClientConfig {\n /** 配置文件路径 */\n configPath?: string;\n /** 是否自动重连 */\n autoReconnect?: boolean;\n /** 重连间隔 (毫秒) */\n reconnectInterval?: number;\n /** 最大重连次数 */\n maxReconnectAttempts?: number;\n /** 日志级别 */\n logLevel?: 'silent' | 'error' | 'warn' | 'info' | 'debug';\n}\n","import { spawn, type ChildProcess } from 'child_process';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport {\n CompatibilityCallToolResultSchema,\n ListToolsResultSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type {\n MCPServerConfig,\n MCPSstdioConfig,\n MCPHTTPConfig,\n MCPSSEConfig,\n MCPConnectionInfo,\n} from './types.js';\nimport { MCPConnectionState } from './types.js';\nimport { createLogger } from '../core/logging.js';\n\n/**\n * MCP 连接详情\n */\ninterface MCPConnection {\n name: string;\n config: MCPServerConfig;\n server?: Client | any;\n process?: ChildProcess;\n transport?: any;\n state: MCPConnectionState;\n connectedAt?: number;\n lastError?: string;\n reconnectAttempts: number;\n responseBuffer: string;\n nextRequestId: number;\n toolCount: number;\n allowReconnect: boolean;\n pendingRequests: Map<number, {\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n timeout: NodeJS.Timeout;\n }>;\n}\n\nexport class MCPConnectionManager {\n private connections = new Map<string, MCPConnection>();\n private reconnectTimers = new Map<string, NodeJS.Timeout>();\n private readonly logger = createLogger('mcp.connection');\n\n /**\n * 连接到 MCP 服务器\n */\n async connectServer(\n name: string,\n config: MCPServerConfig\n ): Promise<Client | any> {\n // 如果已存在连接,先尝试复用\n const existing = this.connections.get(name);\n if (existing?.server && existing.state === MCPConnectionState.Connected) {\n return existing.server;\n }\n\n // 创建新连接\n const connection: MCPConnection = {\n name,\n config,\n state: MCPConnectionState.Connecting,\n reconnectAttempts: 0,\n responseBuffer: '',\n nextRequestId: 1,\n toolCount: 0,\n allowReconnect: true,\n pendingRequests: new Map(),\n };\n this.connections.set(name, connection);\n\n try {\n if (config.transport === 'stdio') {\n return await this.connectStdio(name, config as MCPSstdioConfig, connection);\n } else if (config.transport === 'sse') {\n return await this.connectSSE(name, config as MCPSSEConfig, connection);\n } else {\n return await this.connectHTTP(name, config as MCPHTTPConfig, connection);\n }\n } catch (error) {\n connection.state = MCPConnectionState.Error;\n connection.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n }\n }\n\n /**\n * 连接到 stdio MCP 服务器\n */\n private async connectStdio(\n name: string,\n config: MCPSstdioConfig,\n connection: MCPConnection\n ): Promise<any> {\n const isWindows = process.platform === 'win32';\n const useShell = isWindows || config.command.includes(' ') || config.command.includes('npx');\n\n const childProc = spawn(config.command, config.args, {\n env: { ...process.env, ...config.env },\n cwd: config.cwd,\n stdio: ['pipe', 'pipe', 'inherit'],\n shell: useShell,\n windowsHide: true,\n });\n\n childProc.on('error', (error: Error) => {\n connection.state = MCPConnectionState.Error;\n connection.lastError = error.message;\n this.rejectAllPendingRequests(connection, error);\n this.log('error', `MCP server ${name} process error: ${error.message}`);\n });\n\n const stderr = (childProc as any).stderr;\n if (stderr) {\n stderr.on('data', (data: Buffer) => {\n this.log('debug', `[MCP] ${name} stderr: ${data.toString()}`);\n });\n }\n\n const stdout = childProc.stdout;\n if (stdout) {\n stdout.on('data', (data: Buffer) => {\n this.handleProcessOutput(connection, data.toString());\n });\n }\n\n childProc.on('exit', (code: number | null, signal: NodeJS.Signals | null) => {\n this.log('info', `MCP server ${name} exited: code=${code}, signal=${signal}`);\n connection.state = MCPConnectionState.Disconnected;\n this.rejectAllPendingRequests(connection, new Error(`MCP server ${name} exited`));\n if (connection.allowReconnect) {\n this.scheduleReconnect(name);\n }\n });\n\n const startupDelay = process.platform === 'win32' ? 2000 : 500;\n await new Promise(resolve => setTimeout(resolve, startupDelay));\n\n this.log('info', `[MCP] Using direct JSON-RPC communication for ${name}`);\n\n connection.process = childProc;\n connection.server = childProc as any;\n connection.state = MCPConnectionState.Connected;\n connection.connectedAt = Date.now();\n connection.lastError = undefined;\n connection.reconnectAttempts = 0;\n\n this.log('info', `Connected to MCP server ${name} (stdio)`);\n return childProc as any;\n }\n\n /**\n * 连接到 HTTP MCP 服务器\n */\n private async connectSSE(\n name: string,\n config: MCPSSEConfig,\n connection: MCPConnection\n ): Promise<Client> {\n const client = new Client({\n name: `agentdev-${name}`,\n version: '0.1.0',\n });\n const transport = config.headers\n ? new SSEClientTransport(new URL(config.url), {\n eventSourceInit: { headers: config.headers } as any,\n requestInit: { headers: config.headers },\n })\n : new SSEClientTransport(new URL(config.url));\n\n await client.connect(transport);\n\n client.onerror = (error) => {\n connection.state = MCPConnectionState.Error;\n connection.lastError = error.message;\n this.log('error', `MCP server ${name} client error: ${error.message}`);\n };\n transport.onerror = (error) => {\n connection.state = MCPConnectionState.Error;\n connection.lastError = error.message;\n this.log('error', `MCP server ${name} SSE transport error: ${error.message}`);\n };\n transport.onclose = () => {\n this.log(\n connection.allowReconnect ? 'warn' : 'info',\n `MCP server ${name} SSE transport closed`\n );\n connection.state = MCPConnectionState.Disconnected;\n this.rejectAllPendingRequests(connection, new Error(`MCP server ${name} disconnected`));\n if (connection.allowReconnect) {\n this.scheduleReconnect(name);\n }\n };\n\n connection.transport = transport;\n connection.server = client;\n connection.state = MCPConnectionState.Connected;\n connection.connectedAt = Date.now();\n connection.lastError = undefined;\n connection.reconnectAttempts = 0;\n\n this.log('info', `Connected to MCP server ${name} (sse)`);\n return client;\n }\n\n /**\n * 连接到 HTTP MCP 服务器\n */\n private async connectHTTP(\n name: string,\n config: MCPHTTPConfig,\n connection: MCPConnection\n ): Promise<Client> {\n const client = new Client({\n name: `agentdev-${name}`,\n version: '0.1.0',\n });\n const transport = new StreamableHTTPClientTransport(new URL(config.url), {\n ...(config.headers ? { requestInit: { headers: config.headers } } : {}),\n reconnectionOptions: {\n maxRetries: config.retryCount ?? 3,\n initialReconnectionDelay: 1000,\n maxReconnectionDelay: 30000,\n reconnectionDelayGrowFactor: 1.5,\n },\n });\n\n await client.connect(transport);\n\n client.onerror = (error) => {\n connection.state = MCPConnectionState.Error;\n connection.lastError = error.message;\n this.log('error', `MCP server ${name} client error: ${error.message}`);\n };\n transport.onerror = (error) => {\n connection.state = MCPConnectionState.Error;\n connection.lastError = error.message;\n this.log('error', `MCP server ${name} HTTP transport error: ${error.message}`);\n };\n transport.onclose = () => {\n this.log(\n connection.allowReconnect ? 'warn' : 'info',\n `MCP server ${name} HTTP transport closed`\n );\n connection.state = MCPConnectionState.Disconnected;\n this.rejectAllPendingRequests(connection, new Error(`MCP server ${name} disconnected`));\n if (connection.allowReconnect) {\n this.scheduleReconnect(name);\n }\n };\n\n connection.transport = transport;\n connection.server = client;\n connection.state = MCPConnectionState.Connected;\n connection.connectedAt = Date.now();\n connection.lastError = undefined;\n connection.reconnectAttempts = 0;\n\n this.log('info', `Connected to MCP server ${name} (http)`);\n return client;\n }\n\n /**\n * 断开服务器连接\n */\n async disconnectServer(name: string): Promise<void> {\n const connection = this.connections.get(name);\n if (!connection) return;\n connection.allowReconnect = false;\n\n const timer = this.reconnectTimers.get(name);\n if (timer) {\n clearTimeout(timer);\n this.reconnectTimers.delete(name);\n }\n\n if (connection.transport?.close) {\n try {\n await connection.transport.close();\n } catch (error) {\n this.log('warn', `Error closing MCP transport ${name}: ${error}`);\n }\n }\n\n if (connection.process) {\n connection.process.kill();\n }\n\n this.rejectAllPendingRequests(connection, new Error(`MCP server ${name} disconnected`));\n this.connections.delete(name);\n this.log('info', `Disconnected MCP server ${name}`);\n }\n\n /**\n * 断开所有连接\n */\n async disconnectAll(): Promise<void> {\n const names = Array.from(this.connections.keys());\n await Promise.all(names.map(name => this.disconnectServer(name)));\n }\n\n /**\n * 列出服务器的所有工具\n */\n async listTools(name: string): Promise<Array<{\n name: string;\n description?: string;\n inputSchema?: any;\n }>> {\n const connection = this.connections.get(name);\n if (!connection || connection.state !== MCPConnectionState.Connected) {\n this.log('warn', `[MCP] Cannot list tools: ${name} not connected`);\n return [];\n }\n\n try {\n const isDirectProcess = connection.process && connection.server &&\n !(connection.server as any).request;\n\n if (isDirectProcess) {\n this.log('info', `[MCP] Using direct process communication for ${name}`);\n const response = await this.sendDirectRequest(connection, 'tools/list', {}, 10000);\n const tools = response.result?.tools || [];\n connection.toolCount = tools.length;\n this.log('info', `[MCP] Received ${tools.length} tools`);\n return tools;\n }\n\n const response = await (connection.server as Client).request(\n {\n method: 'tools/list',\n params: {},\n },\n ListToolsResultSchema,\n { timeout: 5000 }\n );\n const tools = response.tools || [];\n connection.toolCount = tools.length;\n return tools;\n } catch (error) {\n this.log('error', `[MCP] Failed to list tools from ${name}: ${error}`);\n return [];\n }\n }\n\n async callTool(\n name: string,\n serverName: string,\n args: Record<string, unknown>\n ): Promise<{\n content: any[];\n isError?: boolean;\n }> {\n this.log('info', `[MCP] callTool: ${serverName}:${name}`);\n this.log('debug', `[MCP] args: ${JSON.stringify(args)}`);\n\n const connection = this.connections.get(serverName);\n if (!connection || connection.state !== MCPConnectionState.Connected) {\n throw new Error(`MCP server ${serverName} not connected`);\n }\n\n try {\n const isDirectProcess = connection.process && connection.server &&\n !(connection.server as any).request;\n\n if (isDirectProcess) {\n this.log('info', `[MCP] Using direct process communication for tool call`);\n const response = await this.sendDirectRequest(connection, 'tools/call', {\n name,\n arguments: args,\n }, 30000);\n const result = this.normalizeToolCallResponse(response);\n this.log('info', `[MCP] Tool ${name} returned: ${result.isError ? 'ERROR' : 'OK'}`);\n return result;\n }\n\n const response = await (connection.server as Client).request(\n {\n method: 'tools/call',\n params: {\n name,\n arguments: args,\n },\n },\n CompatibilityCallToolResultSchema,\n { timeout: 30000 }\n );\n return this.normalizeToolCallResponse(response);\n } catch (error) {\n this.log('error', `[MCP] Failed to call tool ${name}: ${error}`);\n return {\n content: [{\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n }],\n isError: true,\n };\n }\n }\n\n getConnectionInfo(name: string): MCPConnectionInfo | undefined {\n const connection = this.connections.get(name);\n if (!connection) return undefined;\n\n return {\n name: connection.name,\n state: connection.state,\n connectedAt: connection.connectedAt,\n lastError: connection.lastError,\n toolCount: connection.toolCount,\n };\n }\n\n /**\n * 获取所有连接信息\n */\n getAllConnections(): MCPConnectionInfo[] {\n return Array.from(this.connections.keys())\n .map(name => this.getConnectionInfo(name))\n .filter((info): info is MCPConnectionInfo => info !== undefined);\n }\n\n /**\n * 检查连接状态\n */\n isConnected(name: string): boolean {\n const connection = this.connections.get(name);\n return connection?.state === MCPConnectionState.Connected;\n }\n\n /**\n * 获取服务器实例\n */\n getServer(name: string): Client | any | undefined {\n return this.connections.get(name)?.server;\n }\n\n /**\n * 安排重连\n */\n private scheduleReconnect(name: string): void {\n const existingTimer = this.reconnectTimers.get(name);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n const timer = setTimeout(async () => {\n const connection = this.connections.get(name);\n if (!connection) return;\n\n if (connection.reconnectAttempts >= 3) {\n this.log('error', `Max reconnect attempts reached for MCP server ${name}`);\n return;\n }\n\n connection.reconnectAttempts++;\n this.log('info', `Reconnecting to MCP server ${name} (attempt ${connection.reconnectAttempts})`);\n\n try {\n await this.connectServer(name, connection.config);\n } catch (error) {\n this.log('error', `Failed to reconnect to MCP server ${name}: ${error}`);\n }\n }, 5000);\n\n this.reconnectTimers.set(name, timer);\n }\n\n /**\n * 日志输出\n */\n private log(level: 'error' | 'warn' | 'info' | 'debug', message: string): void {\n this.logger.child({\n tags: ['mcp-connection'],\n })[level](message);\n }\n\n private handleProcessOutput(connection: MCPConnection, chunk: string): void {\n connection.responseBuffer += chunk;\n const lines = connection.responseBuffer.split(/\\r?\\n/);\n connection.responseBuffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const response = JSON.parse(trimmed);\n this.handleDirectResponse(connection, response);\n } catch {\n connection.responseBuffer = `${trimmed}\\n${connection.responseBuffer}`;\n return;\n }\n }\n }\n\n private handleDirectResponse(connection: MCPConnection, response: any): void {\n if (typeof response?.id !== 'number') {\n this.log('debug', `[MCP] Ignoring non-response message from ${connection.name}: ${JSON.stringify(response)}`);\n return;\n }\n\n const pending = connection.pendingRequests.get(response.id);\n if (!pending) {\n this.log('debug', `[MCP] No pending request for response id ${response.id} from ${connection.name}`);\n return;\n }\n\n clearTimeout(pending.timeout);\n connection.pendingRequests.delete(response.id);\n pending.resolve(response);\n }\n\n private async sendDirectRequest(\n connection: MCPConnection,\n method: string,\n params: Record<string, unknown>,\n timeoutMs: number\n ): Promise<any> {\n if (!connection.process?.stdin) {\n throw new Error(`MCP server ${connection.name} has no stdin`);\n }\n\n const requestId = connection.nextRequestId++;\n const request = {\n jsonrpc: '2.0',\n id: requestId,\n method,\n params,\n };\n\n this.log('debug', `[MCP] Sending direct request: ${JSON.stringify(request)}`);\n\n return await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n connection.pendingRequests.delete(requestId);\n reject(new Error(`Timeout waiting for ${method} from ${connection.name}`));\n }, timeoutMs);\n\n connection.pendingRequests.set(requestId, { resolve, reject, timeout });\n\n try {\n connection.process!.stdin!.write(JSON.stringify(request) + '\\n');\n } catch (error) {\n clearTimeout(timeout);\n connection.pendingRequests.delete(requestId);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n private normalizeToolCallResponse(response: any): { content: any[]; isError?: boolean } {\n if (response.error) {\n return {\n content: [{\n type: 'text',\n text: `Error: ${response.error.message || 'Unknown error'}`,\n }],\n isError: true,\n };\n }\n\n if (response.result) {\n return response.result;\n }\n\n if (response.content || response.structuredContent || response.toolResult) {\n return response;\n }\n\n return { content: [] };\n }\n\n private rejectAllPendingRequests(connection: MCPConnection, error: Error): void {\n for (const [requestId, pending] of connection.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(error);\n connection.pendingRequests.delete(requestId);\n }\n }\n\n async dispose(): Promise<void> {\n await this.disconnectAll();\n\n for (const timer of this.reconnectTimers.values()) {\n clearTimeout(timer);\n }\n this.reconnectTimers.clear();\n }\n}\n","/**\n * MCP Tool Adapter - 适配器模式实现\n *\n * 将 MCP 工具适配为现有 Tool 接口,保持架构一致性\n */\n\nimport type { Tool } from '../core/types.js';\n\n/**\n * 注册工具的简化接口\n * 用于适配器包装\n */\ninterface RegisteredToolLike {\n name: string;\n description?: string;\n inputSchema?: any;\n outputSchema?: any;\n annotations?: any;\n handler?: (args: any, context?: any) => Promise<any> | any;\n enabled?: boolean;\n}\n\n/**\n * MCP 工具适配器配置\n */\nexport interface MCPToolAdapterConfig {\n /** MCP 服务器名称 */\n serverName: string;\n /** 是否为只读工具 */\n readOnly?: boolean;\n /** 渲染模板覆盖 */\n render?: { call?: string; result?: string };\n}\n\n/**\n * MCP 工具适配器\n *\n * 将 MCP RegisteredTool 适配为 Agent 的 Tool 接口\n * 负责格式转换和生命周期管理\n */\nexport class MCPToolAdapter implements Tool {\n readonly name: string;\n readonly description: string;\n readonly parameters?: Record<string, any>;\n readonly render?: { call?: string; result?: string };\n\n constructor(\n private registeredTool: RegisteredToolLike,\n private config: MCPToolAdapterConfig\n ) {\n this.name = registeredTool.name;\n this.description = registeredTool.description || `MCP tool: ${registeredTool.name}`;\n this.parameters = this.extractParameters(registeredTool);\n this.render = {\n call: config.render?.call || 'mcp-tool',\n result: config.render?.result || 'mcp-result',\n };\n }\n\n /**\n * 执行 MCP 工具\n */\n async execute(args: any, context?: any): Promise<any> {\n const startTime = Date.now();\n\n try {\n const handler = this.registeredTool.handler;\n const result = await handler?.(args, context);\n\n const duration = Date.now() - startTime;\n\n // 转换结果格式\n return this.formatResult(result, duration);\n } catch (error) {\n // 错误处理\n return this.formatError(error, Date.now() - startTime);\n }\n }\n\n /**\n * 格式化 MCP 工具结果\n */\n private formatResult(result: any, duration: number): any {\n // 处理错误结果\n if (result && result.isError) {\n return {\n success: false,\n error: (result.content || []).map((c: any) => c.text || '').join('\\n'),\n server: this.config.serverName,\n duration,\n };\n }\n\n // 提取文本内容\n const textContent = result.content\n .filter((c: any) => c.type === 'text')\n .map((c: any) => c.text || '')\n .join('\\n');\n\n // 返回格式化结果\n const formatted: any = {\n content: textContent,\n server: this.config.serverName,\n duration,\n };\n\n // 如果有结构化内容,附加到结果\n if ((result as any).structuredContent) {\n formatted.structuredContent = (result as any).structuredContent;\n }\n\n // 处理图像内容\n const images = result.content.filter((c: any) => c.type === 'image');\n if (images.length > 0) {\n formatted.images = images.map((c: any) => ({\n data: c.data,\n mimeType: c.mimeType,\n }));\n }\n\n // 处理资源内容\n const resources = result.content.filter((c: any) => c.type === 'resource');\n if (resources.length > 0) {\n formatted.resources = resources.map((c: any) => ({\n uri: c.uri,\n mimeType: c.mimeType,\n text: c.text,\n }));\n }\n\n return formatted;\n }\n\n /**\n * 格式化错误\n */\n private formatError(error: unknown, duration: number): any {\n const errorMessage = error instanceof Error\n ? error.message\n : String(error);\n\n return {\n success: false,\n error: `[MCP Error] ${errorMessage}`,\n server: this.config.serverName,\n duration,\n };\n }\n\n /**\n * 从 RegisteredToolLike 提取参数定义\n *\n * MCP 工具的 inputSchema 已经是 JSON Schema 格式\n * 直接返回,不需要转换\n */\n private extractParameters(tool: RegisteredToolLike): Record<string, any> | undefined {\n // 如果没有 inputSchema,返回 undefined\n if (!tool.inputSchema) return undefined;\n\n // MCP 服务器返回的 inputSchema 已经是 JSON Schema 格式\n // 例如:{ type: 'object', properties: { owner: { type: 'string', description: '...' } } }\n // 直接返回,框架会使用它来生成工具描述给 LLM\n try {\n // 验证它是有效的 JSON Schema 对象\n const schema = tool.inputSchema;\n if (typeof schema === 'object' && schema.type === 'object') {\n return schema as Record<string, any>;\n }\n\n // 如果格式不符合预期,返回 undefined 让框架使用默认处理\n console.warn(`[MCPToolAdapter] Unexpected inputSchema format for ${tool.name}:`, typeof schema);\n return undefined;\n } catch (error) {\n console.warn(`[MCPToolAdapter] Failed to extract parameters for ${tool.name}:`, error);\n return undefined;\n }\n }\n}\n\n/**\n * 批量创建 MCP 工具适配器\n */\nexport function createMCPToolAdapters(\n registeredTools: RegisteredToolLike[],\n serverName: string,\n config?: Omit<MCPToolAdapterConfig, 'serverName'>\n): Tool[] {\n return registeredTools.map(tool =>\n new MCPToolAdapter(tool, {\n serverName,\n ...config,\n })\n );\n}\n","import type { Tool } from '../core/types.js';\nimport { MCPConnectionManager } from './connection-manager.js';\nimport { MCPToolAdapter, type MCPToolAdapterConfig } from './mcp-adapter.js';\nimport type { MCPServerConfig } from './types.js';\n\nexport interface MCPDiscoveredTool {\n name: string;\n description?: string;\n inputSchema?: any;\n}\n\nexport interface MCPToolCreationOptions {\n name?: string;\n description?: string;\n render?: MCPToolAdapterConfig['render'];\n transformArgs?: (args: Record<string, unknown>, context?: any) => Record<string, unknown>;\n}\n\nexport interface MCPToolDiscoveryOptions {\n filter?: (tool: MCPDiscoveredTool) => boolean;\n mapName?: (tool: MCPDiscoveredTool) => string;\n render?: MCPToolAdapterConfig['render'];\n transformArgs?: MCPToolCreationOptions['transformArgs'];\n}\n\nexport interface MCPDiscoveredToolSet {\n client: MCPClient;\n tools: Tool[];\n}\n\nexport function createDefaultMCPToolName(serverId: string, toolName: string): string {\n return `mcp_${serverId}_${toolName}`.replace(/[^a-zA-Z0-9_]/g, '_');\n}\n\nexport class MCPClient {\n private readonly manager: MCPConnectionManager;\n private connected = false;\n\n constructor(\n readonly serverId: string,\n private readonly config: MCPServerConfig,\n manager?: MCPConnectionManager\n ) {\n this.manager = manager ?? new MCPConnectionManager();\n }\n\n async connect(): Promise<void> {\n if (this.connected && this.manager.isConnected(this.serverId)) {\n return;\n }\n await this.manager.connectServer(this.serverId, this.config);\n this.connected = true;\n }\n\n async listTools(): Promise<MCPDiscoveredTool[]> {\n await this.connect();\n return await this.manager.listTools(this.serverId);\n }\n\n async callTool(name: string, args: Record<string, unknown>): Promise<any> {\n await this.connect();\n return await this.manager.callTool(name, this.serverId, args);\n }\n\n getConnectionManager(): MCPConnectionManager {\n return this.manager;\n }\n\n async dispose(): Promise<void> {\n this.connected = false;\n await this.manager.disconnectServer(this.serverId);\n }\n}\n\nexport function createMCPTool(\n client: MCPClient,\n tool: MCPDiscoveredTool,\n options: MCPToolCreationOptions = {}\n): Tool {\n return new MCPToolAdapter(\n {\n name: options.name ?? createDefaultMCPToolName(client.serverId, tool.name),\n description: options.description ?? (tool.description || `MCP tool: ${tool.name}`),\n inputSchema: tool.inputSchema,\n enabled: true,\n handler: async (args: Record<string, unknown>, context?: any) => {\n const finalArgs = options.transformArgs ? options.transformArgs(args, context) : args;\n return await client.callTool(tool.name, finalArgs);\n },\n },\n {\n serverName: client.serverId,\n render: options.render,\n }\n );\n}\n\nexport async function createMCPToolsFromClient(\n client: MCPClient,\n options: MCPToolDiscoveryOptions = {}\n): Promise<Tool[]> {\n const tools = await client.listTools();\n\n return tools\n .filter(tool => options.filter ? options.filter(tool) : true)\n .map(tool => createMCPTool(client, tool, {\n name: options.mapName?.(tool),\n description: tool.description,\n render: options.render,\n transformArgs: options.transformArgs,\n }));\n}\n\nexport async function discoverMCPTools(\n serverId: string,\n config: MCPServerConfig,\n options: MCPToolDiscoveryOptions = {},\n manager?: MCPConnectionManager\n): Promise<MCPDiscoveredToolSet> {\n const client = new MCPClient(serverId, config, manager);\n const tools = await createMCPToolsFromClient(client, options);\n return { client, tools };\n}\n","import type { Tool } from '../core/types.js';\nimport { MCPConnectionManager } from './connection-manager.js';\nimport {\n MCPClient,\n createMCPTool,\n createDefaultMCPToolName,\n type MCPDiscoveredTool,\n type MCPToolCreationOptions,\n} from './client.js';\nimport type { MCPToolAdapterConfig } from './mcp-adapter.js';\nimport type { MCPConfig, MCPServerConfig } from './types.js';\n\nexport interface MCPToolPatch {\n enabled?: boolean;\n name?: string;\n description?: string;\n render?: MCPToolAdapterConfig['render'];\n transformArgs?: MCPToolCreationOptions['transformArgs'];\n}\n\nexport interface MCPToolManagementOptions {\n include?: string[];\n exclude?: string[];\n disable?: string[];\n rename?: Record<string, string>;\n describe?: Record<string, string>;\n render?: MCPToolAdapterConfig['render'];\n toolRender?: Record<string, MCPToolAdapterConfig['render']>;\n mapName?: (tool: MCPDiscoveredTool, client: MCPClient) => string;\n transformArgs?: MCPToolCreationOptions['transformArgs'];\n transform?: (tool: MCPDiscoveredTool, client: MCPClient) => MCPToolPatch | false | null | undefined;\n}\n\nexport interface MCPConfigMountOptions {\n manager?: MCPConnectionManager;\n clients?: Map<string, MCPClient>;\n getServerOptions?: (\n serverId: string,\n serverConfig: MCPServerConfig\n ) => MCPToolManagementOptions | undefined;\n onError?: (serverId: string, error: unknown) => void;\n}\n\nexport interface MCPMountedToolSet {\n client: MCPClient;\n tools: Tool[];\n}\n\nexport interface MCPMountedConfigResult {\n tools: Tool[];\n clients: Map<string, MCPClient>;\n}\n\nfunction applyStaticPatch(\n tool: MCPDiscoveredTool,\n client: MCPClient,\n options: MCPToolManagementOptions\n): MCPToolPatch {\n return {\n enabled: !options.disable?.includes(tool.name),\n name: options.rename?.[tool.name] ?? options.mapName?.(tool, client),\n description: options.describe?.[tool.name],\n render: options.toolRender?.[tool.name] ?? options.render,\n transformArgs: options.transformArgs,\n };\n}\n\nfunction shouldIncludeTool(tool: MCPDiscoveredTool, options: MCPToolManagementOptions): boolean {\n if (options.include && !options.include.includes(tool.name)) {\n return false;\n }\n if (options.exclude?.includes(tool.name)) {\n return false;\n }\n return true;\n}\n\nfunction mergeToolPatch(base: MCPToolPatch, override?: MCPToolPatch | false | null): MCPToolPatch | false {\n if (override === false) {\n return false;\n }\n if (!override) {\n return base;\n }\n return {\n ...base,\n ...override,\n render: override.render ?? base.render,\n transformArgs: override.transformArgs ?? base.transformArgs,\n };\n}\n\nexport async function createManagedMCPToolsFromClient(\n client: MCPClient,\n options: MCPToolManagementOptions = {}\n): Promise<Tool[]> {\n const tools = await client.listTools();\n\n return tools.flatMap(tool => {\n if (!shouldIncludeTool(tool, options)) {\n return [];\n }\n\n const staticPatch = applyStaticPatch(tool, client, options);\n const finalPatch = mergeToolPatch(staticPatch, options.transform?.(tool, client));\n if (finalPatch === false || finalPatch.enabled === false) {\n return [];\n }\n\n return createMCPTool(\n client,\n {\n ...tool,\n description: finalPatch.description ?? tool.description,\n },\n {\n name: finalPatch.name ?? createDefaultMCPToolName(client.serverId, tool.name),\n description: finalPatch.description,\n render: finalPatch.render,\n transformArgs: finalPatch.transformArgs,\n }\n );\n });\n}\n\nexport async function discoverManagedMCPTools(\n serverId: string,\n config: MCPServerConfig,\n options: MCPToolManagementOptions = {},\n manager?: MCPConnectionManager\n): Promise<MCPMountedToolSet> {\n const client = new MCPClient(serverId, config, manager);\n const tools = await createManagedMCPToolsFromClient(client, options);\n return { client, tools };\n}\n\nexport async function mountMCPToolsFromConfig(\n config: MCPConfig,\n options: MCPConfigMountOptions = {}\n): Promise<MCPMountedConfigResult> {\n const clients = options.clients ?? new Map<string, MCPClient>();\n const tools: Tool[] = [];\n\n for (const [serverId, serverConfig] of Object.entries(config.servers)) {\n try {\n const client = clients.get(serverId) ?? new MCPClient(serverId, serverConfig, options.manager);\n clients.set(serverId, client);\n\n const serverOptions = options.getServerOptions?.(serverId, serverConfig) ?? {};\n tools.push(...await createManagedMCPToolsFromClient(client, serverOptions));\n } catch (error) {\n options.onError?.(serverId, error);\n }\n }\n\n return { tools, clients };\n}\n","/**\n * MCP Feature - MCP 服务器连接和工具注册\n *\n * 将 MCP 集成从 Agent 核心中解耦,实现可外挂功能\n *\n * @example\n * ```typescript\n * // 自动扫描 .agentdev/mcps/*.json\n * agent.use(new MCPFeature());\n *\n * // 从配置文件加载(默认路径 .agentdev/mcps)\n * agent.use(new MCPFeature('github'));\n *\n * // 从指定路径加载配置\n * agent.use(new MCPFeature('./path/to/mcps/github'));\n *\n * // 直接传入配置对象\n * agent.use(new MCPFeature({ servers: { ... } }));\n * ```\n */\n\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport type {\n AgentFeature,\n FeatureInitContext,\n ContextInjector,\n ToolContextValue,\n PackageInfo,\n} from '../../core/feature.js';\nimport { getPackageInfoFromSource } from '../../core/feature.js';\nimport type { Tool } from '../../core/types.js';\nimport { loadAllMCPConfigs, loadMCPConfigFromInput } from '../../mcp/config.js';\nimport { MCPConnectionManager } from '../../mcp/connection-manager.js';\nimport { mountMCPToolsFromConfig } from '../../mcp/mount.js';\nimport type { MCPClient } from '../../mcp/client.js';\nimport type { MCPConfig } from '../../mcp/types.js';\n\n// ESM 中获取 __dirname\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * MCP Feature 配置类型\n */\nexport type MCPFeatureInput = MCPConfig | string;\n\nexport interface MCPFeatureOptions {\n excludeServers?: string[];\n}\n\n/**\n * MCP Feature 实现\n */\nexport class MCPFeature implements AgentFeature {\n readonly name = 'mcp';\n readonly dependencies: string[] = [];\n readonly source = __filename.replace(/\\\\/g, '/');\n readonly description = '连接 MCP 服务器并把发现到的远程能力挂载成标准工具。';\n\n private readonly manager = new MCPConnectionManager();\n private clients = new Map<string, MCPClient>();\n private config?: MCPConfig;\n private mcpContext?: Record<string, unknown>;\n\n /**\n * 缓存包信息\n */\n private _packageInfo: PackageInfo | null = null;\n\n /**\n * 获取包信息(统一打包方案)\n */\n getPackageInfo(): PackageInfo | null {\n if (!this._packageInfo) {\n this._packageInfo = getPackageInfoFromSource(this.source);\n }\n return this._packageInfo;\n }\n\n /**\n * 获取模板名称列表(统一打包方案)\n */\n getTemplateNames(): string[] {\n return ['mcp-tool'];\n }\n\n constructor(input?: MCPFeatureInput, options: MCPFeatureOptions = {}) {\n if (typeof input === 'string') {\n this.config = loadMCPConfigFromInput(input);\n } else if (input) {\n this.config = input;\n } else {\n this.config = loadAllMCPConfigs(undefined, {\n excludeServers: options.excludeServers,\n });\n }\n }\n\n /**\n * 获取同步工具(无)\n */\n getTools(): Tool[] {\n return [];\n }\n\n /**\n * 获取异步工具(需要连接 MCP 服务器)\n */\n async getAsyncTools(_ctx: FeatureInitContext): Promise<Tool[]> {\n if (!this.config) {\n return [];\n }\n\n const result = await mountMCPToolsFromConfig(this.config, {\n manager: this.manager,\n clients: this.clients,\n onError: (serverId, error) => {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.warn(`[MCPFeature] Failed to load tools from \"${serverId}\": ${errorMsg}`);\n },\n });\n\n return result.tools;\n }\n\n /**\n * 声明上下文注入器\n * 为所有 MCP 工具注入 _mcpContext\n */\n getContextInjectors(): Map<string | RegExp, ContextInjector> {\n return new Map<string | RegExp, ContextInjector>([\n [/^mcp_/, (): ToolContextValue => ({ _mcpContext: this.mcpContext })],\n ]);\n }\n\n /**\n * 清理钩子\n */\n async onDestroy(): Promise<void> {\n for (const client of this.clients.values()) {\n await client.dispose();\n }\n this.clients.clear();\n await this.manager.dispose();\n }\n\n /**\n * 设置 MCP 上下文(运行时注入)\n */\n setMCPContext(context: Record<string, unknown>): void {\n this.mcpContext = context;\n }\n\n /**\n * 获取连接管理器(供外部使用)\n */\n getConnectionManager(): MCPConnectionManager | undefined {\n return this.manager;\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';\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 // 简单解析 YAML(只需提取 name 和 description)\n const nameMatch = frontmatterStr.match(/^name:\\s*(.+)$/m);\n const descriptionMatch = frontmatterStr.match(/^description:\\s*(.+)$/m);\n\n if (!nameMatch || !descriptionMatch) {\n return null;\n }\n\n const name = nameMatch[1].trim();\n const description = descriptionMatch[1].trim();\n\n // 移除可能的引号\n const cleanValue = (value: string): string => {\n value = value.trim();\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n return value.slice(1, -1);\n }\n return value;\n };\n\n return {\n name: cleanValue(name),\n description: cleanValue(description),\n path,\n };\n}\n\n/**\n * 递归扫描目录并收集 SKILL.md 文件\n * 支持跟随符号链接目录\n */\nasync function collectSkillFiles(dir: string, skillsDir: 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 }\n // 如果是目录,递归扫描(包括符号链接目录)\n else if (entry.isDirectory() || entry.isSymbolicLink()) {\n // 对于符号链接,需要检查它是否指向一个目录\n let isLinkToDir = false;\n if (entry.isSymbolicLink()) {\n try {\n const stats = await readFileStats(fullPath);\n isLinkToDir = stats.isDirectory();\n } catch {\n // 符号链接目标不存在或无法访问,跳过\n continue;\n }\n }\n\n if (isLinkToDir || entry.isDirectory()) {\n const subFiles = await collectSkillFiles(fullPath, skillsDir);\n skillFiles.push(...subFiles);\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 } = options;\n\n // 解析 skills 目录路径\n const skillsDir = resolveSkillsDir(dir);\n\n // 检查目录是否存在\n if (!existsSync(skillsDir)) {\n return [];\n }\n\n const skills: SkillMetadata[] = [];\n\n try {\n // 手动递归扫描目录,支持符号链接\n const skillFiles = await collectSkillFiles(skillsDir, 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 * @returns 解析后的绝对路径\n */\nfunction resolveSkillsDir(dir?: string): string {\n const cwd = process.cwd();\n\n // 如果用户指定了目录\n if (dir) {\n // 绝对路径直接使用\n if (isAbsolute(dir)) {\n return dir;\n }\n // 相对路径以 cwd 为基准\n const resolved = resolve(cwd, dir);\n // 确保 Windows 路径使用正确的分隔符\n return resolved;\n }\n\n // 默认使用 cwd/.agentdev/skills\n return resolve(cwd, '.agentdev', 'skills');\n}\n","/**\n * Skill Feature - Skills 发现和 invoke_skill 工具\n *\n * 将 Skills 集成从 Agent 核心中解耦,实现可外挂功能\n *\n * @example\n * ```typescript\n * // 使用默认路径 .agentdev/skills\n * agent.use(new SkillFeature());\n *\n * // 使用自定义路径\n * agent.use(new SkillFeature('./custom/skills'));\n * agent.use(new SkillFeature({ dir: './custom/skills' }));\n * ```\n */\n\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport type {\n AgentFeature,\n FeatureInitContext,\n ContextInjector,\n ToolContextValue,\n PackageInfo,\n} from '../../core/feature.js';\nimport { getPackageInfoFromSource } from '../../core/feature.js';\nimport type { Tool } from '../../core/types.js';\nimport type { ToolCall } from '../../core/types.js';\nimport { invokeSkillTool } from './tools.js';\nimport { discover } from '../../skills/loader.js';\nimport type { SkillMetadata, SkillsOptions } from '../../skills/types.js';\nimport { join as pathJoin, resolve, isAbsolute } from 'path';\nimport { cwd } from 'process';\nimport { DataSourceRegistry, createListRenderer } from '../../template/data-source.js';\nimport type { PlaceholderContext } from '../../template/types.js';\nimport { PlaceholderResolver } from '../../template/resolver.js';\n\n// ESM 中获取 __filename\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Skill Feature 配置类型\n */\nexport interface SkillFeatureConfig extends SkillsOptions {\n /** Skills 目录路径 */\n dir?: string;\n}\n\n/**\n * Skill Feature 输入类型\n */\nexport type SkillFeatureInput = SkillFeatureConfig | string | undefined;\n\n/**\n * Skill Feature 实现\n */\nexport class SkillFeature implements AgentFeature {\n readonly name = 'skill';\n readonly dependencies: string[] = [];\n readonly source = __filename.replace(/\\\\/g, '/');\n readonly description = '发现本地 skills,并提供 invoke_skill 工具与技能数据源。';\n\n private skillsDir?: string;\n private skills: SkillMetadata[] = [];\n\n /**\n * 缓存包信息\n */\n private _packageInfo: PackageInfo | null = null;\n\n /**\n * 获取包信息(统一打包方案)\n */\n getPackageInfo(): PackageInfo | null {\n if (!this._packageInfo) {\n this._packageInfo = getPackageInfoFromSource(this.source);\n }\n return this._packageInfo;\n }\n\n /**\n * 获取模板名称列表(统一打包方案)\n */\n getTemplateNames(): string[] {\n return ['skill'];\n }\n\n constructor(input?: SkillFeatureInput) {\n if (typeof input === 'string') {\n // 字符串路径\n this.skillsDir = isAbsolute(input) ? input : resolve(cwd(), input);\n } else if (input && typeof input === 'object') {\n // 配置对象\n this.skillsDir = input.dir;\n } else {\n // 默认路径\n this.skillsDir = pathJoin(cwd(), '.agentdev', 'skills');\n }\n }\n\n /**\n * 获取同步工具(invoke_skill)\n */\n getTools(): Tool[] {\n return [invokeSkillTool];\n }\n\n /**\n * 声明上下文注入器\n * 为 invoke_skill 工具注入 _context.skills\n */\n getContextInjectors(): Map<string | RegExp, ContextInjector> {\n return new Map<string | RegExp, ContextInjector>([\n ['invoke_skill', (): ToolContextValue => ({ _context: { skills: this.skills } })],\n ]);\n }\n\n /**\n * 初始化钩子\n * 执行 Skills 发现并注册数据源\n */\n async onInitiate(ctx: FeatureInitContext): Promise<void> {\n if (this.skillsDir) {\n this.skills = await discover({ dir: this.skillsDir });\n }\n\n // 注册 skills 数据源到全局注册中心\n DataSourceRegistry.register({\n name: 'skills',\n getData: () => this.skills,\n renderItem: (skill: SkillMetadata, template: string, context: PlaceholderContext) => {\n // 将 skill 的属性合并到 context\n const skillContext: PlaceholderContext = {\n ...context,\n name: skill.name,\n description: skill.description,\n this: skill,\n };\n return PlaceholderResolver.resolve(template, skillContext);\n },\n });\n }\n\n /**\n * 获取已加载的 Skills\n */\n getSkills(): SkillMetadata[] {\n return this.skills;\n }\n\n /**\n * 设置 Skills 目录\n */\n setSkillsDir(dir: string): void {\n this.skillsDir = dir;\n }\n}\n","/**\n * Skill Feature 工具定义\n *\n * 提供 invoke_skill 工具,用于动态加载和展示技能的详细文档\n */\n\nimport { readFile } from 'fs/promises';\nimport { dirname, normalize } from 'path';\nimport type { Tool } from '../../core/types.js';\nimport type { SkillMetadata } from '../../skills/types.js';\nimport { createTool } from '../../core/tool.js';\n\n/**\n * invoke_skill 工具\n *\n * 调用并展开指定技能的详细文档\n */\nexport const invokeSkillTool: Tool = createTool({\n name: 'invoke_skill',\n description: '调用并展开指定技能的详细文档。技能提供专门的能力和领域知识。',\n parameters: {\n type: 'object',\n properties: {\n skill: {\n type: 'string',\n description: '技能名称(如 xlsx, pdf 等)'\n }\n },\n required: ['skill']\n },\n render: { call: 'skill', result: 'skill' },\n execute: async ({ skill }, context?: { _context?: { skills?: SkillMetadata[] } }) => {\n console.log(`[invoke_skill] ${skill}`);\n\n // 从 context 中获取 skills 列表\n const skills = context?._context?.skills || [];\n\n // 查找匹配的 skill\n const skillMetadata = skills.find(s => s.name === skill);\n\n if (!skillMetadata) {\n const availableSkills = skills.map(s => s.name).join(', ');\n return `错误:技能 \"${skill}\" 不存在。\n\n可用技能列表:${availableSkills || '(无可用技能)'}\n\n提示:请确保技能名称正确。`;\n }\n\n try {\n // 读取 SKILL.md 文件\n const content = await readFile(skillMetadata.path, 'utf-8');\n\n // 获取技能目录路径,并规范化路径格式\n const basePath = normalize(dirname(skillMetadata.path));\n\n // 返回格式化的技能文档\n // 使用行内代码块包裹路径,避免 markdown 转义\n return `**技能名称**:${skillMetadata.name}\n\n**技能描述**:${skillMetadata.description}\n\n**技能的基础目录路径**:\\`${basePath}\\`\n\n---\n\n${content}`;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return `错误:无法读取技能文件 \"${skill}\"\n\n详细信息:${errorMsg}\n\n文件路径:${skillMetadata.path}`;\n }\n },\n});\n","/**\n * AgentPool - 子代理管理核心\n * 管理父代理创建的所有子代理实例\n */\n\nimport type { Agent } from '../../core/agent.js';\nimport type { SubAgentStatus } from '../../core/lifecycle.js';\n\n/**\n * 子代理实例信息\n */\nexport interface SubAgentInstance {\n id: string;\n type: string;\n agent: Agent;\n status: SubAgentStatus;\n initialInstruction: string;\n createdAt: number;\n completedAt?: number;\n result?: string;\n error?: string;\n}\n\n/**\n * Agent 创建函数类型(异步)\n */\nexport type AgentFactory = (type: string) => Agent | Promise<Agent>;\n\n/**\n * AgentPool - 子代理管理核心\n * 管理父代理创建的所有子代理实例\n */\nexport class AgentPool {\n private _instances = new Map<string, SubAgentInstance>();\n private _counters = new Map<string, number>();\n private _parent: Agent;\n\n // 子代理消息回传机制\n /** 待回传消息队列:agentId -> messages[] */\n private _pendingMessages: Map<string, string[]> = new Map();\n /** 消息就绪解析器:key -> resolver function */\n private _messageResolvers: Map<string, (message: string | null) => void> = new Map();\n\n constructor(parent: Agent) {\n this._parent = parent;\n }\n\n /**\n * 创建子代理(不自动执行,等待 sendTo 激活)\n */\n async spawn(type: string, createAgentFn: AgentFactory): Promise<string> {\n // 生成 ID: type_序号\n const count = (this._counters.get(type) || 0) + 1;\n this._counters.set(type, count);\n const id = `${type}_${count}`;\n\n // 创建 Agent 实例(异步)\n const agent = await createAgentFn(type);\n\n // 注入 agentId 和 pool 引用到子代理\n // 用于子代理回传消息\n (agent as any)._agentId = id;\n (agent as any)._parentPool = this;\n\n // 如果父代理启用了 debug,子代理也启用并注册到同一个 DebugHub\n if ((this._parent as any).debugEnabled && (this._parent as any).debugHub) {\n const parentDebugHub = (this._parent as any).debugHub;\n // 子代理注册到 debug 服务器\n await agent.withViewer(`${type}_${count}`);\n // 使用父代理的同一个 debugHub 实例\n (agent as any).debugHub = parentDebugHub;\n }\n\n // 存储实例信息\n const instance: SubAgentInstance = {\n id,\n type,\n agent,\n status: 'idle',\n initialInstruction: '',\n createdAt: Date.now(),\n };\n this._instances.set(id, instance);\n\n // 触发 onSubAgentSpawn 钩子\n await this._parent.onSubAgentSpawn?.({\n agentId: id,\n type,\n agent,\n instruction: '',\n });\n\n // 子代理创建后处于空闲状态,等待 sendTo 激活\n return id;\n }\n\n /**\n * 获取实例信息\n */\n get(id: string): SubAgentInstance | undefined {\n return this._instances.get(id);\n }\n\n /**\n * 列出所有实例\n */\n list(filter?: SubAgentStatus): SubAgentInstance[] {\n const all = Array.from(this._instances.values());\n if (!filter) return all;\n return all.filter(i => i.status === filter);\n }\n\n /**\n * 向子代理发送消息(非阻塞)\n */\n async sendTo(id: string, message: string): Promise<void> {\n const timestamp = new Date().toISOString();\n console.log(`[DEBUG:sendTo] ${timestamp} agentId=${id}, msg=\"${message.slice(0, 50)}...\"`);\n\n const instance = this._instances.get(id);\n if (!instance) throw new Error(`子代理不存在: ${id}`);\n\n // 更新状态为 busy\n const oldStatus = instance.status;\n instance.status = 'busy';\n console.log(`[DEBUG:sendTo] 状态: ${oldStatus} -> busy`);\n\n // 异步执行,立即返回\n instance.agent.onCall(message)\n .then(result => {\n const thenTime = new Date().toISOString();\n console.log(`[DEBUG:sendTo.then] ${thenTime} agentId=${id}, 完成,result=\"${result.slice(0, 50)}...\"`);\n // 正常完成\n instance.status = 'idle';\n instance.result = result;\n // 报告消息(入队)\n this.report(id, result);\n })\n .catch(error => {\n const catchTime = new Date().toISOString();\n console.log(`[DEBUG:sendTo.catch] ${catchTime} agentId=${id}, error=${error.message}`);\n // 执行失败\n instance.status = 'failed';\n this._onError(id, error);\n });\n }\n\n /**\n * 关闭子代理\n */\n async close(id: string, reason: string = 'manual'): Promise<void> {\n const instance = this._instances.get(id);\n if (!instance) return;\n\n await instance.agent.dispose();\n instance.status = 'terminated';\n this._instances.delete(id);\n\n await this._parent.onSubAgentDestroy?.({\n agentId: id,\n type: instance.type,\n reason: reason as any,\n });\n }\n\n /**\n * 子代理回传消息到父代理\n * @param agentId 子代理 ID\n * @param message 消息内容\n */\n async report(agentId: string, message: string): Promise<void> {\n const timestamp = new Date().toISOString();\n const msgPreview = message.slice(0, 50);\n\n console.log(`[DEBUG:report] ${timestamp} agentId=${agentId}, msg=\"${msgPreview}...\"`);\n console.trace('[DEBUG:report] 调用栈:');\n\n // 添加到待回传队列\n if (!this._pendingMessages.has(agentId)) {\n this._pendingMessages.set(agentId, []);\n }\n this._pendingMessages.get(agentId)!.push(message);\n\n console.log(`[DEBUG:report] 入队后队列长度: ${this._pendingMessages.get(agentId)!.length}`);\n\n // 通知等待的解析器\n // 优先查找专门等待此 agent 的解析器\n const resolver = this._messageResolvers.get(agentId);\n if (resolver) {\n console.log(`[DEBUG:report] 触发专门 resolver: ${agentId}`);\n resolver(message);\n this._messageResolvers.delete(agentId);\n return;\n }\n\n // 如果没有专门解析器,查找通用等待解析器(以 wait_ 开头的)\n for (const [key, resolver] of this._messageResolvers) {\n if (key.startsWith('wait_')) {\n console.log(`[DEBUG:report] 触发通用 resolver: ${key}`);\n resolver(message);\n this._messageResolvers.delete(key);\n break;\n }\n }\n }\n\n /**\n * 等待任意子代理的消息\n * @returns { agentId, message }\n */\n async waitForMessage(): Promise<{ agentId: string; message: string }> {\n const timestamp = new Date().toISOString();\n console.log(`[DEBUG:waitForMessage] ${timestamp} 开始等待`);\n\n // 检查是否有待处理消息\n for (const [agentId, messages] of this._pendingMessages) {\n if (messages.length > 0) {\n const message = messages.shift()!;\n console.log(`[DEBUG:waitForMessage] ${timestamp} 从队列取出消息 agentId=${agentId}, 队列剩余: ${messages.length}`);\n if (messages.length === 0) {\n this._pendingMessages.delete(agentId);\n }\n return { agentId, message };\n }\n }\n\n console.log(`[DEBUG:waitForMessage] ${timestamp} 队列为空,注册 resolver`);\n\n // 等待新消息(无超时,一直等待直到有消息)\n return new Promise((resolve) => {\n // 临时存储解析器(任意子代理都可以触发)\n const tempKey = `wait_${Date.now()}`;\n console.log(`[DEBUG:waitForMessage] ${timestamp} 注册 resolver: ${tempKey}`);\n this._messageResolvers.set(tempKey, () => {\n const resolveTime = new Date().toISOString();\n console.log(`[DEBUG:waitForMessage.resolver] ${resolveTime} resolver 被触发`);\n // 查找发送消息的 agentId\n for (const [agentId, messages] of this._pendingMessages) {\n if (messages.length > 0) {\n const message = messages.shift()!;\n console.log(`[DEBUG:waitForMessage.resolver] ${resolveTime} 从队列取出消息 agentId=${agentId}, 队列剩余: ${messages.length}`);\n if (messages.length === 0) {\n this._pendingMessages.delete(agentId);\n }\n resolve({ agentId, message });\n return;\n }\n }\n console.log(`[DEBUG:waitForMessage.resolver] ${resolveTime} 队列为空!`);\n });\n });\n }\n\n /**\n * 检查是否有活跃的子代理或待处理的消息\n *\n * 注意:先检查消息队列,避免竞态条件\n */\n hasActiveAgents(): boolean {\n const timestamp = new Date().toISOString();\n // 优先检查消息队列\n for (const [agentId, messages] of this._pendingMessages.entries()) {\n if (messages.length > 0) {\n console.log(`[DEBUG:hasActiveAgents] ${timestamp} 发现消息队列: ${agentId}, ${messages.length} 条`);\n return true;\n }\n }\n // 再检查 busy 状态的子代理\n for (const instance of this._instances.values()) {\n if (instance.status === 'busy') {\n console.log(`[DEBUG:hasActiveAgents] ${timestamp} 发现 busy 子代理: ${instance.id}`);\n return true;\n }\n }\n console.log(`[DEBUG:hasActiveAgents] ${timestamp} 无活跃子代理`);\n return false;\n }\n\n /**\n * 检查是否有待处理的子代理消息\n */\n hasPendingMessages(): boolean {\n const timestamp = new Date().toISOString();\n for (const [agentId, messages] of this._pendingMessages.entries()) {\n if (messages.length > 0) {\n console.log(`[DEBUG:hasPendingMessages] ${timestamp} agentId=${agentId}, ${messages.length} 条消息`);\n return true;\n }\n }\n console.log(`[DEBUG:hasPendingMessages] ${timestamp} 无待处理消息`);\n return false;\n }\n\n /**\n * 处理子代理中断\n * @param agentId 子代理 ID\n * @param reason 中断原因\n * @param result 中断时的结果\n */\n async handleInterrupt(\n agentId: string,\n reason: 'max_steps_reached' | 'error' | 'cancelled',\n result: string\n ): Promise<void> {\n const timestamp = new Date().toISOString();\n console.log(`[DEBUG:handleInterrupt] ${timestamp} agentId=${agentId}, reason=${reason}, result=\"${result.slice(0, 50)}...\"`);\n\n const instance = this._instances.get(agentId);\n if (!instance) return;\n\n const oldStatus = instance.status;\n instance.status = 'idle';\n instance.result = result;\n console.log(`[DEBUG:handleInterrupt] ${timestamp} 状态: ${oldStatus} -> idle`);\n\n // 报告消息(入队)\n await this.report(agentId, result);\n\n // 触发钩子\n await this._parent.onSubAgentInterrupt?.({\n agentId,\n type: instance.type,\n reason,\n result,\n });\n }\n\n /**\n * 关闭所有子代理\n */\n async shutdown(): Promise<void> {\n const promises = Array.from(this._instances.keys())\n .map(id => this.close(id, 'parent_dispose'));\n await Promise.all(promises);\n }\n\n getRuntimeSnapshot(): {\n counters: Array<[string, number]>;\n instances: Array<{ id: string; type: string; status: SubAgentStatus }>;\n pendingMessages: Array<[string, string[]]>;\n } {\n return {\n counters: Array.from(this._counters.entries()),\n instances: Array.from(this._instances.values()).map(instance => ({\n id: instance.id,\n type: instance.type,\n status: instance.status,\n })),\n pendingMessages: Array.from(this._pendingMessages.entries()).map(([agentId, messages]) => [\n agentId,\n [...messages],\n ]),\n };\n }\n\n async restoreRuntimeSnapshot(snapshot: {\n counters?: Array<[string, number]>;\n }): Promise<void> {\n await this.shutdown();\n this._pendingMessages.clear();\n this._messageResolvers.clear();\n this._counters = new Map(snapshot.counters ?? []);\n }\n\n // 内部方法\n private async _onComplete(id: string, result: string): Promise<void> {\n const timestamp = new Date().toISOString();\n console.log(`[DEBUG:_onComplete] ${timestamp} agentId=${id}, result=\"${result.slice(0, 50)}...\"`);\n\n const instance = this._instances.get(id);\n if (!instance) return;\n\n const oldStatus = instance.status;\n\n // 先回传消息给主代理(确保消息先入队,避免竞态条件)\n await this.report(id, result);\n\n // 再更新状态(子代理持久存在,完成任务后回到 idle)\n instance.status = 'idle';\n instance.result = result;\n instance.completedAt = Date.now();\n\n console.log(`[DEBUG:_onComplete] ${timestamp} 状态: ${oldStatus} -> idle`);\n\n await this._parent.onSubAgentUpdate?.({\n agentId: id,\n type: instance.type,\n oldStatus,\n newStatus: 'idle',\n result,\n });\n }\n\n private async _onError(id: string, error: Error): Promise<void> {\n const instance = this._instances.get(id);\n if (!instance) return;\n\n const oldStatus = instance.status;\n\n // 先更新状态(错误情况不需要回传消息,因为父代理无法处理错误子代理的结果)\n instance.status = 'failed';\n instance.error = error.message;\n instance.completedAt = Date.now();\n\n await this._parent.onSubAgentUpdate?.({\n agentId: id,\n type: instance.type,\n oldStatus,\n newStatus: 'failed',\n error: error.message,\n });\n }\n}\n","/**\n * SubAgent Feature - 子代理功能模块\n *\n * 提供子代理创建、管理、消息回传等完整能力\n *\n * 重构说明:\n * - 使用装饰器实现反向钩子\n * - 移除旧的方法(handleNoToolCalls, handleWait, consumeMessages)\n * - 通过 @ToolFinished 和 @StepFinish 装饰器实现子代理等待机制\n */\n\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport type { Agent } from '../../core/agent.js';\nimport type { Context } from '../../core/context.js';\nimport type {\n AgentFeature,\n FeatureInitContext,\n FeatureContext,\n ContextInjector,\n FeatureStateSnapshot,\n PackageInfo,\n} from '../../core/feature.js';\nimport { getPackageInfoFromSource } from '../../core/feature.js';\nimport type { Tool } from '../../core/types.js';\nimport type { ToolCall } from '../../core/types.js';\nimport type { SubAgentStatus } from '../../core/lifecycle.js';\nimport {\n ToolFinished,\n StepFinish,\n} from '../../core/hooks-decorator.js';\nimport type { ToolFinishedHook, StepFinishHook } from '../../core/hooks-decorator.js';\nimport type { ToolFinishedDecisionContext, StepFinishDecisionContext } from '../../core/lifecycle.js';\nimport { Decision } from '../../core/lifecycle.js';\nimport { AgentPool } from './pool.js';\nimport { SubAgentToolFactory } from './tools.js';\n\n// ESM 中获取 __dirname\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// ========== SubAgent Feature ==========\n\n/**\n * 子代理 Feature\n *\n * 提供子代理创建、管理、消息回传等完整能力\n *\n * 重构说明:\n * - 使用装饰器实现反向钩子\n * - @ToolFinished: 处理 wait 工具完成后的等待逻辑\n * - @StepFinish: 处理无工具调用时的子代理等待逻辑\n */\nexport class SubAgentFeature implements AgentFeature {\n readonly name = 'subagent';\n readonly dependencies: string[] = [];\n readonly source = __filename.replace(/\\\\/g, '/');\n readonly description = '提供子代理创建、等待与消息回传能力,让主循环可以协同多个代理工作。';\n\n private agentPool?: AgentPool;\n private parentAgent?: Agent;\n\n // 工具工厂实例\n private toolFactory?: SubAgentToolFactory;\n\n /**\n * 缓存包信息\n */\n private _packageInfo: PackageInfo | null = null;\n\n /**\n * 获取包信息(统一打包方案)\n */\n getPackageInfo(): PackageInfo | null {\n if (!this._packageInfo) {\n this._packageInfo = getPackageInfoFromSource(this.source);\n }\n return this._packageInfo;\n }\n\n /**\n * 获取模板名称列表(统一打包方案)\n */\n getTemplateNames(): string[] {\n return [\n 'agent-spawn',\n 'agent-list',\n 'agent-send',\n 'agent-close',\n 'wait',\n ];\n }\n\n constructor() {\n // 无参数配置(可扩展)\n }\n\n /**\n * 获取 AgentPool(供外部访问)\n */\n get pool(): AgentPool | undefined {\n return this.agentPool;\n }\n\n // ========== AgentFeature 接口实现 ==========\n\n /**\n * 初始化钩子\n */\n async onInitiate(_ctx: FeatureInitContext): Promise<void> {\n // 工具工厂在 _setParentAgent 中初始化\n }\n\n /**\n * 设置父代理引用(由 Agent 在 use() 时调用)\n */\n _setParentAgent(agent: Agent): void {\n this.parentAgent = agent;\n this.agentPool = new AgentPool(agent);\n\n // 初始化工具工厂\n this.toolFactory = new SubAgentToolFactory({\n getPool: () => {\n if (!this.agentPool) throw new Error('AgentPool not initialized');\n return this.agentPool;\n },\n getParentAgent: () => this.parentAgent,\n });\n }\n\n /**\n * 获取同步工具\n */\n getTools(): Tool[] {\n return this.toolFactory?.getAllTools() || [];\n }\n\n getContextInjectors(): Map<string | RegExp, ContextInjector> {\n return new Map([\n ['spawn_agent', () => ({ parentAgent: this.parentAgent })],\n ['list_agents', () => ({ parentAgent: this.parentAgent })],\n ['send_to_agent', () => ({ parentAgent: this.parentAgent })],\n ['close_agent', () => ({ parentAgent: this.parentAgent })],\n ['wait', () => ({ parentAgent: this.parentAgent })],\n ]);\n }\n\n getHookDescription(lifecycle: string, methodName: string): string | undefined {\n if (lifecycle === 'ToolFinished' && methodName === 'handleWaitTool') {\n return '在 wait 工具结束后阻塞等待子代理消息,并把结果回填到主代理上下文。';\n }\n if (lifecycle === 'StepFinish' && methodName === 'handleNoToolCalls') {\n return '当本轮没有工具调用但仍有活跃子代理时,等待回信并强制继续下一轮 ReAct。';\n }\n return undefined;\n }\n\n // ========== 反向钩子(使用装饰器)==========\n\n /**\n * 处理 wait 工具\n *\n * 触发时机:wait 工具执行完成后\n * 处理逻辑:\n * 1. 检测刚才执行的工具是否是 wait\n * 2. 如果不是,直接返回(不处理)\n * 3. 如果是,检查是否有 busy 状态的子代理\n * 4. 如果有,调用 agentPool.waitForMessage() 阻塞等待(await 阻塞主循环)\n * 5. 消息插入到主代理 context\n *\n * 注意:这是纯通知钩子(void),流程控制通过 await 阻塞实现\n */\n @ToolFinished\n async handleWaitTool(ctx: ToolFinishedDecisionContext): Promise<void> {\n // 1. 只处理 wait 工具\n if (ctx.toolName !== 'wait') {\n return;\n }\n\n // 2. 检查是否有 busy 子代理\n if (!this.agentPool?.hasActiveAgents()) {\n return;\n }\n\n // 3. 阻塞等待(await 本身就会让主循环等待)\n const result = await this.agentPool.waitForMessage();\n\n // 4. 消息插入到 context\n ctx.context.add({\n role: 'assistant',\n content: `[子代理 ${result.agentId} 执行完成]:\\n\\n${result.message}`,\n });\n }\n\n /**\n * 处理无工具调用时的子代理等待\n *\n * 触发时机:Step 结束时\n * 处理逻辑:\n * 1. 检查是否有 busy 状态的子代理\n * 2. 如果没有,返回 Continue(正常结束)\n * 3. 如果有,调用 agentPool.waitForMessage() 阻塞等待\n * 4. 消息插入到主代理 context\n * 5. 返回 Approve(重启 ReAct 循环)\n */\n @StepFinish\n async handleNoToolCalls(ctx: StepFinishDecisionContext): Promise<import('../../core/hooks-decorator.js').DecisionResult> {\n // 只在无工具调用时处理\n if (ctx.llmResponse.toolCalls && ctx.llmResponse.toolCalls.length > 0) {\n return Decision.Continue;\n }\n\n // 1. 检查是否有活跃子代理\n if (!this.agentPool?.hasActiveAgents()) {\n return Decision.Continue;\n }\n\n // 2. 阻塞等待\n const result = await this.agentPool.waitForMessage();\n\n // 3. 消息插入到 context\n ctx.context.add({\n role: 'assistant',\n content: `[子代理 ${result.agentId} 执行完成]:\\n\\n${result.message}`,\n });\n\n // 4. 重启 ReAct 循环\n return Decision.Approve;\n }\n\n async onDestroy(): Promise<void> {\n return this.agentPool?.shutdown() ?? Promise.resolve();\n }\n\n captureState(): FeatureStateSnapshot {\n const runtime = this.agentPool?.getRuntimeSnapshot();\n return {\n counters: runtime?.counters ?? [],\n hadInstances: (runtime?.instances.length ?? 0) > 0,\n hadActiveAgents: runtime?.instances.some(instance => instance.status === 'busy') ?? false,\n hadPendingMessages: runtime?.pendingMessages.some(([, messages]) => messages.length > 0) ?? false,\n };\n }\n\n async restoreState(snapshot: FeatureStateSnapshot): Promise<void> {\n if (!this.agentPool) {\n return;\n }\n\n const state = snapshot as {\n counters?: Array<[string, number]>;\n hadInstances?: boolean;\n hadActiveAgents?: boolean;\n hadPendingMessages?: boolean;\n };\n\n await this.agentPool.restoreRuntimeSnapshot({\n counters: state.counters,\n });\n\n if (state.hadInstances || state.hadActiveAgents || state.hadPendingMessages) {\n console.warn(\n '[SubAgentFeature] Restored session/rollback snapshot dropped live subagent runtime. ' +\n 'Subagents are not resumable and have been reset to an empty pool.'\n );\n }\n }\n}\n\n// 重新导出 AgentPool\nexport { AgentPool };\n","/**\n * SubAgent Feature 工具定义\n *\n * 提供 5 个子代理管理工具:spawn_agent, list_agents, send_to_agent, close_agent, wait\n */\n\nimport type { Tool } from '../../core/types.js';\nimport type { Agent } from '../../core/agent.js';\nimport type { AgentPool } from './pool.js';\nimport { createTool } from '../../core/tool.js';\n\n/**\n * SubAgent 工具工厂类\n * 用于创建子代理工具,需要传入 Feature 实例来访问 AgentPool\n */\nexport class SubAgentToolFactory {\n private getPoolFn: () => AgentPool;\n private getParentAgentFn: () => Agent | undefined;\n\n constructor(options: {\n getPool: () => AgentPool;\n getParentAgent: () => Agent | undefined;\n }) {\n this.getPoolFn = options.getPool;\n this.getParentAgentFn = options.getParentAgent;\n }\n\n /**\n * 创建 spawn_agent 工具\n */\n createSpawnAgentTool(): Tool {\n const self = this;\n return createTool({\n name: 'spawn_agent',\n description: '创建一个子代理实例。子代理创建后处于idle状态,等待通过 send_to_agent 发送指令来激活。返回实例 ID(格式:类型名_序号)。\\n\\n子代理完成工作后,其结果会自动添加到你的上下文中,你将收到 \"[子代理 ID_执行完成]:\" 格式的消息。',\n parameters: {\n type: 'object',\n properties: {\n type: {\n type: 'string',\n description: '子代理类型名'\n }\n },\n required: ['type']\n },\n render: { call: 'agent-spawn', result: 'agent-spawn' },\n execute: async ({ type }, context?: { parentAgent?: Agent }) => {\n const parentAgent = context?.parentAgent ?? self.getParentAgentFn();\n const pool = self.getPoolFn();\n\n if (!parentAgent) {\n return { error: '无法获取父代理引用' };\n }\n\n const agentId = await pool.spawn(type, async (t) => await parentAgent.createAgentByType(t));\n\n return {\n agentId,\n type,\n status: 'idle',\n allAgents: pool.list().map(i => ({\n agentId: i.id,\n type: i.type,\n status: i.status,\n })),\n };\n },\n });\n }\n\n /**\n * 创建 list_agents 工具\n */\n createListAgentsTool(): Tool {\n const self = this;\n return createTool({\n name: 'list_agents',\n description: '列出所有子代理及其状态(ID、类型、状态等)。\\n\\n注意:子代理的执行结果会自动添加到你的上下文中,你不需要调用此工具来获取结果。此工具主要用于确认子代理正确启动,不要在运行期间不断监控运行情况',\n parameters: {\n type: 'object',\n properties: {\n filter: {\n type: 'string',\n enum: ['all', 'running', 'completed', 'failed', 'terminated'],\n description: '筛选条件,默认显示所有子代理',\n default: 'all'\n }\n }\n },\n render: { call: 'agent-list', result: 'json' },\n execute: async ({ filter = 'all' }) => {\n const pool = self.getPoolFn();\n const instances = pool.list(filter === 'all' ? undefined : filter as any);\n\n return {\n agents: instances.map(i => ({\n agentId: i.id,\n type: i.type,\n status: i.status,\n createdAt: i.createdAt,\n result: i.result,\n error: i.error,\n })),\n total: instances.length,\n running: instances.filter(i => i.status === 'busy' || i.status === 'idle').length,\n tips: '当确认子代理工作正常时,你无需重复调用此工具以获取最新状态,可停止输出,等待子代理完成任务后自动添加到上下文中。',\n };\n },\n });\n }\n\n /**\n * 创建 send_to_agent 工具\n */\n createSendToAgentTool(): Tool {\n const self = this;\n return createTool({\n name: 'send_to_agent',\n description: '向指定的子代理发送指令。只能向处于idle状态的子代理发送消息,如果子代理正在执行(busy状态),发送会失败。子代理运行期间可以执行其他工作,若无需求,应停止输出或使用wait工具,待子代理完成任务时会主动唤起',\n parameters: {\n type: 'object',\n properties: {\n agentId: {\n type: 'string',\n description: '子代理实例 ID,如 \"BasicAgent_1\" 或 \"ExplorerAgent_2\"'\n },\n message: {\n type: 'string',\n description: '要发送给子代理的消息或指令'\n }\n },\n required: ['agentId', 'message']\n },\n render: { call: 'agent-send', result: 'agent-send' },\n execute: async ({ agentId, message }) => {\n const pool = self.getPoolFn();\n\n // 检查子代理是否存在以及状态\n const instance = pool.get(agentId);\n if (!instance) {\n return {\n error: `子代理不存在: ${agentId}`,\n allAgents: pool.list().map(i => ({\n agentId: i.id,\n type: i.type,\n status: i.status,\n })),\n };\n }\n\n // 检查子代理是否正在执行\n if (instance.status === 'busy') {\n return {\n error: `子代理 ${agentId} 正在执行任务(busy状态),无法接收新消息。请等待其完成后再发送`,\n agentId,\n currentStatus: instance.status,\n allAgents: pool.list().map(i => ({\n agentId: i.id,\n type: i.type,\n status: i.status,\n })),\n };\n }\n\n await pool.sendTo(agentId, message);\n\n return {\n agentId,\n status: 'message_sent',\n previousStatus: instance.status,\n message: '消息已成功发送到子代理,可以继续执行你尚未完成的其他任务,若无必要,请停止输出,等待子代理完成任务',\n allAgents: pool.list().map(i => ({\n agentId: i.id,\n type: i.type,\n status: i.status,\n })),\n };\n },\n });\n }\n\n /**\n * 创建 close_agent 工具\n */\n createCloseAgentTool(): Tool {\n const self = this;\n return createTool({\n name: 'close_agent',\n description: '关闭指定的子代理并释放其资源。子代理将被终止并从池中移除。',\n parameters: {\n type: 'object',\n properties: {\n agentId: {\n type: 'string',\n description: '要关闭的子代理实例 ID'\n },\n reason: {\n type: 'string',\n description: '关闭原因(可选)',\n default: 'manual'\n }\n },\n required: ['agentId']\n },\n render: { call: 'agent-close', result: 'json' },\n execute: async ({ agentId, reason = 'manual' }) => {\n const pool = self.getPoolFn();\n await pool.close(agentId, reason);\n\n return {\n agentId,\n status: 'closed',\n message: `子代理 ${agentId} 已关闭`\n };\n },\n });\n }\n\n /**\n * 创建 wait 工具\n */\n createWaitTool(): Tool {\n const self = this;\n return createTool({\n name: 'wait',\n description: '调用本工具后,系统将被阻塞,等待子代理返回运行结果后继续运行。可以与 spawn_agent、send_to_agent 等工具在同一轮一起调用,表示执行完这些操作后等待子代理完成。',\n parameters: {\n type: 'object',\n properties: {},\n },\n render: { call: 'wait', result: 'wait' },\n execute: async (_args) => {\n const pool = self.getPoolFn();\n\n // 安全检查:是否有活跃的子代理\n if (!pool.hasActiveAgents()) {\n return {\n error: '当前没有正在执行的子代理(busy状态),调用 wait 无意义。请先使用 spawn_agent 创建子代理或使用 send_to_agent 向子代理发送任务。',\n allAgents: pool.list().map(i => ({\n agentId: i.id,\n type: i.type,\n status: i.status,\n })),\n };\n }\n\n // 只是一个标志,实际等待逻辑由反向钩子处理\n return {\n action: 'waiting_for_subagents',\n message: '系统将在子代理完成任务后继续...',\n allAgents: pool.list().map(i => ({\n agentId: i.id,\n type: i.type,\n status: i.status,\n })),\n };\n },\n });\n }\n\n /**\n * 获取所有工具\n */\n getAllTools(): Tool[] {\n return [\n this.createSpawnAgentTool(),\n this.createListAgentsTool(),\n this.createSendToAgentTool(),\n this.createCloseAgentTool(),\n this.createWaitTool(),\n ];\n }\n}\n","/**\n * Todo Feature - 任务列表管理功能模块\n *\n * 提供任务创建、查询、更新等能力,用于跟踪复杂任务的进度\n * 内置智能提醒功能,自动跟踪工具使用并在合适时机注入提醒\n *\n * 重构说明:\n * - 使用反向钩子装饰器实现提醒逻辑\n * - 不再需要在 Agent 中重写 onStepStart/onStepFinished\n */\n\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { readFile } from 'fs/promises';\nimport type {\n AgentFeature,\n FeatureInitContext,\n FeatureContext,\n FeatureStateSnapshot,\n PackageInfo,\n} from '../../core/feature.js';\nimport type { Context } from '../../core/context.js';\nimport { getPackageInfoFromSource } from '../../core/feature.js';\nimport { StepStart, StepFinish } from '../../core/hooks-decorator.js';\nimport type { StepStartContext, StepFinishDecisionContext } from '../../core/lifecycle.js';\nimport { Decision } from '../../core/lifecycle.js';\nimport type { DecisionResult } from '../../core/lifecycle.js';\nimport type { Tool } from '../../core/types.js';\nimport { TodoToolFactory } from './tools.js';\nimport type { TodoTask, TodoTaskUpdate, TodoTaskSummary, TaskStatus, TodoFeatureConfig } from './types.js';\n\n// ESM 中获取 __dirname\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * TodoFeature 实现\n *\n * 提供任务管理和智能提醒功能\n * 使用反向钩子自动处理提醒逻辑,无需在 Agent 中重写钩子方法\n */\nexport class TodoFeature implements AgentFeature {\n readonly name = 'todo';\n readonly source = __filename.replace(/\\\\/g, '/');\n readonly description = '维护任务清单,并在合适的循环时机自动提醒模型更新 todo 状态。';\n\n private tasks = new Map<string, TodoTask>();\n private counter = 0;\n private config: Required<Omit<TodoFeatureConfig, 'reminderTemplate' | 'reminderThresholdWithTasks' | 'reminderThresholdWithoutTasks'>> & {\n reminderTemplate?: string;\n reminderThresholdWithTasks?: number;\n reminderThresholdWithoutTasks?: number;\n };\n\n // Reminder 相关状态\n private reminderContent = '';\n\n // 连续未使用 todo 工具的轮次计数器\n private consecutiveNoTodoTurns = 0;\n // 上一轮是否已注入 reminder(防止重复注入)\n private reminderInjected = false;\n\n // 工具工厂实例\n private toolFactory?: TodoToolFactory;\n\n private _packageInfo: PackageInfo | null = null;\n\n constructor(config: TodoFeatureConfig = {}) {\n this.config = {\n reminderThresholdWithTasks: config.reminderThresholdWithTasks ?? 3,\n reminderThresholdWithoutTasks: config.reminderThresholdWithoutTasks ?? 6,\n reminderTemplate: config.reminderTemplate,\n };\n this.reminderContent = this.getDefaultReminder();\n\n // 初始化工具工厂\n this.toolFactory = new TodoToolFactory({\n getTask: (taskId) => this.getTask(taskId),\n createTask: (subject, description, activeForm, options) => this.createTask(subject, description, activeForm, options),\n listTasks: (filter) => this.listTasks(filter),\n updateTask: (taskId, updates) => this.updateTask(taskId, updates),\n clearTasks: () => this.clearTasks(),\n getTasksCount: () => this.tasks.size,\n });\n }\n\n // ========== AgentFeature 接口实现 ==========\n\n /**\n * 获取包信息(统一打包方案)\n */\n getPackageInfo(): PackageInfo | null {\n if (!this._packageInfo) {\n this._packageInfo = getPackageInfoFromSource(this.source);\n }\n return this._packageInfo;\n }\n\n /**\n * 获取模板名称列表(统一打包方案)\n */\n getTemplateNames(): string[] {\n return [\n 'task-create',\n 'task-list',\n 'task-get',\n 'task-update',\n 'task-clear',\n ];\n }\n\n getTools(): Tool[] {\n return this.toolFactory?.getAllTools() || [];\n }\n\n async onInitiate(_ctx: FeatureInitContext): Promise<void> {\n console.log(`[TodoFeature] Initialized with reminderThresholdWithTasks=${this.config.reminderThresholdWithTasks}, reminderThresholdWithoutTasks=${this.config.reminderThresholdWithoutTasks}`);\n\n // 如果配置了模板文件,异步加载\n const templatePath = this.config.reminderTemplate;\n if (templatePath) {\n try {\n this.reminderContent = await readFile(templatePath, 'utf-8');\n console.log('[TodoFeature] Loaded reminder template from: ' + templatePath);\n } catch (e) {\n console.log('[TodoFeature] Failed to load template, using default reminder');\n // 保持默认 reminder\n }\n }\n }\n\n async onDestroy(_ctx: FeatureContext): Promise<void> {\n this.clearTasks();\n }\n\n captureState(): FeatureStateSnapshot {\n return {\n tasks: Array.from(this.tasks.values()),\n counter: this.counter,\n reminderContent: this.reminderContent,\n consecutiveNoTodoTurns: this.consecutiveNoTodoTurns,\n reminderInjected: this.reminderInjected,\n };\n }\n\n restoreState(snapshot: FeatureStateSnapshot): void {\n const state = snapshot as {\n tasks?: TodoTask[];\n counter?: number;\n reminderContent?: string;\n consecutiveNoTodoTurns?: number;\n reminderInjected?: boolean;\n };\n\n this.tasks = new Map((state.tasks ?? []).map(task => [task.id, task]));\n this.counter = typeof state.counter === 'number' ? state.counter : 0;\n this.reminderContent = typeof state.reminderContent === 'string'\n ? state.reminderContent\n : this.getDefaultReminder();\n this.consecutiveNoTodoTurns = typeof state.consecutiveNoTodoTurns === 'number'\n ? state.consecutiveNoTodoTurns\n : 0;\n this.reminderInjected = Boolean(state.reminderInjected);\n }\n\n getHookDescription(lifecycle: string, methodName: string): string | undefined {\n if (lifecycle === 'StepStart' && methodName === 'checkAndInjectReminder') {\n return '在每轮开始时检查提醒阈值;连续多轮未使用 todo 工具时注入系统提醒。';\n }\n if (lifecycle === 'StepFinish' && methodName === 'recordToolUsage') {\n return '在每轮结束后统计是否使用了 todo 工具,用于更新下轮提醒计数。';\n }\n return undefined;\n }\n\n // ========== 反向钩子(装饰器)==========\n\n /**\n * Step 开始时检查是否需要注入 reminder\n *\n * 触发时机:每轮 ReAct 迭代开始时\n * 处理逻辑:\n * 1. 检查连续未使用 todo 工具的轮次\n * 2. 达到阈值时注入 reminder 系统消息\n * 3. 防止重复注入\n */\n @StepStart\n async checkAndInjectReminder(ctx: StepStartContext): Promise<void> {\n const threshold = this.getCurrentThreshold();\n console.log(`[TodoFeature] callIndex=${ctx.callIndex}, counter=${this.consecutiveNoTodoTurns}, threshold=${threshold}, injected=${this.reminderInjected}`);\n\n // 检查是否需要注入 reminder\n if (this.consecutiveNoTodoTurns >= threshold && !this.reminderInjected) {\n console.log('[TodoFeature] Threshold reached, injecting reminder');\n ctx.context.add({ role: 'system', content: this.reminderContent });\n this.reminderInjected = true;\n }\n }\n\n /**\n * Step 结束时记录是否使用了 todo 工具\n *\n * 触发时机:每轮 ReAct 迭代结束时\n * 处理逻辑:\n * 1. 检查本轮是否使用了 todo 工具\n * 2. 使用了则重置计数器,未使用则计数器+1\n * 3. 返回 Continue 使用默认行为\n */\n @StepFinish\n async recordToolUsage(ctx: StepFinishDecisionContext): Promise<DecisionResult> {\n const toolCalls = ctx.llmResponse.toolCalls ?? [];\n const usedTodoTool = toolCalls.some((call: { name: string }) => this.isTodoTool(call.name));\n\n if (usedTodoTool) {\n // 使用了 todo 工具,重置计数器\n this.consecutiveNoTodoTurns = 0;\n this.reminderInjected = false;\n console.log(`[TodoFeature] Todo tool used, reset counter`);\n } else {\n // 未使用 todo 工具,计数器加 1\n this.consecutiveNoTodoTurns++;\n const threshold = this.getCurrentThreshold();\n console.log(`[TodoFeature] No todo tool, counter=${this.consecutiveNoTodoTurns}/${threshold}`);\n }\n\n // 返回 Continue 使用默认行为\n return Decision.Continue;\n }\n\n // ========== 公开 API ==========\n\n /**\n * 设置 reminder 内容\n */\n setReminderContent(content: string): void {\n this.reminderContent = content;\n }\n\n /**\n * 获取当前的提醒阈值(根据任务状态动态调整)\n */\n private getCurrentThreshold(): number {\n // 检查是否有待执行的任务(pending 或 in_progress)\n const hasActiveTasks = Array.from(this.tasks.values()).some(\n t => t.status === 'pending' || t.status === 'in_progress'\n );\n return hasActiveTasks\n ? this.config.reminderThresholdWithTasks!\n : this.config.reminderThresholdWithoutTasks!;\n }\n\n /**\n * 创建任务\n */\n createTask(\n subject: string,\n description: string,\n activeForm: string,\n options?: { owner?: string; metadata?: Record<string, unknown> }\n ): TodoTask {\n this.counter++;\n const task: TodoTask = {\n id: String(this.counter),\n subject,\n description,\n activeForm,\n status: 'pending',\n blocks: [],\n blockedBy: [],\n owner: options?.owner,\n metadata: options?.metadata,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n this.tasks.set(task.id, task);\n console.log(`[TodoFeature] Created task ${task.id}: ${subject} (total tasks: ${this.tasks.size})`);\n return task;\n }\n\n /**\n * 获取任务详情\n */\n getTask(taskId: string): TodoTask | undefined {\n return this.tasks.get(taskId);\n }\n\n /**\n * 列出所有任务摘要\n */\n listTasks(filter?: { status?: TaskStatus }): TodoTaskSummary[] {\n let tasks = Array.from(this.tasks.values());\n if (filter?.status) {\n tasks = tasks.filter(t => t.status === filter.status);\n }\n return tasks.map(task => ({\n id: task.id,\n subject: task.subject,\n status: task.status,\n owner: task.owner,\n blockedBy: task.blockedBy,\n }));\n }\n\n /**\n * 更新任务\n */\n updateTask(taskId: string, updates: TodoTaskUpdate): TodoTask | undefined {\n const task = this.tasks.get(taskId);\n if (!task) return undefined;\n\n if (updates.addBlocks) {\n task.blocks = [...new Set([...task.blocks, ...updates.addBlocks])];\n }\n if (updates.addBlockedBy) {\n task.blockedBy = [...new Set([...task.blockedBy, ...updates.addBlockedBy])];\n }\n Object.assign(task, updates);\n task.updatedAt = Date.now();\n\n if (task.status === 'deleted') {\n this.tasks.delete(taskId);\n }\n return task;\n }\n\n /**\n * 清空所有任务\n */\n clearTasks(): void {\n this.tasks.clear();\n this.counter = 0;\n }\n\n // ========== 私有方法 ==========\n\n /** 判断是否是 todo 工具 */\n private isTodoTool(name: string): boolean {\n return name === 'task_create' || name === 'task_list' ||\n name === 'task_get' || name === 'task_update' || name === 'task_clear';\n }\n\n /** 获取默认 reminder 内容 */\n private getDefaultReminder(): string {\n return '最近没有使用任务工具。如果你正在处理需要跟踪进度的任务,考虑使用 `task_create` 添加新任务,使用 `task_update`更新任务状态(开始时设置为 in_progress,完成时设置为 completed)。如果任务列表已过时,也可以考虑清理。仅在与当前工作相关时使用这些工具。这只是温和的提醒——如果不适用请忽略。务必注意:绝不要向用户提及此提醒。';\n }\n}\n\n// 重新导出类型\nexport type { TodoTask, TodoTaskUpdate, TodoTaskSummary, TaskStatus, TodoFeatureConfig };\n","/**\n * Todo Feature 工具定义\n *\n * 提供 5 个任务管理工具:task_create, task_list, task_get, task_update, task_clear\n */\n\nimport type { Tool } from '../../core/types.js';\nimport { createTool } from '../../core/tool.js';\nimport type { TodoTask, TodoTaskUpdate, TodoTaskSummary, TaskStatus } from './types.js';\n\n/**\n * Todo 工具工厂类\n * 用于创建 Todo 工具,需要传入 Feature 实例来访问任务数据\n */\nexport class TodoToolFactory {\n /**\n * 获取任务列表的方法(由 Feature 提供)\n */\n private getTaskFn: (taskId: string) => TodoTask | undefined;\n\n /**\n * 创建任务的方法(由 Feature 提供)\n */\n private createTaskFn: (\n subject: string,\n description: string,\n activeForm: string,\n options?: { metadata?: Record<string, unknown> }\n ) => TodoTask;\n\n /**\n * 列出任务的方法(由 Feature 提供)\n */\n private listTasksFn: (filter?: { status?: TaskStatus }) => TodoTaskSummary[];\n\n /**\n * 更新任务的方法(由 Feature 提供)\n */\n private updateTaskFn: (taskId: string, updates: TodoTaskUpdate) => TodoTask | undefined;\n\n /**\n * 清空任务的方法(由 Feature 提供)\n */\n private clearTasksFn: () => void;\n\n /**\n * 获取任务数量的方法(由 Feature 提供)\n */\n private getTasksCountFn: () => number;\n\n constructor(options: {\n getTask: (taskId: string) => TodoTask | undefined;\n createTask: (\n subject: string,\n description: string,\n activeForm: string,\n options?: { metadata?: Record<string, unknown> }\n ) => TodoTask;\n listTasks: (filter?: { status?: TaskStatus }) => TodoTaskSummary[];\n updateTask: (taskId: string, updates: TodoTaskUpdate) => TodoTask | undefined;\n clearTasks: () => void;\n getTasksCount: () => number;\n }) {\n this.getTaskFn = options.getTask;\n this.createTaskFn = options.createTask;\n this.listTasksFn = options.listTasks;\n this.updateTaskFn = options.updateTask;\n this.clearTasksFn = options.clearTasks;\n this.getTasksCountFn = options.getTasksCount;\n }\n\n /**\n * 创建 task_create 工具\n */\n createCreateTool(): Tool {\n const self = this;\n return createTool({\n name: 'task_create',\n description: `创建一个结构化的任务列表,用于跟踪当前会话的工作进度。\n\n使用时机:\n- 复杂的多步骤任务(需要 3 个或以上独立步骤)\n- 非平凡且复杂的任务(需要仔细规划)\n- 用户明确要求创建任务列表\n- 收到新指令时捕获任务\n\n任务字段:\n- subject: 简短可执行的标题,使用祈使句形式(如 \"修复认证漏洞\")\n- description: 详细描述,包括上下文和验收标准\n- activeForm: 进行时形式,显示在进度加载中(如 \"正在修复认证漏洞\")\n\n重要说明:\n- 必须提供 activeForm,subject 应该是祈使句形式(\"执行任务\"),activeForm 应该是进行时形式(\"正在执行任务\")\n- 创建后任务状态为 pending,可以通过 task_update 更新为 in_progress 或 completed`,\n parameters: {\n type: 'object',\n properties: {\n subject: { type: 'string', description: '简短的任务标题,使用祈使句形式(如 \"运行测试\")' },\n description: { type: 'string', description: '详细的任务描述,包括上下文、具体步骤和验收标准' },\n activeForm: { type: 'string', description: '进行时形式,用于显示任务进行中的状态(如 \"正在运行测试\")' },\n metadata: { type: 'object', description: '可选的元数据信息', additionalProperties: true },\n },\n required: ['subject', 'description', 'activeForm'],\n },\n render: { call: 'task-create', result: 'task-create' },\n execute: ({ subject, description, activeForm, metadata }) => {\n const task = self.createTaskFn(subject, description, activeForm, { metadata });\n return Promise.resolve({\n task: {\n id: task.id,\n subject: task.subject,\n description: task.description,\n activeForm: task.activeForm,\n status: task.status,\n blockedBy: task.blockedBy,\n },\n allTasks: self.listTasksFn(),\n message: `任务已创建,ID: ${task.id}`,\n });\n },\n });\n }\n\n /**\n * 创建 task_list 工具\n */\n createListTool(): Tool {\n const self = this;\n return createTool({\n name: 'task_list',\n description: `列出任务列表中的所有任务摘要。\n\n使用时机:\n- 查看当前所有任务的状态\n- 找到下一个可执行的任务(blockedBy 为空的任务)\n- 了解整体进度\n\n返回信息:\n- id: 任务标识符\n- subject: 简短描述\n- status: 任务状态(pending/in_progress/completed)\n- owner: 负责人(如果已分配)\n- blockedBy: 阻塞此任务的其他任务 ID 列表`,\n parameters: {\n type: 'object',\n properties: {\n status: {\n type: 'string',\n enum: ['pending', 'in_progress', 'completed', 'all'],\n description: '按状态筛选任务,默认显示所有任务',\n default: 'all',\n },\n },\n },\n render: { call: 'task-list', result: 'task-list' },\n execute: ({ status = 'all' }) => {\n const tasks = self.listTasksFn(status === 'all' ? undefined : { status });\n const summary = {\n total: tasks.length,\n pending: tasks.filter(t => t.status === 'pending').length,\n inProgress: tasks.filter(t => t.status === 'in_progress').length,\n completed: tasks.filter(t => t.status === 'completed').length,\n };\n return Promise.resolve({ tasks, summary });\n },\n });\n }\n\n /**\n * 创建 task_get 工具\n */\n createGetTool(): Tool {\n const self = this;\n return createTool({\n name: 'task_get',\n description: `获取指定任务的详细信息。\n\n使用时机:\n- 开始工作前了解任务的完整描述和上下文\n- 查看任务的依赖关系(blocks 和 blockedBy)\n- 确认任务是否可以开始执行(检查 blockedBy 是否为空)`,\n parameters: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: '任务 ID' },\n },\n required: ['taskId'],\n },\n render: { call: 'task-get', result: 'task-get' },\n execute: ({ taskId }) => {\n const task = self.getTaskFn(taskId);\n if (!task) {\n return Promise.resolve({ error: `任务不存在: ${taskId}` });\n }\n return Promise.resolve({\n id: task.id,\n subject: task.subject,\n description: task.description,\n activeForm: task.activeForm,\n status: task.status,\n owner: task.owner,\n blocks: task.blocks,\n blockedBy: task.blockedBy,\n });\n },\n });\n }\n\n /**\n * 创建 task_update 工具\n */\n createUpdateTool(): Tool {\n const self = this;\n return createTool({\n name: 'task_update',\n description: `更新任务的状态或详细信息。\n\n状态工作流:pending → in_progress → completed\n\n主要用途:\n1. 标记任务进行中:将 status 设置为 \"in_progress\"\n2. 标记任务完成:将 status 设置为 \"completed\"\n3. 删除任务:将 status 设置为 \"deleted\"\n\n依赖关系管理:\n- addBlocks: 添加此任务阻塞的其他任务 ID\n- addBlockedBy: 添加阻塞此任务的其他任务 ID`,\n parameters: {\n type: 'object',\n properties: {\n taskId: { type: 'string', description: '要更新的任务 ID' },\n status: {\n type: 'string',\n enum: ['pending', 'in_progress', 'completed', 'deleted'],\n description: '任务状态',\n },\n subject: { type: 'string', description: '新的任务标题' },\n description: { type: 'string', description: '新的任务描述' },\n activeForm: { type: 'string', description: '新的进行时形式' },\n owner: { type: 'string', description: '任务负责人' },\n addBlocks: { type: 'array', items: { type: 'string' }, description: '添加此任务阻塞的其他任务 ID' },\n addBlockedBy: { type: 'array', items: { type: 'string' }, description: '添加阻塞此任务的其他任务 ID' },\n metadata: { type: 'object', description: '元数据', additionalProperties: true },\n },\n required: ['taskId'],\n },\n render: { call: 'task-update', result: 'task-update' },\n execute: ({ taskId, ...updates }) => {\n const task = self.updateTaskFn(taskId, updates);\n if (!task) {\n return Promise.resolve({ error: `任务不存在: ${taskId}` });\n }\n return Promise.resolve({\n id: task.id,\n subject: task.subject,\n status: task.status,\n owner: task.owner,\n blockedBy: task.blockedBy,\n message: `任务 ${taskId} 已更新`,\n });\n },\n });\n }\n\n /**\n * 创建 task_clear 工具\n */\n createClearTool(): Tool {\n const self = this;\n return createTool({\n name: 'task_clear',\n description: `清空任务列表中的所有任务。\n\n注意:此操作不可逆,所有任务将被永久删除。`,\n parameters: {\n type: 'object',\n properties: {},\n },\n render: { call: 'task-clear', result: 'task-clear' },\n execute: () => {\n const count = self.getTasksCountFn();\n self.clearTasksFn();\n return Promise.resolve({ message: `已清空 ${count} 个任务` });\n },\n });\n }\n\n /**\n * 获取所有工具\n */\n getAllTools(): Tool[] {\n return [\n this.createCreateTool(),\n this.createListTool(),\n this.createGetTool(),\n this.createUpdateTool(),\n this.createClearTool(),\n ];\n }\n}\n","/**\n * UserInputFeature - 通过调试界面获取用户输入\n *\n * 功能:\n * - 提供 get_user_input 工具,允许 LLM 请求用户输入\n * - 通过 DebugHub 的 UDS 通道与 ViewerWorker 通信\n * - 前端显示输入框,用户提交后返回给 Agent\n */\n\nimport { fileURLToPath } from 'url';\nimport { createTool } from '../../core/tool.js';\nimport type { Tool, UserInputAction, UserInputRequest, UserInputResponse } from '../../core/types.js';\nimport type { AgentFeature, FeatureInitContext, FeatureContext, PackageInfo } from '../../core/feature.js';\nimport { getPackageInfoFromSource } from '../../core/feature.js';\nimport { DebugHub } from '../../core/debug-hub.js';\n\nexport interface UserInputFeatureConfig {\n /** 默认超时时间(毫秒),默认无限等待 */\n timeout?: number;\n}\n\nexport class UserInputFeature implements AgentFeature {\n readonly name = 'user-input';\n readonly dependencies: string[] = [];\n readonly source = fileURLToPath(import.meta.url).replace(/\\\\/g, '/');\n readonly description = '允许 Agent 通过调试界面向用户发起输入请求并等待回复。';\n\n private defaultTimeout: number;\n private nextDraftInput = '';\n\n /**\n * 缓存包信息\n */\n private _packageInfo: PackageInfo | null = null;\n\n /**\n * 获取包信息(统一打包方案)\n */\n getPackageInfo(): PackageInfo | null {\n if (!this._packageInfo) {\n this._packageInfo = getPackageInfoFromSource(this.source);\n }\n return this._packageInfo;\n }\n\n /**\n * 获取模板名称列表(统一打包方案)\n * 注意:UserInputFeature 没有渲染模板\n */\n getTemplateNames(): string[] {\n return [];\n }\n\n constructor(config: UserInputFeatureConfig = {}) {\n this.defaultTimeout = config.timeout ?? Infinity; // 无限等待\n }\n\n setNextDraftInput(input: string): void {\n this.nextDraftInput = input;\n }\n\n /**\n * 请求用户输入(核心方法)\n */\n async requestUserInput(prompt: string, timeout?: number): Promise<string> {\n const response = await this.requestUserInputEvent({ prompt }, timeout);\n if (response.kind !== 'text') {\n throw new Error(`Expected text input but received action '${response.actionId ?? 'unknown'}'`);\n }\n return response.text ?? '';\n }\n\n async requestUserInputEvent(\n request: UserInputRequest,\n timeout?: number,\n ): Promise<UserInputResponse> {\n // 直接获取 DebugHub 实例\n const debugHub = DebugHub.getInstance();\n\n // 获取当前注册的 agentId(从 DebugHub)\n const agentId = debugHub.getCurrentAgentId();\n const capabilities = debugHub.getCapabilities();\n\n if (!agentId) {\n throw new Error('Agent ID not available. UserInputFeature requires withViewer() to be called first.');\n }\n\n if (!capabilities.interactiveInput) {\n throw new Error(\n `Interactive input is not available for transport '${capabilities.transportMode}'. Current runtime URL: ${capabilities.runtimeUrl ?? 'n/a'}.`\n );\n }\n\n const response = await debugHub.requestUserInputEvent(\n agentId,\n {\n ...request,\n initialValue: request.initialValue ?? this.nextDraftInput,\n },\n timeout ?? this.defaultTimeout\n );\n this.nextDraftInput = '';\n return response;\n }\n\n /**\n * 获取用户输入(公开接口,供主循环直接调用)\n * @param prompt 提示信息\n * @param timeout 超时时间(毫秒)\n * @returns 用户输入内容\n */\n async getUserInput(prompt: string = '请输入:', timeout?: number): Promise<string> {\n return this.requestUserInput(prompt, timeout);\n }\n\n async getUserInputEvent(\n prompt: string = '请输入:',\n timeout?: number,\n actions?: UserInputAction[],\n ): Promise<UserInputResponse> {\n return this.requestUserInputEvent({\n prompt,\n placeholder: prompt,\n actions,\n }, timeout);\n }\n\n getTools(): Tool[] {\n return [\n createTool({\n name: 'get_user_input',\n description: '请求用户通过调试界面输入文本。当需要用户确认或补充信息时使用。',\n parameters: {\n type: 'object',\n properties: {\n prompt: {\n type: 'string',\n description: '提示用户输入的问题或说明'\n }\n },\n required: ['prompt']\n },\n execute: async ({ prompt }) => {\n const input = await this.requestUserInput(prompt);\n return { input };\n },\n }),\n ];\n }\n\n async onInitiate(_ctx: FeatureInitContext): Promise<void> {\n // 不再需要保存 agentId,直接从 DebugHub 获取\n }\n\n async onDestroy(_ctx: FeatureContext): Promise<void> {\n // 清理资源(如有)\n }\n}\n","/**\n * OpencodeBasicFeature - 基础文件操作工具集\n * 来自 opencode 项目的优秀基础文件工具实现\n *\n * 包含工具:\n * - read: 文件读取(支持 offset/limit 分页)\n * - write: 文件写入(覆盖模式)\n * - edit: 文件编辑(智能匹配策略)\n * - ls: 目录列表(树形结构)\n * - glob: 文件模式搜索\n * - grep: 内容搜索(基于 ripgrep)\n *\n * 安全机制:\n * - \"先读后写\"保护:write 工具前必须先 read 过该文件\n */\n\nimport { fileURLToPath } from 'url';\nimport { dirname, join, resolve } from 'path';\nimport { promises as fs } from 'fs';\nimport type { AgentFeature, FeatureStateSnapshot, PackageInfo } from '../../core/feature.js';\nimport type { ToolContext } from '../../core/lifecycle.js';\nimport { ToolUse, Decision } from '../../core/hooks-decorator.js';\nimport type { FeatureInitContext } from '../../core/feature.js';\nimport type { DecisionResult } from '../../core/lifecycle.js';\nimport { getPackageInfoFromSource } from '../../core/feature.js';\nimport { readTool, writeTool, editTool, lsTool, globTool, grepTool } from './tools.js';\n\nconst __filename = fileURLToPath(import.meta.url);\n\n/**\n * OpencodeBasic Feature - 基础文件操作工具集\n */\nexport class OpencodeBasicFeature implements AgentFeature {\n readonly name = 'opencode-basic';\n readonly dependencies: string[] = [];\n readonly source = __filename.replace(/\\\\/g, '/');\n readonly description = '提供读写文件、编辑、列目录、glob 和 grep 等基础工程化工具。包含\"先读后写\"安全保护机制。';\n\n /**\n * 存储已读取文件的路径(绝对路径)\n * 在整个 Session 生命周期中保持,用于验证 write 操作\n */\n private readFiles = new Set<string>();\n\n /**\n * 缓存包信息\n */\n private _packageInfo: PackageInfo | null = null;\n\n /**\n * 获取包信息(统一打包方案)\n */\n getPackageInfo(): PackageInfo | null {\n if (!this._packageInfo) {\n this._packageInfo = getPackageInfoFromSource(this.source);\n }\n return this._packageInfo;\n }\n\n /**\n * 获取模板名称列表(统一打包方案)\n */\n getTemplateNames(): string[] {\n return [\n 'read',\n 'write',\n 'edit',\n 'ls',\n 'glob',\n 'grep',\n ];\n }\n\n /**\n * Logger 实例,用于记录结构化日志\n */\n private logger: any;\n\n /**\n * Feature 初始化时清空读取历史\n */\n async onInitiate(ctx: FeatureInitContext): Promise<void> {\n this.readFiles.clear();\n this.logger = ctx.logger;\n this.logger?.info('OpencodeBasic read history initialized', {\n feature: 'opencode-basic',\n lifecycle: 'AgentInitiate'\n });\n }\n\n captureState(): FeatureStateSnapshot {\n return {\n readFiles: Array.from(this.readFiles),\n };\n }\n\n restoreState(snapshot: FeatureStateSnapshot): void {\n const state = snapshot as { readFiles?: string[] };\n this.readFiles = new Set(state.readFiles ?? []);\n }\n\n /**\n * 工具使用前拦截器\n * - 记录 read 操作的文件路径\n * - 验证 write 操作是否已先读取\n */\n @ToolUse\n async validateWriteOperation(ctx: ToolContext): Promise<DecisionResult> {\n const toolName = ctx.call.name;\n\n // 记录 read 操作\n if (toolName === 'read') {\n const filePath = ctx.call.arguments?.filePath as string;\n const normalizedPath = resolve(filePath);\n this.readFiles.add(normalizedPath);\n\n this.logger?.info('File read tracked', {\n filePath: normalizedPath,\n totalReadFiles: this.readFiles.size,\n feature: 'opencode-basic',\n lifecycle: 'ToolUse',\n hookMethod: 'validateWriteOperation'\n });\n\n return Decision.Continue;\n }\n\n // 验证 write 操作\n if (toolName === 'write') {\n const filePath = ctx.call.arguments?.filePath as string;\n const normalizedPath = resolve(filePath);\n\n // 检查文件是否存在\n const exists = await fs.stat(normalizedPath)\n .then(() => true)\n .catch(() => false);\n\n // 新建文件,允许\n if (!exists) {\n this.logger?.info('Write allowed for new file', {\n filePath: normalizedPath,\n feature: 'opencode-basic',\n lifecycle: 'ToolUse',\n hookMethod: 'validateWriteOperation'\n });\n return Decision.Continue;\n }\n\n // 修改现有文件,检查是否已读\n if (!this.readFiles.has(normalizedPath)) {\n this.logger?.warn('Write blocked: file not read in this session', {\n filePath: normalizedPath,\n readFiles: Array.from(this.readFiles),\n feature: 'opencode-basic',\n lifecycle: 'ToolUse',\n hookMethod: 'validateWriteOperation'\n });\n\n return {\n action: Decision.Deny,\n reason: `文件 ${filePath} 在当前会话中未读取过。请先使用 read 工具查看文件内容后再进行修改。`\n };\n }\n\n this.logger?.info('Write allowed: file was read previously', {\n filePath: normalizedPath,\n feature: 'opencode-basic',\n lifecycle: 'ToolUse',\n hookMethod: 'validateWriteOperation'\n });\n\n return Decision.Continue;\n }\n\n // 其他工具,放行\n return Decision.Continue;\n }\n\n /**\n * 获取所有工具\n */\n getTools() {\n return [\n readTool,\n writeTool,\n editTool,\n lsTool,\n globTool,\n grepTool,\n ];\n }\n\n}\n","/**\n * OpencodeBasic 工具定义\n * 来自 opencode 项目的优秀基础文件工具实现\n */\n\nimport { createTool } from '../../core/tool.js';\nimport { readFile, writeFile, readdir, stat } from 'fs/promises';\nimport { glob } from 'glob';\nimport { spawn } from 'child_process';\nimport { createTwoFilesPatch, diffLines } from 'diff';\nimport path from 'path';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_READ_LIMIT = 2000;\nconst MAX_LINE_LENGTH = 2000;\nconst MAX_BYTES = 50 * 1024;\nconst LS_LIMIT = 100;\nconst SEARCH_LIMIT = 100;\n\nconst IGNORE_PATTERNS = [\n 'node_modules/**',\n '__pycache__/**',\n '.git/**',\n 'dist/**',\n 'build/**',\n 'target/**',\n 'vendor/**',\n 'bin/**',\n 'obj/**',\n '.idea/**',\n '.vscode/**',\n '.zig-cache/**',\n 'zig-out/**',\n '.coverage/**',\n 'coverage/**',\n 'tmp/**',\n 'temp/**',\n '.cache/**',\n 'cache/**',\n 'logs/**',\n '.venv/**',\n 'venv/**',\n 'env/**'\n];\n\n// ============================================================================\n// Read Tool - 文件读取\n// ============================================================================\n\n/**\n * 检测是否为二进制文件\n */\nasync function isBinaryFile(filepath: string): Promise<boolean> {\n const ext = path.extname(filepath).toLowerCase();\n\n const binaryExts = [\n '.zip', '.tar', '.gz', '.exe', '.dll', '.so', '.class', '.jar', '.war',\n '.7z', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.odt',\n '.ods', '.odp', '.bin', '.dat', '.obj', '.o', '.a', '.lib', '.wasm',\n '.pyc', '.pyo'\n ];\n\n if (binaryExts.includes(ext)) {\n return true;\n }\n\n try {\n const content = await readFile(filepath, { encoding: null });\n if (content.length === 0) return false;\n\n const bufferSize = Math.min(4096, content.length);\n const bytes = content.subarray(0, bufferSize);\n\n let nonPrintableCount = 0;\n for (let i = 0; i < bytes.length; i++) {\n if (bytes[i] === 0) return true;\n if (bytes[i] < 9 || (bytes[i] > 13 && bytes[i] < 32)) {\n nonPrintableCount++;\n }\n }\n\n return nonPrintableCount / bytes.length > 0.3;\n } catch {\n return false;\n }\n}\n\n/**\n * 文件读取工具\n */\nexport const readTool = createTool({\n name: 'read',\n description: 'Read a file from the local filesystem. Can read files with offset/limit for pagination, and can also read directory contents. For large files, use offset and limit parameters to read in chunks.',\n render: 'read',\n parameters: {\n type: 'object',\n properties: {\n filePath: {\n type: 'string',\n description: 'The absolute path to the file or directory to read'\n },\n offset: {\n type: 'number',\n description: 'The line number to start reading from (1-indexed, defaults to 1)'\n },\n limit: {\n type: 'number',\n description: 'The maximum number of lines to read (defaults to 2000)'\n }\n },\n required: ['filePath']\n },\n execute: async ({ filePath, offset: offsetParam, limit: limitParam }) => {\n console.log(`[read] ${filePath}`);\n\n if (offsetParam !== undefined && offsetParam < 1) {\n throw new Error('offset must be greater than or equal to 1');\n }\n\n const stats = await stat(filePath).catch(() => null);\n if (!stats) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n // 处理目录\n if (stats.isDirectory()) {\n const dirents = await readdir(filePath, { withFileTypes: true });\n const entries: string[] = [];\n\n for (const dirent of dirents) {\n if (dirent.isDirectory()) {\n entries.push(dirent.name + path.sep);\n } else if (dirent.isSymbolicLink()) {\n try {\n const targetStats = await stat(path.join(filePath, dirent.name));\n entries.push(targetStats.isDirectory() ? dirent.name + path.sep : dirent.name);\n } catch {\n entries.push(dirent.name);\n }\n } else {\n entries.push(dirent.name);\n }\n }\n\n entries.sort((a, b) => a.localeCompare(b));\n\n const limit = limitParam ?? DEFAULT_READ_LIMIT;\n const offset = offsetParam ?? 1;\n const start = offset - 1;\n const sliced = entries.slice(start, start + limit);\n const truncated = start + sliced.length < entries.length;\n\n return {\n type: 'directory',\n path: filePath,\n totalEntries: entries.length,\n offset,\n limit,\n truncated,\n entries: sliced\n };\n }\n\n // 处理文件\n const isBinary = await isBinaryFile(filePath);\n if (isBinary) {\n throw new Error(`Cannot read binary file: ${filePath}`);\n }\n\n const content = await readFile(filePath, 'utf-8');\n const lines = content.split('\\n');\n\n const limit = limitParam ?? DEFAULT_READ_LIMIT;\n const offset = offsetParam ?? 1;\n const start = offset - 1;\n\n if (start >= lines.length) {\n throw new Error(`Offset ${offset} is out of range for this file (${lines.length} lines)`);\n }\n\n // 读取并处理行\n const raw: string[] = [];\n let bytes = 0;\n let truncatedByBytes = false;\n\n for (let i = start; i < Math.min(lines.length, start + limit); i++) {\n const line = lines[i].length > MAX_LINE_LENGTH\n ? lines[i].substring(0, MAX_LINE_LENGTH) + '...'\n : lines[i];\n const size = Buffer.byteLength(line, 'utf-8') + (raw.length > 0 ? 1 : 0);\n\n if (bytes + size > MAX_BYTES) {\n truncatedByBytes = true;\n break;\n }\n\n raw.push(line);\n bytes += size;\n }\n\n // 生成带行号的输出\n const contentWithLines = raw.map((line, index) => {\n return `${index + offset}: ${line}`;\n });\n\n const totalLines = lines.length;\n const lastReadLine = offset + raw.length - 1;\n const hasMoreLines = totalLines > lastReadLine;\n const truncated = hasMoreLines || truncatedByBytes;\n\n return {\n type: 'file',\n path: filePath,\n totalLines,\n offset,\n limit,\n truncated,\n truncatedByBytes,\n lastReadLine,\n content: contentWithLines.join('\\n')\n };\n }\n});\n\n// ============================================================================\n// Write Tool - 文件写入\n// ============================================================================\n\n/**\n * 文件写入工具\n */\nexport const writeTool = createTool({\n name: 'write',\n description: 'Write content to a file. Creates new files or overwrites existing files. THIS TOOL WILL OVERWRITE THE EXISTING FILE IF it exists. Only use this tool when explicitly requested to do so. Always prefer editing existing files using the edit tool when the file already exists.',\n render: 'write',\n parameters: {\n type: 'object',\n properties: {\n filePath: {\n type: 'string',\n description: 'The absolute path to the file to write'\n },\n content: {\n type: 'string',\n description: 'The content to write to the file'\n }\n },\n required: ['filePath', 'content']\n },\n execute: async ({ filePath, content }) => {\n console.log(`[write] ${filePath}`);\n\n const exists = await stat(filePath).then(() => true).catch(() => false);\n const contentOld = exists ? await readFile(filePath, 'utf-8') : '';\n\n // 生成 diff\n const diff = createTwoFilesPatch(filePath, filePath, contentOld, content);\n\n // 写入文件\n await writeFile(filePath, content, 'utf-8');\n\n return {\n filePath,\n existed: exists,\n diff,\n message: `File ${exists ? 'updated' : 'created'} successfully`\n };\n }\n});\n\n// ============================================================================\n// Edit Tool - 文件编辑\n// ============================================================================\n\n/**\n * Levenshtein 距离算法\n */\nfunction levenshtein(a: string, b: string): number {\n if (a === '' || b === '') {\n return Math.max(a.length, b.length);\n }\n\n const matrix = Array.from({ length: a.length + 1 }, (_, i) =>\n Array.from({ length: b.length + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0))\n );\n\n for (let i = 1; i <= a.length; i++) {\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j - 1] + cost\n );\n }\n }\n\n return matrix[a.length][b.length];\n}\n\n/**\n * Replacer 类型\n */\ntype Replacer = (content: string, find: string) => Generator<string, void, unknown>;\n\n/**\n * 精确匹配替换器\n */\nconst simpleReplacer: Replacer = function* (_content, find) {\n yield find;\n};\n\n/**\n * 行修剪匹配替换器\n */\nconst lineTrimmedReplacer: Replacer = function* (content, find) {\n const originalLines = content.split('\\n');\n const searchLines = find.split('\\n');\n\n if (searchLines[searchLines.length - 1] === '') {\n searchLines.pop();\n }\n\n for (let i = 0; i <= originalLines.length - searchLines.length; i++) {\n let matches = true;\n\n for (let j = 0; j < searchLines.length; j++) {\n if (originalLines[i + j].trim() !== searchLines[j].trim()) {\n matches = false;\n break;\n }\n }\n\n if (matches) {\n let matchStartIndex = 0;\n for (let k = 0; k < i; k++) {\n matchStartIndex += originalLines[k].length + 1;\n }\n\n let matchEndIndex = matchStartIndex;\n for (let k = 0; k < searchLines.length; k++) {\n matchEndIndex += originalLines[i + k].length;\n if (k < searchLines.length - 1) {\n matchEndIndex += 1;\n }\n }\n\n yield content.substring(matchStartIndex, matchEndIndex);\n }\n }\n};\n\n/**\n * 块锚点匹配替换器(基于首尾行匹配)\n */\nconst blockAnchorReplacer: Replacer = function* (content, find) {\n const originalLines = content.split('\\n');\n const searchLines = find.split('\\n');\n\n if (searchLines.length < 3) return;\n\n if (searchLines[searchLines.length - 1] === '') {\n searchLines.pop();\n }\n\n const firstLineSearch = searchLines[0].trim();\n const lastLineSearch = searchLines[searchLines.length - 1].trim();\n\n const candidates: Array<{ startLine: number; endLine: number }> = [];\n for (let i = 0; i < originalLines.length; i++) {\n if (originalLines[i].trim() !== firstLineSearch) continue;\n\n for (let j = i + 2; j < originalLines.length; j++) {\n if (originalLines[j].trim() === lastLineSearch) {\n candidates.push({ startLine: i, endLine: j });\n break;\n }\n }\n }\n\n if (candidates.length === 0) return;\n\n const SINGLE_CANDIDATE_THRESHOLD = 0.0;\n const MULTIPLE_CANDIDATES_THRESHOLD = 0.3;\n\n if (candidates.length === 1) {\n const { startLine, endLine } = candidates[0];\n const searchBlockSize = searchLines.length;\n const actualBlockSize = endLine - startLine + 1;\n\n let similarity = 0;\n let linesToCheck = Math.min(searchBlockSize - 2, actualBlockSize - 2);\n\n if (linesToCheck > 0) {\n for (let j = 1; j < searchBlockSize - 1 && j < actualBlockSize - 1; j++) {\n const originalLine = originalLines[startLine + j].trim();\n const searchLine = searchLines[j].trim();\n const maxLen = Math.max(originalLine.length, searchLine.length);\n if (maxLen === 0) continue;\n const distance = levenshtein(originalLine, searchLine);\n similarity += (1 - distance / maxLen) / linesToCheck;\n if (similarity >= SINGLE_CANDIDATE_THRESHOLD) break;\n }\n } else {\n similarity = 1.0;\n }\n\n if (similarity >= SINGLE_CANDIDATE_THRESHOLD) {\n let matchStartIndex = 0;\n for (let k = 0; k < startLine; k++) {\n matchStartIndex += originalLines[k].length + 1;\n }\n let matchEndIndex = matchStartIndex;\n for (let k = startLine; k <= endLine; k++) {\n matchEndIndex += originalLines[k].length;\n if (k < endLine) matchEndIndex += 1;\n }\n yield content.substring(matchStartIndex, matchEndIndex);\n }\n return;\n }\n\n // 多个候选,找最佳匹配\n let bestMatch: { startLine: number; endLine: number } | null = null;\n let maxSimilarity = -1;\n\n for (const candidate of candidates) {\n const { startLine, endLine } = candidate;\n const searchBlockSize = searchLines.length;\n const actualBlockSize = endLine - startLine + 1;\n\n let similarity = 0;\n let linesToCheck = Math.min(searchBlockSize - 2, actualBlockSize - 2);\n\n if (linesToCheck > 0) {\n for (let j = 1; j < searchBlockSize - 1 && j < actualBlockSize - 1; j++) {\n const originalLine = originalLines[startLine + j].trim();\n const searchLine = searchLines[j].trim();\n const maxLen = Math.max(originalLine.length, searchLine.length);\n if (maxLen === 0) continue;\n const distance = levenshtein(originalLine, searchLine);\n similarity += 1 - distance / maxLen;\n }\n similarity /= linesToCheck;\n } else {\n similarity = 1.0;\n }\n\n if (similarity > maxSimilarity) {\n maxSimilarity = similarity;\n bestMatch = candidate;\n }\n }\n\n if (maxSimilarity >= MULTIPLE_CANDIDATES_THRESHOLD && bestMatch) {\n const { startLine, endLine } = bestMatch;\n let matchStartIndex = 0;\n for (let k = 0; k < startLine; k++) {\n matchStartIndex += originalLines[k].length + 1;\n }\n let matchEndIndex = matchStartIndex;\n for (let k = startLine; k <= endLine; k++) {\n matchEndIndex += originalLines[k].length;\n if (k < endLine) matchEndIndex += 1;\n }\n yield content.substring(matchStartIndex, matchEndIndex);\n }\n};\n\n/**\n * 空白标准化替换器\n */\nconst whitespaceNormalizedReplacer: Replacer = function* (content, find) {\n const normalizeWhitespace = (text: string) => text.replace(/\\s+/g, ' ').trim();\n const normalizedFind = normalizeWhitespace(find);\n\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (normalizeWhitespace(lines[i]) === normalizedFind) {\n yield lines[i];\n }\n }\n\n const findLines = find.split('\\n');\n if (findLines.length > 1) {\n for (let i = 0; i <= lines.length - findLines.length; i++) {\n const block = lines.slice(i, i + findLines.length).join('\\n');\n if (normalizeWhitespace(block) === normalizedFind) {\n yield block;\n }\n }\n }\n};\n\n/**\n * 缩进灵活替换器\n */\nconst indentationFlexibleReplacer: Replacer = function* (content, find) {\n const removeIndentation = (text: string) => {\n const lines = text.split('\\n');\n const nonEmptyLines = lines.filter((line) => line.trim().length > 0);\n if (nonEmptyLines.length === 0) return text;\n\n const minIndent = Math.min(\n ...nonEmptyLines.map((line) => {\n const match = line.match(/^(\\s*)/);\n return match ? match[1].length : 0;\n })\n );\n\n return lines.map((line) => (line.trim().length === 0 ? line : line.slice(minIndent))).join('\\n');\n };\n\n const normalizedFind = removeIndentation(find);\n const contentLines = content.split('\\n');\n const findLines = find.split('\\n');\n\n for (let i = 0; i <= contentLines.length - findLines.length; i++) {\n const block = contentLines.slice(i, i + findLines.length).join('\\n');\n if (removeIndentation(block) === normalizedFind) {\n yield block;\n }\n }\n};\n\n/**\n * 转义符标准化替换器\n */\nconst escapeNormalizedReplacer: Replacer = function* (content, find) {\n const unescapeString = (str: string): string => {\n return str.replace(/\\\\(n|t|r|'|\"|`|\\\\|\\n|\\$)/g, (_, capturedChar) => {\n switch (capturedChar) {\n case 'n': return '\\n';\n case 't': return '\\t';\n case 'r': return '\\r';\n case \"'\": return \"'\";\n case '\"': return '\"';\n case '`': return '`';\n case '\\\\': return '\\\\';\n case '\\n': return '\\n';\n case '$': return '$';\n default: return _;\n }\n });\n };\n\n const unescapedFind = unescapeString(find);\n\n if (content.includes(unescapedFind)) {\n yield unescapedFind;\n }\n\n const lines = content.split('\\n');\n const findLines = unescapedFind.split('\\n');\n\n for (let i = 0; i <= lines.length - findLines.length; i++) {\n const block = lines.slice(i, i + findLines.length).join('\\n');\n if (unescapeString(block) === unescapedFind) {\n yield block;\n }\n }\n};\n\n/**\n * 边界修剪替换器\n */\nconst trimmedBoundaryReplacer: Replacer = function* (content, find) {\n const trimmedFind = find.trim();\n\n if (trimmedFind === find) return;\n\n if (content.includes(trimmedFind)) {\n yield trimmedFind;\n }\n\n const lines = content.split('\\n');\n const findLines = find.split('\\n');\n\n for (let i = 0; i <= lines.length - findLines.length; i++) {\n const block = lines.slice(i, i + findLines.length).join('\\n');\n if (block.trim() === trimmedFind) {\n yield block;\n }\n }\n};\n\n/**\n * 上下文感知替换器\n */\nconst contextAwareReplacer: Replacer = function* (content, find) {\n const findLines = find.split('\\n');\n if (findLines.length < 3) return;\n\n if (findLines[findLines.length - 1] === '') {\n findLines.pop();\n }\n\n const contentLines = content.split('\\n');\n const firstLine = findLines[0].trim();\n const lastLine = findLines[findLines.length - 1].trim();\n\n for (let i = 0; i < contentLines.length; i++) {\n if (contentLines[i].trim() !== firstLine) continue;\n\n for (let j = i + 2; j < contentLines.length; j++) {\n if (contentLines[j].trim() === lastLine) {\n const blockLines = contentLines.slice(i, j + 1);\n\n if (blockLines.length === findLines.length) {\n let matchingLines = 0;\n let totalNonEmptyLines = 0;\n\n for (let k = 1; k < blockLines.length - 1; k++) {\n const blockLine = blockLines[k].trim();\n const findLine = findLines[k].trim();\n\n if (blockLine.length > 0 || findLine.length > 0) {\n totalNonEmptyLines++;\n if (blockLine === findLine) {\n matchingLines++;\n }\n }\n }\n\n if (totalNonEmptyLines === 0 || matchingLines / totalNonEmptyLines >= 0.5) {\n yield blockLines.join('\\n');\n break;\n }\n }\n break;\n }\n }\n }\n};\n\n/**\n * 多次出现替换器\n */\nconst multiOccurrenceReplacer: Replacer = function* (content, find) {\n let startIndex = 0;\n\n while (true) {\n const index = content.indexOf(find, startIndex);\n if (index === -1) break;\n\n yield find;\n startIndex = index + find.length;\n }\n};\n\n/**\n * 所有替换器列表\n */\nconst REPLACERS: Replacer[] = [\n simpleReplacer,\n lineTrimmedReplacer,\n blockAnchorReplacer,\n whitespaceNormalizedReplacer,\n indentationFlexibleReplacer,\n escapeNormalizedReplacer,\n trimmedBoundaryReplacer,\n contextAwareReplacer,\n multiOccurrenceReplacer,\n];\n\n/**\n * 执行替换\n */\nfunction replace(content: string, oldString: string, newString: string, replaceAll = false): string {\n if (oldString === newString) {\n throw new Error('No changes to apply: oldString and newString are identical.');\n }\n\n let notFound = true;\n\n for (const replacer of REPLACERS) {\n for (const search of replacer(content, oldString)) {\n const index = content.indexOf(search);\n if (index === -1) continue;\n\n notFound = false;\n\n if (replaceAll) {\n return content.replaceAll(search, newString);\n }\n\n const lastIndex = content.lastIndexOf(search);\n if (index !== lastIndex) continue;\n\n return content.substring(0, index) + newString + content.substring(index + search.length);\n }\n }\n\n if (notFound) {\n throw new Error(\n 'Could not find oldString in the file. It must match exactly, including whitespace, indentation, and line endings.'\n );\n }\n\n throw new Error('Found multiple matches for oldString. Provide more surrounding context to make the match unique.');\n}\n\n/**\n * 文件编辑工具\n */\nexport const editTool = createTool({\n name: 'edit',\n description: 'Make exact string replacements in a file. Uses multiple intelligent matching strategies including block anchor matching, whitespace normalization, and indentation flexibility. Always provides a diff preview of changes.',\n render: 'edit',\n parameters: {\n type: 'object',\n properties: {\n filePath: {\n type: 'string',\n description: 'The absolute path to the file to modify'\n },\n oldString: {\n type: 'string',\n description: 'The text to replace'\n },\n newString: {\n type: 'string',\n description: 'The text to replace it with (must be different from oldString)'\n },\n replaceAll: {\n type: 'boolean',\n description: 'Replace all occurrences of oldString (default false)'\n }\n },\n required: ['filePath', 'oldString', 'newString']\n },\n execute: async ({ filePath, oldString, newString, replaceAll = false }) => {\n console.log(`[edit] ${filePath}`);\n\n if (oldString === newString) {\n throw new Error('No changes to apply: oldString and newString are identical.');\n }\n\n // 检查文件是否存在\n const exists = await stat(filePath).then(() => true).catch(() => false);\n if (!exists) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const contentOld = await readFile(filePath, 'utf-8');\n const contentNew = replace(contentOld, oldString, newString, replaceAll);\n\n // 生成 diff\n const diff = createTwoFilesPatch(filePath, filePath, contentOld, contentNew);\n\n // 计算变更统计\n let additions = 0;\n let deletions = 0;\n for (const change of diffLines(contentOld, contentNew)) {\n if (change.added) additions += change.count || 0;\n if (change.removed) deletions += change.count || 0;\n }\n\n // 写入文件\n await writeFile(filePath, contentNew, 'utf-8');\n\n return {\n filePath,\n diff,\n additions,\n deletions,\n message: 'Edit applied successfully'\n };\n }\n});\n\n// ============================================================================\n// LS Tool - 目录列表\n// ============================================================================\n\n/**\n * 目录列表工具\n */\nexport const lsTool = createTool({\n name: 'ls',\n description: 'List files in a directory with tree structure output. Automatically ignores common build/cache directories.',\n render: 'ls',\n parameters: {\n type: 'object',\n properties: {\n dirPath: {\n type: 'string',\n description: 'The absolute path to the directory to list'\n },\n ignore: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of glob patterns to ignore'\n }\n },\n required: ['dirPath']\n },\n execute: async ({ dirPath, ignore = [] }) => {\n console.log(`[ls] ${dirPath}`);\n\n const ignoreGlobs = [...IGNORE_PATTERNS, ...ignore.map((p: string) => `${p}/**`)];\n\n // glob 返回 Promise<string[]>,不是异步迭代器\n const matches = await glob('**/*', {\n cwd: dirPath,\n absolute: false,\n dot: true,\n ignore: ignoreGlobs,\n nodir: true\n });\n\n const files: string[] = [];\n for (const file of matches) {\n files.push(file);\n if (files.length >= LS_LIMIT) break;\n }\n\n // 构建目录结构\n const dirs = new Set<string>();\n const filesByDir = new Map<string, string[]>();\n\n for (const file of files) {\n const dir = path.dirname(file);\n const parts = dir === '.' ? [] : dir.split(path.sep);\n\n // 添加所有父目录\n for (let i = 0; i <= parts.length; i++) {\n const dirPath = i === 0 ? '.' : parts.slice(0, i).join(path.sep);\n dirs.add(dirPath);\n }\n\n // 将文件添加到其目录\n if (!filesByDir.has(dir)) {\n filesByDir.set(dir, []);\n }\n filesByDir.get(dir)!.push(path.basename(file));\n }\n\n // 渲染目录树\n function renderDir(dirPath: string, depth: number): string {\n const indent = ' '.repeat(depth);\n let output = '';\n\n if (depth > 0) {\n output += `${indent}${path.basename(dirPath)}/\\n`;\n }\n\n const children = Array.from(dirs)\n .filter((d) => path.dirname(d) === dirPath && d !== dirPath)\n .sort();\n\n // 先渲染子目录\n for (const child of children) {\n output += renderDir(child, depth + 1);\n }\n\n // 渲染文件\n const dirFiles = filesByDir.get(dirPath) || [];\n for (const file of dirFiles.sort()) {\n output += `${' '.repeat(depth + 1)}${file}\\n`;\n }\n\n return output;\n }\n\n const treeOutput = `${dirPath}${path.sep}\\n${renderDir('.', 0)}`;\n\n return {\n path: dirPath,\n count: files.length,\n truncated: files.length >= LS_LIMIT,\n tree: treeOutput\n };\n }\n});\n\n// ============================================================================\n// Glob Tool - 文件模式搜索\n// ============================================================================\n\n/**\n * Glob 文件搜索工具\n */\nexport const globTool = createTool({\n name: 'glob',\n description: 'Fast file pattern matching tool that works with any codebase size. Supports glob patterns like \"**/*.js\" or \"src/**/*.ts\". Returns matching file paths sorted by modification time.',\n render: 'glob',\n parameters: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'The glob pattern to match files against'\n },\n searchPath: {\n type: 'string',\n description: 'The directory to search in (defaults to current working directory)'\n }\n },\n required: ['pattern']\n },\n execute: async ({ pattern, searchPath = process.cwd() }) => {\n console.log(`[glob] ${pattern} in ${searchPath}`);\n\n const files: Array<{ path: string; mtime: number }> = [];\n\n // 使用 glob 进行文件搜索\n const matches = await glob(pattern, {\n cwd: searchPath,\n absolute: true,\n windowsPathsNoEscape: true,\n nodir: true,\n });\n\n for (const file of matches) {\n if (files.length >= SEARCH_LIMIT) break;\n\n try {\n const stats = await stat(file);\n files.push({\n path: file,\n mtime: stats.mtimeMs\n });\n } catch {\n // File may have been deleted, skip\n }\n }\n\n // 按修改时间排序\n files.sort((a, b) => b.mtime - a.mtime);\n\n return {\n count: files.length,\n truncated: files.length >= SEARCH_LIMIT,\n files: files.map(f => f.path)\n };\n }\n});\n\n// ============================================================================\n// Grep Tool - 内容搜索\n// ============================================================================\n\n/**\n * 获取 ripgrep 路径\n */\nasync function getRipgrepPath(): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn('rg', ['--version'], { windowsHide: true });\n let hasOutput = false;\n\n child.stdout.on('data', () => { hasOutput = true; });\n child.stderr.on('data', () => { hasOutput = true; });\n\n child.on('close', (code) => {\n if (hasOutput || code === 0) {\n resolve('rg');\n } else {\n reject(new Error('ripgrep (rg) is not installed. Please install it from https://github.com/BurntSushi/ripgrep'));\n }\n });\n\n child.on('error', () => {\n reject(new Error('ripgrep (rg) is not installed. Please install it from https://github.com/BurntSushi/ripgrep'));\n });\n });\n}\n\n/**\n * Grep 内容搜索工具\n */\nexport const grepTool = createTool({\n name: 'grep',\n description: 'A powerful search tool built on ripgrep. Supports full regex syntax, file type filtering, and context control. Use this tool for content searches; NEVER invoke grep or rg as Bash commands.',\n render: 'grep',\n parameters: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'The regex pattern to search for in file contents'\n },\n searchPath: {\n type: 'string',\n description: 'The directory to search in (defaults to current working directory)'\n },\n include: {\n type: 'string',\n description: 'File pattern to include in the search (e.g. \"*.js\", \"*.{ts,tsx}\")'\n }\n },\n required: ['pattern']\n },\n execute: async ({ pattern, searchPath = process.cwd(), include }, context) => {\n console.log(`[grep] ${pattern} in ${searchPath}`);\n\n const rgPath = await getRipgrepPath();\n const args = ['-nH', '--hidden', '--no-messages', '--field-match-separator=|', '--regexp', pattern];\n\n if (include) {\n args.push('--glob', include);\n }\n args.push(searchPath);\n\n try {\n // 使用 spawn 避免在 Windows 上 shell 解析特殊字符(如 |)的问题\n const stdout = await new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n const child = spawn(rgPath, args, {\n windowsHide: true\n });\n\n child.stdout.on('data', (chunk) => chunks.push(chunk));\n child.stderr.on('data', (chunk) => {\n // ripgrep 将匹配结果输出到 stdout,错误信息到 stderr\n });\n\n child.on('error', (err) => reject(err));\n child.on('close', (code) => {\n if (context?.signal?.aborted) {\n return reject(new Error('Search was aborted'));\n }\n // code 1 表示没有匹配,不是错误\n if (code !== 0 && code !== 1) {\n return reject(new Error(`rg exited with code ${code}`));\n }\n resolve(Buffer.concat(chunks).toString('utf-8'));\n });\n\n // 支持取消\n if (context?.signal) {\n context.signal.addEventListener('abort', () => {\n child.kill();\n });\n }\n });\n\n const lines = stdout.trim().split(/\\r?\\n/);\n const matches: Array<{ path: string; lineNum: number; lineText: string; modTime: number }> = [];\n\n for (const line of lines) {\n if (!line) continue;\n\n const parts = line.split('|');\n if (parts.length < 3) continue;\n\n const [filePath, lineNumStr, ...lineTextParts] = parts;\n const lineNum = parseInt(lineNumStr, 10);\n const lineText = lineTextParts.join('|');\n\n try {\n const stats = await stat(filePath);\n matches.push({\n path: filePath,\n lineNum,\n lineText: lineText.length > MAX_LINE_LENGTH ? lineText.substring(0, MAX_LINE_LENGTH) + '...' : lineText,\n modTime: stats.mtimeMs\n });\n } catch {\n // File may not exist, skip\n }\n }\n\n // 按修改时间排序\n matches.sort((a, b) => b.modTime - a.modTime);\n\n const truncated = matches.length > SEARCH_LIMIT;\n const finalMatches = truncated ? matches.slice(0, SEARCH_LIMIT) : matches;\n\n return {\n pattern,\n matches: matches.length,\n truncated,\n results: finalMatches\n };\n } catch (error: any) {\n if (error.message?.includes('Search was aborted') || context?.signal?.aborted) {\n throw new Error('Search was aborted');\n }\n throw error;\n }\n }\n});\n","import { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport type {\n AgentFeature,\n FeatureContext,\n FeatureInitContext,\n FeatureStateSnapshot,\n ContextInjector,\n PackageInfo,\n} from '../../core/feature.js';\nimport type { Tool } from '../../core/types.js';\nimport type {\n CallStartContext,\n StepFinishDecisionContext,\n ToolContext,\n} from '../../core/lifecycle.js';\nimport { CallStart, StepFinish, ToolUse } from '../../core/hooks-decorator.js';\nimport { Decision } from '../../core/lifecycle.js';\nimport { getPackageInfoFromSource } from '../../core/feature.js';\nimport { createExampleTool } from './tools.js';\nimport type {\n ExampleFeatureConfig,\n ExampleFeatureRuntimeState,\n ExampleFeatureSnapshot,\n} from './types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport class ExampleFeature implements AgentFeature {\n readonly name = 'example-feature';\n readonly dependencies: string[] = [];\n readonly source = __filename.replace(/\\\\/g, '/');\n readonly description = '示范用 Feature 骨架:展示工具、模板、上下文注入、回滚快照和反向钩子的标准写法。';\n\n private readonly config: Required<ExampleFeatureConfig>;\n private readonly runtime: ExampleFeatureRuntimeState = {\n enabled: true,\n counter: 0,\n lastInput: '',\n notes: [],\n };\n private logger?: FeatureInitContext['logger'];\n\n private _packageInfo: PackageInfo | null = null;\n\n constructor(config: ExampleFeatureConfig = {}) {\n this.config = {\n enabledByDefault: config.enabledByDefault ?? true,\n notePrefix: config.notePrefix ?? '[example]',\n };\n this.runtime.enabled = this.config.enabledByDefault;\n }\n\n /**\n * 公开 API 只保留“其他 Feature 真会读取的东西”。\n * 不要把整个 runtime 对象直接暴露出去。\n */\n isEnabled(): boolean {\n return this.runtime.enabled;\n }\n\n getCounter(): number {\n return this.runtime.counter;\n }\n\n listNotes(): string[] {\n return [...this.runtime.notes];\n }\n\n /**\n * 内部 helper 比直接在装饰器和工具里散改字段更容易维护。\n * 如果 Feature 很简单,也可以不抽这些方法。\n */\n private appendNote(note: string): void {\n const normalized = note.trim();\n if (!normalized) return;\n this.runtime.notes.push(`${this.config.notePrefix} ${normalized}`.trim());\n }\n\n private setEnabled(enabled: boolean): void {\n this.runtime.enabled = enabled;\n }\n\n private buildReminder(): string {\n return `${this.config.notePrefix} example feature is active`;\n }\n\n getTools(): Tool[] {\n return [\n createExampleTool({\n getState: () => this.runtime,\n incrementCounter: () => {\n this.runtime.counter += 1;\n },\n addNote: (note: string) => {\n this.appendNote(note);\n },\n }),\n ];\n }\n\n /**\n * 获取包信息(统一打包方案)\n */\n getPackageInfo(): PackageInfo | null {\n if (!this._packageInfo) {\n this._packageInfo = getPackageInfoFromSource(this.source);\n }\n return this._packageInfo;\n }\n\n /**\n * 获取模板名称列表(统一打包方案)\n */\n getTemplateNames(): string[] {\n // 两个别名指向同一个模板文件\n return ['example-tool', 'example_tool'];\n }\n\n getContextInjectors(): Map<string | RegExp, ContextInjector> {\n return new Map([\n ['example_tool', () => ({\n _exampleFeature: {\n enabled: this.runtime.enabled,\n counter: this.runtime.counter,\n },\n })],\n ]);\n }\n\n async onInitiate(ctx: FeatureInitContext): Promise<void> {\n this.logger = ctx.logger;\n\n // 在这里做一次性初始化:\n // - 创建 client\n // - 注册数据源\n // - 加载配置文件\n // - 打印启动日志\n this.logger?.info('ExampleFeature initiated', {\n enabled: this.runtime.enabled,\n counter: this.runtime.counter,\n });\n\n // 如果 Feature 依赖其他 Feature,优先在这里拿公开 API:\n // const other = ctx.getFeature<SomePublicApi & AgentFeature>('other-feature');\n // 不要把其他 Feature 的内部字段当成稳定接口。\n }\n\n async onDestroy(_ctx: FeatureContext): Promise<void> {\n // 在这里做资源清理:\n // - 关闭 client\n // - 停止 worker / interval\n // - 释放文件句柄\n this.logger?.info('ExampleFeature destroyed');\n }\n\n captureState(): FeatureStateSnapshot {\n const snapshot: ExampleFeatureSnapshot = {\n enabled: this.runtime.enabled,\n counter: this.runtime.counter,\n lastInput: this.runtime.lastInput,\n notes: [...this.runtime.notes],\n };\n return snapshot;\n }\n\n restoreState(snapshot: FeatureStateSnapshot): void {\n const state = snapshot as ExampleFeatureSnapshot;\n\n this.runtime.enabled = Boolean(state.enabled);\n this.runtime.counter = typeof state.counter === 'number' ? state.counter : 0;\n this.runtime.lastInput = typeof state.lastInput === 'string' ? state.lastInput : '';\n this.runtime.notes = [...(state.notes ?? [])];\n }\n\n async beforeRollback(snapshot: FeatureStateSnapshot): Promise<void> {\n const state = snapshot as ExampleFeatureSnapshot;\n this.logger?.info('ExampleFeature before rollback', {\n restoringCounter: state.counter,\n });\n }\n\n async afterRollback(snapshot: FeatureStateSnapshot): Promise<void> {\n const state = snapshot as ExampleFeatureSnapshot;\n this.logger?.info('ExampleFeature after rollback', {\n restoredCounter: state.counter,\n });\n }\n\n @CallStart\n async handleCallStart(ctx: CallStartContext): Promise<void> {\n this.runtime.lastInput = ctx.agent?.getUserInput() ?? ctx.input;\n\n // 典型用法:\n // - slash command 改写输入\n // - 模式切换\n // - 注入轻量 system reminder\n // - 记录当前轮的轻量状态\n\n // 示例 1:处理一个最简单的 slash command\n // if (this.runtime.lastInput === '/example-off') {\n // this.setEnabled(false);\n // ctx.agent?.setUserInput('');\n // }\n\n // 示例 2:仅在模式开启时注入提醒\n // if (this.runtime.enabled) {\n // ctx.context.add({ role: 'system', content: this.buildReminder() });\n // }\n }\n\n @ToolUse\n async validateExampleTool(ctx: ToolContext): Promise<typeof Decision.Continue | typeof Decision.Deny> {\n if (ctx.call.name !== 'example_tool') {\n return Decision.Continue;\n }\n\n // 典型用法:\n // - 校验参数\n // - 拦截危险工具调用\n // - 改写 call.arguments\n\n // 示例:模式关闭时拒绝执行\n // if (!this.runtime.enabled) {\n // return {\n // action: Decision.Deny,\n // reason: 'example feature disabled',\n // };\n // }\n\n // 示例:标准化参数后继续\n // if (typeof ctx.call.arguments?.note === 'string') {\n // ctx.call.arguments.note = ctx.call.arguments.note.trim();\n // }\n\n return Decision.Continue;\n }\n\n @StepFinish\n async handleStepFinish(ctx: StepFinishDecisionContext): Promise<typeof Decision.Continue> {\n // 典型用法:\n // - 统计本轮是否命中特定工具\n // - 决定是否继续下一轮\n // - 更新 reminder 计数器\n\n // 示例:只有当本轮真的用了本 Feature 的工具,才更新某个计数器\n // const usedExampleTool = ctx.llmResponse.toolCalls?.some(call => call.name === 'example_tool');\n // if (usedExampleTool) {\n // this.appendNote('tool used in this step');\n // }\n\n return Decision.Continue;\n }\n}\n","import { createTool } from '../../core/tool.js';\nimport type { Tool } from '../../core/types.js';\nimport type { ExampleFeatureRuntimeState, ExampleFeatureToolResult } from './types.js';\n\nexport function createExampleTool(deps: {\n getState(): ExampleFeatureRuntimeState;\n incrementCounter(): void;\n addNote(note: string): void;\n}): Tool {\n return createTool({\n name: 'example_tool',\n description: '示范工具:展示 Feature 内部状态、模板渲染和上下文注入是如何连起来的。',\n parameters: {\n type: 'object',\n properties: {\n note: {\n type: 'string',\n description: '要记录的一条示意说明',\n },\n },\n required: [],\n },\n render: {\n call: 'example-tool',\n result: 'example-tool',\n },\n execute: async ({ note }, context) => {\n // 这里故意保留一个最常见的 Feature 工具结构:\n // 1. 读取注入的运行时上下文\n // 2. 更新 Feature 状态\n // 3. 返回纯对象,交给模板渲染\n const injected = (context as { _exampleFeature?: { enabled: boolean; counter: number } } | undefined)?._exampleFeature;\n\n deps.incrementCounter();\n if (typeof note === 'string' && note.trim()) {\n deps.addNote(note.trim());\n }\n\n const result: ExampleFeatureToolResult = {\n enabled: deps.getState().enabled,\n counter: deps.getState().counter,\n lastInput: deps.getState().lastInput,\n notes: deps.getState().notes,\n injected,\n };\n return result;\n },\n });\n}\n","/**\r\n * 配置加载\r\n * 从 config 目录读取 JSON 配置文件\r\n *\r\n * 提供两种方式:\r\n * - loadConfig() - 异步加载(用于特殊场景)\r\n * - loadConfigSync() - 同步加载(推荐,用于 Agent 构造)\r\n */\r\n\r\nimport { readFile, readdir } from 'fs/promises';\r\nimport { readFileSync, readdirSync, existsSync } from 'fs';\r\nimport { resolve, join } from 'path';\r\nimport { cwd } from 'process';\r\n\r\n/**\r\n * 统一配置类型\r\n * 字段允许冗余,各 LLM 实现只取自己需要的\r\n */\r\nexport interface ModelConfig {\r\n provider: 'openai' | 'anthropic' | string;\r\n apiKey: string;\r\n model: string;\r\n baseUrl?: string;\r\n maxTokens?: number;\r\n thinkingBudgetTokens?: number;\r\n thinkingKeepTurns?: number;\r\n providerOptions?: Record<string, unknown>;\r\n // 未来可扩展\r\n region?: string;\r\n projectId?: string;\r\n}\r\n\r\nexport interface AgentConfigFile {\r\n defaultModel: ModelConfig;\r\n agent: {\r\n maxTurns: number;\r\n temperature: number;\r\n };\r\n}\r\n\r\n/**\r\n * 获取项目根目录\r\n *\r\n * 使用 process.cwd() 而不是模块路径,以支持 npm link 环境\r\n */\r\nfunction getProjectRoot(): string {\r\n return cwd();\r\n}\r\n\r\n/**\r\n * 读取配置文件(异步版本)\r\n * @param name 配置文件名(不含路径和扩展名),默认 'default'\r\n */\r\nexport async function loadConfig(name: string = 'default'): Promise<AgentConfigFile> {\r\n const projectRoot = getProjectRoot();\r\n const configDir = join(projectRoot, 'config');\r\n const configPath = resolve(configDir, `${name}.json`);\r\n\r\n if (!existsSync(configPath)) {\r\n throw new Error(\r\n `配置文件不存在: ${configPath}\\n` +\r\n `请在项目目录下创建 config/${name}.json 文件,\\n` +\r\n `或通过 config.llm 参数直接传入 LLM 实例。`\r\n );\r\n }\r\n\r\n const content = await readFile(configPath, 'utf-8');\r\n const raw = JSON.parse(content);\r\n\r\n // 替换环境变量 ${VAR_NAME}\r\n return replaceEnvVars(raw) as AgentConfigFile;\r\n}\r\n\r\n/**\r\n * 读取配置文件(同步版本,推荐用于 Agent 构造)\r\n * @param name 配置文件名(不含路径和扩展名),默认 'default'\r\n */\r\nexport function loadConfigSync(name: string = 'default'): AgentConfigFile {\r\n const projectRoot = getProjectRoot();\r\n const configDir = join(projectRoot, 'config');\r\n const configPath = resolve(configDir, `${name}.json`);\r\n\r\n if (!existsSync(configPath)) {\r\n throw new Error(\r\n `配置文件不存在: ${configPath}\\n` +\r\n `请在项目目录下创建 config/${name}.json 文件,\\n` +\r\n `或通过 config.llm 参数直接传入 LLM 实例。`\r\n );\r\n }\r\n\r\n const content = readFileSync(configPath, 'utf-8');\r\n const raw = JSON.parse(content);\r\n\r\n // 替换环境变量 ${VAR_NAME}\r\n return replaceEnvVars(raw) as AgentConfigFile;\r\n}\r\n\r\n/**\r\n * 列出所有可用的配置文件\r\n */\r\nexport async function listConfigs(): Promise<string[]> {\r\n const projectRoot = getProjectRoot();\r\n const configDir = join(projectRoot, 'config');\r\n\r\n try {\r\n const files = await readdir(configDir);\r\n return files\r\n .filter(f => f.endsWith('.json'))\r\n .map(f => f.replace('.json', ''));\r\n } catch {\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * 递归替换对象中的环境变量\r\n */\r\nfunction replaceEnvVars(obj: any): any {\r\n if (typeof obj === 'string') {\r\n // 匹配 ${VAR_NAME} 格式\r\n return obj.replace(/\\$\\{([^}]+)\\}/g, (_, varName) => {\r\n return process.env[varName] || '';\r\n });\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map(replaceEnvVars);\r\n }\r\n\r\n if (obj && typeof obj === 'object') {\r\n const result: any = {};\r\n for (const [key, value] of Object.entries(obj)) {\r\n result[key] = replaceEnvVars(value);\r\n }\r\n return result;\r\n }\r\n\r\n return obj;\r\n}\r\n","import type { AgentConfigFile, ModelConfig } from '../core/config.js';\r\nimport type { LLMClient, LLMResponse, Message, ThinkingBlock, Tool, ToolCall, UsageInfo } from '../core/types.js';\r\nimport type { LLMPhase } from '../core/types.js';\r\n\r\ntype AnthropicTextBlock = {\r\n type: 'text';\r\n text: string;\r\n cache_control?: { type: 'ephemeral' };\r\n};\r\n\r\ntype AnthropicThinkingBlock = {\r\n type: 'thinking';\r\n thinking: string;\r\n signature: string;\r\n};\r\n\r\ntype AnthropicToolResultBlock = {\r\n type: 'tool_result';\r\n tool_use_id: string;\r\n content: string;\r\n is_error?: boolean;\r\n};\r\n\r\ntype AnthropicToolUseBlock = {\r\n type: 'tool_use';\r\n id: string;\r\n name: string;\r\n input?: unknown;\r\n};\r\n\r\ntype AnthropicContentBlock = AnthropicTextBlock | AnthropicThinkingBlock | AnthropicToolResultBlock | AnthropicToolUseBlock;\r\n\r\ninterface AnthropicRequestMessage {\r\n role: 'user' | 'assistant';\r\n content: string | AnthropicContentBlock[];\r\n}\r\n\r\ninterface AnthropicToolDef {\r\n name: string;\r\n description: string;\r\n input_schema: Record<string, unknown>;\r\n}\r\n\r\ninterface AnthropicStreamEvent {\n type?: string;\n index?: number;\n content_block?: AnthropicContentBlock;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n delta?: {\n type?: string;\n text?: string;\n thinking?: string;\n partial_json?: string;\n stop_reason?: string | null;\n stop_sequence?: string | null;\n };\n message?: {\n id?: string;\n stop_reason?: string | null;\n stop_sequence?: string | null;\n usage?: {\r\n input_tokens?: number;\r\n output_tokens?: number;\r\n cache_creation_input_tokens?: number;\r\n cache_read_input_tokens?: number;\r\n };\r\n };\r\n}\r\n\r\ninterface CompiledAnthropicRequest {\r\n system?: AnthropicTextBlock[];\r\n messages: AnthropicRequestMessage[];\r\n tools?: AnthropicToolDef[];\r\n}\r\n\r\ninterface AnthropicCompatErrorPayload {\r\n code?: number;\r\n msg?: string;\r\n message?: string;\r\n success?: boolean;\r\n}\r\n\r\ninterface PendingToolUse {\r\n id: string;\r\n name: string;\r\n inputJson: string;\r\n}\r\n\r\ninterface PendingThinkingBlock {\r\n thinking: string;\r\n signature: string;\r\n}\r\n\r\ninterface AnthropicContextManagementConfig {\r\n edits: Array<{\r\n type: 'clear_thinking_20251015';\r\n keep: {\r\n type: 'thinking_turns';\r\n value: number;\r\n } | 'all';\r\n }>;\r\n}\r\n\r\nconst DEFAULT_BASE_URL = 'https://api.anthropic.com/v1';\r\nconst DEFAULT_MAX_TOKENS = 4096;\r\nconst DEFAULT_THINKING_KEEP_TURNS = 5;\r\nconst CONTEXT_MANAGEMENT_BETA = 'context-management-2025-06-27';\r\n\r\nexport class AnthropicLLM implements LLMClient {\r\n constructor(\r\n private readonly apiKey: string,\r\n private readonly modelName: string = 'claude-sonnet-4-5-20250929',\r\n private readonly baseUrl: string = DEFAULT_BASE_URL,\r\n private readonly maxTokens: number = DEFAULT_MAX_TOKENS,\r\n private readonly thinkingBudgetTokens?: number,\r\n private readonly thinkingKeepTurns: number = DEFAULT_THINKING_KEEP_TURNS,\r\n ) {}\r\n\r\n async chat(messages: Message[], tools: Tool[]): Promise<LLMResponse> {\r\n const compiled = compileContextForAnthropic(messages, tools);\r\n const response = await fetch(resolveAnthropicMessagesUrl(this.baseUrl), {\r\n method: 'POST',\r\n headers: {\r\n 'content-type': 'application/json',\r\n 'x-api-key': this.apiKey,\r\n 'anthropic-version': '2023-06-01',\r\n ...(shouldUseContextManagement(this.thinkingBudgetTokens, this.thinkingKeepTurns)\r\n ? { 'anthropic-beta': CONTEXT_MANAGEMENT_BETA }\r\n : {}),\r\n },\r\n body: JSON.stringify({\r\n model: this.modelName,\r\n max_tokens: this.maxTokens,\r\n stream: true,\r\n ...(this.thinkingBudgetTokens && this.thinkingBudgetTokens >= 1024\r\n ? { thinking: { type: 'enabled', budget_tokens: this.thinkingBudgetTokens } }\r\n : {}),\r\n ...(shouldUseContextManagement(this.thinkingBudgetTokens, this.thinkingKeepTurns)\r\n ? { context_management: createContextManagementConfig(this.thinkingKeepTurns) }\r\n : {}),\r\n ...(compiled.system ? { system: compiled.system } : {}),\r\n messages: compiled.messages,\r\n ...(compiled.tools && compiled.tools.length > 0 ? { tools: compiled.tools } : {}),\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text();\r\n throw new Error(`Anthropic API error ${response.status}: ${errorText}`);\r\n }\r\n\r\n const contentType = response.headers.get('content-type') || '';\r\n if (contentType.includes('application/json')) {\r\n const payload = await response.json() as AnthropicCompatErrorPayload;\r\n if (isCompatErrorPayload(payload)) {\r\n throw new Error(`Anthropic-compatible API error ${payload.code ?? 'unknown'}: ${payload.msg ?? payload.message ?? 'unknown error'}`);\r\n }\r\n throw new Error(`Anthropic streaming expected SSE but received JSON: ${JSON.stringify(payload)}`);\r\n }\r\n\r\n if (!response.body) {\r\n throw new Error('Anthropic API returned an empty response body');\r\n }\r\n\r\n return readAnthropicStream(response.body);\r\n }\r\n}\r\n\r\nfunction resolveAnthropicMessagesUrl(baseUrl: string): string {\r\n const normalized = baseUrl.replace(/\\/+$/, '');\r\n if (/\\/v\\d+$/i.test(normalized)) {\r\n return `${normalized}/messages`;\r\n }\r\n return `${normalized}/v1/messages`;\r\n}\r\n\r\nfunction isCompatErrorPayload(payload: AnthropicCompatErrorPayload): boolean {\r\n if (payload.success === false) return true;\r\n if (typeof payload.code === 'number' && payload.code !== 0) return true;\r\n return false;\r\n}\r\n\r\nfunction shouldUseContextManagement(thinkingBudgetTokens?: number, thinkingKeepTurns?: number): boolean {\r\n return !!thinkingBudgetTokens && thinkingBudgetTokens >= 1024 && (thinkingKeepTurns ?? DEFAULT_THINKING_KEEP_TURNS) > 0;\r\n}\r\n\r\nfunction createContextManagementConfig(keepTurns: number): AnthropicContextManagementConfig {\r\n return {\r\n edits: [\r\n {\r\n type: 'clear_thinking_20251015',\r\n keep: {\r\n type: 'thinking_turns',\r\n value: keepTurns,\r\n },\r\n },\r\n ],\r\n };\r\n}\r\n\r\nexport function compileContextForAnthropic(messages: Message[], tools: Tool[]): CompiledAnthropicRequest {\r\n const systemBlocks: AnthropicTextBlock[] = [];\r\n const compiledMessages: AnthropicRequestMessage[] = [];\r\n let seenFirstUser = false;\r\n let pendingUserBlocks: AnthropicContentBlock[] = [];\r\n\r\n const flushPendingUserBlocks = (): void => {\r\n if (pendingUserBlocks.length === 0) return;\r\n compiledMessages.push({ role: 'user', content: pendingUserBlocks });\r\n pendingUserBlocks = [];\r\n };\r\n\r\n for (const message of messages) {\r\n if (!seenFirstUser && message.role === 'system') {\r\n systemBlocks.push({\r\n type: 'text',\r\n text: message.content,\r\n cache_control: { type: 'ephemeral' },\r\n });\r\n continue;\r\n }\r\n\r\n if (!seenFirstUser && message.role !== 'user') {\r\n throw new Error(`Anthropic compilation requires the first non-system message to be user, got '${message.role}'`);\r\n }\r\n\r\n switch (message.role) {\r\n case 'system':\r\n pendingUserBlocks.push({\r\n type: 'text',\r\n text: wrapReminder(message.content),\r\n });\r\n break;\r\n case 'tool':\r\n pendingUserBlocks.push(toolMessageToAnthropicBlock(message));\r\n break;\r\n case 'user': {\r\n seenFirstUser = true;\r\n const contentBlocks = [...pendingUserBlocks, { type: 'text' as const, text: message.content }];\r\n compiledMessages.push({\r\n role: 'user',\r\n content: contentBlocks.length === 1 ? message.content : contentBlocks,\r\n });\r\n pendingUserBlocks = [];\r\n break;\r\n }\r\n case 'assistant':\r\n flushPendingUserBlocks();\r\n compiledMessages.push({\r\n role: 'assistant',\r\n content: assistantMessageToAnthropicContent(message),\r\n });\r\n break;\r\n default:\r\n throw new Error(`Anthropic compilation does not support message role '${message.role}'`);\r\n }\r\n }\r\n\r\n flushPendingUserBlocks();\r\n\r\n return {\r\n ...(systemBlocks.length > 0 ? { system: systemBlocks } : {}),\r\n messages: compiledMessages,\r\n ...(tools.length > 0 ? { tools: tools.map(toolToAnthropicDefinition) } : {}),\r\n };\r\n}\r\n\r\nfunction wrapReminder(text: string): string {\r\n const trimmed = text.trim();\r\n return /^<reminder[\\s>]/.test(trimmed) ? trimmed : `<reminder>${trimmed}</reminder>`;\r\n}\r\n\r\nfunction toolToAnthropicDefinition(tool: Tool): AnthropicToolDef {\r\n return {\r\n name: tool.name,\r\n description: tool.description,\r\n input_schema: tool.parameters ?? { type: 'object', properties: {} },\r\n };\r\n}\r\n\r\nfunction assistantMessageToAnthropicContent(message: Message): string | AnthropicContentBlock[] {\r\n const blocks: AnthropicContentBlock[] = [];\r\n if (message.thinkingBlocks) {\r\n for (const thinkingBlock of message.thinkingBlocks) {\r\n blocks.push({\r\n type: 'thinking',\r\n thinking: thinkingBlock.thinking,\r\n signature: thinkingBlock.signature,\r\n });\r\n }\r\n }\r\n\r\n if (message.content) {\r\n blocks.push({ type: 'text', text: message.content });\r\n }\r\n\r\n if (message.toolCalls) {\r\n for (const toolCall of message.toolCalls) {\r\n blocks.push({\r\n type: 'tool_use',\r\n id: toolCall.id,\r\n name: toolCall.name,\r\n input: toolCall.arguments,\r\n });\r\n }\r\n }\r\n\r\n if (blocks.length === 0) {\r\n return '';\r\n }\r\n\r\n if (blocks.length === 1 && blocks[0].type === 'text') {\r\n return blocks[0].text;\r\n }\r\n\r\n return blocks;\r\n}\r\n\r\nfunction toolMessageToAnthropicBlock(message: Message): AnthropicToolResultBlock {\r\n if (!message.toolCallId) {\r\n throw new Error('Anthropic compilation requires tool messages to include toolCallId');\r\n }\r\n\r\n const parsed = parseToolPayload(message.content);\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: message.toolCallId,\r\n content: parsed.content,\r\n ...(parsed.isError ? { is_error: true } : {}),\r\n };\r\n}\r\n\r\nfunction parseToolPayload(content: string): { content: string; isError: boolean } {\r\n try {\r\n const parsed = JSON.parse(content) as { success?: boolean; result?: unknown; error?: unknown };\r\n if (parsed && typeof parsed === 'object' && ('result' in parsed || 'error' in parsed || 'success' in parsed)) {\r\n const isError = parsed.success === false || !!parsed.error;\r\n if (isError && typeof parsed.error === 'string' && parsed.error.trim()) {\r\n return { content: parsed.error, isError: true };\r\n }\r\n if (parsed.result !== undefined) {\r\n return { content: stringifyToolValue(parsed.result), isError };\r\n }\r\n return { content, isError };\r\n }\r\n } catch {\r\n // Keep raw tool content if it is not JSON.\r\n }\r\n\r\n return { content, isError: false };\r\n}\r\n\r\nfunction stringifyToolValue(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n return JSON.stringify(value);\r\n}\r\n\r\nasync function readAnthropicStream(body: ReadableStream<Uint8Array>): Promise<LLMResponse> {\r\n const reader = body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n let content = '';\r\n let reasoning = '';\r\n const pendingThinkingBlocks = new Map<number, PendingThinkingBlock>();\r\n let charCount = 0;\r\n let currentPhase: LLMPhase = 'content';\r\n const pendingToolUses = new Map<number, PendingToolUse>();\r\n\r\n // 收集 usage 数据\r\n let usageInfo: UsageInfo | null = null;\r\n\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n let separatorIndex = buffer.indexOf('\\n\\n');\r\n while (separatorIndex >= 0) {\r\n const rawEvent = buffer.slice(0, separatorIndex);\r\n buffer = buffer.slice(separatorIndex + 2);\r\n const event = parseSSEEvent(rawEvent);\r\n if (event) {\r\n applyAnthropicStreamEvent(event, pendingThinkingBlocks, pendingToolUses, (delta) => {\r\n content += delta.content;\r\n reasoning += delta.reasoning;\r\n charCount += delta.charCount;\r\n currentPhase = delta.phase;\r\n }, (usage) => {\r\n // 收集 usage 数据\r\n usageInfo = usage;\r\n });\r\n await emitAnthropicProgress(charCount, currentPhase, pendingToolUses.size);\r\n }\r\n separatorIndex = buffer.indexOf('\\n\\n');\r\n }\r\n }\r\n\r\n if (buffer.trim()) {\r\n const event = parseSSEEvent(buffer);\r\n if (event) {\r\n applyAnthropicStreamEvent(event, pendingThinkingBlocks, pendingToolUses, (delta) => {\r\n content += delta.content;\r\n reasoning += delta.reasoning;\r\n charCount += delta.charCount;\r\n currentPhase = delta.phase;\r\n }, (usage) => {\r\n // 收集 usage 数据\r\n usageInfo = usage;\r\n });\r\n await emitAnthropicProgress(charCount, currentPhase, pendingToolUses.size);\r\n }\r\n }\r\n\r\n const toolCalls = finalizeToolCalls(pendingToolUses);\r\n const thinkingBlocks = finalizeThinkingBlocks(pendingThinkingBlocks);\r\n await emitAnthropicComplete(charCount);\r\n return {\r\n content,\r\n ...(toolCalls.length > 0 ? { toolCalls } : {}),\r\n ...(reasoning ? { reasoning } : {}),\r\n ...(thinkingBlocks.length > 0 ? { thinkingBlocks } : {}),\r\n ...(usageInfo ? { usage: usageInfo } : {}),\r\n };\r\n}\r\n\r\nfunction parseSSEEvent(rawEvent: string): AnthropicStreamEvent | null {\r\n const dataLines = rawEvent\r\n .split(/\\r?\\n/)\r\n .filter(line => line.startsWith('data:'))\r\n .map(line => line.slice(5).trim());\r\n\r\n if (dataLines.length === 0) return null;\r\n const data = dataLines.join('\\n');\r\n if (data === '[DONE]') return null;\r\n\r\n return JSON.parse(data) as AnthropicStreamEvent;\r\n}\r\n\r\nfunction applyAnthropicStreamEvent(\r\n event: AnthropicStreamEvent,\r\n pendingThinkingBlocks: Map<number, PendingThinkingBlock>,\r\n pendingToolUses: Map<number, PendingToolUse>,\r\n append: (delta: { content: string; reasoning: string; charCount: number; phase: LLMPhase }) => void,\r\n onUsage: (usage: UsageInfo) => void,\r\n): void {\r\n switch (event.type) {\r\n case 'content_block_start': {\r\n if (event.content_block?.type === 'thinking' && typeof event.index === 'number') {\r\n pendingThinkingBlocks.set(event.index, {\r\n thinking: event.content_block.thinking || '',\r\n signature: event.content_block.signature || '',\r\n });\r\n }\r\n if (event.content_block?.type === 'tool_use' && typeof event.index === 'number') {\r\n pendingToolUses.set(event.index, {\r\n id: event.content_block.id,\r\n name: event.content_block.name,\r\n inputJson: stringifyInitialInput(event.content_block.input),\r\n });\r\n }\r\n break;\r\n }\r\n case 'content_block_delta': {\r\n const deltaType = event.delta?.type;\r\n if (deltaType === 'text_delta') {\r\n const text = event.delta?.text ?? '';\r\n append({ content: text, reasoning: '', charCount: text.length, phase: 'content' });\r\n } else if (deltaType === 'thinking_delta') {\r\n const thinking = event.delta?.thinking ?? '';\r\n if (typeof event.index === 'number') {\r\n const block = pendingThinkingBlocks.get(event.index) ?? { thinking: '', signature: '' };\r\n block.thinking += thinking;\r\n pendingThinkingBlocks.set(event.index, block);\r\n }\r\n append({ content: '', reasoning: thinking, charCount: thinking.length, phase: 'thinking' });\r\n } else if (deltaType === 'signature_delta' && typeof event.index === 'number') {\r\n const block = pendingThinkingBlocks.get(event.index) ?? { thinking: '', signature: '' };\r\n block.signature += ((event.delta as { signature?: string }).signature ?? '');\r\n pendingThinkingBlocks.set(event.index, block);\r\n } else if (deltaType === 'input_json_delta' && typeof event.index === 'number') {\r\n const toolUse = pendingToolUses.get(event.index);\r\n if (toolUse) {\r\n const partial = event.delta?.partial_json ?? '';\r\n toolUse.inputJson = mergeToolInputJson(toolUse.inputJson, partial);\r\n append({ content: '', reasoning: '', charCount: 0, phase: 'tool_calling' });\r\n }\r\n }\r\n break;\r\n }\n case 'message_start': {\n const usage = event.message?.usage;\n if (usage && (usage.input_tokens !== undefined || usage.output_tokens !== undefined)) {\n onUsage({\n inputTokens: usage.input_tokens || 0,\n outputTokens: usage.output_tokens || 0,\n totalTokens: (usage.input_tokens || 0) + (usage.output_tokens || 0),\n ...(usage.cache_creation_input_tokens ? { cacheCreationTokens: usage.cache_creation_input_tokens } : {}),\n ...(usage.cache_read_input_tokens ? { cacheReadTokens: usage.cache_read_input_tokens } : {}),\n });\n }\n break;\n }\n case 'message_delta': {\n // Anthropic 的 message_delta usage 在事件顶层,不在 delta 里\n const usage = event.usage;\n if (usage && (usage.input_tokens !== undefined || usage.output_tokens !== undefined)) {\n onUsage({\n inputTokens: usage.input_tokens || 0,\n outputTokens: usage.output_tokens || 0,\n totalTokens: (usage.input_tokens || 0) + (usage.output_tokens || 0),\n ...(usage.cache_creation_input_tokens ? { cacheCreationTokens: usage.cache_creation_input_tokens } : {}),\n ...(usage.cache_read_input_tokens ? { cacheReadTokens: usage.cache_read_input_tokens } : {}),\n });\n }\n break;\n }\n default:\r\n break;\r\n }\r\n}\r\n\r\nasync function emitAnthropicProgress(charCount: number, phase: LLMPhase, toolCallCount: number): Promise<void> {\r\n try {\r\n const { emitNotification, createLLMCharCount } = await import('../core/notification.js');\r\n if (charCount > 0 || toolCallCount > 0) {\r\n emitNotification(createLLMCharCount(charCount, phase));\r\n }\r\n } catch {\r\n // Ignore notification failures.\r\n }\r\n}\r\n\r\nasync function emitAnthropicComplete(charCount: number): Promise<void> {\r\n try {\r\n const { emitNotification, createLLMComplete } = await import('../core/notification.js');\r\n emitNotification(createLLMComplete(charCount));\r\n } catch {\r\n // Ignore notification failures.\r\n }\r\n}\r\n\r\nfunction stringifyInitialInput(input: unknown): string {\r\n if (input === undefined) return '';\r\n if (typeof input === 'string') return input;\r\n if (input && typeof input === 'object' && !Array.isArray(input) && Object.keys(input as Record<string, unknown>).length === 0) {\r\n return '';\r\n }\r\n return JSON.stringify(input);\r\n}\r\n\r\nfunction mergeToolInputJson(current: string, partial: string): string {\r\n if (!current.trim()) return partial;\r\n\r\n const currentTrimmed = current.trim();\r\n const partialTrimmed = partial.trim();\r\n if (currentTrimmed === '{}') {\r\n return partial;\r\n }\r\n if (partialTrimmed.startsWith('{') || partialTrimmed.startsWith('[')) {\r\n return partial;\r\n }\r\n return current + partial;\r\n}\r\n\r\nfunction finalizeThinkingBlocks(pendingThinkingBlocks: Map<number, PendingThinkingBlock>): ThinkingBlock[] {\r\n return Array.from(pendingThinkingBlocks.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(([, block]) => ({\r\n signature: block.signature,\r\n thinking: block.thinking,\r\n }))\r\n .filter(block => block.signature.length > 0 && block.thinking.length > 0);\r\n}\r\n\r\nfunction finalizeToolCalls(pendingToolUses: Map<number, PendingToolUse>): ToolCall[] {\r\n return Array.from(pendingToolUses.entries())\r\n .sort((a, b) => a[0] - b[0])\r\n .map(([, toolUse]) => ({\r\n id: toolUse.id,\r\n name: toolUse.name,\r\n arguments: parseToolInput(toolUse.inputJson),\r\n }));\r\n}\r\n\r\nfunction parseToolInput(inputJson: string): Record<string, any> {\r\n const trimmed = inputJson.trim();\r\n if (!trimmed) return {};\r\n return JSON.parse(trimmed) as Record<string, any>;\r\n}\r\n\r\nexport function createAnthropicLLM(config: AgentConfigFile): AnthropicLLM;\r\nexport function createAnthropicLLM(modelConfig: ModelConfig): AnthropicLLM;\r\nexport function createAnthropicLLM(\r\n apiKey: string,\r\n modelName: string,\r\n baseUrl?: string,\r\n): AnthropicLLM;\r\nexport function createAnthropicLLM(\r\n configOrApiKey: AgentConfigFile | ModelConfig | string,\r\n modelName?: string,\r\n baseUrl?: string,\r\n): AnthropicLLM {\r\n if (typeof configOrApiKey === 'object' && 'defaultModel' in configOrApiKey) {\r\n return new AnthropicLLM(\r\n configOrApiKey.defaultModel.apiKey,\r\n configOrApiKey.defaultModel.model,\r\n configOrApiKey.defaultModel.baseUrl,\r\n configOrApiKey.defaultModel.maxTokens ?? DEFAULT_MAX_TOKENS,\r\n configOrApiKey.defaultModel.thinkingBudgetTokens,\r\n configOrApiKey.defaultModel.thinkingKeepTurns ?? DEFAULT_THINKING_KEEP_TURNS,\r\n );\r\n }\r\n\r\n if (typeof configOrApiKey === 'object') {\r\n return new AnthropicLLM(\r\n configOrApiKey.apiKey,\r\n configOrApiKey.model,\r\n configOrApiKey.baseUrl,\r\n configOrApiKey.maxTokens ?? DEFAULT_MAX_TOKENS,\r\n configOrApiKey.thinkingBudgetTokens,\r\n configOrApiKey.thinkingKeepTurns ?? DEFAULT_THINKING_KEEP_TURNS,\r\n );\r\n }\r\n\r\n return new AnthropicLLM(configOrApiKey, modelName!, baseUrl);\r\n}\r\n","/**\r\n * OpenAI LLM 适配器\r\n * 实现 LLMClient 接口\r\n */\r\n\r\nimport type { LLMClient, Message, Tool, LLMResponse, ToolCall, UsageInfo } from '../core/types.js';\r\nimport type { LLMPhase } from '../core/types.js';\r\nimport OpenAI from 'openai';\r\n\r\n// GLM-4.7等模型扩展了OpenAI的响应格式,添加了reasoning_content字段\r\ninterface ExtendedChatCompletionMessage extends OpenAI.Chat.ChatCompletionMessage {\r\n reasoning_content?: string;\r\n}\r\n\r\nexport class OpenAILLM implements LLMClient {\r\n private client: OpenAI;\r\n private modelName: string;\r\n private maxTokens?: number;\r\n private providerOptions?: Record<string, unknown>;\r\n\r\n constructor(\r\n apiKey: string,\r\n modelName: string = 'gpt-4o',\r\n baseUrl?: string,\r\n maxTokens?: number,\r\n providerOptions?: Record<string, unknown>,\r\n ) {\r\n this.client = new OpenAI({\r\n apiKey,\r\n baseURL: baseUrl,\r\n });\r\n this.modelName = modelName;\r\n this.maxTokens = maxTokens;\r\n this.providerOptions = providerOptions;\r\n }\r\n\r\n /**\r\n * 聊天 - 核心方法(内部使用流式处理)\r\n */\r\n async chat(messages: Message[], tools: Tool[]): Promise<LLMResponse> {\r\n // 转换消息格式为 OpenAI 格式\r\n const chatMessages: OpenAI.Chat.ChatCompletionMessageParam[] = messages.map(m => {\r\n const base = { content: m.content };\r\n if (m.role === 'tool') {\r\n return { role: 'tool', content: m.content, tool_call_id: m.toolCallId! };\r\n }\r\n return { role: m.role, ...base };\r\n }) as OpenAI.Chat.ChatCompletionMessageParam[];\r\n\r\n // 转换工具格式\r\n const chatTools = tools.map(t => ({\r\n type: 'function' as const,\r\n function: {\r\n name: t.name,\r\n description: t.description,\r\n parameters: t.parameters,\r\n },\r\n }));\r\n\r\n // ========== 流式处理(内部) ==========\r\n const requestBody = {\n model: this.modelName,\n messages: chatMessages,\n tools: chatTools.length > 0 ? chatTools : undefined,\n stream: true,\n stream_options: { include_usage: true },\n ...(this.maxTokens ? { max_tokens: this.maxTokens } : {}),\n ...(this.providerOptions ?? {}),\n } as OpenAI.Chat.ChatCompletionCreateParamsStreaming;\n\r\n const stream = await this.client.chat.completions.create(requestBody);\r\n\r\n // 累积内容\r\n let content = '';\r\n let reasoning = '';\r\n let currentPhase: LLMPhase = 'content';\r\n let charCount = 0;\r\n\r\n // 累积 tool_calls\r\n // tool_calls 在流中是增量的,需要合并\r\n interface AccumulatedToolCall {\r\n id: string;\r\n name: string;\r\n arguments: string;\r\n }\r\n const accumulatedToolCalls: Map<number, AccumulatedToolCall> = new Map();\r\n\r\n // 收集 usage 数据\r\n let usageInfo: UsageInfo | null = null;\r\n\r\n // 迭代流式响应\n for await (const chunk of stream) {\n // 收集 usage 数据(OpenAI 需要 stream_options.include_usage,且 usage-only 最后一块可能没有 choices)\n if (chunk.usage) {\n const u = chunk.usage;\n const extendedDetails = u as any;\n let reasoningTokens = 0;\n if (extendedDetails.prompt_tokens_details?.reasoning_tokens) {\n reasoningTokens += extendedDetails.prompt_tokens_details.reasoning_tokens;\n }\n if (extendedDetails.completion_tokens_details?.reasoning_tokens) {\n reasoningTokens += extendedDetails.completion_tokens_details.reasoning_tokens;\n }\n\n usageInfo = {\n inputTokens: u.prompt_tokens || 0,\n outputTokens: u.completion_tokens || 0,\n totalTokens: (u.prompt_tokens || 0) + (u.completion_tokens || 0),\n ...(reasoningTokens > 0 ? { reasoningTokens } : {}),\n };\n }\n\n const delta = chunk.choices[0]?.delta;\n if (!delta) {\n continue;\n }\n\r\n // 判断当前阶段并累积内容\r\n // 使用类型断言处理扩展字段 reasoning_content(GLM-4.7 等模型支持)\r\n const rawDelta = delta as { reasoning_content?: string; content?: string | null };\r\n if (rawDelta.reasoning_content) {\r\n currentPhase = 'thinking';\r\n reasoning += rawDelta.reasoning_content;\r\n charCount += rawDelta.reasoning_content.length;\r\n } else if (delta.content) {\r\n currentPhase = 'content';\r\n content += delta.content;\r\n charCount += delta.content.length;\r\n }\r\n\r\n // 处理 tool_calls(增量累积)\r\n if (delta.tool_calls) {\r\n currentPhase = 'tool_calling';\r\n for (const toolCall of delta.tool_calls) {\r\n const index = toolCall.index;\r\n if (index === undefined) continue;\r\n\r\n if (!accumulatedToolCalls.has(index)) {\r\n accumulatedToolCalls.set(index, {\r\n id: toolCall.id || '',\r\n name: toolCall.function?.name || '',\r\n arguments: toolCall.function?.arguments || '',\r\n });\r\n } else {\r\n const accumulated = accumulatedToolCalls.get(index)!;\r\n if (toolCall.id) accumulated.id = toolCall.id;\r\n if (toolCall.function?.name) accumulated.name += toolCall.function.name;\r\n if (toolCall.function?.arguments) accumulated.arguments += toolCall.function.arguments;\r\n }\r\n }\r\n }\r\n\r\n // 发送字符计数通知(每 100ms 最多一次,由 emitNotification 节流)\r\n try {\r\n const { emitNotification, createLLMCharCount } = await import('../core/notification.js');\r\n if (charCount > 0 || accumulatedToolCalls.size > 0) {\r\n emitNotification(createLLMCharCount(charCount, currentPhase));\r\n }\r\n } catch {\r\n // 通知模块不可用,忽略\r\n }\r\n\r\n // 检查是否完成\n if (chunk.choices[0]?.finish_reason) {\n break;\n }\n }\r\n\r\n // 构建最终的 tool_calls 数组\r\n let toolCalls: ToolCall[] | undefined;\r\n if (accumulatedToolCalls.size > 0) {\r\n toolCalls = Array.from(accumulatedToolCalls.values()).map(tc => ({\r\n id: tc.id,\r\n name: tc.name,\r\n arguments: JSON.parse(tc.arguments),\r\n }));\r\n }\r\n\r\n return {\r\n content,\r\n toolCalls,\r\n reasoning,\r\n ...(usageInfo ? { usage: usageInfo } : {}),\r\n };\r\n }\r\n}\r\n\r\nimport type { ModelConfig, AgentConfigFile } from '../core/config.js';\r\n\r\n/**\r\n * 从配置创建 OpenAI LLM 实例\r\n *\r\n * @example\r\n * // 方式1:传入配置文件对象(推荐)\r\n * const llm = createOpenAILLM(config);\r\n *\r\n * @example\r\n * // 方式2:传入模型配置\r\n * const llm = createOpenAILLM(config.defaultModel);\r\n *\r\n * @example\r\n * // 方式3:单独传参\r\n * const llm = createOpenAILLM(apiKey, 'gpt-4o', baseUrl);\r\n *\r\n * @example\r\n * // 方式4:自定义配置\r\n * const llm = createOpenAILLM({ apiKey: 'xxx', model: 'gpt-4o' });\r\n */\r\nexport function createOpenAILLM(config: AgentConfigFile): OpenAILLM;\r\nexport function createOpenAILLM(modelConfig: ModelConfig): OpenAILLM;\r\nexport function createOpenAILLM(\r\n apiKey: string,\r\n modelName: string,\r\n baseUrl?: string\r\n): OpenAILLM;\r\nexport function createOpenAILLM(\r\n configOrApiKey: AgentConfigFile | ModelConfig | string,\r\n modelName?: string,\r\n baseUrl?: string\r\n): OpenAILLM {\r\n // 处理 AgentConfigFile\r\n if (typeof configOrApiKey === 'object' && 'defaultModel' in configOrApiKey) {\r\n return new OpenAILLM(\r\n configOrApiKey.defaultModel.apiKey,\r\n configOrApiKey.defaultModel.model,\r\n configOrApiKey.defaultModel.baseUrl,\r\n configOrApiKey.defaultModel.maxTokens,\r\n configOrApiKey.defaultModel.providerOptions,\r\n );\r\n }\r\n // 处理 ModelConfig\r\n if (typeof configOrApiKey === 'object') {\r\n return new OpenAILLM(\r\n configOrApiKey.apiKey,\r\n configOrApiKey.model,\r\n configOrApiKey.baseUrl,\r\n configOrApiKey.maxTokens,\r\n configOrApiKey.providerOptions,\r\n );\r\n }\r\n // 处理单独传参\r\n return new OpenAILLM(configOrApiKey, modelName!, baseUrl);\r\n}\r\n","import type { AgentConfigFile, ModelConfig } from '../core/config.js';\r\nimport type { LLMClient } from '../core/types.js';\r\nimport { createAnthropicLLM } from './anthropic.js';\r\nimport { createOpenAILLM } from './openai.js';\r\n\r\nexport { AnthropicLLM, compileContextForAnthropic, createAnthropicLLM } from './anthropic.js';\r\nexport { OpenAILLM, createOpenAILLM } from './openai.js';\r\n\r\nexport function createLLM(config: AgentConfigFile): LLMClient;\r\nexport function createLLM(modelConfig: ModelConfig): LLMClient;\r\nexport function createLLM(\r\n apiKey: string,\r\n modelName: string,\r\n provider?: string,\r\n baseUrl?: string,\r\n): LLMClient;\r\nexport function createLLM(\r\n configOrApiKey: AgentConfigFile | ModelConfig | string,\r\n modelName?: string,\r\n provider?: string,\r\n baseUrl?: string,\r\n): LLMClient {\r\n if (typeof configOrApiKey === 'string') {\r\n return provider === 'anthropic'\r\n ? createAnthropicLLM(configOrApiKey, modelName!, baseUrl)\r\n : createOpenAILLM(configOrApiKey, modelName!, baseUrl);\r\n }\r\n\r\n if ('defaultModel' in configOrApiKey) {\r\n switch (configOrApiKey.defaultModel.provider) {\r\n case 'anthropic':\r\n return createAnthropicLLM(configOrApiKey);\r\n case 'openai':\r\n default:\r\n return createOpenAILLM(configOrApiKey);\r\n }\r\n }\r\n\r\n switch (configOrApiKey.provider) {\r\n case 'anthropic':\r\n return createAnthropicLLM(configOrApiKey);\r\n case 'openai':\r\n default:\r\n return createOpenAILLM(configOrApiKey);\r\n }\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 * 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\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 /**\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\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 } : undefined;\n }\n\n /**\n * 获取所有 Call 的用量汇总\n */\n getAllCallUsage(): CallUsageSummary[] {\n return Array.from(this.currentCallUsage.values()).map(s => ({ ...s }));\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 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 };\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 // 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 }\n}\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 { TemplateLoader } from '../../template/loader.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\r\n // 回调函数:从 SkillFeature 获取 skills\r\n private getSkills: () => any[];\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 getSkills: () => any[]\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.getSkills = getSkills;\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 async resolve(): Promise<string> {\r\n // 从 SkillFeature 获取 skills(通过回调)\r\n const skills = this.getSkills();\r\n\r\n // 使用用户设置的上下文,并注入 skills\r\n const context: PlaceholderContext = {\r\n ...this.systemContext,\r\n skills: skills as any,\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 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","/**\r\n * 工具执行器\r\n *\r\n * 封装单个工具的执行逻辑\r\n */\r\n\r\nimport type { ToolCall, Message } from '../types.js';\r\nimport type { ToolRegistry } from '../tool.js';\r\nimport type { Context } from '../context.js';\r\nimport type { ContextInjector } from '../feature.js';\r\nimport type { ToolContext, ToolResult, HookResult, ToolFinishedDecisionContext } from '../lifecycle.js';\r\nimport type { ToolExecResult } from '../context.js';\nimport type { HooksRegistry } from '../hooks-registry.js';\nimport { CoreLifecycle, normalizeDecision, Decision } from '../lifecycle.js';\nimport { createLogger, runWithLogScope } from '../logging.js';\n\nconst logger = createLogger('agent.tool');\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 * 执行单个工具\r\n */\r\n async execute(\n call: ToolCall,\n input: string,\r\n context: Context,\r\n step: number,\r\n callIndex: number // 用户交互序号\r\n ): Promise<void> {\n return await runWithLogScope({\n step,\n toolName: call.name,\n toolCallId: call.id,\n feature: this.tools.getSource(call.name),\n namespace: 'agent.tool',\n tags: [\n 'tool',\n `tool:${call.name}`,\n ...(this.tools.getSource(call.name) ? [`feature:${this.tools.getSource(call.name)}`] : []),\n ],\n }, async () => {\n const tool = this.tools.get(call.name);\n const startTime = Date.now();\n\n const toolCtx: ToolContext = {\n call,\n tool: tool!,\n step,\n input,\n context,\n };\n\n logger.info('Tool execution scheduled', {\n toolName: call.name,\n arguments: call.arguments,\n step,\n });\n\n // ========== ToolUse 正向钩子 ==========\n let blocked = false;\n let blockReason: string | undefined;\n\n const hookResult = await this.executeHookFn(\n 'onToolUse',\n () => this.onToolUseFn(toolCtx),\n { input, step }\n );\n\n if (hookResult) {\n if (hookResult.action === 'block') {\n blocked = true;\n blockReason = hookResult.reason;\n }\n // action: 'allow' 或 undefined 都放行\n }\n\n // ========== ToolUse 反向钩子(流程控制)==========\n const useDecisionResult = await this.hooksRegistry.executeDecision(CoreLifecycle.ToolUse, toolCtx);\n const useDecision = normalizeDecision(useDecisionResult);\n\n // 处理反向钩子的决策\n if (useDecision === Decision.Deny) {\n blocked = true;\n blockReason = typeof useDecisionResult === 'object' && useDecisionResult.reason\n ? useDecisionResult.reason\n : 'Tool blocked by reverse hook';\n }\n\n const result: ToolResult = {\n success: false,\n data: null,\n error: blockReason || (tool ? undefined : `Tool \"${call.name}\" not found`),\n duration: Date.now() - startTime,\n call,\n tool: tool!,\n step,\n input,\n context,\n };\n\n if (blocked || !tool) {\n logger.warn('Tool execution blocked', {\n toolName: call.name,\n reason: result.error,\n });\n\n // 添加阻止结果到上下文\n const errorResult: ToolExecResult = {\n success: false,\n result: { error: result.error || 'Tool not found' },\n };\n context.addToolMessage(call, errorResult, callIndex);\n\n // ========== ToolFinished 正向钩子 ==========\n await this.executeHookFn(\n 'onToolFinished',\n () => this.onToolFinishedFn(result),\n { input, step }\n );\n\n // ========== ToolFinished 反向钩子(纯通知)==========\n const decisionCtx: ToolFinishedDecisionContext = {\n ...result,\n toolName: call.name,\n };\n await this.hooksRegistry.executeVoid(CoreLifecycle.ToolFinished, decisionCtx);\n\n return;\n }\n\n try {\n // 执行工具\n // 使用声明的上下文注入器\n let toolContext: any = undefined;\n\n for (const { pattern, injector } of this.contextInjectors) {\n if (typeof pattern === 'string' && pattern === call.name) {\n toolContext = { ...toolContext, ...injector(call) };\n } else if (pattern instanceof RegExp && pattern.test(call.name)) {\n toolContext = { ...toolContext, ...injector(call) };\n }\n }\n\n const data = await tool.execute(call.arguments, toolContext);\n result.success = true;\n result.data = data;\n\n // 添加工具结果到上下文\n const successResult: ToolExecResult = {\n success: true,\n result: typeof data === 'string' ? data : JSON.stringify(data),\n };\n context.addToolMessage(call, successResult, callIndex);\n\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n\n // 添加错误结果到上下文\n const failResult: ToolExecResult = {\n success: false,\n result: { error: result.error },\n };\n context.addToolMessage(call, failResult, callIndex);\n }\n\n result.duration = Date.now() - startTime;\n\n // ========== ToolFinished 正向钩子 ==========\n await this.executeHookFn(\n 'onToolFinished',\n () => this.onToolFinishedFn(result),\n { input, step }\n );\n\n // ========== ToolFinished 反向钩子(纯通知)==========\n const decisionCtx: ToolFinishedDecisionContext = {\n ...result,\n toolName: call.name,\n };\n await this.hooksRegistry.executeVoid(CoreLifecycle.ToolFinished, decisionCtx);\n\n if (result.success) {\n logger.info('Tool execution completed', {\n toolName: call.name,\n duration: result.duration,\n });\n } else {\n logger.error('Tool execution failed', {\n toolName: call.name,\n duration: result.duration,\n error: result.error,\n });\n }\n });\n }\n}\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 { ToolRegistry } from '../tool.js';\r\nimport type { ToolCall, LLMResponse, Message, UsageInfo } from '../types.js';\r\nimport type { ToolResult, HookResult, StepFinishDecisionContext } 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 { CoreLifecycle, Decision, normalizeDecision } from '../lifecycle.js';\r\nimport { createStepCheckpoint, rollbackToStepCheckpoint } from '../checkpoint.js';\r\nimport { createLogger, runWithLogScope } from '../logging.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 },\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<void>,\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 * 执行完整的 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 }): Promise<ReActResult> {\r\n const { isFirstCall, callIndex } = options;\r\n\r\n // ========== ReAct 循环 ==========\r\n let completed = false;\r\n let finalResponse = '';\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 // 推送消息到 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 }),\r\n { input, step }\r\n );\r\n\r\n // 执行反向钩子 @StepStart(void 返回,仅做处理)\r\n await this.hooksRegistry.executeVoid(CoreLifecycle.StepStart, { step, callIndex, context, input });\r\n\r\n // 执行 LLM 调用\r\n const llmStartTime = Date.now();\r\n const 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 ));\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 });\r\n\r\n // 收集用量数据\r\n if (response.usage) {\r\n this.agent.recordUsage(callIndex, step, response.usage);\r\n }\r\n\r\n // 添加助手响应\r\n context.addAssistantMessage(response, callIndex);\r\n\r\n // 推送消息到 DebugHub\r\n this.pushToDebug(context.getAll());\r\n\r\n // 检查是否需要调用工具\r\n const hasToolCalls = response.toolCalls && response.toolCalls.length > 0;\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 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 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 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 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 };\r\n }\r\n\r\n // 执行工具\r\n let waitCalled = false;\r\n for (const call of response.toolCalls) {\r\n if (call.name === 'wait') {\r\n waitCalled = true;\r\n }\r\n await this.executeToolFn(call, input, context, step, callIndex);\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 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 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 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 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 (error) {\r\n await rollbackToStepCheckpoint(checkpoint, context, this.agent.features);\r\n this.pushToDebug(context.getAll());\r\n logger.warn('Step rolled back after failure', {\r\n step,\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n });\r\n\r\n if (stepResult === 'break') {\r\n break;\r\n }\r\n if (stepResult === 'continue') {\r\n continue outerLoop;\r\n }\r\n if (typeof stepResult === 'object') {\r\n return stepResult;\r\n }\r\n }\r\n\r\n // 达到最大步数 - 中断处理\r\n if (!completed) {\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: 'max_steps_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 };\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","/**\n * 反向钩子注册表\n *\n * 管理反向钩子的注册、发现和执行\n */\n\nimport type { AgentFeature } from './feature.js';\nimport { CoreLifecycle, Decision, DecisionResult, normalizeDecision } from './lifecycle.js';\nimport { getDecoratorMetadata } from './hooks-decorator.js';\nimport type { DecisionContext, HookLifecycleSnapshot } from './types.js';\nimport { createLogger, runWithLogScope } from './logging.js';\n\nconst logger = createLogger('agent.reverse-hook');\n\n/**\n * 钩子执行结果\n */\nexport interface HookExecutionResult {\n /** 是否有钩子被处理 */\n handled: boolean;\n /** 决策结果(仅当有流程控制能力时) */\n decision?: Decision;\n /** 拒绝原因(如果被拒绝) */\n reason?: string;\n /** 附加元数据 */\n metadata?: Record<string, any>;\n}\n\n/**\n * 钩子注册表\n *\n * 管理所有 Feature 的反向钩子\n */\nexport class HooksRegistry {\n /** 生命周期 → Feature 映射 → 方法名 */\n private hooks = new Map<CoreLifecycle, Array<{\n feature: AgentFeature;\n methodName: string;\n source?: { file?: string; line?: number; column?: number; display: string };\n }>>();\n\n /**\n * 从 Feature 收集反向钩子\n *\n * @param feature Feature 实例\n */\n collectFromFeature(feature: AgentFeature): void {\n const metadata = getDecoratorMetadata(feature);\n\n for (const [lifecycle, methodNameOrList] of metadata.hookDecisions.entries()) {\n if (!this.hooks.has(lifecycle)) {\n this.hooks.set(lifecycle, []);\n }\n const hookList = this.hooks.get(lifecycle)!;\n\n // 支持多个方法(用逗号分隔)\n const methodNames = methodNameOrList.split(',');\n for (const methodName of methodNames) {\n const trimmed = methodName.trim();\n hookList.push({\n feature,\n methodName: trimmed,\n source: metadata.hookSources.get(`${lifecycle}:${trimmed}`),\n });\n }\n }\n }\n\n /**\n * 移除 Feature 的所有钩子\n *\n * @param feature Feature 实例\n */\n removeFromFeature(feature: AgentFeature): void {\n for (const hooks of this.hooks.values()) {\n // 过滤掉属于该 Feature 的所有钩子\n const filtered = hooks.filter(h => h.feature !== feature);\n hooks.length = 0;\n hooks.push(...filtered);\n }\n }\n\n /**\n * 检查是否有指定的钩子\n *\n * @param lifecycle 生命周期类型\n * @returns 是否存在钩子\n */\n has(lifecycle: CoreLifecycle): boolean {\n const hooks = this.hooks.get(lifecycle);\n return hooks !== undefined && hooks.length > 0;\n }\n\n /**\n * 获取指定生命周期的所有钩子\n *\n * @param lifecycle 生命周期类型\n * @returns 钩子列表\n */\n get(lifecycle: CoreLifecycle): Array<{\n feature: AgentFeature;\n methodName: string;\n source?: { file?: string; line?: number; column?: number; display: string };\n }> {\n return this.hooks.get(lifecycle) || [];\n }\n\n getSnapshot(): HookLifecycleSnapshot[] {\n return Object.values(CoreLifecycle).map((lifecycle) => {\n const entries = (this.hooks.get(lifecycle) || []).map((hook, index) => ({\n order: index + 1,\n featureName: hook.feature.name,\n methodName: hook.methodName,\n lifecycle,\n kind: lifecycle === CoreLifecycle.StepFinish || lifecycle === CoreLifecycle.ToolUse\n ? 'decision' as const\n : 'notify' as const,\n source: hook.source,\n description: typeof (hook.feature as any).getHookDescription === 'function'\n ? (hook.feature as any).getHookDescription(lifecycle, hook.methodName)\n : undefined,\n }));\n\n return {\n lifecycle,\n kind: lifecycle === CoreLifecycle.StepFinish || lifecycle === CoreLifecycle.ToolUse\n ? 'decision' as const\n : 'notify' as const,\n entries,\n };\n });\n }\n\n /**\n * 执行指定生命周期的所有反向钩子\n *\n * @param lifecycle 生命周期类型\n * @param context 决策上下文\n * @returns 执行结果\n */\n async execute(lifecycle: CoreLifecycle, context: DecisionContext): Promise<HookExecutionResult> {\n const hooks = this.hooks.get(lifecycle);\n\n if (!hooks || hooks.length === 0) {\n return { handled: false };\n }\n\n // 按顺序执行所有钩子\n for (const { feature, methodName, source } of hooks) {\n try {\n const method = (feature as any)[methodName];\n if (typeof method !== 'function') {\n console.warn(\n `[HooksRegistry] 钩子方法 ${methodName} 在 Feature ${feature.name} 中不存在`\n );\n continue;\n }\n\n const result = await runWithLogScope({\n feature: feature.name,\n lifecycle,\n hookMethod: methodName,\n hookKind: 'reverse',\n sourceFile: source?.file,\n sourceLine: source?.line,\n namespace: 'agent.reverse-hook',\n tags: [\n 'reverse-hook',\n `feature:${feature.name}`,\n `hook:${lifecycle}`,\n `hook-method:${methodName}`,\n ],\n }, async () => await method.call(feature, context));\n\n // 处理返回值\n if (result !== undefined) {\n const decision = normalizeDecision(result);\n\n // 如果返回 Approve 或 Deny,立即停止并返回\n if (decision === Decision.Approve || decision === Decision.Deny) {\n logger.info('Reverse hook decided flow', {\n feature: feature.name,\n lifecycle,\n methodName,\n decision,\n });\n return {\n handled: true,\n decision,\n reason: typeof result === 'object' && result.reason ? result.reason : undefined,\n metadata: typeof result === 'object' && result.metadata ? result.metadata : undefined,\n };\n }\n\n // Continue 继续下一个钩子\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('Reverse hook execution failed', {\n feature: feature.name,\n lifecycle,\n methodName,\n message,\n });\n console.error(\n `[HooksRegistry] 执行钩子 ${CoreLifecycle[lifecycle]}#${methodName} 时出错: ${message}`\n );\n // 继续执行下一个钩子\n }\n }\n\n // 所有钩子都返回 Continue 或没有明确返回值\n return { handled: true, decision: Decision.Continue };\n }\n\n /**\n * 执行有流程控制能力的钩子(返回 DecisionResult)\n *\n * @param lifecycle 生命周期类型\n * @param context 决策上下文\n * @returns 决策结果\n */\n async executeDecision(\n lifecycle: CoreLifecycle,\n context: DecisionContext\n ): Promise<DecisionResult> {\n const result = await this.execute(lifecycle, context);\n\n if (!result.handled) {\n return Decision.Continue;\n }\n\n if (result.decision === Decision.Approve) {\n return { action: Decision.Approve, reason: result.reason, metadata: result.metadata };\n }\n\n if (result.decision === Decision.Deny) {\n return { action: Decision.Deny, reason: result.reason, metadata: result.metadata };\n }\n\n return Decision.Continue;\n }\n\n /**\n * 执行无流程控制能力的钩子(返回 void)\n *\n * @param lifecycle 生命周期类型\n * @param context 决策上下文\n */\n async executeVoid(lifecycle: CoreLifecycle, context: DecisionContext): Promise<void> {\n await this.execute(lifecycle, context);\n }\n\n /**\n * 清空所有钩子\n */\n clear(): void {\n this.hooks.clear();\n }\n}\n\n// ========== 工具函数 ==========\n\n/**\n * 创建全局钩子注册表\n */\nexport function createHooksRegistry(): HooksRegistry {\n return new HooksRegistry();\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 } 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, ContextSnapshot } from './context.js';\r\nimport { DebugHub } from './debug-hub.js';\r\nimport { createLogger, installConsoleBridge, runWithLogScope } from './logging.js';\r\nimport { captureFeatureSnapshots, restoreFeatureSnapshots } from './checkpoint.js';\r\nimport { getDefaultSessionStore, type AgentRuntimeSnapshot, type AgentSessionSnapshot, type SessionStore, type CallRollbackSnapshot } from './session-store.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 { TemplateLoader } from '../template/loader.js';\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 { 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 } 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\ntype CallRollbackCheckpoint = CallRollbackSnapshot;\r\n\r\n// 基础类(不含生命周期钩子)\r\nclass AgentBase {\r\n protected readonly logger = createLogger('agent.runtime');\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 protected 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 // 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\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\r\n // 用量统计\r\n protected usageStats: UsageStats = new UsageStats();\r\n\r\n // 用户输入缓存(用于 Feature 修改待注入的输入内容)\r\n private _pendingInput: string | null = null;\r\n\r\n // 模块实例(延迟初始化)\r\n private templateResolver?: TemplateResolver;\r\n private toolExecutor?: ToolExecutor;\r\n private reactRunner?: ReActLoopRunner;\r\n\r\n constructor(config: AgentConfig) {\r\n installConsoleBridge();\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 () => {\r\n // 回调:从 SkillFeature 获取 skills\r\n const skillFeature = this.features.get('skill') as any;\r\n return skillFeature?.getSkills ? skillFeature.getSkills() : [];\r\n }\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 // ========== 钩子错误处理策略 ==========\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 * 唯一的公开入口 - 执行 Agent\r\n */\r\n async onCall(input: string): Promise<string> {\r\n // 确保 Feature 工具已注册\r\n await this.ensureFeatureTools();\r\n\r\n // 设置通知上下文\r\n try {\r\n const { _setNotificationAgent } = await import('./notification.js');\r\n _setNotificationAgent(this.agentId!);\r\n } catch {\r\n // 通知模块不可用,忽略\r\n }\r\n\r\n // ========== Call Start ==========\r\n const context = this.persistentContext ?? new 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 // 递增 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 await 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 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 const preCallRuntime = await this.captureRuntimeSnapshot(context, this._callIndex - 1);\r\n\r\n // ========== CallStart 反向钩子 ==========\r\n // 在系统提示词之后、用户输入之前调用,确保 Feature 可以正确注入消息\r\n\r\n // 设置输入缓存(Feature 可以在钩子中通过 setUserInput 修改)\r\n this._pendingInput = input;\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 // 添加用户输入(使用可能被 Feature 修改过的缓存)\r\n const finalInput = this._pendingInput ?? input;\r\n context.addUserMessage(finalInput, this._callIndex);\r\n this.pushToDebug(context.getAll());\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 });\r\n\r\n // 保存上下文\r\n this.persistentContext = context;\r\n this.commitCallCheckpoint({\r\n callIndex: this._callIndex,\r\n draftInput: finalInput,\r\n runtime: preCallRuntime,\r\n });\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 }),\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 });\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 result.finalResponse;\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 // 如果是子代理,报告错误中断给父代理\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 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 }),\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 });\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 // 清除通知上下文\r\n try {\r\n const { _clearNotificationAgent } = await import('./notification.js');\r\n _clearNotificationAgent();\r\n } catch {\r\n // 通知模块不可用,忽略\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 启用可视化查看器\r\n */\r\n async withViewer(name?: string, port?: number, openBrowser?: boolean): Promise<this> {\r\n this.debugHub = DebugHub.getInstance();\r\n this.debugEnabled = true;\r\n\r\n if (!this.debugHub.getCurrentAgentId()) {\r\n await this.debugHub.start(port, openBrowser);\r\n }\r\n\r\n // 确保 Feature 工具已注册(包括 SubAgentFeature 等提供的工具)\r\n await this.ensureFeatureTools();\r\n\r\n // 收集 Feature 模板信息(使用新的统一方式)\r\n const featureTemplates: Record<string, string> = {};\r\n\r\n for (const feature of this.features.values()) {\r\n // 使用 getPackageInfo() + getTemplateNames() 方式\r\n if (feature.getPackageInfo && feature.getTemplateNames) {\r\n const pkgInfo = feature.getPackageInfo();\r\n const templateNames = feature.getTemplateNames();\r\n\r\n if (pkgInfo && templateNames.length > 0) {\r\n for (const templateName of templateNames) {\r\n // 构建统一的 URL 格式\r\n // 独立 npm 包(@agentdev/*)不包含 feature.name,因为一个包只有一个 feature\r\n // 内置 feature 使用 /template/{packageName}/{featureName}/{templateName}.render.js\r\n const isStandalonePackage = pkgInfo.name.startsWith('@agentdev/') && pkgInfo.name !== 'agentdev';\r\n const url = isStandalonePackage\r\n ? `/template/${pkgInfo.name}/${templateName}.render.js`\r\n : `/template/${pkgInfo.name}/${feature.name}/${templateName}.render.js`;\r\n featureTemplates[templateName] = url;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.agentId = this.debugHub.registerAgent(\r\n this,\r\n name || this.constructor.name,\r\n featureTemplates,\r\n this.buildHookInspectorSnapshot(),\r\n this.buildOverviewSnapshot()\r\n );\r\n this.syncRegisteredToolsToDebug();\r\n this.pushInspectorSnapshot();\r\n if (this.persistentContext) {\r\n this.pushToDebug(this.persistentContext.getAll());\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: 1,\r\n sessionId,\r\n savedAt: Date.now(),\r\n agentType: this.constructor.name,\r\n runtime,\r\n rollbackHistory: this._callCheckpoints.map(entry => ({\r\n callIndex: entry.callIndex,\r\n draftInput: entry.draftInput,\r\n runtime: { ...entry.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 this._callCheckpoints = normalized.rollbackHistory.map(entry => ({\r\n callIndex: entry.callIndex,\r\n draftInput: entry.draftInput,\r\n runtime: entry.runtime,\r\n }));\r\n\r\n return this;\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 await this.restoreRuntimeSnapshot(checkpoint.runtime);\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 * 保存会话到持久化存储\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 * 从持久化存储加载会话\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._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 * 创建 Agent 实例(子类可覆盖)\r\n */\r\n public async createAgentByType(type: string): Promise<AgentBase> {\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 // 触发 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({ agentId: this.agentId || '', config: this.config });\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 }\r\n\r\n // 重置状态\r\n this._initialized = false;\r\n this.persistentContext = undefined;\r\n this._callCheckpoints = [];\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 的所有工具\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 console.log(`[Agent] 已启用 Feature '${featureName}' 的 ${count} 个工具`);\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 console.log(`[Agent] 已禁用 Feature '${featureName}' 的 ${count} 个工具`);\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 * 确保 Feature 工具已注册\r\n */\r\n private async ensureFeatureTools(): Promise<void> {\r\n if (this.featureToolsReady) return;\r\n\r\n for (const [name, feature] of this.features) {\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 };\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 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 console.warn(`[Agent] Feature ${name} onInitiate failed: ${errorMsg}`);\r\n }\r\n }\r\n\r\n // 收集反向钩子\r\n this.hooksRegistry.collectFromFeature(feature);\r\n }\r\n\r\n this.featureToolsReady = true;\r\n this.pushInspectorSnapshot();\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 },\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 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 };\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\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 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 };\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 toolEntriesByFeature = new Map<string, Array<{\r\n name: string;\r\n description: string;\r\n enabled: boolean;\r\n renderCall?: string;\r\n renderResult?: string;\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 if (!entry.source) continue;\r\n if (!toolEntriesByFeature.has(entry.source)) {\r\n toolEntriesByFeature.set(entry.source, []);\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 toolEntriesByFeature.get(entry.source)!.push({\r\n name: entry.tool.name,\r\n description: summarizeToolDescription(entry.tool.description),\r\n enabled: entry.enabled,\r\n renderCall,\r\n renderResult,\r\n });\r\n }\r\n\r\n const features = Array.from(this.features.values()).map(feature => {\r\n const tools = toolEntriesByFeature.get(feature.name) || [];\r\n const enabledToolCount = tools.filter(tool => tool.enabled).length;\r\n const status: 'enabled' | 'disabled' | 'partial' = tools.length === 0\r\n ? 'enabled'\r\n : enabledToolCount === 0\r\n ? 'disabled'\r\n : enabledToolCount === tools.length\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 return {\r\n lifecycleOrder: hookGroups.map(group => group.lifecycle),\r\n features,\r\n hooks: hookGroups,\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"],"mappings":"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","names":["readFile","resolve","error","cwd","path","content","CoreLifecycle","fileURLToPath","dirname","join","existsSync","existsSync","readFileSync","cwd","join","resolve","serverId","MCPConnectionState","resolve","response","tools","fileURLToPath","dirname","__filename","fileURLToPath","dirname","readdir","readFile","resolve","isAbsolute","join","existsSync","path","stat","cwd","fileURLToPath","dirname","readFile","dirname","normalize","readFile","normalize","dirname","resolve","isAbsolute","cwd","__filename","fileURLToPath","__dirname","dirname","isAbsolute","resolve","cwd","resolver","resolve","fileURLToPath","dirname","__filename","fileURLToPath","__dirname","dirname","fileURLToPath","dirname","readFile","__filename","fileURLToPath","__dirname","dirname","readFile","fileURLToPath","fileURLToPath","fileURLToPath","resolve","readFile","writeFile","readdir","spawn","limit","offset","start","truncated","_","dirPath","resolve","__filename","fileURLToPath","resolve","fileURLToPath","dirname","__filename","fileURLToPath","__dirname","dirname","readFile","readdir","readFileSync","existsSync","resolve","join","cwd","projectRoot","PlaceholderResolver","decisionCtx","logger","stepFinishResult","stepFinishDecisionCtx","stepFinishDecision","logger"]}