@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,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @boombot/sandbox — injectable subprocess sandbox.
|
|
3
|
+
*
|
|
4
|
+
* Honest framing (root SECURITY.md §3): the `subprocess` backend is
|
|
5
|
+
* OS-process isolation, NOT a container/VM. It contains: timeout kill of
|
|
6
|
+
* the whole process group on POSIX (grandchildren die with the child),
|
|
7
|
+
* cwd confinement, env allowlist-only, output limits, shell-metacharacter
|
|
8
|
+
* rejection. It does NOT contain: a grandchild that calls setsid() to leave
|
|
9
|
+
* the process group, subprocesses started outside the sandbox by
|
|
10
|
+
* plugins/MCP, or a hostile binary exploiting a kernel bug. On Windows
|
|
11
|
+
* Node cannot signal a process group, so the kill stays single-process and
|
|
12
|
+
* grandchildren may survive there. For strong isolation, add a Docker/
|
|
13
|
+
* cloud backend behind the same `SandboxProvider` interface.
|
|
14
|
+
*/
|
|
15
|
+
import { spawn } from 'node:child_process';
|
|
16
|
+
import { dirname, resolve, sep } from 'node:path';
|
|
17
|
+
/**
|
|
18
|
+
* Reject shell metacharacters in the *executable* (cmd[0]). Arguments are
|
|
19
|
+
* passed to the executable literally with `shell: false`, so characters
|
|
20
|
+
* like `;` or `$` inside an argument are inert — e.g. `node -e 'a;b'`
|
|
21
|
+
* receives the script verbatim. The executable path is where a smuggled
|
|
22
|
+
* `sh -c` chain or command substitution would do damage, so it gets the
|
|
23
|
+
* strict check.
|
|
24
|
+
*/
|
|
25
|
+
const SHELL_METACHARACTERS = /[|&;`$<>()"'\n\r]/;
|
|
26
|
+
export function assertNoShellMetacharacters(cmd) {
|
|
27
|
+
const executable = cmd[0];
|
|
28
|
+
if (executable !== undefined && SHELL_METACHARACTERS.test(executable)) {
|
|
29
|
+
throw new Error(`SubprocessSandbox: refusing executable containing shell metacharacters: ${JSON.stringify(executable.slice(0, 80))}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Resolve `cwd` and prove it stays inside `root`. Throws on escape. */
|
|
33
|
+
export function confineCwd(root, cwd) {
|
|
34
|
+
const resolvedRoot = resolve(root);
|
|
35
|
+
const resolvedCwd = resolve(resolvedRoot, cwd);
|
|
36
|
+
if (resolvedCwd !== resolvedRoot && !resolvedCwd.startsWith(resolvedRoot + sep)) {
|
|
37
|
+
throw new Error(`SubprocessSandbox: cwd escapes workspaceRoot (root=${resolvedRoot}, cwd=${resolvedCwd})`);
|
|
38
|
+
}
|
|
39
|
+
return resolvedCwd;
|
|
40
|
+
}
|
|
41
|
+
export function buildSandboxEnv(allowlist, minPath) {
|
|
42
|
+
const env = { PATH: minPath };
|
|
43
|
+
// Windows crypto/process initialization needs the OS directory even when
|
|
44
|
+
// the caller asks for an otherwise empty environment. It is not a secret.
|
|
45
|
+
if (process.platform === 'win32') {
|
|
46
|
+
env['SystemRoot'] = process.env['SystemRoot'] ?? 'C:\\Windows';
|
|
47
|
+
env['WINDIR'] = process.env['WINDIR'] ?? env['SystemRoot'];
|
|
48
|
+
// Prevent cp1252 UnicodeEncodeError for Vietnamese and UTF-8 output on Windows
|
|
49
|
+
env['PYTHONUTF8'] = '1';
|
|
50
|
+
env['PYTHONIOENCODING'] = 'utf-8';
|
|
51
|
+
}
|
|
52
|
+
for (const name of allowlist) {
|
|
53
|
+
const value = process.env[name];
|
|
54
|
+
if (value !== undefined)
|
|
55
|
+
env[name] = value;
|
|
56
|
+
}
|
|
57
|
+
return env;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Platform-aware default for `minPath`. The POSIX value cannot work on
|
|
61
|
+
* Windows: `spawn` resolves bare executables via PATH, and without
|
|
62
|
+
* System32 even `where`/built-ins fail. The running Node's own directory
|
|
63
|
+
* is appended so `node` itself is spawnable by name (the gateway's own
|
|
64
|
+
* runtime — scripts the agent runs usually want it).
|
|
65
|
+
*/
|
|
66
|
+
export function defaultMinPath() {
|
|
67
|
+
if (process.platform === 'win32') {
|
|
68
|
+
return ['C:\\Windows\\System32', 'C:\\Windows', dirname(process.execPath)].join(';');
|
|
69
|
+
}
|
|
70
|
+
return '/usr/bin:/bin';
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Subprocess sandbox: `spawn` WITHOUT a shell, timeout kill
|
|
74
|
+
* (SIGTERM → SIGKILL after grace, delivered to the whole process group on
|
|
75
|
+
* POSIX), cwd confinement, env allowlist-only, and per-stream output caps.
|
|
76
|
+
*
|
|
77
|
+
* Known limitations: on POSIX the child is spawned detached as a process
|
|
78
|
+
* group leader, so the timeout kill reaches grandchildren — unless a
|
|
79
|
+
* grandchild calls setsid() to escape into its own group. On Windows Node
|
|
80
|
+
* cannot signal a process group, so the kill stays single-process and
|
|
81
|
+
* grandchildren may survive. Neither is a container/VM boundary: use a
|
|
82
|
+
* container backend when that matters.
|
|
83
|
+
*
|
|
84
|
+
* Windows behavior: Node maps both SIGTERM and SIGKILL to TerminateProcess,
|
|
85
|
+
* so the two-phase kill has no graceful phase on win32 — the process dies on
|
|
86
|
+
* the first kill and the grace timer is cleared by `close`. `kill()` on an
|
|
87
|
+
* already-exited process is a safe no-op (returns false, never throws), and
|
|
88
|
+
* a group kill whose members are all gone throws ESRCH which is swallowed,
|
|
89
|
+
* so a grace timer racing the process's natural exit cannot throw or hang
|
|
90
|
+
* the promise: `finish()` is idempotent and `close` always clears the timer.
|
|
91
|
+
*/
|
|
92
|
+
export class SubprocessSandbox {
|
|
93
|
+
name = 'subprocess';
|
|
94
|
+
workspaceRoot;
|
|
95
|
+
defaultTimeoutMs;
|
|
96
|
+
maxOutputBytes;
|
|
97
|
+
killGraceMs;
|
|
98
|
+
minPath;
|
|
99
|
+
constructor(options) {
|
|
100
|
+
if (typeof options.workspaceRoot !== 'string' || options.workspaceRoot.length === 0) {
|
|
101
|
+
throw new Error('SubprocessSandbox: workspaceRoot is required');
|
|
102
|
+
}
|
|
103
|
+
this.workspaceRoot = resolve(options.workspaceRoot);
|
|
104
|
+
this.defaultTimeoutMs = options.defaultTimeoutMs ?? 30_000;
|
|
105
|
+
this.maxOutputBytes = options.maxOutputBytes ?? 1_048_576;
|
|
106
|
+
this.killGraceMs = options.killGraceMs ?? 2000;
|
|
107
|
+
this.minPath = options.minPath ?? defaultMinPath();
|
|
108
|
+
}
|
|
109
|
+
async run(cmd, opts) {
|
|
110
|
+
if (cmd.length === 0)
|
|
111
|
+
throw new Error('SubprocessSandbox: cmd must not be empty');
|
|
112
|
+
const executable = cmd[0];
|
|
113
|
+
if (executable === undefined || executable.length === 0) {
|
|
114
|
+
throw new Error('SubprocessSandbox: cmd[0] must not be empty');
|
|
115
|
+
}
|
|
116
|
+
assertNoShellMetacharacters(cmd);
|
|
117
|
+
const cwd = confineCwd(this.workspaceRoot, opts.cwd);
|
|
118
|
+
const timeoutMs = opts.timeoutMs > 0 ? opts.timeoutMs : this.defaultTimeoutMs;
|
|
119
|
+
const env = buildSandboxEnv(opts.envAllowlist ?? [], this.minPath);
|
|
120
|
+
const maxBytes = this.maxOutputBytes;
|
|
121
|
+
return new Promise((promiseResolve) => {
|
|
122
|
+
let settled = false;
|
|
123
|
+
let graceTimer;
|
|
124
|
+
const finish = (result) => {
|
|
125
|
+
if (settled)
|
|
126
|
+
return;
|
|
127
|
+
settled = true;
|
|
128
|
+
clearTimeout(timeoutTimer);
|
|
129
|
+
// NOTE: the grace timer is deliberately NOT cleared here. It only
|
|
130
|
+
// exists after the timeout fired, and the direct child's `close`
|
|
131
|
+
// does not mean the group is empty — a SIGTERM-ignoring grandchild
|
|
132
|
+
// may still run. The timer stays armed so its SIGKILL reaps group
|
|
133
|
+
// stragglers; `killTree` swallows ESRCH when the group is already
|
|
134
|
+
// fully dead. (The timer is unref'd, so it never holds the loop.)
|
|
135
|
+
promiseResolve(result);
|
|
136
|
+
};
|
|
137
|
+
// POSIX: spawn detached so the child becomes a process-group leader.
|
|
138
|
+
// The timeout kill below signals the whole group (negative pid), so
|
|
139
|
+
// double-forked grandchildren die with the child instead of escaping
|
|
140
|
+
// as orphans. Windows has no process-group signaling through Node, so
|
|
141
|
+
// `detached` stays off there and the kill is single-process.
|
|
142
|
+
const child = spawn(executable, cmd.slice(1), {
|
|
143
|
+
cwd,
|
|
144
|
+
env,
|
|
145
|
+
shell: false,
|
|
146
|
+
detached: process.platform !== 'win32',
|
|
147
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
148
|
+
});
|
|
149
|
+
/**
|
|
150
|
+
* Kill the child — and on POSIX the entire process group it leads.
|
|
151
|
+
* A group whose members have all exited no longer exists: the ESRCH
|
|
152
|
+
* from `process.kill` is swallowed because "nothing left to kill" is
|
|
153
|
+
* exactly the outcome wanted.
|
|
154
|
+
*/
|
|
155
|
+
const killTree = (signal) => {
|
|
156
|
+
try {
|
|
157
|
+
if (process.platform === 'win32' || child.pid === undefined) {
|
|
158
|
+
child.kill(signal);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
process.kill(-child.pid, signal);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// ESRCH: the process/group is already gone.
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
const stdoutChunks = [];
|
|
169
|
+
const stderrChunks = [];
|
|
170
|
+
let truncated = false;
|
|
171
|
+
let timedOut = false;
|
|
172
|
+
const stdoutState = { chunks: stdoutChunks, bytes: 0 };
|
|
173
|
+
const stderrState = { chunks: stderrChunks, bytes: 0 };
|
|
174
|
+
const collect = (state, data) => {
|
|
175
|
+
if (state.bytes >= maxBytes) {
|
|
176
|
+
truncated = true;
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const remaining = maxBytes - state.bytes;
|
|
180
|
+
if (data.length > remaining) {
|
|
181
|
+
state.chunks.push(data.subarray(0, remaining));
|
|
182
|
+
state.bytes = maxBytes;
|
|
183
|
+
truncated = true;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
state.chunks.push(data);
|
|
187
|
+
state.bytes += data.length;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
child.stdout?.on('data', (data) => collect(stdoutState, data));
|
|
191
|
+
child.stderr?.on('data', (data) => collect(stderrState, data));
|
|
192
|
+
const timeoutTimer = setTimeout(() => {
|
|
193
|
+
timedOut = true;
|
|
194
|
+
killTree('SIGTERM');
|
|
195
|
+
graceTimer = setTimeout(() => {
|
|
196
|
+
killTree('SIGKILL');
|
|
197
|
+
}, this.killGraceMs);
|
|
198
|
+
if (graceTimer.unref !== undefined)
|
|
199
|
+
graceTimer.unref();
|
|
200
|
+
}, timeoutMs);
|
|
201
|
+
if (timeoutTimer.unref !== undefined)
|
|
202
|
+
timeoutTimer.unref();
|
|
203
|
+
child.on('error', (err) => {
|
|
204
|
+
finish({
|
|
205
|
+
stdout: Buffer.concat(stdoutChunks).toString('utf8'),
|
|
206
|
+
stderr: `sandbox spawn error: ${err.message}`,
|
|
207
|
+
exitCode: null,
|
|
208
|
+
timedOut: false,
|
|
209
|
+
truncated,
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
child.on('close', (code, signal) => {
|
|
213
|
+
// When the timeout did NOT fire, no grace timer can exist (it is
|
|
214
|
+
// only armed by the timeout) — clear defensively. When it DID fire,
|
|
215
|
+
// the timer stays armed: the direct child being gone does not mean
|
|
216
|
+
// the group is empty (see `finish`).
|
|
217
|
+
if (!timedOut && graceTimer !== undefined)
|
|
218
|
+
clearTimeout(graceTimer);
|
|
219
|
+
finish({
|
|
220
|
+
stdout: Buffer.concat(stdoutChunks).toString('utf8'),
|
|
221
|
+
stderr: Buffer.concat(stderrChunks).toString('utf8'),
|
|
222
|
+
exitCode: signal === null ? code : null,
|
|
223
|
+
timedOut,
|
|
224
|
+
truncated,
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { GuardPolicyConfig, GuardVerdict, TaggedContent } from './types.js';
|
|
2
|
+
export declare function wrapUntrusted(source: string, content: string): TaggedContent;
|
|
3
|
+
export declare function wrapTrusted(source: string, content: string): TaggedContent;
|
|
4
|
+
export interface BoundaryMatch {
|
|
5
|
+
readonly patternId: string;
|
|
6
|
+
/** Up to 120 characters of content surrounding the match. */
|
|
7
|
+
readonly excerpt: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Rule-based scan of a content string for instruction-like payloads.
|
|
11
|
+
* Returns one match per distinct pattern (first occurrence), in pattern order.
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectInstructions(content: string): BoundaryMatch[];
|
|
14
|
+
/**
|
|
15
|
+
* Boundary layer verdict for tagged content:
|
|
16
|
+
* - `trusted` content is never inspected (provenance is the trust root).
|
|
17
|
+
* - `untrusted` content with no matches is allowed.
|
|
18
|
+
* - Prompt-leak matches, or two or more distinct patterns, are `high` severity.
|
|
19
|
+
* - A single ordinary pattern is `medium` severity.
|
|
20
|
+
* The severity is then resolved through {@link decide} against the policy.
|
|
21
|
+
*/
|
|
22
|
+
export declare function scanTagged(tagged: TaggedContent, policy: GuardPolicyConfig): GuardVerdict;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { decide } from './policy.js';
|
|
2
|
+
export function wrapUntrusted(source, content) {
|
|
3
|
+
return { trust: 'untrusted', source, content };
|
|
4
|
+
}
|
|
5
|
+
export function wrapTrusted(source, content) {
|
|
6
|
+
return { trust: 'trusted', source, content };
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Instruction-like patterns typical of prompt-injection payloads.
|
|
10
|
+
* All regexes are case-insensitive and deliberately anchored on the
|
|
11
|
+
* instruction verb + target so ordinary uses of words like "ignore"
|
|
12
|
+
* (e.g. "ignore the previous email") do not match.
|
|
13
|
+
*/
|
|
14
|
+
const PATTERNS = [
|
|
15
|
+
{
|
|
16
|
+
id: 'ignore-previous-instructions',
|
|
17
|
+
re: /\bignore\s+(all\s+)?(your\s+|the\s+)?(previous|prior|earlier|above)\s+instructions?\b/i,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'disregard-previous-instructions',
|
|
21
|
+
re: /\bdisregard\s+(all\s+)?(your\s+|the\s+)?(previous|prior|above)\s+instructions?\b/i,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: 'you-are-now',
|
|
25
|
+
re: /\byou\s+are\s+now\b/i,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'forget-everything',
|
|
29
|
+
re: /\bforget\s+(everything|all)\b/i,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'conceal-from-user',
|
|
33
|
+
re: /\bdo\s+not\s+(tell|reveal|mention|disclose|share)\b[^.!?]{0,60}\b(the\s+)?(user|human)\b/i,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'reveal-system-prompt',
|
|
37
|
+
re: /\b(reveal|disclose|expose|show|print)\b[^.!?]{0,40}\byour\s+system\s+prompt\b/i,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: 'new-instructions',
|
|
41
|
+
re: /\bnew\s+instructions?\s*:/i,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'override-your',
|
|
45
|
+
re: /\boverride\s+(your|the)\b/i,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
const EXCERPT_BEFORE = 40;
|
|
49
|
+
const EXCERPT_MAX = 120;
|
|
50
|
+
function excerptAround(content, index) {
|
|
51
|
+
const start = Math.max(0, index - EXCERPT_BEFORE);
|
|
52
|
+
const end = Math.min(content.length, start + EXCERPT_MAX);
|
|
53
|
+
return content.slice(start, end);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Rule-based scan of a content string for instruction-like payloads.
|
|
57
|
+
* Returns one match per distinct pattern (first occurrence), in pattern order.
|
|
58
|
+
*/
|
|
59
|
+
export function detectInstructions(content) {
|
|
60
|
+
const matches = [];
|
|
61
|
+
for (const pattern of PATTERNS) {
|
|
62
|
+
// Fresh lastIndex each call: patterns are module-level regexes without /g,
|
|
63
|
+
// so exec is stateless, but re-running exec keeps this robust anyway.
|
|
64
|
+
const found = pattern.re.exec(content);
|
|
65
|
+
if (found !== null) {
|
|
66
|
+
matches.push({
|
|
67
|
+
patternId: pattern.id,
|
|
68
|
+
excerpt: excerptAround(content, found.index),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return matches;
|
|
73
|
+
}
|
|
74
|
+
const PROMPT_LEAK_ID = 'reveal-system-prompt';
|
|
75
|
+
/**
|
|
76
|
+
* Boundary layer verdict for tagged content:
|
|
77
|
+
* - `trusted` content is never inspected (provenance is the trust root).
|
|
78
|
+
* - `untrusted` content with no matches is allowed.
|
|
79
|
+
* - Prompt-leak matches, or two or more distinct patterns, are `high` severity.
|
|
80
|
+
* - A single ordinary pattern is `medium` severity.
|
|
81
|
+
* The severity is then resolved through {@link decide} against the policy.
|
|
82
|
+
*/
|
|
83
|
+
export function scanTagged(tagged, policy) {
|
|
84
|
+
if (tagged.trust === 'trusted') {
|
|
85
|
+
return {
|
|
86
|
+
decision: 'allow',
|
|
87
|
+
reason: `trusted content from ${tagged.source}: not inspected`,
|
|
88
|
+
layer: 'boundary',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const matches = detectInstructions(tagged.content);
|
|
92
|
+
if (matches.length === 0) {
|
|
93
|
+
return {
|
|
94
|
+
decision: 'allow',
|
|
95
|
+
reason: `untrusted content from ${tagged.source}: no injection patterns`,
|
|
96
|
+
layer: 'boundary',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const ids = matches.map((m) => m.patternId);
|
|
100
|
+
const isPromptLeak = ids.includes(PROMPT_LEAK_ID);
|
|
101
|
+
const severity = isPromptLeak || ids.length >= 2 ? 'high' : 'medium';
|
|
102
|
+
const reason = `untrusted content from ${tagged.source} matched ${ids.length} ` +
|
|
103
|
+
`injection pattern(s): ${ids.join(', ')}`;
|
|
104
|
+
return decide(policy, 'boundary', severity, reason);
|
|
105
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@boombot/security` — deterministic tool gates (layer: `'gates'`).
|
|
3
|
+
*
|
|
4
|
+
* Fail-closed static checks that run *before* a tool executes:
|
|
5
|
+
*
|
|
6
|
+
* - `tokenizeBash` / `analyzeBash` — a hand-written bash tokenizer (quotes,
|
|
7
|
+
* escapes, comments, operators, `$(...)`, backticks, `${...}`) plus a
|
|
8
|
+
* rule-based risk classifier. Deterministic: the same command always yields
|
|
9
|
+
* the same risk. When in doubt it escalates (fail-closed).
|
|
10
|
+
* - `checkHttpUrl` — outbound URL gate: protocol check, userinfo (credential
|
|
11
|
+
* in URL) check, and hostname allowlist with `*.example.com` wildcards.
|
|
12
|
+
* - `evaluateToolCall` — the entry point the verifier imports. Routes a tool
|
|
13
|
+
* call through deny-list / approval-list / bash-like / http-like gates.
|
|
14
|
+
*
|
|
15
|
+
* Zero dependencies. Findings are mapped to a severity and passed to `decide()`
|
|
16
|
+
* from `./policy.js` so `GuardMode` semantics stay in one place; clean checks
|
|
17
|
+
* (no finding at all) allow directly, so strict mode never denies a command
|
|
18
|
+
* or URL that nothing flagged. Every finding's reason names the exact
|
|
19
|
+
* construct that was caught.
|
|
20
|
+
*/
|
|
21
|
+
import type { GuardPolicyConfig, GuardToolCall, GuardVerdict } from './types.js';
|
|
22
|
+
/**
|
|
23
|
+
* Tokenize a bash command line.
|
|
24
|
+
*
|
|
25
|
+
* Handles single/double quotes (quote-aware, quotes stripped from the token
|
|
26
|
+
* value), backslash escapes, `#` comments (only at the start of a word,
|
|
27
|
+
* outside quotes), and emits operators as standalone tokens: `|`, `||`,
|
|
28
|
+
* `&&`, `;`, `;;`, `&`, `>`, `>>`, `<`, `<<`, `(`, `)`, `{`, `}`, `` ` ``,
|
|
29
|
+
* `$(`, `${`.
|
|
30
|
+
*
|
|
31
|
+
* This is a real tokenizer, not a naive whitespace split: `echo "a b" | cat`
|
|
32
|
+
* yields `['echo', 'a b', '|', 'cat']`, and `#` inside quotes never starts a
|
|
33
|
+
* comment.
|
|
34
|
+
*/
|
|
35
|
+
export declare function tokenizeBash(command: string): string[];
|
|
36
|
+
export interface BashAnalysis {
|
|
37
|
+
readonly risk: 'low' | 'medium' | 'high' | 'critical';
|
|
38
|
+
readonly reasons: string[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Analyze a bash command and classify its risk.
|
|
42
|
+
*
|
|
43
|
+
* - `critical`: `rm -rf /` (and `/*`, `~`, `$HOME` variants, `--recursive`
|
|
44
|
+
* `--force` spellings), `mkfs`, `dd … of=/dev/…`, fork bombs
|
|
45
|
+
* (`:(){ :|:& };:` and whitespace/named variants), `> /dev/sdX`.
|
|
46
|
+
* - `high`: piping a download into a shell (`curl … | sh`, `… | sudo sh`),
|
|
47
|
+
* `$(curl …)` / backtick command substitution fetching remote content,
|
|
48
|
+
* env exfiltration (`env | curl …`), writes to system paths (`/etc/`,
|
|
49
|
+
* `/usr/bin`, …), `chmod -R 777 /`.
|
|
50
|
+
* - `medium`: any `sudo`, `nc -l` listeners, `chmod +x` on a downloaded
|
|
51
|
+
* file, `find / … -delete`.
|
|
52
|
+
* - `low`: everything else.
|
|
53
|
+
*
|
|
54
|
+
* Every finding appends a reason quoting the exact construct caught; the
|
|
55
|
+
* overall risk is the maximum over all findings (fail-closed).
|
|
56
|
+
*/
|
|
57
|
+
export declare function analyzeBash(command: string): BashAnalysis;
|
|
58
|
+
/**
|
|
59
|
+
* Gate an outbound URL (layer: `'gates'`).
|
|
60
|
+
*
|
|
61
|
+
* - Unparseable URL → deny, severity `critical`.
|
|
62
|
+
* - Non-http(s) protocol → deny, severity `high`.
|
|
63
|
+
* - Userinfo (`user:pass@host`) → deny, severity `high` ("credential in URL").
|
|
64
|
+
* - `httpMode: 'off'` → allow. `'warn'` → off-list hosts still allow, but the
|
|
65
|
+
* reason flags them (severity `low`). `'allowlist'` → off-list hosts deny
|
|
66
|
+
* with severity `high`.
|
|
67
|
+
*
|
|
68
|
+
* Host matching is case-insensitive, ignores ports, and supports exact and
|
|
69
|
+
* `*.example.com` wildcard entries.
|
|
70
|
+
*/
|
|
71
|
+
export declare function checkHttpUrl(rawUrl: string, policy: GuardPolicyConfig): GuardVerdict;
|
|
72
|
+
/**
|
|
73
|
+
* Evaluate one tool call against the gates layer.
|
|
74
|
+
*
|
|
75
|
+
* Order (first match wins):
|
|
76
|
+
* 1. guard `off` → allow unconditionally;
|
|
77
|
+
* 2. name exactly in `denyTools` → deny (`critical`);
|
|
78
|
+
* 3. name exactly in `approvalTools` → require-approval;
|
|
79
|
+
* 4. write-zone gate — `file.write`/`file.edit` (by `path`) and `shell.exec`
|
|
80
|
+
* (by explicit `cwd`) outside every configured `writeZones` →
|
|
81
|
+
* require-approval (fail-closed); in-zone keeps the previous behavior;
|
|
82
|
+
* 5. bash-like — name matches the bash regex **or** a string arg named
|
|
83
|
+
* `command`/`script`/`cmd` → `analyzeBash`; risk `medium`/`high`/`critical`
|
|
84
|
+
* goes through `decide()`, risk `low` (no findings) allows directly;
|
|
85
|
+
* 6. http-like — name in the known research/fetch set, name matches
|
|
86
|
+
* `/fetch|https?|request/i`, **or** a string arg named `url`/`href`/`link`
|
|
87
|
+
* → `checkHttpUrl` on that URL argument;
|
|
88
|
+
* 7. anything else → allow.
|
|
89
|
+
*/
|
|
90
|
+
export declare function evaluateToolCall(call: GuardToolCall, policy: GuardPolicyConfig): GuardVerdict;
|