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,167 @@
1
+ /**
2
+ * 回滚工具 — rollback_status + rollback
3
+ *
4
+ * 两个独立工具,通过工厂函数创建:
5
+ * - createRollbackStatusTool: 查看可回滚的回合列表
6
+ * - createRollbackTool: 执行回滚操作
7
+ */
8
+ import { createLogger } from '../logging/logger.js';
9
+ const logger = createLogger('rollback-tool');
10
+ // ── rollback_status ──────────────────────────────────────────────────
11
+ export function createRollbackStatusTool(turnStore, getCurrentTurn) {
12
+ return {
13
+ name: 'rollback_status',
14
+ description: 'View the list of turns available for rollback. Each turn shows its ID, timestamp, ' +
15
+ 'number of changed files, and executed commands. Use this before calling rollback to ' +
16
+ 'decide how many turns to roll back.',
17
+ inputSchema: {
18
+ type: 'object',
19
+ properties: {},
20
+ required: [],
21
+ },
22
+ async execute(_args) {
23
+ try {
24
+ const records = await turnStore.list();
25
+ const currentTurn = getCurrentTurn();
26
+ if (records.length === 0) {
27
+ return 'No turns available for rollback. Turns are recorded as you interact with the agent.';
28
+ }
29
+ const entries = records.map(r => {
30
+ const fileNames = r.changedFiles.slice(0, 3).map(f => f.path);
31
+ const extra = r.changedFiles.length > 3 ? ` (+${r.changedFiles.length - 3} more)` : '';
32
+ return {
33
+ turnId: r.turnId,
34
+ timestamp: r.timestamp,
35
+ fileCount: r.changedFiles.length,
36
+ commandCount: r.commands.length,
37
+ fileSummary: fileNames.join(', ') + extra,
38
+ };
39
+ });
40
+ const lines = [
41
+ `Current turn: ${currentTurn} | Stored turns: ${records.length} (max 20)`,
42
+ '',
43
+ 'Available rollback points:',
44
+ ];
45
+ for (const e of entries) {
46
+ const marker = e.turnId === currentTurn ? ' ← current' : '';
47
+ lines.push(` Turn ${e.turnId}${marker}`);
48
+ lines.push(` ${e.timestamp}`);
49
+ lines.push(` Files: ${e.fileCount} (${e.fileSummary || 'none'})`);
50
+ if (e.commandCount > 0) {
51
+ lines.push(` Commands: ${e.commandCount}`);
52
+ }
53
+ lines.push('');
54
+ }
55
+ lines.push('Use rollback({turns: N}) to roll back N turns.');
56
+ return lines.join('\n');
57
+ }
58
+ catch (err) {
59
+ return `Error reading rollback status: ${err instanceof Error ? err.message : String(err)}`;
60
+ }
61
+ },
62
+ };
63
+ }
64
+ // ── rollback ─────────────────────────────────────────────────────────
65
+ export function createRollbackTool(turnStore, gitManager, getCurrentTurn) {
66
+ return {
67
+ name: 'rollback',
68
+ description: 'Roll back file changes made in the last N turns. ' +
69
+ 'Uses git to restore files to their state before the target turn. ' +
70
+ 'Only file changes are reverted; configuration changes may need manual review. ' +
71
+ 'Use rollback_status first to see available turns.',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ turns: {
76
+ type: 'number',
77
+ description: 'Number of turns to roll back (default: 1, range: 1-10). ' +
78
+ 'Rollback(1) reverts the most recent turn.',
79
+ },
80
+ },
81
+ required: [],
82
+ },
83
+ async execute(args) {
84
+ const turns = args.turns ?? 1;
85
+ if (turns < 1 || turns > 10) {
86
+ return 'Error: "turns" must be between 1 and 10.';
87
+ }
88
+ try {
89
+ const currentTurn = getCurrentTurn();
90
+ const records = await turnStore.list();
91
+ if (records.length === 0) {
92
+ return 'No turns available to roll back.';
93
+ }
94
+ // 找到目标回合:回退 N 回合 → currentTurn - N + 1
95
+ const targetTurnId = currentTurn - turns + 1;
96
+ // 找到最近的 ≤ targetTurnId 的已存储回合
97
+ const targetRecord = records
98
+ .filter(r => r.turnId <= targetTurnId)
99
+ .sort((a, b) => b.turnId - a.turnId)[0];
100
+ if (!targetRecord) {
101
+ // 如果目标回合未存储,回退到最早的已存储回合
102
+ const earliest = records.sort((a, b) => a.turnId - b.turnId)[0];
103
+ return `Target turn ${targetTurnId} is not stored (oldest available: ${earliest.turnId}). ` +
104
+ `Use rollback_status to see available turns.`;
105
+ }
106
+ // 收集将要被回滚的回合信息(用于报告)
107
+ const rolledBackTurns = records.filter(r => r.turnId > targetRecord.turnId);
108
+ // ── 执行回滚 ──
109
+ if (targetRecord.preCommit) {
110
+ // 有 git commit → 精确恢复
111
+ try {
112
+ await gitManager.resetHard(targetRecord.preCommit);
113
+ logger.info(`Rolled back to turn ${targetRecord.turnId} (preCommit: ${targetRecord.preCommit.slice(0, 8)})`);
114
+ }
115
+ catch (err) {
116
+ return `Git rollback failed: ${err instanceof Error ? err.message : String(err)}\n` +
117
+ `Try manually: git reset --hard ${targetRecord.preCommit.slice(0, 8)}`;
118
+ }
119
+ // 清理 tag
120
+ for (const r of rolledBackTurns) {
121
+ try {
122
+ await gitManager.git(['tag', '-d', `rollback-turn-${r.turnId}`]);
123
+ }
124
+ catch {
125
+ // tag 可能不存在,忽略
126
+ }
127
+ }
128
+ }
129
+ else {
130
+ return 'Cannot roll back: no git repository detected. ' +
131
+ 'Git-based rollback requires a git repository in the project directory.';
132
+ }
133
+ // ── 清理缓存 ──
134
+ await turnStore.deleteRange(targetRecord.turnId + 1);
135
+ // ── 构建报告 ──
136
+ const totalFiles = rolledBackTurns.reduce((sum, r) => sum + r.changedFiles.length, 0);
137
+ const allFiles = rolledBackTurns.flatMap(r => r.changedFiles.map(f => f.path));
138
+ const uniqueFiles = [...new Set(allFiles)];
139
+ const fileList = uniqueFiles.slice(0, 10)
140
+ .map(f => ` • ${f}`)
141
+ .join('\n');
142
+ const extraFiles = uniqueFiles.length > 10
143
+ ? `\n ... and ${uniqueFiles.length - 10} more files`
144
+ : '';
145
+ const allCommands = rolledBackTurns.flatMap(r => r.commands);
146
+ const cmdLines = allCommands.length > 0
147
+ ? `\n\n💡 ${rolledBackTurns.length} rolled-back turn(s) executed these commands — please check for side effects:\n` +
148
+ allCommands.map(c => ` • ${c}`).join('\n')
149
+ : '';
150
+ const lines = [
151
+ `🔄 Rolled back ${turns} turn(s) to turn ${targetRecord.turnId} (before the reverted changes).`,
152
+ '',
153
+ `✅ ${uniqueFiles.length} file(s) restored across ${rolledBackTurns.length} turn(s):`,
154
+ fileList + extraFiles,
155
+ cmdLines,
156
+ '',
157
+ `💡 If there were config changes (channels, settings, etc.), please check and fix them manually.`,
158
+ ];
159
+ return lines.join('\n');
160
+ }
161
+ catch (err) {
162
+ return `Rollback error: ${err instanceof Error ? err.message : String(err)}`;
163
+ }
164
+ },
165
+ };
166
+ }
167
+ //# sourceMappingURL=rollback-tool.js.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * TurnRecorder — 回合追踪器
3
+ *
4
+ * 在每个回合的生命周期中自动记录文件变更:
5
+ * - 回合开始 → git commit(生成回滚锚点)
6
+ * - 工具执行前 → 拦截 write/edit 读取旧内容
7
+ * - 回合结束 → git diff 补充检测 + 写入 TurnStore
8
+ */
9
+ import type { GitManager } from '../evolution/git-manager.js';
10
+ import type { TurnStore } from './turn-store.js';
11
+ import type { TurnRecord } from './types.js';
12
+ export declare class TurnRecorder {
13
+ private gitManager;
14
+ private turnStore;
15
+ private currentRecord;
16
+ private projectDir;
17
+ /** 记录已手动捕获预状态的路径 → 避免 git diff 重复添加 */
18
+ private recordedPaths;
19
+ constructor(gitManager: GitManager, turnStore: TurnStore, projectDir: string);
20
+ /** 回合开始时调用。返回 preCommit hash(非 git 时为空字符串) */
21
+ startTurn(turnId: number): Promise<string>;
22
+ /**
23
+ * 记录文件写操作的前置状态。
24
+ * 在 write / edit / multi_edit 工具执行前调用。
25
+ * @param absolutePath 文件的绝对路径
26
+ */
27
+ recordPreState(absolutePath: string): void;
28
+ /** 记录 bash 命令 */
29
+ recordCommand(command: string): void;
30
+ /** 回合结束时调用。补充 git diff 检测 → 写入 TurnStore */
31
+ endTurn(): Promise<TurnRecord | null>;
32
+ /** 通过 git diff --name-status 补充检测遗漏的变更文件 */
33
+ private enrichFromGitDiff;
34
+ /** 绝对路径 → 相对于项目根目录的路径 */
35
+ private toRelativePath;
36
+ }
37
+ //# sourceMappingURL=turn-recorder.d.ts.map
@@ -0,0 +1,183 @@
1
+ /**
2
+ * TurnRecorder — 回合追踪器
3
+ *
4
+ * 在每个回合的生命周期中自动记录文件变更:
5
+ * - 回合开始 → git commit(生成回滚锚点)
6
+ * - 工具执行前 → 拦截 write/edit 读取旧内容
7
+ * - 回合结束 → git diff 补充检测 + 写入 TurnStore
8
+ */
9
+ import fs from 'node:fs';
10
+ import path from 'node:path';
11
+ import { createLogger } from '../logging/logger.js';
12
+ const logger = createLogger('turn-recorder');
13
+ export class TurnRecorder {
14
+ gitManager;
15
+ turnStore;
16
+ currentRecord = null;
17
+ projectDir;
18
+ /** 记录已手动捕获预状态的路径 → 避免 git diff 重复添加 */
19
+ recordedPaths = new Set();
20
+ constructor(gitManager, turnStore, projectDir) {
21
+ this.gitManager = gitManager;
22
+ this.turnStore = turnStore;
23
+ this.projectDir = projectDir;
24
+ }
25
+ // ── Public API ─────────────────────────────────────────────────────
26
+ /** 回合开始时调用。返回 preCommit hash(非 git 时为空字符串) */
27
+ async startTurn(turnId) {
28
+ let preCommit = '';
29
+ try {
30
+ if (await this.gitManager.isRepo()) {
31
+ // 先处理可能存在的未提交变更(上一回合残留)
32
+ const hasChanges = await this.gitManager.hasUncommittedChanges();
33
+ if (hasChanges) {
34
+ // 先 stash,commit 干净的状态,再 pop(确保 pre-commit 只含本回合前的状态)
35
+ // 实际做法:直接 commit 当前状态(包含所有未提交变更),这些变更属于上一回合
36
+ logger.debug('Uncommitted changes detected before turn start, committing as previous turn state.');
37
+ }
38
+ preCommit = await this.gitManager.commit(`auto: pre-turn-${turnId}`);
39
+ logger.debug(`Pre-turn commit: ${preCommit.slice(0, 8)} for turn ${turnId}`);
40
+ // 打轻量 tag 方便 git log 查找
41
+ try {
42
+ await this.gitManager.git(['tag', '-f', `rollback-turn-${turnId}`]);
43
+ }
44
+ catch {
45
+ // tag 失败不阻塞
46
+ }
47
+ }
48
+ }
49
+ catch (err) {
50
+ logger.warn(`Failed to create pre-turn commit for turn ${turnId}`, {
51
+ error: err instanceof Error ? err.message : String(err),
52
+ });
53
+ // 不阻塞回合
54
+ }
55
+ this.currentRecord = {
56
+ turnId,
57
+ timestamp: new Date().toISOString(),
58
+ preCommit,
59
+ changedFiles: [],
60
+ commands: [],
61
+ };
62
+ this.recordedPaths.clear();
63
+ return preCommit;
64
+ }
65
+ /**
66
+ * 记录文件写操作的前置状态。
67
+ * 在 write / edit / multi_edit 工具执行前调用。
68
+ * @param absolutePath 文件的绝对路径
69
+ */
70
+ recordPreState(absolutePath) {
71
+ if (!this.currentRecord)
72
+ return;
73
+ // 转为相对于项目目录的路径
74
+ const relPath = this.toRelativePath(absolutePath);
75
+ // 去重:同一个文件可能被多次拦截(如多次 edit),只记录第一次
76
+ if (this.recordedPaths.has(relPath))
77
+ return;
78
+ this.recordedPaths.add(relPath);
79
+ const exists = fs.existsSync(absolutePath);
80
+ const entry = {
81
+ path: relPath,
82
+ action: exists ? 'modified' : 'created',
83
+ };
84
+ if (exists) {
85
+ try {
86
+ entry.oldContent = fs.readFileSync(absolutePath, 'utf-8');
87
+ }
88
+ catch {
89
+ // 二进制文件或读取失败,不存 oldContent
90
+ }
91
+ }
92
+ this.currentRecord.changedFiles.push(entry);
93
+ }
94
+ /** 记录 bash 命令 */
95
+ recordCommand(command) {
96
+ if (!this.currentRecord)
97
+ return;
98
+ this.currentRecord.commands.push(command);
99
+ }
100
+ /** 回合结束时调用。补充 git diff 检测 → 写入 TurnStore */
101
+ async endTurn() {
102
+ if (!this.currentRecord)
103
+ return null;
104
+ try {
105
+ // 通过 git diff 补充检测遗漏文件(bash rm 等未被拦截的操作)
106
+ await this.enrichFromGitDiff();
107
+ }
108
+ catch (err) {
109
+ logger.warn('Failed to enrich turn record from git diff', {
110
+ error: err instanceof Error ? err.message : String(err),
111
+ });
112
+ }
113
+ const record = { ...this.currentRecord };
114
+ await this.turnStore.save(record);
115
+ logger.debug(`Turn ${record.turnId} recorded: ${record.changedFiles.length} files, ${record.commands.length} commands`);
116
+ this.currentRecord = null;
117
+ this.recordedPaths.clear();
118
+ return record;
119
+ }
120
+ // ── Private ────────────────────────────────────────────────────────
121
+ /** 通过 git diff --name-status 补充检测遗漏的变更文件 */
122
+ async enrichFromGitDiff() {
123
+ if (!this.currentRecord || !this.currentRecord.preCommit)
124
+ return;
125
+ try {
126
+ const isRepo = await this.gitManager.isRepo();
127
+ if (!isRepo)
128
+ return;
129
+ // git diff --name-status <preCommit>
130
+ const { stdout } = await this.gitManager.git([
131
+ 'diff', '--name-status', this.currentRecord.preCommit,
132
+ ]);
133
+ const lines = stdout.trim().split('\n').filter(Boolean);
134
+ for (const line of lines) {
135
+ const parts = line.split('\t');
136
+ if (parts.length < 2)
137
+ continue;
138
+ const statusCode = parts[0];
139
+ const filePath = parts.slice(1).join('\t'); // 文件名可能含空格
140
+ // 跳过已手动记录的路径
141
+ if (this.recordedPaths.has(filePath))
142
+ continue;
143
+ const action = statusToAction(statusCode);
144
+ if (!action)
145
+ continue;
146
+ this.currentRecord.changedFiles.push({
147
+ path: filePath,
148
+ action,
149
+ // 无法获取 oldContent(文件已被修改),git reset 会直接恢复
150
+ });
151
+ this.recordedPaths.add(filePath);
152
+ }
153
+ }
154
+ catch {
155
+ // diff 失败不阻塞
156
+ }
157
+ }
158
+ /** 绝对路径 → 相对于项目根目录的路径 */
159
+ toRelativePath(absolutePath) {
160
+ const rel = path.relative(this.projectDir, absolutePath);
161
+ // 规范化路径分隔符
162
+ return rel.replace(/\\/g, '/');
163
+ }
164
+ }
165
+ // ── Helpers ──────────────────────────────────────────────────────────
166
+ /** git diff --name-status 的状态码 → ChangedFile.action */
167
+ function statusToAction(code) {
168
+ switch (code) {
169
+ case 'M':
170
+ return 'modified';
171
+ case 'A':
172
+ return 'created';
173
+ case 'D':
174
+ return 'deleted';
175
+ // R = renamed, C = copied — 当作 modified(文件内容变化)
176
+ case 'R':
177
+ case 'C':
178
+ return 'modified';
179
+ default:
180
+ return null;
181
+ }
182
+ }
183
+ //# sourceMappingURL=turn-recorder.js.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * TurnStore — 环状缓冲区 + JSON 持久化
3
+ *
4
+ * 存储回合记录到 .agent/rollback/turn-{id}.json。
5
+ * 最多保留 20 个回合,超出时淘汰最旧的。
6
+ */
7
+ import type { TurnRecord } from './types.js';
8
+ export declare class TurnStore {
9
+ private storeDir;
10
+ constructor(storeDir: string);
11
+ /** 保存回合记录,自动触发环状淘汰 */
12
+ save(record: TurnRecord): Promise<void>;
13
+ /** 按 turnId 加载单个回合记录 */
14
+ load(turnId: number): Promise<TurnRecord | null>;
15
+ /** 列出所有已存储的回合记录(按 turnId 升序) */
16
+ list(): Promise<TurnRecord[]>;
17
+ /** 删除从 fromTurnId 开始的所有记录(含 fromTurnId),用于回滚后清理 */
18
+ deleteRange(fromTurnId: number): Promise<void>;
19
+ /** 获取存储目录路径 */
20
+ getDir(): string;
21
+ private turnFilePath;
22
+ private indexFilePath;
23
+ private readIndex;
24
+ private writeIndex;
25
+ private ensureDir;
26
+ /** 超过上限时删除最旧的回合文件 */
27
+ private evictIfNeeded;
28
+ }
29
+ //# sourceMappingURL=turn-store.d.ts.map
@@ -0,0 +1,114 @@
1
+ /**
2
+ * TurnStore — 环状缓冲区 + JSON 持久化
3
+ *
4
+ * 存储回合记录到 .agent/rollback/turn-{id}.json。
5
+ * 最多保留 20 个回合,超出时淘汰最旧的。
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ const MAX_STORED_TURNS = 20;
10
+ const INDEX_FILE = 'index.json';
11
+ export class TurnStore {
12
+ storeDir;
13
+ constructor(storeDir) {
14
+ this.storeDir = storeDir;
15
+ this.ensureDir();
16
+ }
17
+ // ── Public API ─────────────────────────────────────────────────────
18
+ /** 保存回合记录,自动触发环状淘汰 */
19
+ async save(record) {
20
+ this.ensureDir();
21
+ // 写入单个回合文件
22
+ const filePath = this.turnFilePath(record.turnId);
23
+ fs.writeFileSync(filePath, JSON.stringify(record, null, 2), 'utf-8');
24
+ // 更新索引
25
+ const index = this.readIndex();
26
+ if (!index.turns.includes(record.turnId)) {
27
+ index.turns.push(record.turnId);
28
+ index.turns.sort((a, b) => a - b);
29
+ }
30
+ index.lastTurnId = record.turnId;
31
+ this.writeIndex(index);
32
+ // 环状淘汰
33
+ this.evictIfNeeded(index);
34
+ }
35
+ /** 按 turnId 加载单个回合记录 */
36
+ async load(turnId) {
37
+ const filePath = this.turnFilePath(turnId);
38
+ if (!fs.existsSync(filePath))
39
+ return null;
40
+ try {
41
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /** 列出所有已存储的回合记录(按 turnId 升序) */
48
+ async list() {
49
+ const index = this.readIndex();
50
+ const records = [];
51
+ for (const turnId of index.turns) {
52
+ const record = await this.load(turnId);
53
+ if (record)
54
+ records.push(record);
55
+ }
56
+ return records;
57
+ }
58
+ /** 删除从 fromTurnId 开始的所有记录(含 fromTurnId),用于回滚后清理 */
59
+ async deleteRange(fromTurnId) {
60
+ const index = this.readIndex();
61
+ const toRemove = index.turns.filter(id => id >= fromTurnId);
62
+ for (const turnId of toRemove) {
63
+ const filePath = this.turnFilePath(turnId);
64
+ if (fs.existsSync(filePath)) {
65
+ fs.unlinkSync(filePath);
66
+ }
67
+ }
68
+ index.turns = index.turns.filter(id => id < fromTurnId);
69
+ this.writeIndex(index);
70
+ }
71
+ /** 获取存储目录路径 */
72
+ getDir() {
73
+ return this.storeDir;
74
+ }
75
+ // ── Private ────────────────────────────────────────────────────────
76
+ turnFilePath(turnId) {
77
+ return path.join(this.storeDir, `turn-${turnId}.json`);
78
+ }
79
+ indexFilePath() {
80
+ return path.join(this.storeDir, INDEX_FILE);
81
+ }
82
+ readIndex() {
83
+ const filePath = this.indexFilePath();
84
+ if (!fs.existsSync(filePath)) {
85
+ return { turns: [], lastTurnId: 0 };
86
+ }
87
+ try {
88
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
89
+ }
90
+ catch {
91
+ return { turns: [], lastTurnId: 0 };
92
+ }
93
+ }
94
+ writeIndex(index) {
95
+ fs.writeFileSync(this.indexFilePath(), JSON.stringify(index, null, 2), 'utf-8');
96
+ }
97
+ ensureDir() {
98
+ if (!fs.existsSync(this.storeDir)) {
99
+ fs.mkdirSync(this.storeDir, { recursive: true });
100
+ }
101
+ }
102
+ /** 超过上限时删除最旧的回合文件 */
103
+ evictIfNeeded(index) {
104
+ while (index.turns.length > MAX_STORED_TURNS) {
105
+ const oldest = index.turns.shift();
106
+ const filePath = this.turnFilePath(oldest);
107
+ if (fs.existsSync(filePath)) {
108
+ fs.unlinkSync(filePath);
109
+ }
110
+ }
111
+ this.writeIndex(index);
112
+ }
113
+ }
114
+ //# sourceMappingURL=turn-store.js.map
@@ -0,0 +1,51 @@
1
+ /**
2
+ * 回合回滚 — 类型定义
3
+ *
4
+ * ## 术语
5
+ * - **回合 (Turn)**: 用户一条消息 → 模型执行全部工具调用 → 模型回复。一个完整轮次。
6
+ * - **回滚 (Rollback)**: 撤销指定回合中模型所做的所有文件变更。
7
+ */
8
+ /** 单个文件变更记录 */
9
+ export interface ChangedFile {
10
+ /** 文件路径(相对于项目根) */
11
+ path: string;
12
+ /** 变更类型 */
13
+ action: 'modified' | 'created' | 'deleted';
14
+ /** 修改前的完整内容(modified / deleted 时记录;created 时 undefined) */
15
+ oldContent?: string;
16
+ }
17
+ /** 一个回合的完整记录 */
18
+ export interface TurnRecord {
19
+ /** 回合编号(全局递增) */
20
+ turnId: number;
21
+ /** 回合开始时间 ISO 8601 */
22
+ timestamp: string;
23
+ /** 回合开始前的 git commit hash(非 git 仓库时为空字符串) */
24
+ preCommit: string;
25
+ /** 本回合变更的文件列表 */
26
+ changedFiles: ChangedFile[];
27
+ /** 本回合执行的 bash 命令列表 */
28
+ commands: string[];
29
+ }
30
+ /** rollback_status 工具返回的摘要 */
31
+ export interface RollbackStatusResult {
32
+ currentTurn: number;
33
+ maxStored: number;
34
+ available: RollbackStatusEntry[];
35
+ }
36
+ export interface RollbackStatusEntry {
37
+ turnId: number;
38
+ timestamp: string;
39
+ fileCount: number;
40
+ commandCount: number;
41
+ /** 变更文件摘要,如 "src/a.ts, src/b.ts (+2 more)" */
42
+ fileSummary: string;
43
+ }
44
+ /** 环状缓冲区索引文件结构 */
45
+ export interface RollbackIndex {
46
+ /** 已存储的回合 ID 列表(按 turnId 升序) */
47
+ turns: number[];
48
+ /** 下次写入的回合 ID(用于判断连续性) */
49
+ lastTurnId: number;
50
+ }
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 回合回滚 — 类型定义
3
+ *
4
+ * ## 术语
5
+ * - **回合 (Turn)**: 用户一条消息 → 模型执行全部工具调用 → 模型回复。一个完整轮次。
6
+ * - **回滚 (Rollback)**: 撤销指定回合中模型所做的所有文件变更。
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map