@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,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register every command handler on the gateway registry.
|
|
3
|
+
*
|
|
4
|
+
* Each domain executor owns its `register*Handlers` function; this module is
|
|
5
|
+
* the coordinator-owned assembly point. Handler modules were built against
|
|
6
|
+
* minimal structural registry interfaces, so small adapters live here:
|
|
7
|
+
*
|
|
8
|
+
* - providers: `registerProviderHandlers` needs `{ register, providerService }`
|
|
9
|
+
* (F's interface carries the service on the registry object).
|
|
10
|
+
*/
|
|
11
|
+
import { registerChannelHandlers } from '@boombot/channels';
|
|
12
|
+
import { registerScheduleHandlers } from '@boombot/cronjobs';
|
|
13
|
+
import { registerMemoryHandlers } from './memory.js';
|
|
14
|
+
import { registerProviderHandlers } from './providers.js';
|
|
15
|
+
import { registerSessionHandlers } from './sessions.js';
|
|
16
|
+
import { registerSystemHandlers } from './system.js';
|
|
17
|
+
import { registerTaskHandlers } from './tasks.js';
|
|
18
|
+
import { registerTurnHandlers } from './turn.js';
|
|
19
|
+
/**
|
|
20
|
+
* Register all command handlers. Services must already be started
|
|
21
|
+
* (see `services.ts`): handlers read them from `ctx` (or module singletons
|
|
22
|
+
* for providers/channels, as those executors designed).
|
|
23
|
+
*/
|
|
24
|
+
export function registerAllHandlers(ctx, registry) {
|
|
25
|
+
registerTurnHandlers(registry);
|
|
26
|
+
registerSessionHandlers(registry);
|
|
27
|
+
registerSystemHandlers(registry);
|
|
28
|
+
registerScheduleHandlers(registry);
|
|
29
|
+
registerMemoryHandlers(registry);
|
|
30
|
+
// E's channel handlers take `(payload)`; A's dispatch calls
|
|
31
|
+
// `(ctx, payload, meta)`. Wrap instead of casting so `channel.pair`
|
|
32
|
+
// / `channel.unpair` receive the real payload (dispatch already
|
|
33
|
+
// validated it against COMMAND_SCHEMAS).
|
|
34
|
+
registerChannelHandlers({
|
|
35
|
+
register(type, handler) {
|
|
36
|
+
const wrapped = (_ctx, payload) => handler(payload);
|
|
37
|
+
registry.register(type, wrapped);
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
const providerService = ctx.providerService;
|
|
41
|
+
if (providerService === undefined) {
|
|
42
|
+
ctx.log('warn', 'provider service not started: provider.* commands unavailable');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// F's registry interface is generic over command types and its handlers
|
|
46
|
+
// take `(payload)`. The adapter below forwards to A's concrete registry;
|
|
47
|
+
// dispatch validates payloads/responses against the protocol schemas at
|
|
48
|
+
// runtime, so the shapes always line up.
|
|
49
|
+
registerProviderHandlers({
|
|
50
|
+
providerService,
|
|
51
|
+
register(type, handler) {
|
|
52
|
+
const wrapped = (_ctx, payload) => handler(payload);
|
|
53
|
+
registry.register(type, wrapped);
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
// Background task runner handlers (additive). The task handlers read
|
|
57
|
+
// `ctx.taskService` at dispatch time and throw a clear error when it is
|
|
58
|
+
// missing; the check below only skips registration for boot-time clarity
|
|
59
|
+
// and never affects the providers registered above.
|
|
60
|
+
if (ctx.taskService === undefined) {
|
|
61
|
+
ctx.log('warn', 'task service not started: task.* commands unavailable');
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
registerTaskHandlers(registry);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command handlers for the memory surface: `memory.search` and the additive
|
|
3
|
+
* `memory.note` command from `@boombot/protocol`.
|
|
4
|
+
*
|
|
5
|
+
* `registerMemoryHandlers(registry)` wires both handlers. The registry is
|
|
6
|
+
* kept structural and minimal on purpose — the real dispatch registry
|
|
7
|
+
* (executor A) only needs to satisfy:
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* interface CommandHandlerRegistry {
|
|
11
|
+
* handle(
|
|
12
|
+
* type: string,
|
|
13
|
+
* handler: (payload: unknown, ctx: MemoryHandlerContext) => Promise<unknown>,
|
|
14
|
+
* ): void;
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Handlers validate payloads against the protocol zod schemas and validate
|
|
19
|
+
* their responses the same way before returning, so a schema drift fails
|
|
20
|
+
* loudly here instead of on the client.
|
|
21
|
+
*
|
|
22
|
+
* When `ctx.memoryService` is absent (service failed to start), handlers
|
|
23
|
+
* throw a clear error — the dispatch layer maps it to an error response and
|
|
24
|
+
* the turn loop degrades (executor B treats a missing/failed recall as
|
|
25
|
+
* "no memories", never as a turn failure).
|
|
26
|
+
*/
|
|
27
|
+
import { COMMAND_SCHEMAS } from "@boombot/protocol";
|
|
28
|
+
const searchPayload = COMMAND_SCHEMAS["memory.search"].payload;
|
|
29
|
+
const searchResponse = COMMAND_SCHEMAS["memory.search"].response;
|
|
30
|
+
const notePayload = COMMAND_SCHEMAS["memory.note"].payload;
|
|
31
|
+
const noteResponse = COMMAND_SCHEMAS["memory.note"].response;
|
|
32
|
+
function requireService(ctx) {
|
|
33
|
+
const service = ctx.memoryService;
|
|
34
|
+
if (service === undefined) {
|
|
35
|
+
throw new Error("memory service is not started");
|
|
36
|
+
}
|
|
37
|
+
return service;
|
|
38
|
+
}
|
|
39
|
+
async function handleMemorySearch(ctx, payload) {
|
|
40
|
+
const { query, limit } = searchPayload.parse(payload);
|
|
41
|
+
const service = requireService(ctx);
|
|
42
|
+
const results = await service.search(query, { limit });
|
|
43
|
+
return searchResponse.parse({ results });
|
|
44
|
+
}
|
|
45
|
+
async function handleMemoryNote(ctx, payload) {
|
|
46
|
+
const { text, meta } = notePayload.parse(payload);
|
|
47
|
+
const { id } = await requireService(ctx).note(text, meta);
|
|
48
|
+
return noteResponse.parse({ ok: true, id });
|
|
49
|
+
}
|
|
50
|
+
/** Register the memory command handlers on the gateway registry. */
|
|
51
|
+
export function registerMemoryHandlers(registry) {
|
|
52
|
+
registry.register("memory.search", handleMemorySearch);
|
|
53
|
+
registry.register("memory.note", handleMemoryNote);
|
|
54
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `provider.*` command handlers for the gateway.
|
|
3
|
+
*
|
|
4
|
+
* Each handler validates against the wire schemas in
|
|
5
|
+
* `@boombot/protocol` and delegates to the `ProviderService` booted
|
|
6
|
+
* by `services/providers.ts`. Responses follow the protocol exactly:
|
|
7
|
+
*
|
|
8
|
+
* - `provider.list` → `{ providers }` (wire `providerSchema`; keys never echoed)
|
|
9
|
+
* - `provider.save` → `{ provider }` (`apiKey` in the payload is write-only)
|
|
10
|
+
* - `provider.test` → `{ ok, latencyMs, detail? }`; runs a REAL probe and, on
|
|
11
|
+
* success, stores the discovered model list on the provider record.
|
|
12
|
+
* - `provider.activate` → `{ provider }` (exactly one active provider)
|
|
13
|
+
* - `provider.delete` → `{ ok: true }`
|
|
14
|
+
*
|
|
15
|
+
* The web client (`apps/web/src/gateway/client.ts`) maps `provider.test`'s
|
|
16
|
+
* `detail` to its `error` field — this file keeps that contract.
|
|
17
|
+
*/
|
|
18
|
+
import { providerInputSchema, ProtocolError, probeProvider, } from "@boombot/protocol";
|
|
19
|
+
export function registerProviderHandlers(registry) {
|
|
20
|
+
const service = registry.providerService;
|
|
21
|
+
registry.register("provider.list", async () => ({
|
|
22
|
+
providers: await service.list(),
|
|
23
|
+
}));
|
|
24
|
+
registry.register("provider.save", async (payload) => {
|
|
25
|
+
const parsed = providerInputSchema.safeParse(payload.provider);
|
|
26
|
+
if (!parsed.success) {
|
|
27
|
+
throw new ProtocolError("INVALID_PAYLOAD", `Invalid provider.save payload: ${parsed.error.message}`, { type: "provider.save", issues: parsed.error.issues });
|
|
28
|
+
}
|
|
29
|
+
return { provider: await service.save(parsed.data) };
|
|
30
|
+
});
|
|
31
|
+
registry.register("provider.test", async (payload) => {
|
|
32
|
+
const provider = (await service.list()).find((p) => p.id === payload.id);
|
|
33
|
+
if (!provider) {
|
|
34
|
+
return {
|
|
35
|
+
ok: false,
|
|
36
|
+
latencyMs: 0,
|
|
37
|
+
detail: `Provider '${payload.id}' not found.`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
const apiKey = await service.getApiKey(payload.id);
|
|
41
|
+
const startedAt = Date.now();
|
|
42
|
+
const probe = await probeProvider({ kind: provider.kind, baseUrl: provider.baseUrl }, apiKey ?? undefined);
|
|
43
|
+
const latencyMs = Date.now() - startedAt;
|
|
44
|
+
if (probe.ok) {
|
|
45
|
+
// Persist discovered models so resolveLlm() has a default model.
|
|
46
|
+
if (probe.models && probe.models.length > 0) {
|
|
47
|
+
await service.save({
|
|
48
|
+
id: provider.id,
|
|
49
|
+
name: provider.name,
|
|
50
|
+
kind: provider.kind,
|
|
51
|
+
...(provider.baseUrl ? { baseUrl: provider.baseUrl } : {}),
|
|
52
|
+
models: probe.models,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const count = probe.models?.length ?? 0;
|
|
56
|
+
return {
|
|
57
|
+
ok: true,
|
|
58
|
+
latencyMs,
|
|
59
|
+
detail: count > 0
|
|
60
|
+
? `${count} model${count === 1 ? "" : "s"} available: ${probe.models?.slice(0, 5).join(", ")}${count > 5 ? ", …" : ""}`
|
|
61
|
+
: "Probe succeeded.",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return { ok: false, latencyMs, detail: probe.error ?? "Probe failed." };
|
|
65
|
+
});
|
|
66
|
+
registry.register("provider.activate", async (payload) => ({
|
|
67
|
+
provider: await service.activate(payload.id),
|
|
68
|
+
}));
|
|
69
|
+
registry.register("provider.delete", async (payload) => {
|
|
70
|
+
await service.delete(payload.id);
|
|
71
|
+
return { ok: true };
|
|
72
|
+
});
|
|
73
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { parseCommand, parseCommandResponse, ProtocolError } from '@boombot/protocol';
|
|
2
|
+
/**
|
|
3
|
+
* Command handler registry for `POST /v1/commands`.
|
|
4
|
+
*
|
|
5
|
+
* `dispatch` runs three steps, all driven by the protocol package
|
|
6
|
+
* (`@boombot/protocol`):
|
|
7
|
+
* 1. Validate the envelope payload against `COMMAND_SCHEMAS` (`parseCommand`).
|
|
8
|
+
* Unknown command types and schema violations throw `ProtocolError`.
|
|
9
|
+
* 2. Call the registered handler for the command type. A known command with
|
|
10
|
+
* no handler is also an `UNKNOWN_COMMAND` error (fail closed).
|
|
11
|
+
* 3. Validate the handler's response with `parseCommandResponse` so a buggy
|
|
12
|
+
* handler can never put an off-contract body on the wire.
|
|
13
|
+
*
|
|
14
|
+
* The server maps `ProtocolError` to a 400 error envelope; unexpected handler
|
|
15
|
+
* failures become 500.
|
|
16
|
+
*/
|
|
17
|
+
export class HandlerRegistry {
|
|
18
|
+
handlers = new Map();
|
|
19
|
+
register(type, handler) {
|
|
20
|
+
if (this.handlers.has(type)) {
|
|
21
|
+
throw new Error(`Handler already registered for command type "${type}"`);
|
|
22
|
+
}
|
|
23
|
+
this.handlers.set(type, handler);
|
|
24
|
+
}
|
|
25
|
+
async dispatch(type, ctx, payload, meta) {
|
|
26
|
+
const parsed = parseCommand({
|
|
27
|
+
protocolVersion: 1,
|
|
28
|
+
requestId: meta.requestId,
|
|
29
|
+
type,
|
|
30
|
+
payload,
|
|
31
|
+
});
|
|
32
|
+
const handler = this.handlers.get(parsed.type);
|
|
33
|
+
if (!handler) {
|
|
34
|
+
throw new ProtocolError('UNKNOWN_COMMAND', `No handler registered for command "${parsed.type}"`, { type: parsed.type });
|
|
35
|
+
}
|
|
36
|
+
const result = await handler(ctx, parsed.payload, meta);
|
|
37
|
+
return parseCommandResponse(parsed.type, result);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `session.*` command handlers — backed by the durable `SessionStore`.
|
|
3
|
+
*
|
|
4
|
+
* Shapes follow `packages/gateway-protocol` v1 exactly:
|
|
5
|
+
* - `session.list` → `{ sessions }`
|
|
6
|
+
* - `session.create` → `{ session }`
|
|
7
|
+
* - `session.rename` → `{ session }`
|
|
8
|
+
* - `session.delete` → `{ ok }`
|
|
9
|
+
* - `session.checkpoint` → `{ message }` (P1-6: mark a context checkpoint;
|
|
10
|
+
* prompt projection drops everything before the newest checkpoint)
|
|
11
|
+
* - `session.variant.create` → `{ variant }` (P2-3: store an alternate
|
|
12
|
+
* content at a message position)
|
|
13
|
+
* - `session.variant.select` → `{ message }` (P2-3: choose the active
|
|
14
|
+
* variant; history reads and the prompt use it)
|
|
15
|
+
* - `session.variant.list` → `{ variants }` (P2-3: every variant at a position)
|
|
16
|
+
*/
|
|
17
|
+
import { ProtocolError } from '@boombot/protocol';
|
|
18
|
+
import { SessionNotFoundError, VariantNotFoundError } from '../sessions.js';
|
|
19
|
+
export function registerSessionHandlers(registry) {
|
|
20
|
+
registry.register('session.list', async (ctx) => {
|
|
21
|
+
const list = ctx.sessions.list();
|
|
22
|
+
return { sessions: list.filter((s) => !s.id.startsWith('sch_sess_')) };
|
|
23
|
+
});
|
|
24
|
+
registry.register('session.get', async (ctx, payload) => {
|
|
25
|
+
const sessionId = payload.sessionId;
|
|
26
|
+
const session = ctx.sessions.get(sessionId);
|
|
27
|
+
if (!session) {
|
|
28
|
+
throw new ProtocolError('SESSION_NOT_FOUND', `Session not found: ${sessionId}`, { sessionId });
|
|
29
|
+
}
|
|
30
|
+
return { session, messages: ctx.sessions.getMessages(sessionId) };
|
|
31
|
+
});
|
|
32
|
+
registry.register('session.create', async (ctx, payload) => {
|
|
33
|
+
const title = typeof payload === 'object' && payload !== null
|
|
34
|
+
? payload['title']
|
|
35
|
+
: undefined;
|
|
36
|
+
const session = ctx.sessions.create(typeof title === 'string' && title.length > 0 ? title : undefined);
|
|
37
|
+
return { session };
|
|
38
|
+
});
|
|
39
|
+
registry.register('session.rename', async (ctx, payload) => {
|
|
40
|
+
const record = typeof payload === 'object' && payload !== null
|
|
41
|
+
? payload
|
|
42
|
+
: undefined;
|
|
43
|
+
const sessionId = record?.['sessionId'];
|
|
44
|
+
const title = record?.['title'];
|
|
45
|
+
if (typeof sessionId !== 'string' || sessionId.length === 0) {
|
|
46
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'session.rename requires payload { sessionId, title }.');
|
|
47
|
+
}
|
|
48
|
+
if (typeof title !== 'string' || title.trim().length === 0) {
|
|
49
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'session.rename requires payload { sessionId, title }.');
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
return { session: ctx.sessions.rename(sessionId, title.trim()) };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (error instanceof SessionNotFoundError) {
|
|
56
|
+
throw new ProtocolError('SESSION_NOT_FOUND', error.message, { sessionId });
|
|
57
|
+
}
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
registry.register('session.undo', async (ctx, payload) => {
|
|
62
|
+
const sessionId = readSessionId('session.undo', payload);
|
|
63
|
+
try {
|
|
64
|
+
return { removedCount: ctx.sessions.undoLastExchange(sessionId) };
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error instanceof SessionNotFoundError) {
|
|
68
|
+
throw new ProtocolError('SESSION_NOT_FOUND', error.message, { sessionId });
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
registry.register('session.branch', async (ctx, payload) => {
|
|
74
|
+
const sessionId = readSessionId('session.branch', payload);
|
|
75
|
+
const title = payload['title'];
|
|
76
|
+
if (title !== undefined && (typeof title !== 'string' || title.trim() === '')) {
|
|
77
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'session.branch title must be non-empty when provided');
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return { session: ctx.sessions.branch(sessionId, typeof title === 'string' ? title : undefined) };
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error instanceof SessionNotFoundError) {
|
|
84
|
+
throw new ProtocolError('SESSION_NOT_FOUND', error.message, { sessionId });
|
|
85
|
+
}
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
registry.register('session.delete', async (ctx, payload) => {
|
|
90
|
+
const sessionId = readSessionId('session.delete', payload);
|
|
91
|
+
ctx.sessions.delete(sessionId);
|
|
92
|
+
return { ok: true };
|
|
93
|
+
});
|
|
94
|
+
registry.register('session.checkpoint', async (ctx, payload) => {
|
|
95
|
+
const record = typeof payload === 'object' && payload !== null
|
|
96
|
+
? payload
|
|
97
|
+
: undefined;
|
|
98
|
+
const sessionId = readSessionId('session.checkpoint', payload);
|
|
99
|
+
const messageId = record?.['messageId'];
|
|
100
|
+
if (messageId !== undefined && (typeof messageId !== 'string' || messageId.length === 0)) {
|
|
101
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'session.checkpoint: messageId must be a non-empty string when provided.');
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
return {
|
|
105
|
+
message: ctx.sessions.markCheckpoint(sessionId, typeof messageId === 'string' ? messageId : undefined),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof SessionNotFoundError) {
|
|
110
|
+
throw new ProtocolError('SESSION_NOT_FOUND', error.message, { sessionId });
|
|
111
|
+
}
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
registry.register('session.variant.create', async (ctx, payload) => {
|
|
116
|
+
const record = typeof payload === 'object' && payload !== null
|
|
117
|
+
? payload
|
|
118
|
+
: undefined;
|
|
119
|
+
const sessionId = readSessionId('session.variant.create', payload);
|
|
120
|
+
const messageId = readMessageId('session.variant.create', record);
|
|
121
|
+
const content = record?.['content'];
|
|
122
|
+
if (typeof content !== 'string') {
|
|
123
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'session.variant.create: content must be a string.');
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
return { variant: ctx.sessions.createVariant(sessionId, messageId, content) };
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
throw mapVariantError('session.variant.create', sessionId, error);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
registry.register('session.variant.select', async (ctx, payload) => {
|
|
133
|
+
const record = typeof payload === 'object' && payload !== null
|
|
134
|
+
? payload
|
|
135
|
+
: undefined;
|
|
136
|
+
const sessionId = readSessionId('session.variant.select', payload);
|
|
137
|
+
const messageId = readMessageId('session.variant.select', record);
|
|
138
|
+
const variantIndex = record?.['variantIndex'];
|
|
139
|
+
if (typeof variantIndex !== 'number' || !Number.isInteger(variantIndex) || variantIndex < 0) {
|
|
140
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'session.variant.select: variantIndex must be a non-negative integer (0 = base row).');
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
return { message: ctx.sessions.selectVariant(sessionId, messageId, variantIndex) };
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw mapVariantError('session.variant.select', sessionId, error);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
registry.register('session.variant.list', async (ctx, payload) => {
|
|
150
|
+
const record = typeof payload === 'object' && payload !== null
|
|
151
|
+
? payload
|
|
152
|
+
: undefined;
|
|
153
|
+
const sessionId = readSessionId('session.variant.list', payload);
|
|
154
|
+
const messageId = readMessageId('session.variant.list', record);
|
|
155
|
+
try {
|
|
156
|
+
return { variants: ctx.sessions.listVariants(sessionId, messageId) };
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
throw mapVariantError('session.variant.list', sessionId, error);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function readSessionId(command, payload) {
|
|
164
|
+
const sessionId = typeof payload === 'object' && payload !== null
|
|
165
|
+
? payload['sessionId']
|
|
166
|
+
: undefined;
|
|
167
|
+
if (typeof sessionId !== 'string' || sessionId.length === 0) {
|
|
168
|
+
throw new ProtocolError('INVALID_PAYLOAD', `${command}: sessionId must be a non-empty string`);
|
|
169
|
+
}
|
|
170
|
+
return sessionId;
|
|
171
|
+
}
|
|
172
|
+
function readMessageId(command, record) {
|
|
173
|
+
const messageId = record?.['messageId'];
|
|
174
|
+
if (typeof messageId !== 'string' || messageId.length === 0) {
|
|
175
|
+
throw new ProtocolError('INVALID_PAYLOAD', `${command}: messageId must be a non-empty string`);
|
|
176
|
+
}
|
|
177
|
+
return messageId;
|
|
178
|
+
}
|
|
179
|
+
/** Map store-level variant errors to protocol errors. */
|
|
180
|
+
function mapVariantError(command, sessionId, error) {
|
|
181
|
+
if (error instanceof SessionNotFoundError) {
|
|
182
|
+
return new ProtocolError('SESSION_NOT_FOUND', error.message, { sessionId });
|
|
183
|
+
}
|
|
184
|
+
if (error instanceof VariantNotFoundError) {
|
|
185
|
+
return new ProtocolError('INVALID_PAYLOAD', `${command}: ${error.message}`, { sessionId });
|
|
186
|
+
}
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `gateway.health` command handler.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors `GET /healthz` (which needs no auth): `{ ok, version, wireVersion }`.
|
|
5
|
+
*/
|
|
6
|
+
import { WIRE_VERSION } from '@boombot/protocol';
|
|
7
|
+
import { GATEWAY_VERSION } from '../server.js';
|
|
8
|
+
export function registerSystemHandlers(registry) {
|
|
9
|
+
registry.register('gateway.health', async () => {
|
|
10
|
+
return { ok: true, version: GATEWAY_VERSION, wireVersion: WIRE_VERSION };
|
|
11
|
+
});
|
|
12
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command handlers for `task.*` (background task runner):
|
|
3
|
+
* `task.create` / `task.list` / `task.get` / `task.pause` / `task.resume` /
|
|
4
|
+
* `task.cancel` / `task.redirect` / `task.retry`.
|
|
5
|
+
*
|
|
6
|
+
* Registered on the coordinator-owned command registry; each handler
|
|
7
|
+
* receives the service context (which carries the started task service),
|
|
8
|
+
* the validated command payload, and the request meta.
|
|
9
|
+
*
|
|
10
|
+
* `TaskError` codes from the runner map onto protocol errors the way
|
|
11
|
+
* `turn.approve` maps a missing approval: `NOT_FOUND` / `INVALID_STATE`
|
|
12
|
+
* become `INVALID_PAYLOAD` (client error, 400 via the server's
|
|
13
|
+
* ProtocolError mapping); anything else (e.g. `STORAGE`) propagates.
|
|
14
|
+
* Malformed payloads are also `INVALID_PAYLOAD` (400), never a 500 —
|
|
15
|
+
* only a missing task service stays a plain `Error` (genuine 500).
|
|
16
|
+
*/
|
|
17
|
+
import { TaskError } from '@boombot/core';
|
|
18
|
+
import { ProtocolError } from '@boombot/protocol';
|
|
19
|
+
export function registerTaskHandlers(registry) {
|
|
20
|
+
registry.register('task.create', async (ctx, payload) => {
|
|
21
|
+
const service = requireTaskService('task.create', ctx);
|
|
22
|
+
const { title, steps } = readCreatePayload(payload);
|
|
23
|
+
const task = await withTaskErrorMapping('task.create', title, () => service.createAndStart({ title, steps }));
|
|
24
|
+
return { task };
|
|
25
|
+
});
|
|
26
|
+
registry.register('task.list', async (ctx) => {
|
|
27
|
+
const service = requireTaskService('task.list', ctx);
|
|
28
|
+
const tasks = await service.list();
|
|
29
|
+
return { tasks };
|
|
30
|
+
});
|
|
31
|
+
registry.register('task.get', async (ctx, payload) => {
|
|
32
|
+
const service = requireTaskService('task.get', ctx);
|
|
33
|
+
const { id } = readIdPayload('task.get', payload);
|
|
34
|
+
const task = await service.get(id);
|
|
35
|
+
if (task === null) {
|
|
36
|
+
// Client error (400 via the server's ProtocolError mapping), not a
|
|
37
|
+
// 500: the task id is well-formed, it just does not exist.
|
|
38
|
+
throw new ProtocolError('INVALID_PAYLOAD', `task not found: ${id}`, { id });
|
|
39
|
+
}
|
|
40
|
+
return { task };
|
|
41
|
+
});
|
|
42
|
+
registry.register('task.pause', async (ctx, payload) => {
|
|
43
|
+
const service = requireTaskService('task.pause', ctx);
|
|
44
|
+
const { id } = readIdPayload('task.pause', payload);
|
|
45
|
+
const task = await withTaskErrorMapping('task.pause', id, () => service.pause(id));
|
|
46
|
+
return { task };
|
|
47
|
+
});
|
|
48
|
+
registry.register('task.resume', async (ctx, payload) => {
|
|
49
|
+
const service = requireTaskService('task.resume', ctx);
|
|
50
|
+
const { id, decision } = readResumePayload(payload);
|
|
51
|
+
const task = await withTaskErrorMapping('task.resume', id, () => service.resume(id, decision));
|
|
52
|
+
return { task };
|
|
53
|
+
});
|
|
54
|
+
registry.register('task.cancel', async (ctx, payload) => {
|
|
55
|
+
const service = requireTaskService('task.cancel', ctx);
|
|
56
|
+
const { id } = readIdPayload('task.cancel', payload);
|
|
57
|
+
const task = await withTaskErrorMapping('task.cancel', id, () => service.cancel(id));
|
|
58
|
+
return { task };
|
|
59
|
+
});
|
|
60
|
+
registry.register('task.redirect', async (ctx, payload) => {
|
|
61
|
+
const service = requireTaskService('task.redirect', ctx);
|
|
62
|
+
const { id, message } = readRedirectPayload(payload);
|
|
63
|
+
const task = await withTaskErrorMapping('task.redirect', id, () => service.redirect(id, message));
|
|
64
|
+
return { task };
|
|
65
|
+
});
|
|
66
|
+
registry.register('task.retry', async (ctx, payload) => {
|
|
67
|
+
const service = requireTaskService('task.retry', ctx);
|
|
68
|
+
const { id, fromStep } = readRetryPayload(payload);
|
|
69
|
+
const task = await withTaskErrorMapping('task.retry', id, () => service.retry(id, fromStep));
|
|
70
|
+
return { task };
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function requireTaskService(command, ctx) {
|
|
74
|
+
const service = ctx.taskService;
|
|
75
|
+
if (service === undefined) {
|
|
76
|
+
throw new Error(`task service is not running: ${command} is unavailable`);
|
|
77
|
+
}
|
|
78
|
+
return service;
|
|
79
|
+
}
|
|
80
|
+
/** Run a runner call, mapping `TaskError` codes onto protocol errors. */
|
|
81
|
+
async function withTaskErrorMapping(command, taskRef, fn) {
|
|
82
|
+
try {
|
|
83
|
+
return await fn();
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw mapTaskError(command, taskRef, error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function mapTaskError(command, taskRef, error) {
|
|
90
|
+
if (error instanceof TaskError) {
|
|
91
|
+
if (error.code === 'NOT_FOUND') {
|
|
92
|
+
return new ProtocolError('INVALID_PAYLOAD', `task not found: ${taskRef}`, {
|
|
93
|
+
id: taskRef,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (error.code === 'INVALID_STATE') {
|
|
97
|
+
return new ProtocolError('INVALID_PAYLOAD', `${command}: ${error.message}`, {
|
|
98
|
+
id: taskRef,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return error instanceof Error ? error : new Error(`${command} failed: ${String(error)}`);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Read the task id. The wire contract (`COMMAND_SCHEMAS`) names the field
|
|
106
|
+
* `id`; the handler used to read `taskId`, which rejected every
|
|
107
|
+
* contract-conformant request.
|
|
108
|
+
*/
|
|
109
|
+
function readIdPayload(command, payload) {
|
|
110
|
+
if (typeof payload !== 'object' || payload === null) {
|
|
111
|
+
throw new ProtocolError('INVALID_PAYLOAD', `${command}: payload must be an object`);
|
|
112
|
+
}
|
|
113
|
+
const { id } = payload;
|
|
114
|
+
if (typeof id !== 'string' || id === '') {
|
|
115
|
+
throw new ProtocolError('INVALID_PAYLOAD', `${command}: id must be a non-empty string`);
|
|
116
|
+
}
|
|
117
|
+
return { id };
|
|
118
|
+
}
|
|
119
|
+
function readCreatePayload(payload) {
|
|
120
|
+
if (typeof payload !== 'object' || payload === null) {
|
|
121
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'task.create: payload must be an object');
|
|
122
|
+
}
|
|
123
|
+
const record = payload;
|
|
124
|
+
const { title, steps } = record;
|
|
125
|
+
if (typeof title !== 'string' || title.trim() === '') {
|
|
126
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'task.create: title must be a non-empty string');
|
|
127
|
+
}
|
|
128
|
+
if (!Array.isArray(steps) || steps.length === 0) {
|
|
129
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'task.create: steps must be a non-empty array');
|
|
130
|
+
}
|
|
131
|
+
const parsed = steps.map((step, index) => {
|
|
132
|
+
if (typeof step !== 'object' || step === null) {
|
|
133
|
+
throw new ProtocolError('INVALID_PAYLOAD', `task.create: steps[${index}] must be an object`);
|
|
134
|
+
}
|
|
135
|
+
const prompt = step['prompt'];
|
|
136
|
+
if (typeof prompt !== 'string' || prompt.trim() === '') {
|
|
137
|
+
throw new ProtocolError('INVALID_PAYLOAD', `task.create: steps[${index}].prompt must be a non-empty string`);
|
|
138
|
+
}
|
|
139
|
+
return { prompt };
|
|
140
|
+
});
|
|
141
|
+
return { title, steps: parsed };
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* The wire contract carries the approval fields flat (`approved`,
|
|
145
|
+
* `editedArgs` — mirroring `turn.approve`); the handler used to expect a
|
|
146
|
+
* nested `decision` object, which rejected every contract-conformant
|
|
147
|
+
* request.
|
|
148
|
+
*/
|
|
149
|
+
function readResumePayload(payload) {
|
|
150
|
+
const { id } = readIdPayload('task.resume', payload);
|
|
151
|
+
const record = payload;
|
|
152
|
+
const approved = record['approved'];
|
|
153
|
+
const editedArgs = record['editedArgs'];
|
|
154
|
+
if (approved === undefined && editedArgs === undefined) {
|
|
155
|
+
return { id };
|
|
156
|
+
}
|
|
157
|
+
if (typeof approved !== 'boolean') {
|
|
158
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'task.resume: approved must be a boolean when provided');
|
|
159
|
+
}
|
|
160
|
+
if (editedArgs !== undefined && (typeof editedArgs !== 'object' || editedArgs === null)) {
|
|
161
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'task.resume: editedArgs must be an object when provided');
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
id,
|
|
165
|
+
decision: {
|
|
166
|
+
approved,
|
|
167
|
+
...(editedArgs !== undefined ? { editedArgs: editedArgs } : {}),
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function readRedirectPayload(payload) {
|
|
172
|
+
const { id } = readIdPayload('task.redirect', payload);
|
|
173
|
+
const record = payload;
|
|
174
|
+
const message = record['message'];
|
|
175
|
+
if (typeof message !== 'string' || message.trim() === '') {
|
|
176
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'task.redirect: message must be a non-empty string');
|
|
177
|
+
}
|
|
178
|
+
return { id, message };
|
|
179
|
+
}
|
|
180
|
+
function readRetryPayload(payload) {
|
|
181
|
+
const { id } = readIdPayload('task.retry', payload);
|
|
182
|
+
const record = payload;
|
|
183
|
+
const fromStep = record['fromStep'];
|
|
184
|
+
if (fromStep === undefined) {
|
|
185
|
+
return { id };
|
|
186
|
+
}
|
|
187
|
+
if (typeof fromStep !== 'number' || !Number.isInteger(fromStep) || fromStep < 0) {
|
|
188
|
+
throw new ProtocolError('INVALID_PAYLOAD', 'task.retry: fromStep must be a non-negative integer when provided');
|
|
189
|
+
}
|
|
190
|
+
return { id, fromStep };
|
|
191
|
+
}
|