@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
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
} from "../../providers/provider-send-message.js";
|
|
15
15
|
import type { ContentBlock, ImageContent } from "../../providers/types.js";
|
|
16
16
|
import { getLogger } from "../../util/logger.js";
|
|
17
|
+
import { isMemoryV2ReadActive } from "../context-search/sources/memory-v2.js";
|
|
17
18
|
import { embedWithRetry } from "../embed.js";
|
|
18
19
|
import {
|
|
19
20
|
generateSparseEmbedding,
|
|
@@ -350,7 +351,7 @@ async function dedupCrossCategory(
|
|
|
350
351
|
// Context load — conversation start
|
|
351
352
|
// ---------------------------------------------------------------------------
|
|
352
353
|
|
|
353
|
-
|
|
354
|
+
interface ContextLoadOpts {
|
|
354
355
|
/** Scope for memory isolation. */
|
|
355
356
|
scopeId: string;
|
|
356
357
|
/** Recent conversation summaries (used as retrieval queries). */
|
|
@@ -372,7 +373,7 @@ export interface ContextLoadOpts {
|
|
|
372
373
|
userQuery?: string;
|
|
373
374
|
}
|
|
374
375
|
|
|
375
|
-
|
|
376
|
+
interface ContextLoadResult {
|
|
376
377
|
nodes: ScoredNode[];
|
|
377
378
|
serendipityNodes: ScoredNode[];
|
|
378
379
|
triggeredNodes: TriggeredResult[];
|
|
@@ -425,6 +426,33 @@ export interface ContextLoadResult {
|
|
|
425
426
|
export async function loadContextMemory(
|
|
426
427
|
opts: ContextLoadOpts,
|
|
427
428
|
): Promise<ContextLoadResult> {
|
|
429
|
+
// v2 owns the read path when both gates are on. The v1 collection is in
|
|
430
|
+
// active retirement and querying it can OOM-crash Qdrant via a corrupted
|
|
431
|
+
// sparse segment, so we skip the embedding work and downstream searches
|
|
432
|
+
// entirely. Caller (`runContextLoad`) sees zero nodes and routes to the
|
|
433
|
+
// v2 activation pipeline.
|
|
434
|
+
if (isMemoryV2ReadActive(opts.config)) {
|
|
435
|
+
return {
|
|
436
|
+
nodes: [],
|
|
437
|
+
serendipityNodes: [],
|
|
438
|
+
triggeredNodes: [],
|
|
439
|
+
latencyMs: 0,
|
|
440
|
+
metrics: {
|
|
441
|
+
semanticHits: 0,
|
|
442
|
+
mergedCount: 0,
|
|
443
|
+
selectedCount: 0,
|
|
444
|
+
tier1Count: 0,
|
|
445
|
+
tier2Count: 0,
|
|
446
|
+
hybridSearchLatencyMs: 0,
|
|
447
|
+
sparseVectorUsed: false,
|
|
448
|
+
embeddingProvider: null,
|
|
449
|
+
embeddingModel: null,
|
|
450
|
+
queryContext: null,
|
|
451
|
+
topCandidates: [],
|
|
452
|
+
},
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
|
|
428
456
|
const start = Date.now();
|
|
429
457
|
const ctxLoadCfg = opts.config.memory.retrieval.injection.contextLoad;
|
|
430
458
|
const maxNodes = opts.maxNodes ?? ctxLoadCfg.maxNodes;
|
|
@@ -497,7 +525,6 @@ export async function loadContextMemory(
|
|
|
497
525
|
const results = await searchGraphNodes(
|
|
498
526
|
queryVector,
|
|
499
527
|
maxNodes * 3,
|
|
500
|
-
[opts.scopeId],
|
|
501
528
|
sparseVector,
|
|
502
529
|
);
|
|
503
530
|
for (const r of results) {
|
|
@@ -520,7 +547,6 @@ export async function loadContextMemory(
|
|
|
520
547
|
const results = await searchGraphNodes(
|
|
521
548
|
userQueryVector,
|
|
522
549
|
maxNodes * 3,
|
|
523
|
-
[opts.scopeId],
|
|
524
550
|
undefined,
|
|
525
551
|
);
|
|
526
552
|
for (const r of results) {
|
|
@@ -845,7 +871,7 @@ export async function loadContextMemory(
|
|
|
845
871
|
// Per-turn retrieval — mid-conversation injection
|
|
846
872
|
// ---------------------------------------------------------------------------
|
|
847
873
|
|
|
848
|
-
|
|
874
|
+
interface TurnRetrievalOpts {
|
|
849
875
|
/** The assistant's last message content. */
|
|
850
876
|
assistantLastMessage: string;
|
|
851
877
|
/** The user's last message content. */
|
|
@@ -858,7 +884,7 @@ export interface TurnRetrievalOpts {
|
|
|
858
884
|
signal?: AbortSignal;
|
|
859
885
|
}
|
|
860
886
|
|
|
861
|
-
|
|
887
|
+
interface TurnRetrievalResult {
|
|
862
888
|
/** New nodes to inject (not already in context). */
|
|
863
889
|
nodes: ScoredNode[];
|
|
864
890
|
/** Serendipity picks included in nodes. */
|
|
@@ -979,9 +1005,7 @@ export async function retrieveForTurn(
|
|
|
979
1005
|
}
|
|
980
1006
|
const imgVector = imgResult.vectors[0];
|
|
981
1007
|
if (imgVector) {
|
|
982
|
-
const imgResults = await searchGraphNodes(imgVector, 40
|
|
983
|
-
opts.scopeId,
|
|
984
|
-
]);
|
|
1008
|
+
const imgResults = await searchGraphNodes(imgVector, 40);
|
|
985
1009
|
for (const r of imgResults) {
|
|
986
1010
|
const current = allCandidateIds.get(r.nodeId) ?? 0;
|
|
987
1011
|
allCandidateIds.set(r.nodeId, Math.max(current, r.score));
|
|
@@ -1069,7 +1093,7 @@ export async function retrieveForTurn(
|
|
|
1069
1093
|
queryEmbeddings = embedResults.vectors;
|
|
1070
1094
|
|
|
1071
1095
|
const searchPromises = queryEmbeddings.map((vec) =>
|
|
1072
|
-
searchGraphNodes(vec, 40
|
|
1096
|
+
searchGraphNodes(vec, 40),
|
|
1073
1097
|
);
|
|
1074
1098
|
const searchResults = await Promise.all(searchPromises);
|
|
1075
1099
|
|
|
@@ -76,7 +76,7 @@ export const graphRememberDefinition: ToolDefinition = {
|
|
|
76
76
|
finish_turn: {
|
|
77
77
|
type: "boolean",
|
|
78
78
|
description:
|
|
79
|
-
"
|
|
79
|
+
"When you have nothing else to say and want to hand control back to the user you MUST set this to true. When true, your turn ends after this tool call. It's critical that you do this in order to avoid unnecessary LLM calls.",
|
|
80
80
|
},
|
|
81
81
|
},
|
|
82
82
|
required: ["content"],
|
package/src/memory/indexer.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { getLogger } from "../util/logger.js";
|
|
|
9
9
|
import { enqueueAutoAnalysisIfEnabled } from "./auto-analysis-enqueue.js";
|
|
10
10
|
import { isAutoAnalysisConversation } from "./auto-analysis-guard.js";
|
|
11
11
|
import { getMemoryCheckpoint, setMemoryCheckpoint } from "./checkpoints.js";
|
|
12
|
+
import { isMemoryV2ReadActive } from "./context-search/sources/memory-v2.js";
|
|
12
13
|
import { getDb } from "./db-connection.js";
|
|
13
14
|
import { selectedBackendSupportsMultimodal } from "./embedding-backend.js";
|
|
14
15
|
import { enqueueMemoryJob, upsertDebouncedJob } from "./jobs-store.js";
|
|
@@ -175,39 +176,9 @@ export async function indexMessageNow(
|
|
|
175
176
|
// Summaries still run — they feed the graph retrieval pipeline and
|
|
176
177
|
// are not recursion-prone.
|
|
177
178
|
if (!isAutoAnalysisSource) {
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const graphPendingCount =
|
|
182
|
-
(graphCurrentVal ? parseInt(graphCurrentVal, 10) : 0) + 1;
|
|
183
|
-
setMemoryCheckpoint(graphPendingKey, String(graphPendingCount));
|
|
184
|
-
|
|
185
|
-
const graphBatchFired = graphPendingCount >= batchSize;
|
|
186
|
-
if (graphBatchFired) {
|
|
187
|
-
setMemoryCheckpoint(graphPendingKey, "0");
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Single pending `graph_extract` row per conversation. If the
|
|
191
|
-
// batch threshold just fired, pull `runAfter` back to now so the
|
|
192
|
-
// job runs immediately; otherwise debounce by the idle timeout.
|
|
193
|
-
// Routing both paths through `upsertDebouncedJob` ensures the
|
|
194
|
-
// row's `runAfter` reflects whichever trigger ran last, so a
|
|
195
|
-
// batch crossing always takes effect immediately.
|
|
196
|
-
const extractRunAfter = graphBatchFired
|
|
197
|
-
? Date.now()
|
|
198
|
-
: Date.now() + idleTimeoutMs;
|
|
199
|
-
upsertDebouncedJob(
|
|
200
|
-
"graph_extract",
|
|
201
|
-
{
|
|
202
|
-
conversationId: input.conversationId,
|
|
203
|
-
scopeId: input.scopeId ?? "default",
|
|
204
|
-
},
|
|
205
|
-
extractRunAfter,
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
// Reading config here is best-effort: feature-gated triggers below
|
|
209
|
-
// (memory v2 sweep, auto-analyze batch) skip when it fails — the
|
|
210
|
-
// idle-debounced enqueues above are unaffected.
|
|
179
|
+
// Reading config here is best-effort: when it fails we treat v2 as
|
|
180
|
+
// inactive (failing-open to v1) so a config error never silently
|
|
181
|
+
// drops both extraction paths.
|
|
211
182
|
let triggerConfig: ReturnType<typeof getConfig> | null = null;
|
|
212
183
|
try {
|
|
213
184
|
triggerConfig = getConfig();
|
|
@@ -218,20 +189,58 @@ export async function indexMessageNow(
|
|
|
218
189
|
);
|
|
219
190
|
}
|
|
220
191
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
//
|
|
192
|
+
const v2Config =
|
|
193
|
+
triggerConfig != null && isMemoryV2ReadActive(triggerConfig)
|
|
194
|
+
? triggerConfig
|
|
195
|
+
: null;
|
|
196
|
+
|
|
197
|
+
// ── Graph extraction (v1) ───────────────────────────────────────
|
|
198
|
+
// Suppressed when v2 is active — v2 reads memory from buffer.md
|
|
199
|
+
// and concept pages, so the v1 graph would be stale data nobody
|
|
200
|
+
// consumes. Pending-count tracking is suppressed too; otherwise a
|
|
201
|
+
// flag flip back to v1 would fire an immediate batch from counts
|
|
202
|
+
// accumulated during the v2 window.
|
|
203
|
+
let extractRunAfter: number;
|
|
204
|
+
if (v2Config == null) {
|
|
205
|
+
const graphPendingKey = `graph_extract:${input.conversationId}:pending_count`;
|
|
206
|
+
const graphCurrentVal = getMemoryCheckpoint(graphPendingKey);
|
|
207
|
+
const graphPendingCount =
|
|
208
|
+
(graphCurrentVal ? parseInt(graphCurrentVal, 10) : 0) + 1;
|
|
209
|
+
setMemoryCheckpoint(graphPendingKey, String(graphPendingCount));
|
|
210
|
+
|
|
211
|
+
const graphBatchFired = graphPendingCount >= batchSize;
|
|
212
|
+
if (graphBatchFired) {
|
|
213
|
+
setMemoryCheckpoint(graphPendingKey, "0");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Single pending `graph_extract` row per conversation. If the
|
|
217
|
+
// batch threshold just fired, pull `runAfter` back to now so the
|
|
218
|
+
// job runs immediately; otherwise debounce by the idle timeout.
|
|
219
|
+
// Routing both paths through `upsertDebouncedJob` ensures the
|
|
220
|
+
// row's `runAfter` reflects whichever trigger ran last, so a
|
|
221
|
+
// batch crossing always takes effect immediately.
|
|
222
|
+
extractRunAfter = graphBatchFired
|
|
223
|
+
? Date.now()
|
|
224
|
+
: Date.now() + idleTimeoutMs;
|
|
225
|
+
upsertDebouncedJob(
|
|
226
|
+
"graph_extract",
|
|
227
|
+
{
|
|
228
|
+
conversationId: input.conversationId,
|
|
229
|
+
scopeId: input.scopeId ?? "default",
|
|
230
|
+
},
|
|
231
|
+
extractRunAfter,
|
|
232
|
+
);
|
|
233
|
+
} else {
|
|
234
|
+
extractRunAfter = Date.now() + idleTimeoutMs;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Memory v2 sweep: when v2 is on AND `sweep_enabled` is set, every
|
|
238
|
+
// extraction trigger also enqueues a sweep. The sweep itself reads
|
|
239
|
+
// recent messages globally, so the `conversationId` here is just
|
|
240
|
+
// the dedup key — one pending row per active conversation.
|
|
227
241
|
// `sweep_enabled` defaults to false because `remember()` is the
|
|
228
242
|
// primary capture path; the sweep is opt-in.
|
|
229
|
-
if (
|
|
230
|
-
triggerConfig != null &&
|
|
231
|
-
isAssistantFeatureFlagEnabled("memory-v2-enabled", triggerConfig) &&
|
|
232
|
-
triggerConfig.memory.v2.enabled &&
|
|
233
|
-
triggerConfig.memory.v2.sweep_enabled
|
|
234
|
-
) {
|
|
243
|
+
if (v2Config != null && v2Config.memory.v2.sweep_enabled) {
|
|
235
244
|
upsertDebouncedJob(
|
|
236
245
|
"memory_v2_sweep",
|
|
237
246
|
{ conversationId: input.conversationId },
|
|
@@ -7,10 +7,7 @@ import {
|
|
|
7
7
|
resetMessageCursorCheckpoint,
|
|
8
8
|
writeMessageCursorCheckpoint,
|
|
9
9
|
} from "../checkpoints.js";
|
|
10
|
-
import {
|
|
11
|
-
getConversationMemoryScopeId,
|
|
12
|
-
messageMetadataSchema,
|
|
13
|
-
} from "../conversation-crud.js";
|
|
10
|
+
import { messageMetadataSchema } from "../conversation-crud.js";
|
|
14
11
|
import { getDb } from "../db-connection.js";
|
|
15
12
|
import { indexMessageNow } from "../indexer.js";
|
|
16
13
|
import { enqueueMemoryJob, type MemoryJob } from "../jobs-store.js";
|
|
@@ -72,13 +69,7 @@ export async function backfillJob(
|
|
|
72
69
|
.all();
|
|
73
70
|
|
|
74
71
|
if (batch.length > 0) {
|
|
75
|
-
const scopeCache = new Map<string, string>();
|
|
76
72
|
for (const message of batch) {
|
|
77
|
-
let scopeId = scopeCache.get(message.conversationId);
|
|
78
|
-
if (scopeId === undefined) {
|
|
79
|
-
scopeId = getConversationMemoryScopeId(message.conversationId);
|
|
80
|
-
scopeCache.set(message.conversationId, scopeId);
|
|
81
|
-
}
|
|
82
73
|
const { provenanceTrustClass, automated } = parseMessageMetadata(
|
|
83
74
|
message.metadata ?? null,
|
|
84
75
|
);
|
|
@@ -89,7 +80,7 @@ export async function backfillJob(
|
|
|
89
80
|
role: message.role,
|
|
90
81
|
content: message.content,
|
|
91
82
|
createdAt: message.createdAt,
|
|
92
|
-
scopeId,
|
|
83
|
+
scopeId: "default",
|
|
93
84
|
provenanceTrustClass,
|
|
94
85
|
automated,
|
|
95
86
|
},
|
|
@@ -54,6 +54,49 @@ export function pruneOldLlmRequestLogsJob(
|
|
|
54
54
|
);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Delete trace events older than the configured retention period.
|
|
59
|
+
* Processes in batches to avoid long DB locks and excessive WAL growth.
|
|
60
|
+
* Re-enqueues itself if more rows remain.
|
|
61
|
+
*/
|
|
62
|
+
export function pruneOldTraceEventsJob(
|
|
63
|
+
job: MemoryJob,
|
|
64
|
+
config: AssistantConfig,
|
|
65
|
+
): void {
|
|
66
|
+
const rawRetention = job.payload.retentionDays;
|
|
67
|
+
const retentionDays =
|
|
68
|
+
typeof rawRetention === "number" &&
|
|
69
|
+
Number.isFinite(rawRetention) &&
|
|
70
|
+
rawRetention >= 0
|
|
71
|
+
? rawRetention
|
|
72
|
+
: config.memory.cleanup.traceEventRetentionDays;
|
|
73
|
+
|
|
74
|
+
// 0 means disabled
|
|
75
|
+
if (retentionDays === 0) return;
|
|
76
|
+
|
|
77
|
+
const cutoffMs = Date.now() - retentionDays * 86_400_000;
|
|
78
|
+
|
|
79
|
+
rawRun(
|
|
80
|
+
`DELETE FROM trace_events WHERE rowid IN (SELECT rowid FROM trace_events WHERE created_at < ? LIMIT ?)`,
|
|
81
|
+
cutoffMs,
|
|
82
|
+
PRUNE_LOG_BATCH_LIMIT,
|
|
83
|
+
);
|
|
84
|
+
const deleted = rawChanges();
|
|
85
|
+
|
|
86
|
+
if (deleted >= PRUNE_LOG_BATCH_LIMIT) {
|
|
87
|
+
enqueueMemoryJob("prune_old_trace_events", { retentionDays });
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
log.info(
|
|
91
|
+
{
|
|
92
|
+
deleted,
|
|
93
|
+
retentionDays,
|
|
94
|
+
cutoffMs,
|
|
95
|
+
},
|
|
96
|
+
"Pruned old trace events",
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
57
100
|
/**
|
|
58
101
|
* Delete conversations that have had no activity (updatedAt) for longer than
|
|
59
102
|
* the configured retention period. Processes in batches so a single job doesn't
|
|
@@ -3,7 +3,6 @@ import { readFile } from "node:fs/promises";
|
|
|
3
3
|
import { eq } from "drizzle-orm";
|
|
4
4
|
|
|
5
5
|
import type { AssistantConfig } from "../../config/types.js";
|
|
6
|
-
import { getConversationMemoryScopeId } from "../conversation-crud.js";
|
|
7
6
|
import { getDb } from "../db-connection.js";
|
|
8
7
|
import type { EmbeddingInput } from "../embedding-types.js";
|
|
9
8
|
import { asString, embedAndUpsert } from "../job-utils.js";
|
|
@@ -18,7 +17,7 @@ import {
|
|
|
18
17
|
|
|
19
18
|
export async function embedSegmentJob(
|
|
20
19
|
job: MemoryJob,
|
|
21
|
-
config: AssistantConfig
|
|
20
|
+
config: AssistantConfig,
|
|
22
21
|
): Promise<void> {
|
|
23
22
|
const segmentId = asString(job.payload.segmentId);
|
|
24
23
|
if (!segmentId) return;
|
|
@@ -39,7 +38,7 @@ export async function embedSegmentJob(
|
|
|
39
38
|
|
|
40
39
|
export async function embedSummaryJob(
|
|
41
40
|
job: MemoryJob,
|
|
42
|
-
config: AssistantConfig
|
|
41
|
+
config: AssistantConfig,
|
|
43
42
|
): Promise<void> {
|
|
44
43
|
const summaryId = asString(job.payload.summaryId);
|
|
45
44
|
if (!summaryId) return;
|
|
@@ -60,13 +59,13 @@ export async function embedSummaryJob(
|
|
|
60
59
|
created_at: summary.startAt,
|
|
61
60
|
last_seen_at: summary.endAt,
|
|
62
61
|
memory_scope_id: summary.scopeId,
|
|
63
|
-
}
|
|
62
|
+
},
|
|
64
63
|
);
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
export async function embedMediaJob(
|
|
68
67
|
job: MemoryJob,
|
|
69
|
-
config: AssistantConfig
|
|
68
|
+
config: AssistantConfig,
|
|
70
69
|
): Promise<void> {
|
|
71
70
|
const assetId = asString(job.payload.assetId);
|
|
72
71
|
if (!assetId) return;
|
|
@@ -99,7 +98,7 @@ export async function embedMediaJob(
|
|
|
99
98
|
|
|
100
99
|
export async function embedAttachmentJob(
|
|
101
100
|
job: MemoryJob,
|
|
102
|
-
config: AssistantConfig
|
|
101
|
+
config: AssistantConfig,
|
|
103
102
|
): Promise<void> {
|
|
104
103
|
const messageId = asString(job.payload.messageId);
|
|
105
104
|
const blockIndex = job.payload.blockIndex as number;
|
|
@@ -125,11 +124,10 @@ export async function embedAttachmentJob(
|
|
|
125
124
|
|
|
126
125
|
// Use messageId + blockIndex as targetId for uniqueness
|
|
127
126
|
const targetId = `${messageId}:${blockIndex}`;
|
|
128
|
-
const memoryScopeId = getConversationMemoryScopeId(message.conversationId);
|
|
129
127
|
await embedAndUpsert(config, "media", targetId, input, {
|
|
130
128
|
created_at: message.createdAt,
|
|
131
129
|
message_id: messageId,
|
|
132
130
|
conversation_id: message.conversationId,
|
|
133
|
-
memory_scope_id:
|
|
131
|
+
memory_scope_id: "default",
|
|
134
132
|
});
|
|
135
133
|
}
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
userMessage,
|
|
11
11
|
} from "../../providers/provider-send-message.js";
|
|
12
12
|
import { getLogger } from "../../util/logger.js";
|
|
13
|
-
import { getConversationMemoryScopeId } from "../conversation-crud.js";
|
|
14
13
|
import { getDb } from "../db-connection.js";
|
|
15
14
|
import { asString, truncate } from "../job-utils.js";
|
|
16
15
|
import { enqueueMemoryJob, type MemoryJob } from "../jobs-store.js";
|
|
@@ -91,10 +90,6 @@ export async function buildConversationSummaryJob(
|
|
|
91
90
|
"conversation",
|
|
92
91
|
);
|
|
93
92
|
|
|
94
|
-
// Inherit the conversation's memory scope so summaries stay aligned with
|
|
95
|
-
// the retrieval scope used by the source conversation.
|
|
96
|
-
const scopeId = getConversationMemoryScopeId(conversationId);
|
|
97
|
-
|
|
98
93
|
const now = Date.now();
|
|
99
94
|
const summaryId = existing?.id ?? uuid();
|
|
100
95
|
const nextVersion = (existing?.version ?? 0) + 1;
|
|
@@ -108,7 +103,7 @@ export async function buildConversationSummaryJob(
|
|
|
108
103
|
id: summaryId,
|
|
109
104
|
scope: "conversation",
|
|
110
105
|
scopeKey: conversationId,
|
|
111
|
-
scopeId,
|
|
106
|
+
scopeId: "default",
|
|
112
107
|
summary: summaryText,
|
|
113
108
|
tokenEstimate: estimateTextTokens(summaryText),
|
|
114
109
|
version: nextVersion,
|
|
@@ -123,7 +118,7 @@ export async function buildConversationSummaryJob(
|
|
|
123
118
|
summary: summaryText,
|
|
124
119
|
tokenEstimate: estimateTextTokens(summaryText),
|
|
125
120
|
version: sql`${memorySummaries.version} + 1`,
|
|
126
|
-
scopeId,
|
|
121
|
+
scopeId: "default",
|
|
127
122
|
startAt: earliestCovered,
|
|
128
123
|
endAt: latestCovered,
|
|
129
124
|
updatedAt: now,
|
|
@@ -103,6 +103,12 @@ mock.module("../../v2/qdrant.js", () => ({
|
|
|
103
103
|
deleteConceptPageEmbedding: async (slug: string) => {
|
|
104
104
|
deleteCalls.push(slug);
|
|
105
105
|
},
|
|
106
|
+
// Other exports from the real module — stubbed so transitive imports
|
|
107
|
+
// don't crash on missing names when the mock replaces the module wholesale.
|
|
108
|
+
hybridQueryConceptPages: async () => [],
|
|
109
|
+
_resetMemoryV2QdrantForTests: () => {},
|
|
110
|
+
ensureConceptPageCollection: async () => {},
|
|
111
|
+
MEMORY_V2_COLLECTION: "memory_v2_concept_pages",
|
|
106
112
|
}));
|
|
107
113
|
|
|
108
114
|
// ── Workspace setup ────────────────────────────────────────────────
|
|
@@ -321,7 +327,7 @@ describe("enqueueEmbedConceptPageJob", () => {
|
|
|
321
327
|
const id = enqueueEmbedConceptPageJob({ slug: "alice-prefers-vs-code" });
|
|
322
328
|
expect(id).toBeTruthy();
|
|
323
329
|
|
|
324
|
-
const claimed = claimMemoryJobs(10);
|
|
330
|
+
const claimed = claimMemoryJobs({ slowLlm: 10, fast: 10, embed: 10 });
|
|
325
331
|
expect(claimed).toHaveLength(1);
|
|
326
332
|
const [job] = claimed;
|
|
327
333
|
expect(job.type).toBe("embed_concept_page");
|
|
@@ -337,7 +343,7 @@ describe("enqueueEmbedConceptPageJob", () => {
|
|
|
337
343
|
|
|
338
344
|
enqueueEmbedConceptPageJob({ slug: "round-trip-slug" });
|
|
339
345
|
|
|
340
|
-
const claimed = claimMemoryJobs(10);
|
|
346
|
+
const claimed = claimMemoryJobs({ slowLlm: 10, fast: 10, embed: 10 });
|
|
341
347
|
expect(claimed).toHaveLength(1);
|
|
342
348
|
const [job] = claimed;
|
|
343
349
|
expect(job.type).toBe("embed_concept_page");
|
|
@@ -24,6 +24,7 @@ import type { AssistantConfig } from "../../config/types.js";
|
|
|
24
24
|
import { BackendUnavailableError } from "../../util/errors.js";
|
|
25
25
|
import { getLogger } from "../../util/logger.js";
|
|
26
26
|
import { getWorkspaceDir } from "../../util/platform.js";
|
|
27
|
+
import { applyCorrectionIfCalibrated } from "../anisotropy.js";
|
|
27
28
|
import { getDb } from "../db-connection.js";
|
|
28
29
|
import {
|
|
29
30
|
embedWithBackend,
|
|
@@ -39,6 +40,10 @@ import {
|
|
|
39
40
|
deleteConceptPageEmbedding,
|
|
40
41
|
upsertConceptPageEmbedding,
|
|
41
42
|
} from "../v2/qdrant.js";
|
|
43
|
+
import {
|
|
44
|
+
generateBm25DocEmbedding,
|
|
45
|
+
getConceptPageCorpusStats,
|
|
46
|
+
} from "../v2/sparse-bm25.js";
|
|
42
47
|
|
|
43
48
|
const log = getLogger("memory-v2-embed-concept-page");
|
|
44
49
|
|
|
@@ -141,7 +146,17 @@ export async function embedConceptPageJob(
|
|
|
141
146
|
|
|
142
147
|
// Sparse is cheap (in-process tokenization) and changes any time the body
|
|
143
148
|
// changes, so we always recompute it rather than caching alongside dense.
|
|
144
|
-
|
|
149
|
+
// BM25 weights live on the doc side; queries embed binary occurrence in
|
|
150
|
+
// sim.ts. When corpus stats aren't built yet (cold daemon, walking the
|
|
151
|
+
// corpus for the first time), fall back to the legacy TF-only encoding —
|
|
152
|
+
// the next reembed pass overwrites the page once stats are available.
|
|
153
|
+
const corpusStats = getConceptPageCorpusStats();
|
|
154
|
+
const sparse = corpusStats
|
|
155
|
+
? generateBm25DocEmbedding(text, corpusStats, {
|
|
156
|
+
k1: config.memory.v2.bm25_k1,
|
|
157
|
+
b: config.memory.v2.bm25_b,
|
|
158
|
+
})
|
|
159
|
+
: generateSparseEmbedding(text);
|
|
145
160
|
|
|
146
161
|
const now = Date.now();
|
|
147
162
|
// Persist freshly embedded vectors for cross-restart reuse. On cache hit
|
|
@@ -189,9 +204,20 @@ export async function embedConceptPageJob(
|
|
|
189
204
|
}
|
|
190
205
|
}
|
|
191
206
|
|
|
207
|
+
// Apply anisotropy correction at the boundary between the (raw) cached
|
|
208
|
+
// dense vector and the Qdrant collection. Storing raw in SQLite and
|
|
209
|
+
// corrected in Qdrant means a recalibration just needs a reembed pass —
|
|
210
|
+
// the cache survives and the (cheap) correction math reruns over each
|
|
211
|
+
// cached vector. Pass-through when no calibration is fit yet.
|
|
212
|
+
const correctedDense = await applyCorrectionIfCalibrated(
|
|
213
|
+
dense,
|
|
214
|
+
provider,
|
|
215
|
+
model,
|
|
216
|
+
);
|
|
217
|
+
|
|
192
218
|
await upsertConceptPageEmbedding({
|
|
193
219
|
slug,
|
|
194
|
-
dense,
|
|
220
|
+
dense: correctedDense,
|
|
195
221
|
sparse,
|
|
196
222
|
updatedAt: now,
|
|
197
223
|
});
|
|
@@ -134,7 +134,7 @@ describe("enqueuePkbIndexJob", () => {
|
|
|
134
134
|
});
|
|
135
135
|
expect(id).toBeTruthy();
|
|
136
136
|
|
|
137
|
-
const claimed = claimMemoryJobs(10);
|
|
137
|
+
const claimed = claimMemoryJobs({ slowLlm: 10, fast: 10, embed: 10 });
|
|
138
138
|
expect(claimed).toHaveLength(1);
|
|
139
139
|
const [job] = claimed;
|
|
140
140
|
const expectedType: MemoryJobType = "embed_pkb_file";
|
|
@@ -153,7 +153,7 @@ describe("enqueuePkbIndexJob", () => {
|
|
|
153
153
|
memoryScopeId: "scope-rt",
|
|
154
154
|
});
|
|
155
155
|
|
|
156
|
-
const claimed = claimMemoryJobs(10);
|
|
156
|
+
const claimed = claimMemoryJobs({ slowLlm: 10, fast: 10, embed: 10 });
|
|
157
157
|
expect(claimed).toHaveLength(1);
|
|
158
158
|
const [job] = claimed;
|
|
159
159
|
expect(job.type).toBe("embed_pkb_file");
|