hyacinth-ai 0.9.6

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 (704) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +205 -0
  3. package/commands.json +25 -0
  4. package/dist/agents/builtins.d.ts +8 -0
  5. package/dist/agents/builtins.js +50 -0
  6. package/dist/agents/config-loader.d.ts +15 -0
  7. package/dist/agents/config-loader.js +75 -0
  8. package/dist/agents/delegate-tool.d.ts +109 -0
  9. package/dist/agents/delegate-tool.js +407 -0
  10. package/dist/agents/index.d.ts +5 -0
  11. package/dist/agents/index.js +5 -0
  12. package/dist/agents/registry.d.ts +2 -0
  13. package/dist/agents/registry.js +2 -0
  14. package/dist/bypass/agents/companion/index.d.ts +57 -0
  15. package/dist/bypass/agents/companion/index.js +487 -0
  16. package/dist/bypass/agents/orchestrator/index.d.ts +17 -0
  17. package/dist/bypass/agents/orchestrator/index.js +414 -0
  18. package/dist/bypass/agents/orchestrator.d.ts +16 -0
  19. package/dist/bypass/agents/orchestrator.js +377 -0
  20. package/dist/bypass/agents/world-engine/agent.d.ts +41 -0
  21. package/dist/bypass/agents/world-engine/agent.js +385 -0
  22. package/dist/bypass/agents/world-engine/index.d.ts +52 -0
  23. package/dist/bypass/agents/world-engine/index.js +198 -0
  24. package/dist/bypass/agents/world-engine/sim.d.ts +14 -0
  25. package/dist/bypass/agents/world-engine/sim.js +120 -0
  26. package/dist/bypass/agents/world-engine/store.d.ts +110 -0
  27. package/dist/bypass/agents/world-engine/store.js +519 -0
  28. package/dist/bypass/agents/world-engine/ticker.d.ts +37 -0
  29. package/dist/bypass/agents/world-engine/ticker.js +214 -0
  30. package/dist/bypass/agents/world-engine/tools.d.ts +6 -0
  31. package/dist/bypass/agents/world-engine/tools.js +380 -0
  32. package/dist/bypass/agents/world-engine/types.d.ts +202 -0
  33. package/dist/bypass/agents/world-engine/types.js +56 -0
  34. package/dist/bypass/agents/world-engine.d.ts +20 -0
  35. package/dist/bypass/agents/world-engine.js +63 -0
  36. package/dist/bypass/base.d.ts +48 -0
  37. package/dist/bypass/base.js +126 -0
  38. package/dist/bypass/index.d.ts +5 -0
  39. package/dist/bypass/index.js +6 -0
  40. package/dist/bypass/manager.d.ts +41 -0
  41. package/dist/bypass/manager.js +179 -0
  42. package/dist/bypass/types.d.ts +63 -0
  43. package/dist/bypass/types.js +14 -0
  44. package/dist/channels/auto-detect.d.ts +25 -0
  45. package/dist/channels/auto-detect.js +77 -0
  46. package/dist/channels/builtin/http-webhook.d.ts +25 -0
  47. package/dist/channels/builtin/http-webhook.js +287 -0
  48. package/dist/channels/builtin/tui-channel.d.ts +33 -0
  49. package/dist/channels/builtin/tui-channel.js +61 -0
  50. package/dist/channels/builtin/tui-ws-session.d.ts +16 -0
  51. package/dist/channels/builtin/tui-ws-session.js +90 -0
  52. package/dist/channels/builtin/webui-output-handler.d.ts +30 -0
  53. package/dist/channels/builtin/webui-output-handler.js +93 -0
  54. package/dist/channels/index.d.ts +5 -0
  55. package/dist/channels/index.js +3 -0
  56. package/dist/channels/interface.d.ts +148 -0
  57. package/dist/channels/interface.js +15 -0
  58. package/dist/channels/manager.d.ts +43 -0
  59. package/dist/channels/manager.js +156 -0
  60. package/dist/channels/message-queue.d.ts +36 -0
  61. package/dist/channels/message-queue.js +91 -0
  62. package/dist/channels/plugins/clawbot/clawbot-auth.d.ts +50 -0
  63. package/dist/channels/plugins/clawbot/clawbot-auth.js +235 -0
  64. package/dist/channels/plugins/clawbot/clawbot-channel.d.ts +76 -0
  65. package/dist/channels/plugins/clawbot/clawbot-channel.js +566 -0
  66. package/dist/channels/plugins/clawbot/clawbot-client.d.ts +180 -0
  67. package/dist/channels/plugins/clawbot/clawbot-client.js +312 -0
  68. package/dist/channels/plugins/clawbot/clawbot-config.d.ts +30 -0
  69. package/dist/channels/plugins/clawbot/clawbot-config.js +28 -0
  70. package/dist/channels/plugins/clawbot/clawbot-message-queue.d.ts +27 -0
  71. package/dist/channels/plugins/clawbot/clawbot-message-queue.js +114 -0
  72. package/dist/channels/plugins/clawbot/clawbot-session.d.ts +10 -0
  73. package/dist/channels/plugins/clawbot/clawbot-session.js +26 -0
  74. package/dist/channels/plugins/clawbot/index.d.ts +17 -0
  75. package/dist/channels/plugins/clawbot/index.js +58 -0
  76. package/dist/channels/plugins/feishu/feishu-channel.d.ts +57 -0
  77. package/dist/channels/plugins/feishu/feishu-channel.js +602 -0
  78. package/dist/channels/plugins/feishu/feishu-client.d.ts +23 -0
  79. package/dist/channels/plugins/feishu/feishu-client.js +86 -0
  80. package/dist/channels/plugins/feishu/feishu-config.d.ts +53 -0
  81. package/dist/channels/plugins/feishu/feishu-config.js +35 -0
  82. package/dist/channels/plugins/feishu/feishu-event.d.ts +102 -0
  83. package/dist/channels/plugins/feishu/feishu-event.js +257 -0
  84. package/dist/channels/plugins/feishu/feishu-log-suppressor.d.ts +7 -0
  85. package/dist/channels/plugins/feishu/feishu-log-suppressor.js +34 -0
  86. package/dist/channels/plugins/feishu/feishu-message-queue.d.ts +27 -0
  87. package/dist/channels/plugins/feishu/feishu-message-queue.js +112 -0
  88. package/dist/channels/plugins/feishu/feishu-send.d.ts +44 -0
  89. package/dist/channels/plugins/feishu/feishu-send.js +232 -0
  90. package/dist/channels/plugins/feishu/feishu-session.d.ts +44 -0
  91. package/dist/channels/plugins/feishu/feishu-session.js +84 -0
  92. package/dist/channels/plugins/feishu/feishu-streaming.d.ts +49 -0
  93. package/dist/channels/plugins/feishu/feishu-streaming.js +185 -0
  94. package/dist/channels/plugins/feishu/feishu-transport.d.ts +29 -0
  95. package/dist/channels/plugins/feishu/feishu-transport.js +99 -0
  96. package/dist/channels/plugins/feishu/index.d.ts +22 -0
  97. package/dist/channels/plugins/feishu/index.js +68 -0
  98. package/dist/cli/doctor.d.ts +20 -0
  99. package/dist/cli/doctor.js +317 -0
  100. package/dist/context/cache-strategy.d.ts +76 -0
  101. package/dist/context/cache-strategy.js +123 -0
  102. package/dist/context/composer.d.ts +77 -0
  103. package/dist/context/composer.js +318 -0
  104. package/dist/context/compressor.d.ts +218 -0
  105. package/dist/context/compressor.js +909 -0
  106. package/dist/context/index.d.ts +14 -0
  107. package/dist/context/index.js +8 -0
  108. package/dist/context/interface.d.ts +33 -0
  109. package/dist/context/interface.js +2 -0
  110. package/dist/context/manifest-defaults.d.ts +51 -0
  111. package/dist/context/manifest-defaults.js +133 -0
  112. package/dist/context/manifest-loader.d.ts +16 -0
  113. package/dist/context/manifest-loader.js +103 -0
  114. package/dist/context/manifest-types.d.ts +26 -0
  115. package/dist/context/manifest-types.js +2 -0
  116. package/dist/context/precision/analyzer.d.ts +31 -0
  117. package/dist/context/precision/analyzer.js +131 -0
  118. package/dist/context/precision/companion.d.ts +27 -0
  119. package/dist/context/precision/companion.js +144 -0
  120. package/dist/context/precision/default.d.ts +14 -0
  121. package/dist/context/precision/default.js +17 -0
  122. package/dist/context/precision/index.d.ts +9 -0
  123. package/dist/context/precision/index.js +7 -0
  124. package/dist/context/precision/keyword-pool.d.ts +27 -0
  125. package/dist/context/precision/keyword-pool.js +66 -0
  126. package/dist/context/precision/strategy.d.ts +18 -0
  127. package/dist/context/precision/strategy.js +51 -0
  128. package/dist/context/precision/summary-store.d.ts +18 -0
  129. package/dist/context/precision/summary-store.js +67 -0
  130. package/dist/context/precision/types.d.ts +23 -0
  131. package/dist/context/precision/types.js +2 -0
  132. package/dist/context/profiles.d.ts +45 -0
  133. package/dist/context/profiles.js +92 -0
  134. package/dist/context/prompt-builder.d.ts +76 -0
  135. package/dist/context/prompt-builder.js +133 -0
  136. package/dist/context/retriever.d.ts +44 -0
  137. package/dist/context/retriever.js +203 -0
  138. package/dist/context/router.d.ts +122 -0
  139. package/dist/context/router.js +291 -0
  140. package/dist/context/section-resolver.d.ts +38 -0
  141. package/dist/context/section-resolver.js +398 -0
  142. package/dist/context/tokenizer.d.ts +23 -0
  143. package/dist/context/tokenizer.js +78 -0
  144. package/dist/dependency/analyzer.d.ts +33 -0
  145. package/dist/dependency/analyzer.js +242 -0
  146. package/dist/dependency/data-flow-tracker.d.ts +12 -0
  147. package/dist/dependency/data-flow-tracker.js +97 -0
  148. package/dist/dependency/function-parser.d.ts +34 -0
  149. package/dist/dependency/function-parser.js +295 -0
  150. package/dist/dependency/index.d.ts +14 -0
  151. package/dist/dependency/index.js +20 -0
  152. package/dist/dependency/parser.d.ts +10 -0
  153. package/dist/dependency/parser.js +93 -0
  154. package/dist/dependency/types.d.ts +57 -0
  155. package/dist/dependency/types.js +2 -0
  156. package/dist/env/env-collector.d.ts +45 -0
  157. package/dist/env/env-collector.js +221 -0
  158. package/dist/env/index.d.ts +3 -0
  159. package/dist/env/index.js +2 -0
  160. package/dist/event-store.d.ts +27 -0
  161. package/dist/event-store.js +71 -0
  162. package/dist/evolution/git-manager.d.ts +46 -0
  163. package/dist/evolution/git-manager.js +276 -0
  164. package/dist/evolution/index.d.ts +3 -0
  165. package/dist/evolution/index.js +2 -0
  166. package/dist/flow/bootstrap-flow.d.ts +19 -0
  167. package/dist/flow/bootstrap-flow.js +72 -0
  168. package/dist/flow/flow-registry.d.ts +12 -0
  169. package/dist/flow/flow-registry.js +74 -0
  170. package/dist/flow/flow-tools.d.ts +8 -0
  171. package/dist/flow/flow-tools.js +106 -0
  172. package/dist/flow/index.d.ts +6 -0
  173. package/dist/flow/index.js +8 -0
  174. package/dist/flow/todo-flow.d.ts +25 -0
  175. package/dist/flow/todo-flow.js +107 -0
  176. package/dist/flow/types.d.ts +78 -0
  177. package/dist/flow/types.js +12 -0
  178. package/dist/flows/bootstrap.d.ts +18 -0
  179. package/dist/flows/bootstrap.js +119 -0
  180. package/dist/flows/index.d.ts +6 -0
  181. package/dist/flows/index.js +11 -0
  182. package/dist/flows/todo.d.ts +26 -0
  183. package/dist/flows/todo.js +174 -0
  184. package/dist/flows/tools.d.ts +8 -0
  185. package/dist/flows/tools.js +119 -0
  186. package/dist/flows/types.d.ts +27 -0
  187. package/dist/flows/types.js +10 -0
  188. package/dist/gateway/cli.d.ts +5 -0
  189. package/dist/gateway/cli.js +1027 -0
  190. package/dist/gateway/factory.d.ts +80 -0
  191. package/dist/gateway/factory.js +832 -0
  192. package/dist/gateway/guardian.d.ts +8 -0
  193. package/dist/gateway/guardian.js +30 -0
  194. package/dist/gateway/index.d.ts +3 -0
  195. package/dist/gateway/index.js +3 -0
  196. package/dist/gateway/server.d.ts +17 -0
  197. package/dist/gateway/server.js +96 -0
  198. package/dist/gateway/tui.d.ts +16 -0
  199. package/dist/gateway/tui.js +3273 -0
  200. package/dist/hot-reload/agent-watcher.d.ts +24 -0
  201. package/dist/hot-reload/agent-watcher.js +175 -0
  202. package/dist/hot-reload/bundle-watcher.d.ts +12 -0
  203. package/dist/hot-reload/bundle-watcher.js +35 -0
  204. package/dist/hot-reload/channel-watcher.d.ts +19 -0
  205. package/dist/hot-reload/channel-watcher.js +54 -0
  206. package/dist/hot-reload/command-watcher.d.ts +14 -0
  207. package/dist/hot-reload/command-watcher.js +54 -0
  208. package/dist/hot-reload/config-watcher.d.ts +20 -0
  209. package/dist/hot-reload/config-watcher.js +58 -0
  210. package/dist/hot-reload/index.d.ts +12 -0
  211. package/dist/hot-reload/index.js +12 -0
  212. package/dist/hot-reload/manager.d.ts +58 -0
  213. package/dist/hot-reload/manager.js +243 -0
  214. package/dist/hot-reload/manifest-watcher.d.ts +9 -0
  215. package/dist/hot-reload/manifest-watcher.js +42 -0
  216. package/dist/hot-reload/mcp-watcher.d.ts +18 -0
  217. package/dist/hot-reload/mcp-watcher.js +64 -0
  218. package/dist/hot-reload/model-catalog-watcher.d.ts +18 -0
  219. package/dist/hot-reload/model-catalog-watcher.js +62 -0
  220. package/dist/hot-reload/plugin-watcher.d.ts +20 -0
  221. package/dist/hot-reload/plugin-watcher.js +56 -0
  222. package/dist/hot-reload/prompt-watcher.d.ts +6 -0
  223. package/dist/hot-reload/prompt-watcher.js +38 -0
  224. package/dist/hot-reload/provider-watcher.d.ts +16 -0
  225. package/dist/hot-reload/provider-watcher.js +45 -0
  226. package/dist/hot-reload/skill-watcher.d.ts +19 -0
  227. package/dist/hot-reload/skill-watcher.js +82 -0
  228. package/dist/hot-reload/tool-watcher.d.ts +16 -0
  229. package/dist/hot-reload/tool-watcher.js +168 -0
  230. package/dist/hot-reload/workflow-watcher.d.ts +19 -0
  231. package/dist/hot-reload/workflow-watcher.js +84 -0
  232. package/dist/index.d.ts +3 -0
  233. package/dist/index.js +6 -0
  234. package/dist/knowledge/fts5-retriever.d.ts +30 -0
  235. package/dist/knowledge/fts5-retriever.js +223 -0
  236. package/dist/knowledge/index.d.ts +11 -0
  237. package/dist/knowledge/index.js +14 -0
  238. package/dist/knowledge/indexer.d.ts +41 -0
  239. package/dist/knowledge/indexer.js +186 -0
  240. package/dist/knowledge/query-preprocessor.d.ts +13 -0
  241. package/dist/knowledge/query-preprocessor.js +63 -0
  242. package/dist/knowledge/retriever.d.ts +45 -0
  243. package/dist/knowledge/retriever.js +9 -0
  244. package/dist/knowledge/store.d.ts +27 -0
  245. package/dist/knowledge/store.js +61 -0
  246. package/dist/knowledge/structured-store.d.ts +78 -0
  247. package/dist/knowledge/structured-store.js +280 -0
  248. package/dist/knowledge/structured-tools.d.ts +12 -0
  249. package/dist/knowledge/structured-tools.js +151 -0
  250. package/dist/knowledge/tools.d.ts +20 -0
  251. package/dist/knowledge/tools.js +238 -0
  252. package/dist/knowledge/watcher.d.ts +28 -0
  253. package/dist/knowledge/watcher.js +113 -0
  254. package/dist/lifecycle/index.d.ts +12 -0
  255. package/dist/lifecycle/index.js +14 -0
  256. package/dist/lifecycle/interface.d.ts +94 -0
  257. package/dist/lifecycle/interface.js +2 -0
  258. package/dist/lifecycle/local-model.d.ts +62 -0
  259. package/dist/lifecycle/local-model.js +331 -0
  260. package/dist/lifecycle/manager.d.ts +70 -0
  261. package/dist/lifecycle/manager.js +374 -0
  262. package/dist/lifecycle/supervisor.d.ts +89 -0
  263. package/dist/lifecycle/supervisor.js +277 -0
  264. package/dist/lifecycle-integration-test.d.ts +2 -0
  265. package/dist/lifecycle-integration-test.js +72 -0
  266. package/dist/local-model/download-manager.d.ts +59 -0
  267. package/dist/local-model/download-manager.js +517 -0
  268. package/dist/local-model/index.d.ts +109 -0
  269. package/dist/local-model/index.js +233 -0
  270. package/dist/local-model/llamacpp-provider.d.ts +95 -0
  271. package/dist/local-model/llamacpp-provider.js +379 -0
  272. package/dist/local-model/model-bridge.d.ts +48 -0
  273. package/dist/local-model/model-bridge.js +256 -0
  274. package/dist/local-model/model-registry.d.ts +47 -0
  275. package/dist/local-model/model-registry.js +188 -0
  276. package/dist/local-model/types.d.ts +49 -0
  277. package/dist/local-model/types.js +2 -0
  278. package/dist/logging/index.d.ts +3 -0
  279. package/dist/logging/index.js +3 -0
  280. package/dist/logging/logger.d.ts +56 -0
  281. package/dist/logging/logger.js +94 -0
  282. package/dist/machine/flows/bootstrap.d.ts +18 -0
  283. package/dist/machine/flows/bootstrap.js +119 -0
  284. package/dist/machine/flows/index.d.ts +6 -0
  285. package/dist/machine/flows/index.js +11 -0
  286. package/dist/machine/flows/spec.d.ts +17 -0
  287. package/dist/machine/flows/spec.js +176 -0
  288. package/dist/machine/flows/todo.d.ts +26 -0
  289. package/dist/machine/flows/todo.js +175 -0
  290. package/dist/machine/flows/tools.d.ts +8 -0
  291. package/dist/machine/flows/tools.js +119 -0
  292. package/dist/machine/flows/types.d.ts +33 -0
  293. package/dist/machine/flows/types.js +10 -0
  294. package/dist/machine/index.d.ts +8 -0
  295. package/dist/machine/index.js +9 -0
  296. package/dist/machine/registry.d.ts +34 -0
  297. package/dist/machine/registry.js +98 -0
  298. package/dist/machine/runner.d.ts +41 -0
  299. package/dist/machine/runner.js +177 -0
  300. package/dist/machine/types.d.ts +121 -0
  301. package/dist/machine/types.js +9 -0
  302. package/dist/mcp/bridge.d.ts +33 -0
  303. package/dist/mcp/bridge.js +99 -0
  304. package/dist/mcp/client.d.ts +37 -0
  305. package/dist/mcp/client.js +161 -0
  306. package/dist/mcp/config.d.ts +15 -0
  307. package/dist/mcp/config.js +85 -0
  308. package/dist/mcp/index.d.ts +7 -0
  309. package/dist/mcp/index.js +7 -0
  310. package/dist/mcp/install-manager.d.ts +31 -0
  311. package/dist/mcp/install-manager.js +158 -0
  312. package/dist/mcp/lifecycle.d.ts +41 -0
  313. package/dist/mcp/lifecycle.js +175 -0
  314. package/dist/mcp/process-transport.d.ts +21 -0
  315. package/dist/mcp/process-transport.js +59 -0
  316. package/dist/mcp/side-effect.d.ts +5 -0
  317. package/dist/mcp/side-effect.js +21 -0
  318. package/dist/mcp/system.d.ts +95 -0
  319. package/dist/mcp/system.js +279 -0
  320. package/dist/memory/companion-session.d.ts +22 -0
  321. package/dist/memory/companion-session.js +77 -0
  322. package/dist/memory/compression-boundary.d.ts +20 -0
  323. package/dist/memory/compression-boundary.js +40 -0
  324. package/dist/memory/conversation.d.ts +34 -0
  325. package/dist/memory/conversation.js +107 -0
  326. package/dist/memory/events.d.ts +42 -0
  327. package/dist/memory/events.js +56 -0
  328. package/dist/memory/index.d.ts +7 -0
  329. package/dist/memory/index.js +6 -0
  330. package/dist/memory/memory-store.d.ts +11 -0
  331. package/dist/memory/memory-store.js +51 -0
  332. package/dist/memory/session-allowlist.d.ts +11 -0
  333. package/dist/memory/session-allowlist.js +50 -0
  334. package/dist/memory/session.d.ts +48 -0
  335. package/dist/memory/session.js +275 -0
  336. package/dist/memory/stats.d.ts +23 -0
  337. package/dist/memory/stats.js +59 -0
  338. package/dist/memory/summary.d.ts +7 -0
  339. package/dist/memory/summary.js +23 -0
  340. package/dist/multimodal/index.d.ts +66 -0
  341. package/dist/multimodal/index.js +210 -0
  342. package/dist/orchestrator/index.d.ts +5 -0
  343. package/dist/orchestrator/index.js +4 -0
  344. package/dist/orchestrator/loop.d.ts +331 -0
  345. package/dist/orchestrator/loop.js +2443 -0
  346. package/dist/orchestrator/plan-store.d.ts +81 -0
  347. package/dist/orchestrator/plan-store.js +167 -0
  348. package/dist/orchestrator/planner.d.ts +20 -0
  349. package/dist/orchestrator/planner.js +34 -0
  350. package/dist/parser/index.d.ts +2 -0
  351. package/dist/parser/index.js +2 -0
  352. package/dist/parser/router.d.ts +30 -0
  353. package/dist/parser/router.js +61 -0
  354. package/dist/plugins/api.d.ts +39 -0
  355. package/dist/plugins/api.js +85 -0
  356. package/dist/plugins/define.d.ts +27 -0
  357. package/dist/plugins/define.js +32 -0
  358. package/dist/plugins/index.d.ts +9 -0
  359. package/dist/plugins/index.js +5 -0
  360. package/dist/plugins/loader.d.ts +39 -0
  361. package/dist/plugins/loader.js +128 -0
  362. package/dist/plugins/manager.d.ts +61 -0
  363. package/dist/plugins/manager.js +257 -0
  364. package/dist/plugins/types.d.ts +82 -0
  365. package/dist/plugins/types.js +2 -0
  366. package/dist/prompts/agents/code-reviewer.md +16 -0
  367. package/dist/prompts/agents/security-auditor.md +17 -0
  368. package/dist/prompts/agents/test-writer.md +15 -0
  369. package/dist/prompts/attention/attention.md +12 -0
  370. package/dist/prompts/environment/environment.md +18 -0
  371. package/dist/prompts/environment/feishu.md +107 -0
  372. package/dist/prompts/flows/bootstrap-confirm.md +14 -0
  373. package/dist/prompts/flows/bootstrap-identity.md +11 -0
  374. package/dist/prompts/flows/bootstrap-soul.md +19 -0
  375. package/dist/prompts/flows/bootstrap-user.md +11 -0
  376. package/dist/prompts/flows/spec-checklist.md +27 -0
  377. package/dist/prompts/flows/spec-define.md +64 -0
  378. package/dist/prompts/flows/spec-executing-checklist.md +15 -0
  379. package/dist/prompts/flows/spec-executing-tasks.md +15 -0
  380. package/dist/prompts/flows/spec-spec.md +51 -0
  381. package/dist/prompts/flows/spec-tasks.md +32 -0
  382. package/dist/prompts/flows/todo-execution.md +7 -0
  383. package/dist/prompts/flows/todo-planning.md +18 -0
  384. package/dist/prompts/framework/architecture.md +131 -0
  385. package/dist/prompts/identity/identity.md +2 -0
  386. package/dist/prompts/loader.d.ts +24 -0
  387. package/dist/prompts/loader.js +102 -0
  388. package/dist/prompts/loader.ts +119 -0
  389. package/dist/prompts/orchestration/summary.md +14 -0
  390. package/dist/prompts/persona/BOOTSTRAP.md +5 -0
  391. package/dist/prompts/persona/IDENTITY.md +16 -0
  392. package/dist/prompts/persona/PartnerMemory.md +5 -0
  393. package/dist/prompts/persona/PartnerSoul.md +7 -0
  394. package/dist/prompts/persona/SOUL.md +30 -0
  395. package/dist/prompts/persona/USER.md +16 -0
  396. package/dist/prompts/precise/analyze.md +23 -0
  397. package/dist/prompts/precise/persona.md +18 -0
  398. package/dist/prompts/safety/coding-standards.md +5 -0
  399. package/dist/prompts/safety/safety.md +4 -0
  400. package/dist/prompts/skills/code-review.md +4 -0
  401. package/dist/prompts/skills/debug.md +7 -0
  402. package/dist/prompts/skills/framework-reference.md +131 -0
  403. package/dist/prompts/skills/refactor.md +6 -0
  404. package/dist/prompts/summary.md +22 -0
  405. package/dist/prompts/tools/framework-capabilities.md +241 -0
  406. package/dist/prompts/tools/tool-rules.md +15 -0
  407. package/dist/provider/anthropic.d.ts +62 -0
  408. package/dist/provider/anthropic.js +361 -0
  409. package/dist/provider/catalog.d.ts +58 -0
  410. package/dist/provider/catalog.js +97 -0
  411. package/dist/provider/compatible.d.ts +89 -0
  412. package/dist/provider/compatible.js +328 -0
  413. package/dist/provider/config.d.ts +23 -0
  414. package/dist/provider/config.js +158 -0
  415. package/dist/provider/deepseek.d.ts +25 -0
  416. package/dist/provider/deepseek.js +37 -0
  417. package/dist/provider/fallback.d.ts +51 -0
  418. package/dist/provider/fallback.js +113 -0
  419. package/dist/provider/gemini.d.ts +27 -0
  420. package/dist/provider/gemini.js +170 -0
  421. package/dist/provider/index.d.ts +36 -0
  422. package/dist/provider/index.js +42 -0
  423. package/dist/provider/interface.d.ts +62 -0
  424. package/dist/provider/interface.js +2 -0
  425. package/dist/provider/local-config.d.ts +37 -0
  426. package/dist/provider/local-config.js +146 -0
  427. package/dist/provider/local.d.ts +45 -0
  428. package/dist/provider/local.js +248 -0
  429. package/dist/provider/manager.d.ts +67 -0
  430. package/dist/provider/manager.js +355 -0
  431. package/dist/provider/mimo.d.ts +19 -0
  432. package/dist/provider/mimo.js +30 -0
  433. package/dist/provider/minimax.d.ts +22 -0
  434. package/dist/provider/minimax.js +33 -0
  435. package/dist/provider/model-catalog-loader.d.ts +42 -0
  436. package/dist/provider/model-catalog-loader.js +89 -0
  437. package/dist/provider/model-channel-registry.d.ts +130 -0
  438. package/dist/provider/model-channel-registry.js +488 -0
  439. package/dist/provider/model-router.d.ts +60 -0
  440. package/dist/provider/model-router.js +87 -0
  441. package/dist/provider/openai.d.ts +54 -0
  442. package/dist/provider/openai.js +274 -0
  443. package/dist/provider/qwen.d.ts +19 -0
  444. package/dist/provider/qwen.js +30 -0
  445. package/dist/provider/resilient.d.ts +46 -0
  446. package/dist/provider/resilient.js +181 -0
  447. package/dist/provider/retry.d.ts +16 -0
  448. package/dist/provider/retry.js +78 -0
  449. package/dist/provider/router.d.ts +68 -0
  450. package/dist/provider/router.js +145 -0
  451. package/dist/provider/tool-args-recovery.d.ts +36 -0
  452. package/dist/provider/tool-args-recovery.js +91 -0
  453. package/dist/provider/user-id.d.ts +13 -0
  454. package/dist/provider/user-id.js +53 -0
  455. package/dist/provider/zhipu.d.ts +19 -0
  456. package/dist/provider/zhipu.js +32 -0
  457. package/dist/registry/agent.registry.d.ts +57 -0
  458. package/dist/registry/agent.registry.js +224 -0
  459. package/dist/registry/base.d.ts +54 -0
  460. package/dist/registry/base.js +99 -0
  461. package/dist/registry/channel.registry.d.ts +53 -0
  462. package/dist/registry/channel.registry.js +87 -0
  463. package/dist/registry/index.d.ts +9 -0
  464. package/dist/registry/index.js +10 -0
  465. package/dist/registry/mcp.registry.d.ts +2 -0
  466. package/dist/registry/mcp.registry.js +2 -0
  467. package/dist/registry/plugin.registry.d.ts +33 -0
  468. package/dist/registry/plugin.registry.js +66 -0
  469. package/dist/registry/provider.registry.d.ts +51 -0
  470. package/dist/registry/provider.registry.js +104 -0
  471. package/dist/registry/skill.registry.d.ts +33 -0
  472. package/dist/registry/skill.registry.js +95 -0
  473. package/dist/registry/tool.registry.d.ts +68 -0
  474. package/dist/registry/tool.registry.js +185 -0
  475. package/dist/repair/loop-guard.d.ts +98 -0
  476. package/dist/repair/loop-guard.js +217 -0
  477. package/dist/repair/scavenge.d.ts +19 -0
  478. package/dist/repair/scavenge.js +81 -0
  479. package/dist/repair/storm.d.ts +7 -0
  480. package/dist/repair/storm.js +7 -0
  481. package/dist/rollback/index.d.ts +5 -0
  482. package/dist/rollback/index.js +4 -0
  483. package/dist/rollback/rollback-tool.d.ts +13 -0
  484. package/dist/rollback/rollback-tool.js +167 -0
  485. package/dist/rollback/turn-recorder.d.ts +37 -0
  486. package/dist/rollback/turn-recorder.js +183 -0
  487. package/dist/rollback/turn-store.d.ts +29 -0
  488. package/dist/rollback/turn-store.js +114 -0
  489. package/dist/rollback/types.d.ts +51 -0
  490. package/dist/rollback/types.js +9 -0
  491. package/dist/runtime/config-center.d.ts +92 -0
  492. package/dist/runtime/config-center.js +467 -0
  493. package/dist/runtime/config-schema.d.ts +201 -0
  494. package/dist/runtime/config-schema.js +2 -0
  495. package/dist/runtime/defaults.d.ts +3 -0
  496. package/dist/runtime/defaults.js +146 -0
  497. package/dist/schedule/cron.d.ts +24 -0
  498. package/dist/schedule/cron.js +145 -0
  499. package/dist/schedule/index.d.ts +6 -0
  500. package/dist/schedule/index.js +4 -0
  501. package/dist/schedule/persistence.d.ts +33 -0
  502. package/dist/schedule/persistence.js +106 -0
  503. package/dist/schedule/scheduler.d.ts +85 -0
  504. package/dist/schedule/scheduler.js +630 -0
  505. package/dist/schedule/types.d.ts +185 -0
  506. package/dist/schedule/types.js +2 -0
  507. package/dist/setup/config.d.ts +189 -0
  508. package/dist/setup/config.js +253 -0
  509. package/dist/setup/index.d.ts +3 -0
  510. package/dist/setup/index.js +3 -0
  511. package/dist/setup/model-defaults.d.ts +13 -0
  512. package/dist/setup/model-defaults.js +87 -0
  513. package/dist/setup/persona-bootstrap.d.ts +42 -0
  514. package/dist/setup/persona-bootstrap.js +379 -0
  515. package/dist/setup/wizard.d.ts +32 -0
  516. package/dist/setup/wizard.js +384 -0
  517. package/dist/skills/index.d.ts +4 -0
  518. package/dist/skills/index.js +4 -0
  519. package/dist/skills/loader.d.ts +12 -0
  520. package/dist/skills/loader.js +83 -0
  521. package/dist/skills/registry.d.ts +2 -0
  522. package/dist/skills/registry.js +2 -0
  523. package/dist/skills/skill-tool.d.ts +20 -0
  524. package/dist/skills/skill-tool.js +49 -0
  525. package/dist/tools/archive.d.ts +17 -0
  526. package/dist/tools/archive.js +131 -0
  527. package/dist/tools/ask-user.d.ts +9 -0
  528. package/dist/tools/ask-user.js +62 -0
  529. package/dist/tools/background-registry.d.ts +45 -0
  530. package/dist/tools/background-registry.js +164 -0
  531. package/dist/tools/bash.d.ts +56 -0
  532. package/dist/tools/bash.js +391 -0
  533. package/dist/tools/bundle-registry.d.ts +42 -0
  534. package/dist/tools/bundle-registry.js +239 -0
  535. package/dist/tools/bundle-tools.d.ts +11 -0
  536. package/dist/tools/bundle-tools.js +168 -0
  537. package/dist/tools/channel-info.d.ts +5 -0
  538. package/dist/tools/channel-info.js +38 -0
  539. package/dist/tools/compression.d.ts +7 -0
  540. package/dist/tools/compression.js +21 -0
  541. package/dist/tools/config.d.ts +23 -0
  542. package/dist/tools/config.js +255 -0
  543. package/dist/tools/db-query.d.ts +12 -0
  544. package/dist/tools/db-query.js +107 -0
  545. package/dist/tools/diagnostics.d.ts +30 -0
  546. package/dist/tools/diagnostics.js +111 -0
  547. package/dist/tools/diff-channel.d.ts +9 -0
  548. package/dist/tools/diff-channel.js +17 -0
  549. package/dist/tools/diff-files.d.ts +17 -0
  550. package/dist/tools/diff-files.js +88 -0
  551. package/dist/tools/disk-usage.d.ts +34 -0
  552. package/dist/tools/disk-usage.js +258 -0
  553. package/dist/tools/edit.d.ts +30 -0
  554. package/dist/tools/edit.js +235 -0
  555. package/dist/tools/executor.d.ts +32 -0
  556. package/dist/tools/executor.js +66 -0
  557. package/dist/tools/file-tracker.d.ts +20 -0
  558. package/dist/tools/file-tracker.js +44 -0
  559. package/dist/tools/filtered-registry.d.ts +29 -0
  560. package/dist/tools/filtered-registry.js +50 -0
  561. package/dist/tools/flow.d.ts +10 -0
  562. package/dist/tools/flow.js +180 -0
  563. package/dist/tools/git-tool.d.ts +24 -0
  564. package/dist/tools/git-tool.js +113 -0
  565. package/dist/tools/glob.d.ts +29 -0
  566. package/dist/tools/glob.js +152 -0
  567. package/dist/tools/grep.d.ts +14 -0
  568. package/dist/tools/grep.js +325 -0
  569. package/dist/tools/http-request.d.ts +14 -0
  570. package/dist/tools/http-request.js +126 -0
  571. package/dist/tools/index.d.ts +43 -0
  572. package/dist/tools/index.js +76 -0
  573. package/dist/tools/injection-filter.d.ts +6 -0
  574. package/dist/tools/injection-filter.js +71 -0
  575. package/dist/tools/insert.d.ts +13 -0
  576. package/dist/tools/insert.js +61 -0
  577. package/dist/tools/interface.d.ts +30 -0
  578. package/dist/tools/interface.js +2 -0
  579. package/dist/tools/json-edit.d.ts +15 -0
  580. package/dist/tools/json-edit.js +122 -0
  581. package/dist/tools/multi-edit.d.ts +9 -0
  582. package/dist/tools/multi-edit.js +146 -0
  583. package/dist/tools/path-sandbox.d.ts +14 -0
  584. package/dist/tools/path-sandbox.js +60 -0
  585. package/dist/tools/process-tools.d.ts +15 -0
  586. package/dist/tools/process-tools.js +95 -0
  587. package/dist/tools/python-bridge/bridge.d.ts +24 -0
  588. package/dist/tools/python-bridge/bridge.js +39 -0
  589. package/dist/tools/python-bridge/executor.d.ts +6 -0
  590. package/dist/tools/python-bridge/executor.js +69 -0
  591. package/dist/tools/python-bridge/index.d.ts +5 -0
  592. package/dist/tools/python-bridge/index.js +4 -0
  593. package/dist/tools/python-bridge/parser.d.ts +21 -0
  594. package/dist/tools/python-bridge/parser.js +258 -0
  595. package/dist/tools/read.d.ts +16 -0
  596. package/dist/tools/read.js +276 -0
  597. package/dist/tools/registry.d.ts +2 -0
  598. package/dist/tools/registry.js +2 -0
  599. package/dist/tools/restart.d.ts +10 -0
  600. package/dist/tools/restart.js +46 -0
  601. package/dist/tools/result-buffer.d.ts +66 -0
  602. package/dist/tools/result-buffer.js +146 -0
  603. package/dist/tools/runtime-control.d.ts +163 -0
  604. package/dist/tools/runtime-control.js +1780 -0
  605. package/dist/tools/symbol-references.d.ts +5 -0
  606. package/dist/tools/symbol-references.js +331 -0
  607. package/dist/tools/system-info.d.ts +3 -0
  608. package/dist/tools/system-info.js +55 -0
  609. package/dist/tools/write.d.ts +18 -0
  610. package/dist/tools/write.js +118 -0
  611. package/dist/tools/xref/index.d.ts +25 -0
  612. package/dist/tools/xref/index.js +25 -0
  613. package/dist/tools/xref/manager.d.ts +85 -0
  614. package/dist/tools/xref/manager.js +948 -0
  615. package/dist/tools/xref/parser.d.ts +34 -0
  616. package/dist/tools/xref/parser.js +64 -0
  617. package/dist/tools/xref/regex-parser.d.ts +26 -0
  618. package/dist/tools/xref/regex-parser.js +446 -0
  619. package/dist/tools/xref/schema.d.ts +104 -0
  620. package/dist/tools/xref/schema.js +68 -0
  621. package/dist/tools/xref/ts-parser.d.ts +20 -0
  622. package/dist/tools/xref/ts-parser.js +403 -0
  623. package/dist/tools/xref/xref-build.d.ts +20 -0
  624. package/dist/tools/xref/xref-build.js +128 -0
  625. package/dist/tools/xref/xref-graph.d.ts +24 -0
  626. package/dist/tools/xref/xref-graph.js +88 -0
  627. package/dist/tools/xref/xref-query.d.ts +30 -0
  628. package/dist/tools/xref/xref-query.js +123 -0
  629. package/dist/types.d.ts +217 -0
  630. package/dist/types.js +2 -0
  631. package/dist/ui/assistant-message.d.ts +7 -0
  632. package/dist/ui/assistant-message.js +18 -0
  633. package/dist/ui/chat-log.d.ts +52 -0
  634. package/dist/ui/chat-log.js +246 -0
  635. package/dist/ui/command-registry.d.ts +73 -0
  636. package/dist/ui/command-registry.js +838 -0
  637. package/dist/ui/diff-component.d.ts +14 -0
  638. package/dist/ui/diff-component.js +42 -0
  639. package/dist/ui/hyperlink-markdown.d.ts +10 -0
  640. package/dist/ui/hyperlink-markdown.js +21 -0
  641. package/dist/ui/markdown-message.d.ts +10 -0
  642. package/dist/ui/markdown-message.js +16 -0
  643. package/dist/ui/osc8-hyperlinks.d.ts +4 -0
  644. package/dist/ui/osc8-hyperlinks.js +142 -0
  645. package/dist/ui/pi-tui-editor.d.ts +35 -0
  646. package/dist/ui/pi-tui-editor.js +79 -0
  647. package/dist/ui/slash-commands.d.ts +16 -0
  648. package/dist/ui/slash-commands.js +29 -0
  649. package/dist/ui/slash-panel.d.ts +54 -0
  650. package/dist/ui/slash-panel.js +199 -0
  651. package/dist/ui/theme.d.ts +120 -0
  652. package/dist/ui/theme.js +154 -0
  653. package/dist/ui/tool-display.d.ts +13 -0
  654. package/dist/ui/tool-display.js +85 -0
  655. package/dist/ui/tool-execution.d.ts +22 -0
  656. package/dist/ui/tool-execution.js +87 -0
  657. package/dist/ui/tui-formatters.d.ts +2 -0
  658. package/dist/ui/tui-formatters.js +145 -0
  659. package/dist/ui/user-message.d.ts +5 -0
  660. package/dist/ui/user-message.js +11 -0
  661. package/dist/update/check.d.ts +8 -0
  662. package/dist/update/check.js +28 -0
  663. package/dist/update/config.d.ts +6 -0
  664. package/dist/update/config.js +18 -0
  665. package/dist/update/download.d.ts +3 -0
  666. package/dist/update/download.js +27 -0
  667. package/dist/update/index.d.ts +6 -0
  668. package/dist/update/index.js +5 -0
  669. package/dist/update/install.d.ts +3 -0
  670. package/dist/update/install.js +33 -0
  671. package/dist/update/types.d.ts +16 -0
  672. package/dist/update/types.js +2 -0
  673. package/dist/utils/diff.d.ts +9 -0
  674. package/dist/utils/diff.js +45 -0
  675. package/dist/utils/misc.d.ts +12 -0
  676. package/dist/utils/misc.js +34 -0
  677. package/dist/world-engine/agent.d.ts +41 -0
  678. package/dist/world-engine/agent.js +385 -0
  679. package/dist/world-engine/index.d.ts +45 -0
  680. package/dist/world-engine/index.js +160 -0
  681. package/dist/world-engine/sim.d.ts +14 -0
  682. package/dist/world-engine/sim.js +120 -0
  683. package/dist/world-engine/store.d.ts +110 -0
  684. package/dist/world-engine/store.js +519 -0
  685. package/dist/world-engine/ticker.d.ts +37 -0
  686. package/dist/world-engine/ticker.js +214 -0
  687. package/dist/world-engine/tools.d.ts +6 -0
  688. package/dist/world-engine/tools.js +380 -0
  689. package/dist/world-engine/types.d.ts +202 -0
  690. package/dist/world-engine/types.js +56 -0
  691. package/docs/api.md +180 -0
  692. package/docs/architecture.md +206 -0
  693. package/docs/diagnostics/2026-06-08-config-prompt-guidance.md +67 -0
  694. package/docs/superpowers/plans/2026-06-08-global-bootstrap-mode.md +89 -0
  695. package/docs/superpowers/specs/2026-06-08-global-bootstrap-mode-design.md +174 -0
  696. package/docs/user-guide.md +226 -0
  697. package/package.json +63 -0
  698. package/plugins/example-greeter/index.js +55 -0
  699. package/plugins/example-greeter/plugin.json +8 -0
  700. package/pnpm-workspace.yaml +5 -0
  701. package/provider_arch.md +179 -0
  702. package/start-webui.sh +27 -0
  703. package/tsconfig.tsbuildinfo +1 -0
  704. package/webui-channel-design.md +789 -0
