@vellumai/assistant 0.7.1 → 0.7.3
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/ARCHITECTURE.md +48 -50
- package/Dockerfile +1 -0
- package/README.md +1 -2
- package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
- package/bun.lock +26 -26
- package/docs/architecture/memory.md +5 -2
- package/docs/architecture/security.md +20 -0
- package/docs/plugins.md +7 -9
- package/knip.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
- package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +1020 -40
- package/package.json +6 -3
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +384 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-routes-http.test.ts +23 -6
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +157 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
- package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
- package/src/__tests__/background-shell-host-bash.test.ts +14 -15
- package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +49 -1
- package/src/__tests__/call-conversation-messages.test.ts +8 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
- package/src/__tests__/channel-readiness-service.test.ts +62 -2
- package/src/__tests__/checker.test.ts +3 -4
- package/src/__tests__/config-loader-backfill.test.ts +461 -147
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +1 -0
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
- package/src/__tests__/config-watcher.test.ts +142 -71
- package/src/__tests__/context-search-agent-runner.test.ts +61 -3
- package/src/__tests__/context-search-conversations-source.test.ts +0 -24
- package/src/__tests__/context-search-fanout.test.ts +0 -1
- package/src/__tests__/context-search-memory-source.test.ts +3 -7
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
- package/src/__tests__/context-search-pkb-source.test.ts +0 -1
- package/src/__tests__/context-search-workspace-source.test.ts +0 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
- package/src/__tests__/conversation-agent-loop.test.ts +454 -5
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-error.test.ts +150 -3
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +36 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-process-callsite.test.ts +43 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
- package/src/__tests__/conversation-slash-commands.test.ts +0 -4
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-store.test.ts +0 -18
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credentials-cli.test.ts +12 -12
- package/src/__tests__/cu-unified-flow.test.ts +351 -23
- package/src/__tests__/daemon-credential-client.test.ts +101 -19
- package/src/__tests__/date-context.test.ts +164 -2
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/disk-pressure-guard.test.ts +262 -0
- package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
- package/src/__tests__/disk-pressure-policy.test.ts +241 -0
- package/src/__tests__/disk-pressure-routes.test.ts +379 -0
- package/src/__tests__/disk-pressure-tools.test.ts +277 -0
- package/src/__tests__/disk-usage.test.ts +150 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/events-client-registration.test.ts +52 -0
- package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
- package/src/__tests__/file-write-tool.test.ts +4 -10
- package/src/__tests__/filing-service.test.ts +3 -4
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
- package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
- package/src/__tests__/heartbeat-service.test.ts +968 -2
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/host-app-control-proxy.test.ts +772 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +439 -47
- package/src/__tests__/host-bash-routes.test.ts +459 -0
- package/src/__tests__/host-browser-proxy.test.ts +24 -22
- package/src/__tests__/host-browser-routes.test.ts +39 -13
- package/src/__tests__/host-cu-proxy.test.ts +248 -52
- package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
- package/src/__tests__/host-file-proxy.test.ts +301 -45
- package/src/__tests__/host-file-read-tool.test.ts +17 -0
- package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +22 -4
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
- package/src/__tests__/host-transfer-proxy.test.ts +121 -22
- package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
- package/src/__tests__/http-user-message-parity.test.ts +108 -1
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/injector-chain.test.ts +18 -6
- package/src/__tests__/injector-disk-pressure.test.ts +224 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -1
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/managed-profile-guard.test.ts +18 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
- package/src/__tests__/mcp-abort-signal.test.ts +130 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-admin-recall.test.ts +3 -11
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
- package/src/__tests__/migration-import-commit-http.test.ts +108 -2
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/normalize-onboarding.test.ts +180 -0
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-connect-routes.test.ts +316 -0
- package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/onboarding-persona-write.test.ts +308 -0
- package/src/__tests__/openai-provider.test.ts +45 -8
- package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
- package/src/__tests__/platform-callback-registration.test.ts +21 -4
- package/src/__tests__/platform.test.ts +2 -1
- package/src/__tests__/playbook-execution.test.ts +0 -43
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
- package/src/__tests__/process-message-background-slack.test.ts +2 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/provider-tool-name.test.ts +23 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/relay-server.test.ts +15 -4
- package/src/__tests__/require-fresh-approval.test.ts +0 -1
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-events-sse.test.ts +2 -2
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +3 -0
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/suggestion-routes.test.ts +46 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
- package/src/__tests__/tool-executor.test.ts +0 -1
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
- package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
- package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
- package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/approvals/guardian-decision-primitive.ts +13 -0
- package/src/approvals/guardian-request-resolvers.ts +16 -17
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +51 -151
- package/src/backup/paths.ts +2 -18
- package/src/backup/restore.ts +107 -231
- package/src/backup/snapshot-lock.ts +2 -27
- package/src/bundler/app-bundler.ts +51 -3
- package/src/bundler/compiler-tools.ts +3 -2
- package/src/calls/call-conversation-messages.ts +46 -10
- package/src/calls/relay-server.ts +4 -44
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +33 -105
- package/src/calls/twilio-routes.ts +11 -12
- package/src/channels/types.ts +8 -7
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/bash.ts +35 -108
- package/src/cli/commands/clients.ts +36 -37
- package/src/cli/commands/contacts.ts +137 -25
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +71 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +9 -6
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +303 -7
- package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
- package/src/cli/commands/oauth/connect.ts +127 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
- package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
- package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +16 -25
- package/src/cli/commands/status.ts +57 -0
- package/src/cli/lib/daemon-credential-client.ts +110 -28
- package/src/cli/program.ts +6 -2
- package/src/config/assistant-feature-flags.ts +79 -12
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +0 -2
- package/src/config/env.ts +19 -20
- package/src/config/feature-flag-registry.json +47 -135
- package/src/config/loader.ts +197 -104
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/calls.ts +0 -9
- package/src/config/schemas/channels.ts +0 -5
- package/src/config/schemas/heartbeat.ts +64 -1
- package/src/config/schemas/ingress.ts +10 -6
- package/src/config/schemas/llm.ts +7 -10
- package/src/config/schemas/memory-lifecycle.ts +90 -24
- package/src/config/schemas/memory-v2.ts +121 -13
- package/src/config/schemas/platform.ts +49 -3
- package/src/config/schemas/services.ts +29 -15
- package/src/config/schemas/skills.ts +0 -6
- package/src/config/seed-inference-profiles.ts +230 -33
- package/src/contacts/contact-store.ts +0 -55
- package/src/contacts/contacts-write.ts +0 -27
- package/src/context/window-manager.ts +1 -2
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +12 -41
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
- package/src/daemon/assistant-attachments.ts +4 -4
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +89 -60
- package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
- package/src/daemon/conversation-agent-loop.ts +202 -61
- package/src/daemon/conversation-error.ts +87 -15
- package/src/daemon/conversation-lifecycle.ts +9 -4
- package/src/daemon/conversation-process.ts +24 -11
- package/src/daemon/conversation-runtime-assembly.ts +28 -2
- package/src/daemon/conversation-store.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +305 -4
- package/src/daemon/conversation-tool-setup.ts +66 -62
- package/src/daemon/conversation.ts +38 -24
- package/src/daemon/date-context.ts +71 -22
- package/src/daemon/disk-pressure-background-gate.ts +73 -0
- package/src/daemon/disk-pressure-guard.ts +343 -0
- package/src/daemon/disk-pressure-policy.ts +163 -0
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/handlers/shared.ts +4 -2
- package/src/daemon/handlers/skills.ts +3 -4
- package/src/daemon/host-app-control-proxy.ts +389 -0
- package/src/daemon/host-bash-proxy.ts +117 -82
- package/src/daemon/host-browser-proxy.ts +67 -82
- package/src/daemon/host-cu-proxy.ts +127 -86
- package/src/daemon/host-file-proxy.ts +129 -69
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +338 -129
- package/src/daemon/lifecycle.ts +194 -145
- package/src/daemon/meet-host-supervisor.ts +4 -4
- package/src/daemon/meet-manifest-loader.ts +0 -1
- package/src/daemon/memory-v2-startup.ts +14 -4
- package/src/daemon/message-protocol.ts +6 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +15 -8
- package/src/daemon/message-types/disk-pressure.ts +9 -0
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +4 -0
- package/src/daemon/message-types/host-cu.ts +2 -0
- package/src/daemon/message-types/host-file.ts +4 -0
- package/src/daemon/message-types/host-transfer.ts +3 -0
- package/src/daemon/message-types/messages.ts +3 -0
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/process-message.ts +18 -1
- package/src/daemon/profiler-run-store.ts +5 -5
- package/src/daemon/shutdown-handlers.ts +0 -3
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/documents/document-store.ts +85 -0
- package/src/events/tool-audit-listener.ts +2 -1
- package/src/filing/filing-service.ts +30 -5
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
- package/src/heartbeat/heartbeat-run-store.ts +249 -0
- package/src/heartbeat/heartbeat-service.ts +459 -54
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-scheduler.ts +18 -0
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +17 -92
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/platform-callback-registration.ts +8 -15
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/assistant-server.ts +70 -3
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/gateway-client.ts +37 -3
- package/src/live-voice/live-voice-archive.ts +4 -4
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +5 -7
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/media/image-service.ts +1 -7
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/admin.ts +5 -9
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +51 -9
- package/src/memory/context-search/sources/conversations.ts +2 -11
- package/src/memory/context-search/sources/memory-v2.ts +22 -9
- package/src/memory/context-search/sources/memory.ts +0 -1
- package/src/memory/context-search/types.ts +0 -1
- package/src/memory/conversation-crud.ts +5 -13
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/db-init.ts +6 -0
- package/src/memory/embedding-backend.ts +9 -21
- package/src/memory/embedding-runtime-manager.ts +119 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
- package/src/memory/graph/conversation-graph-memory.ts +43 -78
- package/src/memory/graph/extraction.ts +1 -3
- package/src/memory/graph/graph-search.test.ts +10 -67
- package/src/memory/graph/graph-search.ts +9 -20
- package/src/memory/graph/retriever.test.ts +6 -0
- package/src/memory/graph/retriever.ts +34 -10
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/indexer.ts +54 -45
- package/src/memory/job-handlers/backfill.ts +2 -11
- package/src/memory/job-handlers/cleanup.ts +43 -0
- package/src/memory/job-handlers/embedding.ts +6 -8
- package/src/memory/job-handlers/summarization.ts +2 -7
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +114 -22
- package/src/memory/jobs-worker.ts +193 -106
- package/src/memory/memory-v2-activation-log-store.ts +33 -15
- package/src/memory/memory-v2-concept-frequency.ts +169 -0
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/pkb/pkb-search.test.ts +6 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +49 -32
- package/src/memory/rerank-local.ts +374 -0
- package/src/memory/schema/infrastructure.ts +15 -0
- package/src/memory/search/semantic.ts +13 -67
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/trace-event-store.ts +1 -17
- package/src/memory/v2/__tests__/activation.test.ts +387 -344
- package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
- package/src/memory/v2/__tests__/injection.test.ts +181 -169
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
- package/src/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/memory/v2/__tests__/sim.test.ts +154 -188
- package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +76 -2
- package/src/memory/v2/activation.ts +213 -239
- package/src/memory/v2/consolidation-job.ts +65 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/injection.ts +123 -103
- package/src/memory/v2/prompts/consolidation.ts +348 -92
- package/src/memory/v2/qdrant.ts +198 -1
- package/src/memory/v2/reranker.ts +177 -0
- package/src/memory/v2/sim.ts +113 -77
- package/src/memory/v2/skill-content.ts +4 -3
- package/src/memory/v2/skill-store.ts +91 -53
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +28 -5
- package/src/memory/v2/types.ts +10 -10
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/slack/adapter.ts +1 -31
- package/src/messaging/providers/slack/types.ts +0 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/copy-composer.ts +13 -0
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/notifications/signal.ts +4 -0
- package/src/oauth/AGENTS.md +3 -1
- package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
- package/src/oauth/connect-orchestrator.ts +6 -0
- package/src/oauth/connection-resolver.test.ts +66 -1
- package/src/oauth/connection-resolver.ts +55 -1
- package/src/oauth/credential-token-resolver.ts +1 -3
- package/src/oauth/manual-token-connection.ts +0 -4
- package/src/oauth/oauth-connect-state.ts +77 -0
- package/src/oauth/seed-providers.ts +58 -1
- package/src/outbound-proxy/index.ts +1 -37
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +3 -17
- package/src/permissions/gateway-threshold-reader.ts +2 -0
- package/src/permissions/prompter.ts +34 -1
- package/src/permissions/secret-prompter.ts +6 -2
- package/src/plugins/defaults/injectors.ts +35 -2
- package/src/plugins/defaults/memory-retrieval.ts +5 -6
- package/src/plugins/types.ts +7 -0
- package/src/proactive-artifact/aux-message-injector.ts +74 -0
- package/src/proactive-artifact/decision.test.ts +226 -0
- package/src/proactive-artifact/decision.ts +165 -0
- package/src/proactive-artifact/index.ts +7 -0
- package/src/proactive-artifact/job.test.ts +867 -0
- package/src/proactive-artifact/job.ts +352 -0
- package/src/proactive-artifact/message-copy.ts +41 -0
- package/src/proactive-artifact/trigger-state.test.ts +277 -0
- package/src/proactive-artifact/trigger-state.ts +119 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/normalize-onboarding.ts +80 -0
- package/src/prompts/persona-resolver.ts +101 -9
- package/src/prompts/system-prompt.ts +23 -24
- package/src/prompts/templates/BOOTSTRAP.md +13 -5
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/providers/__tests__/retry-callsite.test.ts +222 -1
- package/src/providers/model-intents.ts +7 -0
- package/src/providers/openrouter/client.ts +8 -0
- package/src/providers/retry.ts +50 -0
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +1 -0
- package/src/runtime/__tests__/agent-wake.test.ts +456 -3
- package/src/runtime/agent-wake.ts +238 -100
- package/src/runtime/assistant-event-hub.ts +151 -99
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
- package/src/runtime/auth/middleware.ts +0 -96
- package/src/runtime/auth/route-policy.ts +32 -0
- package/src/runtime/auth/same-actor.ts +216 -0
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/channel-retry-sweep.ts +65 -1
- package/src/runtime/guardian-reply-router.ts +10 -0
- package/src/runtime/http-server.ts +3 -329
- package/src/runtime/http-types.ts +0 -5
- package/src/runtime/local-actor-identity.ts +52 -11
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
- package/src/runtime/migrations/migration-transport.ts +7 -7
- package/src/runtime/migrations/vbundle-builder.ts +327 -60
- package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +245 -68
- package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
- package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +114 -0
- package/src/runtime/pending-interactions.ts +43 -9
- package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
- package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/client-routes.ts +21 -2
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/contact-routes.ts +0 -25
- package/src/runtime/routes/conversation-query-routes.ts +36 -1
- package/src/runtime/routes/conversation-routes.ts +65 -39
- package/src/runtime/routes/debug-bash-routes.ts +163 -0
- package/src/runtime/routes/disk-pressure-routes.ts +121 -0
- package/src/runtime/routes/document-pdf-renderer.ts +169 -0
- package/src/runtime/routes/documents-routes.ts +32 -75
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +38 -0
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +56 -6
- package/src/runtime/routes/host-browser-routes.ts +108 -13
- package/src/runtime/routes/host-cu-routes.ts +66 -9
- package/src/runtime/routes/host-file-routes.ts +54 -5
- package/src/runtime/routes/host-transfer-routes.ts +122 -19
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +21 -180
- package/src/runtime/routes/inbound-message-handler.ts +78 -21
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +14 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.test.ts +41 -15
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +474 -1
- package/src/runtime/routes/migration-routes.ts +96 -0
- package/src/runtime/routes/oauth-connect-routes.ts +153 -0
- package/src/runtime/routes/schedule-routes.ts +7 -0
- package/src/runtime/verification-outbound-actions.ts +4 -4
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/run-script.ts +37 -5
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -2
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +83 -39
- package/src/security/encrypted-store.ts +2 -0
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secure-keys.ts +55 -0
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/remote-skill-policy.ts +10 -16
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/index.ts +1 -7
- package/src/subagent/manager.ts +1 -15
- package/src/tasks/task-runner.ts +0 -1
- package/src/tasks/task-store.ts +0 -3
- package/src/telemetry/types.ts +2 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
- package/src/telemetry/usage-telemetry-reporter.ts +1 -0
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/background-tool-registry.ts +17 -3
- package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
- package/src/tools/browser/browser-execution.ts +2 -2
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +23 -24
- package/src/tools/browser/cdp-client/index.ts +1 -14
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +2 -0
- package/src/tools/host-filesystem/edit.test.ts +151 -0
- package/src/tools/host-filesystem/edit.ts +68 -0
- package/src/tools/host-filesystem/read.test.ts +129 -0
- package/src/tools/host-filesystem/read.ts +68 -0
- package/src/tools/host-filesystem/transfer.test.ts +127 -2
- package/src/tools/host-filesystem/transfer.ts +78 -3
- package/src/tools/host-filesystem/write.test.ts +134 -0
- package/src/tools/host-filesystem/write.ts +68 -0
- package/src/tools/host-terminal/host-shell.ts +66 -1
- package/src/tools/mcp/mcp-tool-factory.ts +2 -1
- package/src/tools/memory/register.test.ts +12 -9
- package/src/tools/memory/register.ts +1 -2
- package/src/tools/provider-tool-name.ts +28 -0
- package/src/tools/registry.ts +30 -9
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/terminal/shell.ts +9 -1
- package/src/tools/tool-approval-handler.ts +32 -11
- package/src/tools/types.ts +28 -2
- package/src/tts/provider-catalog.ts +3 -5
- package/src/usage/pricing.ts +1 -1
- package/src/util/disk-usage.ts +138 -0
- package/src/util/platform.ts +21 -11
- package/src/util/process-liveness.ts +26 -0
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/heartbeat-service.ts +19 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
- package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
- package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -782
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -472
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
- package/src/memory/v2/skill-qdrant.ts +0 -395
- package/src/outbound-proxy/config.ts +0 -20
- package/src/outbound-proxy/health.ts +0 -18
- package/src/outbound-proxy/types.ts +0 -150
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/signals/bash.ts +0 -198
- package/src/signals/mcp-reload.ts +0 -18
|
@@ -4,13 +4,13 @@ import type { RecallEvidence, RecallSource } from "./types.js";
|
|
|
4
4
|
|
|
5
5
|
export type RecallAgentConfidence = "high" | "medium" | "low";
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
interface RecallAgentToolDefinition {
|
|
8
8
|
name: string;
|
|
9
9
|
description: string;
|
|
10
10
|
input_schema: Record<string, unknown>;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
interface RecallAgentPromptOptions {
|
|
14
14
|
query: string;
|
|
15
15
|
availableSources?: readonly RecallSource[];
|
|
16
16
|
evidence: readonly RecallEvidence[];
|
|
@@ -18,7 +18,7 @@ export interface RecallAgentPromptOptions {
|
|
|
18
18
|
maxSearchCalls?: number;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
interface RecallAgentPromptBundle {
|
|
22
22
|
prompt: string;
|
|
23
23
|
evidence: RecallEvidence[];
|
|
24
24
|
}
|
|
@@ -30,14 +30,14 @@ export interface RecallAgentFinish {
|
|
|
30
30
|
unresolved?: string[];
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
type RecallFinishFallbackReason =
|
|
34
34
|
| "malformed_finish_payload"
|
|
35
35
|
| "invalid_confidence"
|
|
36
36
|
| "invalid_citation_ids"
|
|
37
37
|
| "unknown_citation_ids"
|
|
38
38
|
| "empty_answer";
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
type RecallFinishValidationResult =
|
|
41
41
|
| { ok: true; finish: RecallAgentFinish }
|
|
42
42
|
| {
|
|
43
43
|
ok: false;
|
|
@@ -46,7 +46,7 @@ export type RecallFinishValidationResult =
|
|
|
46
46
|
missingCitationIds?: string[];
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
interface RecallCitationValidationResult {
|
|
50
50
|
ok: boolean;
|
|
51
51
|
validCitationIds: string[];
|
|
52
52
|
missingCitationIds: string[];
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
ProviderResponse,
|
|
6
6
|
ToolUseContent,
|
|
7
7
|
} from "../../providers/types.js";
|
|
8
|
+
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
8
9
|
import {
|
|
9
10
|
buildRecallAgentPromptBundle,
|
|
10
11
|
FINISH_RECALL_TOOL_DEFINITION,
|
|
@@ -42,7 +43,7 @@ import type {
|
|
|
42
43
|
RecallSource,
|
|
43
44
|
} from "./types.js";
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
type AgenticRecallFallbackReason =
|
|
46
47
|
| "no_provider"
|
|
47
48
|
| "provider_error"
|
|
48
49
|
| "timeout"
|
|
@@ -51,7 +52,7 @@ export type AgenticRecallFallbackReason =
|
|
|
51
52
|
| "citation_validation_failed"
|
|
52
53
|
| "finish_answer_validation_failed";
|
|
53
54
|
|
|
54
|
-
|
|
55
|
+
interface AgenticRecallSearchDebug {
|
|
55
56
|
round: number;
|
|
56
57
|
query: string;
|
|
57
58
|
sources: RecallSource[];
|
|
@@ -61,7 +62,7 @@ export interface AgenticRecallSearchDebug {
|
|
|
61
62
|
error?: string;
|
|
62
63
|
}
|
|
63
64
|
|
|
64
|
-
|
|
65
|
+
interface AgenticRecallInspectDebug {
|
|
65
66
|
round: number;
|
|
66
67
|
paths: string[];
|
|
67
68
|
reason: string;
|
|
@@ -69,7 +70,7 @@ export interface AgenticRecallInspectDebug {
|
|
|
69
70
|
errors?: Array<{ path: string; reason: string }>;
|
|
70
71
|
}
|
|
71
72
|
|
|
72
|
-
|
|
73
|
+
interface AgenticRecallDebug {
|
|
73
74
|
mode: "agentic" | "deterministic_fallback";
|
|
74
75
|
normalizedInput: NormalizedRecallInput;
|
|
75
76
|
roundLimit: number;
|
|
@@ -86,12 +87,12 @@ export interface AgenticRecallDebug {
|
|
|
86
87
|
fallbackDetail?: string;
|
|
87
88
|
}
|
|
88
89
|
|
|
89
|
-
|
|
90
|
+
interface AgenticRecallAnswer extends RecallAnswer {
|
|
90
91
|
content: string;
|
|
91
92
|
debug: AgenticRecallDebug;
|
|
92
93
|
}
|
|
93
94
|
|
|
94
|
-
|
|
95
|
+
interface RunAgenticRecallOptions {
|
|
95
96
|
searchOptions?: DeterministicRecallSearchOptions;
|
|
96
97
|
}
|
|
97
98
|
|
|
@@ -305,7 +306,17 @@ export async function runAgenticRecall(
|
|
|
305
306
|
[...RECALL_AGENT_TOOL_DEFINITIONS],
|
|
306
307
|
undefined,
|
|
307
308
|
{
|
|
308
|
-
|
|
309
|
+
// `thinking: disabled` is required because we set `temperature: 0`
|
|
310
|
+
// explicitly. Anthropic 400s on `temperature` ≠ 1 whenever thinking
|
|
311
|
+
// is enabled or in adaptive mode; without this, profiles that
|
|
312
|
+
// resolve thinking-enabled (Opus 4.x at `effort: high|xhigh`, etc.)
|
|
313
|
+
// would fail. Recall is tool-call-heavy reasoning where determinism
|
|
314
|
+
// matters more than extended chain-of-thought.
|
|
315
|
+
config: {
|
|
316
|
+
callSite: "recall",
|
|
317
|
+
temperature: 0,
|
|
318
|
+
thinking: { type: "disabled" },
|
|
319
|
+
},
|
|
309
320
|
signal: context.signal,
|
|
310
321
|
},
|
|
311
322
|
);
|
|
@@ -414,6 +425,30 @@ export async function runAgenticRecall(
|
|
|
414
425
|
);
|
|
415
426
|
}
|
|
416
427
|
|
|
428
|
+
/**
|
|
429
|
+
* Redact secrets from workspace-sourced evidence excerpts before they are
|
|
430
|
+
* serialised into a prompt that will be sent to an external LLM provider.
|
|
431
|
+
*
|
|
432
|
+
* Memory, PKB, and conversation evidence is already controlled content —
|
|
433
|
+
* only workspace files can contain arbitrary secrets (API keys, tokens, etc.)
|
|
434
|
+
* written by the user or by tools. This runs the same pattern-based scanner
|
|
435
|
+
* used for shell command summaries and approval prompts, replacing any
|
|
436
|
+
* detected secrets with `<redacted type="…" />` markers.
|
|
437
|
+
*
|
|
438
|
+
* The original evidence array is not mutated; citations and local fallback
|
|
439
|
+
* paths continue to reference unredacted values.
|
|
440
|
+
*/
|
|
441
|
+
export function redactWorkspaceEvidence(
|
|
442
|
+
evidence: readonly RecallEvidence[],
|
|
443
|
+
): readonly RecallEvidence[] {
|
|
444
|
+
return evidence.map((item) => {
|
|
445
|
+
if (item.source !== "workspace") return item;
|
|
446
|
+
const redacted = redactSecrets(item.excerpt);
|
|
447
|
+
if (redacted === item.excerpt) return item;
|
|
448
|
+
return { ...item, excerpt: redacted };
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
|
|
417
452
|
function buildPromptBundle(
|
|
418
453
|
input: NormalizedRecallInput,
|
|
419
454
|
evidence: readonly RecallEvidence[],
|
|
@@ -422,7 +457,7 @@ function buildPromptBundle(
|
|
|
422
457
|
return buildRecallAgentPromptBundle({
|
|
423
458
|
query: input.query,
|
|
424
459
|
availableSources: input.sources,
|
|
425
|
-
evidence,
|
|
460
|
+
evidence: redactWorkspaceEvidence(evidence),
|
|
426
461
|
maxSearchCalls: roundLimit,
|
|
427
462
|
});
|
|
428
463
|
}
|
|
@@ -572,7 +607,14 @@ async function tryFinalFinishRecall(options: {
|
|
|
572
607
|
[FINISH_RECALL_TOOL_DEFINITION],
|
|
573
608
|
undefined,
|
|
574
609
|
{
|
|
575
|
-
|
|
610
|
+
// `thinking: disabled` required for the same reason as the agent
|
|
611
|
+
// round above — Anthropic 400s on `temperature` ≠ 1 whenever
|
|
612
|
+
// thinking is enabled or in adaptive mode.
|
|
613
|
+
config: {
|
|
614
|
+
callSite: "recall",
|
|
615
|
+
temperature: 0,
|
|
616
|
+
thinking: { type: "disabled" },
|
|
617
|
+
},
|
|
576
618
|
signal: options.context.signal,
|
|
577
619
|
},
|
|
578
620
|
);
|
|
@@ -88,10 +88,7 @@ export async function searchConversationSource(
|
|
|
88
88
|
|
|
89
89
|
for (const ftsMatch of ftsMatches) {
|
|
90
90
|
try {
|
|
91
|
-
rows = mergeConversationRows(
|
|
92
|
-
rows,
|
|
93
|
-
searchWithFts(ftsMatch, context.memoryScopeId, queryLimit),
|
|
94
|
-
);
|
|
91
|
+
rows = mergeConversationRows(rows, searchWithFts(ftsMatch, queryLimit));
|
|
95
92
|
} catch {
|
|
96
93
|
// Try the next, broader query shape.
|
|
97
94
|
}
|
|
@@ -100,7 +97,7 @@ export async function searchConversationSource(
|
|
|
100
97
|
}
|
|
101
98
|
|
|
102
99
|
if (rows.length === 0) {
|
|
103
|
-
rows = searchWithLike(trimmedQuery,
|
|
100
|
+
rows = searchWithLike(trimmedQuery, queryLimit);
|
|
104
101
|
}
|
|
105
102
|
|
|
106
103
|
const sortedRows = rows
|
|
@@ -130,7 +127,6 @@ export async function searchConversationSource(
|
|
|
130
127
|
|
|
131
128
|
function searchWithFts(
|
|
132
129
|
ftsMatch: string,
|
|
133
|
-
memoryScopeId: string,
|
|
134
130
|
limit: number,
|
|
135
131
|
): ConversationEvidenceRow[] {
|
|
136
132
|
return rawAll<ConversationEvidenceRow>(
|
|
@@ -146,14 +142,12 @@ function searchWithFts(
|
|
|
146
142
|
JOIN messages m ON m.id = messages_fts.message_id
|
|
147
143
|
JOIN conversations c ON c.id = m.conversation_id
|
|
148
144
|
WHERE messages_fts MATCH ?
|
|
149
|
-
AND c.memory_scope_id = ?
|
|
150
145
|
AND (c.conversation_type IS NULL OR c.conversation_type != 'private')
|
|
151
146
|
AND (c.source IS NULL OR c.source NOT IN (?, ?))
|
|
152
147
|
ORDER BY bm25(messages_fts), m.created_at DESC
|
|
153
148
|
LIMIT ?
|
|
154
149
|
`,
|
|
155
150
|
ftsMatch,
|
|
156
|
-
memoryScopeId,
|
|
157
151
|
SUBAGENT_SOURCE,
|
|
158
152
|
AUTO_ANALYSIS_SOURCE,
|
|
159
153
|
limit,
|
|
@@ -162,7 +156,6 @@ function searchWithFts(
|
|
|
162
156
|
|
|
163
157
|
function searchWithLike(
|
|
164
158
|
query: string,
|
|
165
|
-
memoryScopeId: string,
|
|
166
159
|
limit: number,
|
|
167
160
|
): ConversationEvidenceRow[] {
|
|
168
161
|
return rawAll<ConversationEvidenceRow>(
|
|
@@ -177,14 +170,12 @@ function searchWithLike(
|
|
|
177
170
|
FROM messages m
|
|
178
171
|
JOIN conversations c ON c.id = m.conversation_id
|
|
179
172
|
WHERE m.content LIKE ? ESCAPE '\\'
|
|
180
|
-
AND c.memory_scope_id = ?
|
|
181
173
|
AND (c.conversation_type IS NULL OR c.conversation_type != 'private')
|
|
182
174
|
AND (c.source IS NULL OR c.source NOT IN (?, ?))
|
|
183
175
|
ORDER BY m.created_at DESC
|
|
184
176
|
LIMIT ?
|
|
185
177
|
`,
|
|
186
178
|
buildLikePattern(query),
|
|
187
|
-
memoryScopeId,
|
|
188
179
|
SUBAGENT_SOURCE,
|
|
189
180
|
AUTO_ANALYSIS_SOURCE,
|
|
190
181
|
limit,
|
|
@@ -47,10 +47,11 @@ import type {
|
|
|
47
47
|
} from "../types.js";
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
|
-
* True when both v2 gates are on. Single source of truth
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
50
|
+
* True when both v2 gates are on. Single source of truth for whether v2 is
|
|
51
|
+
* the active memory subsystem — used by recall sources (`memory`, `pkb`),
|
|
52
|
+
* per-turn injectors, the indexer's v1 graph_extract suppression, and the
|
|
53
|
+
* v1/v2 maintenance scheduler. The historical name retains "Read" but the
|
|
54
|
+
* predicate now gates both read and write paths.
|
|
54
55
|
*/
|
|
55
56
|
export function isMemoryV2ReadActive(config: AssistantConfig): boolean {
|
|
56
57
|
return (
|
|
@@ -62,11 +63,20 @@ export function isMemoryV2ReadActive(config: AssistantConfig): boolean {
|
|
|
62
63
|
const log = getLogger("context-search-memory-v2-source");
|
|
63
64
|
|
|
64
65
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
66
|
+
* Sentinel passed to Qdrant when `config.memory.v2.ann_candidate_limit` is
|
|
67
|
+
* `null` (unlimited). Qdrant's query API requires an explicit numeric
|
|
68
|
+
* `limit`, so unlimited is represented as a number large enough that any
|
|
69
|
+
* realistic concept-page collection is returned in full.
|
|
70
|
+
*
|
|
71
|
+
* Why not `Number.MAX_SAFE_INTEGER`: Qdrant's sparse-vector `SearchContext`
|
|
72
|
+
* pre-allocates `limit * 16` bytes per query, so passing `MAX_SAFE_INTEGER`
|
|
73
|
+
* triggers a ~144 PB allocation and SIGABRTs the Qdrant process. 1_000_000
|
|
74
|
+
* is ~16 MB of pre-allocation in Qdrant — generous headroom over realistic
|
|
75
|
+
* concept-page counts (low thousands today) while staying well clear of
|
|
76
|
+
* the OOM cliff. Bump explicitly via `ann_candidate_limit` if you ever
|
|
77
|
+
* outgrow it.
|
|
68
78
|
*/
|
|
69
|
-
const
|
|
79
|
+
const UNLIMITED_ANN_CANDIDATE_LIMIT = 1_000_000;
|
|
70
80
|
|
|
71
81
|
/** Cap individual concept-page files we are willing to read for lexical scan. */
|
|
72
82
|
const MEMORY_V2_LEXICAL_MAX_FILE_SIZE_BYTES = 256 * 1024;
|
|
@@ -181,10 +191,13 @@ async function activationEvidence(
|
|
|
181
191
|
if (!denseVector || denseVector.length === 0) return [];
|
|
182
192
|
const sparseVector = generateSparseEmbedding(trimmedQuery);
|
|
183
193
|
|
|
194
|
+
const annLimit =
|
|
195
|
+
context.config.memory.v2.ann_candidate_limit ??
|
|
196
|
+
UNLIMITED_ANN_CANDIDATE_LIMIT;
|
|
184
197
|
const hits = await hybridQueryConceptPages(
|
|
185
198
|
denseVector,
|
|
186
199
|
sparseVector,
|
|
187
|
-
|
|
200
|
+
annLimit,
|
|
188
201
|
);
|
|
189
202
|
if (hits.length === 0) return [];
|
|
190
203
|
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
deleteOrphanAttachments,
|
|
33
33
|
linkAttachmentToMessage,
|
|
34
34
|
} from "./attachments-store.js";
|
|
35
|
-
import { AUTO_ANALYSIS_SOURCE } from "./auto-analysis-
|
|
35
|
+
import { AUTO_ANALYSIS_SOURCE } from "./auto-analysis-constants.js";
|
|
36
36
|
import {
|
|
37
37
|
projectAssistantMessage,
|
|
38
38
|
seedForkedConversationAttention,
|
|
@@ -115,8 +115,6 @@ export const messageMetadataSchema = z
|
|
|
115
115
|
})
|
|
116
116
|
.passthrough();
|
|
117
117
|
|
|
118
|
-
export type MessageMetadata = z.infer<typeof messageMetadataSchema>;
|
|
119
|
-
|
|
120
118
|
function cloneForkMessageMetadata(
|
|
121
119
|
metadata: string | null,
|
|
122
120
|
sourceMessageId: string,
|
|
@@ -444,11 +442,6 @@ export function getConversationSource(conversationId: string): string | null {
|
|
|
444
442
|
return row?.source ?? null;
|
|
445
443
|
}
|
|
446
444
|
|
|
447
|
-
export function getConversationMemoryScopeId(conversationId: string): string {
|
|
448
|
-
const conv = getConversation(conversationId);
|
|
449
|
-
return conv?.memoryScopeId ?? "default";
|
|
450
|
-
}
|
|
451
|
-
|
|
452
445
|
/**
|
|
453
446
|
* Fetch group_id for a conversation via raw SQL. group_id is NOT in the
|
|
454
447
|
* Drizzle schema (raw-query-only pattern), so ConversationRow doesn't
|
|
@@ -912,7 +905,6 @@ export async function addMessage(
|
|
|
912
905
|
if (!opts?.skipIndexing) {
|
|
913
906
|
try {
|
|
914
907
|
const config = getConfig();
|
|
915
|
-
const scopeId = getConversationMemoryScopeId(conversationId);
|
|
916
908
|
const parsed = metadata
|
|
917
909
|
? messageMetadataSchema.safeParse(metadata)
|
|
918
910
|
: null;
|
|
@@ -927,7 +919,7 @@ export async function addMessage(
|
|
|
927
919
|
role: message.role,
|
|
928
920
|
content: message.content,
|
|
929
921
|
createdAt: message.createdAt,
|
|
930
|
-
scopeId,
|
|
922
|
+
scopeId: "default",
|
|
931
923
|
provenanceTrustClass,
|
|
932
924
|
automated,
|
|
933
925
|
},
|
|
@@ -1027,7 +1019,7 @@ export function hasMessages(conversationId: string): boolean {
|
|
|
1027
1019
|
return row !== undefined;
|
|
1028
1020
|
}
|
|
1029
1021
|
|
|
1030
|
-
|
|
1022
|
+
interface PaginatedMessagesResult {
|
|
1031
1023
|
messages: MessageRow[];
|
|
1032
1024
|
hasMore: boolean;
|
|
1033
1025
|
}
|
|
@@ -1441,12 +1433,12 @@ export function deleteLastExchange(conversationId: string): number {
|
|
|
1441
1433
|
* Callers must delete these from the Qdrant collection after the
|
|
1442
1434
|
* SQLite transaction commits.
|
|
1443
1435
|
*/
|
|
1444
|
-
|
|
1436
|
+
interface DeletedMemoryIds {
|
|
1445
1437
|
segmentIds: string[];
|
|
1446
1438
|
deletedSummaryIds: string[];
|
|
1447
1439
|
}
|
|
1448
1440
|
|
|
1449
|
-
|
|
1441
|
+
interface WipeConversationResult extends DeletedMemoryIds {
|
|
1450
1442
|
cancelledJobCount: number;
|
|
1451
1443
|
}
|
|
1452
1444
|
|
|
@@ -7,20 +7,15 @@
|
|
|
7
7
|
* first contact.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
11
|
-
|
|
12
10
|
import { eq } from "drizzle-orm";
|
|
13
11
|
import { v4 as uuid } from "uuid";
|
|
14
12
|
|
|
15
|
-
import {
|
|
16
|
-
import { getWorkspacePromptPath } from "../util/platform.js";
|
|
13
|
+
import { cleanupBootstrapFiles } from "../prompts/bootstrap-cleanup.js";
|
|
17
14
|
import { initConversationDir } from "./conversation-disk-view.js";
|
|
18
15
|
import { GENERATING_TITLE } from "./conversation-title-service.js";
|
|
19
16
|
import { getDb } from "./db-connection.js";
|
|
20
17
|
import { conversationKeys, conversations } from "./schema.js";
|
|
21
18
|
|
|
22
|
-
const log = getLogger("conversation-key-store");
|
|
23
|
-
|
|
24
19
|
/** Set after the first conversation is created so BOOTSTRAP.md is deleted on the second. */
|
|
25
20
|
let firstConversationSeen = false;
|
|
26
21
|
|
|
@@ -204,15 +199,7 @@ export function getOrCreateConversation(
|
|
|
204
199
|
// for its entire duration. Any subsequent conversation means
|
|
205
200
|
// onboarding is over.
|
|
206
201
|
if (firstConversationSeen) {
|
|
207
|
-
|
|
208
|
-
if (existsSync(bp)) {
|
|
209
|
-
try {
|
|
210
|
-
unlinkSync(bp);
|
|
211
|
-
log.info("Deleted BOOTSTRAP.md — onboarding conversation ended");
|
|
212
|
-
} catch {
|
|
213
|
-
// Best-effort
|
|
214
|
-
}
|
|
215
|
-
}
|
|
202
|
+
cleanupBootstrapFiles("new conversation created after onboarding");
|
|
216
203
|
}
|
|
217
204
|
firstConversationSeen = true;
|
|
218
205
|
|
package/src/memory/db-init.ts
CHANGED
|
@@ -102,6 +102,7 @@ import {
|
|
|
102
102
|
migrateGuardianTimestampsEpochMs,
|
|
103
103
|
migrateGuardianVerificationPurpose,
|
|
104
104
|
migrateGuardianVerificationSessions,
|
|
105
|
+
migrateHeartbeatRuns,
|
|
105
106
|
migrateInviteCodeHashColumn,
|
|
106
107
|
migrateInviteContactId,
|
|
107
108
|
migrateLlmRequestLogMessageId,
|
|
@@ -153,6 +154,7 @@ import {
|
|
|
153
154
|
migrateRenameVoiceToPhone,
|
|
154
155
|
migrateScheduleOneShotRouting,
|
|
155
156
|
migrateScheduleQuietFlag,
|
|
157
|
+
migrateScheduleRetryPolicy,
|
|
156
158
|
migrateScheduleReuseConversation,
|
|
157
159
|
migrateScheduleScriptColumn,
|
|
158
160
|
migrateScheduleWakeConversationId,
|
|
@@ -163,6 +165,7 @@ import {
|
|
|
163
165
|
migrateStripPlaceholderSentinelsFromMessages,
|
|
164
166
|
migrateStripThinkingFromConsolidated,
|
|
165
167
|
migrateToolInvocationsMatchedRuleId,
|
|
168
|
+
migrateTraceEventsCreatedAtIndex,
|
|
166
169
|
migrateUsageDashboardIndexes,
|
|
167
170
|
migrateUsageLlmCallCount,
|
|
168
171
|
migrateVoiceInviteColumns,
|
|
@@ -401,9 +404,12 @@ export function initializeDb(): void {
|
|
|
401
404
|
migrateLlmUsageAttribution,
|
|
402
405
|
migrateSlackCompactionWatermark,
|
|
403
406
|
migrateToolInvocationsMatchedRuleId,
|
|
407
|
+
migrateHeartbeatRuns,
|
|
404
408
|
function migrateBackfillAppConversationIds() {
|
|
405
409
|
backfillAppConversationIds();
|
|
406
410
|
},
|
|
411
|
+
migrateScheduleRetryPolicy,
|
|
412
|
+
migrateTraceEventsCreatedAtIndex,
|
|
407
413
|
];
|
|
408
414
|
|
|
409
415
|
// Run each migration step, catching and logging individual failures so one
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
type SparseEmbedding,
|
|
22
22
|
type TextEmbeddingInput,
|
|
23
23
|
} from "./embedding-types.js";
|
|
24
|
+
import { SPARSE_VOCAB_SIZE, tokenHash, tokenize } from "./sparse-tokenize.js";
|
|
24
25
|
|
|
25
26
|
export type { EmbeddingInput, MultimodalEmbeddingInput, TextEmbeddingInput };
|
|
26
27
|
|
|
@@ -787,31 +788,18 @@ async function isOllamaConfigured(config: AssistantConfig): Promise<boolean> {
|
|
|
787
788
|
// Simple tokenizer + TF-IDF sparse encoder. Produces a SparseEmbedding
|
|
788
789
|
// with term indices (hashed to a fixed vocabulary) and TF-IDF weights.
|
|
789
790
|
// Can be upgraded to a learned sparse encoder (e.g. SPLADE) later.
|
|
790
|
-
|
|
791
|
-
|
|
791
|
+
// Tokenization primitives (`tokenize`, `tokenHash`, `SPARSE_VOCAB_SIZE`) live
|
|
792
|
+
// in `./sparse-tokenize.ts` so the BM25 encoder can share them without
|
|
793
|
+
// transitively depending on this module.
|
|
792
794
|
|
|
793
795
|
/**
|
|
794
796
|
* Bump this version whenever the sparse embedding algorithm changes
|
|
795
|
-
* (e.g. hash function fix, tokenizer change)
|
|
796
|
-
*
|
|
797
|
+
* (e.g. hash function fix, tokenizer change). Now inert metadata — the v1
|
|
798
|
+
* Qdrant sentinel was decoupled from this constant, so a bump no longer
|
|
799
|
+
* forces an automatic rebuild. Operators must explicitly run
|
|
800
|
+
* `assistant memory v2 reembed` to rematerialize the v2 sparse index.
|
|
797
801
|
*/
|
|
798
|
-
export const SPARSE_EMBEDDING_VERSION =
|
|
799
|
-
|
|
800
|
-
/** Tokenize text into lowercase alphanumeric tokens (Unicode-aware). */
|
|
801
|
-
function tokenize(text: string): string[] {
|
|
802
|
-
return text.toLowerCase().match(/[\p{L}\p{N}]+/gu) ?? [];
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
/** Hash a token to a stable index in [0, vocabSize). */
|
|
806
|
-
function tokenHash(token: string, vocabSize: number): number {
|
|
807
|
-
// FNV-1a 32-bit hash for speed
|
|
808
|
-
let hash = 0x811c9dc5;
|
|
809
|
-
for (let i = 0; i < token.length; i++) {
|
|
810
|
-
hash ^= token.charCodeAt(i);
|
|
811
|
-
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
812
|
-
}
|
|
813
|
-
return hash % vocabSize;
|
|
814
|
-
}
|
|
802
|
+
export const SPARSE_EMBEDDING_VERSION = 4;
|
|
815
803
|
|
|
816
804
|
/**
|
|
817
805
|
* Generate a TF-IDF-based sparse embedding for the given text.
|
|
@@ -38,10 +38,16 @@ const ONNXRUNTIME_COMMON_VERSION = "1.21.0";
|
|
|
38
38
|
const TRANSFORMERS_VERSION = "3.8.1";
|
|
39
39
|
const JINJA_VERSION = "0.5.5";
|
|
40
40
|
|
|
41
|
-
/**
|
|
42
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Composite version string for cache invalidation. Bumping the trailing
|
|
43
|
+
* `_workers-vN` suffix forces existing installs to regenerate the worker
|
|
44
|
+
* scripts when the worker IPC contract or spawn-args list changes (without
|
|
45
|
+
* requiring an `@huggingface/transformers` version bump).
|
|
46
|
+
*/
|
|
47
|
+
const RUNTIME_VERSION = `ort-${ONNXRUNTIME_NODE_VERSION}_hf-${TRANSFORMERS_VERSION}_jinja-${JINJA_VERSION}_workers-v2`;
|
|
43
48
|
|
|
44
49
|
const WORKER_FILENAME = "embed-worker.mjs";
|
|
50
|
+
const RERANK_WORKER_FILENAME = "rerank-worker.mjs";
|
|
45
51
|
|
|
46
52
|
/** Module-level guard so concurrent in-process calls share one download. */
|
|
47
53
|
const installGuard = new PromiseGuard<void>();
|
|
@@ -171,6 +177,101 @@ process.stdin.on('end', () => process.exit(0));
|
|
|
171
177
|
`;
|
|
172
178
|
}
|
|
173
179
|
|
|
180
|
+
function generateRerankWorkerScript(): string {
|
|
181
|
+
// Cross-encoder rerank worker. Loads a sequence-classification model and
|
|
182
|
+
// scores paired (queries[i], passages[i]) tuples in one batched ONNX
|
|
183
|
+
// inference call. Mirrors the embed worker's lifecycle (ready signal,
|
|
184
|
+
// JSON-lines IPC, sequential queue) so LocalRerankBackend can reuse the
|
|
185
|
+
// same supervisor pattern.
|
|
186
|
+
//
|
|
187
|
+
// Request shape: { id, queries: string[], passages: string[] } with
|
|
188
|
+
// queries.length === passages.length. Each pair is one (query, passage)
|
|
189
|
+
// tuple; multiple distinct queries can ride in a single batch so the
|
|
190
|
+
// activation pipeline can score the user-channel and assistant-channel
|
|
191
|
+
// queries against a shared candidate set in one tokenizer + ONNX call.
|
|
192
|
+
return `\
|
|
193
|
+
// rerank-worker.mjs — Auto-generated by EmbeddingRuntimeManager
|
|
194
|
+
// Runs in a separate bun process, communicates via JSON-lines over stdin/stdout.
|
|
195
|
+
process.title = 'rerank-worker';
|
|
196
|
+
import {
|
|
197
|
+
AutoModelForSequenceClassification,
|
|
198
|
+
AutoTokenizer,
|
|
199
|
+
env,
|
|
200
|
+
} from '@huggingface/transformers';
|
|
201
|
+
|
|
202
|
+
const model = process.argv[2];
|
|
203
|
+
const cacheDir = process.argv[3];
|
|
204
|
+
const dtype = process.argv[4] || 'q8';
|
|
205
|
+
if (cacheDir && env) env.cacheDir = cacheDir;
|
|
206
|
+
|
|
207
|
+
let tokenizer;
|
|
208
|
+
let session;
|
|
209
|
+
try {
|
|
210
|
+
tokenizer = await AutoTokenizer.from_pretrained(model);
|
|
211
|
+
session = await AutoModelForSequenceClassification.from_pretrained(model, { dtype });
|
|
212
|
+
process.stdout.write(JSON.stringify({ type: 'ready' }) + '\\n');
|
|
213
|
+
} catch (err) {
|
|
214
|
+
process.stdout.write(JSON.stringify({ type: 'error', error: err.message || String(err) }) + '\\n');
|
|
215
|
+
process.exit(1);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const sigmoid = (x) => 1 / (1 + Math.exp(-x));
|
|
219
|
+
|
|
220
|
+
const decoder = new TextDecoder();
|
|
221
|
+
let buffer = '';
|
|
222
|
+
let processing = false;
|
|
223
|
+
const queue = [];
|
|
224
|
+
|
|
225
|
+
process.stdin.on('data', (chunk) => {
|
|
226
|
+
buffer += typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });
|
|
227
|
+
let idx;
|
|
228
|
+
while ((idx = buffer.indexOf('\\n')) !== -1) {
|
|
229
|
+
const line = buffer.slice(0, idx);
|
|
230
|
+
buffer = buffer.slice(idx + 1);
|
|
231
|
+
if (line.trim()) queue.push(line);
|
|
232
|
+
}
|
|
233
|
+
if (!processing) processQueue();
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
async function processQueue() {
|
|
237
|
+
processing = true;
|
|
238
|
+
while (queue.length > 0) {
|
|
239
|
+
const line = queue.shift();
|
|
240
|
+
let req;
|
|
241
|
+
try { req = JSON.parse(line); } catch { continue; }
|
|
242
|
+
try {
|
|
243
|
+
const { id, queries, passages } = req;
|
|
244
|
+
if (
|
|
245
|
+
!Array.isArray(queries) || !Array.isArray(passages) ||
|
|
246
|
+
queries.length !== passages.length || passages.length === 0
|
|
247
|
+
) {
|
|
248
|
+
process.stdout.write(JSON.stringify({ id, scores: [] }) + '\\n');
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
const inputs = await tokenizer(queries, {
|
|
252
|
+
text_pair: passages,
|
|
253
|
+
padding: true,
|
|
254
|
+
truncation: true,
|
|
255
|
+
return_tensors: 'pt',
|
|
256
|
+
});
|
|
257
|
+
const out = await session(inputs);
|
|
258
|
+
const logits = out.logits.data;
|
|
259
|
+
const scores = new Array(passages.length);
|
|
260
|
+
for (let i = 0; i < passages.length; i++) {
|
|
261
|
+
scores[i] = sigmoid(Number(logits[i]));
|
|
262
|
+
}
|
|
263
|
+
process.stdout.write(JSON.stringify({ id, scores }) + '\\n');
|
|
264
|
+
} catch (err) {
|
|
265
|
+
process.stdout.write(JSON.stringify({ id: req?.id, error: err.message || String(err) }) + '\\n');
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
processing = false;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
process.stdin.on('end', () => process.exit(0));
|
|
272
|
+
`;
|
|
273
|
+
}
|
|
274
|
+
|
|
174
275
|
// ── Main manager ────────────────────────────────────────────────────
|
|
175
276
|
|
|
176
277
|
export class EmbeddingRuntimeManager {
|
|
@@ -186,8 +287,12 @@ export class EmbeddingRuntimeManager {
|
|
|
186
287
|
if (!manifest) return false;
|
|
187
288
|
if (manifest.runtimeVersion !== RUNTIME_VERSION) return false;
|
|
188
289
|
|
|
189
|
-
// Verify
|
|
190
|
-
return
|
|
290
|
+
// Verify both worker scripts exist and a bun binary is available
|
|
291
|
+
return (
|
|
292
|
+
existsSync(this.getWorkerPath()) &&
|
|
293
|
+
existsSync(this.getRerankWorkerPath()) &&
|
|
294
|
+
this.getBunPath() !== undefined
|
|
295
|
+
);
|
|
191
296
|
}
|
|
192
297
|
|
|
193
298
|
/** Path to the embed worker script. */
|
|
@@ -195,6 +300,11 @@ export class EmbeddingRuntimeManager {
|
|
|
195
300
|
return join(this.baseDir, WORKER_FILENAME);
|
|
196
301
|
}
|
|
197
302
|
|
|
303
|
+
/** Path to the rerank worker script. */
|
|
304
|
+
getRerankWorkerPath(): string {
|
|
305
|
+
return join(this.baseDir, RERANK_WORKER_FILENAME);
|
|
306
|
+
}
|
|
307
|
+
|
|
198
308
|
/**
|
|
199
309
|
* Find a usable bun binary.
|
|
200
310
|
* Delegates to the shared bun-runtime helper, also checking
|
|
@@ -375,8 +485,12 @@ export class EmbeddingRuntimeManager {
|
|
|
375
485
|
].join("\n"),
|
|
376
486
|
);
|
|
377
487
|
|
|
378
|
-
// Step 4: Write embed worker
|
|
488
|
+
// Step 4: Write embed + rerank worker scripts
|
|
379
489
|
writeFileSync(join(tmpDir, WORKER_FILENAME), generateWorkerScript());
|
|
490
|
+
writeFileSync(
|
|
491
|
+
join(tmpDir, RERANK_WORKER_FILENAME),
|
|
492
|
+
generateRerankWorkerScript(),
|
|
493
|
+
);
|
|
380
494
|
|
|
381
495
|
// Step 5: Write version manifest
|
|
382
496
|
const manifest: VersionManifest = {
|