@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,437 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Defaults
3
+ // ---------------------------------------------------------------------------
4
+ const DEFAULT_DEEP_KEYWORDS = [
5
+ 'so sánh',
6
+ 'phân tích',
7
+ 'đánh giá',
8
+ 'tại sao',
9
+ 'vì sao',
10
+ 'ưu nhược',
11
+ 'lựa chọn',
12
+ 'nên chọn',
13
+ 'chi tiết',
14
+ 'kỹ lưỡng',
15
+ 'toàn diện',
16
+ 'trade-off',
17
+ 'tradeoff',
18
+ 'compare',
19
+ 'analyze',
20
+ 'analyse',
21
+ 'analysis',
22
+ 'evaluate',
23
+ 'evaluation',
24
+ 'why',
25
+ 'explain',
26
+ 'pros and cons',
27
+ 'in depth',
28
+ 'deep dive',
29
+ ];
30
+ const DEFAULT_FAST_KEYWORDS = [
31
+ 'trả lời nhanh',
32
+ 'nhanh gọn',
33
+ 'gọn lẹ',
34
+ 'tóm tắt',
35
+ 'tóm lại',
36
+ 'quick',
37
+ 'brief',
38
+ 'short',
39
+ 'concise',
40
+ 'tl;dr',
41
+ 'tldr',
42
+ 'nhanh',
43
+ ];
44
+ const DEFAULT_SENSITIVE_ARG_KEYWORDS = [
45
+ 'password',
46
+ 'passwd',
47
+ 'secret',
48
+ 'api_key',
49
+ 'apikey',
50
+ 'access_token',
51
+ 'private_key',
52
+ 'privatekey',
53
+ 'credential',
54
+ 'auth_token',
55
+ 'mật khẩu',
56
+ ];
57
+ /** Default risk by name prefix; exact names go in `toolRisk`. Unknown → `network`. */
58
+ const DEFAULT_RISK_PREFIXES = [
59
+ ['research.', 'network'],
60
+ ['session.', 'safe'],
61
+ ['schedule.', 'filesystem'],
62
+ ['provider.', 'filesystem'],
63
+ ['file.', 'filesystem'],
64
+ ['channel.', 'network'],
65
+ ];
66
+ export function defaultRoutingConfig() {
67
+ return {
68
+ enabled: false,
69
+ defaultMode: 'fast',
70
+ overrides: {},
71
+ toolRisk: { 'memory.search': 'safe' },
72
+ deepKeywords: DEFAULT_DEEP_KEYWORDS,
73
+ fastKeywords: DEFAULT_FAST_KEYWORDS,
74
+ sensitiveArgKeywords: DEFAULT_SENSITIVE_ARG_KEYWORDS,
75
+ complexityQuestionThreshold: 2,
76
+ complexityLengthThreshold: 800,
77
+ llmJudge: { enabled: false },
78
+ };
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Regex compilation (once)
82
+ // ---------------------------------------------------------------------------
83
+ function escapeRegExp(s) {
84
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
85
+ }
86
+ /** Unicode word-boundary, case-insensitive alternation. Never matches when empty. */
87
+ function compileKeywordRegex(keywords) {
88
+ if (keywords.length === 0) {
89
+ return /(?!)/u;
90
+ }
91
+ const alt = keywords.map(escapeRegExp).join('|');
92
+ // NOTE: no `g` flag — `RegExp.test()` with `g` is stateful via `lastIndex`
93
+ // and would alternate true/false across calls sharing one compiled config.
94
+ return new RegExp(`(?<![\\p{L}\\p{N}_])(?:${alt})(?![\\p{L}\\p{N}_])`, 'iu');
95
+ }
96
+ export function compileRoutingConfig(input = {}) {
97
+ const base = defaultRoutingConfig();
98
+ return Object.freeze({
99
+ enabled: input.enabled ?? base.enabled,
100
+ defaultMode: input.defaultMode ?? base.defaultMode,
101
+ overrides: Object.freeze({ ...(input.overrides ?? base.overrides) }),
102
+ exactRisk: Object.freeze({ ...(input.toolRisk ?? base.toolRisk) }),
103
+ riskPrefixes: DEFAULT_RISK_PREFIXES,
104
+ fastRe: compileKeywordRegex(input.fastKeywords ?? base.fastKeywords),
105
+ deepRe: compileKeywordRegex(input.deepKeywords ?? base.deepKeywords),
106
+ sensitiveRe: compileKeywordRegex(input.sensitiveArgKeywords ?? base.sensitiveArgKeywords),
107
+ complexityQuestionThreshold: input.complexityQuestionThreshold ?? base.complexityQuestionThreshold,
108
+ complexityLengthThreshold: input.complexityLengthThreshold ?? base.complexityLengthThreshold,
109
+ llmJudgeEnabled: input.llmJudge?.enabled ?? base.llmJudge.enabled,
110
+ });
111
+ }
112
+ // ---------------------------------------------------------------------------
113
+ // classifyTurn — pure, sync, no I/O
114
+ // ---------------------------------------------------------------------------
115
+ const RISK_RANK = {
116
+ safe: 0,
117
+ network: 1,
118
+ filesystem: 2,
119
+ destructive: 3,
120
+ };
121
+ /** Resolve a tool name → risk: exact match, then `prefix.` match, else `network`. */
122
+ export function resolveToolRisk(name, config) {
123
+ const exact = config.exactRisk[name];
124
+ if (exact !== undefined) {
125
+ return exact;
126
+ }
127
+ for (const [prefix, risk] of config.riskPrefixes) {
128
+ if (name.startsWith(prefix)) {
129
+ return risk;
130
+ }
131
+ }
132
+ return 'network';
133
+ }
134
+ const SIG_USER_KEYWORD = 'user-keyword';
135
+ const SIG_OVERRIDE = 'override';
136
+ const SIG_RISK = 'risk';
137
+ const SIG_COMPLEXITY = 'complexity';
138
+ const SIG_HISTORY = 'history';
139
+ const SIG_DEFAULT = 'default';
140
+ const R_USER_KEYWORD_FAST = 'user-keyword:fast';
141
+ const R_USER_KEYWORD_DEEP = 'user-keyword:deep';
142
+ const R_RISK_DESTRUCTIVE = 'risk:destructive';
143
+ const R_RISK_MULTI = 'risk:multi-network';
144
+ const R_COMPLEXITY_QUESTIONS = 'complexity:questions';
145
+ const R_COMPLEXITY_DEEP_KEYWORD = 'complexity:deep-keyword';
146
+ const R_COMPLEXITY_LENGTH = 'complexity:length';
147
+ const R_HISTORY_CORRECTIONS = 'history:corrections';
148
+ const V_FAST_KEYWORD = { mode: 'fast', reason: R_USER_KEYWORD_FAST };
149
+ const V_DEEP_KEYWORD = { mode: 'deep', reason: R_USER_KEYWORD_DEEP };
150
+ const V_DEEP_DESTRUCTIVE = { mode: 'deep', reason: R_RISK_DESTRUCTIVE };
151
+ const V_DEEP_RISK_MULTI = { mode: 'deep', reason: R_RISK_MULTI };
152
+ const V_DEEP_QUESTIONS = { mode: 'deep', reason: R_COMPLEXITY_QUESTIONS };
153
+ const V_DEEP_COMPLEXITY_KEYWORD = { mode: 'deep', reason: R_COMPLEXITY_DEEP_KEYWORD };
154
+ const V_DEEP_LENGTH = { mode: 'deep', reason: R_COMPLEXITY_LENGTH };
155
+ const V_DEEP_CORRECTIONS = { mode: 'deep', reason: R_HISTORY_CORRECTIONS };
156
+ function countChar(text, code) {
157
+ let n = 0;
158
+ for (let i = 0; i < text.length; i++) {
159
+ if (text.charCodeAt(i) === code) {
160
+ n++;
161
+ }
162
+ }
163
+ return n;
164
+ }
165
+ function buildWork(input, config) {
166
+ const text = input.text;
167
+ let overrideDeep = false;
168
+ let overrideFast = false;
169
+ let overrideDeepName;
170
+ let overrideFastName;
171
+ let maxRiskRank = 0;
172
+ let riskyCount = 0;
173
+ for (const name of input.toolNames) {
174
+ const override = config.overrides[name];
175
+ if (override === 'deep') {
176
+ overrideDeep = true;
177
+ overrideDeepName ??= name;
178
+ }
179
+ else if (override === 'fast') {
180
+ overrideFast = true;
181
+ overrideFastName ??= name;
182
+ }
183
+ const rank = RISK_RANK[resolveToolRisk(name, config)];
184
+ if (rank > maxRiskRank) {
185
+ maxRiskRank = rank;
186
+ }
187
+ if (rank === RISK_RANK.network || rank === RISK_RANK.filesystem) {
188
+ riskyCount++;
189
+ }
190
+ }
191
+ return {
192
+ text,
193
+ recentCorrections: input.recentCorrections,
194
+ config,
195
+ fastHit: config.fastRe.test(text),
196
+ deepHit: config.deepRe.test(text),
197
+ overrideMode: overrideDeep ? 'deep' : overrideFast ? 'fast' : undefined,
198
+ overrideName: overrideDeepName ?? overrideFastName,
199
+ maxRiskRank,
200
+ riskyCount,
201
+ questionCount: countChar(text, 63), // '?'
202
+ };
203
+ }
204
+ /** Priority-ordered signal table: the first check that returns a verdict wins. */
205
+ const SIGNAL_CHECKS = [
206
+ {
207
+ name: SIG_USER_KEYWORD,
208
+ run: (w) => (w.deepHit ? V_DEEP_KEYWORD : w.fastHit ? V_FAST_KEYWORD : undefined),
209
+ },
210
+ {
211
+ name: SIG_OVERRIDE,
212
+ run: (w) => w.overrideMode === undefined
213
+ ? undefined
214
+ : { mode: w.overrideMode, reason: `override:${w.overrideName ?? 'unknown'}` },
215
+ },
216
+ {
217
+ name: SIG_RISK,
218
+ run: (w) => w.maxRiskRank >= RISK_RANK.destructive
219
+ ? V_DEEP_DESTRUCTIVE
220
+ : w.riskyCount >= 2
221
+ ? V_DEEP_RISK_MULTI
222
+ : undefined,
223
+ },
224
+ {
225
+ name: SIG_COMPLEXITY,
226
+ run: (w) => w.questionCount >= w.config.complexityQuestionThreshold
227
+ ? V_DEEP_QUESTIONS
228
+ : w.deepHit
229
+ ? V_DEEP_COMPLEXITY_KEYWORD
230
+ : w.text.length > w.config.complexityLengthThreshold
231
+ ? V_DEEP_LENGTH
232
+ : undefined,
233
+ },
234
+ {
235
+ name: SIG_HISTORY,
236
+ run: (w) => (w.recentCorrections >= 1 ? V_DEEP_CORRECTIONS : undefined),
237
+ },
238
+ {
239
+ name: SIG_DEFAULT,
240
+ run: (w) => ({ mode: w.config.defaultMode, reason: `default:${w.config.defaultMode}` }),
241
+ },
242
+ ];
243
+ /**
244
+ * Pure, synchronous turn classification. Evaluates signals in priority
245
+ * order and stops at the first that decides; `signals` lists the names
246
+ * evaluated, up to and including the deciding one.
247
+ */
248
+ export function classifyTurn(input, config) {
249
+ const work = buildWork(input, config);
250
+ const signals = [];
251
+ for (const check of SIGNAL_CHECKS) {
252
+ signals.push(check.name);
253
+ const verdict = check.run(work);
254
+ if (verdict !== undefined) {
255
+ return { mode: verdict.mode, reason: verdict.reason, signals: Object.freeze(signals) };
256
+ }
257
+ }
258
+ // Unreachable: the `default` signal always decides; kept for the compiler.
259
+ return {
260
+ mode: config.defaultMode,
261
+ reason: `default:${config.defaultMode}`,
262
+ signals: Object.freeze(signals),
263
+ };
264
+ }
265
+ // ---------------------------------------------------------------------------
266
+ // classifyToolCalls — fast → deep upgrade per tool round
267
+ // ---------------------------------------------------------------------------
268
+ const R_TOOLCALL_DESTRUCTIVE = 'toolcall:destructive';
269
+ const R_TOOLCALL_MULTI = 'toolcall:multi-network-fs';
270
+ const R_TOOLCALL_SENSITIVE = 'toolcall:sensitive-args';
271
+ /**
272
+ * Returns a `deep` upgrade decision when this round's calls warrant it,
273
+ * else `undefined`. Args are only serialized (once per call) for tools that
274
+ * are not `safe`; circular args are skipped, never crash.
275
+ */
276
+ export function classifyToolCalls(calls, config) {
277
+ let riskyCount = 0;
278
+ const nonSafe = [];
279
+ for (const call of calls) {
280
+ const risk = resolveToolRisk(call.name, config);
281
+ if (risk === 'destructive') {
282
+ return { mode: 'deep', reason: R_TOOLCALL_DESTRUCTIVE, signals: ['toolcall-risk'] };
283
+ }
284
+ if (risk === 'network' || risk === 'filesystem') {
285
+ riskyCount++;
286
+ }
287
+ if (risk !== 'safe') {
288
+ nonSafe.push(call);
289
+ }
290
+ }
291
+ if (riskyCount >= 2) {
292
+ return { mode: 'deep', reason: R_TOOLCALL_MULTI, signals: ['toolcall-risk'] };
293
+ }
294
+ // Only serialize args when the earlier signals didn't already decide.
295
+ for (const call of nonSafe) {
296
+ let json;
297
+ try {
298
+ json = JSON.stringify(call.args) ?? '';
299
+ }
300
+ catch {
301
+ continue;
302
+ }
303
+ if (config.sensitiveRe.test(json)) {
304
+ return { mode: 'deep', reason: R_TOOLCALL_SENSITIVE, signals: ['toolcall-args'] };
305
+ }
306
+ }
307
+ return undefined;
308
+ }
309
+ const REASON_GUARD_UNSUPPORTED = 'guard:unsupported-claims';
310
+ const UNKNOWN_RUN_ID = 'unknown';
311
+ function lastUserText(messages) {
312
+ for (let i = messages.length - 1; i >= 0; i--) {
313
+ const message = messages[i];
314
+ if (message?.role === 'user') {
315
+ return message.content;
316
+ }
317
+ }
318
+ return '';
319
+ }
320
+ /**
321
+ * Fast → deep upgrade when a model round's tool calls look risky.
322
+ *
323
+ * NOTE: the calls are read from the `modelRound` phase RESULT, never from
324
+ * `ctx.messages` — the turn pipeline keeps the working message list in a
325
+ * local variable and never writes the in-turn assistant messages back to
326
+ * the context, so reading `ctx.messages` here silently disabled the
327
+ * upgrade (it could only ever see the turn's input history).
328
+ */
329
+ function upgradeOnRiskyToolCalls(states, config, ctx, result, emit) {
330
+ const state = states.get(ctx);
331
+ if (state === undefined || state.mode !== 'fast') {
332
+ return;
333
+ }
334
+ const toolCalls = result
335
+ ?.toolCalls;
336
+ if (toolCalls === undefined || toolCalls.length === 0) {
337
+ return;
338
+ }
339
+ const upgrade = classifyToolCalls(toolCalls.map((call) => ({ name: call.name, args: call.arguments })), config);
340
+ if (upgrade === undefined) {
341
+ return;
342
+ }
343
+ state.mode = 'deep';
344
+ state.reason = upgrade.reason;
345
+ emit?.({
346
+ type: 'turn.routed',
347
+ runId: ctx.runId ?? UNKNOWN_RUN_ID,
348
+ mode: 'deep',
349
+ reason: upgrade.reason,
350
+ });
351
+ }
352
+ /**
353
+ * Adaptive routing middleware (name `'routing'`). Emits `turn.routed`
354
+ * (`{ runId, mode, reason }`) at `preflight` and again whenever a later
355
+ * `modelRound`'s tool calls upgrade the mode; emits `turn.escalated`
356
+ * (`{ runId, reason }`) at most once per turn.
357
+ *
358
+ * With `enabled: false` this returns no-op hooks that call nothing —
359
+ * not even the option callbacks.
360
+ */
361
+ export function createRoutingMiddleware(options = {}) {
362
+ const config = compileRoutingConfig(options.config);
363
+ if (!config.enabled) {
364
+ return {
365
+ name: 'routing',
366
+ beforePhase: () => { },
367
+ afterPhase: () => { },
368
+ };
369
+ }
370
+ const { judge, getVerification, getRecentCorrections } = options;
371
+ const states = new WeakMap();
372
+ return {
373
+ name: 'routing',
374
+ beforePhase(phase, ctx, emit) {
375
+ if (phase === 'preflight') {
376
+ const toolNames = ctx.tools.map((tool) => tool.name);
377
+ const decision = classifyTurn({
378
+ text: lastUserText(ctx.messages),
379
+ toolNames,
380
+ recentCorrections: getRecentCorrections?.() ?? 0,
381
+ }, config);
382
+ states.set(ctx, { mode: decision.mode, reason: decision.reason, escalated: false });
383
+ emit?.({
384
+ type: 'turn.routed',
385
+ runId: ctx.runId ?? UNKNOWN_RUN_ID,
386
+ mode: decision.mode,
387
+ reason: decision.reason,
388
+ });
389
+ return;
390
+ }
391
+ },
392
+ async afterPhase(phase, ctx, result, emit) {
393
+ if (phase === 'modelRound') {
394
+ upgradeOnRiskyToolCalls(states, config, ctx, result, emit);
395
+ return;
396
+ }
397
+ if (phase !== 'finalize') {
398
+ return;
399
+ }
400
+ const state = states.get(ctx);
401
+ if (state === undefined || state.escalated) {
402
+ return;
403
+ }
404
+ const verification = getVerification?.();
405
+ if (verification !== undefined && verification.unsupported > 0 && state.mode === 'fast') {
406
+ state.escalated = true;
407
+ state.mode = 'deep';
408
+ state.reason = REASON_GUARD_UNSUPPORTED;
409
+ emit?.({
410
+ type: 'turn.escalated',
411
+ runId: ctx.runId ?? UNKNOWN_RUN_ID,
412
+ reason: REASON_GUARD_UNSUPPORTED,
413
+ });
414
+ }
415
+ if (state.mode !== 'deep') {
416
+ return;
417
+ }
418
+ if (!config.llmJudgeEnabled || judge === undefined) {
419
+ return;
420
+ }
421
+ try {
422
+ await judge.judge({
423
+ claims: verification?.claims ?? [],
424
+ evidence: verification?.evidence ?? [],
425
+ });
426
+ }
427
+ catch (err) {
428
+ emit?.({
429
+ type: 'middleware.error',
430
+ middleware: 'routing',
431
+ phase,
432
+ error: err instanceof Error ? err.message : String(err),
433
+ });
434
+ }
435
+ },
436
+ };
437
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Gateway capabilities exposed to the Python agent turn loop.
3
+ *
4
+ * Python reaches only these interfaces through the internal RPC bridge.
5
+ * The gateway provides concrete implementations (adapters).
6
+ *
7
+ * NOTE: `LlmClient` here is deliberately a minimal loop-facing interface,
8
+ * separate from `@boombot/llm-core`'s richer contract. Gateway adapters
9
+ * translate between the two.
10
+ */
11
+ import type { ChatMessage, LlmChunk, MemoryHit, ToolCall, ToolDefinition, ToolResult } from './types.js';
12
+ /** The only way the loop talks to a model: one streaming call per round. */
13
+ export interface LlmClient {
14
+ complete(messages: readonly ChatMessage[], tools: readonly ToolDefinition[], signal?: AbortSignal): AsyncIterable<LlmChunk>;
15
+ }
16
+ /** Executes a single approved tool call. */
17
+ export interface ToolExecutor {
18
+ execute(call: ToolCall, signal?: AbortSignal): Promise<ToolResult>;
19
+ }
20
+ /** Lightweight recall used before the first model round (escalation to a
21
+ * deeper retrieval agent, if ever needed, lives outside the loop). */
22
+ export interface MemoryPort {
23
+ recall(query: string): Promise<readonly MemoryHit[]>;
24
+ }
25
+ export type PolicyDecision = 'allow' | 'deny' | 'ask';
26
+ /**
27
+ * Mandatory gate before every tool call (accident-prevention, not a
28
+ * security boundary — see root SECURITY.md when it lands).
29
+ * `'ask'` is treated as a denial when no `ApprovalPort` is configured;
30
+ * with an approval port, the turn pauses and asks a human (HITL).
31
+ */
32
+ export interface PolicyPort {
33
+ checkToolCall(call: ToolCall): PolicyDecision | Promise<PolicyDecision>;
34
+ }
35
+ /** A human-in-the-loop approval request for one tool call. */
36
+ export interface ApprovalRequest {
37
+ readonly runId: string;
38
+ readonly callId: string;
39
+ readonly toolName: string;
40
+ readonly args: Readonly<Record<string, unknown>>;
41
+ readonly reason: string;
42
+ }
43
+ /** The human's verdict: approve (optionally with edited args) or reject. */
44
+ export interface ApprovalVerdict {
45
+ readonly approved: boolean;
46
+ readonly editedArgs?: Readonly<Record<string, unknown>>;
47
+ }
48
+ /**
49
+ * Human-in-the-loop approval channel (UI prompt, chat message, etc.).
50
+ * MUST reject with an `Error` named `'AbortError'` when `signal` aborts,
51
+ * and throw `ApprovalTimeoutError` when the decision times out.
52
+ */
53
+ export interface ApprovalPort {
54
+ requestApproval(req: ApprovalRequest, signal?: AbortSignal): Promise<ApprovalVerdict>;
55
+ }
56
+ /** Thrown by an `ApprovalPort` when nobody decides within `timeoutMs`. */
57
+ export declare class ApprovalTimeoutError extends Error {
58
+ readonly code: "APPROVAL_TIMEOUT";
59
+ constructor(runId: string, timeoutMs: number);
60
+ }
61
+ /** Everything one cognitive turn needs from the gateway. */
62
+ export interface AgentRuntimeDeps {
63
+ readonly llm: LlmClient;
64
+ readonly tools: ToolExecutor;
65
+ readonly memory: MemoryPort;
66
+ readonly policy: PolicyPort;
67
+ /** Optional: when absent, a policy `'ask'` is treated as a safe denial. */
68
+ readonly approval?: ApprovalPort;
69
+ }
70
+ /** Input to the optional LLM judge used by adaptive routing's deep verification. */
71
+ export interface JudgeInput {
72
+ readonly claims: readonly unknown[];
73
+ readonly evidence: readonly unknown[];
74
+ }
75
+ /** Verdict returned by the LLM judge. */
76
+ export interface JudgeVerdict {
77
+ readonly supported: boolean;
78
+ readonly unsupportedClaims: readonly string[];
79
+ readonly reason?: string;
80
+ }
81
+ /**
82
+ * Optional LLM-as-judge port for adaptive routing escalation. Disabled by
83
+ * default; the host wires an implementation only when it wants an extra
84
+ * model pass over the verification snapshot after an escalation.
85
+ */
86
+ export interface LlmJudgePort {
87
+ judge(input: JudgeInput, signal?: AbortSignal): Promise<JudgeVerdict>;
88
+ }
@@ -0,0 +1,8 @@
1
+ /** Thrown by an `ApprovalPort` when nobody decides within `timeoutMs`. */
2
+ export class ApprovalTimeoutError extends Error {
3
+ code = 'APPROVAL_TIMEOUT';
4
+ constructor(runId, timeoutMs) {
5
+ super(`approval_timeout: no decision for run ${runId} within ${timeoutMs}ms`);
6
+ this.name = 'ApprovalTimeoutError';
7
+ }
8
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Standard tool error policy for `@boombot/core`.
3
+ *
4
+ * Every tool executor failure is classified into a `ToolError` (a code +
5
+ * retryability flag + message) instead of propagating as a raw throw.
6
+ * `withToolRetry` wraps a `ToolExecutor` so transient failures are retried
7
+ * with backoff; exhausted retries become a `ToolResult` with `error: true`
8
+ * that the model can see and react to — a throw NEVER kills the turn.
9
+ *
10
+ * BEHAVIOR CHANGE (vs. the pre-upgrade pipeline): previously a throw from
11
+ * `ToolExecutor.execute` propagated out of `toolRound` and ended the turn
12
+ * with `status: 'error'`. Now `toolRound` always wraps execution with
13
+ * `withToolRetry` (defaults), so a throw becomes a tool message the model
14
+ * reads in the next round.
15
+ */
16
+ import type { ToolExecutor } from './runtime-deps.js';
17
+ export type ToolErrorCode = 'TIMEOUT' | 'DENIED' | 'FAILED' | 'INVALID_ARGS' | 'RATE_LIMITED';
18
+ export interface ToolError {
19
+ readonly code: ToolErrorCode;
20
+ /** True when retrying the exact same call has a chance of succeeding. */
21
+ readonly retryable: boolean;
22
+ readonly message: string;
23
+ }
24
+ /**
25
+ * Classify any thrown value into a `ToolError`. Check order is deliberate:
26
+ * timeout first (an abort can carry any message), then rate limit, then
27
+ * argument/validation problems, then denials; anything else is FAILED.
28
+ */
29
+ export declare function toToolError(err: unknown): ToolError;
30
+ export interface ToolRetryOptions {
31
+ /** Max retries AFTER the first attempt. Defaults to 1. */
32
+ readonly maxRetries?: number;
33
+ /** Base backoff; the n-th retry sleeps `backoffMs * n`. Defaults to 500. */
34
+ readonly backoffMs?: number;
35
+ /** Injected for tests; defaults to a real `setTimeout` sleep. */
36
+ readonly sleep?: (ms: number) => Promise<void>;
37
+ }
38
+ /**
39
+ * Wrap an executor with the standard retry policy: on throw, classify with
40
+ * `toToolError`; retry while the error is retryable and attempts remain;
41
+ * when retries are exhausted (or the error is not retryable), return a
42
+ * `ToolResult` with `error: true` and the classified `toolError` attached.
43
+ */
44
+ export declare function withToolRetry(executor: ToolExecutor, opts?: ToolRetryOptions): ToolExecutor;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Classify any thrown value into a `ToolError`. Check order is deliberate:
3
+ * timeout first (an abort can carry any message), then rate limit, then
4
+ * argument/validation problems, then denials; anything else is FAILED.
5
+ */
6
+ export function toToolError(err) {
7
+ const message = err instanceof Error ? err.message : String(err);
8
+ const name = err instanceof Error ? err.name : '';
9
+ if (name === 'AbortError' || /timed?\s*-?out/i.test(message)) {
10
+ return { code: 'TIMEOUT', retryable: true, message };
11
+ }
12
+ if (/rate.?limit|429/i.test(message)) {
13
+ return { code: 'RATE_LIMITED', retryable: true, message };
14
+ }
15
+ if (/invalid (args|arguments|parameters)|validation|schema/i.test(message)) {
16
+ return { code: 'INVALID_ARGS', retryable: false, message };
17
+ }
18
+ if (/denied|forbidden|not allowed|policy/i.test(message)) {
19
+ return { code: 'DENIED', retryable: false, message };
20
+ }
21
+ return { code: 'FAILED', retryable: true, message };
22
+ }
23
+ const defaultSleep = (ms) => new Promise((resolve) => {
24
+ setTimeout(resolve, ms);
25
+ });
26
+ /**
27
+ * Wrap an executor with the standard retry policy: on throw, classify with
28
+ * `toToolError`; retry while the error is retryable and attempts remain;
29
+ * when retries are exhausted (or the error is not retryable), return a
30
+ * `ToolResult` with `error: true` and the classified `toolError` attached.
31
+ */
32
+ export function withToolRetry(executor, opts = {}) {
33
+ const maxRetries = opts.maxRetries ?? 1;
34
+ const backoffMs = opts.backoffMs ?? 500;
35
+ const sleep = opts.sleep ?? defaultSleep;
36
+ return {
37
+ async execute(call, signal) {
38
+ let attempt = 0;
39
+ for (;;) {
40
+ try {
41
+ return await executor.execute(call, signal);
42
+ }
43
+ catch (err) {
44
+ const toolError = toToolError(err);
45
+ if (!toolError.retryable || attempt >= maxRetries) {
46
+ return {
47
+ callId: call.id,
48
+ name: call.name,
49
+ output: `[${toolError.code}] ${toolError.message}`,
50
+ error: true,
51
+ toolError,
52
+ };
53
+ }
54
+ attempt += 1;
55
+ await sleep(backoffMs * attempt);
56
+ }
57
+ }
58
+ },
59
+ };
60
+ }
@@ -0,0 +1,21 @@
1
+ import type { AgentRuntimeDeps } from './runtime-deps.js';
2
+ import type { ChatMessage, EventHandler, TurnContext, TurnResult } from './types.js';
3
+ export declare const DEFAULT_MAX_ROUNDS = 20;
4
+ export declare const DEFAULT_MAX_TOOL_CALLS = 64;
5
+ export declare const TOOL_ROUND_CONCURRENCY = 4;
6
+ export declare const EMPTY_RESPONSE_NUDGE = "Your previous response was empty. Answer the user now, or call a tool only if it is necessary. Do not return an empty response.";
7
+ export declare const CONTEXT_RETRY_TARGET_CHARS = 40000;
8
+ export declare const CONTEXT_RETRY_SUMMARY_CHARS = 8000;
9
+ export declare const CONTEXT_RETRY_MESSAGE_CHARS = 8000;
10
+ export declare const CONTEXT_OMISSION_MARKER = "\n[message middle omitted during context recovery]\n";
11
+ export declare class CancelledError extends Error {
12
+ readonly code: "CANCELLED";
13
+ constructor(message?: string);
14
+ }
15
+ export declare function isContextOverflow(error: unknown): boolean;
16
+ export declare function shortenContent(content: string, limit: number): string;
17
+ export declare function compactContextForRetry(messages: readonly ChatMessage[]): readonly ChatMessage[];
18
+ /**
19
+ * Execute a complete cognitive turn natively in TypeScript.
20
+ */
21
+ export declare function runTurn(deps: AgentRuntimeDeps, context: TurnContext, onEvent?: EventHandler, signal?: AbortSignal): Promise<TurnResult>;