@@ -0,0 +1,832 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import fs from 'node:fs';
4
+ import { SessionManager } from '../memory/session.js';
5
+ import { CompanionSessionManager } from '../memory/companion-session.js';
6
+ import { isCompanionModeActive, getActiveRouter, switchRouter } from '../context/profiles.js';
7
+ import { createBuiltInTools, BashTool } from '../tools/index.js';
8
+ import { ToolExecutor } from '../tools/executor.js';
9
+ import { ToolBundleRegistry } from '../tools/bundle-registry.js';
10
+ import { registerBundleTools } from '../tools/bundle-tools.js';
11
+ import { GitManager } from '../evolution/git-manager.js';
12
+ import { SkillRegistry, createBuiltinSkills, SkillTool } from '../skills/index.js';
13
+ import { AgentRegistry, DelegateToAgentTool, loadAgentConfigs } from '../agents/index.js';
14
+ import { MCPSystem } from '../mcp/index.js';
15
+ import { LayeredContextComposer } from '../context/composer.js';
16
+ import { KnowledgeBase, KnowledgeWatcher, StructuredStore, createStructuredTool, createKbToggleTool, } from '../knowledge/index.js';
17
+ import { DefaultStrategy, PreciseStrategy } from '../context/precision/index.js';
18
+ import { CompressorOrchestrator, StructuredSummarizer } from '../context/compressor.js';
19
+ import { TokenCounter } from '../context/tokenizer.js';
20
+ import { LLMOrchestrator } from '../orchestrator/planner.js';
21
+ import { PlanStore } from '../orchestrator/plan-store.js';
22
+ import { ConversationStore } from '../memory/conversation.js';
23
+ import { EventStore } from '../memory/events.js';
24
+ import { StatsManager } from '../memory/stats.js';
25
+ import { SummaryStore } from '../memory/summary.js';
26
+ import { MemoryStore } from '../memory/memory-store.js';
27
+ import { AgentLoop } from '../orchestrator/loop.js';
28
+ import { PluginManager } from '../plugins/index.js';
29
+ import { initDependencyAnalyzer } from '../dependency/index.js';
30
+ import { ensureGlobalPersonaFiles, getBootstrapStatus } from '../setup/persona-bootstrap.js';
31
+ import { ConfigManager } from '../setup/config.js';
32
+ import { RuntimeConfigCenter } from '../runtime/config-center.js';
33
+ import { getDefaultConfig } from '../runtime/defaults.js';
34
+ import { createLogger } from '../logging/logger.js';
35
+ import { ProviderRouter } from '../provider/router.js';
36
+ import { ModelRouter } from '../provider/model-router.js';
37
+ import { ModelChannelRegistry } from '../provider/model-channel-registry.js';
38
+ import { HeartbeatScheduler } from '../schedule/scheduler.js';
39
+ import { HotReloadManager } from '../hot-reload/index.js';
40
+ import { getProviderConfigLoader } from '../provider/config.js';
41
+ import { ProviderManager } from '../provider/manager.js';
42
+ import { compressorUserId, orchestratorUserId, setUserIdPrefix, DEFAULT_USER_ID } from '../provider/user-id.js';
43
+ import { getModelCatalogLoader } from '../provider/model-catalog-loader.js';
44
+ import { injectConfigCenter } from '../provider/local-config.js';
45
+ import { getModelContextWindow } from '../setup/model-defaults.js';
46
+ import { modelCatalog } from '../provider/catalog.js';
47
+ import { TurnRecorder, TurnStore, createRollbackStatusTool, createRollbackTool } from '../rollback/index.js';
48
+ import { MachineRegistry, BootstrapFlow, TodoFlow, SpecFlow } from '../machine/index.js';
49
+ import { createAskUserTool } from '../tools/ask-user.js';
50
+ import { createFlowStartTool, createFlowAddTool, createFlowCompleteTool } from '../tools/flow.js';
51
+ import { createTriggerCompressionTool } from '../tools/compression.js';
52
+ import { BackgroundProcessRegistry } from '../tools/background-registry.js';
53
+ import { createProcessListTool, createProcessKillTool, createProcessOutputTool } from '../tools/process-tools.js';
54
+ import { createSystemInfoTool } from '../tools/system-info.js';
55
+ import { createChannelInfoTool, setChannelsInfo } from '../tools/channel-info.js';
56
+ import { collectSystemInfo, buildEnvironmentSection } from '../env/index.js';
57
+ import { CommandRegistry } from '../ui/command-registry.js';
58
+ const logger = createLogger('factory');
59
+ // ─── Factory ─────────────────────────────────────────────────────────
60
+ //
61
+ // ## 组件装配原则
62
+ //
63
+ // 这是整个 Agent 的唯一装配入口。所有模块在此创建、配置、注入。
64
+ // 如果你要新增系统级组件(如新的 ContextSource、Tool、Flow):
65
+ //
66
+ // 1. 在此文件中注册 ContextSource 到 composer(Zone 注入)
67
+ // 2. 在此文件中注册 Tool 到 toolRegistry
68
+ // 3. 在此文件中注册 Flow 到 flowRegistry
69
+ // 4. 不要在其他地方分散注册——保持单一装配点
70
+ //
71
+ // 提示词、配置均通过外部化体系加载(loadPrompt / RuntimeConfigCenter),
72
+ // 不要在工厂中硬编码任何面向模型或用户的文本内容。
73
+ //
74
+ // ─────────────────────────────────────────────────────────────────────
75
+ export async function createAgent(options, supervisor) {
76
+ const { cwd, provider, maxTurns, maxContext, outputHandler, sessionId, shouldContinue, maxMessages = 10000, personaDir, bootstrapStatus, localModelProvider, channelsInfo } = options;
77
+ // ── 配置预加载(需在 session 创建前读取 startup.defaultMode)──────
78
+ const configManager = new ConfigManager(cwd);
79
+ const config = await configManager.load();
80
+ const startupMode = config.startup;
81
+ const defaultMode = startupMode?.defaultMode === 'companion' ? 'companion' : 'normal';
82
+ // ── Session ──────────────────────────────────────────────────────
83
+ const sessionManager = options.sessionManager ?? new SessionManager(cwd);
84
+ let sessionDir;
85
+ let currentSessionId;
86
+ let sessionType = 'normal';
87
+ if (sessionId) {
88
+ const session = await sessionManager.resume(sessionId);
89
+ sessionDir = sessionManager.getSessionDir(session.id);
90
+ currentSessionId = session.id;
91
+ sessionType = session.type ?? 'normal';
92
+ logger.info('Resumed session', { sessionId: session.id, type: sessionType });
93
+ }
94
+ else if (shouldContinue) {
95
+ const session = await sessionManager.resume();
96
+ sessionDir = sessionManager.getSessionDir(session.id);
97
+ currentSessionId = session.id;
98
+ sessionType = session.type ?? 'normal';
99
+ logger.info('Continued session', { sessionId: session.id, type: sessionType });
100
+ }
101
+ else {
102
+ // 新 session:根据 startup.defaultMode 决定初始 Router 模式
103
+ // 注意:陪伴模式也创建 normal session,实际 session 切换由 CompanionRouter.onActivate 负责
104
+ const session = await sessionManager.create('normal', options.channel);
105
+ sessionDir = sessionManager.getSessionDir(session.id);
106
+ currentSessionId = session.id;
107
+ sessionType = defaultMode;
108
+ logger.info('New session', { sessionId: session.id, channel: options.channel, defaultMode: sessionType });
109
+ }
110
+ // ── Git 基础设施 ──────────────────────────────────────────────────
111
+ const gitManager = new GitManager(cwd);
112
+ // ── 回合回滚 ──────────────────────────────────────────────────────
113
+ const rollbackDir = path.join(os.homedir(), '.agent', 'rollback');
114
+ const turnStore = new TurnStore(rollbackDir);
115
+ const turnRecorder = new TurnRecorder(gitManager, turnStore, cwd);
116
+ // ── 状态机注册表(机器在 persona 初始化后注册) ────────────────
117
+ const flowRegistry = new MachineRegistry();
118
+ // ── Global Persona Bootstrap ──────────────────────────────────────
119
+ const personaSetup = await ensureGlobalPersonaFiles();
120
+ const effectivePersonaDir = personaDir ?? personaSetup.personaDir;
121
+ const effectiveBootstrapStatus = bootstrapStatus ?? (await getBootstrapStatus(effectivePersonaDir));
122
+ // ── 注册 Flow(Bootstrap + TODO + Spec)──────────────────────────
123
+ flowRegistry.register(new BootstrapFlow(effectivePersonaDir));
124
+ flowRegistry.register(new TodoFlow());
125
+ flowRegistry.register(new SpecFlow());
126
+ // ── Provider Config Loader(必须在 getDefaultConfig 之前,确保 providerDefault 读到 JSON) ──
127
+ const providerConfigLoader = getProviderConfigLoader(cwd);
128
+ await providerConfigLoader.load();
129
+ // ── Runtime Config Center ──────────────────────────────────────────
130
+ const configCenter = RuntimeConfigCenter.getInstance();
131
+ configCenter.initialize(getDefaultConfig(), configManager);
132
+ configCenter.merge(config);
133
+ // 同步 userId 前缀到 user-id 模块(后续所有 userId 生成使用此前缀)
134
+ setUserIdPrefix(configCenter.get('provider.userId') ?? DEFAULT_USER_ID);
135
+ // 注入 configCenter 到 local-config 模块,此后所有本地模型配置读取统一走 configCenter
136
+ injectConfigCenter(configCenter);
137
+ // 统一从 configCenter 读取 maxTurns(合并了 defaults + config.json 覆盖)
138
+ const effectiveMaxTurns = configCenter.get('session.maxTurns') ?? maxTurns;
139
+ // ── Model Catalog Loader ───────────────────────────────────────────
140
+ getModelCatalogLoader(cwd);
141
+ modelCatalog.init(cwd);
142
+ const modelCtx = getModelContextWindow(provider.getProviderType(), provider.getModel());
143
+ // 仅当 configCenter 中尚无用户自定义值时,才用模型原生上限初始化
144
+ const existingMaxContext = configCenter.get('session.maxContext');
145
+ if (!existingMaxContext || existingMaxContext <= 0) {
146
+ configCenter.set('session.maxContext', modelCtx);
147
+ }
148
+ // ── Fallback 上下文自适应:降级链切换 Provider 时自动更新 maxContextTokens ──
149
+ let loopRef = null;
150
+ const fallbackChain = provider;
151
+ if (fallbackChain.setOnFallback) {
152
+ fallbackChain.setOnFallback((from, to) => {
153
+ const fromP = from;
154
+ const toProvider = to;
155
+ const newLimit = getModelContextWindow(toProvider.getProviderType(), toProvider.getModel());
156
+ const current = configCenter.get('session.maxContext') ?? 200000;
157
+ if (newLimit !== current) {
158
+ configCenter.set('session.maxContext', newLimit);
159
+ logger.info(`Fallback context adapted: ${current.toLocaleString()} → ${newLimit.toLocaleString()} (${toProvider.getProviderType()}/${toProvider.getModel()})`);
160
+ }
161
+ // 一次性通知:下一次 runTurn 消费
162
+ if (loopRef) {
163
+ loopRef.pendingFallbackInfo = `[Fallback] "${fromP.getProviderType()}" unavailable — using "${toProvider.getProviderType()}". Check API key or quota.`;
164
+ }
165
+ });
166
+ }
167
+ // 统一使用 configCenter 中的 maxContext,确保与 loop.ts 一致
168
+ const effectiveMaxContext = configCenter.get('session.maxContext') ?? maxContext;
169
+ // ── 核心模块 ──────────────────────────────────────────────────────
170
+ const contextComposer = new LayeredContextComposer(effectiveMaxContext);
171
+ const tokenCounter = new TokenCounter();
172
+ // ── 环境信息采集(进程启动时执行一次,注册为 ContextSource) ────────
173
+ const envInfo = collectSystemInfo();
174
+ contextComposer.registerSource({
175
+ name: 'env-info',
176
+ strategy: 'always_inline',
177
+ cacheability: 'anchor',
178
+ description: '运行环境信息(静态模板 + 动态系统信息 + 渠道信息)',
179
+ getContent: () => buildEnvironmentSection(envInfo, channelsInfo, { cwd }),
180
+ });
181
+ // 初始化渠道信息缓存(供 channel_info 工具查询)
182
+ setChannelsInfo(channelsInfo ?? []);
183
+ // ── 渠道上下文(告诉模型当前在哪个渠道、哪个 session) ──────────────
184
+ const currentChannel = options.channel;
185
+ const currentSessionIdForCtx = currentSessionId;
186
+ contextComposer.registerSource({
187
+ name: 'channel_context',
188
+ strategy: 'always_inline',
189
+ cacheability: 'live',
190
+ description: '当前渠道和会话上下文',
191
+ getContent: () => {
192
+ if (!currentChannel)
193
+ return '';
194
+ return `You are currently communicating via **${currentChannel}** channel (session: ${currentSessionIdForCtx.slice(0, 20)}...).`;
195
+ },
196
+ });
197
+ // ── Flow 注入(Zone 5 flow_injection section)─────────────────────
198
+ contextComposer.registerSource({
199
+ name: 'flow',
200
+ strategy: 'always_inline',
201
+ cacheability: 'live',
202
+ description: 'Flow 步骤注入(当前活跃 Flow 的步骤提示词)',
203
+ getContent: () => {
204
+ const active = flowRegistry.getActive();
205
+ return active?.getInjection() ?? '';
206
+ },
207
+ });
208
+ // ── 跨会话 Memory 系统 ─────────────────────────────────────────────
209
+ const memoryFilePath = config.memoryFile ?? path.join(os.homedir(), '.agent', 'prompts', 'persona', 'memory.md');
210
+ const memoryDir = path.dirname(memoryFilePath);
211
+ if (!fs.existsSync(memoryDir)) {
212
+ fs.mkdirSync(memoryDir, { recursive: true });
213
+ }
214
+ const memoryStore = new MemoryStore(memoryFilePath);
215
+ memoryStore.initializeIfNeeded();
216
+ contextComposer.registerSource({
217
+ name: 'memory',
218
+ strategy: 'always_inline',
219
+ cacheability: 'manifest',
220
+ description: '跨会话项目记忆',
221
+ getContent: () => memoryStore.formatForContext(),
222
+ });
223
+ // ── 陪伴模式 Memory ──────────────────────────────────────────────────
224
+ // 从角色目录动态读取(~/.agent/companion/<name>/memory.md),
225
+ // 不同角色各自独立的记忆文件。
226
+ contextComposer.registerSource({
227
+ name: 'companion_memory',
228
+ strategy: 'always_inline',
229
+ cacheability: 'manifest',
230
+ description: '陪伴模式专属记忆(按角色隔离)',
231
+ getContent: () => {
232
+ const router = getActiveRouter();
233
+ const name = router?.activeCompanionName;
234
+ if (typeof name !== 'string' || !name)
235
+ return '';
236
+ const file = path.join(os.homedir(), '.agent', 'companion', name, 'memory.md');
237
+ try {
238
+ const content = fs.readFileSync(file, 'utf-8');
239
+ return content.trim()
240
+ ? `<!-- 陪伴角色记忆(${name})-->\n\n${content}`
241
+ : '';
242
+ }
243
+ catch {
244
+ return ''; // 文件不存在,无记忆
245
+ }
246
+ },
247
+ });
248
+ // ── 会话临时工具 ContextSource ──────────────────────────────────────
249
+ // hot-reload 热添加的工具不进 Zone 2 tool_rules,在此 Zone 5 session_tools 展示。
250
+ // 下次启动时工具已在 ToolRegistry 中持久化,自然归位到 tool_rules。
251
+ contextComposer.registerSource({
252
+ name: 'session-tools',
253
+ strategy: 'index_only',
254
+ cacheability: 'live',
255
+ description: '会话临时工具',
256
+ getContent: () => {
257
+ const names = toolRegistry.getHotAddedNames();
258
+ return names.length > 0 ? `[Session-only tools]\n${names.join(', ')}` : '';
259
+ },
260
+ });
261
+ const channelRegistry = new ModelChannelRegistry(cwd);
262
+ const providerActive = typeof config.provider === 'object'
263
+ ? config.provider.active
264
+ : undefined;
265
+ channelRegistry.buildFromLegacy(config.models, config.local, providerActive);
266
+ channelRegistry.initializeChannels();
267
+ // 将 ProviderManager 构建的带弹性层(重试+熔断+降级链)的主 Provider 注入 registry,
268
+ // 替换 initializeChannels 中创建的裸 Provider
269
+ channelRegistry.setMainProvider(provider, providerActive);
270
+ // ── 创建各角色专用通道(独立 userId 实现 KVCache 隔离) ────────────
271
+ // 每个角色有独立的 KVCache 池,避免压缩/旁路/旁白等场景污染主对话缓存
272
+ // 同时为子Agent 工厂提取必要的配置
273
+ let subProviderApiKey;
274
+ let subProviderBaseType;
275
+ let subProviderModel;
276
+ let bypassProvider;
277
+ try {
278
+ if (providerActive) {
279
+ const provLoader = getProviderConfigLoader(cwd);
280
+ const envKey = provLoader.getProvider(providerActive)?.envKey;
281
+ const apiKey = envKey ? process.env[envKey] : undefined;
282
+ if (apiKey) {
283
+ const model = provider.getModel();
284
+ const baseType = providerActive;
285
+ // 保存供子Agent 工厂使用
286
+ subProviderApiKey = apiKey;
287
+ subProviderBaseType = baseType;
288
+ subProviderModel = model;
289
+ // 压缩器:独立 Provider(可能与主Agent/旁路并发运行)
290
+ const compressorProvider = ProviderManager.createProviderFromConfig({
291
+ type: baseType, apiKey, model, userId: compressorUserId(),
292
+ });
293
+ compressorProvider.setThinking?.(false);
294
+ channelRegistry.upsertChannel('compression', { provider: providerActive, model });
295
+ channelRegistry.setChannelProvider('compression', compressorProvider);
296
+ channelRegistry.setRoleMapping('compression', 'compression');
297
+ // 旁路Agent(narration + orchestrator):共享一个 Provider,模式切换时 setUserId
298
+ bypassProvider = ProviderManager.createProviderFromConfig({
299
+ type: baseType, apiKey, model,
300
+ userId: orchestratorUserId(), // 默认普通模式
301
+ });
302
+ bypassProvider.setThinking?.(false);
303
+ for (const channel of ['narration', 'orchestrator']) {
304
+ channelRegistry.upsertChannel(channel, { provider: providerActive, model });
305
+ channelRegistry.setChannelProvider(channel, bypassProvider);
306
+ channelRegistry.setRoleMapping(channel, channel);
307
+ }
308
+ }
309
+ }
310
+ }
311
+ catch {
312
+ // 通道创建失败不影响主流程
313
+ }
314
+ const modelRouter = new ModelRouter(provider, config.models, config.local, channelRegistry);
315
+ const summarizer = new StructuredSummarizer(modelRouter);
316
+ const compressor = new CompressorOrchestrator(tokenCounter, summarizer, effectiveMaxContext, {
317
+ compressThreshold: config.context?.compressThreshold,
318
+ compressDepth: config.context?.compressDepth,
319
+ });
320
+ const toolRegistry = createBuiltInTools(gitManager, currentSessionId, cwd);
321
+ const toolExecutor = new ToolExecutor(toolRegistry);
322
+ // ── 后台进程注册表(异步工具支持)────────────────────────────────────
323
+ const backgroundRegistry = new BackgroundProcessRegistry();
324
+ // 注入 BashTool(使其支持 async: true 模式)
325
+ const bashTool = toolRegistry.get('bash');
326
+ bashTool?.setBackgroundRegistry?.(backgroundRegistry);
327
+ // tools.allowAsync 配置(默认 true,可设为 false 禁止异步模式)
328
+ const allowAsync = configCenter.get('tools.allowAsync');
329
+ if (allowAsync === false && bashTool instanceof BashTool) {
330
+ bashTool.setAllowAsync(false);
331
+ }
332
+ // 注册后台进程管理工具
333
+ toolRegistry.register(createProcessListTool(backgroundRegistry));
334
+ toolRegistry.register(createProcessKillTool(backgroundRegistry));
335
+ toolRegistry.register(createProcessOutputTool(backgroundRegistry));
336
+ // 环境信息按需查询工具(替代 Zone 1 静态注入)
337
+ toolRegistry.register(createSystemInfoTool());
338
+ toolRegistry.register(createChannelInfoTool());
339
+ const conversationStore = new ConversationStore(maxMessages);
340
+ const eventStore = new EventStore();
341
+ const statsManager = new StatsManager();
342
+ const summaryStore = new SummaryStore();
343
+ // ── Skill 系统 ────────────────────────────────────────────────────
344
+ const skillRegistry = new SkillRegistry();
345
+ for (const skill of createBuiltinSkills()) {
346
+ skillRegistry.registerBuiltin(skill);
347
+ }
348
+ const skillTool = new SkillTool(skillRegistry);
349
+ toolRegistry.register(skillTool);
350
+ // 注册每个 Skill 为独立的 lazy_expand 源
351
+ for (const skill of skillRegistry.getAll()) {
352
+ contextComposer.registerSource({
353
+ name: `skill-${skill.name}`,
354
+ strategy: 'lazy_expand',
355
+ cacheability: 'manifest',
356
+ description: skill.description,
357
+ getContent: () => skillRegistry.getFullDefinitions([skill.name]),
358
+ });
359
+ }
360
+ // ── 定时任务调度器(提前构造,start 放入并行块)───────────────────
361
+ const persistedSchedule = configCenter.get('schedule');
362
+ const scheduleConfig = persistedSchedule ?? config.schedule;
363
+ const heartbeatScheduler = new HeartbeatScheduler(undefined, scheduleConfig);
364
+ heartbeatScheduler.subscribeConfig(configCenter);
365
+ // ── MCP 系统 + 独立初始化(并行) ──────────────────────────────────
366
+ const mcpSystem = new MCPSystem({ cwd });
367
+ // MCP 启动(可能启动子进程,慢)与调度器启动、依赖分析并行
368
+ const [, , dependencyAnalyzer] = await Promise.all([
369
+ mcpSystem.start(),
370
+ heartbeatScheduler.start(),
371
+ initDependencyAnalyzer(cwd),
372
+ ]);
373
+ mcpSystem.registerToToolRegistry(toolRegistry);
374
+ mcpSystem.registerToContextComposer(contextComposer);
375
+ if (supervisor) {
376
+ mcpSystem.registerToLifecycleSupervisor(supervisor);
377
+ }
378
+ // ── 插件系统(依赖 MCP 就绪)───────────────────────────────────────
379
+ const pluginManager = new PluginManager({
380
+ toolRegistry,
381
+ skillRegistry,
382
+ contextComposer,
383
+ projectDir: cwd,
384
+ mcpSystem,
385
+ });
386
+ await pluginManager.loadAll();
387
+ // ── 编排器 ────────────────────────────────────────────────────────
388
+ const planStore = new PlanStore();
389
+ const orchestrator = new LLMOrchestrator(provider, planStore, sessionDir, modelRouter);
390
+ // ── Provider 路由 ──────────────────────────────────────────────────
391
+ const providerRouter = new ProviderRouter();
392
+ providerRouter.register('main', provider);
393
+ if (localModelProvider) {
394
+ providerRouter.register('local', localModelProvider);
395
+ }
396
+ // ── Xref 交叉引用工具(AST 解析 + SQLite 索引) ─────────────────────
397
+ // 注册链:
398
+ // XrefManager.init(rootDir) → ~/.agent/cache/xref-<projectKey>.sqlite
399
+ // → XrefBuildTool/XrefQueryTool/XrefGraphTool → toolRegistry
400
+ // 解析器: TypeScript Compiler API (ts.createSourceFile) + 正则回退
401
+ try {
402
+ const { XrefManager, XrefBuildTool, XrefQueryTool, XrefGraphTool } = await import('../tools/xref/index.js');
403
+ const xrefManager = new XrefManager();
404
+ await xrefManager.init(cwd);
405
+ toolRegistry.register(new XrefBuildTool(xrefManager));
406
+ toolRegistry.register(new XrefQueryTool(xrefManager));
407
+ toolRegistry.register(new XrefGraphTool(xrefManager));
408
+ }
409
+ catch {
410
+ // xref 工具注册失败不影响核心功能(如 better-sqlite3 不可用等)
411
+ }
412
+ // ── 子 Agent 系统 ─────────────────────────────────────────────────
413
+ const agentRegistry = new AgentRegistry();
414
+ const agents = await loadAgentConfigs(cwd, config.agents);
415
+ for (const agent of agents) {
416
+ agentRegistry.register(agent);
417
+ }
418
+ const delegateTool = new DelegateToAgentTool(agentRegistry, {
419
+ modelRouter,
420
+ toolRegistry,
421
+ sessionDir,
422
+ maxContextTokens: maxContext,
423
+ dependencyAnalyzer,
424
+ createSubProvider: (userId) => {
425
+ if (!subProviderApiKey || !subProviderBaseType) {
426
+ throw new Error('Cannot create sub-agent provider: main provider not configured.');
427
+ }
428
+ return ProviderManager.createProviderFromConfig({
429
+ type: subProviderBaseType,
430
+ apiKey: subProviderApiKey,
431
+ model: subProviderModel ?? '',
432
+ userId,
433
+ });
434
+ },
435
+ });
436
+ toolRegistry.register(delegateTool);
437
+ // 注册每个子 Agent 为独立的 lazy_expand 源
438
+ for (const agent of agentRegistry.getAll()) {
439
+ contextComposer.registerSource({
440
+ name: `agent-${agent.name}`,
441
+ strategy: 'lazy_expand',
442
+ cacheability: 'manifest',
443
+ description: agent.description,
444
+ getContent: () => agentRegistry.getFullDefinitions([agent.name]),
445
+ });
446
+ }
447
+ // ── 知识库(Zone 4,默认关闭)───────────────────────────────────────
448
+ const kbDir = path.join(os.homedir(), '.agent', 'knowledge');
449
+ const kbStorePath = path.join(kbDir, 'kb.sqlite');
450
+ // 结构化存储(主)
451
+ const structuredStore = new StructuredStore(kbStorePath);
452
+ // 旧版文件索引(保留兼容)
453
+ const kbFilesDir = path.join(kbDir, 'files');
454
+ fs.mkdirSync(kbFilesDir, { recursive: true });
455
+ const knowledgeBase = new KnowledgeBase(kbStorePath);
456
+ const kbState = { lastQuery: '' };
457
+ // 从 config 恢复 KB/Zone4 状态(持久化)
458
+ if (configCenter.get('kb.enabled')) {
459
+ knowledgeBase.enable();
460
+ }
461
+ if (configCenter.get('kb.zone4')) {
462
+ knowledgeBase.setZone4Enabled(true);
463
+ contextComposer.activeConditions.add('zone4_enabled');
464
+ }
465
+ // Zone 4 ContextSource(结构化 tag 匹配 + FTS5 兜底)
466
+ contextComposer.registerSource({
467
+ name: 'kb_context',
468
+ strategy: 'always_inline',
469
+ cacheability: 'live',
470
+ description: '知识库检索结果',
471
+ getContent: async () => {
472
+ if (!knowledgeBase.enabled)
473
+ return '';
474
+ const q = kbState.lastQuery;
475
+ if (!q || !q.trim())
476
+ return '';
477
+ const maxTotal = configCenter.get('kb.maxTotal') ?? 5;
478
+ const maxMain = configCenter.get('kb.maxMain') ?? 3;
479
+ const maxRefs = configCenter.get('kb.maxRefs') ?? 2;
480
+ return structuredStore.formatResults(structuredStore.search(q, maxTotal), maxMain, maxRefs);
481
+ },
482
+ });
483
+ toolRegistry.register(createKbToggleTool(knowledgeBase, contextComposer));
484
+ // 结构化知识库工具(4合1:add/update/delete/list)
485
+ toolRegistry.register(createStructuredTool(structuredStore, () => knowledgeBase.enabled));
486
+ // ── 知识库文件监控(后台自动索引 files/ 目录变更)─────────────────
487
+ const kbWatcher = new KnowledgeWatcher({
488
+ filesDir: kbFilesDir,
489
+ retriever: knowledgeBase.retriever,
490
+ });
491
+ // 异步启动,不阻塞 Agent 主流程
492
+ kbWatcher.start().catch(() => { });
493
+ // ── Command Registry(斜杠命令外部配置化,支持模型修改 + 热重载) ──
494
+ CommandRegistry.getInstance(cwd);
495
+ // ── AgentLoop ─────────────────────────────────────────────────────
496
+ const loop = new AgentLoop(provider, contextComposer, compressor, orchestrator, toolExecutor, toolRegistry, conversationStore, eventStore, statsManager, sessionDir, summaryStore, effectiveMaxTurns, maxContext, outputHandler, skillRegistry, mcpSystem.getBridge(), dependencyAnalyzer, agentRegistry, effectivePersonaDir, flowRegistry, providerRouter, new Set(config.safety?.dangerousTools ?? ['write', 'bash']), new Set(), configCenter, modelRouter, turnRecorder);
497
+ // 注入知识库状态引用
498
+ loop.kbState = kbState;
499
+ loopRef = loop; // wire fallback notification
500
+ // 注入旁路 Provider 引用(供模式切换时 setBypassUserId 使用)
501
+ if (bypassProvider)
502
+ loop.setBypassProvider(bypassProvider);
503
+ // ── Bootstrap Flow 自动激活(首次安装后自动运行) ──
504
+ if (effectiveBootstrapStatus === 'pending') {
505
+ flowRegistry.activate('bootstrap');
506
+ }
507
+ // 注册后台进程注册表到 LifecycleSupervisor(优雅关闭时自动清理)
508
+ if (supervisor) {
509
+ supervisor.registerBackgroundRegistry(backgroundRegistry);
510
+ }
511
+ // ── 陪伴模式 Session 管理(全局单例,所有渠道共享) ──────────────
512
+ const companionSessionManager = CompanionSessionManager.getInstance();
513
+ // 注入精确模式策略(默认普通模式)
514
+ const composeStrategy = sessionType === 'precise'
515
+ ? new PreciseStrategy(sessionDir)
516
+ : new DefaultStrategy();
517
+ loop.composeStrategy = composeStrategy;
518
+ // 启动时恢复陪伴模式 Router + 上次角色名(session 切换由 syncRouter 首次调用触发)
519
+ if (sessionType === 'companion') {
520
+ const companionRouter = switchRouter('companion');
521
+ try {
522
+ const last = fs.readFileSync(path.join(os.homedir(), '.agent', 'companion', '.last-character'), 'utf-8').trim();
523
+ if (last)
524
+ companionRouter.activeCompanionName = last;
525
+ }
526
+ catch { }
527
+ }
528
+ // ── 旁路Agent 管理器 ──────────────────────────────────────────
529
+ const bypassManager = new (await import('../bypass/manager.js')).BypassManager();
530
+ bypassManager.setModelRouter(modelRouter);
531
+ // 注册 WorldEngine(陪伴模式旁路Agent)
532
+ const companionCharName = (() => {
533
+ try {
534
+ const last = fs.readFileSync(path.join(os.homedir(), '.agent', 'companion', '.last-character'), 'utf-8').trim();
535
+ return last || '';
536
+ }
537
+ catch {
538
+ return '';
539
+ }
540
+ })();
541
+ bypassManager.register(new (await import('../bypass/agents/companion/index.js')).WorldEngine(companionCharName));
542
+ // 注册 Orchestrator(普通模式旁路Agent)— 已暂停(2026-07-10)
543
+ // 待分层过滤策略成熟后重新启用,设计方案见:桌面/旁路Agent重构构想.md
544
+ // bypassManager.register(new (await import('../bypass/agents/orchestrator/index.js')).ContextOrchestrator(memoryFilePath));
545
+ loop.bypassManager = bypassManager;
546
+ // 陪伴模式启动时自动激活 world-engine
547
+ if (sessionType === 'companion' && companionCharName) {
548
+ bypassManager.activateForMode('companion').catch(() => { });
549
+ }
550
+ // 普通模式:orchestrator 已暂停,不再激活
551
+ // if (sessionType === 'normal') {
552
+ // const orchestratorEnabled = configCenter.get<boolean>('bypass.orchestratorEnabled') ?? true;
553
+ // if (orchestratorEnabled) {
554
+ // bypassManager.activateAgent('orchestrator').catch(() => {});
555
+ // }
556
+ // }
557
+ // ── Read 工具的图片处理器 — 将读到的图片注入 ImageStore ──
558
+ const readTool = toolRegistry.get('read');
559
+ if (readTool && typeof readTool.setImageHandler === 'function') {
560
+ readTool.setImageHandler({
561
+ store: (base64, mime, sourcePath) => loop.imageStore.store(base64, mime, sourcePath),
562
+ inject: (imgId, data, mediaType) => {
563
+ loop.pendingImageInjections.push({ imgId, data, media_type: mediaType });
564
+ },
565
+ });
566
+ }
567
+ // ── ImageStore 上下文注入 — 让模型始终知道已索引的图片 ──────────
568
+ contextComposer.registerSource({
569
+ name: 'image_store',
570
+ strategy: 'always_inline',
571
+ cacheability: 'live',
572
+ description: '已索引图片清单(通过 view_image 工具可重新查看)',
573
+ getContent: () => loop.imageStore.listForContext(),
574
+ });
575
+ // ── Runtime Control 工具注册 ──────────────────────────────────────
576
+ // ⚠️ 工具只通过注册表统一注册,禁止在此处或 loop.ts 中直接 new Tool() 硬编码。
577
+ // 新增运行时工具的正确方式:
578
+ // 1. src/tools/runtime-control.ts → createXxxTool() 工厂函数
579
+ // 2. src/registry/tool.registry.ts → registerRuntimeControlTools() 内注册
580
+ // 3. 命名遵循 create{Name}Tool 模式,参考已有工具
581
+ // 内置工具 → src/tools/index.ts → createDefaultRegistry()
582
+ // 不依赖 loop 的工具在 AgentLoop 之前注册;依赖 loop 的紧跟在构造之后。
583
+ // 确保工具列表在首轮 compose 前已完整。
584
+ toolRegistry.registerConfigTools(configCenter);
585
+ // registerRuntimeControlTools 内有 switch_provider / set_mode 等 30+ 工具依赖 loop 实例
586
+ toolRegistry.registerRuntimeControlTools(loop, providerRouter, skillRegistry, agentRegistry, configCenter, cwd, heartbeatScheduler, mcpSystem, modelRouter);
587
+ toolRegistry.register(createTriggerCompressionTool(loop));
588
+ // destroy_sub_agent 需要 sessionDir,在此单独注册
589
+ const { createDestroySubAgentTool } = await import('../tools/runtime-control.js');
590
+ toolRegistry.register(createDestroySubAgentTool(agentRegistry, sessionDir));
591
+ // ── 陪伴模式工具注册 ──────────────────────────────────────────────
592
+ const { createCompanionModeTool, createResetCompanionSessionTool } = await import('../tools/runtime-control.js');
593
+ toolRegistry.register(createCompanionModeTool(loop, companionSessionManager));
594
+ toolRegistry.register(createResetCompanionSessionTool(loop, companionSessionManager));
595
+ // ── 回合回滚工具 ──
596
+ toolRegistry.register(createRollbackStatusTool(turnStore, () => loop.turnNumber));
597
+ toolRegistry.register(createRollbackTool(turnStore, gitManager, () => loop.turnNumber));
598
+ // ── Flow 控制工具 ──
599
+ toolRegistry.register(createFlowStartTool(flowRegistry));
600
+ toolRegistry.register(createFlowAddTool(flowRegistry));
601
+ toolRegistry.register(createFlowCompleteTool(flowRegistry));
602
+ // ── 用户交互工具 ──
603
+ toolRegistry.register(createAskUserTool());
604
+ // 注册 MCP 状态变更回调 — 消息通过 ContextSource (runtime:mcp_status) 自动注入 Zone 5,
605
+ // 此处仅保留日志记录(未来可扩展为 TUI 状态栏更新)
606
+ mcpSystem.onStatusChange(({ type, name, tools }) => {
607
+ logger.info(`MCP status: ${type}`, { name, tools: tools?.join(',') });
608
+ });
609
+ loop.setScheduler(heartbeatScheduler);
610
+ // ── 渠道 Loop 注册表(定时任务渠道感知路由) ──
611
+ // 导出为模块级单例,供 feishu-channel 等渠道在 start() 时自行注册
612
+ if (!globalThis.__channelLoopRegistry) {
613
+ globalThis.__channelLoopRegistry = new Map();
614
+ }
615
+ const channelLoops = globalThis.__channelLoopRegistry;
616
+ // 主 loop 注册为 'tui'(TUI 本地模式的默认渠道)
617
+ channelLoops.set('tui', loop);
618
+ /** 按降级链查找第一个在线的渠道 Loop */
619
+ const resolveChannelLoop = (task) => {
620
+ // 1) 首选渠道
621
+ if (task.channel) {
622
+ const l = channelLoops.get(task.channel);
623
+ if (l)
624
+ return { loop: l, channel: task.channel, level: 'primary' };
625
+ }
626
+ // 2) 任务级降级链
627
+ const fallback = task.fallback ?? configCenter.get('schedule.channelFallback');
628
+ if (fallback && fallback.length > 0) {
629
+ for (const ch of fallback) {
630
+ const l = channelLoops.get(ch);
631
+ if (l)
632
+ return { loop: l, channel: ch, level: 'fallback' };
633
+ }
634
+ }
635
+ // 3) 最后兜底:飞书(持久消息渠道),再不行才用本地 loop
636
+ const feishuLoop = channelLoops.get('feishu');
637
+ if (feishuLoop)
638
+ return { loop: feishuLoop, channel: 'feishu', level: 'last-resort' };
639
+ return { loop, channel: 'tui', level: 'last-resort' };
640
+ };
641
+ // 定时任务处理器:任务触发时根据 channel + 降级链路由到对应渠道的 Loop
642
+ heartbeatScheduler.setHandler(async (task) => {
643
+ logger.info(`Scheduled task fired: ${task.name}`, { id: task.id, type: task.action.type, channel: task.channel });
644
+ // 模式隔离:跳过不属于当前模式的任务
645
+ if (task.mode) {
646
+ const currentMode = isCompanionModeActive() ? 'companion' : 'normal';
647
+ if (task.mode !== currentMode) {
648
+ logger.info(`Task "${task.name}" skipped: mode "${task.mode}" ≠ current "${currentMode}"`);
649
+ return;
650
+ }
651
+ }
652
+ if (task.action.type === 'command') {
653
+ // 命令式任务 — 不需要渠道,直接执行 shell 命令
654
+ const { exec } = await import('node:child_process');
655
+ exec(task.action.target, { timeout: 30000 }, (err, stdout, stderr) => {
656
+ if (err)
657
+ logger.error(`Task command failed: ${task.name}`, err, { stderr: stderr.trim() });
658
+ else
659
+ logger.info(`Task command OK: ${task.name}`, { stdout: stdout.trim() });
660
+ });
661
+ return;
662
+ }
663
+ // 陪伴模式:广播到所有活跃渠道(TUI + 飞书共享同一对话)
664
+ if (task.mode === 'companion') {
665
+ const feishuEntry = channelLoops.get('feishu');
666
+ const collectedTexts = [];
667
+ // 在 TUI loop 上运行 Agent,同时收集输出用于飞书推送
668
+ const originalHandler = loop.outputHandler;
669
+ if (originalHandler) {
670
+ const dualHandler = {
671
+ ...originalHandler,
672
+ onText: (text) => {
673
+ collectedTexts.push(text);
674
+ originalHandler.onText?.(text);
675
+ },
676
+ };
677
+ loop.outputHandler = dualHandler;
678
+ }
679
+ try {
680
+ await loop.notifyTaskFired(task.name);
681
+ }
682
+ finally {
683
+ if (originalHandler) {
684
+ loop.outputHandler = originalHandler;
685
+ }
686
+ }
687
+ // 将 Agent 回复推送到飞书
688
+ if (feishuEntry?.sendProactiveMessage && collectedTexts.length > 0) {
689
+ const response = collectedTexts.join('').trim();
690
+ if (response) {
691
+ const feishuSessionId = task.sessionId;
692
+ await feishuEntry.sendProactiveMessage(feishuSessionId ?? '', response).catch((err) => logger.error(`Companion task feishu push failed: ${task.name}`, err));
693
+ }
694
+ }
695
+ return;
696
+ }
697
+ // AI 交互式任务 — 按降级链查找可用渠道
698
+ const { loop: targetEntry, channel: usedChannel, level } = resolveChannelLoop(task);
699
+ if (level === 'fallback') {
700
+ logger.warn(`Task "${task.name}" channel "${task.channel}" offline, downgraded to "${usedChannel}"`, { taskId: task.id });
701
+ }
702
+ else if (level === 'last-resort' && task.channel) {
703
+ logger.warn(`Task "${task.name}" channel "${task.channel}" and all fallbacks offline, last-resort to "${usedChannel}"`, { taskId: task.id });
704
+ }
705
+ // 非 TUI 渠道(飞书等):主动推送模式
706
+ // handleTaskNotification 内部会运行 Agent、收集输出、发送到飞书聊天
707
+ const sessionId = task.sessionId;
708
+ const entry = targetEntry;
709
+ if (entry.sendProactiveMessage && usedChannel !== 'tui') {
710
+ await entry.notifyTaskFired(task.name, sessionId);
711
+ }
712
+ else {
713
+ entry.notifyTaskFired(task.name).catch((err) => logger.error(`Task notify failed (channel: ${usedChannel}): ${task.name}`, err));
714
+ }
715
+ });
716
+ // 订阅 RuntimeConfigCenter 变更,让 update_config 即时生效
717
+ loop.subscribeConfig();
718
+ // 订阅 models.* 和 local.* 配置变更,热重载 ModelRouter
719
+ configCenter.watch('models.*', () => {
720
+ const newModels = configCenter.get('models');
721
+ const newLocal = configCenter.get('local');
722
+ if (newModels) {
723
+ modelRouter.setConfig(newModels, newLocal);
724
+ }
725
+ });
726
+ configCenter.watch('local.*', () => {
727
+ const newModels = configCenter.get('models');
728
+ const newLocal = configCenter.get('local');
729
+ if (newModels) {
730
+ modelRouter.setConfig(newModels, newLocal);
731
+ }
732
+ });
733
+ // ── Restore persisted disabled states from configCenter ──
734
+ const persistedDisabledTools = configCenter.get('tools.disabled');
735
+ if (Array.isArray(persistedDisabledTools)) {
736
+ for (const name of persistedDisabledTools) {
737
+ toolRegistry.disableTool(name);
738
+ }
739
+ }
740
+ const persistedDisabledSkills = configCenter.get('skills.disabled');
741
+ if (Array.isArray(persistedDisabledSkills)) {
742
+ for (const name of persistedDisabledSkills) {
743
+ skillRegistry.disableSkill(name);
744
+ }
745
+ }
746
+ const persistedDisabledAgents = configCenter.get('agents.disabled');
747
+ if (Array.isArray(persistedDisabledAgents)) {
748
+ for (const name of persistedDisabledAgents) {
749
+ agentRegistry.disableAgent(name);
750
+ }
751
+ }
752
+ // ── Tool Bundle Registry ────────────────────────────────────────────
753
+ // 上下文注册链路:
754
+ // manifest-defaults.ts Zone 1 → tool_bundles section (runtime:tool_bundles)
755
+ // → section-resolver.ts resolveRuntime() → ctx.sources.get('tool-bundles')
756
+ // → 本文件(ContextSource 注册,getContent 闭包)
757
+ // → src/tools/bundle-registry.ts (ToolBundleRegistry,持久化到 ~/.agent/tool-bundles.json)
758
+ // 工具过滤链路:
759
+ // loop.ts runTurn() → bundleRegistry.getActiveToolNames() → 过滤 toolDefinitions
760
+ const bundleRegistry = new ToolBundleRegistry(cwd);
761
+ registerBundleTools(toolRegistry, bundleRegistry);
762
+ contextComposer.registerSource({
763
+ name: 'tool-bundles',
764
+ strategy: 'always_inline',
765
+ cacheability: 'manifest',
766
+ description: '工具包索引',
767
+ getContent: () => {
768
+ const bundles = bundleRegistry.list();
769
+ if (bundles.length === 0)
770
+ return '';
771
+ const activeNames = new Set(bundleRegistry.getActive().map(b => b.name));
772
+ const lines = bundles.map(b => {
773
+ let marker = '';
774
+ if (b.name === 'common') {
775
+ marker = ' [始终加载]';
776
+ }
777
+ else if (activeNames.has(b.name)) {
778
+ marker = ' [已激活]';
779
+ }
780
+ const toolCount = b.tools.length > 0 ? ` (${b.tools.length} tools)` : ' (全量)';
781
+ return `- ${b.name}: ${b.description}${toolCount}${marker}`;
782
+ });
783
+ const statusLine = bundleRegistry.isAllMode()
784
+ ? '当前状态: 全量模式 — 所有工具均可用'
785
+ : `当前激活: ${[...activeNames].join(', ')}`;
786
+ return `${statusLine}\n\n${lines.join('\n')}`;
787
+ },
788
+ });
789
+ loop.setBundleRegistry(bundleRegistry);
790
+ // ── Hot Reload Manager ────────────────────────────────────────────
791
+ const hotReloadManager = new HotReloadManager({
792
+ toolRegistry,
793
+ skillRegistry,
794
+ agentRegistry,
795
+ pluginManager,
796
+ configCenter,
797
+ contextComposer,
798
+ mcpSystem,
799
+ bundleRegistry,
800
+ channelRegistry,
801
+ cwd,
802
+ providerConfigLoader,
803
+ modelCatalog,
804
+ });
805
+ // 清除上一 session 可能残留的热插拔标记,确保重启后工具归位 Zone 2
806
+ toolRegistry.clearHotAdded();
807
+ hotReloadManager.start();
808
+ return {
809
+ loop,
810
+ sessionDir,
811
+ sessionManager,
812
+ toolRegistry,
813
+ skillRegistry,
814
+ agentRegistry,
815
+ dependencyAnalyzer,
816
+ contextComposer,
817
+ mcpSystem,
818
+ hotReloadManager,
819
+ modelRouter,
820
+ providerConfigLoader,
821
+ knowledgeBase,
822
+ kbState,
823
+ kbWatcher,
824
+ structuredStore,
825
+ composeStrategy,
826
+ companionSessionManager,
827
+ backgroundRegistry,
828
+ scheduler: heartbeatScheduler,
829
+ channelLoops,
830
+ };
831
+ }
832
+ //# sourceMappingURL=factory.js.map