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,156 @@
1
+ // ============================================================
2
+ // ChannelManager — 渠道生命周期管理器
3
+ // ============================================================
4
+ //
5
+ // 职责:
6
+ // - 注册渠道(内置渠道 + 插件渠道)
7
+ // - 启动/停止渠道
8
+ // - 将渠道事件路由到消息处理器
9
+ // - 将 Agent 回复发送回对应渠道
10
+ // ============================================================
11
+ import { createLogger } from '../logging/logger.js';
12
+ const logger = createLogger('channels');
13
+ export class ChannelManager {
14
+ channels = new Map();
15
+ started = false;
16
+ // ── 注册 ──────────────────────────────────────────────────
17
+ /** 注册一个渠道处理器 */
18
+ register(handler, config = {}) {
19
+ if (this.channels.has(handler.id)) {
20
+ logger.warn('channel already registered, replacing', { id: handler.id });
21
+ }
22
+ this.channels.set(handler.id, {
23
+ handler,
24
+ status: 'registered',
25
+ config,
26
+ });
27
+ logger.info('channel registered', { id: handler.id, name: handler.name });
28
+ }
29
+ /** 批量注册 */
30
+ registerAll(entries) {
31
+ for (const { handler, config } of entries) {
32
+ this.register(handler, config);
33
+ }
34
+ }
35
+ /** 获取所有已注册渠道 */
36
+ getAll() {
37
+ return [...this.channels.values()];
38
+ }
39
+ /** 获取指定渠道 */
40
+ get(id) {
41
+ return this.channels.get(id);
42
+ }
43
+ /** 获取活跃渠道 */
44
+ getActive() {
45
+ return this.getAll().filter((c) => c.status === 'active');
46
+ }
47
+ // ── 生命周期 ──────────────────────────────────────────────
48
+ /**
49
+ * 启动所有启用的渠道
50
+ * 每个渠道自行处理消息(通过 handler.handleMessage)
51
+ */
52
+ async startAll(agentFactory, enabledIds) {
53
+ const toStart = this.getAll().filter((c) => {
54
+ if (enabledIds && !enabledIds.includes(c.handler.id))
55
+ return false;
56
+ return c.config.enabled !== false;
57
+ });
58
+ logger.info('starting channels', { count: toStart.length });
59
+ for (const state of toStart) {
60
+ await this.startChannel(state, agentFactory);
61
+ }
62
+ this.started = true;
63
+ }
64
+ /** 启动单个渠道 */
65
+ async startChannel(state, agentFactory) {
66
+ const { handler, config } = state;
67
+ try {
68
+ state.status = 'starting';
69
+ // 将 agentFactory 注入到渠道配置中(WebUI 等渠道需要它来创建 AgentLoop)
70
+ config.agentFactory = agentFactory;
71
+ // 设置事件处理:渠道收到消息 → 调用 handler.handleMessage
72
+ handler.onEvent(async (event) => {
73
+ if (event.type === 'message') {
74
+ const msgEvent = event;
75
+ const replyFn = async (reply) => {
76
+ await handler.reply(msgEvent.sessionId, reply);
77
+ };
78
+ try {
79
+ await handler.handleMessage(msgEvent, replyFn, agentFactory);
80
+ }
81
+ catch (err) {
82
+ logger.error('handleMessage error', err instanceof Error ? err : new Error(String(err)), {
83
+ channel: handler.id,
84
+ });
85
+ }
86
+ }
87
+ });
88
+ await handler.start(config);
89
+ state.status = 'active';
90
+ logger.info('channel started', { id: handler.id });
91
+ }
92
+ catch (error) {
93
+ state.status = 'error';
94
+ state.error = error instanceof Error ? error.message : String(error);
95
+ logger.error('channel start failed', error instanceof Error ? error : new Error(state.error), {
96
+ id: handler.id,
97
+ });
98
+ }
99
+ }
100
+ /** 停止所有渠道 */
101
+ async stopAll() {
102
+ for (const state of this.getActive()) {
103
+ await this.stopChannel(state);
104
+ }
105
+ this.started = false;
106
+ }
107
+ /** 停止单个渠道 */
108
+ async stopChannel(state) {
109
+ try {
110
+ await state.handler.stop();
111
+ state.status = 'stopped';
112
+ logger.info('channel stopped', { id: state.handler.id });
113
+ }
114
+ catch (error) {
115
+ state.status = 'error';
116
+ state.error = error instanceof Error ? error.message : String(error);
117
+ logger.error('channel stop failed', error instanceof Error ? error : new Error(state.error), {
118
+ id: state.handler.id,
119
+ });
120
+ }
121
+ }
122
+ /** 重启指定渠道 */
123
+ async restart(id, agentFactory) {
124
+ const state = this.channels.get(id);
125
+ if (!state)
126
+ throw new Error(`Channel "${id}" not found`);
127
+ if (state.status === 'active') {
128
+ await this.stopChannel(state);
129
+ }
130
+ await this.startChannel(state, agentFactory);
131
+ }
132
+ // ── 主动发送 ──────────────────────────────────────────────
133
+ /**
134
+ * 通过指定渠道主动发送消息
135
+ */
136
+ async send(channelId, sessionId, reply) {
137
+ const state = this.channels.get(channelId);
138
+ if (!state || state.status !== 'active') {
139
+ throw new Error(`Channel "${channelId}" is not active`);
140
+ }
141
+ await state.handler.reply(sessionId, reply);
142
+ }
143
+ // ── 状态查询 ──────────────────────────────────────────────
144
+ getStatusSummary() {
145
+ return this.getAll().map((c) => ({
146
+ id: c.handler.id,
147
+ name: c.handler.name,
148
+ status: c.status,
149
+ }));
150
+ }
151
+ /** 是否已启动 */
152
+ isStarted() {
153
+ return this.started;
154
+ }
155
+ }
156
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1,36 @@
1
+ export declare enum QueueMessageMode {
2
+ Queue = "queue",
3
+ Insert = "insert"
4
+ }
5
+ export interface QueueItem {
6
+ text: string;
7
+ mode: QueueMessageMode;
8
+ timestamp: number;
9
+ }
10
+ export declare class MessageQueue {
11
+ private items;
12
+ static readonly MAX_QUEUE_SIZE = 100;
13
+ /** Detect if a message uses insert-mode syntax: "!...text...!" */
14
+ static detectMode(text: string): QueueMessageMode;
15
+ /** Strip "!" markers from insert-mode messages. No-op for queue-mode. */
16
+ static stripMarkers(text: string): string;
17
+ /**
18
+ * Enqueue a message. Insert-mode goes to the front (unshift),
19
+ * queue-mode goes to the back (push).
20
+ */
21
+ enqueue(text: string, mode: QueueMessageMode): QueueItem;
22
+ /** Remove and return the first item. */
23
+ dequeue(): QueueItem | undefined;
24
+ /** Remove and return the last item (for Backspace-on-empty cancellation). */
25
+ pop(): QueueItem | undefined;
26
+ /** Peek at the first item without removing. */
27
+ peek(): QueueItem | undefined;
28
+ get size(): number;
29
+ isEmpty(): boolean;
30
+ clear(): void;
31
+ /** Read-only view of all items (for display/debugging). */
32
+ getItems(): readonly QueueItem[];
33
+ /** Remove item at the specified index. */
34
+ removeAt(index: number): void;
35
+ }
36
+ //# sourceMappingURL=message-queue.d.ts.map
@@ -0,0 +1,91 @@
1
+ // ============================================================
2
+ // MessageQueue — channel-agnostic message queue data structure
3
+ // ============================================================
4
+ //
5
+ // Design:
6
+ // - Pure data structure — no processing/consumption logic.
7
+ // - Each channel (TUI, Feishu, WebUI, etc.) owns its own consumer loop.
8
+ // - Static helpers for insert-mode detection (!message! syntax).
9
+ // - Insert-mode items go to the FRONT (unshift), queue-mode to the BACK (push).
10
+ // - Max 100 items; overflow drops oldest.
11
+ //
12
+ // Reusability:
13
+ // - `detectMode()` / `stripMarkers()` are static — any channel can use them.
14
+ // - `enqueue()` / `dequeue()` / `pop()` — standard queue API.
15
+ // ============================================================
16
+ export var QueueMessageMode;
17
+ (function (QueueMessageMode) {
18
+ QueueMessageMode["Queue"] = "queue";
19
+ QueueMessageMode["Insert"] = "insert";
20
+ })(QueueMessageMode || (QueueMessageMode = {}));
21
+ export class MessageQueue {
22
+ items = [];
23
+ static MAX_QUEUE_SIZE = 100;
24
+ // ── Static helpers ──────────────────────────────────────
25
+ /** Detect if a message uses insert-mode syntax: "!...text...!" */
26
+ static detectMode(text) {
27
+ const trimmed = text.trim();
28
+ if (trimmed.length > 2 && trimmed.startsWith('!') && trimmed.endsWith('!')) {
29
+ return QueueMessageMode.Insert;
30
+ }
31
+ return QueueMessageMode.Queue;
32
+ }
33
+ /** Strip "!" markers from insert-mode messages. No-op for queue-mode. */
34
+ static stripMarkers(text) {
35
+ const trimmed = text.trim();
36
+ if (MessageQueue.detectMode(trimmed) === QueueMessageMode.Insert) {
37
+ return trimmed.slice(1, -1).trim();
38
+ }
39
+ return trimmed;
40
+ }
41
+ // ── Instance API ────────────────────────────────────────
42
+ /**
43
+ * Enqueue a message. Insert-mode goes to the front (unshift),
44
+ * queue-mode goes to the back (push).
45
+ */
46
+ enqueue(text, mode) {
47
+ if (this.items.length >= MessageQueue.MAX_QUEUE_SIZE) {
48
+ this.items.shift(); // drop oldest
49
+ }
50
+ const item = { text, mode, timestamp: Date.now() };
51
+ if (mode === QueueMessageMode.Insert) {
52
+ this.items.unshift(item);
53
+ }
54
+ else {
55
+ this.items.push(item);
56
+ }
57
+ return item;
58
+ }
59
+ /** Remove and return the first item. */
60
+ dequeue() {
61
+ return this.items.shift();
62
+ }
63
+ /** Remove and return the last item (for Backspace-on-empty cancellation). */
64
+ pop() {
65
+ return this.items.pop();
66
+ }
67
+ /** Peek at the first item without removing. */
68
+ peek() {
69
+ return this.items[0];
70
+ }
71
+ get size() {
72
+ return this.items.length;
73
+ }
74
+ isEmpty() {
75
+ return this.items.length === 0;
76
+ }
77
+ clear() {
78
+ this.items.length = 0;
79
+ }
80
+ /** Read-only view of all items (for display/debugging). */
81
+ getItems() {
82
+ return this.items;
83
+ }
84
+ /** Remove item at the specified index. */
85
+ removeAt(index) {
86
+ if (index >= 0 && index < this.items.length) {
87
+ this.items.splice(index, 1);
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=message-queue.js.map
@@ -0,0 +1,50 @@
1
+ export interface AuthCallbacks {
2
+ /** 二维码需要展示给用户时调用 */
3
+ onQRCode: (qrUrl: string, qrcode: string) => void;
4
+ /** 状态变更时调用 */
5
+ onStatusChange: (status: string) => void;
6
+ }
7
+ export declare class ClawbotAuthManager {
8
+ private botToken;
9
+ private botId;
10
+ private userId;
11
+ private baseUrl;
12
+ private obtainedAt;
13
+ private httpTimeoutMs;
14
+ private callbacks;
15
+ /** 本轮授权流程的 AbortController,stopPolling 时中止 */
16
+ private abortController;
17
+ constructor(baseUrl: string, httpTimeoutMs: number, callbacks: AuthCallbacks);
18
+ get token(): string;
19
+ get botIdentifier(): string;
20
+ get userIdentifier(): string;
21
+ get hasValidToken(): boolean;
22
+ /** 剩余有效天数 */
23
+ get remainingDays(): number;
24
+ /** 是否需要告警(剩余 < 2 天) */
25
+ get needsWarning(): boolean;
26
+ /** 尝试从持久化文件恢复 token */
27
+ restoreFromCache(): Promise<boolean>;
28
+ /** 直接用已有 token(来自配置 config.channels.clawbot.botToken) */
29
+ setTokenDirect(token: string, botId?: string, userId?: string): void;
30
+ /**
31
+ * 启动完整扫码授权流程。
32
+ * 返回 Promise<boolean>,true=授权成功,false=用户取消/超时。
33
+ */
34
+ startAuthorization(baseUrl?: string): Promise<boolean>;
35
+ /** 中止正在进行的授权轮询 */
36
+ stopPolling(): void;
37
+ /**
38
+ * 尝试刷新 token(实际上 ClawBot 不支持静默刷新,只能重新扫码)。
39
+ * 这是给 channel 层调用的 —— 检测到 errcode:-14 时触发重新授权。
40
+ */
41
+ refreshToken(): Promise<boolean>;
42
+ /**
43
+ * 每日例行检查:剩余 < 2 天时通过回调告警。
44
+ * 调用方(channel)应在定时任务或启动时调用。
45
+ */
46
+ checkAndWarn(): void;
47
+ private saveToCache;
48
+ private sleep;
49
+ }
50
+ //# sourceMappingURL=clawbot-auth.d.ts.map
@@ -0,0 +1,235 @@
1
+ // ============================================================
2
+ // ClawbotAuthManager — 二维码授权 + bot_token 生命周期管理
3
+ // ============================================================
4
+ //
5
+ // 完整授权流程:
6
+ // 1. 启动时检查是否有已缓存的 bot_token
7
+ // 2. 没有 → 调用 get_bot_qrcode 获取二维码
8
+ // 3. 输出二维码 URL(终端 ASCII / TUI / 文件)
9
+ // 4. 轮询 get_qrcode_status,直到 confirmed / expired
10
+ // 5. 缓存 bot_token + 过期时间(7 天)
11
+ // 6. 每日检查剩余有效期,< 2 天时告警
12
+ //
13
+ // 状态机:
14
+ // wait → scaned → confirmed(成功)
15
+ // wait → expired(过期,重新获取)
16
+ // scaned_but_redirect → 切换轮询节点
17
+ // need_verifycode → 需要配对码
18
+ // binded_redirect → 已有绑定跳转
19
+ // ============================================================
20
+ import fs from 'node:fs/promises';
21
+ import path from 'node:path';
22
+ import { ClawbotClient } from './clawbot-client.js';
23
+ // ── 常量 ──────────────────────────────────────────────────────
24
+ /** bot_token 有效期(毫秒),7 天 */
25
+ const TOKEN_VALIDITY_MS = 7 * 24 * 60 * 60 * 1000;
26
+ /** 提前告警阈值(毫秒),2 天 */
27
+ const TOKEN_WARN_THRESHOLD_MS = 2 * 24 * 60 * 60 * 1000;
28
+ /** 二维码轮询间隔(毫秒) */
29
+ const QR_POLL_INTERVAL_MS = 2000;
30
+ /** 单次二维码最大轮询时间(毫秒),3 分钟 */
31
+ const QR_MAX_POLL_MS = 3 * 60 * 1000;
32
+ // ── 持久化文件 ────────────────────────────────────────────────
33
+ function getTokenFilePath() {
34
+ return path.join(process.cwd(), '.agent', 'clawbot_token.json');
35
+ }
36
+ // ── ClawbotAuthManager ────────────────────────────────────────
37
+ export class ClawbotAuthManager {
38
+ botToken = '';
39
+ botId = '';
40
+ userId = '';
41
+ baseUrl;
42
+ obtainedAt = 0;
43
+ httpTimeoutMs;
44
+ callbacks;
45
+ /** 本轮授权流程的 AbortController,stopPolling 时中止 */
46
+ abortController = null;
47
+ constructor(baseUrl, httpTimeoutMs, callbacks) {
48
+ this.baseUrl = baseUrl;
49
+ this.httpTimeoutMs = httpTimeoutMs;
50
+ this.callbacks = callbacks;
51
+ }
52
+ // ── 属性 ────────────────────────────────────────────────────
53
+ get token() { return this.botToken; }
54
+ get botIdentifier() { return this.botId; }
55
+ get userIdentifier() { return this.userId; }
56
+ get hasValidToken() {
57
+ if (!this.botToken)
58
+ return false;
59
+ const remaining = this.obtainedAt + TOKEN_VALIDITY_MS - Date.now();
60
+ return remaining > 0;
61
+ }
62
+ /** 剩余有效天数 */
63
+ get remainingDays() {
64
+ if (!this.botToken)
65
+ return 0;
66
+ const remaining = this.obtainedAt + TOKEN_VALIDITY_MS - Date.now();
67
+ return Math.max(0, remaining / (24 * 60 * 60 * 1000));
68
+ }
69
+ /** 是否需要告警(剩余 < 2 天) */
70
+ get needsWarning() {
71
+ if (!this.botToken)
72
+ return false;
73
+ const remaining = this.obtainedAt + TOKEN_VALIDITY_MS - Date.now();
74
+ return remaining > 0 && remaining < TOKEN_WARN_THRESHOLD_MS;
75
+ }
76
+ // ── 初始化 ───────────────────────────────────────────────────
77
+ /** 尝试从持久化文件恢复 token */
78
+ async restoreFromCache() {
79
+ try {
80
+ const raw = await fs.readFile(getTokenFilePath(), 'utf-8');
81
+ const cache = JSON.parse(raw);
82
+ if (!cache.botToken)
83
+ return false;
84
+ // 检查是否过期
85
+ if (Date.now() - cache.obtainedAt > TOKEN_VALIDITY_MS) {
86
+ this.callbacks.onStatusChange('Cached token expired, need re-auth');
87
+ return false;
88
+ }
89
+ this.botToken = cache.botToken;
90
+ this.botId = cache.botId ?? '';
91
+ this.userId = cache.userId ?? '';
92
+ this.baseUrl = cache.baseUrl ?? this.baseUrl;
93
+ this.obtainedAt = cache.obtainedAt ?? 0;
94
+ this.callbacks.onStatusChange(`Token restored from cache, ${this.remainingDays.toFixed(1)} days remaining`);
95
+ return true;
96
+ }
97
+ catch {
98
+ // 首次启动,无缓存文件
99
+ return false;
100
+ }
101
+ }
102
+ /** 直接用已有 token(来自配置 config.channels.clawbot.botToken) */
103
+ setTokenDirect(token, botId, userId) {
104
+ this.botToken = token;
105
+ this.botId = botId ?? '';
106
+ this.userId = userId ?? '';
107
+ this.obtainedAt = Date.now();
108
+ this.saveToCache();
109
+ }
110
+ // ── 授权流程 ────────────────────────────────────────────────
111
+ /**
112
+ * 启动完整扫码授权流程。
113
+ * 返回 Promise<boolean>,true=授权成功,false=用户取消/超时。
114
+ */
115
+ async startAuthorization(baseUrl) {
116
+ if (baseUrl)
117
+ this.baseUrl = baseUrl;
118
+ this.callbacks.onStatusChange('Starting QR code authorization...');
119
+ // 1. 获取二维码
120
+ let qrResult;
121
+ try {
122
+ // 获取二维码阶段不需要 bot_token,创建一个临时 client
123
+ const tempClient = new ClawbotClient(this.baseUrl, '', this.httpTimeoutMs);
124
+ qrResult = await tempClient.getQRCode([]);
125
+ }
126
+ catch (err) {
127
+ this.callbacks.onStatusChange(`Failed to get QR code: ${err instanceof Error ? err.message : String(err)}`);
128
+ return false;
129
+ }
130
+ this.callbacks.onQRCode(qrResult.qrcode_img_content, qrResult.qrcode);
131
+ // 2. 轮询扫码状态
132
+ this.abortController = new AbortController();
133
+ const startTime = Date.now();
134
+ const client = new ClawbotClient(this.baseUrl, '', this.httpTimeoutMs);
135
+ while (Date.now() - startTime < QR_MAX_POLL_MS) {
136
+ // 检查是否被中止
137
+ if (this.abortController.signal.aborted) {
138
+ this.callbacks.onStatusChange('Authorization polling cancelled');
139
+ return false;
140
+ }
141
+ let statusResult;
142
+ try {
143
+ statusResult = await client.getQRCodeStatus(qrResult.qrcode);
144
+ }
145
+ catch (err) {
146
+ this.callbacks.onStatusChange(`QR poll error: ${err instanceof Error ? err.message : String(err)}`);
147
+ await this.sleep(QR_POLL_INTERVAL_MS);
148
+ continue;
149
+ }
150
+ this.callbacks.onStatusChange(`QR status: ${statusResult.status}`);
151
+ switch (statusResult.status) {
152
+ case 'confirmed':
153
+ // 成功!
154
+ this.botToken = statusResult.bot_token ?? '';
155
+ this.botId = statusResult.ilink_bot_id ?? '';
156
+ this.userId = statusResult.ilink_user_id ?? '';
157
+ if (statusResult.baseurl)
158
+ this.baseUrl = statusResult.baseurl;
159
+ this.obtainedAt = Date.now();
160
+ this.saveToCache();
161
+ this.callbacks.onStatusChange(`Authorization successful! Bot: ${this.botId}, Token valid for 7 days`);
162
+ return true;
163
+ case 'expired':
164
+ this.callbacks.onStatusChange('QR code expired, retrying...');
165
+ // 递归重试:重新获取二维码
166
+ return this.startAuthorization();
167
+ case 'scaned_but_redirect':
168
+ this.callbacks.onStatusChange('QR scan redirecting...');
169
+ await this.sleep(QR_POLL_INTERVAL_MS);
170
+ continue;
171
+ case 'need_verifycode':
172
+ this.callbacks.onStatusChange('Verification code required on phone');
173
+ await this.sleep(QR_POLL_INTERVAL_MS);
174
+ continue;
175
+ case 'binded_redirect':
176
+ this.callbacks.onStatusChange('Bound session redirect...');
177
+ await this.sleep(QR_POLL_INTERVAL_MS);
178
+ continue;
179
+ case 'scaned':
180
+ case 'wait':
181
+ default:
182
+ await this.sleep(QR_POLL_INTERVAL_MS);
183
+ continue;
184
+ }
185
+ }
186
+ this.callbacks.onStatusChange('Authorization timed out (3 minutes)');
187
+ return false;
188
+ }
189
+ /** 中止正在进行的授权轮询 */
190
+ stopPolling() {
191
+ this.abortController?.abort();
192
+ this.abortController = null;
193
+ }
194
+ // ── Token 刷新 ──────────────────────────────────────────────
195
+ /**
196
+ * 尝试刷新 token(实际上 ClawBot 不支持静默刷新,只能重新扫码)。
197
+ * 这是给 channel 层调用的 —— 检测到 errcode:-14 时触发重新授权。
198
+ */
199
+ async refreshToken() {
200
+ this.callbacks.onStatusChange('bot_token expired (errcode:-14), starting re-authorization...');
201
+ this.botToken = '';
202
+ return this.startAuthorization();
203
+ }
204
+ /**
205
+ * 每日例行检查:剩余 < 2 天时通过回调告警。
206
+ * 调用方(channel)应在定时任务或启动时调用。
207
+ */
208
+ checkAndWarn() {
209
+ if (this.needsWarning) {
210
+ this.callbacks.onStatusChange(`⚠️ ClawBot token expires in ${this.remainingDays.toFixed(1)} days. Please re-scan QR code soon.`);
211
+ }
212
+ }
213
+ // ── 持久化 ───────────────────────────────────────────────────
214
+ async saveToCache() {
215
+ try {
216
+ const cache = {
217
+ botToken: this.botToken,
218
+ botId: this.botId,
219
+ userId: this.userId,
220
+ baseUrl: this.baseUrl,
221
+ obtainedAt: this.obtainedAt,
222
+ };
223
+ await fs.mkdir(path.dirname(getTokenFilePath()), { recursive: true });
224
+ await fs.writeFile(getTokenFilePath(), JSON.stringify(cache, null, 2), 'utf-8');
225
+ }
226
+ catch {
227
+ // 写入失败不影响运行
228
+ }
229
+ }
230
+ // ── 工具 ────────────────────────────────────────────────────
231
+ sleep(ms) {
232
+ return new Promise(resolve => setTimeout(resolve, ms));
233
+ }
234
+ }
235
+ //# sourceMappingURL=clawbot-auth.js.map
@@ -0,0 +1,76 @@
1
+ import type { ChannelHandler, ChannelEvent, ChannelReply, ChannelConfig, ChannelStatus, ChannelMessageEvent, AgentFactory, ReplyFn } from '../../interface.js';
2
+ export declare class ClawbotChannel implements ChannelHandler {
3
+ readonly id = "clawbot";
4
+ readonly name = "\u5FAE\u4FE1 ClawBot";
5
+ readonly description = "\u5FAE\u4FE1\u5B98\u65B9 AI \u52A9\u624B\u8FDE\u63A5\u63D2\u4EF6\uFF0C\u652F\u6301 HTTP \u957F\u8F6E\u8BE2\u6536\u53D1\u6D88\u606F";
6
+ readonly pluginId: undefined;
7
+ private status;
8
+ private config;
9
+ private logger;
10
+ private client;
11
+ private auth;
12
+ private messageQueue;
13
+ private agentFactory;
14
+ private polling;
15
+ private pollAbortController;
16
+ /** getUpdates 的 opaque blob,首次空字符串,后续回传上次返回值 */
17
+ private getUpdatesBuf;
18
+ /** 单会话信息(ClawBot 只有一个会话) */
19
+ private sessionInfo;
20
+ /** sessionId → SessionInfo 映射(兼容多 session 接口) */
21
+ private sessionMap;
22
+ private loop;
23
+ private collectHandler;
24
+ private sessionId;
25
+ private typingTicket;
26
+ private typingConfigFetched;
27
+ private onUserMessage;
28
+ private onAgentReply;
29
+ private persistSessionFile;
30
+ /** 每日 token 过期检查定时器 */
31
+ private dailyCheckTimer;
32
+ start(config: ChannelConfig): Promise<void>;
33
+ /** 初始化/更新 HTTP 客户端并启动长轮询 */
34
+ private activateClient;
35
+ /** 手动触发扫码授权流程(供 /clawbot login 命令调用) */
36
+ triggerAuth(): Promise<boolean>;
37
+ /** 返回当前授权状态(供 /clawbot status 命令调用) */
38
+ getAuthStatus(): {
39
+ authorized: boolean;
40
+ polling: boolean;
41
+ remainingDays: number;
42
+ botId: string;
43
+ userId: string;
44
+ };
45
+ private persistSession;
46
+ private restoreSession;
47
+ /** ChannelHandler: 处理 TUI 子命令(/clawbot/login, /clawbot/status) */
48
+ handleTuiCommand(cmdPath: string, _args: string): Promise<string | null>;
49
+ stop(): Promise<void>;
50
+ onEvent(handler: (event: ChannelEvent) => Promise<void>): void;
51
+ reply(sessionId: string, reply: ChannelReply): Promise<void>;
52
+ getStatus(): ChannelStatus;
53
+ handleMessage(event: ChannelMessageEvent, replyFn: ReplyFn, agentFactory: AgentFactory): Promise<void>;
54
+ /** 启动长轮询循环(while loop,非递归) */
55
+ private startPollingLoop;
56
+ private runPollLoop;
57
+ /** 处理长轮询收到的入站消息 */
58
+ private handleIncomingMessage;
59
+ private handleTokenExpiry;
60
+ /**
61
+ * 主动推送消息(非回复模式)。
62
+ * ClawBot 是单会话,直接向最近活跃的用户发送。
63
+ */
64
+ sendProactiveMessage(sessionId: string, text: string): Promise<void>;
65
+ /**
66
+ * 处理定时任务通知。
67
+ * 运行 Agent 并将结果主动推送到 ClawBot 会话。
68
+ */
69
+ handleTaskNotification(taskName: string, sessionId?: string): Promise<void>;
70
+ /** 获取 typing_ticket(预取一次,缓存使用) */
71
+ private fetchTypingConfig;
72
+ private hasQueuedMessage;
73
+ private sleep;
74
+ }
75
+ export declare function createClawbotChannel(): ClawbotChannel;
76
+ //# sourceMappingURL=clawbot-channel.d.ts.map