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,181 @@
1
+ /**
2
+ * ResilientProvider — wraps any Provider with retry + circuit breaker.
3
+ *
4
+ * Retry: exponential backoff (1s → 2s → 4s → 8s, max 4 retries)
5
+ * - Retryable: network errors, 5xx, 429 (rate limit)
6
+ * - Non-retryable: 4xx auth/validation errors
7
+ *
8
+ * Circuit breaker: after N consecutive failures, open for cooldown period.
9
+ * - Closed → Open (after failureThreshold consecutive failures)
10
+ * - Open → Half-open (after cooldownMs)
11
+ * - Half-open → Closed (on success) / Open (on failure)
12
+ */
13
+ import { createLogger } from '../logging/logger.js';
14
+ import { DEFAULT_RETRY_CONFIG } from './retry.js';
15
+ export const DEFAULT_CB = {
16
+ failureThreshold: 5,
17
+ cooldownMs: 30_000,
18
+ };
19
+ // ─── Helpers ───────────────────────────────────────────────────────
20
+ const RETRYABLE_STATUS_CODES = new Set([429, 500, 502, 503, 504]);
21
+ const RETRYABLE_ERROR_PATTERNS = [
22
+ /ECONNREFUSED/i,
23
+ /ECONNRESET/i,
24
+ /ETIMEDOUT/i,
25
+ /ENOTFOUND/i,
26
+ /EAI_AGAIN/i,
27
+ /socket hang up/i,
28
+ /timeout/i,
29
+ /rate.?limit/i,
30
+ /too many requests/i,
31
+ /service.?unavailable/i,
32
+ /internal.?server.?error/i,
33
+ /bad gateway/i,
34
+ /gateway.?timeout/i,
35
+ ];
36
+ function isRetryableError(error) {
37
+ const message = error.message ?? '';
38
+ // Check status code in message — match " 429 ", "HTTP 429", "status 429", etc.
39
+ // Use word-boundary-like matching to avoid false positives (e.g. "tried 429 times")
40
+ for (const code of RETRYABLE_STATUS_CODES) {
41
+ if (new RegExp(`\\b${code}\\b`).test(message))
42
+ return true;
43
+ }
44
+ // Check known error patterns
45
+ for (const pattern of RETRYABLE_ERROR_PATTERNS) {
46
+ if (pattern.test(message))
47
+ return true;
48
+ }
49
+ return false;
50
+ }
51
+ function isAbortError(err) {
52
+ return err.name === 'AbortError' || err.name === 'APIUserAbortError';
53
+ }
54
+ function sleep(ms) {
55
+ return new Promise((resolve) => setTimeout(resolve, ms));
56
+ }
57
+ export class ResilientProvider {
58
+ inner;
59
+ retryConfig;
60
+ cbConfig;
61
+ logger;
62
+ // Circuit breaker state
63
+ cbState = 'closed';
64
+ failureCount = 0;
65
+ lastFailureTime = 0;
66
+ name;
67
+ constructor(provider, retryConfig, cbConfig) {
68
+ this.inner = provider;
69
+ this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };
70
+ this.cbConfig = { ...DEFAULT_CB, ...cbConfig };
71
+ this.name = `${provider.getProviderType()}/${provider.getModel()}`;
72
+ this.logger = createLogger(`provider:resilient:${this.name}`);
73
+ }
74
+ getProviderType() {
75
+ return this.inner.getProviderType();
76
+ }
77
+ getModel() {
78
+ return this.inner.getModel();
79
+ }
80
+ getCapabilities() {
81
+ return this.inner.getCapabilities?.() ?? {
82
+ toolCalling: false, streaming: true, adapterSupport: false,
83
+ maxContextTokens: 4096, isLocal: false, vision: false,
84
+ };
85
+ }
86
+ getInner() {
87
+ return this.inner;
88
+ }
89
+ setThinking(enabled, effort) {
90
+ this.inner.setThinking?.(enabled, effort);
91
+ }
92
+ setUserId(userId) {
93
+ this.inner.setUserId?.(userId);
94
+ }
95
+ getCircuitState() {
96
+ return this.cbState;
97
+ }
98
+ async *createStream(messages, tools, signal) {
99
+ const maxAttempts = this.retryConfig.maxRetries + 1; // initial + retries
100
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
101
+ // ── Circuit breaker check ─────────────────────────────────
102
+ if (this.cbState === 'open') {
103
+ const elapsed = Date.now() - this.lastFailureTime;
104
+ if (elapsed < this.cbConfig.cooldownMs) {
105
+ throw new Error(`[ResilientProvider:${this.name}] Circuit breaker OPEN. ` +
106
+ `Cooldown in ${Math.ceil((this.cbConfig.cooldownMs - elapsed) / 1000)}s.`);
107
+ }
108
+ // Transition to half-open
109
+ this.cbState = 'half-open';
110
+ this.logger.info('circuit breaker: half-open (trial)', { failures: this.failureCount });
111
+ }
112
+ // ── Backoff delay (skip first attempt) ──────────────────
113
+ if (attempt > 0) {
114
+ const delay = Math.min(this.retryConfig.baseDelayMs * Math.pow(2, attempt - 1), this.retryConfig.maxDelayMs);
115
+ this.logger.warn('retrying', { attempt, delayMs: delay });
116
+ await sleep(delay);
117
+ }
118
+ // ── Track whether we've yielded any event ────────────────
119
+ // 一旦 yield 过任何事件,重试必然导致 text/thinking 重复(已送出的无法撤回),
120
+ // 此时再遇到错误直接抛出,不再重试。
121
+ let hasYielded = false;
122
+ try {
123
+ // ── Execute (manual for-await to detect first yield) ──
124
+ const innerStream = this.inner.createStream(messages, tools, signal);
125
+ for await (const event of innerStream) {
126
+ hasYielded = true;
127
+ yield event;
128
+ }
129
+ // Success → reset
130
+ this.onSuccess(attempt);
131
+ return;
132
+ }
133
+ catch (error) {
134
+ const err = error instanceof Error ? error : new Error(String(error));
135
+ // ── Abort → rethrow immediately (never retry) ─────
136
+ if (isAbortError(err)) {
137
+ throw err;
138
+ }
139
+ // ── Already yielded → cannot retry without duplication ──
140
+ if (hasYielded) {
141
+ this.onFailure(err);
142
+ throw err;
143
+ }
144
+ // ── Last attempt → fail ─────────────────────────────
145
+ if (attempt === maxAttempts - 1) {
146
+ this.onFailure(err);
147
+ throw err;
148
+ }
149
+ // ── Non-retryable → fail immediately ────────────────
150
+ if (!isRetryableError(err)) {
151
+ this.onFailure(err);
152
+ throw err;
153
+ }
154
+ // ── Retryable → record failure and loop ─────────────
155
+ this.onFailure(err);
156
+ }
157
+ }
158
+ }
159
+ // ── Circuit breaker state transitions ──────────────────────────
160
+ onSuccess(attempts) {
161
+ if (this.failureCount > 0) {
162
+ this.logger.info('recovered', { attempts: attempts + 1, previousFailures: this.failureCount });
163
+ }
164
+ this.failureCount = 0;
165
+ this.cbState = 'closed';
166
+ }
167
+ onFailure(err) {
168
+ this.failureCount++;
169
+ this.lastFailureTime = Date.now();
170
+ this.logger.warn('provider error', { error: err.message, failureCount: this.failureCount });
171
+ if (this.cbState !== 'open' &&
172
+ this.failureCount >= this.cbConfig.failureThreshold) {
173
+ this.cbState = 'open';
174
+ this.logger.error('circuit breaker: opened', err, {
175
+ cooldownMs: this.cbConfig.cooldownMs,
176
+ failures: this.failureCount,
177
+ });
178
+ }
179
+ }
180
+ }
181
+ //# sourceMappingURL=resilient.js.map
@@ -0,0 +1,16 @@
1
+ export interface RetryConfig {
2
+ maxRetries: number;
3
+ baseDelayMs: number;
4
+ maxDelayMs: number;
5
+ }
6
+ export declare const DEFAULT_RETRY_CONFIG: RetryConfig;
7
+ /** Check if an error is retryable */
8
+ export declare function isRetryableError(error: unknown): boolean;
9
+ /** Check if an error is non-retryable (auth, bad request, etc) */
10
+ export declare function isNonRetryableError(error: unknown): boolean;
11
+ /**
12
+ * Wrap an async function with retry logic.
13
+ * Exponential backoff: 1s, 2s, 4s, 8s (capped at maxDelayMs)
14
+ */
15
+ export declare function withRetry<T>(fn: () => Promise<T>, config?: Partial<RetryConfig>, operationName?: string): Promise<T>;
16
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1,78 @@
1
+ import { createLogger } from '../logging/logger.js';
2
+ const logger = createLogger('retry');
3
+ export const DEFAULT_RETRY_CONFIG = {
4
+ maxRetries: 4,
5
+ baseDelayMs: 1000,
6
+ maxDelayMs: 30000,
7
+ };
8
+ /** Check if an error is retryable */
9
+ export function isRetryableError(error) {
10
+ if (error instanceof Error) {
11
+ const msg = error.message.toLowerCase();
12
+ // Network errors
13
+ if (msg.includes('econnreset') || msg.includes('etimedout') || msg.includes('enotfound'))
14
+ return true;
15
+ if (msg.includes('timeout') || msg.includes('network'))
16
+ return true;
17
+ // HTTP status codes in message
18
+ if (msg.includes('status: 5') || msg.includes('status: 429'))
19
+ return true;
20
+ if (msg.includes('status: 502') || msg.includes('status: 503') || msg.includes('status: 504'))
21
+ return true;
22
+ // Anthropic SDK specific
23
+ if (msg.includes('overloaded') || msg.includes('rate limit'))
24
+ return true;
25
+ }
26
+ return false;
27
+ }
28
+ /** Check if an error is non-retryable (auth, bad request, etc) */
29
+ export function isNonRetryableError(error) {
30
+ if (error instanceof Error) {
31
+ const msg = error.message.toLowerCase();
32
+ if (msg.includes('status: 401') || msg.includes('status: 403'))
33
+ return true;
34
+ if (msg.includes('status: 404'))
35
+ return true;
36
+ if (msg.includes('invalid api key') || msg.includes('authentication'))
37
+ return true;
38
+ }
39
+ return false;
40
+ }
41
+ /** Sleep helper */
42
+ function sleep(ms) {
43
+ return new Promise((resolve) => setTimeout(resolve, ms));
44
+ }
45
+ /**
46
+ * Wrap an async function with retry logic.
47
+ * Exponential backoff: 1s, 2s, 4s, 8s (capped at maxDelayMs)
48
+ */
49
+ export async function withRetry(fn, config = {}, operationName = 'operation') {
50
+ const cfg = { ...DEFAULT_RETRY_CONFIG, ...config };
51
+ let lastError;
52
+ for (let attempt = 0; attempt <= cfg.maxRetries; attempt++) {
53
+ try {
54
+ return await fn();
55
+ }
56
+ catch (error) {
57
+ lastError = error;
58
+ // Non-retryable errors fail immediately
59
+ if (isNonRetryableError(error)) {
60
+ throw error;
61
+ }
62
+ // Non-retryable errors (not in our retryable list) fail on first attempt
63
+ if (attempt === 0 && !isRetryableError(error)) {
64
+ throw error;
65
+ }
66
+ // Last attempt, give up
67
+ if (attempt >= cfg.maxRetries) {
68
+ break;
69
+ }
70
+ // Calculate delay with exponential backoff
71
+ const delay = Math.min(cfg.baseDelayMs * Math.pow(2, attempt), cfg.maxDelayMs);
72
+ logger.warn('retry attempt failed', { operation: operationName, attempt: attempt + 1, delay });
73
+ await sleep(delay);
74
+ }
75
+ }
76
+ throw lastError;
77
+ }
78
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1,68 @@
1
+ import type { Provider } from './interface.js';
2
+ /** 路由评估输入 */
3
+ export interface AssessmentInput {
4
+ complexity: 'low' | 'medium' | 'high';
5
+ }
6
+ /** 当前路由模式信息 */
7
+ export interface RoutingInfo {
8
+ /** 当前使用的 Provider 名称 */
9
+ providerName: string;
10
+ /** 路由模式:'auto' | 'manual' */
11
+ mode: 'auto' | 'manual';
12
+ /** Provider 是否本地 */
13
+ isLocal: boolean;
14
+ }
15
+ /**
16
+ * ProviderRouter — 在已注册的 Provider 之间进行动态路由。
17
+ *
18
+ * 支持:
19
+ * - 按名称注册/注销/查询 Provider
20
+ * - 手动覆盖默认 Provider(setDefault / clearDefault)
21
+ * - 基于复杂度评估自动路由:
22
+ * - high → 优先在线 Provider
23
+ * - low / medium → 优先本地 Provider
24
+ */
25
+ export declare class ProviderRouter {
26
+ /** 注册表:名称 → Provider */
27
+ private registry;
28
+ /** 手动覆盖的默认 Provider 名称(为 null 时走自动路由) */
29
+ private defaultName;
30
+ /** 按名称注册 Provider */
31
+ register(name: string, provider: Provider): void;
32
+ /** 移除注册的 Provider */
33
+ unregister(name: string): void;
34
+ /** 获取已注册的 Provider */
35
+ get(name: string): Provider | undefined;
36
+ /** 列出所有已注册的 Provider 名称 */
37
+ list(): string[];
38
+ /** 设置默认 Provider(手动覆盖) */
39
+ setDefault(name: string): void;
40
+ /** 清除手动覆盖,恢复自动路由 */
41
+ clearDefault(): void;
42
+ /**
43
+ * 根据复杂度评估选择 Provider。
44
+ *
45
+ * 路由逻辑:
46
+ * 1. 存在手动覆盖 → 返回指定 Provider
47
+ * 2. complexity === 'high' → 优先第一个在线 Provider
48
+ * 3. 其他情况 → 优先第一个本地 Provider
49
+ * 4. 找不到匹配 → 返回第一个已注册 Provider
50
+ * 5. 注册表为空 → 抛出错误
51
+ */
52
+ route(assessment: AssessmentInput): Provider;
53
+ /**
54
+ * 获取当前路由模式信息。
55
+ *
56
+ * 注意:该方法在 route() 之前调用时,返回的是当前配置状态;
57
+ * 在 route() 之后调用则反映上一次路由的实际结果。
58
+ */
59
+ getRoutingInfo(): RoutingInfo;
60
+ /**
61
+ * 判断 Provider 是否为本地部署。
62
+ *
63
+ * 优先通过 getCapabilities()?.isLocal 判断;
64
+ * fallback: 通过 getProviderType() 返回值判断。
65
+ */
66
+ private isLocalProvider;
67
+ }
68
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1,145 @@
1
+ // ---------------------------------------------------------------------------
2
+ // ProviderRouter
3
+ // ---------------------------------------------------------------------------
4
+ /**
5
+ * ProviderRouter — 在已注册的 Provider 之间进行动态路由。
6
+ *
7
+ * 支持:
8
+ * - 按名称注册/注销/查询 Provider
9
+ * - 手动覆盖默认 Provider(setDefault / clearDefault)
10
+ * - 基于复杂度评估自动路由:
11
+ * - high → 优先在线 Provider
12
+ * - low / medium → 优先本地 Provider
13
+ */
14
+ export class ProviderRouter {
15
+ /** 注册表:名称 → Provider */
16
+ registry = new Map();
17
+ /** 手动覆盖的默认 Provider 名称(为 null 时走自动路由) */
18
+ defaultName = null;
19
+ // ---- 注册管理 -----------------------------------------------------------
20
+ /** 按名称注册 Provider */
21
+ register(name, provider) {
22
+ this.registry.set(name, provider);
23
+ }
24
+ /** 移除注册的 Provider */
25
+ unregister(name) {
26
+ this.registry.delete(name);
27
+ }
28
+ /** 获取已注册的 Provider */
29
+ get(name) {
30
+ return this.registry.get(name);
31
+ }
32
+ /** 列出所有已注册的 Provider 名称 */
33
+ list() {
34
+ return Array.from(this.registry.keys());
35
+ }
36
+ // ---- 手动覆盖 -----------------------------------------------------------
37
+ /** 设置默认 Provider(手动覆盖) */
38
+ setDefault(name) {
39
+ if (!this.registry.has(name)) {
40
+ throw new Error(`ProviderRouter.setDefault: Provider "${name}" is not registered. ` +
41
+ `Call register() first.`);
42
+ }
43
+ this.defaultName = name;
44
+ }
45
+ /** 清除手动覆盖,恢复自动路由 */
46
+ clearDefault() {
47
+ this.defaultName = null;
48
+ }
49
+ // ---- 核心路由 -----------------------------------------------------------
50
+ /**
51
+ * 根据复杂度评估选择 Provider。
52
+ *
53
+ * 路由逻辑:
54
+ * 1. 存在手动覆盖 → 返回指定 Provider
55
+ * 2. complexity === 'high' → 优先第一个在线 Provider
56
+ * 3. 其他情况 → 优先第一个本地 Provider
57
+ * 4. 找不到匹配 → 返回第一个已注册 Provider
58
+ * 5. 注册表为空 → 抛出错误
59
+ */
60
+ route(assessment) {
61
+ // 手动覆盖
62
+ if (this.defaultName !== null) {
63
+ const provider = this.registry.get(this.defaultName);
64
+ if (!provider) {
65
+ // 理论上不会进入这里(setDefault 已校验),但作为防御性代码保留
66
+ throw new Error(`ProviderRouter.route: Default Provider "${this.defaultName}" ` +
67
+ `is no longer registered.`);
68
+ }
69
+ return provider;
70
+ }
71
+ // 自动路由
72
+ if (this.registry.size === 0) {
73
+ throw new Error('ProviderRouter.route: No providers registered. ' +
74
+ 'Call register() before routing.');
75
+ }
76
+ const preferOnline = assessment.complexity === 'high';
77
+ const entries = Array.from(this.registry.entries());
78
+ // 按偏好查找第一个匹配的 Provider
79
+ for (const [, provider] of entries) {
80
+ const isLocal = this.isLocalProvider(provider);
81
+ if (preferOnline ? !isLocal : isLocal) {
82
+ return provider;
83
+ }
84
+ }
85
+ // 没有匹配类型的 Provider,fallback 到第一个已注册的
86
+ return entries[0][1];
87
+ }
88
+ // ---- 路由信息 -----------------------------------------------------------
89
+ /**
90
+ * 获取当前路由模式信息。
91
+ *
92
+ * 注意:该方法在 route() 之前调用时,返回的是当前配置状态;
93
+ * 在 route() 之后调用则反映上一次路由的实际结果。
94
+ */
95
+ getRoutingInfo() {
96
+ let providerName;
97
+ let mode;
98
+ let isLocal;
99
+ if (this.defaultName !== null) {
100
+ mode = 'manual';
101
+ providerName = this.defaultName;
102
+ const provider = this.registry.get(this.defaultName);
103
+ isLocal = provider ? this.isLocalProvider(provider) : false;
104
+ }
105
+ else {
106
+ mode = 'auto';
107
+ // 自动模式下,优先报告在线 Provider(high 复杂度路径)
108
+ const entries = Array.from(this.registry.entries());
109
+ if (entries.length === 0) {
110
+ return {
111
+ providerName: '(none)',
112
+ mode: 'auto',
113
+ isLocal: false,
114
+ };
115
+ }
116
+ // 找到第一个在线 Provider 作为感知名称
117
+ const online = entries.find(([, p]) => !this.isLocalProvider(p));
118
+ if (online) {
119
+ providerName = online[0];
120
+ isLocal = false;
121
+ }
122
+ else {
123
+ providerName = entries[0][0];
124
+ isLocal = true;
125
+ }
126
+ }
127
+ return { providerName, mode, isLocal };
128
+ }
129
+ // ---- 内部工具 -----------------------------------------------------------
130
+ /**
131
+ * 判断 Provider 是否为本地部署。
132
+ *
133
+ * 优先通过 getCapabilities()?.isLocal 判断;
134
+ * fallback: 通过 getProviderType() 返回值判断。
135
+ */
136
+ isLocalProvider(provider) {
137
+ if (provider.getCapabilities) {
138
+ return provider.getCapabilities().isLocal;
139
+ }
140
+ // fallback: 通过 type 判断
141
+ const type = provider.getProviderType();
142
+ return type === 'llamacpp' || type === 'local' || type === 'ollama';
143
+ }
144
+ }
145
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Tool Arguments Recovery — best-effort extraction of tool parameters
3
+ * from malformed JSON strings.
4
+ *
5
+ * When a model generates a tool call with large content (e.g., Write tool
6
+ * with source code), the streaming JSON may be truncated or contain
7
+ * unescaped characters. Rather than falling back to empty `{}`, we attempt
8
+ * to salvage known fields via regex extraction.
9
+ */
10
+ /**
11
+ * Result of best-effort JSON recovery.
12
+ * - recovered: Record of successfully extracted fields
13
+ * - complete: true if the original JSON was valid (no recovery needed)
14
+ * - error: parse error message if JSON was invalid
15
+ */
16
+ export interface RecoveryResult {
17
+ recovered: Record<string, unknown>;
18
+ complete: boolean;
19
+ error?: string;
20
+ }
21
+ /**
22
+ * Try to parse JSON, with fallback regex-based recovery for known tool patterns.
23
+ *
24
+ * Known patterns (in priority order):
25
+ * - "file_path": extracted via regex for write/edit/read tools
26
+ * - "content": extracted as everything after "content":" up to the end
27
+ * - "path": generic path extraction
28
+ * - "pattern": for glob/grep tools
29
+ * - "command": for bash tool
30
+ */
31
+ export declare function recoverToolArguments(raw: string, toolName: string): RecoveryResult;
32
+ /**
33
+ * Log a warning about tool call arguments that are empty or failed to parse.
34
+ */
35
+ export declare function logToolArgsWarning(providerLabel: string, toolName: string, raw: string, error?: string): void;
36
+ //# sourceMappingURL=tool-args-recovery.d.ts.map
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Tool Arguments Recovery — best-effort extraction of tool parameters
3
+ * from malformed JSON strings.
4
+ *
5
+ * When a model generates a tool call with large content (e.g., Write tool
6
+ * with source code), the streaming JSON may be truncated or contain
7
+ * unescaped characters. Rather than falling back to empty `{}`, we attempt
8
+ * to salvage known fields via regex extraction.
9
+ */
10
+ /**
11
+ * Try to parse JSON, with fallback regex-based recovery for known tool patterns.
12
+ *
13
+ * Known patterns (in priority order):
14
+ * - "file_path": extracted via regex for write/edit/read tools
15
+ * - "content": extracted as everything after "content":" up to the end
16
+ * - "path": generic path extraction
17
+ * - "pattern": for glob/grep tools
18
+ * - "command": for bash tool
19
+ */
20
+ export function recoverToolArguments(raw, toolName) {
21
+ // First: try normal JSON parse
22
+ try {
23
+ const parsed = JSON.parse(raw || '{}');
24
+ return { recovered: parsed, complete: true };
25
+ }
26
+ catch (e) {
27
+ const error = e.message;
28
+ const recovered = {};
29
+ // ── file_path (write / edit / read) ──────────────────────
30
+ const filePathMatch = raw.match(/"file_path"\s*:\s*"((?:[^"\\]|\\.)*)"/);
31
+ if (filePathMatch) {
32
+ recovered.file_path = JSON.parse(`"${filePathMatch[1]}"`);
33
+ }
34
+ // ── content (write / edit) — grab everything after "content":" ──
35
+ if (toolName === 'write' || toolName === 'edit' || toolName === 'multi_edit' || toolName === 'insert') {
36
+ const contentMatch = raw.match(/"content"\s*:\s*"/);
37
+ if (contentMatch) {
38
+ const contentStart = contentMatch.index + contentMatch[0].length;
39
+ let contentRaw = raw.slice(contentStart);
40
+ // Strip trailing "} or "}\n or just " at the very end
41
+ contentRaw = contentRaw.replace(/"?\s*\}?\s*$/, '');
42
+ // Unescape JSON escapes
43
+ try {
44
+ recovered.content = JSON.parse(`"${contentRaw}"`);
45
+ }
46
+ catch {
47
+ // If unescaping fails, use raw content
48
+ recovered.content = contentRaw;
49
+ }
50
+ }
51
+ }
52
+ // ── path (generic) ───────────────────────────────────────
53
+ if (!recovered.file_path && !recovered.path) {
54
+ const pathMatch = raw.match(/"path"\s*:\s*"((?:[^"\\]|\\.)*)"/);
55
+ if (pathMatch) {
56
+ recovered.path = JSON.parse(`"${pathMatch[1]}"`);
57
+ }
58
+ }
59
+ // ── pattern (glob / grep) ────────────────────────────────
60
+ if (toolName === 'glob' || toolName === 'grep') {
61
+ const patternMatch = raw.match(/"pattern"\s*:\s*"((?:[^"\\]|\\.)*)"/);
62
+ if (patternMatch) {
63
+ recovered.pattern = JSON.parse(`"${patternMatch[1]}"`);
64
+ }
65
+ }
66
+ // ── command (bash) ───────────────────────────────────────
67
+ if (toolName === 'bash') {
68
+ const cmdMatch = raw.match(/"command"\s*:\s*"((?:[^"\\]|\\.)*)"/);
69
+ if (cmdMatch) {
70
+ recovered.command = JSON.parse(`"${cmdMatch[1]}"`);
71
+ }
72
+ }
73
+ return { recovered, complete: false, error };
74
+ }
75
+ }
76
+ /**
77
+ * Log a warning about tool call arguments that are empty or failed to parse.
78
+ */
79
+ export function logToolArgsWarning(providerLabel, toolName, raw, error) {
80
+ const rawLen = raw?.length ?? 0;
81
+ const preview = (raw || '').slice(0, 500);
82
+ const suffix = rawLen > 500 ? `... (${rawLen - 500} more chars)` : '';
83
+ if (error) {
84
+ console.warn(`[${providerLabel}] JSON parse failed for tool "${toolName}": ${error}`);
85
+ }
86
+ else if (!raw || rawLen === 0) {
87
+ console.warn(`[${providerLabel}] Tool "${toolName}" called with EMPTY arguments (raw length: 0). The model may be hitting output limits or the stream chunk order is wrong.`);
88
+ }
89
+ console.warn(`[${providerLabel}] raw (first 500 chars): ${preview}${suffix}`);
90
+ }
91
+ //# sourceMappingURL=tool-args-recovery.js.map
@@ -0,0 +1,13 @@
1
+ export declare const DEFAULT_USER_ID = "hyacinth";
2
+ /** 启动时调用,将前缀同步为配置中的 provider.userId */
3
+ export declare function setUserIdPrefix(prefix: string): void;
4
+ /** 主Agent 普通模式 */
5
+ export declare function mainUserId(sessionTag: string): string;
6
+ /** 主Agent 陪伴模式 */
7
+ export declare function companionUserId(characterName: string): string;
8
+ export declare function orchestratorUserId(): string;
9
+ export declare function narrationUserId(): string;
10
+ export declare function compressorUserId(): string;
11
+ /** 子Agent(按名称 + 实例ID 隔离) */
12
+ export declare function subAgentUserId(agentName: string, instanceId: string): string;
13
+ //# sourceMappingURL=user-id.d.ts.map