@theowlops/boombot 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +230 -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,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle wiring for the turn service.
|
|
3
|
+
*
|
|
4
|
+
* `startTurnService` builds the service from the coordinator-owned context
|
|
5
|
+
* (event bus, sessions, provider + memory services), attaches it as
|
|
6
|
+
* `ctx.turnService` for the command handlers, and returns a stopper that
|
|
7
|
+
* aborts every in-flight turn and detaches the service.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdirSync } from 'node:fs';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { registerChannelTool, CHANNEL_SEND_TOOL_NAME } from '@boombot/channels';
|
|
13
|
+
import { registerResearchTools, runTurn as runTypeScriptTurn } from '@boombot/core';
|
|
14
|
+
import { registerVisionTool } from './vision-tool.js';
|
|
15
|
+
import { PluginManager } from '@boombot/plugins';
|
|
16
|
+
import { createSandboxProvider, SubprocessSandbox } from '@boombot/sandbox';
|
|
17
|
+
import { ApprovalStore } from '@boombot/security';
|
|
18
|
+
import { getGuardTagging } from '../guard/tagging.js';
|
|
19
|
+
import { activeProviderSnapshotPart, } from '../session-snapshot.js';
|
|
20
|
+
import { PersistentMemoryManager } from '../services/persistent-memory.js';
|
|
21
|
+
import { resolveProviderContextLimits } from '../services/context-limits.js';
|
|
22
|
+
import { CLARIFY_TOOL_NAME, registerClarifyTool } from './clarify-tool.js';
|
|
23
|
+
import { CRONJOB_TOOL_NAME, registerCronjobTool } from './cronjob-tool.js';
|
|
24
|
+
import { DeferredToolManager, TOOL_CALL_NAME, TOOL_DESCRIBE_NAME, TOOL_SEARCH_NAME, } from './deferred-tools.js';
|
|
25
|
+
import { EXECUTE_CODE_TOOL_NAME, registerExecuteCodeTool } from './execute-code-tool.js';
|
|
26
|
+
import { FILE_GLOB_TOOL_NAME, FILE_GREP_TOOL_NAME, FILE_READ_TOOL_NAME, FILE_WRITE_TOOL_NAME, FILE_EDIT_TOOL_NAME, FILE_TOOL_NAMES, registerFileTools, } from './file-tool.js';
|
|
27
|
+
import { McpManager } from './mcp-client.js';
|
|
28
|
+
import { registerMemoryTool, registerHermesMemoryTool } from './memory-tool.js';
|
|
29
|
+
import { startPythonAgentCore } from './python-core.js';
|
|
30
|
+
import { createAgentRuntimeDeps, getToolDefinitions } from './runtime-deps.js';
|
|
31
|
+
import { createTurnService } from './service.js';
|
|
32
|
+
import { registerSessionSearchTool, SESSION_SEARCH_TOOL_NAME } from './session-tool.js';
|
|
33
|
+
import { SHELL_TOOL_NAME, registerShellTool } from './shell-tool.js';
|
|
34
|
+
import { registerSkillTools, SKILL_LIST_TOOL_NAME, SKILL_READ_TOOL_NAME, SkillSemanticMatcher, SkillStore, } from './skill-tool.js';
|
|
35
|
+
import { resolveSpilloverDir } from './spillover.js';
|
|
36
|
+
import { DELEGATE_TASK_TOOL_NAME, registerSubagentTool } from './subagent-tool.js';
|
|
37
|
+
import { loadAssistantInstructions } from './system-prompt.js';
|
|
38
|
+
import { registerSelfConfigTools, CONFIG_MANAGE_TOOL_NAME, PLUGIN_MANAGE_TOOL_NAME, } from './self-config-tool.js';
|
|
39
|
+
export { createTurnService };
|
|
40
|
+
export { createAgentRuntimeDeps, GatewayToolExecutor } from './runtime-deps.js';
|
|
41
|
+
/**
|
|
42
|
+
* Register every tool advertised on a turn: the five research tools plus
|
|
43
|
+
* the sandboxed `shell.exec`. This is the exact wiring `startTurnService`
|
|
44
|
+
* uses per turn — exported so tests exercise the real path (no mocks):
|
|
45
|
+
* an injected production backend or a test-local `SubprocessSandbox` backs
|
|
46
|
+
* the shell tool, so every command goes through cwd confinement, env
|
|
47
|
+
* scrubbing, output caps, and process-tree timeout termination.
|
|
48
|
+
*
|
|
49
|
+
* The shell tool can be disabled without a code change via the harness
|
|
50
|
+
* guard policy: `denyTools: ['shell.exec']`.
|
|
51
|
+
*/
|
|
52
|
+
export function registerTurnTools(registry, options) {
|
|
53
|
+
// The four research tools. Config comes from the gateway context when
|
|
54
|
+
// present, otherwise from the environment. Throws on duplicate names —
|
|
55
|
+
// each turn gets a fresh executor, so registration is always clean.
|
|
56
|
+
registerResearchTools(registry, options.research);
|
|
57
|
+
if (options.enableVision === true) {
|
|
58
|
+
registerVisionTool(registry);
|
|
59
|
+
}
|
|
60
|
+
if (options.memoryService !== undefined) {
|
|
61
|
+
registerMemoryTool(registry, options.memoryService);
|
|
62
|
+
}
|
|
63
|
+
if (options.persistentMemory !== undefined) {
|
|
64
|
+
registerHermesMemoryTool(registry, options.persistentMemory);
|
|
65
|
+
}
|
|
66
|
+
if (options.channelService !== undefined) {
|
|
67
|
+
registerChannelTool(registry, options.channelService);
|
|
68
|
+
}
|
|
69
|
+
if (options.sessionSearchService !== undefined) {
|
|
70
|
+
registerSessionSearchTool(registry, options.sessionSearchService);
|
|
71
|
+
}
|
|
72
|
+
const skillStore = options.skillStore ?? (options.skillsRoot === undefined ? undefined : new SkillStore(options.skillsRoot));
|
|
73
|
+
if (skillStore !== undefined) {
|
|
74
|
+
registerSkillTools(registry, skillStore);
|
|
75
|
+
}
|
|
76
|
+
const deferredManager = new DeferredToolManager();
|
|
77
|
+
options.mcpManager?.registerTools({
|
|
78
|
+
registerTool: (def, handler) => deferredManager.registerDeferred(def, handler),
|
|
79
|
+
});
|
|
80
|
+
deferredManager.registerTo(registry);
|
|
81
|
+
options.pluginManager?.registerTools(registry);
|
|
82
|
+
if (options.subagentRunner !== undefined) {
|
|
83
|
+
registerSubagentTool(registry, options.subagentRunner);
|
|
84
|
+
}
|
|
85
|
+
mkdirSync(options.workspaceRoot, { recursive: true });
|
|
86
|
+
const sandbox = options.sandbox ?? new SubprocessSandbox({ workspaceRoot: options.workspaceRoot });
|
|
87
|
+
// Truncated-output spillover: both subprocess tools persist what the
|
|
88
|
+
// sandbox captured to `<dataDir>/tool_outputs/<callId>.txt` and hand the
|
|
89
|
+
// model a preview + path instead of dropping bytes silently. Old spill
|
|
90
|
+
// files are pruned (7d TTL, 256MiB cap) on every spill — no cron needed.
|
|
91
|
+
const spilloverDir = resolveSpilloverDir(options);
|
|
92
|
+
registerShellTool(registry, { sandbox, spillover: { dir: spilloverDir } });
|
|
93
|
+
registerExecuteCodeTool(registry, { sandbox, workspaceRoot: options.workspaceRoot, spillover: { dir: spilloverDir } });
|
|
94
|
+
registerClarifyTool(registry);
|
|
95
|
+
registerSelfConfigTools(registry, {
|
|
96
|
+
configPath: join(options.dataDir ?? options.workspaceRoot, '..', 'config.json'),
|
|
97
|
+
dataDir: options.dataDir ?? options.workspaceRoot,
|
|
98
|
+
pluginsRoot: join(options.dataDir ?? options.workspaceRoot, 'plugins'),
|
|
99
|
+
liveConfig: {},
|
|
100
|
+
pluginManager: options.pluginManager,
|
|
101
|
+
});
|
|
102
|
+
if (options.schedulerService !== undefined) {
|
|
103
|
+
registerCronjobTool(registry, options.schedulerService);
|
|
104
|
+
}
|
|
105
|
+
// File tools resolve against their OWN root, which in production is the
|
|
106
|
+
// project directory (`files.root`, default `process.cwd()`). "Find file X"
|
|
107
|
+
// is a question about the user's repository; answering it from the gateway
|
|
108
|
+
// data dir made the model burn its whole round budget finding nothing,
|
|
109
|
+
// which is where the multi-10s file questions were going. The shell
|
|
110
|
+
// sandbox keeps its default root (`ctx.dataDir`) unless
|
|
111
|
+
// `shell.projectRoot` is set — the write-a-script-then-run-it workflow
|
|
112
|
+
// needs both tools to agree, which is what that flag is for.
|
|
113
|
+
registerFileTools(registry, { workspaceRoot: options.filesRoot ?? options.workspaceRoot });
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Start the turn service on `ctx`. The returned stopper aborts all
|
|
117
|
+
* in-flight turns, clears tracking state, and detaches the service.
|
|
118
|
+
*/
|
|
119
|
+
export async function startTurnService(ctx) {
|
|
120
|
+
// Two roots, deliberately different. The shell sandbox confines every
|
|
121
|
+
// command under the gateway data dir, so a compromised model can only
|
|
122
|
+
// reach its own scratch space; `dataDir` is always set in production and
|
|
123
|
+
// the temp fallback only serves config-less callers (tests). The file
|
|
124
|
+
// tools point at the project instead, because "find file X" is about the
|
|
125
|
+
// user's repository. `shell.projectRoot` collapses the two when the
|
|
126
|
+
// operator wants write-a-script-then-run-it to work.
|
|
127
|
+
const projectRoot = ctx.config?.files?.root ?? process.cwd();
|
|
128
|
+
const shellRoot = ctx.config?.shell?.projectRoot === true
|
|
129
|
+
? projectRoot
|
|
130
|
+
: (ctx.dataDir ?? join(tmpdir(), 'boombot-shell'));
|
|
131
|
+
const skillsRoot = join(ctx.dataDir ?? shellRoot, 'skills');
|
|
132
|
+
const skillStore = new SkillStore(skillsRoot);
|
|
133
|
+
const sandbox = createSandboxProvider({
|
|
134
|
+
workspaceRoot: shellRoot,
|
|
135
|
+
backend: ctx.config?.shell?.backend ?? 'auto',
|
|
136
|
+
});
|
|
137
|
+
ctx.log?.('info', 'sandbox backend selected', { backend: sandbox.name });
|
|
138
|
+
let semanticMatcher;
|
|
139
|
+
// Output tagging (E3 wire-up, SQLite persistence follow-up): the service
|
|
140
|
+
// tags each settled turn's tool outputs and persists them to
|
|
141
|
+
// `<dataDir>/guard-tags.sqlite` so tags survive restarts. Lazily created
|
|
142
|
+
// here because no boot code ever attaches `guardContext` — without this,
|
|
143
|
+
// tagging would silently stay disabled in production (E2 forwarded
|
|
144
|
+
// `ctx.guardContext` unchanged and nothing called `getGuardTagging` on
|
|
145
|
+
// the boot path). Stored back on ctx so later `getGuardTagging(ctx)`
|
|
146
|
+
// callers reuse the same service. Without a `dataDir` the service is
|
|
147
|
+
// pure in-memory (tests).
|
|
148
|
+
const guardContext = ctx.guardContext ?? getGuardTagging({ dataDir: ctx.dataDir });
|
|
149
|
+
ctx.guardContext = guardContext;
|
|
150
|
+
// P1-2: persisted HITL approval state machine. Own SQLite file — the
|
|
151
|
+
// session store's schema is never migrated by this module, and no other
|
|
152
|
+
// worker's migrations can collide with it. Pure in-memory when there is
|
|
153
|
+
// no dataDir (tests).
|
|
154
|
+
const approvalStore = ApprovalStore.open(ctx.dataDir === undefined ? ':memory:' : join(ctx.dataDir, 'approvals.sqlite'));
|
|
155
|
+
const mcpManager = await McpManager.connect(ctx.config?.mcp?.servers, (level, message, meta) => {
|
|
156
|
+
ctx.log?.(level, message, meta);
|
|
157
|
+
});
|
|
158
|
+
const pluginManager = ctx.config?.plugins?.enabled === false
|
|
159
|
+
? PluginManager.empty()
|
|
160
|
+
: await PluginManager.load(ctx.config?.plugins?.root ?? join(ctx.dataDir ?? shellRoot, 'plugins'), ctx.config?.plugins?.config, (level, message, meta) => ctx.log?.(level, message, meta));
|
|
161
|
+
// Primary Runtime: Native TypeScript cognitive loop. Zero child process overhead,
|
|
162
|
+
// immune to gRPC serialization latency. Python core is an optional sidecar if explicitly requested.
|
|
163
|
+
let turnRunner = runTypeScriptTurn;
|
|
164
|
+
let pythonCore;
|
|
165
|
+
if (process.env['BOOMBOT_AGENT_RUNTIME'] === 'python') {
|
|
166
|
+
try {
|
|
167
|
+
pythonCore = await startPythonAgentCore();
|
|
168
|
+
turnRunner = pythonCore.runTurn;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
ctx.log?.('warn', 'Failed to start optional Python agent sidecar; running native TypeScript core', { error });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
const persistentMemory = new PersistentMemoryManager(ctx.dataDir ?? shellRoot);
|
|
175
|
+
const service = createTurnService({
|
|
176
|
+
publish: (event) => ctx.events.publish(event),
|
|
177
|
+
sessions: ctx.sessions,
|
|
178
|
+
runTurn: turnRunner,
|
|
179
|
+
persistentMemory,
|
|
180
|
+
approvalTimeoutMs: 300_000,
|
|
181
|
+
resolveContextLimits: async () => {
|
|
182
|
+
const ps = ctx.providerService;
|
|
183
|
+
let active;
|
|
184
|
+
if (ps && typeof ps.list === 'function') {
|
|
185
|
+
const list = await ps.list();
|
|
186
|
+
active = list.find((p) => p.active);
|
|
187
|
+
}
|
|
188
|
+
return resolveProviderContextLimits(active ? { kind: active.kind, model: active.model } : undefined, active?.model);
|
|
189
|
+
},
|
|
190
|
+
assistantInstructions: loadAssistantInstructions({
|
|
191
|
+
dataDir: ctx.dataDir ?? shellRoot,
|
|
192
|
+
projectRoot,
|
|
193
|
+
override: process.env['BOOMBOT_SYSTEM_PROMPT'],
|
|
194
|
+
}),
|
|
195
|
+
// P1-7: feed the session config snapshot with the serving provider's
|
|
196
|
+
// model + kind. The turn service merges this with the per-turn tool
|
|
197
|
+
// count and system prompt hash it already knows. A provider service
|
|
198
|
+
// without `list()` (foreign/stubbed) simply yields no provider part.
|
|
199
|
+
describeProvider: async () => {
|
|
200
|
+
const service = ctx.providerService;
|
|
201
|
+
if (service === undefined || typeof service.list !== 'function')
|
|
202
|
+
return undefined;
|
|
203
|
+
return activeProviderSnapshotPart(await service.list());
|
|
204
|
+
},
|
|
205
|
+
getSkillCatalog: () => skillStore.list(),
|
|
206
|
+
readSkill: (name) => skillStore.read(name),
|
|
207
|
+
matchSkill: async (query, catalog) => {
|
|
208
|
+
const resolveEmbeddings = ctx.providerService?.resolveEmbeddings;
|
|
209
|
+
if (typeof resolveEmbeddings !== 'function')
|
|
210
|
+
return undefined;
|
|
211
|
+
if (semanticMatcher === undefined) {
|
|
212
|
+
const client = await resolveEmbeddings.call(ctx.providerService).catch(() => undefined);
|
|
213
|
+
if (client === undefined)
|
|
214
|
+
return undefined;
|
|
215
|
+
semanticMatcher = new SkillSemanticMatcher(client);
|
|
216
|
+
}
|
|
217
|
+
return semanticMatcher.match(query, catalog);
|
|
218
|
+
},
|
|
219
|
+
getDeps: async (turnInfo) => {
|
|
220
|
+
const core = await import('@boombot/core');
|
|
221
|
+
const sessionScope = core.sessionScope;
|
|
222
|
+
const turnSessionScope = turnInfo ? sessionScope(turnInfo.sessionId) : undefined;
|
|
223
|
+
// A platform is not an identity: separate chats, but keep memory across their sessions.
|
|
224
|
+
const chatId = turnInfo?.replyTo ?? turnInfo?.sessionId;
|
|
225
|
+
const turnScope = turnInfo?.channel && chatId
|
|
226
|
+
? core.conversationScope(turnInfo.channel, chatId)
|
|
227
|
+
: undefined;
|
|
228
|
+
const memory = ctx.memoryService;
|
|
229
|
+
// Both automatic and tool-driven recall use the same server-owned scope.
|
|
230
|
+
const memoryService = memory ? {
|
|
231
|
+
recall: (query) => memory.recall(query, {
|
|
232
|
+
sessionScope: turnSessionScope, channel: turnInfo?.channel, chatId,
|
|
233
|
+
}),
|
|
234
|
+
note: (text, meta) => memory.note(text, meta, turnScope),
|
|
235
|
+
} : undefined;
|
|
236
|
+
const searchMessages = ctx.sessions.searchMessages?.bind(ctx.sessions);
|
|
237
|
+
const ps = ctx.providerService;
|
|
238
|
+
const isAutonomous = ctx.config?.autonomous === true;
|
|
239
|
+
const deps = createAgentRuntimeDeps({
|
|
240
|
+
providerService: ps !== undefined && typeof ps.resolveLlm === 'function' ? ps : undefined,
|
|
241
|
+
memoryService,
|
|
242
|
+
autonomous: isAutonomous,
|
|
243
|
+
// Operator opt-in (gateway config `shell.enabled`, default off):
|
|
244
|
+
// without this the turn policy hides and denies both subprocess
|
|
245
|
+
// tools — fail-closed.
|
|
246
|
+
//
|
|
247
|
+
// File tools are allow-listed UNCONDITIONALLY (operator decision).
|
|
248
|
+
// That deliberately overrides three defaults in
|
|
249
|
+
// `packages/security`'s `DefaultApprovalPolicy`: `file.write*` →
|
|
250
|
+
// require-approval (approval.ts:136) and `file.edit`/`glob`/`grep` →
|
|
251
|
+
// unknown-tool → require-approval (approval.ts:148-153). The package
|
|
252
|
+
// defaults stay untouched for other consumers; the override lives
|
|
253
|
+
// here only. Confinement for these tools comes from `resolveWithin`
|
|
254
|
+
// in the handler, not from this policy.
|
|
255
|
+
policyAllowTools: [
|
|
256
|
+
...FILE_TOOL_NAMES,
|
|
257
|
+
SESSION_SEARCH_TOOL_NAME,
|
|
258
|
+
SKILL_LIST_TOOL_NAME,
|
|
259
|
+
SKILL_READ_TOOL_NAME,
|
|
260
|
+
DELEGATE_TASK_TOOL_NAME,
|
|
261
|
+
TOOL_SEARCH_NAME,
|
|
262
|
+
TOOL_DESCRIBE_NAME,
|
|
263
|
+
TOOL_CALL_NAME,
|
|
264
|
+
CLARIFY_TOOL_NAME,
|
|
265
|
+
CONFIG_MANAGE_TOOL_NAME,
|
|
266
|
+
PLUGIN_MANAGE_TOOL_NAME,
|
|
267
|
+
CRONJOB_TOOL_NAME,
|
|
268
|
+
CHANNEL_SEND_TOOL_NAME,
|
|
269
|
+
...pluginManager.toolNames,
|
|
270
|
+
...(ctx.config?.shell?.enabled === true ? [SHELL_TOOL_NAME, EXECUTE_CODE_TOOL_NAME] : []),
|
|
271
|
+
],
|
|
272
|
+
policyDenyTools: ctx.config?.shell?.enabled === true ? [] : [SHELL_TOOL_NAME, EXECUTE_CODE_TOOL_NAME],
|
|
273
|
+
});
|
|
274
|
+
const subagentRunner = {
|
|
275
|
+
run: async (prompt, signal, options) => {
|
|
276
|
+
const child = createAgentRuntimeDeps({
|
|
277
|
+
providerService: ps !== undefined && typeof ps.resolveLlm === 'function' ? ps : undefined,
|
|
278
|
+
memoryService,
|
|
279
|
+
principalId: 'subagent',
|
|
280
|
+
autonomous: isAutonomous,
|
|
281
|
+
});
|
|
282
|
+
registerTurnTools(child.tools, {
|
|
283
|
+
workspaceRoot: shellRoot,
|
|
284
|
+
dataDir: ctx.dataDir ?? shellRoot,
|
|
285
|
+
sandbox,
|
|
286
|
+
filesRoot: projectRoot,
|
|
287
|
+
research: ctx.config?.research,
|
|
288
|
+
sessionSearchService: searchMessages === undefined ? undefined : { searchMessages },
|
|
289
|
+
skillStore,
|
|
290
|
+
mcpManager,
|
|
291
|
+
});
|
|
292
|
+
const readOnlyTools = new Set([
|
|
293
|
+
FILE_READ_TOOL_NAME,
|
|
294
|
+
FILE_GLOB_TOOL_NAME,
|
|
295
|
+
FILE_GREP_TOOL_NAME,
|
|
296
|
+
SESSION_SEARCH_TOOL_NAME,
|
|
297
|
+
SKILL_LIST_TOOL_NAME,
|
|
298
|
+
SKILL_READ_TOOL_NAME,
|
|
299
|
+
]);
|
|
300
|
+
const coderTools = new Set([
|
|
301
|
+
...readOnlyTools,
|
|
302
|
+
FILE_WRITE_TOOL_NAME,
|
|
303
|
+
FILE_EDIT_TOOL_NAME,
|
|
304
|
+
SHELL_TOOL_NAME,
|
|
305
|
+
]);
|
|
306
|
+
const isCoder = options?.role === 'coder';
|
|
307
|
+
const allowedToolSet = isCoder ? coderTools : readOnlyTools;
|
|
308
|
+
const restricted = {
|
|
309
|
+
...child,
|
|
310
|
+
policy: {
|
|
311
|
+
checkToolCall: (call) => allowedToolSet.has(call.name) || call.name.startsWith('research.') ? 'allow' : 'deny',
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
const systemMsg = isCoder
|
|
315
|
+
? 'You are an autonomous coder child agent. You have file-write and sandboxed shell capabilities. Implement, test, and return a verifiable final report.'
|
|
316
|
+
: 'You are a read-only child agent. Complete only the delegated task, cite evidence from tools, and return a concise report.';
|
|
317
|
+
const result = await turnRunner(restricted, {
|
|
318
|
+
sessionId: `subagent:${turnInfo?.sessionId ?? 'standalone'}`,
|
|
319
|
+
messages: [
|
|
320
|
+
{
|
|
321
|
+
role: 'system',
|
|
322
|
+
content: systemMsg,
|
|
323
|
+
},
|
|
324
|
+
{ role: 'user', content: prompt },
|
|
325
|
+
],
|
|
326
|
+
tools: await getToolDefinitions(restricted),
|
|
327
|
+
budget: { maxRounds: isCoder ? 10 : 5, maxToolCalls: isCoder ? 32 : 16 },
|
|
328
|
+
}, () => { }, signal);
|
|
329
|
+
if (result.status !== 'completed') {
|
|
330
|
+
throw new Error(result.error ?? `child turn ${result.status}`);
|
|
331
|
+
}
|
|
332
|
+
const answer = [...result.messages]
|
|
333
|
+
.reverse()
|
|
334
|
+
.find((message) => message.role === 'assistant')
|
|
335
|
+
?.content;
|
|
336
|
+
if (answer === undefined || answer.trim() === '')
|
|
337
|
+
throw new Error('child returned no answer');
|
|
338
|
+
return answer;
|
|
339
|
+
},
|
|
340
|
+
};
|
|
341
|
+
// Advertise every turn tool (research + sandboxed shell) on this
|
|
342
|
+
// turn's fresh executor. `registerTurnTools` throws on duplicate
|
|
343
|
+
// names — each turn gets a fresh executor, so registration is always
|
|
344
|
+
// clean.
|
|
345
|
+
registerTurnTools(deps.tools, {
|
|
346
|
+
workspaceRoot: shellRoot,
|
|
347
|
+
dataDir: ctx.dataDir ?? shellRoot,
|
|
348
|
+
sandbox,
|
|
349
|
+
filesRoot: projectRoot,
|
|
350
|
+
research: ctx.config?.research,
|
|
351
|
+
memoryService,
|
|
352
|
+
persistentMemory,
|
|
353
|
+
channelService: ctx.channelService,
|
|
354
|
+
schedulerService: ctx.schedulerService,
|
|
355
|
+
sessionSearchService: searchMessages === undefined ? undefined : { searchMessages },
|
|
356
|
+
skillStore,
|
|
357
|
+
mcpManager,
|
|
358
|
+
subagentRunner,
|
|
359
|
+
pluginManager,
|
|
360
|
+
});
|
|
361
|
+
return deps;
|
|
362
|
+
},
|
|
363
|
+
// Forward the reasoning-guard mode from the gateway config into every
|
|
364
|
+
// turn's `TurnContext`. `loadConfig` always defines it; the fallback is
|
|
365
|
+
// only for callers that pass a config-less context (tests).
|
|
366
|
+
reasoningGuard: ctx.config?.reasoningGuard ?? { mode: 'warn' },
|
|
367
|
+
// Same for the harness guard: the pre-execution gate reads its policy
|
|
368
|
+
// from the turn service deps. The write-zone gate defaults to the two
|
|
369
|
+
// roots the tools actually operate under (project files + shell
|
|
370
|
+
// scratch); an explicit config overrides it.
|
|
371
|
+
harnessGuard: {
|
|
372
|
+
mode: ctx.config?.harnessGuard?.mode ?? 'warn',
|
|
373
|
+
writeZones: ctx.config?.harnessGuard?.writeZones ?? [projectRoot, shellRoot],
|
|
374
|
+
},
|
|
375
|
+
// Adaptive routing (PR #14): enabled by default; the gateway config
|
|
376
|
+
// may opt out with `routing: { enabled: false }`.
|
|
377
|
+
routing: ctx.config?.routing,
|
|
378
|
+
// Output tagging (E3 wire-up): the service tags each settled turn's
|
|
379
|
+
// tool outputs; always present here (created above), tests pass their
|
|
380
|
+
// own via ctx.guardContext.
|
|
381
|
+
guardContext,
|
|
382
|
+
// P1-2: persisted HITL approval state machine — the single source of
|
|
383
|
+
// truth for pending → approved | denied | expired. Created here so its
|
|
384
|
+
// lifecycle matches the turn service; the boot scan runs at server
|
|
385
|
+
// creation (`createGatewayServer` → `reannouncePendingApprovals`).
|
|
386
|
+
approvalStore,
|
|
387
|
+
});
|
|
388
|
+
ctx.turnService = service;
|
|
389
|
+
let stopped = false;
|
|
390
|
+
return async () => {
|
|
391
|
+
if (stopped) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
stopped = true;
|
|
395
|
+
try {
|
|
396
|
+
await service.shutdown();
|
|
397
|
+
}
|
|
398
|
+
finally {
|
|
399
|
+
try {
|
|
400
|
+
approvalStore.close();
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// Best-effort: shutdown continues even if the store is broken.
|
|
404
|
+
}
|
|
405
|
+
await Promise.allSettled([
|
|
406
|
+
pluginManager.close(),
|
|
407
|
+
mcpManager.close(),
|
|
408
|
+
pythonCore?.close(),
|
|
409
|
+
sandbox.close?.(),
|
|
410
|
+
]);
|
|
411
|
+
if (ctx.turnService === service) {
|
|
412
|
+
ctx.turnService = undefined;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jev middleware — System 1 Reflex Gate for BoomBot's turn pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Hooked into `preflight` phase (first, zero-latency gate):
|
|
5
|
+
* - If noul > blockThreshold → immediate localReply without calling the LLM.
|
|
6
|
+
* - If confidence < 0.45 on choice routing → log warning, pass through.
|
|
7
|
+
* - Publishes `jev.blocked` SSE event when a turn is blocked.
|
|
8
|
+
* - Publishes `jev.routed` SSE event with the choice classification result.
|
|
9
|
+
*
|
|
10
|
+
* Latency budget: < 2ms (pure TS, no I/O, no LLM calls).
|
|
11
|
+
*/
|
|
12
|
+
import { jevEval, MiddlewareAbortError } from '@boombot/core';
|
|
13
|
+
const OWNER_GUARD_REPLY = 'Xin lỗi, thông tin kiến trúc và cấu hình hệ thống được bảo mật tuyệt đối.';
|
|
14
|
+
const INJECTION_BLOCK_REPLY = '⚠️ Tin nhắn bị chặn bởi Jev System 1 Gate do phát hiện nội dung tiềm ẩn nguy hiểm hoặc vi phạm chính sách. Vui lòng đặt câu hỏi khác.';
|
|
15
|
+
/** Phrases that trigger Owner-Guard fast-path block before Jev noul scan. */
|
|
16
|
+
const OWNER_GUARD_TRIGGERS = [
|
|
17
|
+
/system\s+prompt/iu,
|
|
18
|
+
/(?:list|show|tell|print|reveal)\s+(?:all\s+)?(?:tools?|plugins?|models?|configurations?|api\s+keys?|secrets?|tokens?)/iu,
|
|
19
|
+
/(?:who|what|how)\s+(?:made|created|built|designed)\s+(?:you|this\s+bot)/iu,
|
|
20
|
+
/(?:bạn\s+được\s+tạo|ai\s+(?:làm|tạo|xây dựng)\s+(?:bạn|bot))/iu,
|
|
21
|
+
/(?:hệ thống nội bộ|cấu hình nội bộ|kiến trúc hệ thống)/iu,
|
|
22
|
+
];
|
|
23
|
+
function buildBlockedEvent(turnId, runId, evaluation, reason) {
|
|
24
|
+
// ponytail: extend protocol schema for jev.* events in a future PR.
|
|
25
|
+
// For now, broadcast as guard.blocked which is already a known event type.
|
|
26
|
+
return {
|
|
27
|
+
type: 'guard.blocked',
|
|
28
|
+
payload: {
|
|
29
|
+
turnId,
|
|
30
|
+
runId,
|
|
31
|
+
toolName: 'jev.noul',
|
|
32
|
+
layer: 'preflight',
|
|
33
|
+
reason: `[Jev] ${reason} (noul=${evaluation.noul.noul.toFixed(3)})`,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function createJevMiddleware(options) {
|
|
38
|
+
const { turnId, runId, publish, blockThreshold = 0.5, choiceConfidenceFloor = 0.30, } = options;
|
|
39
|
+
return {
|
|
40
|
+
name: 'jev',
|
|
41
|
+
beforePhase(phase, ctx) {
|
|
42
|
+
if (phase !== 'preflight')
|
|
43
|
+
return;
|
|
44
|
+
// Extract last user message
|
|
45
|
+
const userMessages = ctx.messages.filter((m) => m.role === 'user');
|
|
46
|
+
const lastUser = userMessages[userMessages.length - 1];
|
|
47
|
+
const text = lastUser?.content ?? '';
|
|
48
|
+
// ─── Owner Guard fast-path ───────────────────────────────────────────
|
|
49
|
+
// Check before Jev noul scan so the Owner Guard rule is never bypassed
|
|
50
|
+
// by a crafted message with low noul score.
|
|
51
|
+
for (const pattern of OWNER_GUARD_TRIGGERS) {
|
|
52
|
+
if (pattern.test(text)) {
|
|
53
|
+
publish(buildBlockedEvent(turnId, runId, {
|
|
54
|
+
noul: { noul: 0.85, decision: true, type: 'noul', latency_ms: 0 },
|
|
55
|
+
choice: { type: 'choice', choice: 'chat', probabilities: {}, confidence: 0, latency_ms: 0 },
|
|
56
|
+
passed: false,
|
|
57
|
+
latency_ms: 0,
|
|
58
|
+
}, 'Owner-Guard trigger'));
|
|
59
|
+
throw new MiddlewareAbortError(OWNER_GUARD_REPLY);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// ─── Jev System 1 Noul evaluation ───────────────────────────────────
|
|
63
|
+
const evaluation = jevEval(text, { blockThreshold });
|
|
64
|
+
// Publish routing telemetry
|
|
65
|
+
try {
|
|
66
|
+
publish({
|
|
67
|
+
type: 'guard.blocked',
|
|
68
|
+
payload: {
|
|
69
|
+
turnId,
|
|
70
|
+
runId,
|
|
71
|
+
toolName: 'jev.route',
|
|
72
|
+
layer: 'preflight',
|
|
73
|
+
reason: `[Jev] Route=${evaluation.choice.choice} conf=${evaluation.choice.confidence.toFixed(2)} noul=${evaluation.noul.noul.toFixed(3)} latency=${evaluation.latency_ms}ms`,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// telemetry never breaks a turn
|
|
79
|
+
}
|
|
80
|
+
// Block if danger threshold exceeded
|
|
81
|
+
if (!evaluation.passed) {
|
|
82
|
+
publish(buildBlockedEvent(turnId, runId, evaluation, evaluation.noul.reason ?? 'Noul threshold exceeded'));
|
|
83
|
+
throw new MiddlewareAbortError(INJECTION_BLOCK_REPLY);
|
|
84
|
+
}
|
|
85
|
+
// Warn on low-confidence routing
|
|
86
|
+
if (evaluation.choice.confidence < choiceConfidenceFloor) {
|
|
87
|
+
console.warn(`[jev] low-confidence routing: choice=${evaluation.choice.choice} conf=${evaluation.choice.confidence.toFixed(2)} — deferring to System 2`);
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic local replies for isolated turns and slash commands.
|
|
3
|
+
*
|
|
4
|
+
* Fast path: instant replies (<1ms) for slash commands (/status, /tools, /help),
|
|
5
|
+
* system date/time queries, and greetings, without wasting model tokens.
|
|
6
|
+
*/
|
|
7
|
+
export function simpleLocalReply(text, context) {
|
|
8
|
+
const trimmed = text.trim();
|
|
9
|
+
const normalized = trimmed
|
|
10
|
+
.normalize('NFC')
|
|
11
|
+
.toLocaleLowerCase('vi')
|
|
12
|
+
.replace(/[.!?…]+$/u, '')
|
|
13
|
+
.trim()
|
|
14
|
+
.replace(/\s+/gu, ' ');
|
|
15
|
+
// 1. Built-in Slash Commands
|
|
16
|
+
if (normalized.startsWith('/status')) {
|
|
17
|
+
const port = context?.port ?? 8788;
|
|
18
|
+
const provider = context?.activeProvider ?? 'anti';
|
|
19
|
+
const ctxLimit = context?.contextLimit
|
|
20
|
+
? `${context.contextLimit.toLocaleString()} tokens`
|
|
21
|
+
: '257,000 tokens';
|
|
22
|
+
const plugins = context?.installedPlugins ?? [
|
|
23
|
+
'boombot.browser',
|
|
24
|
+
'boombot.github',
|
|
25
|
+
'boombot.downloader',
|
|
26
|
+
'boombot.tts',
|
|
27
|
+
'boombot.diagram',
|
|
28
|
+
];
|
|
29
|
+
return ('⚡ **Báo cáo Trạng thái Hệ thống BoomBot (System Status)**\n\n' +
|
|
30
|
+
`- **Trạng thái Gateway:** Online (\`http://127.0.0.1:${port}\`)\n` +
|
|
31
|
+
`- **Cổng dịch vụ (Ports):** Gateway & Web UI: ${port} | Zalo Bridge: 8787 | 9Router: 20128\n` +
|
|
32
|
+
`- **Active Provider:** \`${provider}\`\n` +
|
|
33
|
+
`- **Context Window:** ${ctxLimit} (Compaction threshold: 75%)\n` +
|
|
34
|
+
'- **Bộ nhớ bền vững (Durable Memory):** Hermes-grade (`MEMORY.md` & `USER.md`)\n' +
|
|
35
|
+
`- **Plugins đang tải (${plugins.length}):** ${plugins.map((p) => `\`${p}\``).join(', ')}\n` +
|
|
36
|
+
'- **Khả năng tự hành (Autonomous):** Bật (Hỗ trợ hot-reload plugin & tự cấu hình)\n\n' +
|
|
37
|
+
'Tốc độ phản hồi (latency): 1ms');
|
|
38
|
+
}
|
|
39
|
+
if (normalized.startsWith('/tools')) {
|
|
40
|
+
if (context?.tools && context.tools.length > 0) {
|
|
41
|
+
const plugins = context.tools.filter((t) => t.name.startsWith('plugin_'));
|
|
42
|
+
const coreTools = context.tools.filter((t) => !t.name.startsWith('plugin_'));
|
|
43
|
+
const lines = [
|
|
44
|
+
`🛠️ **Danh sách Công cụ Đang Hoạt Động (Dynamic Runtime: ${context.tools.length} tools)**\n`,
|
|
45
|
+
];
|
|
46
|
+
if (plugins.length > 0) {
|
|
47
|
+
lines.push(`### 1. Plugin Tools (${plugins.length}):`);
|
|
48
|
+
for (const t of plugins) {
|
|
49
|
+
lines.push(`- \`${t.name}\`: ${t.description?.replace(/\s+/gu, ' ').trim() || 'Plugin tool'}`);
|
|
50
|
+
}
|
|
51
|
+
lines.push('');
|
|
52
|
+
}
|
|
53
|
+
lines.push(`### 2. Core & Sandbox Tools (${coreTools.length}):`);
|
|
54
|
+
for (const t of coreTools) {
|
|
55
|
+
lines.push(`- \`${t.name}\`: ${t.description?.replace(/\s+/gu, ' ').trim() || 'Core tool'}`);
|
|
56
|
+
}
|
|
57
|
+
lines.push('\nTốc độ phản hồi (latency): 1ms');
|
|
58
|
+
return lines.join('\n');
|
|
59
|
+
}
|
|
60
|
+
return ('🛠️ **Danh sách Công cụ & Plugin Đang Hoạt Động (Tools & Plugins)**\n\n' +
|
|
61
|
+
'### 1. Tự Cấu Hình & Quản Lý Plugin (In-Process Hot-Reload):\n' +
|
|
62
|
+
'- `config_manage`: Kiểm tra và cập nhật cấu hình hệ thống không cần restart\n' +
|
|
63
|
+
'- `plugin_manage`: Cài đặt, gỡ bỏ, và hot-reload plugin từ catalog/git/npm với zero downtime\n\n' +
|
|
64
|
+
'### 2. Plugin Lõi Đã Cài Đặt (Active Plugins):\n' +
|
|
65
|
+
'- `boombot.browser`: Tự động hóa duyệt web Chromium\n' +
|
|
66
|
+
'- `boombot.github`: Thao tác GitHub repo, issues, PRs qua GitHub API\n' +
|
|
67
|
+
'- `boombot.downloader`: Tải file và tài nguyên media đa luồng\n' +
|
|
68
|
+
'- `boombot.tts`: Đọc văn bản tiếng Việt tự nhiên (Edge TTS)\n' +
|
|
69
|
+
'- `boombot.diagram`: Tạo sơ đồ kiến trúc Mermaid / Excalidraw\n\n' +
|
|
70
|
+
'### 3. Sandbox & Bộ Nhớ:\n' +
|
|
71
|
+
'- `shell.exec`: Chạy lệnh terminal trong Passthrough Sandbox\n' +
|
|
72
|
+
'- `file.read`, `file.write`, `file.edit`, `file.grep`, `file.glob`: Quản lý tập tin an toàn\n' +
|
|
73
|
+
'- `memory`: CRUD bộ nhớ bền vững phong cách Hermes (`target: memory|user`)\n' +
|
|
74
|
+
'- `skill.list`, `skill.read`: Nạp hơn 120 skills chuyên môn hoá\n\n' +
|
|
75
|
+
'Tốc độ phản hồi (latency): 1ms');
|
|
76
|
+
}
|
|
77
|
+
if (normalized.startsWith('/help')) {
|
|
78
|
+
return ('💡 **Hướng dẫn Sử Dụng & Phím Tắt BoomBot (Quick Guide)**\n\n' +
|
|
79
|
+
'### ⌨️ Phím Tắt (Keyboard Shortcuts):\n' +
|
|
80
|
+
'- `Enter`: Gửi tin nhắn\n' +
|
|
81
|
+
'- `Shift + Enter`: Xuống dòng trong ô nhập liệu\n' +
|
|
82
|
+
'- `/`: Mở Slash Command Menu gợi ý lệnh nhanh\n' +
|
|
83
|
+
'- `↑` / `↓`: Di chuyển chọn lệnh trong Slash Menu\n' +
|
|
84
|
+
'- `Tab` / `Enter`: Kích hoạt lệnh được chọn\n' +
|
|
85
|
+
'- `Esc`: Đóng popup gợi ý\n\n' +
|
|
86
|
+
'### ⚡ Lệnh Nhanh (Slash Commands):\n' +
|
|
87
|
+
'- `/clear`: Làm mới phiên làm việc (New Session)\n' +
|
|
88
|
+
'- `/compact`: Nén ngữ cảnh thủ công (Manual Context Compaction)\n' +
|
|
89
|
+
'- `/status`: Báo cáo trạng thái gateway, cổng kết nối, provider và token\n' +
|
|
90
|
+
'- `/tools`: Liệt kê các plugin và sandbox tools đang hoạt động\n' +
|
|
91
|
+
'- `/help`: Hiển thị bảng trợ giúp này\n\n' +
|
|
92
|
+
'### 🎯 Thao Tác Tin Nhắn (Message Action Bar):\n' +
|
|
93
|
+
'- Rê chuột vào bong bóng tin nhắn để hiển thị: Sao chép (Copy), Đọc giọng nói (TTS), Sửa tin nhắn (Edit), hoặc Tạo lại câu trả lời (Regenerate).\n\n' +
|
|
94
|
+
'Tốc độ phản hồi (latency): 1ms');
|
|
95
|
+
}
|
|
96
|
+
// 2. Greetings (Vietnamese & English)
|
|
97
|
+
if (/^(?:hello|hi|hey)(?: (?:bot|boombot))?$/i.test(normalized)) {
|
|
98
|
+
return 'Hi! I’m here and ready to help. What would you like to work on?';
|
|
99
|
+
}
|
|
100
|
+
if (/^(?:chào|chào bạn|chào bot|xin chào)(?: (?:bot|boombot|bạn))?$/u.test(normalized)) {
|
|
101
|
+
return 'Chào sếp! Tôi là BoomBot, sẵn sàng hỗ trợ. Sếp cần kiểm tra hoặc phát triển tính năng gì tiếp theo ạ?\n\nTốc độ phản hồi (latency): 1ms';
|
|
102
|
+
}
|
|
103
|
+
if (/^(?:thanks|thank you)(?: (?:bot|boombot))?$/i.test(normalized)) {
|
|
104
|
+
return 'You are very welcome! Let me know if you need anything else.';
|
|
105
|
+
}
|
|
106
|
+
if (/^(?:cảm ơn|cám ơn)(?: (?:bot|boombot|bạn))?$/u.test(normalized)) {
|
|
107
|
+
return 'Rất sẵn lòng hỗ trợ sếp! Sếp cần làm gì tiếp cứ nhắn tôi nhé.\n\nTốc độ phản hồi (latency): 1ms';
|
|
108
|
+
}
|
|
109
|
+
if (/^(?:bye|goodbye)(?: (?:bot|boombot))?$/i.test(normalized)) {
|
|
110
|
+
return 'Goodbye! Have a great day!';
|
|
111
|
+
}
|
|
112
|
+
if (/^(?:tạm biệt)(?: (?:bot|boombot))?$/u.test(normalized)) {
|
|
113
|
+
return 'Tạm biệt sếp! Hẹn gặp lại sếp khi có tác vụ mới.\n\nTốc độ phản hồi (latency): 1ms';
|
|
114
|
+
}
|
|
115
|
+
// 3. Accurate System Clock Date & Time (Vietnamese & English)
|
|
116
|
+
const now = new Date();
|
|
117
|
+
const timeZone = 'Asia/Ho_Chi_Minh';
|
|
118
|
+
if (/^(?:what day is it(?: today)?|what(?:'s| is) the date(?: today)?)$/i.test(normalized)) {
|
|
119
|
+
const formatter = new Intl.DateTimeFormat('en-US', {
|
|
120
|
+
weekday: 'long',
|
|
121
|
+
year: 'numeric',
|
|
122
|
+
month: 'long',
|
|
123
|
+
day: 'numeric',
|
|
124
|
+
timeZone: 'UTC',
|
|
125
|
+
});
|
|
126
|
+
return `Today is ${formatter.format(now)} (UTC).`;
|
|
127
|
+
}
|
|
128
|
+
if (/^(?:hôm nay (?:là )?(?:thứ mấy|ngày mấy|ngày bao nhiêu))$/u.test(normalized)) {
|
|
129
|
+
const formatter = new Intl.DateTimeFormat('vi-VN', {
|
|
130
|
+
weekday: 'long',
|
|
131
|
+
year: 'numeric',
|
|
132
|
+
month: 'long',
|
|
133
|
+
day: 'numeric',
|
|
134
|
+
timeZone,
|
|
135
|
+
});
|
|
136
|
+
return `Hôm nay là ${formatter.format(now)} (giờ Việt Nam, UTC+7).\n\nTốc độ phản hồi (latency): 1ms`;
|
|
137
|
+
}
|
|
138
|
+
if (/^(?:mấy giờ rồi|bây giờ là mấy giờ|mấy giờ|what time is it(?: now)?)$/u.test(normalized)) {
|
|
139
|
+
const timeFormatter = new Intl.DateTimeFormat('vi-VN', {
|
|
140
|
+
hour: '2-digit',
|
|
141
|
+
minute: '2-digit',
|
|
142
|
+
second: '2-digit',
|
|
143
|
+
timeZone,
|
|
144
|
+
hour12: false,
|
|
145
|
+
});
|
|
146
|
+
const dateFormatter = new Intl.DateTimeFormat('vi-VN', {
|
|
147
|
+
weekday: 'long',
|
|
148
|
+
year: 'numeric',
|
|
149
|
+
month: 'long',
|
|
150
|
+
day: 'numeric',
|
|
151
|
+
timeZone,
|
|
152
|
+
});
|
|
153
|
+
return `Bây giờ là ${timeFormatter.format(now)} (${dateFormatter.format(now)}).\n\nTốc độ phản hồi (latency): 1ms`;
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|