@theowlops/boombot 0.0.0-stage → 1.1.0

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 (544) hide show
  1. package/README.md +69 -3
  2. package/dist/LICENSE +21 -0
  3. package/dist/bin/boombot.js +16 -0
  4. package/dist/cli/api-key.js +123 -0
  5. package/dist/cli/bin-bun.js +17 -0
  6. package/dist/cli/bin.js +34 -0
  7. package/dist/cli/cli/cli-error.js +61 -0
  8. package/dist/cli/cli/dispatch.js +138 -0
  9. package/dist/cli/cli/help.js +83 -0
  10. package/dist/cli/cli/parser.js +89 -0
  11. package/dist/cli/cli/registry.js +185 -0
  12. package/dist/cli/cli/spec.js +41 -0
  13. package/dist/cli/cli/suggest.js +125 -0
  14. package/dist/cli/cli/version.js +30 -0
  15. package/dist/cli/cli/vocabulary.js +87 -0
  16. package/dist/cli/commands/doctor.js +365 -0
  17. package/dist/cli/commands/gateway.js +290 -0
  18. package/dist/cli/commands/migrate.js +270 -0
  19. package/dist/cli/commands/plugin.js +97 -0
  20. package/dist/cli/commands/setup.js +230 -0
  21. package/dist/cli/config-file.js +133 -0
  22. package/dist/cli/master-key.js +78 -0
  23. package/dist/cli/open-browser.js +59 -0
  24. package/dist/cli/web-assets.js +58 -0
  25. package/dist/gateway/auth.js +46 -0
  26. package/dist/gateway/config-format.js +202 -0
  27. package/dist/gateway/config.js +427 -0
  28. package/dist/gateway/context.js +1 -0
  29. package/dist/gateway/env-file.js +129 -0
  30. package/dist/gateway/events.js +172 -0
  31. package/dist/gateway/guard/tagging.js +505 -0
  32. package/dist/gateway/handlers/index.js +66 -0
  33. package/dist/gateway/handlers/memory.js +54 -0
  34. package/dist/gateway/handlers/providers.js +73 -0
  35. package/dist/gateway/handlers/registry.js +39 -0
  36. package/dist/gateway/handlers/sessions.js +188 -0
  37. package/dist/gateway/handlers/system.js +12 -0
  38. package/dist/gateway/handlers/tasks.js +191 -0
  39. package/dist/gateway/handlers/turn.js +100 -0
  40. package/dist/gateway/index.js +126 -0
  41. package/dist/gateway/main.js +23 -0
  42. package/dist/gateway/server.js +354 -0
  43. package/dist/gateway/services/context-limits.js +75 -0
  44. package/dist/gateway/services/history-normalizer.js +42 -0
  45. package/dist/gateway/services/image-pipeline.js +56 -0
  46. package/dist/gateway/services/key-roulette-client.js +43 -0
  47. package/dist/gateway/services/llm-client.js +593 -0
  48. package/dist/gateway/services/llm-decoder.js +200 -0
  49. package/dist/gateway/services/local-fallback.js +135 -0
  50. package/dist/gateway/services/memory.js +511 -0
  51. package/dist/gateway/services/persistent-memory.js +196 -0
  52. package/dist/gateway/services/providers.js +44 -0
  53. package/dist/gateway/services/tasks.js +237 -0
  54. package/dist/gateway/services/verification.js +124 -0
  55. package/dist/gateway/services/vision-payload.js +48 -0
  56. package/dist/gateway/services.js +257 -0
  57. package/dist/gateway/session-snapshot.js +19 -0
  58. package/dist/gateway/sessions.js +701 -0
  59. package/dist/gateway/static.js +239 -0
  60. package/dist/gateway/turns/clarify-tool.js +57 -0
  61. package/dist/gateway/turns/cronjob-tool.js +96 -0
  62. package/dist/gateway/turns/deferred-tools.js +154 -0
  63. package/dist/gateway/turns/execute-code-tool.js +84 -0
  64. package/dist/gateway/turns/file-tool-defs.js +178 -0
  65. package/dist/gateway/turns/file-tool-ops.js +178 -0
  66. package/dist/gateway/turns/file-tool-scan.js +182 -0
  67. package/dist/gateway/turns/file-tool.js +302 -0
  68. package/dist/gateway/turns/index.js +416 -0
  69. package/dist/gateway/turns/jev-middleware.js +91 -0
  70. package/dist/gateway/turns/local-reply.js +156 -0
  71. package/dist/gateway/turns/mcp-client.js +643 -0
  72. package/dist/gateway/turns/memory-tool.js +171 -0
  73. package/dist/gateway/turns/middleware.js +96 -0
  74. package/dist/gateway/turns/python-core.js +397 -0
  75. package/dist/gateway/turns/routing/index.js +3 -0
  76. package/dist/gateway/turns/routing/intent-classifier.js +60 -0
  77. package/dist/gateway/turns/routing/planner-adapter.js +91 -0
  78. package/dist/gateway/turns/routing/types.js +1 -0
  79. package/dist/gateway/turns/runtime-deps.js +228 -0
  80. package/dist/gateway/turns/self-config-tool.js +277 -0
  81. package/dist/gateway/turns/service-types.js +11 -0
  82. package/dist/gateway/turns/service.js +820 -0
  83. package/dist/gateway/turns/session-adapter.js +158 -0
  84. package/dist/gateway/turns/session-tool.js +49 -0
  85. package/dist/gateway/turns/shell-tool.js +190 -0
  86. package/dist/gateway/turns/skill-tool.js +239 -0
  87. package/dist/gateway/turns/spillover.js +201 -0
  88. package/dist/gateway/turns/subagent-tool.js +140 -0
  89. package/dist/gateway/turns/system-prompt.js +121 -0
  90. package/dist/gateway/turns/tool-schema.js +90 -0
  91. package/dist/gateway/turns/turn-utils.js +58 -0
  92. package/dist/gateway/turns/vision-tool.js +120 -0
  93. package/dist/gateway/types.js +1 -0
  94. package/dist/native/win32-x64/boombot-native-host.exe +0 -0
  95. package/dist/node_modules/@boombot/channels/handlers.d.ts +9 -0
  96. package/dist/node_modules/@boombot/channels/handlers.js +109 -0
  97. package/dist/node_modules/@boombot/channels/index.d.ts +12 -0
  98. package/dist/node_modules/@boombot/channels/index.js +12 -0
  99. package/dist/node_modules/@boombot/channels/package.json +9 -0
  100. package/dist/node_modules/@boombot/channels/service.d.ts +62 -0
  101. package/dist/node_modules/@boombot/channels/service.js +608 -0
  102. package/dist/node_modules/@boombot/channels/tool.d.ts +10 -0
  103. package/dist/node_modules/@boombot/channels/tool.js +46 -0
  104. package/dist/node_modules/@boombot/channels/transports/common/dedup.d.ts +17 -0
  105. package/dist/node_modules/@boombot/channels/transports/common/dedup.js +42 -0
  106. package/dist/node_modules/@boombot/channels/transports/common/handoff.d.ts +19 -0
  107. package/dist/node_modules/@boombot/channels/transports/common/handoff.js +32 -0
  108. package/dist/node_modules/@boombot/channels/transports/common/index.d.ts +3 -0
  109. package/dist/node_modules/@boombot/channels/transports/common/index.js +3 -0
  110. package/dist/node_modules/@boombot/channels/transports/common/types.d.ts +99 -0
  111. package/dist/node_modules/@boombot/channels/transports/common/types.js +54 -0
  112. package/dist/node_modules/@boombot/channels/transports/common.d.ts +2 -0
  113. package/dist/node_modules/@boombot/channels/transports/common.js +2 -0
  114. package/dist/node_modules/@boombot/channels/transports/dedup/index.d.ts +1 -0
  115. package/dist/node_modules/@boombot/channels/transports/dedup/index.js +1 -0
  116. package/dist/node_modules/@boombot/channels/transports/dedup.d.ts +2 -0
  117. package/dist/node_modules/@boombot/channels/transports/dedup.js +2 -0
  118. package/dist/node_modules/@boombot/channels/transports/discord/index.d.ts +1 -0
  119. package/dist/node_modules/@boombot/channels/transports/discord/index.js +1 -0
  120. package/dist/node_modules/@boombot/channels/transports/discord/transport.d.ts +36 -0
  121. package/dist/node_modules/@boombot/channels/transports/discord/transport.js +199 -0
  122. package/dist/node_modules/@boombot/channels/transports/discord.d.ts +2 -0
  123. package/dist/node_modules/@boombot/channels/transports/discord.js +2 -0
  124. package/dist/node_modules/@boombot/channels/transports/handoff.d.ts +2 -0
  125. package/dist/node_modules/@boombot/channels/transports/handoff.js +2 -0
  126. package/dist/node_modules/@boombot/channels/transports/messenger/index.d.ts +1 -0
  127. package/dist/node_modules/@boombot/channels/transports/messenger/index.js +1 -0
  128. package/dist/node_modules/@boombot/channels/transports/messenger/transport.d.ts +34 -0
  129. package/dist/node_modules/@boombot/channels/transports/messenger/transport.js +180 -0
  130. package/dist/node_modules/@boombot/channels/transports/messenger.d.ts +2 -0
  131. package/dist/node_modules/@boombot/channels/transports/messenger.js +2 -0
  132. package/dist/node_modules/@boombot/channels/transports/slack/index.d.ts +1 -0
  133. package/dist/node_modules/@boombot/channels/transports/slack/index.js +1 -0
  134. package/dist/node_modules/@boombot/channels/transports/slack/transport.d.ts +35 -0
  135. package/dist/node_modules/@boombot/channels/transports/slack/transport.js +183 -0
  136. package/dist/node_modules/@boombot/channels/transports/slack.d.ts +2 -0
  137. package/dist/node_modules/@boombot/channels/transports/slack.js +2 -0
  138. package/dist/node_modules/@boombot/channels/transports/streamer/index.d.ts +1 -0
  139. package/dist/node_modules/@boombot/channels/transports/streamer/index.js +1 -0
  140. package/dist/node_modules/@boombot/channels/transports/streamer/streamer.d.ts +31 -0
  141. package/dist/node_modules/@boombot/channels/transports/streamer/streamer.js +141 -0
  142. package/dist/node_modules/@boombot/channels/transports/streamer.d.ts +2 -0
  143. package/dist/node_modules/@boombot/channels/transports/streamer.js +2 -0
  144. package/dist/node_modules/@boombot/channels/transports/telegram/index.d.ts +1 -0
  145. package/dist/node_modules/@boombot/channels/transports/telegram/index.js +1 -0
  146. package/dist/node_modules/@boombot/channels/transports/telegram/transport.d.ts +75 -0
  147. package/dist/node_modules/@boombot/channels/transports/telegram/transport.js +395 -0
  148. package/dist/node_modules/@boombot/channels/transports/telegram.d.ts +2 -0
  149. package/dist/node_modules/@boombot/channels/transports/telegram.js +2 -0
  150. package/dist/node_modules/@boombot/channels/transports/tiktok/index.d.ts +1 -0
  151. package/dist/node_modules/@boombot/channels/transports/tiktok/index.js +1 -0
  152. package/dist/node_modules/@boombot/channels/transports/tiktok/transport.d.ts +27 -0
  153. package/dist/node_modules/@boombot/channels/transports/tiktok/transport.js +97 -0
  154. package/dist/node_modules/@boombot/channels/transports/tiktok.d.ts +2 -0
  155. package/dist/node_modules/@boombot/channels/transports/tiktok.js +2 -0
  156. package/dist/node_modules/@boombot/channels/transports/whatsapp/index.d.ts +1 -0
  157. package/dist/node_modules/@boombot/channels/transports/whatsapp/index.js +1 -0
  158. package/dist/node_modules/@boombot/channels/transports/whatsapp/transport.d.ts +38 -0
  159. package/dist/node_modules/@boombot/channels/transports/whatsapp/transport.js +189 -0
  160. package/dist/node_modules/@boombot/channels/transports/whatsapp.d.ts +2 -0
  161. package/dist/node_modules/@boombot/channels/transports/whatsapp.js +2 -0
  162. package/dist/node_modules/@boombot/channels/transports/zalo/index.d.ts +2 -0
  163. package/dist/node_modules/@boombot/channels/transports/zalo/index.js +2 -0
  164. package/dist/node_modules/@boombot/channels/transports/zalo/oa.d.ts +28 -0
  165. package/dist/node_modules/@boombot/channels/transports/zalo/oa.js +94 -0
  166. package/dist/node_modules/@boombot/channels/transports/zalo/personal.d.ts +106 -0
  167. package/dist/node_modules/@boombot/channels/transports/zalo/personal.js +171 -0
  168. package/dist/node_modules/@boombot/channels/transports/zalo-personal.d.ts +2 -0
  169. package/dist/node_modules/@boombot/channels/transports/zalo-personal.js +2 -0
  170. package/dist/node_modules/@boombot/channels/transports/zalo.d.ts +2 -0
  171. package/dist/node_modules/@boombot/channels/transports/zalo.js +2 -0
  172. package/dist/node_modules/@boombot/core/agent-core/index.d.ts +12 -0
  173. package/dist/node_modules/@boombot/core/agent-core/index.js +12 -0
  174. package/dist/node_modules/@boombot/core/agent-core/middleware.d.ts +60 -0
  175. package/dist/node_modules/@boombot/core/agent-core/middleware.js +152 -0
  176. package/dist/node_modules/@boombot/core/agent-core/routing.d.ts +128 -0
  177. package/dist/node_modules/@boombot/core/agent-core/routing.js +437 -0
  178. package/dist/node_modules/@boombot/core/agent-core/runtime-deps.d.ts +88 -0
  179. package/dist/node_modules/@boombot/core/agent-core/runtime-deps.js +8 -0
  180. package/dist/node_modules/@boombot/core/agent-core/tool-errors.d.ts +44 -0
  181. package/dist/node_modules/@boombot/core/agent-core/tool-errors.js +60 -0
  182. package/dist/node_modules/@boombot/core/agent-core/turn-loop.d.ts +21 -0
  183. package/dist/node_modules/@boombot/core/agent-core/turn-loop.js +561 -0
  184. package/dist/node_modules/@boombot/core/agent-core/types.d.ts +189 -0
  185. package/dist/node_modules/@boombot/core/agent-core/types.js +7 -0
  186. package/dist/node_modules/@boombot/core/compaction/compactor.d.ts +19 -0
  187. package/dist/node_modules/@boombot/core/compaction/compactor.js +127 -0
  188. package/dist/node_modules/@boombot/core/compaction/estimator.d.ts +10 -0
  189. package/dist/node_modules/@boombot/core/compaction/estimator.js +48 -0
  190. package/dist/node_modules/@boombot/core/compaction/index.d.ts +3 -0
  191. package/dist/node_modules/@boombot/core/compaction/index.js +3 -0
  192. package/dist/node_modules/@boombot/core/compaction/types.d.ts +31 -0
  193. package/dist/node_modules/@boombot/core/compaction/types.js +7 -0
  194. package/dist/node_modules/@boombot/core/index.d.ts +9 -0
  195. package/dist/node_modules/@boombot/core/index.js +9 -0
  196. package/dist/node_modules/@boombot/core/jev/index.d.ts +2 -0
  197. package/dist/node_modules/@boombot/core/jev/index.js +2 -0
  198. package/dist/node_modules/@boombot/core/jev/jev.d.ts +30 -0
  199. package/dist/node_modules/@boombot/core/jev/jev.js +164 -0
  200. package/dist/node_modules/@boombot/core/jev/types.d.ts +22 -0
  201. package/dist/node_modules/@boombot/core/jev/types.js +1 -0
  202. package/dist/node_modules/@boombot/core/memory/consolidation/budget.d.ts +63 -0
  203. package/dist/node_modules/@boombot/core/memory/consolidation/budget.js +94 -0
  204. package/dist/node_modules/@boombot/core/memory/consolidation/consolidator.d.ts +152 -0
  205. package/dist/node_modules/@boombot/core/memory/consolidation/consolidator.js +318 -0
  206. package/dist/node_modules/@boombot/core/memory/consolidation/index.d.ts +12 -0
  207. package/dist/node_modules/@boombot/core/memory/consolidation/index.js +12 -0
  208. package/dist/node_modules/@boombot/core/memory/curation.d.ts +86 -0
  209. package/dist/node_modules/@boombot/core/memory/curation.js +120 -0
  210. package/dist/node_modules/@boombot/core/memory/errors.d.ts +12 -0
  211. package/dist/node_modules/@boombot/core/memory/errors.js +20 -0
  212. package/dist/node_modules/@boombot/core/memory/hybrid-search.d.ts +29 -0
  213. package/dist/node_modules/@boombot/core/memory/hybrid-search.js +52 -0
  214. package/dist/node_modules/@boombot/core/memory/index.d.ts +23 -0
  215. package/dist/node_modules/@boombot/core/memory/index.js +23 -0
  216. package/dist/node_modules/@boombot/core/memory/indexer.d.ts +47 -0
  217. package/dist/node_modules/@boombot/core/memory/indexer.js +138 -0
  218. package/dist/node_modules/@boombot/core/memory/lifecycle.d.ts +12 -0
  219. package/dist/node_modules/@boombot/core/memory/lifecycle.js +66 -0
  220. package/dist/node_modules/@boombot/core/memory/provider.d.ts +84 -0
  221. package/dist/node_modules/@boombot/core/memory/provider.js +117 -0
  222. package/dist/node_modules/@boombot/core/memory/recall.d.ts +7 -0
  223. package/dist/node_modules/@boombot/core/memory/recall.js +111 -0
  224. package/dist/node_modules/@boombot/core/memory/scope-resolver.d.ts +27 -0
  225. package/dist/node_modules/@boombot/core/memory/scope-resolver.js +60 -0
  226. package/dist/node_modules/@boombot/core/memory/search.d.ts +37 -0
  227. package/dist/node_modules/@boombot/core/memory/search.js +158 -0
  228. package/dist/node_modules/@boombot/core/memory/store.d.ts +60 -0
  229. package/dist/node_modules/@boombot/core/memory/store.js +289 -0
  230. package/dist/node_modules/@boombot/core/memory/types.d.ts +121 -0
  231. package/dist/node_modules/@boombot/core/memory/types.js +21 -0
  232. package/dist/node_modules/@boombot/core/memory/vector-index.d.ts +34 -0
  233. package/dist/node_modules/@boombot/core/memory/vector-index.js +65 -0
  234. package/dist/node_modules/@boombot/core/package.json +9 -0
  235. package/dist/node_modules/@boombot/core/reflection/classifier.d.ts +13 -0
  236. package/dist/node_modules/@boombot/core/reflection/classifier.js +77 -0
  237. package/dist/node_modules/@boombot/core/reflection/index.d.ts +2 -0
  238. package/dist/node_modules/@boombot/core/reflection/index.js +2 -0
  239. package/dist/node_modules/@boombot/core/reflection/types.d.ts +13 -0
  240. package/dist/node_modules/@boombot/core/reflection/types.js +4 -0
  241. package/dist/node_modules/@boombot/core/research/config.d.ts +89 -0
  242. package/dist/node_modules/@boombot/core/research/config.js +206 -0
  243. package/dist/node_modules/@boombot/core/research/crawl.d.ts +36 -0
  244. package/dist/node_modules/@boombot/core/research/crawl.js +179 -0
  245. package/dist/node_modules/@boombot/core/research/factory.d.ts +26 -0
  246. package/dist/node_modules/@boombot/core/research/factory.js +46 -0
  247. package/dist/node_modules/@boombot/core/research/http.d.ts +87 -0
  248. package/dist/node_modules/@boombot/core/research/http.js +250 -0
  249. package/dist/node_modules/@boombot/core/research/index.d.ts +17 -0
  250. package/dist/node_modules/@boombot/core/research/index.js +10 -0
  251. package/dist/node_modules/@boombot/core/research/orchestrator.d.ts +113 -0
  252. package/dist/node_modules/@boombot/core/research/orchestrator.js +252 -0
  253. package/dist/node_modules/@boombot/core/research/parse/docx.d.ts +24 -0
  254. package/dist/node_modules/@boombot/core/research/parse/docx.js +183 -0
  255. package/dist/node_modules/@boombot/core/research/parse/guards.d.ts +89 -0
  256. package/dist/node_modules/@boombot/core/research/parse/guards.js +171 -0
  257. package/dist/node_modules/@boombot/core/research/parse/index.d.ts +68 -0
  258. package/dist/node_modules/@boombot/core/research/parse/index.js +219 -0
  259. package/dist/node_modules/@boombot/core/research/parse/pdf.d.ts +38 -0
  260. package/dist/node_modules/@boombot/core/research/parse/pdf.js +567 -0
  261. package/dist/node_modules/@boombot/core/research/providers/arxiv.d.ts +9 -0
  262. package/dist/node_modules/@boombot/core/research/providers/arxiv.js +72 -0
  263. package/dist/node_modules/@boombot/core/research/providers/brave.d.ts +11 -0
  264. package/dist/node_modules/@boombot/core/research/providers/brave.js +36 -0
  265. package/dist/node_modules/@boombot/core/research/providers/duckduckgo.d.ts +9 -0
  266. package/dist/node_modules/@boombot/core/research/providers/duckduckgo.js +78 -0
  267. package/dist/node_modules/@boombot/core/research/providers/exa.d.ts +11 -0
  268. package/dist/node_modules/@boombot/core/research/providers/exa.js +34 -0
  269. package/dist/node_modules/@boombot/core/research/providers/firecrawl.d.ts +16 -0
  270. package/dist/node_modules/@boombot/core/research/providers/firecrawl.js +47 -0
  271. package/dist/node_modules/@boombot/core/research/providers/index.d.ts +17 -0
  272. package/dist/node_modules/@boombot/core/research/providers/index.js +11 -0
  273. package/dist/node_modules/@boombot/core/research/providers/jina.d.ts +13 -0
  274. package/dist/node_modules/@boombot/core/research/providers/jina.js +114 -0
  275. package/dist/node_modules/@boombot/core/research/providers/openalex.d.ts +14 -0
  276. package/dist/node_modules/@boombot/core/research/providers/openalex.js +66 -0
  277. package/dist/node_modules/@boombot/core/research/providers/semantic-scholar.d.ts +9 -0
  278. package/dist/node_modules/@boombot/core/research/providers/semantic-scholar.js +56 -0
  279. package/dist/node_modules/@boombot/core/research/providers/tavily.d.ts +11 -0
  280. package/dist/node_modules/@boombot/core/research/providers/tavily.js +35 -0
  281. package/dist/node_modules/@boombot/core/research/providers/wikipedia.d.ts +12 -0
  282. package/dist/node_modules/@boombot/core/research/providers/wikipedia.js +47 -0
  283. package/dist/node_modules/@boombot/core/research/tools.d.ts +27 -0
  284. package/dist/node_modules/@boombot/core/research/tools.js +251 -0
  285. package/dist/node_modules/@boombot/core/research/types.d.ts +133 -0
  286. package/dist/node_modules/@boombot/core/research/types.js +8 -0
  287. package/dist/node_modules/@boombot/core/research/wiring.d.ts +25 -0
  288. package/dist/node_modules/@boombot/core/research/wiring.js +51 -0
  289. package/dist/node_modules/@boombot/core/scheduler/cron.d.ts +34 -0
  290. package/dist/node_modules/@boombot/core/scheduler/cron.js +147 -0
  291. package/dist/node_modules/@boombot/core/scheduler/evaluator.d.ts +42 -0
  292. package/dist/node_modules/@boombot/core/scheduler/evaluator.js +148 -0
  293. package/dist/node_modules/@boombot/core/scheduler/index.d.ts +15 -0
  294. package/dist/node_modules/@boombot/core/scheduler/index.js +15 -0
  295. package/dist/node_modules/@boombot/core/scheduler/registry.d.ts +81 -0
  296. package/dist/node_modules/@boombot/core/scheduler/registry.js +263 -0
  297. package/dist/node_modules/@boombot/core/scheduler/runner.d.ts +59 -0
  298. package/dist/node_modules/@boombot/core/scheduler/runner.js +257 -0
  299. package/dist/node_modules/@boombot/core/scheduler/store.d.ts +150 -0
  300. package/dist/node_modules/@boombot/core/scheduler/store.js +526 -0
  301. package/dist/node_modules/@boombot/core/scheduler/timezone.d.ts +35 -0
  302. package/dist/node_modules/@boombot/core/scheduler/timezone.js +96 -0
  303. package/dist/node_modules/@boombot/core/scheduler/types.d.ts +157 -0
  304. package/dist/node_modules/@boombot/core/scheduler/types.js +89 -0
  305. package/dist/node_modules/@boombot/core/task-runner/index.d.ts +7 -0
  306. package/dist/node_modules/@boombot/core/task-runner/index.js +5 -0
  307. package/dist/node_modules/@boombot/core/task-runner/planner.d.ts +37 -0
  308. package/dist/node_modules/@boombot/core/task-runner/planner.js +154 -0
  309. package/dist/node_modules/@boombot/core/task-runner/runner.d.ts +8 -0
  310. package/dist/node_modules/@boombot/core/task-runner/runner.js +564 -0
  311. package/dist/node_modules/@boombot/core/task-runner/store.d.ts +28 -0
  312. package/dist/node_modules/@boombot/core/task-runner/store.js +126 -0
  313. package/dist/node_modules/@boombot/core/task-runner/types.d.ts +138 -0
  314. package/dist/node_modules/@boombot/core/task-runner/types.js +11 -0
  315. package/dist/node_modules/@boombot/core/workflow/dag.d.ts +16 -0
  316. package/dist/node_modules/@boombot/core/workflow/dag.js +109 -0
  317. package/dist/node_modules/@boombot/core/workflow/engine.d.ts +34 -0
  318. package/dist/node_modules/@boombot/core/workflow/engine.js +304 -0
  319. package/dist/node_modules/@boombot/core/workflow/index.d.ts +3 -0
  320. package/dist/node_modules/@boombot/core/workflow/index.js +3 -0
  321. package/dist/node_modules/@boombot/core/workflow/types.d.ts +98 -0
  322. package/dist/node_modules/@boombot/core/workflow/types.js +21 -0
  323. package/dist/node_modules/@boombot/cronjobs/handlers.d.ts +11 -0
  324. package/dist/node_modules/@boombot/cronjobs/handlers.js +174 -0
  325. package/dist/node_modules/@boombot/cronjobs/index.d.ts +2 -0
  326. package/dist/node_modules/@boombot/cronjobs/index.js +2 -0
  327. package/dist/node_modules/@boombot/cronjobs/package.json +9 -0
  328. package/dist/node_modules/@boombot/cronjobs/service.d.ts +53 -0
  329. package/dist/node_modules/@boombot/cronjobs/service.js +200 -0
  330. package/dist/node_modules/@boombot/plugins/index.d.ts +2 -0
  331. package/dist/node_modules/@boombot/plugins/index.js +2 -0
  332. package/dist/node_modules/@boombot/plugins/installer.d.ts +45 -0
  333. package/dist/node_modules/@boombot/plugins/installer.js +487 -0
  334. package/dist/node_modules/@boombot/plugins/manager.d.ts +23 -0
  335. package/dist/node_modules/@boombot/plugins/manager.js +243 -0
  336. package/dist/node_modules/@boombot/plugins/package.json +9 -0
  337. package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-channels.d.ts +125 -0
  338. package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-channels.js +76 -0
  339. package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-plugins.d.ts +220 -0
  340. package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-plugins.js +60 -0
  341. package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-scheduler.d.ts +33 -0
  342. package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-scheduler.js +25 -0
  343. package/dist/node_modules/@boombot/protocol/gateway-protocol/commands.d.ts +4349 -0
  344. package/dist/node_modules/@boombot/protocol/gateway-protocol/commands.js +563 -0
  345. package/dist/node_modules/@boombot/protocol/gateway-protocol/envelope.d.ts +32 -0
  346. package/dist/node_modules/@boombot/protocol/gateway-protocol/envelope.js +61 -0
  347. package/dist/node_modules/@boombot/protocol/gateway-protocol/errors.d.ts +13 -0
  348. package/dist/node_modules/@boombot/protocol/gateway-protocol/errors.js +16 -0
  349. package/dist/node_modules/@boombot/protocol/gateway-protocol/events.d.ts +567 -0
  350. package/dist/node_modules/@boombot/protocol/gateway-protocol/events.js +395 -0
  351. package/dist/node_modules/@boombot/protocol/gateway-protocol/index.d.ts +20 -0
  352. package/dist/node_modules/@boombot/protocol/gateway-protocol/index.js +13 -0
  353. package/dist/node_modules/@boombot/protocol/gateway-protocol/types.d.ts +91 -0
  354. package/dist/node_modules/@boombot/protocol/gateway-protocol/types.js +7 -0
  355. package/dist/node_modules/@boombot/protocol/index.d.ts +4 -0
  356. package/dist/node_modules/@boombot/protocol/index.js +3 -0
  357. package/dist/node_modules/@boombot/protocol/package.json +9 -0
  358. package/dist/node_modules/@boombot/protocol/plugin-sdk/channel.d.ts +41 -0
  359. package/dist/node_modules/@boombot/protocol/plugin-sdk/channel.js +17 -0
  360. package/dist/node_modules/@boombot/protocol/plugin-sdk/index.d.ts +10 -0
  361. package/dist/node_modules/@boombot/protocol/plugin-sdk/index.js +10 -0
  362. package/dist/node_modules/@boombot/protocol/plugin-sdk/manifest.d.ts +58 -0
  363. package/dist/node_modules/@boombot/protocol/plugin-sdk/manifest.js +116 -0
  364. package/dist/node_modules/@boombot/protocol/plugin-sdk/plugin.d.ts +25 -0
  365. package/dist/node_modules/@boombot/protocol/plugin-sdk/plugin.js +1 -0
  366. package/dist/node_modules/@boombot/protocol/providers/cipher.d.ts +7 -0
  367. package/dist/node_modules/@boombot/protocol/providers/cipher.js +52 -0
  368. package/dist/node_modules/@boombot/protocol/providers/index.d.ts +19 -0
  369. package/dist/node_modules/@boombot/protocol/providers/index.js +19 -0
  370. package/dist/node_modules/@boombot/protocol/providers/key-roulette.d.ts +79 -0
  371. package/dist/node_modules/@boombot/protocol/providers/key-roulette.js +81 -0
  372. package/dist/node_modules/@boombot/protocol/providers/probe.d.ts +29 -0
  373. package/dist/node_modules/@boombot/protocol/providers/probe.js +96 -0
  374. package/dist/node_modules/@boombot/protocol/providers/profiles/anthropic.d.ts +11 -0
  375. package/dist/node_modules/@boombot/protocol/providers/profiles/anthropic.js +11 -0
  376. package/dist/node_modules/@boombot/protocol/providers/profiles/custom.d.ts +22 -0
  377. package/dist/node_modules/@boombot/protocol/providers/profiles/custom.js +222 -0
  378. package/dist/node_modules/@boombot/protocol/providers/profiles/deepseek.d.ts +7 -0
  379. package/dist/node_modules/@boombot/protocol/providers/profiles/deepseek.js +9 -0
  380. package/dist/node_modules/@boombot/protocol/providers/profiles/google.d.ts +10 -0
  381. package/dist/node_modules/@boombot/protocol/providers/profiles/google.js +10 -0
  382. package/dist/node_modules/@boombot/protocol/providers/profiles/index.d.ts +31 -0
  383. package/dist/node_modules/@boombot/protocol/providers/profiles/index.js +56 -0
  384. package/dist/node_modules/@boombot/protocol/providers/profiles/local.d.ts +10 -0
  385. package/dist/node_modules/@boombot/protocol/providers/profiles/local.js +11 -0
  386. package/dist/node_modules/@boombot/protocol/providers/profiles/mistral.d.ts +7 -0
  387. package/dist/node_modules/@boombot/protocol/providers/profiles/mistral.js +9 -0
  388. package/dist/node_modules/@boombot/protocol/providers/profiles/openai-compatible.d.ts +10 -0
  389. package/dist/node_modules/@boombot/protocol/providers/profiles/openai-compatible.js +10 -0
  390. package/dist/node_modules/@boombot/protocol/providers/profiles/openai.d.ts +7 -0
  391. package/dist/node_modules/@boombot/protocol/providers/profiles/openai.js +11 -0
  392. package/dist/node_modules/@boombot/protocol/providers/profiles/types.d.ts +58 -0
  393. package/dist/node_modules/@boombot/protocol/providers/profiles/types.js +1 -0
  394. package/dist/node_modules/@boombot/protocol/providers/profiles/xai.d.ts +7 -0
  395. package/dist/node_modules/@boombot/protocol/providers/profiles/xai.js +10 -0
  396. package/dist/node_modules/@boombot/protocol/providers/request-profile.d.ts +102 -0
  397. package/dist/node_modules/@boombot/protocol/providers/request-profile.js +118 -0
  398. package/dist/node_modules/@boombot/protocol/providers/service.d.ts +2 -0
  399. package/dist/node_modules/@boombot/protocol/providers/service.js +418 -0
  400. package/dist/node_modules/@boombot/protocol/providers/types.d.ts +141 -0
  401. package/dist/node_modules/@boombot/protocol/providers/types.js +16 -0
  402. package/dist/node_modules/@boombot/sandbox/fs-path.d.ts +13 -0
  403. package/dist/node_modules/@boombot/sandbox/fs-path.js +79 -0
  404. package/dist/node_modules/@boombot/sandbox/index.d.ts +13 -0
  405. package/dist/node_modules/@boombot/sandbox/index.js +13 -0
  406. package/dist/node_modules/@boombot/sandbox/native.d.ts +39 -0
  407. package/dist/node_modules/@boombot/sandbox/native.js +224 -0
  408. package/dist/node_modules/@boombot/sandbox/package.json +9 -0
  409. package/dist/node_modules/@boombot/sandbox/sandbox.d.ts +92 -0
  410. package/dist/node_modules/@boombot/sandbox/sandbox.js +229 -0
  411. package/dist/node_modules/@boombot/security/harness-guard/boundary.d.ts +22 -0
  412. package/dist/node_modules/@boombot/security/harness-guard/boundary.js +105 -0
  413. package/dist/node_modules/@boombot/security/harness-guard/gates.d.ts +90 -0
  414. package/dist/node_modules/@boombot/security/harness-guard/gates.js +791 -0
  415. package/dist/node_modules/@boombot/security/harness-guard/index.d.ts +23 -0
  416. package/dist/node_modules/@boombot/security/harness-guard/index.js +23 -0
  417. package/dist/node_modules/@boombot/security/harness-guard/policy.d.ts +20 -0
  418. package/dist/node_modules/@boombot/security/harness-guard/policy.js +70 -0
  419. package/dist/node_modules/@boombot/security/harness-guard/sanitizer.d.ts +53 -0
  420. package/dist/node_modules/@boombot/security/harness-guard/sanitizer.js +145 -0
  421. package/dist/node_modules/@boombot/security/harness-guard/types.d.ts +71 -0
  422. package/dist/node_modules/@boombot/security/harness-guard/types.js +10 -0
  423. package/dist/node_modules/@boombot/security/harness-guard/verifier.d.ts +59 -0
  424. package/dist/node_modules/@boombot/security/harness-guard/verifier.js +169 -0
  425. package/dist/node_modules/@boombot/security/index.d.ts +5 -0
  426. package/dist/node_modules/@boombot/security/index.js +9 -0
  427. package/dist/node_modules/@boombot/security/package.json +9 -0
  428. package/dist/node_modules/@boombot/security/policy/approval.d.ts +117 -0
  429. package/dist/node_modules/@boombot/security/policy/approval.js +223 -0
  430. package/dist/node_modules/@boombot/security/reasoning-guard/claim-extractor.d.ts +10 -0
  431. package/dist/node_modules/@boombot/security/reasoning-guard/claim-extractor.js +124 -0
  432. package/dist/node_modules/@boombot/security/reasoning-guard/evidence-ledger.d.ts +25 -0
  433. package/dist/node_modules/@boombot/security/reasoning-guard/evidence-ledger.js +70 -0
  434. package/dist/node_modules/@boombot/security/reasoning-guard/gate.d.ts +38 -0
  435. package/dist/node_modules/@boombot/security/reasoning-guard/gate.js +61 -0
  436. package/dist/node_modules/@boombot/security/reasoning-guard/grounding-check.d.ts +12 -0
  437. package/dist/node_modules/@boombot/security/reasoning-guard/grounding-check.js +234 -0
  438. package/dist/node_modules/@boombot/security/reasoning-guard/index.d.ts +17 -0
  439. package/dist/node_modules/@boombot/security/reasoning-guard/index.js +13 -0
  440. package/dist/node_modules/@boombot/security/reasoning-guard/policy.d.ts +15 -0
  441. package/dist/node_modules/@boombot/security/reasoning-guard/policy.js +39 -0
  442. package/dist/node_modules/@boombot/security/reasoning-guard/types.d.ts +46 -0
  443. package/dist/node_modules/@boombot/security/reasoning-guard/types.js +7 -0
  444. package/dist/node_modules/@boombot/security/security/approval.d.ts +63 -0
  445. package/dist/node_modules/@boombot/security/security/approval.js +140 -0
  446. package/dist/node_modules/@boombot/security/security/audit.d.ts +39 -0
  447. package/dist/node_modules/@boombot/security/security/audit.js +70 -0
  448. package/dist/node_modules/@boombot/security/security/index.d.ts +12 -0
  449. package/dist/node_modules/@boombot/security/security/index.js +12 -0
  450. package/dist/node_modules/@boombot/security/security/trust.d.ts +79 -0
  451. package/dist/node_modules/@boombot/security/security/trust.js +87 -0
  452. package/dist/package.json +5 -0
  453. package/dist/proto/agent_core.proto +56 -0
  454. package/dist/python/agent-core-python/pyproject.toml +40 -0
  455. package/dist/python/agent-core-python/src/boombot_agent/__init__.py +5 -0
  456. package/dist/python/agent-core-python/src/boombot_agent/generated/__init__.py +0 -0
  457. package/dist/python/agent-core-python/src/boombot_agent/generated/agent_core_pb2.py +54 -0
  458. package/dist/python/agent-core-python/src/boombot_agent/generated/agent_core_pb2_grpc.py +140 -0
  459. package/dist/python/agent-core-python/src/boombot_agent/rpc.py +265 -0
  460. package/dist/python/agent-core-python/src/boombot_agent/turn.py +577 -0
  461. package/dist/python/agent-core-python/src/boombot_ml/__init__.py +12 -0
  462. package/dist/python/agent-core-python/src/boombot_ml/embeddings.py +58 -0
  463. package/dist/python/agent-core-python/src/boombot_ml/training.py +156 -0
  464. package/dist/python/agent-core-python/uv.lock +2856 -0
  465. package/dist/web/assets/ChatView-BZrSD-64.js +262 -0
  466. package/dist/web/assets/ChatView-Cahbjez6.css +1 -0
  467. package/dist/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  468. package/dist/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  469. package/dist/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  470. package/dist/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  471. package/dist/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  472. package/dist/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  473. package/dist/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  474. package/dist/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  475. package/dist/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  476. package/dist/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  477. package/dist/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  478. package/dist/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  479. package/dist/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  480. package/dist/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  481. package/dist/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  482. package/dist/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  483. package/dist/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  484. package/dist/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  485. package/dist/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  486. package/dist/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  487. package/dist/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  488. package/dist/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  489. package/dist/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  490. package/dist/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  491. package/dist/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  492. package/dist/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  493. package/dist/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  494. package/dist/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  495. package/dist/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  496. package/dist/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  497. package/dist/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  498. package/dist/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  499. package/dist/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  500. package/dist/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  501. package/dist/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  502. package/dist/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  503. package/dist/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  504. package/dist/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  505. package/dist/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  506. package/dist/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  507. package/dist/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  508. package/dist/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  509. package/dist/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  510. package/dist/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  511. package/dist/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  512. package/dist/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  513. package/dist/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  514. package/dist/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  515. package/dist/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  516. package/dist/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  517. package/dist/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  518. package/dist/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  519. package/dist/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  520. package/dist/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  521. package/dist/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  522. package/dist/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  523. package/dist/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  524. package/dist/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  525. package/dist/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  526. package/dist/web/assets/MemoryView-BJbXqqs7.css +1 -0
  527. package/dist/web/assets/MemoryView-BfMq_6CD.js +1 -0
  528. package/dist/web/assets/SchedulesView-B22QmPR-.js +1 -0
  529. package/dist/web/assets/SchedulesView-C6XK7A8a.css +1 -0
  530. package/dist/web/assets/SessionsView-C1dqdhxI.css +1 -0
  531. package/dist/web/assets/SessionsView-DS0-aH2a.js +1 -0
  532. package/dist/web/assets/TasksView-Dtasg4hd.css +1 -0
  533. package/dist/web/assets/TasksView-ey0FLsW8.js +2 -0
  534. package/dist/web/assets/Textarea-DN3Zybl1.js +1 -0
  535. package/dist/web/assets/Tooltip-Bn2cqFPz.css +1 -0
  536. package/dist/web/assets/Tooltip-MzV2Gqnc.js +1 -0
  537. package/dist/web/assets/browser-Bnt73-Ub.js +8 -0
  538. package/dist/web/assets/index-BL8bi7Yt.css +1 -0
  539. package/dist/web/assets/index-CuPR73Tn.js +73 -0
  540. package/dist/web/favicon.svg +4 -0
  541. package/dist/web/index.html +26 -0
  542. package/dist/web/logo.jpg +0 -0
  543. package/dist/web/logo.png +0 -0
  544. package/package.json +51 -4
