@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,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jev — local 2-tier cognitive gate (System 1 Reflex).
|
|
3
|
+
*
|
|
4
|
+
* Tier 1 rules (pure TypeScript, zero LLM calls):
|
|
5
|
+
* - Noul: detect prompt injection, catastrophic commands, and policy violations.
|
|
6
|
+
* - Choice: classify intent into routing buckets.
|
|
7
|
+
*
|
|
8
|
+
* Philosophy:
|
|
9
|
+
* - Deterministic keywords first, then lightweight heuristics.
|
|
10
|
+
* - No external network, no model inference — target < 2ms per evaluation.
|
|
11
|
+
* - Threshold > 0.5 on noul score → BLOCK immediately.
|
|
12
|
+
* - Confidence < 0.45 on choice → escalate to System 2.
|
|
13
|
+
*/
|
|
14
|
+
// ───────────────────────── Noul patterns (danger detection) ─────────────────
|
|
15
|
+
/** Hard danger signals: any single hit raises noul > 0.5 immediately. */
|
|
16
|
+
const DANGER_HARD = [
|
|
17
|
+
// Prompt injection classic patterns
|
|
18
|
+
/ignore (?:all )?(?:previous|prior) (?:instructions?|rules?|prompts?)/iu,
|
|
19
|
+
/bỏ qua (?:mọi|tất cả) (?:chỉ dẫn|hướng dẫn|quy tắc)/iu,
|
|
20
|
+
/forget (?:all )?(?:your )?(?:instructions?|rules?|system prompt)/iu,
|
|
21
|
+
/you are now (?:a|an) (?:jailbreak|DAN|unrestricted)/iu,
|
|
22
|
+
/act as (?:a|an) (?:jailbreak|DAN|evil|harmful)/iu,
|
|
23
|
+
// Catastrophic shell commands
|
|
24
|
+
/rm\s+-rf\s+(?:\/|~|\*|\.)/u,
|
|
25
|
+
/rd\s+\/s\s+\/q\s+(?:c:|d:|\\)/iu,
|
|
26
|
+
/format\s+(?:c:|d:|\/dev\/)/iu,
|
|
27
|
+
/mkfs\./u,
|
|
28
|
+
/dd\s+if=\/dev\/zero/u,
|
|
29
|
+
// Database nukes
|
|
30
|
+
/drop\s+(?:database|table|schema)\s+/iu,
|
|
31
|
+
/truncate\s+table\s+/iu,
|
|
32
|
+
/delete\s+from\s+\w+\s*(?:;|$)/iu,
|
|
33
|
+
// Code execution via eval/exec
|
|
34
|
+
/\beval\s*\(/u,
|
|
35
|
+
/__import__\s*\(\s*['"]os['"]/u,
|
|
36
|
+
/exec\s*\(\s*(?:os\.|subprocess\.)/u,
|
|
37
|
+
// Owner Guard bypass attempts
|
|
38
|
+
/(?:reveal|show|print|output|leak)\s+(?:your\s+)?(?:system\s+prompt|api\s+key|secret|token|password)/iu,
|
|
39
|
+
/(?:pretend|assume|imagine)\s+(?:you\s+are|you're)\s+(?:ryan|the\s+owner|sếp)/iu,
|
|
40
|
+
];
|
|
41
|
+
/** Soft danger signals: accumulated points contribute to noul score. */
|
|
42
|
+
const DANGER_SOFT = [
|
|
43
|
+
[/wget\s+.+\s*\|\s*(?:bash|sh|python)/u, 0.25],
|
|
44
|
+
[/curl\s+.+\s*\|\s*(?:bash|sh|python)/u, 0.25],
|
|
45
|
+
[/sudo\s+/u, 0.15],
|
|
46
|
+
[/chmod\s+[0-7]{3,4}\s+/u, 0.12],
|
|
47
|
+
[/base64\s+-d\s+/u, 0.18],
|
|
48
|
+
[/powershell\s+-(?:e(?:nc)?|encodedcommand)/iu, 0.22],
|
|
49
|
+
[/new-object\s+net\.webclient/iu, 0.20],
|
|
50
|
+
[/invoke-expression/iu, 0.22],
|
|
51
|
+
// Attempts to push agent to reveal internal data
|
|
52
|
+
[/(?:what|show|tell|list).+(?:api.?key|secret|token|password|credentials?)/iu, 0.30],
|
|
53
|
+
[/system\s+prompt/iu, 0.28],
|
|
54
|
+
];
|
|
55
|
+
function evalNoul(text, startMs) {
|
|
56
|
+
// Hard patterns: immediate block
|
|
57
|
+
for (const pattern of DANGER_HARD) {
|
|
58
|
+
if (pattern.test(text)) {
|
|
59
|
+
return {
|
|
60
|
+
type: 'noul',
|
|
61
|
+
noul: 0.92,
|
|
62
|
+
decision: true,
|
|
63
|
+
reason: `Matched hard-danger pattern: ${pattern.source.slice(0, 60)}`,
|
|
64
|
+
latency_ms: Date.now() - startMs,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Soft accumulation
|
|
69
|
+
let score = 0.02; // baseline — clean input
|
|
70
|
+
let matchedReason;
|
|
71
|
+
for (const [pattern, weight] of DANGER_SOFT) {
|
|
72
|
+
if (pattern.test(text)) {
|
|
73
|
+
score += weight;
|
|
74
|
+
matchedReason ??= `Soft signal: ${pattern.source.slice(0, 50)}`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
score = Math.min(0.95, score);
|
|
78
|
+
return {
|
|
79
|
+
type: 'noul',
|
|
80
|
+
noul: Math.round(score * 10000) / 10000,
|
|
81
|
+
decision: score > 0.5,
|
|
82
|
+
reason: score > 0.1 ? matchedReason : undefined,
|
|
83
|
+
latency_ms: Date.now() - startMs,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// ───────────────────────── Choice routing classifier ────────────────────────
|
|
87
|
+
export const DEFAULT_CHOICES = [
|
|
88
|
+
'file', // read/write/edit local files
|
|
89
|
+
'shell', // run terminal commands
|
|
90
|
+
'search', // web search or file grep
|
|
91
|
+
'code', // write, review, refactor code
|
|
92
|
+
'memory', // save/recall memory
|
|
93
|
+
'skill', // load a skill
|
|
94
|
+
'chat', // general conversation, Q&A
|
|
95
|
+
'creative', // write prose, poetry, design
|
|
96
|
+
'analysis', // data analysis, reasoning
|
|
97
|
+
'task', // schedule, plan, delegate
|
|
98
|
+
];
|
|
99
|
+
/** Weighted keyword signals per choice bucket. */
|
|
100
|
+
const CHOICE_SIGNALS = [
|
|
101
|
+
['file', ['file', 'đọc', 'ghi', 'sửa', 'tập tin', 'read', 'write', 'edit', 'open', 'save', 'path', 'directory', 'folder'], 1.0],
|
|
102
|
+
['shell', ['bash', 'cmd', 'terminal', 'lệnh', 'command', 'run', 'chạy', 'execute', 'script', 'shell'], 1.0],
|
|
103
|
+
['search', ['search', 'tìm', 'find', 'grep', 'web', 'lookup', 'query', 'tra cứu', 'google', 'look up'], 1.0],
|
|
104
|
+
['code', ['code', 'function', 'class', 'implement', 'refactor', 'debug', 'fix', 'bug', 'viết', 'typescript', 'python', 'rust', 'build', 'compile'], 1.0],
|
|
105
|
+
['memory', ['nhớ', 'remember', 'memory', 'lưu', 'save', 'note', 'bộ nhớ', 'ghi nhớ', 'add to memory'], 0.9],
|
|
106
|
+
['skill', ['skill', 'skills', 'kỹ năng', 'load skill', 'use skill'], 0.8],
|
|
107
|
+
['analysis', ['analyze', 'phân tích', 'tính toán', 'calculate', 'evaluate', 'compare', 'assess', 'summary', 'summarize', 'chart'], 1.0],
|
|
108
|
+
['task', ['schedule', 'cron', 'task', 'plan', 'delegate', 'lịch', 'nhắc nhở', 'remind', 'todo', 'deadline'], 0.9],
|
|
109
|
+
['creative', ['viết', 'write', 'sáng tác', 'poem', 'thơ', 'story', 'article', 'blog', 'design', 'idea', 'brainstorm'], 0.8],
|
|
110
|
+
['chat', ['chào', 'hello', 'hi', 'how', 'what', 'why', 'when', 'tell me', 'explain', 'hỏi', 'giải thích', 'chia sẻ'], 0.7],
|
|
111
|
+
];
|
|
112
|
+
function evalChoice(text, choices, startMs) {
|
|
113
|
+
const lower = text.toLowerCase();
|
|
114
|
+
const probs = {};
|
|
115
|
+
// Populate with user-requested choices; use default weights if available.
|
|
116
|
+
for (const bucket of choices) {
|
|
117
|
+
const signalRow = CHOICE_SIGNALS.find(([b]) => b === bucket);
|
|
118
|
+
if (!signalRow) {
|
|
119
|
+
probs[bucket] = 0.05; // unknown bucket — minimal prior
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const [, keywords, base] = signalRow;
|
|
123
|
+
let hits = 0;
|
|
124
|
+
for (const kw of keywords) {
|
|
125
|
+
if (lower.includes(kw))
|
|
126
|
+
hits++;
|
|
127
|
+
}
|
|
128
|
+
probs[bucket] = Math.max(0.01, base * (hits * 0.35 + 0.1));
|
|
129
|
+
}
|
|
130
|
+
// Normalise to a probability distribution
|
|
131
|
+
const total = Object.values(probs).reduce((a, b) => a + b, 0);
|
|
132
|
+
for (const k of Object.keys(probs)) {
|
|
133
|
+
probs[k] = Math.round((probs[k] / total) * 10000) / 10000;
|
|
134
|
+
}
|
|
135
|
+
const best = Object.entries(probs).sort(([, a], [, b]) => b - a)[0];
|
|
136
|
+
const [choice, confidence] = best ?? ['chat', 0.1];
|
|
137
|
+
return {
|
|
138
|
+
type: 'choice',
|
|
139
|
+
choice,
|
|
140
|
+
probabilities: probs,
|
|
141
|
+
confidence,
|
|
142
|
+
latency_ms: Date.now() - startMs,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Evaluate a user message through System 1 (Jev — pure TS, < 2ms, zero LLM calls).
|
|
147
|
+
*
|
|
148
|
+
* Returns `passed: false` when the message triggers a danger threshold —
|
|
149
|
+
* the caller MUST NOT route to System 2 in that case.
|
|
150
|
+
*/
|
|
151
|
+
export function jevEval(text, opts) {
|
|
152
|
+
const startMs = Date.now();
|
|
153
|
+
const choices = opts?.choices ?? DEFAULT_CHOICES;
|
|
154
|
+
const blockThreshold = opts?.blockThreshold ?? 0.5;
|
|
155
|
+
const noul = evalNoul(text, startMs);
|
|
156
|
+
const choice = evalChoice(text, choices, startMs);
|
|
157
|
+
const totalMs = Date.now() - startMs;
|
|
158
|
+
return {
|
|
159
|
+
noul,
|
|
160
|
+
choice,
|
|
161
|
+
passed: noul.noul <= blockThreshold,
|
|
162
|
+
latency_ms: totalMs,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface JevNoulResult {
|
|
2
|
+
readonly type: 'noul';
|
|
3
|
+
/** Probability of danger/malicious intent (0.0 to 1.0). */
|
|
4
|
+
readonly noul: number;
|
|
5
|
+
/** True if flagged dangerous (noul > 0.5). */
|
|
6
|
+
readonly decision: boolean;
|
|
7
|
+
readonly reason?: string;
|
|
8
|
+
readonly latency_ms: number;
|
|
9
|
+
}
|
|
10
|
+
export interface JevChoiceResult {
|
|
11
|
+
readonly type: 'choice';
|
|
12
|
+
readonly choice: string;
|
|
13
|
+
readonly probabilities: Record<string, number>;
|
|
14
|
+
readonly confidence: number;
|
|
15
|
+
readonly latency_ms: number;
|
|
16
|
+
}
|
|
17
|
+
export interface JevEvaluation {
|
|
18
|
+
readonly noul: JevNoulResult;
|
|
19
|
+
readonly choice: JevChoiceResult;
|
|
20
|
+
readonly passed: boolean;
|
|
21
|
+
readonly latency_ms: number;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @boombot/core — hard resource caps for the LLM memory-consolidation job.
|
|
3
|
+
*
|
|
4
|
+
* Consolidation runs as a background job outside the agent turn loop. The LLM
|
|
5
|
+
* is the expensive resource here, so every run is bounded on four axes:
|
|
6
|
+
* conversations scanned, transcript chars fed to the model, LLM calls made,
|
|
7
|
+
* and wall-clock time. When any cap is hit the job stops cleanly and reports
|
|
8
|
+
* the stop reason — it never throws, never retries, and never fails the host.
|
|
9
|
+
*
|
|
10
|
+
* Pure logic, zero repo dependencies: safe to unit-test in isolation and to
|
|
11
|
+
* import from `packages/core` (a leaf package) without pulling agent-worker.
|
|
12
|
+
*/
|
|
13
|
+
export interface ConsolidationBudget {
|
|
14
|
+
/** Max conversations scanned per run. Must be >= 1. */
|
|
15
|
+
maxConversationsPerRun: number;
|
|
16
|
+
/** Max total transcript chars handed to the LLM per run. Must be >= 1. */
|
|
17
|
+
maxInputCharsPerRun: number;
|
|
18
|
+
/** Max LLM completion calls per run. Must be >= 1. */
|
|
19
|
+
maxLlmCallsPerRun: number;
|
|
20
|
+
/** Wall-clock budget per run in ms. Must be >= 1. */
|
|
21
|
+
timeoutMs: number;
|
|
22
|
+
/**
|
|
23
|
+
* Conversations shorter than this many chars are skipped without spending
|
|
24
|
+
* an LLM call (relevance pre-filter: one-liners rarely hold durable facts).
|
|
25
|
+
* Must be >= 0.
|
|
26
|
+
*/
|
|
27
|
+
minConversationChars: number;
|
|
28
|
+
}
|
|
29
|
+
/** Sane defaults: ~20 conversations or ~60k chars or 10 LLM calls or 2 min. */
|
|
30
|
+
export declare const DEFAULT_CONSOLIDATION_BUDGET: ConsolidationBudget;
|
|
31
|
+
export type BudgetStopReason = 'max-conversations' | 'max-input-chars' | 'max-llm-calls' | 'timeout';
|
|
32
|
+
export interface BudgetUsage {
|
|
33
|
+
conversations: number;
|
|
34
|
+
inputChars: number;
|
|
35
|
+
llmCalls: number;
|
|
36
|
+
elapsedMs: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Tracks one consolidation run against a `ConsolidationBudget`.
|
|
40
|
+
*
|
|
41
|
+
* `admitConversation` / `admitLlmCall` both check AND record: they return
|
|
42
|
+
* `null` when the unit is admitted, or the `BudgetStopReason` when a cap
|
|
43
|
+
* would be exceeded (in which case nothing is recorded and the caller should
|
|
44
|
+
* stop the run cleanly). `checkDeadline` reports a timeout without recording.
|
|
45
|
+
*/
|
|
46
|
+
export declare class ConsolidationBudgetTracker {
|
|
47
|
+
private readonly budget;
|
|
48
|
+
private readonly now;
|
|
49
|
+
private readonly startedAt;
|
|
50
|
+
private conversations;
|
|
51
|
+
private inputChars;
|
|
52
|
+
private llmCalls;
|
|
53
|
+
constructor(budget: ConsolidationBudget, now?: () => number);
|
|
54
|
+
/** Admit one conversation of `chars` transcript chars, or report the cap hit. */
|
|
55
|
+
admitConversation(chars: number): BudgetStopReason | null;
|
|
56
|
+
/** Admit one LLM call, or report the cap hit. */
|
|
57
|
+
admitLlmCall(): BudgetStopReason | null;
|
|
58
|
+
/** Report 'timeout' once the wall-clock budget is exhausted, else null. */
|
|
59
|
+
checkDeadline(): BudgetStopReason | null;
|
|
60
|
+
/** Too short to be worth an LLM call — the relevance pre-filter. */
|
|
61
|
+
isBelowMinChars(chars: number): boolean;
|
|
62
|
+
get usage(): BudgetUsage;
|
|
63
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @boombot/core — hard resource caps for the LLM memory-consolidation job.
|
|
3
|
+
*
|
|
4
|
+
* Consolidation runs as a background job outside the agent turn loop. The LLM
|
|
5
|
+
* is the expensive resource here, so every run is bounded on four axes:
|
|
6
|
+
* conversations scanned, transcript chars fed to the model, LLM calls made,
|
|
7
|
+
* and wall-clock time. When any cap is hit the job stops cleanly and reports
|
|
8
|
+
* the stop reason — it never throws, never retries, and never fails the host.
|
|
9
|
+
*
|
|
10
|
+
* Pure logic, zero repo dependencies: safe to unit-test in isolation and to
|
|
11
|
+
* import from `packages/core` (a leaf package) without pulling agent-worker.
|
|
12
|
+
*/
|
|
13
|
+
/** Sane defaults: ~20 conversations or ~60k chars or 10 LLM calls or 2 min. */
|
|
14
|
+
export const DEFAULT_CONSOLIDATION_BUDGET = Object.freeze({
|
|
15
|
+
maxConversationsPerRun: 20,
|
|
16
|
+
maxInputCharsPerRun: 60_000,
|
|
17
|
+
maxLlmCallsPerRun: 10,
|
|
18
|
+
timeoutMs: 120_000,
|
|
19
|
+
minConversationChars: 200,
|
|
20
|
+
});
|
|
21
|
+
function requirePositiveInt(name, value) {
|
|
22
|
+
if (!Number.isFinite(value) || Math.floor(value) !== value || value < 1) {
|
|
23
|
+
throw new Error(`ConsolidationBudget: ${name} must be a positive integer, got ${value}`);
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Tracks one consolidation run against a `ConsolidationBudget`.
|
|
29
|
+
*
|
|
30
|
+
* `admitConversation` / `admitLlmCall` both check AND record: they return
|
|
31
|
+
* `null` when the unit is admitted, or the `BudgetStopReason` when a cap
|
|
32
|
+
* would be exceeded (in which case nothing is recorded and the caller should
|
|
33
|
+
* stop the run cleanly). `checkDeadline` reports a timeout without recording.
|
|
34
|
+
*/
|
|
35
|
+
export class ConsolidationBudgetTracker {
|
|
36
|
+
budget;
|
|
37
|
+
now;
|
|
38
|
+
startedAt;
|
|
39
|
+
conversations = 0;
|
|
40
|
+
inputChars = 0;
|
|
41
|
+
llmCalls = 0;
|
|
42
|
+
constructor(budget, now = () => Date.now()) {
|
|
43
|
+
this.budget = budget;
|
|
44
|
+
this.now = now;
|
|
45
|
+
requirePositiveInt('maxConversationsPerRun', budget.maxConversationsPerRun);
|
|
46
|
+
requirePositiveInt('maxInputCharsPerRun', budget.maxInputCharsPerRun);
|
|
47
|
+
requirePositiveInt('maxLlmCallsPerRun', budget.maxLlmCallsPerRun);
|
|
48
|
+
requirePositiveInt('timeoutMs', budget.timeoutMs);
|
|
49
|
+
if (!Number.isFinite(budget.minConversationChars) || budget.minConversationChars < 0) {
|
|
50
|
+
throw new Error(`ConsolidationBudget: minConversationChars must be >= 0, got ${budget.minConversationChars}`);
|
|
51
|
+
}
|
|
52
|
+
this.startedAt = this.now();
|
|
53
|
+
}
|
|
54
|
+
/** Admit one conversation of `chars` transcript chars, or report the cap hit. */
|
|
55
|
+
admitConversation(chars) {
|
|
56
|
+
const deadline = this.checkDeadline();
|
|
57
|
+
if (deadline !== null)
|
|
58
|
+
return deadline;
|
|
59
|
+
if (this.conversations >= this.budget.maxConversationsPerRun)
|
|
60
|
+
return 'max-conversations';
|
|
61
|
+
const safeChars = Number.isFinite(chars) && chars > 0 ? Math.floor(chars) : 0;
|
|
62
|
+
if (this.inputChars + safeChars > this.budget.maxInputCharsPerRun)
|
|
63
|
+
return 'max-input-chars';
|
|
64
|
+
this.conversations += 1;
|
|
65
|
+
this.inputChars += safeChars;
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/** Admit one LLM call, or report the cap hit. */
|
|
69
|
+
admitLlmCall() {
|
|
70
|
+
const deadline = this.checkDeadline();
|
|
71
|
+
if (deadline !== null)
|
|
72
|
+
return deadline;
|
|
73
|
+
if (this.llmCalls >= this.budget.maxLlmCallsPerRun)
|
|
74
|
+
return 'max-llm-calls';
|
|
75
|
+
this.llmCalls += 1;
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
/** Report 'timeout' once the wall-clock budget is exhausted, else null. */
|
|
79
|
+
checkDeadline() {
|
|
80
|
+
return this.now() - this.startedAt >= this.budget.timeoutMs ? 'timeout' : null;
|
|
81
|
+
}
|
|
82
|
+
/** Too short to be worth an LLM call — the relevance pre-filter. */
|
|
83
|
+
isBelowMinChars(chars) {
|
|
84
|
+
return chars < this.budget.minConversationChars;
|
|
85
|
+
}
|
|
86
|
+
get usage() {
|
|
87
|
+
return {
|
|
88
|
+
conversations: this.conversations,
|
|
89
|
+
inputChars: this.inputChars,
|
|
90
|
+
llmCalls: this.llmCalls,
|
|
91
|
+
elapsedMs: this.now() - this.startedAt,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @boombot/core — LLM memory consolidation as a background job.
|
|
3
|
+
*
|
|
4
|
+
* Lesson from Hermes (and ChatGPT "Dreaming" / Mem0 research): consolidation
|
|
5
|
+
* — extracting durable facts from past conversations into long-term memory —
|
|
6
|
+
* must run as a background job with its own cursor, NEVER inside the agent
|
|
7
|
+
* turn loop. The loop is latency-sensitive and every extraction costs an LLM
|
|
8
|
+
* call; a per-turn hook would burn calls on small talk and touch the hot
|
|
9
|
+
* path. The host drives `runConsolidation` (or `ConsolidationJob`) on a
|
|
10
|
+
* timer, far away from turns.
|
|
11
|
+
*
|
|
12
|
+
* Design (non-destructive, Mem0-style):
|
|
13
|
+
* - Extraction is per conversation, via an injected LLM. The core never
|
|
14
|
+
* imports agent-worker: the model arrives as `ConsolidationLlm`.
|
|
15
|
+
* - Writes are append-only through `MemoryProvider.save()` with
|
|
16
|
+
* `provenance.source = 'model'`. There is no update path and no atomic
|
|
17
|
+
* swap — superseding, if ever needed, is a host concern.
|
|
18
|
+
* - Deduplication is rule-based (normalized exact match, Mem0's NOOP):
|
|
19
|
+
* no extra LLM call is spent deciding whether a fact already exists.
|
|
20
|
+
* - A relevance pre-filter skips conversations shorter than
|
|
21
|
+
* `budget.minConversationChars` before any LLM call (AgentX-style).
|
|
22
|
+
* - Progress is a watermark cursor under `CONSOLIDATION_STATE_ID`, advanced
|
|
23
|
+
* only past fully-processed conversations, so a crash or restart never
|
|
24
|
+
* loses work and never reprocesses.
|
|
25
|
+
* - Four hard budget axes (conversations / input chars / LLM calls /
|
|
26
|
+
* wall-clock) stop the run cleanly with a reason. The job never throws
|
|
27
|
+
* for LLM or budget reasons — it reports.
|
|
28
|
+
*
|
|
29
|
+
* Pure with respect to the agent loop: this module never sees a turn.
|
|
30
|
+
*/
|
|
31
|
+
import { type BudgetStopReason, type BudgetUsage, type ConsolidationBudget } from './budget.js';
|
|
32
|
+
import type { MemoryProvider } from '../provider.js';
|
|
33
|
+
import type { MemoryScope } from '../types.js';
|
|
34
|
+
/**
|
|
35
|
+
* Sentinel memory id under which consolidation run state (the watermark
|
|
36
|
+
* cursor) is kept. Mirrors the host's `memory:curation` convention: the
|
|
37
|
+
* state lives in the store's audit trail, not in a separate KV table.
|
|
38
|
+
*/
|
|
39
|
+
export declare const CONSOLIDATION_STATE_ID = "memory:consolidation";
|
|
40
|
+
/** Actor id recorded in provenance for consolidation-written records. */
|
|
41
|
+
export declare const CONSOLIDATION_ACTOR_ID = "memory-consolidation";
|
|
42
|
+
/**
|
|
43
|
+
* The only way the consolidator talks to a model: one injected text
|
|
44
|
+
* completion per conversation. The host adapts its real LLM client
|
|
45
|
+
* (streaming or not) to this shape; `packages/core` stays a leaf.
|
|
46
|
+
*/
|
|
47
|
+
export interface ConsolidationLlm {
|
|
48
|
+
completeText(prompt: string, opts?: {
|
|
49
|
+
maxTokens?: number;
|
|
50
|
+
}): Promise<string>;
|
|
51
|
+
}
|
|
52
|
+
/** A finished conversation handed to the consolidator by the host. */
|
|
53
|
+
export interface EndedConversation {
|
|
54
|
+
/** Stable conversation id (session id). Used as the provenance reference. */
|
|
55
|
+
id: string;
|
|
56
|
+
/** Principal that owns the conversation. */
|
|
57
|
+
principalId: string;
|
|
58
|
+
/** Scope extracted facts are written to (durable = principal scope). */
|
|
59
|
+
scope: MemoryScope;
|
|
60
|
+
/** Flattened user+assistant text; tool output is cut by the host. */
|
|
61
|
+
transcript: string;
|
|
62
|
+
/** ISO-8601 end time — doubles as the watermark value. */
|
|
63
|
+
endedAt: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Source of finished conversations after a watermark cursor. The host
|
|
67
|
+
* implements this over its session store; the core never touches sessions.
|
|
68
|
+
*/
|
|
69
|
+
export interface ConversationSource {
|
|
70
|
+
listEndedAfter(watermark: string | null, limit: number): Promise<readonly EndedConversation[]>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Durable cursor storage. The host implements this over whatever backs
|
|
74
|
+
* its job state (the reference host uses the memory store's audit trail
|
|
75
|
+
* under `CONSOLIDATION_STATE_ID`, mirroring `memory:curation`).
|
|
76
|
+
*/
|
|
77
|
+
export interface WatermarkStore {
|
|
78
|
+
get(key: string): string | null;
|
|
79
|
+
set(key: string, value: string): void;
|
|
80
|
+
}
|
|
81
|
+
export interface ConsolidationReport {
|
|
82
|
+
at: string;
|
|
83
|
+
/** Conversations fully handled (including short-skips and parse-skips). */
|
|
84
|
+
processed: number;
|
|
85
|
+
factsCreated: number;
|
|
86
|
+
skippedShort: number;
|
|
87
|
+
skippedDuplicate: number;
|
|
88
|
+
stopReason: BudgetStopReason | 'completed' | 'llm-error';
|
|
89
|
+
usage: BudgetUsage;
|
|
90
|
+
}
|
|
91
|
+
export interface RunConsolidationDeps {
|
|
92
|
+
llm: ConsolidationLlm;
|
|
93
|
+
store: MemoryProvider;
|
|
94
|
+
conversations: ConversationSource;
|
|
95
|
+
watermarks: WatermarkStore;
|
|
96
|
+
budget?: ConsolidationBudget;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Build the extraction prompt for one conversation transcript. Exported so
|
|
100
|
+
* hosts (and tests) can see the exact contract, including the no-secrets
|
|
101
|
+
* guardrail: consolidation reads raw transcripts, so the extraction prompt
|
|
102
|
+
* must explicitly forbid persisting credentials.
|
|
103
|
+
*/
|
|
104
|
+
export declare function buildExtractionPrompt(transcript: string): string;
|
|
105
|
+
/**
|
|
106
|
+
* Parse the model's extraction output into fact strings. Tolerant: accepts
|
|
107
|
+
* a bare array, objects with a "text" field, or plain strings; extracts the
|
|
108
|
+
* first `[...]` block when the model adds prose anyway. Unparseable output
|
|
109
|
+
* yields an empty list (the conversation is skipped, never fatal).
|
|
110
|
+
*/
|
|
111
|
+
export declare function parseExtractedFacts(raw: string): string[];
|
|
112
|
+
/**
|
|
113
|
+
* Run one consolidation pass: read the watermark, extract durable facts from
|
|
114
|
+
* each new conversation via the injected LLM, and append them to memory.
|
|
115
|
+
*
|
|
116
|
+
* Never throws for LLM or budget reasons — failures are reported in
|
|
117
|
+
* `stopReason`. The watermark advances only past fully-processed
|
|
118
|
+
* conversations, so an LLM failure leaves the failed conversation for the
|
|
119
|
+
* next run while keeping everything already written.
|
|
120
|
+
*/
|
|
121
|
+
export declare function runConsolidation(deps: RunConsolidationDeps): Promise<ConsolidationReport>;
|
|
122
|
+
export interface ConsolidationJobOptions {
|
|
123
|
+
llm: ConsolidationLlm;
|
|
124
|
+
store: MemoryProvider;
|
|
125
|
+
conversations: ConversationSource;
|
|
126
|
+
watermarks: WatermarkStore;
|
|
127
|
+
budget?: ConsolidationBudget;
|
|
128
|
+
/** Interval between runs in ms. Default 30 minutes. */
|
|
129
|
+
intervalMs?: number;
|
|
130
|
+
/**
|
|
131
|
+
* Called when a scheduled run throws. `runConsolidation` itself never
|
|
132
|
+
* throws for LLM/budget reasons; this covers host-adapter failures
|
|
133
|
+
* (session store down, watermark store down).
|
|
134
|
+
*/
|
|
135
|
+
onError?: (error: unknown) => void;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Background job that runs consolidation on a timer. Start it once at host
|
|
139
|
+
* boot; it never touches the agent loop. `runOnce()` exists for tests and
|
|
140
|
+
* for hosts that drive scheduling themselves (e.g. cron). Mirrors
|
|
141
|
+
* `CurationJob`, except the run is async (the LLM is remote).
|
|
142
|
+
*/
|
|
143
|
+
export declare class ConsolidationJob {
|
|
144
|
+
private readonly options;
|
|
145
|
+
private timer;
|
|
146
|
+
private running;
|
|
147
|
+
constructor(options: ConsolidationJobOptions);
|
|
148
|
+
start(): void;
|
|
149
|
+
stop(): void;
|
|
150
|
+
get isRunning(): boolean;
|
|
151
|
+
runOnce(): Promise<ConsolidationReport>;
|
|
152
|
+
}
|