@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,304 @@
1
+ /**
2
+ * Workflow Engine.
3
+ *
4
+ * Coordinates execution of DAG workflow waves, handles retries, timeouts,
5
+ * feeds upstream outputs into downstream inputs, and enforces isolation.
6
+ */
7
+ import { analyzeWorkflowDAG } from './dag.js';
8
+ import { WorkflowError, } from './types.js';
9
+ export class WorkflowEngine {
10
+ options;
11
+ constructor(options = {}) {
12
+ this.options = options;
13
+ }
14
+ async execute(nodes, context, signal) {
15
+ const startTime = Date.now();
16
+ const { waves } = analyzeWorkflowDAG(nodes);
17
+ const results = new Map();
18
+ const outputs = new Map();
19
+ const errors = new Map();
20
+ const failFast = this.options.failFast ?? true;
21
+ for (const wave of waves) {
22
+ if (signal?.aborted) {
23
+ break;
24
+ }
25
+ // Check if any node in this wave has failed dependencies
26
+ const executableNodes = [];
27
+ for (const node of wave) {
28
+ const hasFailedDep = node.dependencies.some((depId) => results.get(depId)?.status === 'failed');
29
+ if (hasFailedDep) {
30
+ results.set(node.id, {
31
+ nodeId: node.id,
32
+ status: 'skipped',
33
+ durationMs: 0,
34
+ attempts: 0,
35
+ });
36
+ }
37
+ else {
38
+ executableNodes.push(node);
39
+ }
40
+ }
41
+ if (executableNodes.length === 0) {
42
+ continue;
43
+ }
44
+ // Execute wave nodes concurrently
45
+ const wavePromises = executableNodes.map((node) => this.executeNode(node, context, outputs, signal));
46
+ const waveResults = await Promise.all(wavePromises);
47
+ let waveHasFailure = false;
48
+ for (const res of waveResults) {
49
+ results.set(res.nodeId, res);
50
+ if (res.status === 'completed' && res.output !== undefined) {
51
+ outputs.set(res.nodeId, res.output);
52
+ }
53
+ else if (res.status === 'failed') {
54
+ waveHasFailure = true;
55
+ if (res.error)
56
+ errors.set(res.nodeId, res.error);
57
+ }
58
+ }
59
+ if (waveHasFailure && failFast) {
60
+ break;
61
+ }
62
+ }
63
+ const durationMs = Date.now() - startTime;
64
+ const isAborted = signal?.aborted === true;
65
+ const hasFailures = errors.size > 0;
66
+ // Harvest workflow-level trajectory if recording is enabled
67
+ let trajectory;
68
+ if (this.options.recordTrajectories ?? true) {
69
+ const nodeTrajectories = [];
70
+ for (const res of results.values()) {
71
+ if (res.trajectory) {
72
+ nodeTrajectories.push(res.trajectory);
73
+ }
74
+ }
75
+ const allGolden = nodeTrajectories.length > 0 &&
76
+ nodeTrajectories.every((t) => t.golden);
77
+ trajectory = {
78
+ workflowId: this.options.workflowId ??
79
+ `wf_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
80
+ timestamp: startTime,
81
+ status: isAborted ? 'aborted' : hasFailures ? 'failed' : 'completed',
82
+ totalDurationMs: durationMs,
83
+ nodeTrajectories,
84
+ golden: allGolden && !hasFailures && !isAborted,
85
+ };
86
+ }
87
+ return {
88
+ status: isAborted ? 'aborted' : hasFailures ? 'failed' : 'completed',
89
+ results,
90
+ outputs,
91
+ errors,
92
+ durationMs,
93
+ trajectory,
94
+ };
95
+ }
96
+ async executeNode(node, context, outputs, workflowSignal) {
97
+ const nodeStart = Date.now();
98
+ const maxAttempts = node.retry?.maxAttempts ?? 1;
99
+ const backoffMs = node.retry?.backoffMs ?? 100;
100
+ const maxCriticRounds = node.critic ? (node.maxCriticRounds ?? 3) : 1;
101
+ const minGoldenScore = node.minGoldenScore ?? (this.options.minGoldenScore ?? 0.85);
102
+ let totalAttempts = 0;
103
+ let lastError;
104
+ let lastOutput;
105
+ let criticFeedback;
106
+ const trajectorySteps = [];
107
+ // Filter upstream outputs relevant to this node
108
+ const upstreamOutputs = new Map();
109
+ for (const depId of node.dependencies) {
110
+ if (outputs.has(depId)) {
111
+ upstreamOutputs.set(depId, outputs.get(depId));
112
+ }
113
+ }
114
+ // Outer Loop: Multi-Agent Self-Supervision (MASS) Critic Feedback Rounds
115
+ for (let round = 1; round <= maxCriticRounds; round++) {
116
+ let stepAttempts = 0;
117
+ let stepOutput;
118
+ let stepError;
119
+ const stepStart = Date.now();
120
+ // Inner Loop: ReAct Execution & standard retry handling
121
+ while (stepAttempts < maxAttempts) {
122
+ stepAttempts++;
123
+ totalAttempts++;
124
+ if (workflowSignal?.aborted) {
125
+ return {
126
+ nodeId: node.id,
127
+ status: 'failed',
128
+ error: new Error('Workflow aborted'),
129
+ durationMs: Date.now() - nodeStart,
130
+ attempts: totalAttempts,
131
+ };
132
+ }
133
+ let timeoutId;
134
+ const controller = new AbortController();
135
+ const onWorkflowAbort = () => controller.abort();
136
+ workflowSignal?.addEventListener('abort', onWorkflowAbort);
137
+ if (node.timeoutMs !== undefined && node.timeoutMs > 0) {
138
+ timeoutId = setTimeout(() => {
139
+ controller.abort(new Error(`Node '${node.id}' timed out after ${node.timeoutMs}ms`));
140
+ }, node.timeoutMs);
141
+ }
142
+ try {
143
+ stepOutput = await node.execute(context, upstreamOutputs, controller.signal, criticFeedback);
144
+ if (timeoutId)
145
+ clearTimeout(timeoutId);
146
+ workflowSignal?.removeEventListener('abort', onWorkflowAbort);
147
+ stepError = undefined;
148
+ break;
149
+ }
150
+ catch (err) {
151
+ if (timeoutId)
152
+ clearTimeout(timeoutId);
153
+ workflowSignal?.removeEventListener('abort', onWorkflowAbort);
154
+ stepError = err instanceof Error ? err : new Error(String(err));
155
+ if (stepAttempts < maxAttempts) {
156
+ await new Promise((r) => setTimeout(r, backoffMs * stepAttempts));
157
+ }
158
+ }
159
+ }
160
+ // If execution completely failed with error across all retry attempts
161
+ if (stepError || stepOutput === undefined) {
162
+ lastError = stepError ?? new Error(`Node '${node.id}' produced no output`);
163
+ trajectorySteps.push({
164
+ round,
165
+ error: lastError.message,
166
+ durationMs: Date.now() - stepStart,
167
+ });
168
+ break;
169
+ }
170
+ lastOutput = stepOutput;
171
+ // If Critic is configured, run Self-Supervision Critic Evaluation
172
+ if (node.critic) {
173
+ let evaluation;
174
+ try {
175
+ evaluation = await node.critic(stepOutput, context, upstreamOutputs, workflowSignal);
176
+ }
177
+ catch (evalErr) {
178
+ evaluation = {
179
+ pass: false,
180
+ score: 0.0,
181
+ feedback: `Critic execution threw error: ${evalErr instanceof Error ? evalErr.message : String(evalErr)}`,
182
+ };
183
+ }
184
+ trajectorySteps.push({
185
+ round,
186
+ output: stepOutput,
187
+ evaluation,
188
+ durationMs: Date.now() - stepStart,
189
+ });
190
+ if (evaluation.pass) {
191
+ // Critic passed the output!
192
+ const trajectory = this.buildNodeTrajectory(node, 'completed', trajectorySteps, totalAttempts, minGoldenScore);
193
+ return {
194
+ nodeId: node.id,
195
+ status: 'completed',
196
+ output: stepOutput,
197
+ durationMs: Date.now() - nodeStart,
198
+ attempts: totalAttempts,
199
+ trajectory,
200
+ };
201
+ }
202
+ // Critic rejected: provide feedback for the next round
203
+ criticFeedback = evaluation;
204
+ if (round === maxCriticRounds) {
205
+ lastError = new WorkflowError(`Node '${node.id}' failed self-supervision critic after ${maxCriticRounds} rounds: ${evaluation.feedback}`);
206
+ }
207
+ }
208
+ else {
209
+ // No critic configured: pass immediately on successful execution
210
+ trajectorySteps.push({
211
+ round,
212
+ output: stepOutput,
213
+ durationMs: Date.now() - stepStart,
214
+ });
215
+ const trajectory = this.buildNodeTrajectory(node, 'completed', trajectorySteps, totalAttempts, minGoldenScore);
216
+ return {
217
+ nodeId: node.id,
218
+ status: 'completed',
219
+ output: stepOutput,
220
+ durationMs: Date.now() - nodeStart,
221
+ attempts: totalAttempts,
222
+ trajectory,
223
+ };
224
+ }
225
+ }
226
+ const failedTrajectory = this.buildNodeTrajectory(node, 'failed', trajectorySteps, totalAttempts, minGoldenScore);
227
+ return {
228
+ nodeId: node.id,
229
+ status: 'failed',
230
+ error: lastError,
231
+ output: lastOutput,
232
+ durationMs: Date.now() - nodeStart,
233
+ attempts: totalAttempts,
234
+ trajectory: failedTrajectory,
235
+ };
236
+ }
237
+ buildNodeTrajectory(node, status, steps, totalAttempts, minGoldenScore) {
238
+ const scores = steps
239
+ .filter((s) => s.evaluation?.score !== undefined)
240
+ .map((s) => s.evaluation.score);
241
+ const averageScore = scores.length > 0
242
+ ? scores.reduce((a, b) => a + b, 0) / scores.length
243
+ : undefined;
244
+ const lastStep = steps[steps.length - 1];
245
+ const isGolden = status === 'completed' &&
246
+ (lastStep?.evaluation
247
+ ? lastStep.evaluation.pass && lastStep.evaluation.score >= minGoldenScore
248
+ : true);
249
+ return {
250
+ nodeId: node.id,
251
+ nodeName: node.name,
252
+ finalStatus: status,
253
+ steps,
254
+ totalAttempts,
255
+ averageScore,
256
+ golden: isGolden,
257
+ };
258
+ }
259
+ /**
260
+ * Harvest golden trajectories and convert them into SFT fine-tuning records (MASS RSI format).
261
+ */
262
+ static exportGoldenDataset(trajectories, minScore = 0.85) {
263
+ const dataset = [];
264
+ for (const wf of trajectories) {
265
+ if (!wf.golden)
266
+ continue;
267
+ for (const node of wf.nodeTrajectories) {
268
+ if (!node.golden)
269
+ continue;
270
+ if (node.averageScore !== undefined &&
271
+ node.averageScore < minScore) {
272
+ continue;
273
+ }
274
+ const lastStep = node.steps[node.steps.length - 1];
275
+ if (!lastStep?.output)
276
+ continue;
277
+ dataset.push({
278
+ instruction: `Execute workflow node: ${node.nodeName || node.nodeId}`,
279
+ input: JSON.stringify({
280
+ nodeId: node.nodeId,
281
+ rounds: node.steps.length,
282
+ }),
283
+ output: typeof lastStep.output === 'string'
284
+ ? lastStep.output
285
+ : JSON.stringify(lastStep.output),
286
+ score: lastStep.evaluation?.score ?? 1.0,
287
+ metadata: {
288
+ workflowId: wf.workflowId,
289
+ attempts: node.totalAttempts,
290
+ critique: lastStep.evaluation?.feedback,
291
+ },
292
+ });
293
+ }
294
+ }
295
+ return dataset;
296
+ }
297
+ /**
298
+ * Export golden dataset directly to JSONL string for Unsloth / HuggingFace fine-tuning.
299
+ */
300
+ static exportDatasetAsJSONL(trajectories, minScore = 0.85) {
301
+ const records = WorkflowEngine.exportGoldenDataset(trajectories, minScore);
302
+ return records.map((r) => JSON.stringify(r)).join('\n');
303
+ }
304
+ }
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './dag.js';
3
+ export * from './engine.js';
@@ -0,0 +1,3 @@
1
+ export * from './types.js';
2
+ export * from './dag.js';
3
+ export * from './engine.js';
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Workflow DAG (Directed Acyclic Graph) Types.
3
+ *
4
+ * Defines node structures, dependencies, execution state, and output resolution.
5
+ */
6
+ export type NodeStatus = 'pending' | 'running' | 'completed' | 'failed' | 'skipped';
7
+ export interface WorkflowNode<TContext = unknown, TOutput = unknown> {
8
+ /** Unique identifier for the node within the workflow. */
9
+ readonly id: string;
10
+ /** Human-readable label or description. */
11
+ readonly name?: string;
12
+ /** IDs of nodes that must complete successfully before this node executes. */
13
+ readonly dependencies: readonly string[];
14
+ /** Execution function for the node. Receives context, upstream outputs, and optional critic feedback. */
15
+ readonly execute: (context: TContext, upstreamOutputs: ReadonlyMap<string, unknown>, signal?: AbortSignal, criticFeedback?: CriticEvaluation) => Promise<TOutput>;
16
+ /** Optional timeout in milliseconds. */
17
+ readonly timeoutMs?: number;
18
+ /** Optional retry policy. */
19
+ readonly retry?: {
20
+ readonly maxAttempts: number;
21
+ readonly backoffMs?: number;
22
+ };
23
+ /**
24
+ * Optional Multi-Agent Self-Supervision (MASS) Critic function.
25
+ * If specified, evaluates node output. If evaluation.pass is false,
26
+ * node is re-executed with the critic feedback up to maxCriticRounds.
27
+ */
28
+ readonly critic?: (output: TOutput, context: TContext, upstreamOutputs: ReadonlyMap<string, unknown>, signal?: AbortSignal) => Promise<CriticEvaluation>;
29
+ /** Maximum rounds of critic feedback loop. Defaults to 3. */
30
+ readonly maxCriticRounds?: number;
31
+ /** Minimum score required for golden trajectory classification. Defaults to 0.85. */
32
+ readonly minGoldenScore?: number;
33
+ }
34
+ export interface CriticEvaluation {
35
+ readonly pass: boolean;
36
+ /** Normalized score between 0.0 (total failure) and 1.0 (flawless). */
37
+ readonly score: number;
38
+ /** Detailed critique, reasoning, or rubrics. */
39
+ readonly feedback: string;
40
+ /** Specific actionable suggestions for improvement. */
41
+ readonly improvements?: readonly string[];
42
+ }
43
+ export interface TrajectoryStep<TOutput = unknown> {
44
+ readonly round: number;
45
+ readonly output?: TOutput;
46
+ readonly error?: string;
47
+ readonly evaluation?: CriticEvaluation;
48
+ readonly durationMs: number;
49
+ }
50
+ export interface NodeTrajectory<TOutput = unknown> {
51
+ readonly nodeId: string;
52
+ readonly nodeName?: string;
53
+ readonly finalStatus: NodeStatus;
54
+ readonly steps: readonly TrajectoryStep<TOutput>[];
55
+ readonly totalAttempts: number;
56
+ readonly averageScore?: number;
57
+ readonly golden: boolean;
58
+ }
59
+ export interface WorkflowTrajectory {
60
+ readonly workflowId: string;
61
+ readonly timestamp: number;
62
+ readonly status: 'completed' | 'failed' | 'aborted';
63
+ readonly totalDurationMs: number;
64
+ readonly nodeTrajectories: readonly NodeTrajectory[];
65
+ readonly golden: boolean;
66
+ }
67
+ export interface SFTDatasetRecord {
68
+ readonly instruction: string;
69
+ readonly input: string;
70
+ readonly output: string;
71
+ readonly score: number;
72
+ readonly metadata?: Record<string, unknown>;
73
+ }
74
+ export interface NodeResult<TOutput = unknown> {
75
+ readonly nodeId: string;
76
+ readonly status: NodeStatus;
77
+ readonly output?: TOutput;
78
+ readonly error?: Error;
79
+ readonly durationMs: number;
80
+ readonly attempts: number;
81
+ readonly trajectory?: NodeTrajectory<TOutput>;
82
+ }
83
+ export interface WorkflowResult<TOutput = unknown> {
84
+ readonly status: 'completed' | 'failed' | 'aborted';
85
+ readonly results: ReadonlyMap<string, NodeResult<TOutput>>;
86
+ readonly outputs: ReadonlyMap<string, TOutput>;
87
+ readonly durationMs: number;
88
+ readonly errors: ReadonlyMap<string, Error>;
89
+ readonly trajectory?: WorkflowTrajectory;
90
+ }
91
+ export declare class WorkflowError extends Error {
92
+ readonly details?: unknown | undefined;
93
+ constructor(message: string, details?: unknown | undefined);
94
+ }
95
+ export declare class CycleDetectedError extends WorkflowError {
96
+ readonly cyclePath: readonly string[];
97
+ constructor(cyclePath: readonly string[]);
98
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Workflow DAG (Directed Acyclic Graph) Types.
3
+ *
4
+ * Defines node structures, dependencies, execution state, and output resolution.
5
+ */
6
+ export class WorkflowError extends Error {
7
+ details;
8
+ constructor(message, details) {
9
+ super(message);
10
+ this.details = details;
11
+ this.name = 'WorkflowError';
12
+ }
13
+ }
14
+ export class CycleDetectedError extends WorkflowError {
15
+ cyclePath;
16
+ constructor(cyclePath) {
17
+ super(`Cycle detected in workflow graph: ${cyclePath.join(' -> ')}`);
18
+ this.cyclePath = cyclePath;
19
+ this.name = 'CycleDetectedError';
20
+ }
21
+ }
@@ -0,0 +1,11 @@
1
+ import { type CommandHandler } from "./service.js";
2
+ /** Minimal command-registry surface these handlers need. */
3
+ export interface ScheduleHandlerRegistry {
4
+ register(type: string, handler: CommandHandler): void;
5
+ }
6
+ /**
7
+ * Register every `schedule.*` handler on the gateway command registry.
8
+ * `schedule.run-now` is additive: unknown to older clients/dispatchers,
9
+ * harmless until the protocol barrel picks it up.
10
+ */
11
+ export declare function registerScheduleHandlers(registry: ScheduleHandlerRegistry): void;
@@ -0,0 +1,174 @@
1
+ /**
2
+ * `schedule.*` command handlers for the gateway command registry.
3
+ *
4
+ * Implements the protocol schemas in `COMMAND_SCHEMAS` (`schedule.list`,
5
+ * `schedule.create`, `schedule.update`, `schedule.delete`,
6
+ * `schedule.toggle`) against the scheduler service's registry, plus the
7
+ * additive `schedule.run-now` command (see
8
+ * `packages/gateway-protocol/src/commands-scheduler.ts`, re-exported from
9
+ * the protocol barrel as `SCHEDULER_EXTRA_COMMAND_DEFS`).
10
+ *
11
+ * Notes:
12
+ * - Cron expressions are validated with the scheduler package's evaluator
13
+ * before reaching the registry, so a bad cron fails fast with a clear
14
+ * message (the registry would also reject it, but the pre-check names the
15
+ * offending field).
16
+ * - The protocol v1 `schedule.*` payloads carry no timezone; schedules are
17
+ * created in UTC. Recorded as a contract difference in the phase-2 report.
18
+ * - Client-caused failures (bad cron, unknown id, quota, illegal state) are
19
+ * mapped to `ProtocolError('INVALID_PAYLOAD')` so the server answers 400,
20
+ * not 500. Anything else (storage failure, unexpected) still propagates
21
+ * and stays a 500.
22
+ */
23
+ import { SchedulerError, validateCronExpression, } from "@boombot/core";
24
+ import { COMMAND_SCHEMAS, SCHEDULER_EXTRA_COMMAND_DEFS as EXTRA_COMMAND_DEFS, ProtocolError, } from "@boombot/protocol";
25
+ import { toProtocolSchedule, } from "./service.js";
26
+ /** Default timezone: environment, host system, or Asia/Ho_Chi_Minh. */
27
+ const DEFAULT_TIMEZONE = process.env["BOOMBOT_TIMEZONE"] ||
28
+ (typeof Intl !== "undefined"
29
+ ? Intl.DateTimeFormat().resolvedOptions().timeZone || "Asia/Ho_Chi_Minh"
30
+ : "Asia/Ho_Chi_Minh");
31
+ function internalsOf(ctx) {
32
+ const service = ctx.schedulerService;
33
+ if (!service) {
34
+ throw new Error("scheduler service is not started");
35
+ }
36
+ return service.internals;
37
+ }
38
+ /**
39
+ * Map scheduler-domain failures onto protocol errors the way the `task.*`
40
+ * handlers map `TaskError`: client-caused `SchedulerError` codes become
41
+ * `INVALID_PAYLOAD` (400 via the server's ProtocolError mapping); storage
42
+ * failures, authZ denials and unexpected errors propagate (500).
43
+ */
44
+ function mapSchedulerError(error) {
45
+ if (error instanceof ProtocolError)
46
+ return error;
47
+ if (error instanceof SchedulerError) {
48
+ switch (error.code) {
49
+ case "SCHEDULER_INVALID_SPEC":
50
+ case "SCHEDULER_NOT_FOUND":
51
+ case "SCHEDULER_LIMIT_EXCEEDED":
52
+ case "SCHEDULER_INVALID_STATE":
53
+ return new ProtocolError("INVALID_PAYLOAD", error.message, {
54
+ code: error.code,
55
+ });
56
+ default:
57
+ return error;
58
+ }
59
+ }
60
+ return error instanceof Error ? error : new Error(String(error));
61
+ }
62
+ /**
63
+ * Parse a command payload, converting schema mismatches into
64
+ * `INVALID_PAYLOAD` (400) instead of letting a `ZodError` bubble up as a
65
+ * 500.
66
+ */
67
+ function parsePayload(command, schema, payload) {
68
+ const result = schema.safeParse(payload);
69
+ if (!result.success) {
70
+ throw new ProtocolError("INVALID_PAYLOAD", `invalid payload for ${command}: ${result.error.message}`);
71
+ }
72
+ return result.data;
73
+ }
74
+ function assertValidCron(cron) {
75
+ const result = validateCronExpression(cron);
76
+ if (!result.ok) {
77
+ throw new ProtocolError("INVALID_PAYLOAD", `invalid cron expression: ${result.reason}`);
78
+ }
79
+ }
80
+ const listSchedules = async (ctx) => {
81
+ const { registry, authContext } = internalsOf(ctx);
82
+ const jobs = await registry.list(authContext);
83
+ return { schedules: jobs.map(toProtocolSchedule) };
84
+ };
85
+ const createSchedule = async (ctx, payload) => {
86
+ const input = parsePayload("schedule.create", COMMAND_SCHEMAS["schedule.create"].payload, payload);
87
+ assertValidCron(input.cron);
88
+ const { registry, authContext } = internalsOf(ctx);
89
+ try {
90
+ const job = await registry.create(authContext, {
91
+ name: input.name,
92
+ cron: input.cron,
93
+ timezone: input.timezone ?? DEFAULT_TIMEZONE,
94
+ promptText: input.prompt,
95
+ enabled: input.enabled ?? true,
96
+ });
97
+ return { schedule: toProtocolSchedule(job) };
98
+ }
99
+ catch (error) {
100
+ throw mapSchedulerError(error);
101
+ }
102
+ };
103
+ const updateSchedule = async (ctx, payload) => {
104
+ const input = parsePayload("schedule.update", COMMAND_SCHEMAS["schedule.update"].payload, payload);
105
+ // Mutable local patch; Partial<ScheduleSpec> fields are readonly.
106
+ const patch = {};
107
+ if (input.name !== undefined)
108
+ patch.name = input.name;
109
+ if (input.cron !== undefined) {
110
+ assertValidCron(input.cron);
111
+ patch.cron = input.cron;
112
+ }
113
+ if (input.prompt !== undefined)
114
+ patch.promptText = input.prompt;
115
+ if (input.enabled !== undefined)
116
+ patch.enabled = input.enabled;
117
+ const { registry, authContext } = internalsOf(ctx);
118
+ try {
119
+ const job = await registry.update(authContext, input.id, patch);
120
+ return { schedule: toProtocolSchedule(job) };
121
+ }
122
+ catch (error) {
123
+ throw mapSchedulerError(error);
124
+ }
125
+ };
126
+ const deleteSchedule = async (ctx, payload) => {
127
+ const input = parsePayload("schedule.delete", COMMAND_SCHEMAS["schedule.delete"].payload, payload);
128
+ const { registry, authContext } = internalsOf(ctx);
129
+ try {
130
+ await registry.remove(authContext, input.id);
131
+ return { ok: true };
132
+ }
133
+ catch (error) {
134
+ throw mapSchedulerError(error);
135
+ }
136
+ };
137
+ const toggleSchedule = async (ctx, payload) => {
138
+ const input = parsePayload("schedule.toggle", COMMAND_SCHEMAS["schedule.toggle"].payload, payload);
139
+ const { registry, authContext } = internalsOf(ctx);
140
+ try {
141
+ const job = await registry.setEnabled(authContext, input.id, input.enabled);
142
+ return { schedule: toProtocolSchedule(job) };
143
+ }
144
+ catch (error) {
145
+ throw mapSchedulerError(error);
146
+ }
147
+ };
148
+ const runScheduleNow = async (ctx, payload) => {
149
+ const input = parsePayload("schedule.run-now", EXTRA_COMMAND_DEFS["schedule.run-now"].payload, payload);
150
+ const service = ctx.schedulerService;
151
+ if (!service) {
152
+ throw new Error("scheduler service is not started");
153
+ }
154
+ try {
155
+ const { turnId } = await service.fireNow(input.id);
156
+ return { ok: true, turnId };
157
+ }
158
+ catch (error) {
159
+ throw mapSchedulerError(error);
160
+ }
161
+ };
162
+ /**
163
+ * Register every `schedule.*` handler on the gateway command registry.
164
+ * `schedule.run-now` is additive: unknown to older clients/dispatchers,
165
+ * harmless until the protocol barrel picks it up.
166
+ */
167
+ export function registerScheduleHandlers(registry) {
168
+ registry.register("schedule.list", listSchedules);
169
+ registry.register("schedule.create", createSchedule);
170
+ registry.register("schedule.update", updateSchedule);
171
+ registry.register("schedule.delete", deleteSchedule);
172
+ registry.register("schedule.toggle", toggleSchedule);
173
+ registry.register("schedule.run-now", runScheduleNow);
174
+ }
@@ -0,0 +1,2 @@
1
+ export * from './handlers.js';
2
+ export * from './service.js';
@@ -0,0 +1,2 @@
1
+ export * from './handlers.js';
2
+ export * from './service.js';
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "@boombot/cronjobs",
3
+ "version": "2.0.0",
4
+ "type": "module",
5
+ "main": "./index.js",
6
+ "exports": {
7
+ ".": "./index.js"
8
+ }
9
+ }