@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,75 @@
1
+ import type { ChannelKind } from '@boombot/protocol';
2
+ import { TURN_DONE_EVENT, type ChannelLogger, type ChannelRuntimeStatus, type ChannelTransport, type TurnDonePayload, type TurnSubmitter } from '../common/index.js';
3
+ export interface TelegramTransportConfig {
4
+ /** Bot token from @BotFather. Absent → transport stays NOT_CONFIGURED. */
5
+ readonly botToken?: string;
6
+ /** Pre-approved chat ids (merged with runtime-paired chats). */
7
+ readonly allowlistChatIds?: readonly string[];
8
+ }
9
+ export interface TelegramTransportOptions {
10
+ readonly config: TelegramTransportConfig;
11
+ readonly dataDir: string;
12
+ readonly log: ChannelLogger;
13
+ readonly turnService?: TurnSubmitter;
14
+ /**
15
+ * Subscribe to the internal event bus for turn completions.
16
+ * When absent, inbound turns are still submitted; replies are only sent
17
+ * once executor B publishes `agent.turn.done` and wires this hook.
18
+ */
19
+ readonly subscribeTurnDone?: (handler: (payload: TurnDonePayload) => void) => () => void;
20
+ }
21
+ /** Pairing codes look like `BOOM-123456`. */
22
+ export declare const PAIRING_CODE_PATTERN: RegExp;
23
+ export declare class TelegramTransport implements ChannelTransport {
24
+ readonly kind: ChannelKind;
25
+ readonly displayName = "Telegram";
26
+ private readonly botToken;
27
+ private readonly log;
28
+ private readonly turnService;
29
+ private readonly subscribeTurnDone;
30
+ private readonly statePath;
31
+ private allowlist;
32
+ private pairing;
33
+ private offset;
34
+ private running;
35
+ private loopPromise;
36
+ private loopAbort;
37
+ private status;
38
+ private statusDetail;
39
+ private unsubscribeTurnDone;
40
+ /** turnId → chatId, for routing `agent.turn.done` replies. */
41
+ private readonly pendingReplies;
42
+ constructor(options: TelegramTransportOptions);
43
+ start(): Promise<void>;
44
+ stop(): Promise<void>;
45
+ getStatus(): {
46
+ status: ChannelRuntimeStatus;
47
+ detail?: string;
48
+ };
49
+ send(target: string, text: string): Promise<void>;
50
+ /**
51
+ * Create a one-time pairing code (`BOOM-######`, 10-minute TTL).
52
+ * The operator sends this code to the bot from the chat to pair.
53
+ */
54
+ createPairingCode(): string;
55
+ /** Remove a chat from the allowlist. Returns true when it was present. */
56
+ unpairChat(target: string): boolean;
57
+ /** Current allowlisted chat ids (config ∪ runtime-paired). */
58
+ getAllowlist(): readonly string[];
59
+ private pollLoop;
60
+ private sleep;
61
+ private getUpdates;
62
+ private handleUpdate;
63
+ private handleTurnDone;
64
+ private consumePairingCode;
65
+ private prunePairing;
66
+ private prunePendingReplies;
67
+ /** Best-effort send: logs instead of throwing (inbound path). */
68
+ private quietSend;
69
+ private api;
70
+ private loadState;
71
+ private saveState;
72
+ }
73
+ /** Re-export for handler wiring (avoids a magic string in two places). */
74
+ export { TURN_DONE_EVENT };
75
+ export type { TurnDonePayload };
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Telegram transport for the gateway runtime (phase 2).
3
+ *
4
+ * - Outbound: REAL `POST /bot<token>/sendMessage` via global fetch
5
+ * (chunked at 4096 chars, code-point aware).
6
+ * - Inbound: long-polling `getUpdates` with a persisted offset
7
+ * (`<dataDir>/channels/telegram/state.json`), exponential backoff on
8
+ * errors, clean shutdown via `stop()`.
9
+ * - Security: fail-closed allowlist. A chat is served only when its id is
10
+ * in the allowlist (config `allowlistChatIds` ∪ chats paired at runtime).
11
+ * Messages from other chats are dropped with a warn log — never submitted
12
+ * to the agent. The bot token is never logged.
13
+ * - Pairing: `createPairingCode()` returns `BOOM-######` (10-minute TTL);
14
+ * when the bot receives the code as a message, the sender's chat is added
15
+ * to the allowlist. `unpairChat()` removes it again.
16
+ * - Turn replies: on `submit()` the transport records turnId → chatId in
17
+ * `pendingReplies`. When the internal event bus publishes
18
+ * `agent.turn.done` (see `TURN_DONE_EVENT` in common.ts — proposed for
19
+ * executor B), the final text is sent back to the chat.
20
+ *
21
+ * Boundary: gateway must never import extensions/* — this transport
22
+ * implements the Bot API directly instead of reusing the extension adapter.
23
+ */
24
+ import { randomInt } from 'node:crypto';
25
+ import { join } from 'node:path';
26
+ import { readJsonFile, TURN_DONE_EVENT, writeJsonFile, } from '../common/index.js';
27
+ const TELEGRAM_API_BASE = 'https://api.telegram.org';
28
+ const MAX_TEXT_LENGTH = 4096;
29
+ /** Long-poll window (seconds) requested from getUpdates. */
30
+ const POLL_TIMEOUT_SECONDS = 30;
31
+ /** Pairing codes live for 10 minutes. */
32
+ const PAIRING_TTL_MS = 10 * 60 * 1000;
33
+ /** Cap on stored pending pairing codes. */
34
+ const MAX_PAIRING_CODES = 20;
35
+ function isApiResponse(value) {
36
+ return (typeof value === 'object' &&
37
+ value !== null &&
38
+ typeof value.ok === 'boolean');
39
+ }
40
+ /** Pairing codes look like `BOOM-123456`. */
41
+ export const PAIRING_CODE_PATTERN = /^BOOM-\d{6}$/;
42
+ function newPairingCode() {
43
+ return `BOOM-${String(randomInt(0, 1_000_000)).padStart(6, '0')}`;
44
+ }
45
+ function chunkText(text) {
46
+ const codePoints = Array.from(text);
47
+ const chunks = [];
48
+ for (let i = 0; i < codePoints.length; i += MAX_TEXT_LENGTH) {
49
+ chunks.push(codePoints.slice(i, i + MAX_TEXT_LENGTH).join(''));
50
+ }
51
+ return chunks;
52
+ }
53
+ export class TelegramTransport {
54
+ kind = 'telegram';
55
+ displayName = 'Telegram';
56
+ botToken;
57
+ log;
58
+ turnService;
59
+ subscribeTurnDone;
60
+ statePath;
61
+ allowlist = new Set();
62
+ pairing = [];
63
+ offset;
64
+ running = false;
65
+ loopPromise = null;
66
+ loopAbort = null;
67
+ status = 'disconnected';
68
+ statusDetail = 'NOT_CONFIGURED';
69
+ unsubscribeTurnDone;
70
+ /** turnId → chatId, for routing `agent.turn.done` replies. */
71
+ pendingReplies = new Map();
72
+ constructor(options) {
73
+ const token = options.config.botToken?.trim();
74
+ this.botToken = token === '' ? undefined : token;
75
+ this.log = options.log;
76
+ this.turnService = options.turnService;
77
+ this.subscribeTurnDone = options.subscribeTurnDone;
78
+ this.statePath = join(options.dataDir, 'channels', 'telegram', 'state.json');
79
+ for (const chatId of options.config.allowlistChatIds ?? []) {
80
+ this.allowlist.add(chatId);
81
+ }
82
+ }
83
+ // -- lifecycle -----------------------------------------------------------
84
+ async start() {
85
+ if (this.botToken === undefined) {
86
+ this.status = 'disconnected';
87
+ this.statusDetail = 'NOT_CONFIGURED';
88
+ this.log.info('telegram: botToken not configured — transport not running');
89
+ return;
90
+ }
91
+ this.loadState();
92
+ try {
93
+ const me = await this.api('getMe', {});
94
+ if (!me.ok) {
95
+ throw new Error(me.description ?? 'getMe failed');
96
+ }
97
+ }
98
+ catch (err) {
99
+ this.status = 'error';
100
+ this.statusDetail = err instanceof Error ? err.message : 'GETME_FAILED';
101
+ this.log.error('telegram: botToken check failed', {
102
+ detail: this.statusDetail,
103
+ });
104
+ return;
105
+ }
106
+ if (this.subscribeTurnDone !== undefined) {
107
+ this.unsubscribeTurnDone = this.subscribeTurnDone((payload) => {
108
+ this.handleTurnDone(payload);
109
+ });
110
+ }
111
+ this.status = 'connected';
112
+ this.statusDetail = undefined;
113
+ this.running = true;
114
+ this.loopAbort = new AbortController();
115
+ this.loopPromise = this.pollLoop();
116
+ this.log.info('telegram: long-polling started');
117
+ }
118
+ async stop() {
119
+ this.running = false;
120
+ this.loopAbort?.abort();
121
+ if (this.loopPromise !== null) {
122
+ await this.loopPromise;
123
+ this.loopPromise = null;
124
+ }
125
+ this.unsubscribeTurnDone?.();
126
+ this.unsubscribeTurnDone = undefined;
127
+ this.saveState();
128
+ if (this.status === 'connected') {
129
+ this.status = 'disconnected';
130
+ this.statusDetail = 'STOPPED';
131
+ }
132
+ this.log.info('telegram: stopped');
133
+ }
134
+ getStatus() {
135
+ this.prunePairing();
136
+ if (this.status === 'connected' && this.pairing.length > 0) {
137
+ return { status: 'pending', detail: 'PAIRING' };
138
+ }
139
+ return this.statusDetail === undefined
140
+ ? { status: this.status }
141
+ : { status: this.status, detail: this.statusDetail };
142
+ }
143
+ // -- outbound ------------------------------------------------------------
144
+ async send(target, text) {
145
+ if (this.botToken === undefined) {
146
+ throw new Error('NOT_CONFIGURED: telegram has no botToken');
147
+ }
148
+ if (target.trim() === '' || text.trim() === '') {
149
+ throw new Error('INVALID_ARGUMENT: target/text must not be empty');
150
+ }
151
+ for (const chunk of chunkText(text)) {
152
+ const res = await this.api('sendMessage', {
153
+ chat_id: target.trim(),
154
+ text: chunk,
155
+ });
156
+ if (!res.ok) {
157
+ throw new Error(`SEND_FAILED: ${res.description ?? 'unknown error'}`);
158
+ }
159
+ }
160
+ }
161
+ // -- pairing -------------------------------------------------------------
162
+ /**
163
+ * Create a one-time pairing code (`BOOM-######`, 10-minute TTL).
164
+ * The operator sends this code to the bot from the chat to pair.
165
+ */
166
+ createPairingCode() {
167
+ this.prunePairing();
168
+ const code = newPairingCode();
169
+ this.pairing.push({ code, createdAt: Date.now() });
170
+ if (this.pairing.length > MAX_PAIRING_CODES) {
171
+ this.pairing.splice(0, this.pairing.length - MAX_PAIRING_CODES);
172
+ }
173
+ this.saveState();
174
+ return code;
175
+ }
176
+ /** Remove a chat from the allowlist. Returns true when it was present. */
177
+ unpairChat(target) {
178
+ const removed = this.allowlist.delete(target);
179
+ if (removed) {
180
+ this.saveState();
181
+ this.log.info('telegram: unpaired chat', { chatId: target });
182
+ }
183
+ return removed;
184
+ }
185
+ /** Current allowlisted chat ids (config ∪ runtime-paired). */
186
+ getAllowlist() {
187
+ return [...this.allowlist];
188
+ }
189
+ // -- inbound polling -----------------------------------------------------
190
+ async pollLoop() {
191
+ let consecutiveErrors = 0;
192
+ while (this.running) {
193
+ try {
194
+ const updates = await this.getUpdates();
195
+ consecutiveErrors = 0;
196
+ for (const update of updates) {
197
+ await this.handleUpdate(update);
198
+ }
199
+ }
200
+ catch (err) {
201
+ if (!this.running)
202
+ break;
203
+ consecutiveErrors += 1;
204
+ const delayMs = Math.min(1000 * 2 ** (consecutiveErrors - 1), 30_000);
205
+ this.status = 'error';
206
+ this.statusDetail =
207
+ err instanceof Error ? err.message : 'POLL_FAILED';
208
+ this.log.warn('telegram: poll error, retrying later', {
209
+ delayMs,
210
+ attempt: consecutiveErrors,
211
+ });
212
+ await this.sleep(delayMs);
213
+ }
214
+ }
215
+ }
216
+ sleep(ms) {
217
+ return new Promise((resolve) => {
218
+ const timer = setTimeout(resolve, ms);
219
+ // Wake early on stop.
220
+ this.loopAbort?.signal.addEventListener('abort', () => {
221
+ clearTimeout(timer);
222
+ resolve();
223
+ });
224
+ });
225
+ }
226
+ async getUpdates() {
227
+ const params = new URLSearchParams({
228
+ timeout: String(POLL_TIMEOUT_SECONDS),
229
+ allowed_updates: JSON.stringify(['message']),
230
+ });
231
+ if (this.offset !== undefined) {
232
+ params.set('offset', String(this.offset));
233
+ }
234
+ const res = await this.api('getUpdates', {}, params, 40_000);
235
+ if (!res.ok) {
236
+ throw new Error(`GETUPDATES_FAILED: ${res.description ?? 'unknown'}`);
237
+ }
238
+ const list = Array.isArray(res.result) ? res.result : [];
239
+ for (const update of list) {
240
+ this.offset = update.update_id + 1;
241
+ }
242
+ if (list.length > 0) {
243
+ this.saveState();
244
+ }
245
+ return list;
246
+ }
247
+ async handleUpdate(update) {
248
+ const message = update.message ?? update.edited_message;
249
+ const text = message?.text?.trim();
250
+ if (message === undefined || text === undefined || text === '') {
251
+ return;
252
+ }
253
+ const chatId = String(message.chat.id);
254
+ // Pairing code from the chat owner.
255
+ if (PAIRING_CODE_PATTERN.test(text.toUpperCase())) {
256
+ const ok = this.consumePairingCode(text.toUpperCase(), chatId);
257
+ await this.quietSend(chatId, ok
258
+ ? 'This chat is now paired with BoomBot. You can chat with the agent here from now on.'
259
+ : 'Pairing code is invalid or expired. Create a new code with the channel.pair command.');
260
+ return;
261
+ }
262
+ // Fail-closed allowlist: unknown chats are dropped, never submitted.
263
+ if (!this.allowlist.has(chatId)) {
264
+ this.log.warn('telegram: ignoring message from non-allowlisted chat', {
265
+ chatId,
266
+ });
267
+ return;
268
+ }
269
+ if (this.turnService === undefined) {
270
+ await this.quietSend(chatId, 'Gateway is not ready to handle requests (turnService is not configured).');
271
+ return;
272
+ }
273
+ try {
274
+ const { turnId } = await this.turnService.submit({
275
+ input: message.text ?? text,
276
+ channel: 'telegram',
277
+ replyTo: chatId,
278
+ });
279
+ this.pendingReplies.set(turnId, { chatId, createdAt: Date.now() });
280
+ this.prunePendingReplies();
281
+ }
282
+ catch (err) {
283
+ this.log.error('telegram: turn submit failed', {
284
+ chatId,
285
+ error: err instanceof Error ? err.message : String(err),
286
+ });
287
+ await this.quietSend(chatId, 'Could not send the request to the agent. Please try again later.');
288
+ }
289
+ }
290
+ handleTurnDone = (payload) => {
291
+ const pending = this.pendingReplies.get(payload.turnId);
292
+ const chatId = pending?.chatId ??
293
+ (payload.channel === 'telegram' ? payload.replyTo : undefined);
294
+ if (chatId === undefined) {
295
+ return;
296
+ }
297
+ this.pendingReplies.delete(payload.turnId);
298
+ const text = payload.status === 'completed'
299
+ ? payload.output?.trim() !== '' && payload.output !== undefined
300
+ ? payload.output
301
+ : '(turn completed, no content)'
302
+ : `Turn failed${payload.error !== undefined && payload.error !== '' ? `: ${payload.error}` : ''}.`;
303
+ void this.quietSend(chatId, text);
304
+ };
305
+ consumePairingCode(code, chatId) {
306
+ this.prunePairing();
307
+ const index = this.pairing.findIndex((entry) => entry.code === code);
308
+ if (index === -1) {
309
+ return false;
310
+ }
311
+ this.pairing.splice(index, 1);
312
+ this.allowlist.add(chatId);
313
+ this.saveState();
314
+ this.log.info('telegram: paired new chat', { chatId });
315
+ return true;
316
+ }
317
+ prunePairing() {
318
+ const now = Date.now();
319
+ this.pairing = this.pairing.filter((entry) => now - entry.createdAt < PAIRING_TTL_MS);
320
+ }
321
+ prunePendingReplies() {
322
+ const now = Date.now();
323
+ for (const [turnId, entry] of this.pendingReplies) {
324
+ if (now - entry.createdAt > 60 * 60 * 1000) {
325
+ this.pendingReplies.delete(turnId);
326
+ }
327
+ }
328
+ }
329
+ /** Best-effort send: logs instead of throwing (inbound path). */
330
+ async quietSend(chatId, text) {
331
+ try {
332
+ await this.send(chatId, text);
333
+ }
334
+ catch (err) {
335
+ this.log.error('telegram: send message failed', {
336
+ chatId,
337
+ error: err instanceof Error ? err.message : String(err),
338
+ });
339
+ }
340
+ }
341
+ // -- Bot API ---------------------------------------------------------------
342
+ async api(method, body, params, timeoutMs = 15_000) {
343
+ if (this.botToken === undefined) {
344
+ throw new Error('NOT_CONFIGURED');
345
+ }
346
+ // NOTE: the token travels in the URL path (Bot API convention).
347
+ // Never log the URL, and never include it in thrown errors.
348
+ const url = `${TELEGRAM_API_BASE}/bot${this.botToken}/${method}` +
349
+ (params !== undefined ? `?${params.toString()}` : '');
350
+ const isGet = method === 'getUpdates' || method === 'getMe';
351
+ const response = await fetch(url, {
352
+ method: isGet ? 'GET' : 'POST',
353
+ headers: isGet ? undefined : { 'content-type': 'application/json' },
354
+ body: isGet ? undefined : JSON.stringify(body),
355
+ signal: AbortSignal.timeout(timeoutMs),
356
+ });
357
+ const data = await response.json();
358
+ if (!isApiResponse(data)) {
359
+ throw new Error(`Telegram API returned an unrecognized body (${method}).`);
360
+ }
361
+ return data;
362
+ }
363
+ // -- persistence -----------------------------------------------------------
364
+ loadState() {
365
+ const state = readJsonFile(this.statePath);
366
+ if (state === undefined) {
367
+ return;
368
+ }
369
+ if (typeof state.offset === 'number') {
370
+ this.offset = state.offset;
371
+ }
372
+ for (const chatId of state.allowlist) {
373
+ this.allowlist.add(chatId);
374
+ }
375
+ this.pairing = Array.isArray(state.pairing) ? state.pairing : [];
376
+ this.prunePairing();
377
+ }
378
+ saveState() {
379
+ const state = {
380
+ offset: this.offset,
381
+ allowlist: [...this.allowlist],
382
+ pairing: this.pairing,
383
+ };
384
+ try {
385
+ writeJsonFile(this.statePath, state);
386
+ }
387
+ catch (err) {
388
+ this.log.error('telegram: save state failed', {
389
+ error: err instanceof Error ? err.message : String(err),
390
+ });
391
+ }
392
+ }
393
+ }
394
+ /** Re-export for handler wiring (avoids a magic string in two places). */
395
+ export { TURN_DONE_EVENT };
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular telegram package */
2
+ export * from './telegram/index.js';
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular telegram package */
2
+ export * from './telegram/index.js';
@@ -0,0 +1 @@
1
+ export * from './transport.js';
@@ -0,0 +1 @@
1
+ export * from './transport.js';
@@ -0,0 +1,27 @@
1
+ import type { ChannelKind } from '@boombot/protocol';
2
+ import type { ChannelLogger, ChannelRuntimeStatus, ChannelTransport } from '../common/index.js';
3
+ export interface TikTokTransportConfig {
4
+ readonly enabled?: boolean;
5
+ readonly appId?: string;
6
+ readonly clientSecret?: string;
7
+ readonly accessToken?: string;
8
+ }
9
+ export declare class TikTokTransport implements ChannelTransport {
10
+ readonly kind: ChannelKind;
11
+ readonly displayName = "TikTok";
12
+ private readonly enabled;
13
+ private readonly appId;
14
+ private readonly clientSecret;
15
+ private readonly accessToken;
16
+ private readonly log;
17
+ private status;
18
+ private statusDetail;
19
+ constructor(config: TikTokTransportConfig, log: ChannelLogger);
20
+ start(): Promise<void>;
21
+ stop(): Promise<void>;
22
+ send(target: string, text: string): Promise<void>;
23
+ getStatus(): {
24
+ status: ChannelRuntimeStatus;
25
+ detail?: string;
26
+ };
27
+ }
@@ -0,0 +1,97 @@
1
+ const TIKTOK_API_BASE = 'https://business-api.tiktok.com/open_api/v1.3';
2
+ export class TikTokTransport {
3
+ kind = 'tiktok';
4
+ displayName = 'TikTok';
5
+ enabled;
6
+ appId;
7
+ clientSecret;
8
+ accessToken;
9
+ log;
10
+ status = 'disconnected';
11
+ statusDetail = 'NOT_CONFIGURED';
12
+ constructor(config, log) {
13
+ this.enabled = config.enabled !== false;
14
+ this.appId = config.appId?.trim() || undefined;
15
+ this.clientSecret = config.clientSecret?.trim() || undefined;
16
+ this.accessToken = config.accessToken?.trim() || undefined;
17
+ this.log = log;
18
+ }
19
+ async start() {
20
+ if (!this.enabled) {
21
+ this.statusDetail = 'DISABLED';
22
+ return;
23
+ }
24
+ if (this.appId === undefined ||
25
+ this.clientSecret === undefined ||
26
+ this.accessToken === undefined) {
27
+ this.statusDetail = 'NOT_CONFIGURED';
28
+ this.log.info('tiktok: missing appId/clientSecret/accessToken');
29
+ return;
30
+ }
31
+ try {
32
+ const query = new URLSearchParams({
33
+ app_id: this.appId,
34
+ secret: this.clientSecret,
35
+ });
36
+ const response = await fetch(`${TIKTOK_API_BASE}/oauth2/advertiser/get/?${query}`, {
37
+ headers: { 'Access-Token': this.accessToken },
38
+ signal: AbortSignal.timeout(15_000),
39
+ });
40
+ const data = (await response.json());
41
+ if (!response.ok || data.code !== 0) {
42
+ throw new Error(data.code === undefined ? `HTTP ${response.status}` : `API ${data.code}`);
43
+ }
44
+ this.status = 'connected';
45
+ this.statusDetail = undefined;
46
+ this.log.info('tiktok: connected (outbound only)');
47
+ }
48
+ catch (error) {
49
+ this.status = 'error';
50
+ this.statusDetail =
51
+ error instanceof Error ? error.message : 'CONNECT_FAILED';
52
+ this.log.error('tiktok: credential check failed', {
53
+ detail: this.statusDetail,
54
+ });
55
+ }
56
+ }
57
+ async stop() {
58
+ if (this.status === 'connected') {
59
+ this.status = 'disconnected';
60
+ this.statusDetail = 'STOPPED';
61
+ }
62
+ this.log.info('tiktok: stopped');
63
+ }
64
+ async send(target, text) {
65
+ if (!this.enabled)
66
+ throw new Error('DISABLED: tiktok is disabled');
67
+ if (this.accessToken === undefined) {
68
+ throw new Error('NOT_CONFIGURED: tiktok missing accessToken');
69
+ }
70
+ const conversationId = target.trim();
71
+ if (conversationId === '' || text.trim() === '') {
72
+ throw new Error('INVALID_ARGUMENT: target/text must not be empty');
73
+ }
74
+ const response = await fetch(`${TIKTOK_API_BASE}/business/message/send/`, {
75
+ method: 'POST',
76
+ headers: {
77
+ 'Access-Token': this.accessToken,
78
+ 'content-type': 'application/json',
79
+ },
80
+ body: JSON.stringify({
81
+ conversation_id: conversationId,
82
+ message_type: 'TEXT',
83
+ content: { text },
84
+ }),
85
+ signal: AbortSignal.timeout(15_000),
86
+ });
87
+ const data = (await response.json().catch(() => undefined));
88
+ if (!response.ok || data?.code !== 0) {
89
+ throw new Error(`SEND_FAILED: ${data?.code === undefined ? `HTTP ${response.status}` : `API ${data.code}`}`);
90
+ }
91
+ }
92
+ getStatus() {
93
+ return this.statusDetail === undefined
94
+ ? { status: this.status }
95
+ : { status: this.status, detail: this.statusDetail };
96
+ }
97
+ }
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular tiktok package */
2
+ export * from './tiktok/index.js';
@@ -0,0 +1,2 @@
1
+ /** Re-export from modular tiktok package */
2
+ export * from './tiktok/index.js';
@@ -0,0 +1 @@
1
+ export * from './transport.js';
@@ -0,0 +1 @@
1
+ export * from './transport.js';
@@ -0,0 +1,38 @@
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 WhatsAppTransportConfig {
4
+ readonly enabled?: boolean;
5
+ readonly phoneNumberId?: string;
6
+ readonly accessToken?: string;
7
+ readonly verifyToken?: string;
8
+ readonly appSecret?: string;
9
+ readonly allowlistChatIds?: readonly string[];
10
+ }
11
+ export declare class WhatsAppTransport implements ChannelTransport {
12
+ readonly kind: ChannelKind;
13
+ readonly displayName = "WhatsApp";
14
+ private readonly enabled;
15
+ private readonly phoneNumberId;
16
+ private readonly accessToken;
17
+ private readonly verifyToken;
18
+ private readonly appSecret;
19
+ private readonly allowlist;
20
+ private readonly log;
21
+ private readonly turnService;
22
+ private readonly subscribeTurnDone;
23
+ private readonly pendingReplies;
24
+ private readonly deduplicator;
25
+ private unsubscribeTurnDone;
26
+ private status;
27
+ private statusDetail;
28
+ constructor(config: WhatsAppTransportConfig, log: ChannelLogger, inbound?: InboundTransportOptions);
29
+ start(): Promise<void>;
30
+ stop(): Promise<void>;
31
+ getStatus(): {
32
+ status: ChannelRuntimeStatus;
33
+ detail?: string;
34
+ };
35
+ handleWebhook(request: ChannelWebhookRequest): Promise<ChannelWebhookResponse>;
36
+ send(target: string, text: string): Promise<void>;
37
+ private onTurnDone;
38
+ }