@vellumai/assistant 0.10.12 → 0.11.0-staging.2
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/AGENTS.md +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +264 -14
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
- package/src/__tests__/app-conversation-ids.test.ts +204 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-group-tools.test.ts +279 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-lineage.test.ts +235 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/platform-callback-registration.test.ts +10 -10
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/resolve-app-id.test.ts +32 -0
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +26 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +587 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +482 -2
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/api/responses/subagent-detail.ts +13 -0
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/apps/app-store.ts +95 -4
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +178 -65
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/commands/webhooks.help.ts +9 -4
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
- package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/bundled-skills/schedule/SKILL.md +2 -0
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -38
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-lineage.ts +76 -0
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +8 -14
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +32 -16
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +1288 -439
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +298 -15
- package/src/permissions/checker.ts +102 -36
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +269 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/conversation-parent.ts +27 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +9 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/prompts/sections.ts +4 -16
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/subagents-routes.ts +35 -8
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/webhook-routes.ts +89 -30
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/apps/resolve-app-id.ts +15 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/conversation-groups/group_create.ts +63 -0
- package/src/tools/conversation-groups/group_list.ts +20 -0
- package/src/tools/conversation-groups/group_shared.ts +52 -0
- package/src/tools/conversation-groups/move_to_group.ts +106 -0
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/util/platform.ts +15 -0
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/tsconfig.plugin-api.json +1 -1
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// Memory
|
|
2
|
+
// Memory substrate — Qdrant collection for concept pages
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
+
// Shared by the v2 injection engine and memory-v3; active whenever
|
|
6
|
+
// `usesConceptPageMemory()` holds.
|
|
7
|
+
//
|
|
5
8
|
// Owns a dedicated Qdrant collection, keyed by concept-page slug, that holds
|
|
6
9
|
// dense + sparse embeddings of every page under `memory/concepts/`. The
|
|
7
10
|
// collection is separate from the v1 `memory` collection so v2 retrieval can
|
|
@@ -15,8 +18,8 @@
|
|
|
15
18
|
//
|
|
16
19
|
// Per-channel queries: `hybridQueryConceptPages` runs separate dense and
|
|
17
20
|
// sparse queries (no Qdrant-side RRF). Callers do their own weighted-sum
|
|
18
|
-
// fusion using `dense_weight` / `sparse_weight`
|
|
19
|
-
// which RRF fusion would discard.
|
|
21
|
+
// fusion using the `dense_weight` / `sparse_weight` substrate tunables
|
|
22
|
+
// (`resolveSubstrateTuning`), which RRF fusion would discard.
|
|
20
23
|
|
|
21
24
|
import { existsSync } from "node:fs";
|
|
22
25
|
import { mkdir, unlink, writeFile } from "node:fs/promises";
|
|
@@ -25,15 +28,16 @@ import { dirname, join } from "node:path";
|
|
|
25
28
|
import { QdrantClient as QdrantRestClient } from "@qdrant/js-client-rest";
|
|
26
29
|
import { v5 as uuidv5 } from "uuid";
|
|
27
30
|
|
|
28
|
-
import { getConfig } from "
|
|
29
|
-
import type { SparseEmbedding } from "
|
|
30
|
-
import { resolveQdrantUrl } from "
|
|
31
|
-
import { getLogger } from "
|
|
32
|
-
import { getDataDir } from "
|
|
31
|
+
import { getConfig } from "../../../../config/loader.js";
|
|
32
|
+
import type { SparseEmbedding } from "../../../../persistence/embeddings/embedding-types.js";
|
|
33
|
+
import { resolveQdrantUrl } from "../embeddings.js";
|
|
34
|
+
import { getLogger } from "../logging.js";
|
|
35
|
+
import { getDataDir } from "../paths.js";
|
|
33
36
|
|
|
34
37
|
const log = getLogger("memory-v2-qdrant");
|
|
35
38
|
|
|
36
39
|
/** Name of the dedicated Qdrant collection holding concept-page embeddings. */
|
|
40
|
+
// FROZEN: persisted Qdrant collection name — never rename the value.
|
|
37
41
|
export const MEMORY_V2_COLLECTION = "memory_v2_concept_pages";
|
|
38
42
|
|
|
39
43
|
/**
|
|
@@ -106,6 +110,7 @@ const REQUIRED_SPARSE_VECTORS = ["sparse", "summary_sparse"] as const;
|
|
|
106
110
|
* returns `migrated: true` until the lifecycle hook enqueues the reembed
|
|
107
111
|
* and clears the sentinel.
|
|
108
112
|
*/
|
|
113
|
+
// FROZEN: on-disk sentinel filename — never rename the value.
|
|
109
114
|
const REEMBED_SENTINEL_FILENAME = ".memory-v2-reembed-required";
|
|
110
115
|
|
|
111
116
|
function reembedSentinelPath(): string {
|
|
@@ -130,13 +135,17 @@ export async function clearReembedSentinel(): Promise<void> {
|
|
|
130
135
|
try {
|
|
131
136
|
await unlink(reembedSentinelPath());
|
|
132
137
|
} catch (err) {
|
|
133
|
-
if ((err as NodeJS.ErrnoException).code !== "ENOENT")
|
|
138
|
+
if ((err as NodeJS.ErrnoException).code !== "ENOENT") {
|
|
139
|
+
throw err;
|
|
140
|
+
}
|
|
134
141
|
}
|
|
135
142
|
}
|
|
136
143
|
|
|
137
144
|
/** Lazily create a Qdrant REST client bound to the resolved URL. */
|
|
138
145
|
function getClient(): QdrantRestClient {
|
|
139
|
-
if (_client)
|
|
146
|
+
if (_client) {
|
|
147
|
+
return _client;
|
|
148
|
+
}
|
|
140
149
|
_client = new QdrantRestClient({
|
|
141
150
|
url: resolveQdrantUrl(),
|
|
142
151
|
checkCompatibility: false,
|
|
@@ -157,8 +166,12 @@ function getClient(): QdrantRestClient {
|
|
|
157
166
|
export async function ensureConceptPageCollection(): Promise<{
|
|
158
167
|
migrated: boolean;
|
|
159
168
|
}> {
|
|
160
|
-
if (_collectionReady)
|
|
161
|
-
|
|
169
|
+
if (_collectionReady) {
|
|
170
|
+
return { migrated: false };
|
|
171
|
+
}
|
|
172
|
+
if (_collectionReadyPromise) {
|
|
173
|
+
return _collectionReadyPromise;
|
|
174
|
+
}
|
|
162
175
|
|
|
163
176
|
_collectionReadyPromise = ensureConceptPageCollectionOnce().finally(() => {
|
|
164
177
|
_collectionReadyPromise = null;
|
|
@@ -248,7 +261,9 @@ async function ensureConceptPageCollectionOnce(): Promise<{
|
|
|
248
261
|
}
|
|
249
262
|
} catch (err) {
|
|
250
263
|
// Treat "not found"-shaped errors as "needs creation" and fall through.
|
|
251
|
-
if (!isCollectionMissing(err))
|
|
264
|
+
if (!isCollectionMissing(err)) {
|
|
265
|
+
throw err;
|
|
266
|
+
}
|
|
252
267
|
}
|
|
253
268
|
|
|
254
269
|
log.info(
|
|
@@ -341,7 +356,9 @@ async function ensurePayloadIndexes(): Promise<void> {
|
|
|
341
356
|
try {
|
|
342
357
|
await client.createPayloadIndex(MEMORY_V2_COLLECTION, index);
|
|
343
358
|
} catch (err) {
|
|
344
|
-
if (isPayloadIndexAlreadyExists(err))
|
|
359
|
+
if (isPayloadIndexAlreadyExists(err)) {
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
345
362
|
throw err;
|
|
346
363
|
}
|
|
347
364
|
}),
|
|
@@ -373,7 +390,9 @@ async function reconcileSparseIndexOnDisk(
|
|
|
373
390
|
}
|
|
374
391
|
| undefined
|
|
375
392
|
)?.sparse_vectors;
|
|
376
|
-
if (!sparseParams)
|
|
393
|
+
if (!sparseParams) {
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
377
396
|
|
|
378
397
|
// Only touch channels that exist in the collection and whose placement
|
|
379
398
|
// drifts from the target — an update naming an absent sparse vector fails.
|
|
@@ -382,7 +401,9 @@ async function reconcileSparseIndexOnDisk(
|
|
|
382
401
|
name in sparseParams &&
|
|
383
402
|
(sparseParams[name]?.index?.on_disk ?? false) !== onDisk,
|
|
384
403
|
);
|
|
385
|
-
if (drifted.length === 0)
|
|
404
|
+
if (drifted.length === 0) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
386
407
|
|
|
387
408
|
try {
|
|
388
409
|
await getClient().updateCollection(MEMORY_V2_COLLECTION, {
|
|
@@ -441,10 +462,14 @@ function missingNamedVectors(
|
|
|
441
462
|
|
|
442
463
|
const missing: string[] = [];
|
|
443
464
|
for (const name of REQUIRED_DENSE_VECTORS) {
|
|
444
|
-
if (!denseNames.has(name))
|
|
465
|
+
if (!denseNames.has(name)) {
|
|
466
|
+
missing.push(name);
|
|
467
|
+
}
|
|
445
468
|
}
|
|
446
469
|
for (const name of REQUIRED_SPARSE_VECTORS) {
|
|
447
|
-
if (!sparseNames.has(name))
|
|
470
|
+
if (!sparseNames.has(name)) {
|
|
471
|
+
missing.push(name);
|
|
472
|
+
}
|
|
448
473
|
}
|
|
449
474
|
return missing;
|
|
450
475
|
}
|
|
@@ -470,14 +495,18 @@ function wrongSizeNamedVectors(
|
|
|
470
495
|
// Named-vectors map only — mirror the `!("size" in dense)` guard in
|
|
471
496
|
// `missingNamedVectors`. A single unnamed vector exposes `size` at the top
|
|
472
497
|
// level; its dimension is the collection's and is handled by the caller.
|
|
473
|
-
if (!dense || typeof dense !== "object" || "size" in dense)
|
|
498
|
+
if (!dense || typeof dense !== "object" || "size" in dense) {
|
|
499
|
+
return [];
|
|
500
|
+
}
|
|
474
501
|
const map = dense as Record<string, unknown>;
|
|
475
502
|
const wrong: string[] = [];
|
|
476
503
|
for (const name of REQUIRED_DENSE_VECTORS) {
|
|
477
504
|
const entry = map[name];
|
|
478
505
|
if (entry && typeof entry === "object" && "size" in entry) {
|
|
479
506
|
const size = (entry as { size?: unknown }).size;
|
|
480
|
-
if (typeof size === "number" && size !== expectedSize)
|
|
507
|
+
if (typeof size === "number" && size !== expectedSize) {
|
|
508
|
+
wrong.push(name);
|
|
509
|
+
}
|
|
481
510
|
}
|
|
482
511
|
}
|
|
483
512
|
return wrong;
|
|
@@ -525,7 +554,9 @@ export async function upsertConceptPageEmbedding(params: {
|
|
|
525
554
|
}
|
|
526
555
|
|
|
527
556
|
const payload: Record<string, unknown> = { slug, updated_at: updatedAt };
|
|
528
|
-
if (kind !== undefined)
|
|
557
|
+
if (kind !== undefined) {
|
|
558
|
+
payload.kind = kind;
|
|
559
|
+
}
|
|
529
560
|
|
|
530
561
|
const upsertOnce = () =>
|
|
531
562
|
client.upsert(MEMORY_V2_COLLECTION, {
|
|
@@ -624,21 +655,30 @@ export async function pruneSlugsWithPrefixExcept(
|
|
|
624
655
|
kind?: unknown;
|
|
625
656
|
} | null;
|
|
626
657
|
const slug = payload?.slug;
|
|
627
|
-
if (typeof slug !== "string")
|
|
628
|
-
|
|
629
|
-
|
|
658
|
+
if (typeof slug !== "string") {
|
|
659
|
+
continue;
|
|
660
|
+
}
|
|
661
|
+
if (!slug.startsWith(prefix)) {
|
|
662
|
+
continue;
|
|
663
|
+
}
|
|
664
|
+
if (requiredKind !== undefined && payload?.kind !== requiredKind) {
|
|
630
665
|
continue;
|
|
666
|
+
}
|
|
631
667
|
const suffix = slug.slice(prefix.length);
|
|
632
668
|
if (!activeSet.has(suffix)) {
|
|
633
669
|
stalePointIds.push(point.id);
|
|
634
670
|
}
|
|
635
671
|
}
|
|
636
672
|
const next = result.next_page_offset;
|
|
637
|
-
if (next == null)
|
|
673
|
+
if (next == null) {
|
|
674
|
+
break;
|
|
675
|
+
}
|
|
638
676
|
offset = typeof next === "string" ? next : (next as number);
|
|
639
677
|
}
|
|
640
678
|
|
|
641
|
-
if (stalePointIds.length === 0)
|
|
679
|
+
if (stalePointIds.length === 0) {
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
642
682
|
|
|
643
683
|
await client.delete(MEMORY_V2_COLLECTION, {
|
|
644
684
|
wait: true,
|
|
@@ -683,7 +723,9 @@ export async function backfillKindOnPointsWithPrefix(
|
|
|
683
723
|
kind: string,
|
|
684
724
|
allowedSuffixes: ReadonlySet<string>,
|
|
685
725
|
): Promise<number> {
|
|
686
|
-
if (allowedSuffixes.size === 0)
|
|
726
|
+
if (allowedSuffixes.size === 0) {
|
|
727
|
+
return 0;
|
|
728
|
+
}
|
|
687
729
|
await ensureConceptPageCollection();
|
|
688
730
|
|
|
689
731
|
const client = getClient();
|
|
@@ -703,18 +745,28 @@ export async function backfillKindOnPointsWithPrefix(
|
|
|
703
745
|
});
|
|
704
746
|
for (const point of result.points) {
|
|
705
747
|
const slug = (point.payload as { slug?: unknown } | null)?.slug;
|
|
706
|
-
if (typeof slug !== "string")
|
|
707
|
-
|
|
748
|
+
if (typeof slug !== "string") {
|
|
749
|
+
continue;
|
|
750
|
+
}
|
|
751
|
+
if (!slug.startsWith(prefix)) {
|
|
752
|
+
continue;
|
|
753
|
+
}
|
|
708
754
|
const suffix = slug.slice(prefix.length);
|
|
709
|
-
if (!allowedSuffixes.has(suffix))
|
|
755
|
+
if (!allowedSuffixes.has(suffix)) {
|
|
756
|
+
continue;
|
|
757
|
+
}
|
|
710
758
|
pointIds.push(point.id);
|
|
711
759
|
}
|
|
712
760
|
const next = result.next_page_offset;
|
|
713
|
-
if (next == null)
|
|
761
|
+
if (next == null) {
|
|
762
|
+
break;
|
|
763
|
+
}
|
|
714
764
|
offset = typeof next === "string" ? next : (next as number);
|
|
715
765
|
}
|
|
716
766
|
|
|
717
|
-
if (pointIds.length === 0)
|
|
767
|
+
if (pointIds.length === 0) {
|
|
768
|
+
return 0;
|
|
769
|
+
}
|
|
718
770
|
|
|
719
771
|
await client.setPayload(MEMORY_V2_COLLECTION, {
|
|
720
772
|
payload: { kind },
|
|
@@ -778,7 +830,9 @@ export async function recreateConceptPageCollection(): Promise<void> {
|
|
|
778
830
|
try {
|
|
779
831
|
await client.deleteCollection(MEMORY_V2_COLLECTION);
|
|
780
832
|
} catch (err) {
|
|
781
|
-
if (!isCollectionMissing(err))
|
|
833
|
+
if (!isCollectionMissing(err)) {
|
|
834
|
+
throw err;
|
|
835
|
+
}
|
|
782
836
|
}
|
|
783
837
|
_collectionReady = false;
|
|
784
838
|
_collectionReadyPromise = null;
|
|
@@ -796,7 +850,9 @@ export async function conceptPageCollectionExists(): Promise<boolean> {
|
|
|
796
850
|
const result = await client.collectionExists(MEMORY_V2_COLLECTION);
|
|
797
851
|
return result.exists;
|
|
798
852
|
} catch (err) {
|
|
799
|
-
if (isCollectionMissing(err))
|
|
853
|
+
if (isCollectionMissing(err)) {
|
|
854
|
+
return false;
|
|
855
|
+
}
|
|
800
856
|
throw err;
|
|
801
857
|
}
|
|
802
858
|
}
|
|
@@ -813,7 +869,9 @@ export async function dropLegacySkillsCollection(): Promise<void> {
|
|
|
813
869
|
try {
|
|
814
870
|
const client = getClient();
|
|
815
871
|
const exists = await client.collectionExists("memory_v2_skills");
|
|
816
|
-
if (!exists.exists)
|
|
872
|
+
if (!exists.exists) {
|
|
873
|
+
return;
|
|
874
|
+
}
|
|
817
875
|
await client.deleteCollection("memory_v2_skills");
|
|
818
876
|
log.info("Deleted legacy memory_v2_skills Qdrant collection");
|
|
819
877
|
} catch (err) {
|
|
@@ -943,7 +1001,9 @@ export async function hybridQueryConceptPages(
|
|
|
943
1001
|
): void => {
|
|
944
1002
|
for (const point of points ?? []) {
|
|
945
1003
|
const slug = (point.payload as { slug?: unknown } | null)?.slug;
|
|
946
|
-
if (typeof slug !== "string")
|
|
1004
|
+
if (typeof slug !== "string") {
|
|
1005
|
+
continue;
|
|
1006
|
+
}
|
|
947
1007
|
const existing = merged.get(slug) ?? { slug };
|
|
948
1008
|
set(existing, point.score ?? 0);
|
|
949
1009
|
merged.set(slug, existing);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory substrate — `memory_v2_reembed` job handler.
|
|
3
|
+
*
|
|
4
|
+
* Shared by the v2 injection engine and memory-v3; active whenever
|
|
5
|
+
* `usesConceptPageMemory()` holds.
|
|
6
|
+
*
|
|
7
|
+
* Fans out an `embed_concept_page` job per concept-page slug. Enqueued by the
|
|
8
|
+
* consolidation job's follow-ups, boot maintenance, the embedding reconciler,
|
|
9
|
+
* and workspace migrations that need every page re-indexed.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { AssistantConfig } from "../../../../config/types.js";
|
|
13
|
+
import type { MemoryJob } from "../../../../persistence/jobs-store.js";
|
|
14
|
+
import { enqueueEmbedConceptPageJob } from "../jobs/embed-concept-page.js";
|
|
15
|
+
import { getLogger } from "../logging.js";
|
|
16
|
+
import { getWorkspaceDir } from "../paths.js";
|
|
17
|
+
import { listPages } from "./page-store.js";
|
|
18
|
+
|
|
19
|
+
const log = getLogger("memory-v2-reembed");
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Job handler: enqueue an `embed_concept_page` job per concept-page slug.
|
|
23
|
+
* Each enqueue coalesces with an already-pending job for the same slug, so
|
|
24
|
+
* stacked reembed runs converge on at most one pending embed per page.
|
|
25
|
+
*
|
|
26
|
+
* Returns the number of pages fanned out (enqueue attempts, not necessarily
|
|
27
|
+
* fresh rows). Callers (and tests) use the return value to assert progress
|
|
28
|
+
* without inspecting the job table directly.
|
|
29
|
+
*
|
|
30
|
+
* Note on meta files: `essentials.md` / `threads.md` / `recent.md` /
|
|
31
|
+
* `buffer.md` are direct-injected into the system prompt every turn via
|
|
32
|
+
* `_autoinject.md`. They are NOT enqueued for embedding here — their slugs
|
|
33
|
+
* (`__essentials__` etc.) contain underscores that the concept-page slug
|
|
34
|
+
* validator rejects (`[a-z0-9][a-z0-9-]*`), and they live at `memory/<name>.md`
|
|
35
|
+
* rather than `memory/concepts/<name>.md`, so path resolution would also miss.
|
|
36
|
+
* Embedding them would be redundant with the direct injection regardless.
|
|
37
|
+
*/
|
|
38
|
+
export async function memoryV2ReembedJob(
|
|
39
|
+
_job: MemoryJob,
|
|
40
|
+
_config: AssistantConfig,
|
|
41
|
+
): Promise<number> {
|
|
42
|
+
const workspaceDir = getWorkspaceDir();
|
|
43
|
+
const slugs = await listPages(workspaceDir);
|
|
44
|
+
|
|
45
|
+
for (const slug of slugs) {
|
|
46
|
+
enqueueEmbedConceptPageJob({ slug });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
log.info(
|
|
50
|
+
{ conceptPages: slugs.length, total: slugs.length },
|
|
51
|
+
"Memory v2 reembed enqueued",
|
|
52
|
+
);
|
|
53
|
+
return slugs.length;
|
|
54
|
+
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// Memory
|
|
2
|
+
// Memory substrate — Hybrid dense + sparse similarity
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
+
// Shared by the v2 injection engine and memory-v3; active whenever
|
|
6
|
+
// `usesConceptPageMemory()` holds.
|
|
7
|
+
//
|
|
5
8
|
// Computes per-page similarity scores against a query text by fusing dense
|
|
6
9
|
// (cosine) and sparse (BM25-style) channels via a normalized weighted sum.
|
|
7
10
|
// This is the building block the per-turn activation formula (`A_o`) uses to
|
|
@@ -32,13 +35,14 @@
|
|
|
32
35
|
// the score is consumed only as a per-turn ordering signal, not compared
|
|
33
36
|
// across turns.
|
|
34
37
|
|
|
35
|
-
import type { AssistantConfig } from "
|
|
36
|
-
import { isEmbeddingDimensionAvailable } from "
|
|
37
|
-
import { applyCorrectionIfCalibrated } from "
|
|
38
|
-
import { embedWithBackend } from "
|
|
39
|
-
import { clampUnitInterval } from "
|
|
38
|
+
import type { AssistantConfig } from "../../../../config/types.js";
|
|
39
|
+
import { isEmbeddingDimensionAvailable } from "../../../../persistence/embeddings/embedding-backend.js";
|
|
40
|
+
import { applyCorrectionIfCalibrated } from "../anisotropy.js";
|
|
41
|
+
import { embedWithBackend } from "../embeddings.js";
|
|
42
|
+
import { clampUnitInterval } from "../validation.js";
|
|
40
43
|
import { hybridQueryConceptPages } from "./qdrant.js";
|
|
41
44
|
import { generateBm25QueryEmbedding } from "./sparse-bm25.js";
|
|
45
|
+
import { resolveSubstrateTuning } from "./tuning.js";
|
|
42
46
|
|
|
43
47
|
/**
|
|
44
48
|
* Clamp a value into the closed unit interval [0, 1]. Re-exported under the
|
|
@@ -89,10 +93,16 @@ export function effectiveWeights(
|
|
|
89
93
|
let max = -Infinity;
|
|
90
94
|
let count = 0;
|
|
91
95
|
for (const h of hits) {
|
|
92
|
-
if (h.sparseScore === undefined)
|
|
96
|
+
if (h.sparseScore === undefined) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
93
99
|
const norm = h.sparseScore / maxSparse;
|
|
94
|
-
if (norm < min)
|
|
95
|
-
|
|
100
|
+
if (norm < min) {
|
|
101
|
+
min = norm;
|
|
102
|
+
}
|
|
103
|
+
if (norm > max) {
|
|
104
|
+
max = norm;
|
|
105
|
+
}
|
|
96
106
|
count++;
|
|
97
107
|
}
|
|
98
108
|
// With < 2 sparse-bearing hits the spread is undefined — fall back to base
|
|
@@ -103,10 +113,9 @@ export function effectiveWeights(
|
|
|
103
113
|
}
|
|
104
114
|
const spread = max - min;
|
|
105
115
|
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
const fullSpread =
|
|
109
|
-
config.memory.v2.full_sparse_spread ?? ADAPTIVE_SPARSE_FULL_SPREAD;
|
|
116
|
+
const tuning = resolveSubstrateTuning(config.memory);
|
|
117
|
+
const minSpread = tuning.min_sparse_spread ?? ADAPTIVE_SPARSE_MIN_SPREAD;
|
|
118
|
+
const fullSpread = tuning.full_sparse_spread ?? ADAPTIVE_SPARSE_FULL_SPREAD;
|
|
110
119
|
// Degenerate config (full <= min): no interpolation range. Don't try to
|
|
111
120
|
// adapt; trust the operator's base weights and report the measured spread
|
|
112
121
|
// for diagnostics.
|
|
@@ -212,7 +221,7 @@ export async function simBatch(
|
|
|
212
221
|
const maxBodySparse = computeMaxSparse(hits, (h) => h.sparseScore);
|
|
213
222
|
const maxSummarySparse = computeMaxSparse(hits, (h) => h.summarySparseScore);
|
|
214
223
|
const { dense_weight: baseDense, sparse_weight: baseSparse } =
|
|
215
|
-
config.memory
|
|
224
|
+
resolveSubstrateTuning(config.memory);
|
|
216
225
|
const { dense: bodyDenseWeight, sparse: bodySparseWeight } = effectiveWeights(
|
|
217
226
|
hits.map((h) => ({ sparseScore: h.sparseScore })),
|
|
218
227
|
maxBodySparse,
|
|
@@ -300,7 +309,9 @@ export function fuseHalf(
|
|
|
300
309
|
denseWeight: number,
|
|
301
310
|
sparseWeight: number,
|
|
302
311
|
): number | undefined {
|
|
303
|
-
if (denseScore === undefined && sparseScore === undefined)
|
|
312
|
+
if (denseScore === undefined && sparseScore === undefined) {
|
|
313
|
+
return undefined;
|
|
314
|
+
}
|
|
304
315
|
const dense = denseScore !== undefined ? Math.max(0, denseScore) : 0;
|
|
305
316
|
const sparseNormalized =
|
|
306
317
|
sparseScore !== undefined && maxSparse > 0 ? sparseScore / maxSparse : 0;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// Memory
|
|
2
|
+
// Memory substrate — Skill catalog → embedded skill entries
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
+
// Shared by the v2 injection engine and memory-v3; active whenever
|
|
6
|
+
// `usesConceptPageMemory()` holds.
|
|
7
|
+
//
|
|
5
8
|
// Enumerate the enabled-skill catalog AND uninstalled catalog skills, render
|
|
6
9
|
// each skill's prose statement via `buildSkillContent`, embed dense + sparse,
|
|
7
10
|
// and upsert into `memory_v2_concept_pages` under the slug `skills/<id>`.
|
|
@@ -24,11 +27,11 @@
|
|
|
24
27
|
|
|
25
28
|
import { listCatalogSkills, listInstalledSkills } from "@vellumai/plugin-api";
|
|
26
29
|
|
|
27
|
-
import { getConfig } from "
|
|
28
|
-
import { generateSparseEmbedding } from "
|
|
29
|
-
import { applyCorrectionIfCalibrated } from "
|
|
30
|
-
import { embedWithBackend } from "
|
|
31
|
-
import { getLogger } from "
|
|
30
|
+
import { getConfig } from "../../../../config/loader.js";
|
|
31
|
+
import { generateSparseEmbedding } from "../../../../persistence/embeddings/embedding-backend.js";
|
|
32
|
+
import { applyCorrectionIfCalibrated } from "../anisotropy.js";
|
|
33
|
+
import { embedWithBackend } from "../embeddings.js";
|
|
34
|
+
import { getLogger } from "../logging.js";
|
|
32
35
|
import { invalidatePageIndex } from "./page-index.js";
|
|
33
36
|
import {
|
|
34
37
|
backfillKindOnPointsWithPrefix,
|
|
@@ -44,6 +47,7 @@ import {
|
|
|
44
47
|
generateBm25DocEmbedding,
|
|
45
48
|
getConceptPageCorpusStats,
|
|
46
49
|
} from "./sparse-bm25.js";
|
|
50
|
+
import { resolveSubstrateTuning } from "./tuning.js";
|
|
47
51
|
import type { SkillEntry } from "./types.js";
|
|
48
52
|
|
|
49
53
|
const log = getLogger("memory-v2-skill-store");
|
|
@@ -256,11 +260,12 @@ async function runSeedV2SkillEntries(generation: number): Promise<void> {
|
|
|
256
260
|
// entirely. Fall back to the legacy TF encoder only during the cold-start
|
|
257
261
|
// window before corpus stats finish building.
|
|
258
262
|
const corpusStats = getConceptPageCorpusStats();
|
|
263
|
+
const { bm25_k1, bm25_b } = resolveSubstrateTuning(config.memory);
|
|
259
264
|
encodeSparse = (input: string) =>
|
|
260
265
|
corpusStats
|
|
261
266
|
? generateBm25DocEmbedding(input, corpusStats, {
|
|
262
|
-
k1:
|
|
263
|
-
b:
|
|
267
|
+
k1: bm25_k1,
|
|
268
|
+
b: bm25_b,
|
|
264
269
|
})
|
|
265
270
|
: generateSparseEmbedding(input);
|
|
266
271
|
try {
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// Memory
|
|
2
|
+
// Memory substrate — BM25 sparse channel
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
+
// Shared by the v2 injection engine and memory-v3; active whenever
|
|
6
|
+
// `usesConceptPageMemory()` holds.
|
|
7
|
+
//
|
|
5
8
|
// Replaces the legacy TF-only sparse embedding (`generateSparseEmbedding` in
|
|
6
9
|
// `../embedding-backend.ts`) with a real Okapi BM25 implementation. Common
|
|
7
10
|
// words like "i", "am", "the" no longer dominate sparse matching the way they
|
|
@@ -26,12 +29,12 @@
|
|
|
26
29
|
|
|
27
30
|
import { readFile } from "node:fs/promises";
|
|
28
31
|
|
|
29
|
-
import type { SparseEmbedding } from "
|
|
32
|
+
import type { SparseEmbedding } from "../../../../persistence/embeddings/embedding-types.js";
|
|
30
33
|
import {
|
|
31
34
|
SPARSE_VOCAB_SIZE,
|
|
32
35
|
tokenHash,
|
|
33
36
|
tokenizeStemmed,
|
|
34
|
-
} from "
|
|
37
|
+
} from "../../../../persistence/embeddings/sparse-tokenize.js";
|
|
35
38
|
import { listPages } from "./page-store.js";
|
|
36
39
|
|
|
37
40
|
/**
|
|
@@ -98,15 +101,21 @@ export async function rebuildConceptPageCorpusStats(
|
|
|
98
101
|
|
|
99
102
|
for (const slug of slugs) {
|
|
100
103
|
const body = await readPageBodyForStats(workspaceDir, slug);
|
|
101
|
-
if (body === null)
|
|
104
|
+
if (body === null) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
102
107
|
const tokens = tokenizeStemmed(body);
|
|
103
|
-
if (tokens.length === 0)
|
|
108
|
+
if (tokens.length === 0) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
104
111
|
totalTokens += tokens.length;
|
|
105
112
|
docsCounted += 1;
|
|
106
113
|
const seen = new Set<number>();
|
|
107
114
|
for (const token of tokens) {
|
|
108
115
|
const idx = tokenHash(token, SPARSE_VOCAB_SIZE);
|
|
109
|
-
if (seen.has(idx))
|
|
116
|
+
if (seen.has(idx)) {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
110
119
|
seen.add(idx);
|
|
111
120
|
df.set(idx, (df.get(idx) ?? 0) + 1);
|
|
112
121
|
}
|
|
@@ -142,7 +151,9 @@ async function readPageBodyForStats(
|
|
|
142
151
|
const closing = raw.indexOf("\n---", 3);
|
|
143
152
|
if (closing !== -1) {
|
|
144
153
|
const after = raw.indexOf("\n", closing + 4);
|
|
145
|
-
if (after !== -1)
|
|
154
|
+
if (after !== -1) {
|
|
155
|
+
return raw.slice(after + 1);
|
|
156
|
+
}
|
|
146
157
|
}
|
|
147
158
|
}
|
|
148
159
|
return raw;
|
|
@@ -193,11 +204,15 @@ export function generateBm25DocEmbedding(
|
|
|
193
204
|
|
|
194
205
|
for (const [idx, freq] of tf) {
|
|
195
206
|
const idf = computeIdf(stats, idx);
|
|
196
|
-
if (idf === 0)
|
|
207
|
+
if (idf === 0) {
|
|
208
|
+
continue;
|
|
209
|
+
} // Skip tokens that contribute nothing to scores.
|
|
197
210
|
const saturated =
|
|
198
211
|
(freq * (params.k1 + 1)) / (freq + params.k1 * lengthFactor);
|
|
199
212
|
const weight = idf * saturated;
|
|
200
|
-
if (weight === 0)
|
|
213
|
+
if (weight === 0) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
201
216
|
indices.push(idx);
|
|
202
217
|
values.push(weight);
|
|
203
218
|
}
|
|
@@ -225,7 +240,9 @@ export function generateBm25QueryEmbedding(text: string): SparseEmbedding {
|
|
|
225
240
|
const values: number[] = [];
|
|
226
241
|
for (const token of tokens) {
|
|
227
242
|
const idx = tokenHash(token, SPARSE_VOCAB_SIZE);
|
|
228
|
-
if (seen.has(idx))
|
|
243
|
+
if (seen.has(idx)) {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
229
246
|
seen.add(idx);
|
|
230
247
|
indices.push(idx);
|
|
231
248
|
values.push(1);
|