@@ -0,0 +1,42 @@
1
+ /**
2
+ * MessageDeduplicator — sliding TTL cache preventing duplicate message processing.
3
+ * Direct concept from ChannelHub core.
4
+ */
5
+ export class MessageDeduplicator {
6
+ ttlMs;
7
+ maxSize;
8
+ seen = new Map();
9
+ constructor(ttlMs = 600_000, // 10 minutes
10
+ maxSize = 5_000) {
11
+ this.ttlMs = ttlMs;
12
+ this.maxSize = maxSize;
13
+ }
14
+ /**
15
+ * Returns true if the messageId is seen for the first time.
16
+ * Returns false if it has already been processed within the TTL window.
17
+ */
18
+ checkAndRecord(messageId) {
19
+ const now = Date.now();
20
+ this.prune(now);
21
+ if (this.seen.has(messageId)) {
22
+ return false; // Duplicate!
23
+ }
24
+ if (this.seen.size >= this.maxSize) {
25
+ const oldestKey = this.seen.keys().next().value;
26
+ if (oldestKey)
27
+ this.seen.delete(oldestKey);
28
+ }
29
+ this.seen.set(messageId, now);
30
+ return true;
31
+ }
32
+ prune(now) {
33
+ for (const [id, timestamp] of this.seen.entries()) {
34
+ if (now - timestamp > this.ttlMs) {
35
+ this.seen.delete(id);
36
+ }
37
+ else {
38
+ break; // Map preserves insertion order, early exit
39
+ }
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * HandoffManager — pauses automated bot responses when a human agent steps in.
3
+ * Ported concept from ChannelHub core.
4
+ */
5
+ export declare class HandoffManager {
6
+ private readonly mutedUntil;
7
+ /**
8
+ * Mutes automated responses for `chatKey` (e.g. "telegram:12345") for `durationMs`.
9
+ */
10
+ takeover(chatKey: string, durationMs?: number): void;
11
+ /**
12
+ * Resumes automated bot responses immediately for `chatKey`.
13
+ */
14
+ resume(chatKey: string): void;
15
+ /**
16
+ * Checks if bot should stay quiet for `chatKey`.
17
+ */
18
+ isHandedOff(chatKey: string): boolean;
19
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * HandoffManager — pauses automated bot responses when a human agent steps in.
3
+ * Ported concept from ChannelHub core.
4
+ */
5
+ export class HandoffManager {
6
+ mutedUntil = new Map();
7
+ /**
8
+ * Mutes automated responses for `chatKey` (e.g. "telegram:12345") for `durationMs`.
9
+ */
10
+ takeover(chatKey, durationMs = 30 * 60 * 1000) {
11
+ this.mutedUntil.set(chatKey, Date.now() + durationMs);
12
+ }
13
+ /**
14
+ * Resumes automated bot responses immediately for `chatKey`.
15
+ */
16
+ resume(chatKey) {
17
+ this.mutedUntil.delete(chatKey);
18
+ }
19
+ /**
20
+ * Checks if bot should stay quiet for `chatKey`.
21
+ */
22
+ isHandedOff(chatKey) {
23
+ const expiresAt = this.mutedUntil.get(chatKey);
24
+ if (!expiresAt)
25
+ return false;
26
+ if (Date.now() > expiresAt) {
27
+ this.mutedUntil.delete(chatKey);
28
+ return false;
29
+ }
30
+ return true;
31
+ }
32
+ }
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './dedup.js';
3
+ export * from './handoff.js';
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './dedup.js';
3
+ export * from './handoff.js';
@@ -0,0 +1,99 @@
1
+ import type { ChannelKind } from '@boombot/protocol';
2
+ /** Runtime status of a channel transport, as seen by `channel.list`. */
3
+ export type ChannelRuntimeStatus = 'connected' | 'disconnected' | 'error' | 'pending';
4
+ /** Minimal structured logger the transports need. */
5
+ export interface ChannelLogger {
6
+ info(message: string, meta?: Readonly<Record<string, unknown>>): void;
7
+ warn(message: string, meta?: Readonly<Record<string, unknown>>): void;
8
+ error(message: string, meta?: Readonly<Record<string, unknown>>): void;
9
+ }
10
+ /** Subset of the agent turn service used by inbound channel messages. */
11
+ export interface TurnSubmitter {
12
+ submit(input: {
13
+ readonly input: string;
14
+ readonly channel: string;
15
+ readonly replyTo: string;
16
+ }): Promise<{
17
+ readonly turnId: string;
18
+ readonly sessionId: string;
19
+ }>;
20
+ }
21
+ /**
22
+ * Internal event-bus surface the channel service needs.
23
+ * `subscribe` is optional: the gateway's event bus (executor A) may or may
24
+ * not expose it yet. When present, the Telegram transport subscribes to
25
+ * {@link TURN_DONE_EVENT} to reply turn results back to the chat.
26
+ */
27
+ export interface ChannelEventBus {
28
+ publish(type: string, payload: unknown): void;
29
+ subscribe?(type: string, handler: (payload: unknown) => void): () => void;
30
+ }
31
+ /**
32
+ * Name of the event carrying a finished agent turn.
33
+ *
34
+ * PROPOSAL for the coordinator (executor B owns the agent runtime):
35
+ * the gateway should publish `agent.turn.done` on the internal event bus
36
+ * when a turn completes, with a payload shaped like {@link TurnDonePayload}.
37
+ * This mirrors the existing SSE stream event `agent.turn.done`
38
+ * (packages/gateway-protocol `events.ts`) whose `output` field already
39
+ * carries the final assistant text — the internal event adds `channel` /
40
+ * `replyTo` so the channel service can route the reply. Until executor B
41
+ * implements it, the Telegram transport correlates via its own
42
+ * `pendingReplies` map (turnId → chatId recorded at submit time).
43
+ */
44
+ export declare const TURN_DONE_EVENT = "agent.turn.done";
45
+ /** Payload of {@link TURN_DONE_EVENT} on the internal event bus. */
46
+ export interface TurnDonePayload {
47
+ readonly turnId: string;
48
+ readonly status: string;
49
+ /** Final assistant text (mirrors the SSE `agent.turn.done` `output`). */
50
+ readonly output?: string;
51
+ /** Error text when the turn failed. */
52
+ readonly error?: string;
53
+ /** Originating channel, e.g. 'telegram' (proposed addition). */
54
+ readonly channel?: string;
55
+ /** Where to send the reply, e.g. the Telegram chat id (proposed). */
56
+ readonly replyTo?: string;
57
+ }
58
+ /** Raw HTTP request passed to a platform webhook before parsing/signature checks. */
59
+ export interface ChannelWebhookRequest {
60
+ readonly method: 'GET' | 'POST';
61
+ readonly rawBody: Buffer;
62
+ readonly headers: Readonly<Record<string, string | readonly string[] | undefined>>;
63
+ readonly query: URLSearchParams;
64
+ }
65
+ export interface ChannelWebhookResponse {
66
+ readonly status: number;
67
+ readonly contentType?: string;
68
+ readonly body?: string;
69
+ }
70
+ export interface InboundTransportOptions {
71
+ readonly turnService?: TurnSubmitter;
72
+ readonly subscribeTurnDone?: (handler: (payload: TurnDonePayload) => void) => () => void;
73
+ }
74
+ /** Type guard for {@link TurnDonePayload} (event bus carries `unknown`). */
75
+ export declare function isTurnDonePayload(value: unknown): value is TurnDonePayload;
76
+ /**
77
+ * A channel transport: owns the platform connection for one channel kind.
78
+ * Lifecycle: `start()` once at gateway boot, `stop()` on shutdown.
79
+ */
80
+ export interface ChannelTransport {
81
+ readonly kind: ChannelKind;
82
+ readonly displayName: string;
83
+ start(): Promise<void>;
84
+ stop(): Promise<void>;
85
+ /** Outbound send. Throws on delivery failure (never leaks secrets). */
86
+ send(target: string, text: string): Promise<void>;
87
+ handleWebhook?(request: ChannelWebhookRequest): Promise<ChannelWebhookResponse>;
88
+ getStatus(): {
89
+ status: ChannelRuntimeStatus;
90
+ detail?: string;
91
+ };
92
+ }
93
+ /**
94
+ * Read a JSON file, returning `undefined` when missing or unparseable.
95
+ * Used for transport state persisted under the gateway data dir.
96
+ */
97
+ export declare function readJsonFile<T>(path: string): T | undefined;
98
+ /** Write a JSON file, creating parent directories as needed. */
99
+ export declare function writeJsonFile(path: string, value: unknown): void;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Shared contracts for the gateway channel transports
3
+ * (`channels/src/transports/*`).
4
+ *
5
+ * These transports are the gateway-side runtime for messaging channels.
6
+ * They use the global `fetch` and Node builtins only — no extra
7
+ * dependencies, no platform SDKs. They must NEVER import from
8
+ * `extensions/*` (boundary: apps never import extensions); the extension
9
+ * adapters (`extensions/<name>/src`) remain the plugin-facing `ChannelAdapter`
10
+ * surface.
11
+ *
12
+ * Secrets (bot tokens, API keys): read from config, sent once per request,
13
+ * never logged, never embedded in error text (SECURITY.md §5).
14
+ */
15
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
16
+ import { dirname } from 'node:path';
17
+ /**
18
+ * Name of the event carrying a finished agent turn.
19
+ *
20
+ * PROPOSAL for the coordinator (executor B owns the agent runtime):
21
+ * the gateway should publish `agent.turn.done` on the internal event bus
22
+ * when a turn completes, with a payload shaped like {@link TurnDonePayload}.
23
+ * This mirrors the existing SSE stream event `agent.turn.done`
24
+ * (packages/gateway-protocol `events.ts`) whose `output` field already
25
+ * carries the final assistant text — the internal event adds `channel` /
26
+ * `replyTo` so the channel service can route the reply. Until executor B
27
+ * implements it, the Telegram transport correlates via its own
28
+ * `pendingReplies` map (turnId → chatId recorded at submit time).
29
+ */
30
+ export const TURN_DONE_EVENT = 'agent.turn.done';
31
+ /** Type guard for {@link TurnDonePayload} (event bus carries `unknown`). */
32
+ export function isTurnDonePayload(value) {
33
+ return (typeof value === 'object' &&
34
+ value !== null &&
35
+ typeof value.turnId === 'string');
36
+ }
37
+ /**
38
+ * Read a JSON file, returning `undefined` when missing or unparseable.
39
+ * Used for transport state persisted under the gateway data dir.
40
+ */
41
+ export function readJsonFile(path) {
42
+ try {
43
+ const raw = readFileSync(path, 'utf8');
44
+ return JSON.parse(raw);
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+ /** Write a JSON file, creating parent directories as needed. */
51
+ export function writeJsonFile(path, value) {
52
+ mkdirSync(dirname(path), { recursive: true });
53
+ writeFileSync(path, JSON.stringify(value), 'utf8');
54
+ }
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular common package */
2
+ export * from './common/index.js';
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular common package */
2
+ export * from './common/index.js';
@@ -0,0 +1 @@
1
+ export { MessageDeduplicator } from '../common/dedup.js';
@@ -0,0 +1 @@
1
+ export { MessageDeduplicator } from '../common/dedup.js';
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular common package */
2
+ export * from './common/dedup.js';
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular common package */
2
+ export * from './common/dedup.js';
@@ -0,0 +1 @@
1
+ export * from './transport.js';
@@ -0,0 +1 @@
1
+ export * from './transport.js';
@@ -0,0 +1,36 @@
1
+ import type { ChannelKind } from '@boombot/protocol';
2
+ import { type ChannelLogger, type ChannelRuntimeStatus, type ChannelTransport, type ChannelWebhookRequest, type ChannelWebhookResponse, type InboundTransportOptions } from '../common/index.js';
3
+ export interface DiscordTransportConfig {
4
+ readonly enabled?: boolean;
5
+ readonly botToken?: string;
6
+ readonly publicKey?: string;
7
+ readonly guildId?: string;
8
+ readonly allowlistChatIds?: readonly string[];
9
+ }
10
+ export declare class DiscordTransport implements ChannelTransport {
11
+ readonly kind: ChannelKind;
12
+ readonly displayName = "Discord";
13
+ private readonly enabled;
14
+ private readonly botToken;
15
+ private readonly publicKey;
16
+ private readonly allowlist;
17
+ private readonly log;
18
+ private readonly turnService;
19
+ private readonly subscribeTurnDone;
20
+ private readonly pendingReplies;
21
+ private readonly deduplicator;
22
+ private unsubscribeTurnDone;
23
+ private status;
24
+ private statusDetail;
25
+ constructor(config: DiscordTransportConfig, log: ChannelLogger, inbound?: InboundTransportOptions);
26
+ start(): Promise<void>;
27
+ stop(): Promise<void>;
28
+ getStatus(): {
29
+ status: ChannelRuntimeStatus;
30
+ detail?: string;
31
+ };
32
+ handleWebhook(request: ChannelWebhookRequest): Promise<ChannelWebhookResponse>;
33
+ send(target: string, text: string): Promise<void>;
34
+ private onTurnDone;
35
+ private followUp;
36
+ }
@@ -0,0 +1,199 @@
1
+ import { createPublicKey, verify } from 'node:crypto';
2
+ import {} from '../common/index.js';
3
+ import { MessageDeduplicator } from '../common/index.js';
4
+ const DISCORD_API_BASE = 'https://discord.com/api/v10';
5
+ const MAX_TEXT_LENGTH = 2000;
6
+ const ED25519_SPKI_PREFIX = Buffer.from('302a300506032b6570032100', 'hex');
7
+ export class DiscordTransport {
8
+ kind = 'discord';
9
+ displayName = 'Discord';
10
+ enabled;
11
+ botToken;
12
+ publicKey;
13
+ allowlist;
14
+ log;
15
+ turnService;
16
+ subscribeTurnDone;
17
+ pendingReplies = new Map();
18
+ deduplicator = new MessageDeduplicator();
19
+ unsubscribeTurnDone;
20
+ status = 'disconnected';
21
+ statusDetail = 'NOT_CONFIGURED';
22
+ constructor(config, log, inbound = {}) {
23
+ this.enabled = config.enabled !== false;
24
+ this.botToken = config.botToken?.trim() || undefined;
25
+ const key = config.publicKey?.trim();
26
+ this.publicKey = key !== undefined && /^[0-9a-f]{64}$/iu.test(key)
27
+ ? Buffer.from(key, 'hex')
28
+ : undefined;
29
+ this.allowlist = new Set(config.allowlistChatIds ?? []);
30
+ this.log = log;
31
+ this.turnService = inbound.turnService;
32
+ this.subscribeTurnDone = inbound.subscribeTurnDone;
33
+ }
34
+ async start() {
35
+ if (!this.enabled) {
36
+ this.statusDetail = 'DISABLED';
37
+ return;
38
+ }
39
+ this.unsubscribeTurnDone ??= this.subscribeTurnDone?.((payload) => this.onTurnDone(payload));
40
+ if (this.botToken === undefined) {
41
+ this.statusDetail = this.publicKey === undefined ? 'NOT_CONFIGURED' : 'INBOUND_ONLY';
42
+ return;
43
+ }
44
+ try {
45
+ const response = await fetch(`${DISCORD_API_BASE}/users/@me`, {
46
+ headers: { authorization: `Bot ${this.botToken}` },
47
+ signal: AbortSignal.timeout(15_000),
48
+ });
49
+ if (!response.ok) {
50
+ const data = (await response.json());
51
+ throw new Error(data.message ?? `HTTP ${response.status}`);
52
+ }
53
+ this.status = 'connected';
54
+ this.statusDetail = undefined;
55
+ this.log.info('discord: connected');
56
+ }
57
+ catch (error) {
58
+ this.status = 'error';
59
+ this.statusDetail = error instanceof Error ? error.message : 'CONNECT_FAILED';
60
+ this.log.error('discord: credential check failed', { detail: this.statusDetail });
61
+ }
62
+ }
63
+ async stop() {
64
+ this.unsubscribeTurnDone?.();
65
+ this.unsubscribeTurnDone = undefined;
66
+ this.pendingReplies.clear();
67
+ if (this.status === 'connected') {
68
+ this.status = 'disconnected';
69
+ this.statusDetail = 'STOPPED';
70
+ }
71
+ }
72
+ getStatus() {
73
+ return this.statusDetail === undefined
74
+ ? { status: this.status }
75
+ : { status: this.status, detail: this.statusDetail };
76
+ }
77
+ async handleWebhook(request) {
78
+ if (request.method !== 'POST')
79
+ return { status: 405 };
80
+ if (!this.enabled || this.publicKey === undefined)
81
+ return { status: 503 };
82
+ const signatureValue = request.headers['x-signature-ed25519'];
83
+ const timestampValue = request.headers['x-signature-timestamp'];
84
+ const signature = typeof signatureValue === 'string' ? signatureValue : (signatureValue?.[0] ?? '');
85
+ const timestamp = typeof timestampValue === 'string' ? timestampValue : (timestampValue?.[0] ?? '');
86
+ if (!/^[0-9a-f]{128}$/iu.test(signature) || timestamp === '')
87
+ return { status: 401 };
88
+ const key = createPublicKey({
89
+ key: Buffer.concat([ED25519_SPKI_PREFIX, this.publicKey]),
90
+ format: 'der',
91
+ type: 'spki',
92
+ });
93
+ if (!verify(null, Buffer.concat([Buffer.from(timestamp), request.rawBody]), key, Buffer.from(signature, 'hex'))) {
94
+ return { status: 401 };
95
+ }
96
+ let parsed;
97
+ try {
98
+ parsed = JSON.parse(request.rawBody.toString('utf8'));
99
+ }
100
+ catch {
101
+ return { status: 400 };
102
+ }
103
+ if (!isRecord(parsed))
104
+ return { status: 400 };
105
+ const body = parsed;
106
+ if (body['type'] === 1)
107
+ return json({ type: 1 });
108
+ const channelId = typeof body['channel_id'] === 'string' ? body['channel_id'] : '';
109
+ const applicationId = typeof body['application_id'] === 'string' ? body['application_id'] : '';
110
+ const token = typeof body['token'] === 'string' ? body['token'] : '';
111
+ const interactionId = typeof body['id'] === 'string' ? body['id'] : '';
112
+ const data = body['data'];
113
+ const input = isRecord(data) ? firstStringOption(data['options']) : undefined;
114
+ if (body['type'] !== 2 || channelId === '' || applicationId === '' || token === '' ||
115
+ interactionId === '' || input === undefined || input.trim() === '')
116
+ return json({ type: 4, data: { content: 'A non-empty text option is required.', flags: 64 } });
117
+ if (!this.allowlist.has(channelId) || this.turnService === undefined) {
118
+ return json({ type: 4, data: { content: 'This channel is not allowed.', flags: 64 } });
119
+ }
120
+ if (!this.deduplicator.checkAndRecord(interactionId))
121
+ return json({ type: 5 });
122
+ try {
123
+ const result = await this.turnService.submit({ input, channel: 'discord', replyTo: channelId });
124
+ this.pendingReplies.set(result.turnId, { applicationId, token });
125
+ }
126
+ catch (error) {
127
+ this.log.error('discord: submit failed', {
128
+ error: error instanceof Error ? error.message : String(error),
129
+ });
130
+ return json({ type: 4, data: { content: 'Agent unavailable.', flags: 64 } });
131
+ }
132
+ return json({ type: 5 });
133
+ }
134
+ async send(target, text) {
135
+ if (this.botToken === undefined)
136
+ throw new Error('NOT_CONFIGURED: discord botToken missing');
137
+ const channelId = target.trim();
138
+ if (channelId === '' || text.trim() === '')
139
+ throw new Error('INVALID_ARGUMENT: target/text empty');
140
+ const points = Array.from(text);
141
+ for (let index = 0; index < points.length; index += MAX_TEXT_LENGTH) {
142
+ const response = await fetch(`${DISCORD_API_BASE}/channels/${encodeURIComponent(channelId)}/messages`, {
143
+ method: 'POST',
144
+ headers: { authorization: `Bot ${this.botToken}`, 'content-type': 'application/json' },
145
+ body: JSON.stringify({ content: points.slice(index, index + MAX_TEXT_LENGTH).join('') }),
146
+ signal: AbortSignal.timeout(15_000),
147
+ });
148
+ if (!response.ok) {
149
+ const data = await response.json().catch(() => undefined);
150
+ throw new Error(`SEND_FAILED: ${data?.message ?? `HTTP ${response.status}`}`);
151
+ }
152
+ }
153
+ }
154
+ onTurnDone(payload) {
155
+ const pending = this.pendingReplies.get(payload.turnId);
156
+ if (pending === undefined)
157
+ return;
158
+ this.pendingReplies.delete(payload.turnId);
159
+ const content = payload.status === 'completed'
160
+ ? (payload.output?.trim() || '(empty response)')
161
+ : `Turn failed${payload.error ? `: ${payload.error}` : ''}.`;
162
+ void this.followUp(pending, content).catch((error) => this.log.error('discord: reply failed', {
163
+ error: error instanceof Error ? error.message : String(error),
164
+ }));
165
+ }
166
+ async followUp(pending, text) {
167
+ const points = Array.from(text);
168
+ for (let index = 0; index < points.length; index += MAX_TEXT_LENGTH) {
169
+ const response = await fetch(`${DISCORD_API_BASE}/webhooks/${encodeURIComponent(pending.applicationId)}/${encodeURIComponent(pending.token)}`, {
170
+ method: 'POST',
171
+ headers: { 'content-type': 'application/json' },
172
+ body: JSON.stringify({ content: points.slice(index, index + MAX_TEXT_LENGTH).join('') }),
173
+ signal: AbortSignal.timeout(15_000),
174
+ });
175
+ if (!response.ok)
176
+ throw new Error(`HTTP ${response.status}`);
177
+ }
178
+ }
179
+ }
180
+ function firstStringOption(value) {
181
+ if (!Array.isArray(value))
182
+ return undefined;
183
+ for (const option of value) {
184
+ if (!isRecord(option))
185
+ continue;
186
+ if (typeof option['value'] === 'string')
187
+ return option['value'];
188
+ const nested = firstStringOption(option['options']);
189
+ if (nested !== undefined)
190
+ return nested;
191
+ }
192
+ return undefined;
193
+ }
194
+ function json(body) {
195
+ return { status: 200, contentType: 'application/json; charset=utf-8', body: JSON.stringify(body) };
196
+ }
197
+ function isRecord(value) {
198
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
199
+ }
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular discord package */
2
+ export * from './discord/index.js';
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular discord package */
2
+ export * from './discord/index.js';
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular common package */
2
+ export * from './common/handoff.js';
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular common package */
2
+ export * from './common/handoff.js';
@@ -0,0 +1 @@
1
+ export * from './transport.js';
@@ -0,0 +1 @@
1
+ export * from './transport.js';
@@ -0,0 +1,34 @@
1
+ import type { ChannelKind } from '@boombot/protocol';
2
+ import { type ChannelLogger, type ChannelRuntimeStatus, type ChannelTransport, type ChannelWebhookRequest, type ChannelWebhookResponse, type InboundTransportOptions } from '../common/index.js';
3
+ export interface MessengerTransportConfig extends InboundTransportOptions {
4
+ readonly enabled?: boolean;
5
+ readonly pageAccessToken?: string;
6
+ readonly appSecret?: string;
7
+ readonly verifyToken?: string;
8
+ readonly allowlistChatIds?: readonly string[];
9
+ }
10
+ export declare class MessengerTransport implements ChannelTransport {
11
+ readonly kind: ChannelKind;
12
+ readonly displayName = "Messenger";
13
+ private readonly enabled;
14
+ private readonly pageAccessToken;
15
+ private readonly appSecret;
16
+ private readonly verifyToken;
17
+ private readonly allowlist;
18
+ private readonly deduplicator;
19
+ private readonly pendingReplies;
20
+ private readonly log;
21
+ private status;
22
+ private statusDetail;
23
+ private readonly turnService;
24
+ private unsubscribeTurnDone;
25
+ constructor(config: MessengerTransportConfig, log: ChannelLogger);
26
+ start(): Promise<void>;
27
+ stop(): Promise<void>;
28
+ handleWebhook(request: ChannelWebhookRequest): Promise<ChannelWebhookResponse>;
29
+ send(target: string, text: string): Promise<void>;
30
+ getStatus(): {
31
+ status: ChannelRuntimeStatus;
32
+ detail?: string;
33
+ };
34
+ }