@theowlops/boombot 0.0.0-stage → 1.1.1
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.
- package/README.md +69 -3
- package/dist/LICENSE +21 -0
- package/dist/bin/boombot.js +16 -0
- package/dist/cli/api-key.js +123 -0
- package/dist/cli/bin-bun.js +17 -0
- package/dist/cli/bin.js +34 -0
- package/dist/cli/cli/cli-error.js +61 -0
- package/dist/cli/cli/dispatch.js +138 -0
- package/dist/cli/cli/help.js +83 -0
- package/dist/cli/cli/parser.js +89 -0
- package/dist/cli/cli/registry.js +185 -0
- package/dist/cli/cli/spec.js +41 -0
- package/dist/cli/cli/suggest.js +125 -0
- package/dist/cli/cli/version.js +30 -0
- package/dist/cli/cli/vocabulary.js +87 -0
- package/dist/cli/commands/doctor.js +365 -0
- package/dist/cli/commands/gateway.js +290 -0
- package/dist/cli/commands/migrate.js +270 -0
- package/dist/cli/commands/plugin.js +97 -0
- package/dist/cli/commands/setup.js +244 -0
- package/dist/cli/config-file.js +133 -0
- package/dist/cli/master-key.js +78 -0
- package/dist/cli/open-browser.js +59 -0
- package/dist/cli/web-assets.js +58 -0
- package/dist/gateway/auth.js +46 -0
- package/dist/gateway/config-format.js +202 -0
- package/dist/gateway/config.js +427 -0
- package/dist/gateway/context.js +1 -0
- package/dist/gateway/env-file.js +129 -0
- package/dist/gateway/events.js +172 -0
- package/dist/gateway/guard/tagging.js +505 -0
- package/dist/gateway/handlers/index.js +66 -0
- package/dist/gateway/handlers/memory.js +54 -0
- package/dist/gateway/handlers/providers.js +73 -0
- package/dist/gateway/handlers/registry.js +39 -0
- package/dist/gateway/handlers/sessions.js +188 -0
- package/dist/gateway/handlers/system.js +12 -0
- package/dist/gateway/handlers/tasks.js +191 -0
- package/dist/gateway/handlers/turn.js +100 -0
- package/dist/gateway/index.js +126 -0
- package/dist/gateway/main.js +23 -0
- package/dist/gateway/server.js +354 -0
- package/dist/gateway/services/context-limits.js +75 -0
- package/dist/gateway/services/history-normalizer.js +42 -0
- package/dist/gateway/services/image-pipeline.js +56 -0
- package/dist/gateway/services/key-roulette-client.js +43 -0
- package/dist/gateway/services/llm-client.js +593 -0
- package/dist/gateway/services/llm-decoder.js +200 -0
- package/dist/gateway/services/local-fallback.js +135 -0
- package/dist/gateway/services/memory.js +511 -0
- package/dist/gateway/services/persistent-memory.js +196 -0
- package/dist/gateway/services/providers.js +44 -0
- package/dist/gateway/services/tasks.js +237 -0
- package/dist/gateway/services/verification.js +124 -0
- package/dist/gateway/services/vision-payload.js +48 -0
- package/dist/gateway/services.js +257 -0
- package/dist/gateway/session-snapshot.js +19 -0
- package/dist/gateway/sessions.js +701 -0
- package/dist/gateway/static.js +239 -0
- package/dist/gateway/turns/clarify-tool.js +57 -0
- package/dist/gateway/turns/cronjob-tool.js +96 -0
- package/dist/gateway/turns/deferred-tools.js +154 -0
- package/dist/gateway/turns/execute-code-tool.js +84 -0
- package/dist/gateway/turns/file-tool-defs.js +178 -0
- package/dist/gateway/turns/file-tool-ops.js +178 -0
- package/dist/gateway/turns/file-tool-scan.js +182 -0
- package/dist/gateway/turns/file-tool.js +302 -0
- package/dist/gateway/turns/index.js +416 -0
- package/dist/gateway/turns/jev-middleware.js +91 -0
- package/dist/gateway/turns/local-reply.js +156 -0
- package/dist/gateway/turns/mcp-client.js +643 -0
- package/dist/gateway/turns/memory-tool.js +171 -0
- package/dist/gateway/turns/middleware.js +96 -0
- package/dist/gateway/turns/python-core.js +397 -0
- package/dist/gateway/turns/routing/index.js +3 -0
- package/dist/gateway/turns/routing/intent-classifier.js +60 -0
- package/dist/gateway/turns/routing/planner-adapter.js +91 -0
- package/dist/gateway/turns/routing/types.js +1 -0
- package/dist/gateway/turns/runtime-deps.js +228 -0
- package/dist/gateway/turns/self-config-tool.js +277 -0
- package/dist/gateway/turns/service-types.js +11 -0
- package/dist/gateway/turns/service.js +820 -0
- package/dist/gateway/turns/session-adapter.js +158 -0
- package/dist/gateway/turns/session-tool.js +49 -0
- package/dist/gateway/turns/shell-tool.js +190 -0
- package/dist/gateway/turns/skill-tool.js +239 -0
- package/dist/gateway/turns/spillover.js +201 -0
- package/dist/gateway/turns/subagent-tool.js +140 -0
- package/dist/gateway/turns/system-prompt.js +121 -0
- package/dist/gateway/turns/tool-schema.js +90 -0
- package/dist/gateway/turns/turn-utils.js +58 -0
- package/dist/gateway/turns/vision-tool.js +120 -0
- package/dist/gateway/types.js +1 -0
- package/dist/native/win32-x64/boombot-native-host.exe +0 -0
- package/dist/node_modules/@boombot/channels/handlers.d.ts +9 -0
- package/dist/node_modules/@boombot/channels/handlers.js +109 -0
- package/dist/node_modules/@boombot/channels/index.d.ts +12 -0
- package/dist/node_modules/@boombot/channels/index.js +12 -0
- package/dist/node_modules/@boombot/channels/package.json +9 -0
- package/dist/node_modules/@boombot/channels/service.d.ts +62 -0
- package/dist/node_modules/@boombot/channels/service.js +608 -0
- package/dist/node_modules/@boombot/channels/tool.d.ts +10 -0
- package/dist/node_modules/@boombot/channels/tool.js +46 -0
- package/dist/node_modules/@boombot/channels/transports/common/dedup.d.ts +17 -0
- package/dist/node_modules/@boombot/channels/transports/common/dedup.js +42 -0
- package/dist/node_modules/@boombot/channels/transports/common/handoff.d.ts +19 -0
- package/dist/node_modules/@boombot/channels/transports/common/handoff.js +32 -0
- package/dist/node_modules/@boombot/channels/transports/common/index.d.ts +3 -0
- package/dist/node_modules/@boombot/channels/transports/common/index.js +3 -0
- package/dist/node_modules/@boombot/channels/transports/common/types.d.ts +99 -0
- package/dist/node_modules/@boombot/channels/transports/common/types.js +54 -0
- package/dist/node_modules/@boombot/channels/transports/common.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/common.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/dedup/index.d.ts +1 -0
- package/dist/node_modules/@boombot/channels/transports/dedup/index.js +1 -0
- package/dist/node_modules/@boombot/channels/transports/dedup.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/dedup.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/discord/index.d.ts +1 -0
- package/dist/node_modules/@boombot/channels/transports/discord/index.js +1 -0
- package/dist/node_modules/@boombot/channels/transports/discord/transport.d.ts +36 -0
- package/dist/node_modules/@boombot/channels/transports/discord/transport.js +199 -0
- package/dist/node_modules/@boombot/channels/transports/discord.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/discord.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/handoff.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/handoff.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/messenger/index.d.ts +1 -0
- package/dist/node_modules/@boombot/channels/transports/messenger/index.js +1 -0
- package/dist/node_modules/@boombot/channels/transports/messenger/transport.d.ts +34 -0
- package/dist/node_modules/@boombot/channels/transports/messenger/transport.js +180 -0
- package/dist/node_modules/@boombot/channels/transports/messenger.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/messenger.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/slack/index.d.ts +1 -0
- package/dist/node_modules/@boombot/channels/transports/slack/index.js +1 -0
- package/dist/node_modules/@boombot/channels/transports/slack/transport.d.ts +35 -0
- package/dist/node_modules/@boombot/channels/transports/slack/transport.js +183 -0
- package/dist/node_modules/@boombot/channels/transports/slack.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/slack.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/streamer/index.d.ts +1 -0
- package/dist/node_modules/@boombot/channels/transports/streamer/index.js +1 -0
- package/dist/node_modules/@boombot/channels/transports/streamer/streamer.d.ts +31 -0
- package/dist/node_modules/@boombot/channels/transports/streamer/streamer.js +141 -0
- package/dist/node_modules/@boombot/channels/transports/streamer.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/streamer.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/telegram/index.d.ts +1 -0
- package/dist/node_modules/@boombot/channels/transports/telegram/index.js +1 -0
- package/dist/node_modules/@boombot/channels/transports/telegram/transport.d.ts +75 -0
- package/dist/node_modules/@boombot/channels/transports/telegram/transport.js +395 -0
- package/dist/node_modules/@boombot/channels/transports/telegram.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/telegram.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/tiktok/index.d.ts +1 -0
- package/dist/node_modules/@boombot/channels/transports/tiktok/index.js +1 -0
- package/dist/node_modules/@boombot/channels/transports/tiktok/transport.d.ts +27 -0
- package/dist/node_modules/@boombot/channels/transports/tiktok/transport.js +97 -0
- package/dist/node_modules/@boombot/channels/transports/tiktok.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/tiktok.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/whatsapp/index.d.ts +1 -0
- package/dist/node_modules/@boombot/channels/transports/whatsapp/index.js +1 -0
- package/dist/node_modules/@boombot/channels/transports/whatsapp/transport.d.ts +38 -0
- package/dist/node_modules/@boombot/channels/transports/whatsapp/transport.js +189 -0
- package/dist/node_modules/@boombot/channels/transports/whatsapp.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/whatsapp.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/zalo/index.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/zalo/index.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/zalo/oa.d.ts +28 -0
- package/dist/node_modules/@boombot/channels/transports/zalo/oa.js +94 -0
- package/dist/node_modules/@boombot/channels/transports/zalo/personal.d.ts +106 -0
- package/dist/node_modules/@boombot/channels/transports/zalo/personal.js +171 -0
- package/dist/node_modules/@boombot/channels/transports/zalo-personal.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/zalo-personal.js +2 -0
- package/dist/node_modules/@boombot/channels/transports/zalo.d.ts +2 -0
- package/dist/node_modules/@boombot/channels/transports/zalo.js +2 -0
- package/dist/node_modules/@boombot/core/agent-core/index.d.ts +12 -0
- package/dist/node_modules/@boombot/core/agent-core/index.js +12 -0
- package/dist/node_modules/@boombot/core/agent-core/middleware.d.ts +60 -0
- package/dist/node_modules/@boombot/core/agent-core/middleware.js +152 -0
- package/dist/node_modules/@boombot/core/agent-core/routing.d.ts +128 -0
- package/dist/node_modules/@boombot/core/agent-core/routing.js +437 -0
- package/dist/node_modules/@boombot/core/agent-core/runtime-deps.d.ts +88 -0
- package/dist/node_modules/@boombot/core/agent-core/runtime-deps.js +8 -0
- package/dist/node_modules/@boombot/core/agent-core/tool-errors.d.ts +44 -0
- package/dist/node_modules/@boombot/core/agent-core/tool-errors.js +60 -0
- package/dist/node_modules/@boombot/core/agent-core/turn-loop.d.ts +21 -0
- package/dist/node_modules/@boombot/core/agent-core/turn-loop.js +561 -0
- package/dist/node_modules/@boombot/core/agent-core/types.d.ts +189 -0
- package/dist/node_modules/@boombot/core/agent-core/types.js +7 -0
- package/dist/node_modules/@boombot/core/compaction/compactor.d.ts +19 -0
- package/dist/node_modules/@boombot/core/compaction/compactor.js +127 -0
- package/dist/node_modules/@boombot/core/compaction/estimator.d.ts +10 -0
- package/dist/node_modules/@boombot/core/compaction/estimator.js +48 -0
- package/dist/node_modules/@boombot/core/compaction/index.d.ts +3 -0
- package/dist/node_modules/@boombot/core/compaction/index.js +3 -0
- package/dist/node_modules/@boombot/core/compaction/types.d.ts +31 -0
- package/dist/node_modules/@boombot/core/compaction/types.js +7 -0
- package/dist/node_modules/@boombot/core/index.d.ts +9 -0
- package/dist/node_modules/@boombot/core/index.js +9 -0
- package/dist/node_modules/@boombot/core/jev/index.d.ts +2 -0
- package/dist/node_modules/@boombot/core/jev/index.js +2 -0
- package/dist/node_modules/@boombot/core/jev/jev.d.ts +30 -0
- package/dist/node_modules/@boombot/core/jev/jev.js +164 -0
- package/dist/node_modules/@boombot/core/jev/types.d.ts +22 -0
- package/dist/node_modules/@boombot/core/jev/types.js +1 -0
- package/dist/node_modules/@boombot/core/memory/consolidation/budget.d.ts +63 -0
- package/dist/node_modules/@boombot/core/memory/consolidation/budget.js +94 -0
- package/dist/node_modules/@boombot/core/memory/consolidation/consolidator.d.ts +152 -0
- package/dist/node_modules/@boombot/core/memory/consolidation/consolidator.js +318 -0
- package/dist/node_modules/@boombot/core/memory/consolidation/index.d.ts +12 -0
- package/dist/node_modules/@boombot/core/memory/consolidation/index.js +12 -0
- package/dist/node_modules/@boombot/core/memory/curation.d.ts +86 -0
- package/dist/node_modules/@boombot/core/memory/curation.js +120 -0
- package/dist/node_modules/@boombot/core/memory/errors.d.ts +12 -0
- package/dist/node_modules/@boombot/core/memory/errors.js +20 -0
- package/dist/node_modules/@boombot/core/memory/hybrid-search.d.ts +29 -0
- package/dist/node_modules/@boombot/core/memory/hybrid-search.js +52 -0
- package/dist/node_modules/@boombot/core/memory/index.d.ts +23 -0
- package/dist/node_modules/@boombot/core/memory/index.js +23 -0
- package/dist/node_modules/@boombot/core/memory/indexer.d.ts +47 -0
- package/dist/node_modules/@boombot/core/memory/indexer.js +138 -0
- package/dist/node_modules/@boombot/core/memory/lifecycle.d.ts +12 -0
- package/dist/node_modules/@boombot/core/memory/lifecycle.js +66 -0
- package/dist/node_modules/@boombot/core/memory/provider.d.ts +84 -0
- package/dist/node_modules/@boombot/core/memory/provider.js +117 -0
- package/dist/node_modules/@boombot/core/memory/recall.d.ts +7 -0
- package/dist/node_modules/@boombot/core/memory/recall.js +111 -0
- package/dist/node_modules/@boombot/core/memory/scope-resolver.d.ts +27 -0
- package/dist/node_modules/@boombot/core/memory/scope-resolver.js +60 -0
- package/dist/node_modules/@boombot/core/memory/search.d.ts +37 -0
- package/dist/node_modules/@boombot/core/memory/search.js +158 -0
- package/dist/node_modules/@boombot/core/memory/store.d.ts +60 -0
- package/dist/node_modules/@boombot/core/memory/store.js +289 -0
- package/dist/node_modules/@boombot/core/memory/types.d.ts +121 -0
- package/dist/node_modules/@boombot/core/memory/types.js +21 -0
- package/dist/node_modules/@boombot/core/memory/vector-index.d.ts +34 -0
- package/dist/node_modules/@boombot/core/memory/vector-index.js +65 -0
- package/dist/node_modules/@boombot/core/package.json +9 -0
- package/dist/node_modules/@boombot/core/reflection/classifier.d.ts +13 -0
- package/dist/node_modules/@boombot/core/reflection/classifier.js +77 -0
- package/dist/node_modules/@boombot/core/reflection/index.d.ts +2 -0
- package/dist/node_modules/@boombot/core/reflection/index.js +2 -0
- package/dist/node_modules/@boombot/core/reflection/types.d.ts +13 -0
- package/dist/node_modules/@boombot/core/reflection/types.js +4 -0
- package/dist/node_modules/@boombot/core/research/config.d.ts +89 -0
- package/dist/node_modules/@boombot/core/research/config.js +206 -0
- package/dist/node_modules/@boombot/core/research/crawl.d.ts +36 -0
- package/dist/node_modules/@boombot/core/research/crawl.js +179 -0
- package/dist/node_modules/@boombot/core/research/factory.d.ts +26 -0
- package/dist/node_modules/@boombot/core/research/factory.js +46 -0
- package/dist/node_modules/@boombot/core/research/http.d.ts +87 -0
- package/dist/node_modules/@boombot/core/research/http.js +250 -0
- package/dist/node_modules/@boombot/core/research/index.d.ts +17 -0
- package/dist/node_modules/@boombot/core/research/index.js +10 -0
- package/dist/node_modules/@boombot/core/research/orchestrator.d.ts +113 -0
- package/dist/node_modules/@boombot/core/research/orchestrator.js +252 -0
- package/dist/node_modules/@boombot/core/research/parse/docx.d.ts +24 -0
- package/dist/node_modules/@boombot/core/research/parse/docx.js +183 -0
- package/dist/node_modules/@boombot/core/research/parse/guards.d.ts +89 -0
- package/dist/node_modules/@boombot/core/research/parse/guards.js +171 -0
- package/dist/node_modules/@boombot/core/research/parse/index.d.ts +68 -0
- package/dist/node_modules/@boombot/core/research/parse/index.js +219 -0
- package/dist/node_modules/@boombot/core/research/parse/pdf.d.ts +38 -0
- package/dist/node_modules/@boombot/core/research/parse/pdf.js +567 -0
- package/dist/node_modules/@boombot/core/research/providers/arxiv.d.ts +9 -0
- package/dist/node_modules/@boombot/core/research/providers/arxiv.js +72 -0
- package/dist/node_modules/@boombot/core/research/providers/brave.d.ts +11 -0
- package/dist/node_modules/@boombot/core/research/providers/brave.js +36 -0
- package/dist/node_modules/@boombot/core/research/providers/duckduckgo.d.ts +9 -0
- package/dist/node_modules/@boombot/core/research/providers/duckduckgo.js +78 -0
- package/dist/node_modules/@boombot/core/research/providers/exa.d.ts +11 -0
- package/dist/node_modules/@boombot/core/research/providers/exa.js +34 -0
- package/dist/node_modules/@boombot/core/research/providers/firecrawl.d.ts +16 -0
- package/dist/node_modules/@boombot/core/research/providers/firecrawl.js +47 -0
- package/dist/node_modules/@boombot/core/research/providers/index.d.ts +17 -0
- package/dist/node_modules/@boombot/core/research/providers/index.js +11 -0
- package/dist/node_modules/@boombot/core/research/providers/jina.d.ts +13 -0
- package/dist/node_modules/@boombot/core/research/providers/jina.js +114 -0
- package/dist/node_modules/@boombot/core/research/providers/openalex.d.ts +14 -0
- package/dist/node_modules/@boombot/core/research/providers/openalex.js +66 -0
- package/dist/node_modules/@boombot/core/research/providers/semantic-scholar.d.ts +9 -0
- package/dist/node_modules/@boombot/core/research/providers/semantic-scholar.js +56 -0
- package/dist/node_modules/@boombot/core/research/providers/tavily.d.ts +11 -0
- package/dist/node_modules/@boombot/core/research/providers/tavily.js +35 -0
- package/dist/node_modules/@boombot/core/research/providers/wikipedia.d.ts +12 -0
- package/dist/node_modules/@boombot/core/research/providers/wikipedia.js +47 -0
- package/dist/node_modules/@boombot/core/research/tools.d.ts +27 -0
- package/dist/node_modules/@boombot/core/research/tools.js +251 -0
- package/dist/node_modules/@boombot/core/research/types.d.ts +133 -0
- package/dist/node_modules/@boombot/core/research/types.js +8 -0
- package/dist/node_modules/@boombot/core/research/wiring.d.ts +25 -0
- package/dist/node_modules/@boombot/core/research/wiring.js +51 -0
- package/dist/node_modules/@boombot/core/scheduler/cron.d.ts +34 -0
- package/dist/node_modules/@boombot/core/scheduler/cron.js +147 -0
- package/dist/node_modules/@boombot/core/scheduler/evaluator.d.ts +42 -0
- package/dist/node_modules/@boombot/core/scheduler/evaluator.js +148 -0
- package/dist/node_modules/@boombot/core/scheduler/index.d.ts +15 -0
- package/dist/node_modules/@boombot/core/scheduler/index.js +15 -0
- package/dist/node_modules/@boombot/core/scheduler/registry.d.ts +81 -0
- package/dist/node_modules/@boombot/core/scheduler/registry.js +263 -0
- package/dist/node_modules/@boombot/core/scheduler/runner.d.ts +59 -0
- package/dist/node_modules/@boombot/core/scheduler/runner.js +257 -0
- package/dist/node_modules/@boombot/core/scheduler/store.d.ts +150 -0
- package/dist/node_modules/@boombot/core/scheduler/store.js +526 -0
- package/dist/node_modules/@boombot/core/scheduler/timezone.d.ts +35 -0
- package/dist/node_modules/@boombot/core/scheduler/timezone.js +96 -0
- package/dist/node_modules/@boombot/core/scheduler/types.d.ts +157 -0
- package/dist/node_modules/@boombot/core/scheduler/types.js +89 -0
- package/dist/node_modules/@boombot/core/task-runner/index.d.ts +7 -0
- package/dist/node_modules/@boombot/core/task-runner/index.js +5 -0
- package/dist/node_modules/@boombot/core/task-runner/planner.d.ts +37 -0
- package/dist/node_modules/@boombot/core/task-runner/planner.js +154 -0
- package/dist/node_modules/@boombot/core/task-runner/runner.d.ts +8 -0
- package/dist/node_modules/@boombot/core/task-runner/runner.js +564 -0
- package/dist/node_modules/@boombot/core/task-runner/store.d.ts +28 -0
- package/dist/node_modules/@boombot/core/task-runner/store.js +126 -0
- package/dist/node_modules/@boombot/core/task-runner/types.d.ts +138 -0
- package/dist/node_modules/@boombot/core/task-runner/types.js +11 -0
- package/dist/node_modules/@boombot/core/workflow/dag.d.ts +16 -0
- package/dist/node_modules/@boombot/core/workflow/dag.js +109 -0
- package/dist/node_modules/@boombot/core/workflow/engine.d.ts +34 -0
- package/dist/node_modules/@boombot/core/workflow/engine.js +304 -0
- package/dist/node_modules/@boombot/core/workflow/index.d.ts +3 -0
- package/dist/node_modules/@boombot/core/workflow/index.js +3 -0
- package/dist/node_modules/@boombot/core/workflow/types.d.ts +98 -0
- package/dist/node_modules/@boombot/core/workflow/types.js +21 -0
- package/dist/node_modules/@boombot/cronjobs/handlers.d.ts +11 -0
- package/dist/node_modules/@boombot/cronjobs/handlers.js +174 -0
- package/dist/node_modules/@boombot/cronjobs/index.d.ts +2 -0
- package/dist/node_modules/@boombot/cronjobs/index.js +2 -0
- package/dist/node_modules/@boombot/cronjobs/package.json +9 -0
- package/dist/node_modules/@boombot/cronjobs/service.d.ts +53 -0
- package/dist/node_modules/@boombot/cronjobs/service.js +200 -0
- package/dist/node_modules/@boombot/plugins/index.d.ts +2 -0
- package/dist/node_modules/@boombot/plugins/index.js +2 -0
- package/dist/node_modules/@boombot/plugins/installer.d.ts +45 -0
- package/dist/node_modules/@boombot/plugins/installer.js +487 -0
- package/dist/node_modules/@boombot/plugins/manager.d.ts +23 -0
- package/dist/node_modules/@boombot/plugins/manager.js +243 -0
- package/dist/node_modules/@boombot/plugins/package.json +9 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-channels.d.ts +125 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-channels.js +76 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-plugins.d.ts +220 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-plugins.js +60 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-scheduler.d.ts +33 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/commands-scheduler.js +25 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/commands.d.ts +4349 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/commands.js +563 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/envelope.d.ts +32 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/envelope.js +61 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/errors.d.ts +13 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/errors.js +16 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/events.d.ts +567 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/events.js +395 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/index.d.ts +20 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/index.js +13 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/types.d.ts +91 -0
- package/dist/node_modules/@boombot/protocol/gateway-protocol/types.js +7 -0
- package/dist/node_modules/@boombot/protocol/index.d.ts +4 -0
- package/dist/node_modules/@boombot/protocol/index.js +3 -0
- package/dist/node_modules/@boombot/protocol/package.json +9 -0
- package/dist/node_modules/@boombot/protocol/plugin-sdk/channel.d.ts +41 -0
- package/dist/node_modules/@boombot/protocol/plugin-sdk/channel.js +17 -0
- package/dist/node_modules/@boombot/protocol/plugin-sdk/index.d.ts +10 -0
- package/dist/node_modules/@boombot/protocol/plugin-sdk/index.js +10 -0
- package/dist/node_modules/@boombot/protocol/plugin-sdk/manifest.d.ts +58 -0
- package/dist/node_modules/@boombot/protocol/plugin-sdk/manifest.js +116 -0
- package/dist/node_modules/@boombot/protocol/plugin-sdk/plugin.d.ts +25 -0
- package/dist/node_modules/@boombot/protocol/plugin-sdk/plugin.js +1 -0
- package/dist/node_modules/@boombot/protocol/providers/cipher.d.ts +7 -0
- package/dist/node_modules/@boombot/protocol/providers/cipher.js +52 -0
- package/dist/node_modules/@boombot/protocol/providers/index.d.ts +19 -0
- package/dist/node_modules/@boombot/protocol/providers/index.js +19 -0
- package/dist/node_modules/@boombot/protocol/providers/key-roulette.d.ts +79 -0
- package/dist/node_modules/@boombot/protocol/providers/key-roulette.js +81 -0
- package/dist/node_modules/@boombot/protocol/providers/probe.d.ts +29 -0
- package/dist/node_modules/@boombot/protocol/providers/probe.js +96 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/anthropic.d.ts +11 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/anthropic.js +11 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/custom.d.ts +22 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/custom.js +222 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/deepseek.d.ts +7 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/deepseek.js +9 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/google.d.ts +10 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/google.js +10 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/index.d.ts +31 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/index.js +56 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/local.d.ts +10 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/local.js +11 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/mistral.d.ts +7 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/mistral.js +9 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/openai-compatible.d.ts +10 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/openai-compatible.js +10 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/openai.d.ts +7 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/openai.js +11 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/types.d.ts +58 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/types.js +1 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/xai.d.ts +7 -0
- package/dist/node_modules/@boombot/protocol/providers/profiles/xai.js +10 -0
- package/dist/node_modules/@boombot/protocol/providers/request-profile.d.ts +102 -0
- package/dist/node_modules/@boombot/protocol/providers/request-profile.js +118 -0
- package/dist/node_modules/@boombot/protocol/providers/service.d.ts +2 -0
- package/dist/node_modules/@boombot/protocol/providers/service.js +418 -0
- package/dist/node_modules/@boombot/protocol/providers/types.d.ts +141 -0
- package/dist/node_modules/@boombot/protocol/providers/types.js +16 -0
- package/dist/node_modules/@boombot/sandbox/fs-path.d.ts +13 -0
- package/dist/node_modules/@boombot/sandbox/fs-path.js +79 -0
- package/dist/node_modules/@boombot/sandbox/index.d.ts +13 -0
- package/dist/node_modules/@boombot/sandbox/index.js +13 -0
- package/dist/node_modules/@boombot/sandbox/native.d.ts +39 -0
- package/dist/node_modules/@boombot/sandbox/native.js +224 -0
- package/dist/node_modules/@boombot/sandbox/package.json +9 -0
- package/dist/node_modules/@boombot/sandbox/sandbox.d.ts +92 -0
- package/dist/node_modules/@boombot/sandbox/sandbox.js +229 -0
- package/dist/node_modules/@boombot/security/harness-guard/boundary.d.ts +22 -0
- package/dist/node_modules/@boombot/security/harness-guard/boundary.js +105 -0
- package/dist/node_modules/@boombot/security/harness-guard/gates.d.ts +90 -0
- package/dist/node_modules/@boombot/security/harness-guard/gates.js +791 -0
- package/dist/node_modules/@boombot/security/harness-guard/index.d.ts +23 -0
- package/dist/node_modules/@boombot/security/harness-guard/index.js +23 -0
- package/dist/node_modules/@boombot/security/harness-guard/policy.d.ts +20 -0
- package/dist/node_modules/@boombot/security/harness-guard/policy.js +70 -0
- package/dist/node_modules/@boombot/security/harness-guard/sanitizer.d.ts +53 -0
- package/dist/node_modules/@boombot/security/harness-guard/sanitizer.js +145 -0
- package/dist/node_modules/@boombot/security/harness-guard/types.d.ts +71 -0
- package/dist/node_modules/@boombot/security/harness-guard/types.js +10 -0
- package/dist/node_modules/@boombot/security/harness-guard/verifier.d.ts +59 -0
- package/dist/node_modules/@boombot/security/harness-guard/verifier.js +169 -0
- package/dist/node_modules/@boombot/security/index.d.ts +5 -0
- package/dist/node_modules/@boombot/security/index.js +9 -0
- package/dist/node_modules/@boombot/security/package.json +9 -0
- package/dist/node_modules/@boombot/security/policy/approval.d.ts +117 -0
- package/dist/node_modules/@boombot/security/policy/approval.js +223 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/claim-extractor.d.ts +10 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/claim-extractor.js +124 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/evidence-ledger.d.ts +25 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/evidence-ledger.js +70 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/gate.d.ts +38 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/gate.js +61 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/grounding-check.d.ts +12 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/grounding-check.js +234 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/index.d.ts +17 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/index.js +13 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/policy.d.ts +15 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/policy.js +39 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/types.d.ts +46 -0
- package/dist/node_modules/@boombot/security/reasoning-guard/types.js +7 -0
- package/dist/node_modules/@boombot/security/security/approval.d.ts +63 -0
- package/dist/node_modules/@boombot/security/security/approval.js +140 -0
- package/dist/node_modules/@boombot/security/security/audit.d.ts +39 -0
- package/dist/node_modules/@boombot/security/security/audit.js +70 -0
- package/dist/node_modules/@boombot/security/security/index.d.ts +12 -0
- package/dist/node_modules/@boombot/security/security/index.js +12 -0
- package/dist/node_modules/@boombot/security/security/trust.d.ts +79 -0
- package/dist/node_modules/@boombot/security/security/trust.js +87 -0
- package/dist/package.json +5 -0
- package/dist/proto/agent_core.proto +56 -0
- package/dist/python/agent-core-python/pyproject.toml +40 -0
- package/dist/python/agent-core-python/src/boombot_agent/__init__.py +5 -0
- package/dist/python/agent-core-python/src/boombot_agent/generated/__init__.py +0 -0
- package/dist/python/agent-core-python/src/boombot_agent/generated/agent_core_pb2.py +54 -0
- package/dist/python/agent-core-python/src/boombot_agent/generated/agent_core_pb2_grpc.py +140 -0
- package/dist/python/agent-core-python/src/boombot_agent/rpc.py +265 -0
- package/dist/python/agent-core-python/src/boombot_agent/turn.py +577 -0
- package/dist/python/agent-core-python/src/boombot_ml/__init__.py +12 -0
- package/dist/python/agent-core-python/src/boombot_ml/embeddings.py +58 -0
- package/dist/python/agent-core-python/src/boombot_ml/training.py +156 -0
- package/dist/python/agent-core-python/uv.lock +2856 -0
- package/dist/web/assets/ChatView-BZrSD-64.js +262 -0
- package/dist/web/assets/ChatView-Cahbjez6.css +1 -0
- package/dist/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/web/assets/MemoryView-BJbXqqs7.css +1 -0
- package/dist/web/assets/MemoryView-BfMq_6CD.js +1 -0
- package/dist/web/assets/SchedulesView-B22QmPR-.js +1 -0
- package/dist/web/assets/SchedulesView-C6XK7A8a.css +1 -0
- package/dist/web/assets/SessionsView-C1dqdhxI.css +1 -0
- package/dist/web/assets/SessionsView-DS0-aH2a.js +1 -0
- package/dist/web/assets/TasksView-Dtasg4hd.css +1 -0
- package/dist/web/assets/TasksView-ey0FLsW8.js +2 -0
- package/dist/web/assets/Textarea-DN3Zybl1.js +1 -0
- package/dist/web/assets/Tooltip-Bn2cqFPz.css +1 -0
- package/dist/web/assets/Tooltip-MzV2Gqnc.js +1 -0
- package/dist/web/assets/browser-Bnt73-Ub.js +8 -0
- package/dist/web/assets/index-BL8bi7Yt.css +1 -0
- package/dist/web/assets/index-CuPR73Tn.js +73 -0
- package/dist/web/favicon.svg +4 -0
- package/dist/web/index.html +26 -0
- package/dist/web/logo.jpg +0 -0
- package/dist/web/logo.png +0 -0
- 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,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
|
+
}
|