@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
|
@@ -0,0 +1,775 @@
|
|
|
1
|
+
# Memory Plugin — Agent Instructions
|
|
2
|
+
|
|
3
|
+
Rules for code under `assistant/src/plugins/defaults/memory/` (`MEM/` below).
|
|
4
|
+
For the user-facing architecture narrative — what each tier does and how the
|
|
5
|
+
write and read paths fit together — read `assistant/docs/architecture/memory.md`
|
|
6
|
+
first. This file is the layering contract: where code goes, which names can
|
|
7
|
+
never be renamed, and how to retire a tier.
|
|
8
|
+
|
|
9
|
+
## Tier movement is one-way
|
|
10
|
+
|
|
11
|
+
**v1 and v2 are legacy. Assistants move v1 → v2 → v3 and never back.** There is
|
|
12
|
+
no supported path from v3 to an earlier tier, so "what happens when an assistant
|
|
13
|
+
returns to v1 (or v2)" is not a scenario this code serves.
|
|
14
|
+
|
|
15
|
+
That rules out a whole class of plausible-sounding work: reconciling state that
|
|
16
|
+
a lower tier would need, keeping a lower tier's derived data warm while a higher
|
|
17
|
+
tier is live, or postponing a lower tier's jobs so they survive a downgrade.
|
|
18
|
+
Review feedback will periodically ask for exactly that — the reasoning looks
|
|
19
|
+
sound in isolation, because the state genuinely is missing. Decline it and point
|
|
20
|
+
here. The correct fix for a lower tier's stale derived data is to delete the
|
|
21
|
+
lower tier (see the runbooks below), not to maintain it.
|
|
22
|
+
|
|
23
|
+
Two consequences worth stating plainly:
|
|
24
|
+
|
|
25
|
+
- The return-to-v1 path has been **removed**, not merely left vestigial: the
|
|
26
|
+
`v1_entry_reconcile_done` checkpoint, its re-arm in `jobs-worker.ts`, the boot
|
|
27
|
+
claim in `startup.ts`, and `reconcileCapabilityEmbeddings` in
|
|
28
|
+
`graph/capability-seed.ts` are all gone. Do not reintroduce them. (A stale
|
|
29
|
+
`v1_entry_reconcile_done` row may still sit in `memory_checkpoints` on an
|
|
30
|
+
upgraded install; nothing reads it, so it is inert and needs no migration.)
|
|
31
|
+
- Gaps that only manifest after a downgrade are **not bugs**. Record them here
|
|
32
|
+
if they are non-obvious; do not build machinery to close them.
|
|
33
|
+
|
|
34
|
+
## Directory / tier map
|
|
35
|
+
|
|
36
|
+
The plugin is layered into **tier directories** plus a **spine** that composes
|
|
37
|
+
them. Everything not listed as a tier directory is spine.
|
|
38
|
+
|
|
39
|
+
| Directory | What lives there | Gate predicate |
|
|
40
|
+
| ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
|
|
41
|
+
| `substrate/` | The shared concept-page substrate (v2 + v3): `page-store`, `page-index`, `edge-index`, `qdrant`, `sim`, `sparse-bm25`, `spread`, `skill-store`, `cli-command-store`, `skill-content`, `cli-command-content`, `injected-block-slugs`, `static-context`, `boot-maintenance`, `frontmatter-sweep`, `consolidation-job`, `sweep-job`, `reembed-job`, `tuning`, `types`, `constants`, `prompts/`. | `usesConceptPageMemory()` |
|
|
42
|
+
| `v1/` | The legacy PKB/graph engine: `pkb/`, `graph/` (retriever, triggers, scoring, serendipity, extraction, extraction-job, decay, consolidation, pattern-scan, narrative, bootstrap, injection, and the hybrid node-search half of `graph-search`), `jobs/embed-pkb-file.ts`, `job-handlers/{backfill,embedding,index-maintenance}.ts`, `pkb-schedule.ts`, `filing-jobs.ts`, `semantic-search.ts`, `identity-context.ts`, `README.md`. | `isMemoryV1Active()` |
|
|
43
|
+
| `v2/` | The v2 activation/router injection engine: `activation`, `activation-store`, `activation-log-store`, `concept-frequency`, `injection`, `injection-events`, `router`, `reranker`, `rerank-local`, `migration`, `now-text`, `backfill-jobs` (migrate + activation-recompute), `harness/`, `prompts/router`. | `isV2InjectionEngineActive()` |
|
|
44
|
+
| `v3/`, `v3-eval/` | The v3 lanes, orchestrator, injectors, maintain job, and the eval siblings. | `isMemoryV3Live()` |
|
|
45
|
+
|
|
46
|
+
Everything else under the plugin root is **spine**:
|
|
47
|
+
|
|
48
|
+
- `graph/` — the **all-tier** legacy-graph store plus the tier dispatcher:
|
|
49
|
+
`conversation-graph-memory.ts` (the v1↔v2 dispatch spine; also owns
|
|
50
|
+
compaction eviction of v2 activation rows and v3 `everInjected` state, and
|
|
51
|
+
the injected-block strip identity), `store.ts`, `tool-handlers.ts`,
|
|
52
|
+
`tools.ts`, `capability-seed.ts`, `in-context-tracker.ts`, `graph-search.ts`
|
|
53
|
+
(node/trigger **embedding** plumbing — the v1 search half lives in
|
|
54
|
+
`v1/graph/graph-search.ts`), `graph-memory-state-store.ts`, `types.ts`,
|
|
55
|
+
`image-ref-utils.ts`. Despite the `memory_graph_*` naming, this directory is
|
|
56
|
+
not v1: capability seeding writes graph nodes on every tier.
|
|
57
|
+
- `graph-topology/` — the backend-agnostic memory-graph view served to the web
|
|
58
|
+
Memory tab (`build-memory-graph.ts`, `pending-buffer.ts`).
|
|
59
|
+
- Shared infra at the root: `logging`, `paths`, `embeddings`, `anisotropy`,
|
|
60
|
+
`frontmatter`, `validation`, `llm-helpers`, `config`, `memory-db`,
|
|
61
|
+
`host-utils`, `path-containment`, `prompt-override`, `memory-marker`,
|
|
62
|
+
`segmenter`, `message-media`, `worker`, `worker-control`,
|
|
63
|
+
`memory-recall-log-store`, `activation-session-store` (the onboarding
|
|
64
|
+
activation rail — **not** a memory tier despite the name),
|
|
65
|
+
`tail-reinjection-strip`, `task-memory-cleanup`, `conversation-memory-purge`,
|
|
66
|
+
`conversation-memory-orphan-sweep`, `fork-conversation-memory`,
|
|
67
|
+
`find-most-recent-retrospective-for`.
|
|
68
|
+
- The `memory-retrospective-*` family — tier-agnostic, gated on
|
|
69
|
+
`memory.enabled` alone. The one exception is
|
|
70
|
+
`memory-retrospective-skill-card.ts`, whose upstream enqueue only fires when
|
|
71
|
+
`isV3TierActive()` holds (memory on and v3 live).
|
|
72
|
+
- The rest of the spine: `startup.ts`, `jobs-worker.ts`, `job-handlers.ts`,
|
|
73
|
+
`job-handler-registration.ts`, `indexer.ts`, `injectors.ts`, `tools.ts`,
|
|
74
|
+
`hooks/`, `src/` (HTTP routes), `context-search/`.
|
|
75
|
+
|
|
76
|
+
### The layering rule
|
|
77
|
+
|
|
78
|
+
**Tier directories never import each other.** The only sanctioned edge is
|
|
79
|
+
`substrate/` upward: `v2/` and `v3/`/`v3-eval/` may import `substrate/`, and
|
|
80
|
+
`substrate/` imports no tier. `v1/` imports no tier at all.
|
|
81
|
+
|
|
82
|
+
**Multi-tier composition happens only at the spine.** A spine file that imports
|
|
83
|
+
from two or more tier directories is a composition point and must be on the
|
|
84
|
+
frozen `SPINE_ALLOWLIST`, which today is exactly:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
fork-conversation-memory.ts
|
|
88
|
+
graph-topology/build-memory-graph.ts
|
|
89
|
+
graph/conversation-graph-memory.ts
|
|
90
|
+
injectors.ts
|
|
91
|
+
job-handlers.ts
|
|
92
|
+
jobs-worker.ts
|
|
93
|
+
src/memory-v2-routes.ts
|
|
94
|
+
startup.ts
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The list is frozen: new multi-tier composition belongs in one of these files,
|
|
98
|
+
and shrinking the list is how the deletion runbooks below retire an engine.
|
|
99
|
+
Inside them the tier arms carry `// V1 — delete with v1` /
|
|
100
|
+
`// V2 ENGINE — delete with v2` / `// SUBSTRATE (v2+v3)` banners, so
|
|
101
|
+
`grep -rn 'delete with v1' src/plugins/defaults/memory/` finds every v1 arm.
|
|
102
|
+
Two conventions keep that grep honest, and both are load-bearing:
|
|
103
|
+
|
|
104
|
+
- **The banner phrase is exact.** `startup.ts` labels its sections
|
|
105
|
+
`// ---- <tier> ... ----` rather than `// V1 …`, so its v1 labels spell out
|
|
106
|
+
`— delete with v1` too (`// ---- v1 (legacy engine) — delete with v1 ----`);
|
|
107
|
+
otherwise its three v1 blocks would be invisible to the grep.
|
|
108
|
+
- **Dispatch call sites are banner-marked, not just function bodies.** A v1
|
|
109
|
+
helper is typically an `else` arm calling a banner-marked function
|
|
110
|
+
(`jobs-worker.ts`'s `enqueueV1MaintenanceJobs`, `indexer.ts`'s
|
|
111
|
+
`enqueueV1IndexTriggers`). Deleting only the marked bodies leaves the calls
|
|
112
|
+
dangling, so the call sites carry their own banner.
|
|
113
|
+
|
|
114
|
+
`indexer.ts`, `injectors.ts`, and `context-search/sources/memory.ts` follow the
|
|
115
|
+
same convention even where the file touches a single tier.
|
|
116
|
+
|
|
117
|
+
**`injectors.ts` is the plugin's single injector entry point.** Its exported
|
|
118
|
+
`memoryInjectors` is the complete set `defaultMemoryPlugin` contributes —
|
|
119
|
+
including the v3 pair defined in `v3/injector.ts` — so `plugins/defaults/index.ts`
|
|
120
|
+
imports the array and nothing else. A new tier injector is added to that array,
|
|
121
|
+
never registered from the host.
|
|
122
|
+
|
|
123
|
+
Both rules are enforced by `__tests__/memory-tier-boundary-guard.test.ts`, which
|
|
124
|
+
also carries a reverse stale-exemption test: an allowlist entry whose multi-tier
|
|
125
|
+
import disappears fails loudly instead of lingering. Related guards:
|
|
126
|
+
|
|
127
|
+
- `src/__tests__/plugin-import-boundary-guard.test.ts` — relative-specifier
|
|
128
|
+
baseline for the whole plugin tree.
|
|
129
|
+
- `src/__tests__/persistence-layering-guard.test.ts` — one-way
|
|
130
|
+
memory → persistence direction. It holds **two** separate maps, and they mean
|
|
131
|
+
opposite things:
|
|
132
|
+
- `PERSISTENCE_TO_MEMORY_ALLOWLIST` — genuine tech debt, ratcheting to zero.
|
|
133
|
+
Today it holds exactly one file, `persistence/conversation-crud.ts`
|
|
134
|
+
(`fork-conversation-memory`, `indexer`).
|
|
135
|
+
- `MIGRATION_REGISTRY_MEMORY_IMPORTS` — a **permanent** exception, not tech
|
|
136
|
+
debt: `persistence/steps.ts` is the migration registry and references each
|
|
137
|
+
migration in the domain that owns it, today
|
|
138
|
+
`{"v1/graph/bootstrap"}`. Deleting v1 does not retire the exemption, it
|
|
139
|
+
moves the **pointer**: the v1 runbook relocates `migrateToolCreatedItems`
|
|
140
|
+
to a surviving home (the registration is append-only and must keep
|
|
141
|
+
running), and this entry is repointed at that module — or drops out only
|
|
142
|
+
if the function lands inside `persistence/` itself.
|
|
143
|
+
- `src/plugins/__tests__/plugin-state-boundary-guard.test.ts` — the
|
|
144
|
+
grandfathered main-DB exception for this plugin (do not grow its surface).
|
|
145
|
+
|
|
146
|
+
## Which predicate gates what
|
|
147
|
+
|
|
148
|
+
All predicates live in `assistant/src/config/memory-v3-gate.ts`. **Nothing else
|
|
149
|
+
may read raw `memory.v2.*` / `memory.v3.*` tier keys** — those reads are a
|
|
150
|
+
layering leak, and the boundary guard's `TIER_KEY_READ_ALLOWLIST` pins the
|
|
151
|
+
frozen (path, namespace) exemptions.
|
|
152
|
+
|
|
153
|
+
| Predicate | True when | Gates |
|
|
154
|
+
| ------------------------------ | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
|
|
155
|
+
| `isMemoryEnabled` | `memory.enabled !== false` (master switch, defaults on) | the whole memory system, the retrospective family, the jobs worker's memory drain |
|
|
156
|
+
| `isMemoryV1Active` | memory on AND no concept-page consumer | everything under `v1/`, the v1 job handlers, the v1 maintenance/index triggers |
|
|
157
|
+
| `isV2InjectionEngineActive` | memory on AND `memory.v2.enabled === true` AND v3 not live | v2's turn-time selection — the ONLY correct "should v2 select this turn" check |
|
|
158
|
+
| `isMemoryV2ExplicitlyDisabled` | `memory.v2.enabled === false` (deliberately not the negation above) | `daemon/embedding-reconcile.ts`'s explicit-opt-out suppression |
|
|
159
|
+
| `usesConceptPageMemory` | memory on AND (`memory.v3.live` OR `memory.v2.enabled`) | everything under `substrate/`, the graph tool handlers, the static `<info>` block |
|
|
160
|
+
| `isMemoryV3Live` | `memory.v3.live === true` | everything under `v3/`, and the v2 suppression at runtime assembly |
|
|
161
|
+
| `isV3TierActive` | memory on AND v3 live (the v3 TIER — `memoryTier() === "v3"`) | `GET /memory-graph` + the `graph_supported` bit, AND procedural-memory-as-skills |
|
|
162
|
+
|
|
163
|
+
`memory.v2.enabled` defaults **true** and typically stays set on v3-live
|
|
164
|
+
assistants, so a direct read of it misbehaves under v3. That is exactly why
|
|
165
|
+
`isV2InjectionEngineActive` exists — reach for the predicate, never the key.
|
|
166
|
+
|
|
167
|
+
**`isMemoryV1Active` is not the only v1 gate.** Several v1 code paths key on
|
|
168
|
+
`!usesConceptPageMemory(config.memory)` instead — notably the v1 Qdrant
|
|
169
|
+
collection lifecycle and the PKB index reconcile in `startup.ts`, and the
|
|
170
|
+
tier dispatch in `jobs-worker.ts` / `indexer.ts` / `context-search/sources/`.
|
|
171
|
+
The two agree everywhere except when memory is OFF: `isMemoryV1Active` is
|
|
172
|
+
false, but `!usesConceptPageMemory` is **true**, so those paths still run.
|
|
173
|
+
That is observable in `startup.ts`, which has no memory-enabled guard of its
|
|
174
|
+
own — a `memory.enabled: false` assistant still ensures/migrates the v1
|
|
175
|
+
collection on boot (only the follow-up `rebuild_index` enqueue is
|
|
176
|
+
`isMemoryEnabled()`-gated). Read the actual gate before assuming a v1 block
|
|
177
|
+
is inert on an off assistant.
|
|
178
|
+
|
|
179
|
+
`assistant/src/config/memory-tier.ts`'s `memoryTier()` is fully DERIVED from
|
|
180
|
+
these predicates (`off` → `v3` → `v2` → `v1`, in that precedence), so the
|
|
181
|
+
telemetry buckets and the runtime gates can never disagree.
|
|
182
|
+
`persistence/jobs-store.ts`'s config-singleton `isMemoryEnabled()` delegates to
|
|
183
|
+
the gate predicate for the same reason.
|
|
184
|
+
|
|
185
|
+
## Config namespaces
|
|
186
|
+
|
|
187
|
+
| Namespace | Role |
|
|
188
|
+
| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
189
|
+
| `memory.enabled` | Master switch. `false` turns the whole system off regardless of tier keys. |
|
|
190
|
+
| `memory.substrate.*` | **Override-only** substrate tuning. Fifteen keys, every one optional with no default. |
|
|
191
|
+
| `memory.v2.*` | The v2 engine's own tunables (activation weights, router, rerank) **plus** the historical substrate twins that supply the effective defaults. |
|
|
192
|
+
| `memory.v3.*` | v3 lane/orchestrator tuning, plus `memory.v3.live`. |
|
|
193
|
+
| `memory.retrospective.*` | Retrospective cadence and triggers — tier-agnostic. |
|
|
194
|
+
|
|
195
|
+
`substrate/tuning.ts`'s `resolveSubstrateTuning` is the substrate's **single
|
|
196
|
+
config choke point**: each key resolves as `memory.substrate.X ?? memory.v2.X`
|
|
197
|
+
(an explicit `null` on a nullable key counts as present and wins).
|
|
198
|
+
`spread_k` / `spread_hops` / `ann_candidate_limit` map onto `memory.v2.k` /
|
|
199
|
+
`memory.v2.hops` / `memory.v2.ann_candidate_limit`; every other key shares its
|
|
200
|
+
name with its twin.
|
|
201
|
+
|
|
202
|
+
Because a single substrate weight forms its effective pair with the v2 twin,
|
|
203
|
+
the dense/sparse sum-to-1 invariant is checked in three places for three
|
|
204
|
+
disjoint cases: the substrate schema's own refinement (both set), the v2
|
|
205
|
+
schema's (neither set), and the parent `MemoryConfigSchema.superRefine` (the
|
|
206
|
+
mixed case, over the RESOLVED pair). Keep all three when touching the weights.
|
|
207
|
+
|
|
208
|
+
Twelve of the fifteen twins reach the runtime through `resolveSubstrateTuning`
|
|
209
|
+
and nothing else, so once the `memory.substrate` key exists a `config set` on
|
|
210
|
+
the `memory.v2` twin persists but changes nothing. The other three — `k`,
|
|
211
|
+
`hops`, `ann_candidate_limit` — are read a **second** time by the live v2
|
|
212
|
+
injection engine straight off `config.memory.v2` (`v2/injection.ts`,
|
|
213
|
+
`v2/activation.ts`, `v2/backfill-jobs.ts`), so a write there retunes v2
|
|
214
|
+
injection while substrate recall stays on the substrate twin: the two
|
|
215
|
+
namespaces hold two effective values at once.
|
|
216
|
+
|
|
217
|
+
`config/substrate-twin-shadowing.ts` pairs the namespaces and carries the
|
|
218
|
+
`alsoReadByV2Engine` flag that separates the two classes, so neither case reads
|
|
219
|
+
as the other: the `config_set` route returns a `warning` (a no-op notice for a
|
|
220
|
+
substrate-only twin, a divergence notice for an engine-read one) and
|
|
221
|
+
`assistant config get` prints the matching `Shadowed:` / `Split:` line.
|
|
222
|
+
|
|
223
|
+
Workspace migration 135 copies explicitly-set NON-DEFAULT `memory.v2` substrate
|
|
224
|
+
tunables into `memory.substrate`. It skips loader-seeded defaults — including
|
|
225
|
+
`bm25_b`'s earlier `0.75` default — because raw presence in `config.json` is not
|
|
226
|
+
user intent (the loader serializes the fully-parsed config), and copying seeded
|
|
227
|
+
values would permanently pin those assistants when substrate defaults are
|
|
228
|
+
retuned.
|
|
229
|
+
|
|
230
|
+
## FROZEN NAMES
|
|
231
|
+
|
|
232
|
+
These names are durable or wire-visible. **Never rename them**, including
|
|
233
|
+
during a tier deletion — several are spelled `v2` but belong to the substrate,
|
|
234
|
+
which outlives the v2 engine.
|
|
235
|
+
|
|
236
|
+
### SQLite tables
|
|
237
|
+
|
|
238
|
+
Persisted rows; a rename orphans every existing install.
|
|
239
|
+
|
|
240
|
+
| Table | Owner |
|
|
241
|
+
| --------------------------------- | ----------------------------------- |
|
|
242
|
+
| `memory_graph_nodes` | all-tier (`graph/store.ts`) |
|
|
243
|
+
| `memory_graph_edges` | all-tier |
|
|
244
|
+
| `memory_graph_triggers` | all-tier |
|
|
245
|
+
| `memory_graph_node_edits` | all-tier |
|
|
246
|
+
| `memory_segments` | v1 indexing |
|
|
247
|
+
| `memory_summaries` | v1 indexing |
|
|
248
|
+
| `memory_embeddings` | shared embedding cache |
|
|
249
|
+
| `memory_checkpoints` | shared (all durable checkpoints) |
|
|
250
|
+
| `memory_jobs` | shared job queue |
|
|
251
|
+
| `memory_recall_logs` | shared recall audit |
|
|
252
|
+
| `conversation_graph_memory_state` | `graph/graph-memory-state-store.ts` |
|
|
253
|
+
| `activation_state` | v2 per-conversation activation |
|
|
254
|
+
| `memory_v2_activation_logs` | v2 inspector/harness |
|
|
255
|
+
| `memory_v2_injection_events` | v2 scoring feedback |
|
|
256
|
+
| `memory_v3_selections` | v3 selection log |
|
|
257
|
+
| `memory_v3_ever_injected` | v3 card dedup |
|
|
258
|
+
| `memory_retrospective_state` | retrospective (tier-agnostic) |
|
|
259
|
+
| `activation_sessions` | onboarding activation rail |
|
|
260
|
+
|
|
261
|
+
### Job types (`memory_jobs.type`)
|
|
262
|
+
|
|
263
|
+
Persisted in job rows; unknown types either throw or get silently drained.
|
|
264
|
+
|
|
265
|
+
- Substrate: `memory_v2_consolidate`, `memory_v2_sweep`, `memory_v2_reembed`,
|
|
266
|
+
`embed_concept_page`
|
|
267
|
+
- v2 engine: `memory_v2_migrate`, `memory_v2_activation_recompute`
|
|
268
|
+
- v3: `memory_v3_maintain`
|
|
269
|
+
- Retrospective: `memory_retrospective`, `memory_retrospective_sweep`,
|
|
270
|
+
`skill_card_insert`
|
|
271
|
+
- v1: `graph_extract`, `graph_decay`, `graph_consolidate`, `graph_pattern_scan`,
|
|
272
|
+
`graph_narrative_refine`, `graph_bootstrap`, `embed_pkb_file`, `pkb_filing`,
|
|
273
|
+
`pkb_compaction`, `rebuild_index`, `backfill`, `delete_qdrant_vectors`,
|
|
274
|
+
`sweep_orphaned_graph_node_points`
|
|
275
|
+
- All-tier embedding: `embed_graph_node`, `graph_trigger_embed`,
|
|
276
|
+
`embed_segment`, `embed_summary`, `embed_media`, `embed_attachment`
|
|
277
|
+
- Retired, still in the union: `memory_v3_consolidate`,
|
|
278
|
+
`memory_v3_index_maintenance`, `memory_v3_edge_learning` (v3-rip casualties —
|
|
279
|
+
handlers removed) and `conversation_analyze` — never enqueued, but they stay
|
|
280
|
+
`MemoryJobType` members **and** `LEGACY_JOB_TYPES` members so pre-upgrade rows
|
|
281
|
+
drain silently
|
|
282
|
+
- Retired, `LEGACY_JOB_TYPES` only (already out of the union):
|
|
283
|
+
`memory_v2_rebuild_edges`, `memory_proc_distill`, and the pre-memory batch
|
|
284
|
+
(`embed_item`, `extract_items`, `batch_extract`, `extract_entities`,
|
|
285
|
+
`cleanup_stale_superseded_items`, `backfill_entity_relations`,
|
|
286
|
+
`refresh_weekly_summary`, `refresh_monthly_summary`, `journal_carry_forward`,
|
|
287
|
+
`generate_capability_cards`, `generate_thread_starters`)
|
|
288
|
+
|
|
289
|
+
Retired types are never deleted from the `MemoryJobType` union — they move to
|
|
290
|
+
`LEGACY_JOB_TYPES` in `jobs-worker.ts` so pre-upgrade rows drain instead of
|
|
291
|
+
throwing. Dropping a name from **either** list strands the persisted rows that
|
|
292
|
+
still carry it: the worker's dispatch falls through to
|
|
293
|
+
`Unknown memory job type: <type>` and the row fails forever instead of
|
|
294
|
+
completing. The `LEGACY_JOB_TYPES` set is therefore append-only in practice —
|
|
295
|
+
prune it only after you can prove no install still holds a pending row.
|
|
296
|
+
|
|
297
|
+
### Checkpoint keys (`memory_checkpoints.key`)
|
|
298
|
+
|
|
299
|
+
`GRAPH_MAINTENANCE_CHECKPOINTS` in `jobs-worker.ts`, plus the consolidation
|
|
300
|
+
failure record and the section re-embed high-water:
|
|
301
|
+
|
|
302
|
+
- `memory_v2_consolidate_last_run`, `memory_v3_maintain_last_run` — cadence
|
|
303
|
+
- `memory_v2_consolidate_failure_state` (`substrate/consolidation-job.ts`) —
|
|
304
|
+
the consolidation backoff record
|
|
305
|
+
- `memory_v3_maintain:sections_embedded_through_ms`
|
|
306
|
+
(`v3/section-dense-store.ts`'s `MAINTAIN_EMBED_HIGH_WATER_KEY`) — durable
|
|
307
|
+
epoch-ms high-water of the last successful section re-embed pass; when it is
|
|
308
|
+
absent the maintain job re-embeds EVERY page, so losing or renaming it forces
|
|
309
|
+
a full rebuild. Distinct from the `memory_v3_maintain_last_run` cadence key
|
|
310
|
+
despite the shared prefix
|
|
311
|
+
- v1: `graph_maintenance:{decay,consolidate,pattern_scan,narrative}:last_run`,
|
|
312
|
+
`pkb_filing_last_run`, `pkb_compaction_last_run`,
|
|
313
|
+
`graph_bootstrap:*`, `memory:backfill:*`
|
|
314
|
+
- `retro_sweep:last_run` — retrospective sweep cadence
|
|
315
|
+
|
|
316
|
+
### On-disk / vector-store names
|
|
317
|
+
|
|
318
|
+
| Name | Where | Why frozen |
|
|
319
|
+
| ----------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
|
|
320
|
+
| `memory_v2_concept_pages` | `substrate/qdrant.ts` `MEMORY_V2_COLLECTION` | Qdrant collection on disk. **Duplicated** in `persistence/embeddings/embedding-identity.ts` — change neither. |
|
|
321
|
+
| `memory_v3_sections` | `v3/section-dense-store.ts` `SECTION_COLLECTION` | Qdrant collection on disk |
|
|
322
|
+
| `.memory-v2-reembed-required` | `substrate/qdrant.ts` | on-disk sentinel read across upgrades |
|
|
323
|
+
| `memory/.v2-state/` | `substrate/consolidation-job.ts`, `v2/migration.ts`, workspace migration 060 | persisted workspace path (consolidation lock, migration sentinel) |
|
|
324
|
+
|
|
325
|
+
### Wire-visible strings
|
|
326
|
+
|
|
327
|
+
| Name | Kind | Why frozen |
|
|
328
|
+
| --------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------------- |
|
|
329
|
+
| `memory_v2_consolidation` | `conversations.source` value | persisted on every consolidation run |
|
|
330
|
+
| `memory_retrospective` | request origin / `TitleOrigin` member | the permission checker's skill-authoring auto-grant is scoped to it |
|
|
331
|
+
| `skill-authored-card` | message kind | persisted on skill-card messages |
|
|
332
|
+
| `memoryV2Consolidation`, `memoryRetrospective` | LLM call-site ids | logging/attribution buckets |
|
|
333
|
+
| `memoryInjectedBlock`, `memoryV2StaticBlock`, `memoryV3InjectedBlock`, `memoryV3Commit` | message-metadata keys | persisted on messages; drives re-injection and the strip |
|
|
334
|
+
| `memory-v2-static` | injector + block id | `daemon/conversation-runtime-assembly.ts` matches on it |
|
|
335
|
+
| `MEMORY_V2_DISABLED` | error code | clients branch on it |
|
|
336
|
+
| `memory.v2.sweep` | notification job identifier | surfaced in `activity.failed` |
|
|
337
|
+
|
|
338
|
+
### HTTP surface
|
|
339
|
+
|
|
340
|
+
Operation ids and endpoints are published in `assistant/openapi.yaml` and
|
|
341
|
+
consumed by generated clients:
|
|
342
|
+
|
|
343
|
+
- `memory-items`, `memory-items/:id` (`listMemoryItems`, `getMemoryItem`,
|
|
344
|
+
`createMemoryItem`, `updateMemoryItem`, `deleteMemoryItem`)
|
|
345
|
+
- `memory-nodes`, `memory-nodes/delete`, `memory-nodes/update`
|
|
346
|
+
(`listMemoryNodes`, `deleteMemoryNode`, `updateMemoryNode`)
|
|
347
|
+
- `memory/remember` (`createMemory`), `memory/stats` (`getMemoryStats`)
|
|
348
|
+
- `memory-graph`, `memory-graph-node` (`getMemoryGraph`, `getMemoryGraphNode`)
|
|
349
|
+
- `memory/v2/*` — `backfill`, `compare-retrievers`, `concept-frequency`,
|
|
350
|
+
`concept-page`, `ema-scores`, `list-concept-pages`, `now-text`,
|
|
351
|
+
`reembed-skills`, `router-prompt-template`, `simulate-router`, `validate`
|
|
352
|
+
(operation ids `memory_v2_*`)
|
|
353
|
+
- `memory/v3/*` — `backfill-sections`, `rebuild-index`
|
|
354
|
+
- `memory/worker/*`, `memory/eval/*`
|
|
355
|
+
- `consolidation/config`, `consolidation/run-now`, `consolidation/runs`
|
|
356
|
+
- `filing/config`, `filing/run-now` (v1)
|
|
357
|
+
|
|
358
|
+
### Telemetry
|
|
359
|
+
|
|
360
|
+
| Name | Kind | Consumer |
|
|
361
|
+
| ----------------------------------------------------------------------------- | -------------------- | ------------------- |
|
|
362
|
+
| `memory.enabled`, `memory.v2.enabled`, `memory.v3.live` | config-setting keys | platform dashboards |
|
|
363
|
+
| `memory_tier` check_name + `detail.tier` ∈ `off`/`v1`/`v2`/`v3` | watchdog event | platform dashboards |
|
|
364
|
+
| `memory_v3_injection_gate`, `memory_v3_selection`, `memory_retrospective_run` | watchdog check names | platform dashboards |
|
|
365
|
+
|
|
366
|
+
Renaming any of these silently breaks a dashboard rather than failing a build —
|
|
367
|
+
coordinate with the platform before touching them. The `memory_tier` contract
|
|
368
|
+
(check name plus the exact `off`/`v1`/`v2`/`v3` bucket strings) is specified in
|
|
369
|
+
`src/telemetry/AGENTS.md` — that is the authoritative statement; do not restate
|
|
370
|
+
its rules here.
|
|
371
|
+
|
|
372
|
+
### Log component names
|
|
373
|
+
|
|
374
|
+
`getLogger("<scope>")` tags every line the module emits with that scope, so a
|
|
375
|
+
scope name is **observable**: saved log queries, `vellum logs` filters, and
|
|
376
|
+
support runbooks grep on it. Renaming one does not fail a build and does not
|
|
377
|
+
lose data — it silently empties whatever was filtering on the old name. Not
|
|
378
|
+
frozen the way a table or a wire string is, but rename deliberately and expect
|
|
379
|
+
to update queries.
|
|
380
|
+
|
|
381
|
+
Two scopes changed in the tier split and are called out here so a stale query
|
|
382
|
+
is diagnosable:
|
|
383
|
+
|
|
384
|
+
| Module | Scope now | Was |
|
|
385
|
+
| ---------------------------- | ------------------- | ----------------------------------------------------- |
|
|
386
|
+
| `substrate/boot-maintenance` | `boot-maintenance` | `memory-v2-startup` |
|
|
387
|
+
| `substrate/reembed-job` | `memory-v2-reembed` | `memory-v2-backfill` (shared with `v2/backfill-jobs`) |
|
|
388
|
+
|
|
389
|
+
The reembed job was extracted out of `v2/backfill-jobs.ts`, so its lines moved
|
|
390
|
+
from the shared `memory-v2-backfill` scope to a dedicated one; the surviving
|
|
391
|
+
`memory_v2_migrate` / `memory_v2_activation_recompute` jobs still log under
|
|
392
|
+
`memory-v2-backfill`. Note that most substrate scopes keep their `memory-v2-*`
|
|
393
|
+
spelling (`memory-v2-qdrant`, `memory-v2-page-index`, `memory-v2-consolidate`,
|
|
394
|
+
`memory-v2-sweep`, …) — same rule as the frozen names above: the `v2` spelling
|
|
395
|
+
does not make them the v2 engine's, and they must not be renamed
|
|
396
|
+
opportunistically with it.
|
|
397
|
+
|
|
398
|
+
## Deletion runbook: v1
|
|
399
|
+
|
|
400
|
+
### Prerequisites that BLOCK deletion
|
|
401
|
+
|
|
402
|
+
Do not start until both are resolved. Each is a live all-tier dependency on
|
|
403
|
+
v1-era machinery.
|
|
404
|
+
|
|
405
|
+
1. **The graph node surface is all-tier.** `graph/store.ts`,
|
|
406
|
+
`graph/capability-seed.ts`, and `graph/tool-handlers.ts` write and read
|
|
407
|
+
`memory_graph_nodes` on **every** tier. The `handleListMemory` /
|
|
408
|
+
`handleDeleteMemory` / `handleUpdateMemory` handlers are gated on
|
|
409
|
+
`usesConceptPageMemory()` yet operate on that v1-era store — so the node
|
|
410
|
+
surface (and the `memory-nodes` routes and `memory items` CLI over it) must
|
|
411
|
+
be ported to the substrate or retired **before** v1 can go. Deleting `v1/`
|
|
412
|
+
does not remove these tables.
|
|
413
|
+
2. **`graph/conversation-graph-memory.ts` owns all-tier duties.** Beyond the
|
|
414
|
+
v1↔v2 dispatch it does compaction eviction of v2 activation rows and v3
|
|
415
|
+
`everInjected` state (`onCompacted`), and it defines the injected-block strip
|
|
416
|
+
identity that `daemon/conversation-runtime-assembly.ts` matches on. Those
|
|
417
|
+
move to a tier-neutral home first.
|
|
418
|
+
|
|
419
|
+
### External consumers to repoint or retire
|
|
420
|
+
|
|
421
|
+
The steps below cover the plugin's own spine. These three production files sit
|
|
422
|
+
**outside** `MEM/` and import `v1/` directly, so a deletion that skips them
|
|
423
|
+
leaves broken imports and an unbuildable tree. Handle them in the same change,
|
|
424
|
+
before or alongside step 1.
|
|
425
|
+
|
|
426
|
+
1. **`runtime/routes/global-search-routes.ts`** → `semanticSearch` from
|
|
427
|
+
`v1/semantic-search.ts`. **Retire the route arm.** It backs only
|
|
428
|
+
`searchMemoriesSemantic`, the `deep=true` half of the `memories` category,
|
|
429
|
+
and `semanticSearch` already returns `[]` on any concept-page assistant (its
|
|
430
|
+
own `usesConceptPageMemory` early return), so the arm is dead on every
|
|
431
|
+
non-v1 install. Delete `searchMemoriesSemantic` and its `deep` call site.
|
|
432
|
+
Do **not** repoint it at the substrate: the sibling `searchMemoryItems` is a
|
|
433
|
+
lexical scan of `memory_graph_nodes` — all-tier, and it keeps the category
|
|
434
|
+
answering — while surfacing concept pages here is a new feature over a
|
|
435
|
+
different id space (page slugs, not node ids) and belongs in its own change.
|
|
436
|
+
Both the `deep` query parameter and the response `source` enum
|
|
437
|
+
(`lexical` | `semantic`) are published in `assistant/openapi.yaml`: `deep`
|
|
438
|
+
becomes a no-op and `semantic` an unreachable variant, and narrowing either
|
|
439
|
+
is a separate, client-coordinated spec change.
|
|
440
|
+
2. **`tools/filesystem/write.ts`** → `enqueuePkbIndexJob` from
|
|
441
|
+
`v1/jobs/embed-pkb-file.ts`. **Delete the call site.** It fire-and-forgets a
|
|
442
|
+
PKB re-index after a `file_write` under `workspace/pkb/**.md`, and
|
|
443
|
+
`enqueuePkbIndexJob` already returns `""` when `usesConceptPageMemory()`
|
|
444
|
+
holds — the call is inert under the substrate. Drop the whole `pkbRoot` /
|
|
445
|
+
`isInsidePkbRoot` try block; keep the local `isInsidePkbRoot` helper, which
|
|
446
|
+
the apps-dir containment check earlier in the file still uses. There is no
|
|
447
|
+
substrate equivalent to repoint to — concept pages are re-embedded by
|
|
448
|
+
`jobs/embed-concept-page.ts` off the page-write path.
|
|
449
|
+
3. **`persistence/steps.ts`** → `migrateToolCreatedItems` from
|
|
450
|
+
`v1/graph/bootstrap.ts`. **MOVE THIS FUNCTION — DO NOT DELETE IT.** It is a
|
|
451
|
+
registered entry in the append-only migration list (slot "101b", between
|
|
452
|
+
`migrateMemoryGraphImageRefs` and `migrateDropMemoryItemsTables`) that
|
|
453
|
+
copies legacy `memory_items` rows into `memory_graph_nodes` — an all-tier
|
|
454
|
+
table that outlives v1. Every fresh install replays the whole chain, so
|
|
455
|
+
deleting the function strands those rows on upgrade paths and defeats
|
|
456
|
+
`migrateDropMemoryItemsTables`'s "already migrated" safety check. Three
|
|
457
|
+
things to preserve when moving it:
|
|
458
|
+
- **The exported name.** Bare-function steps are identified by
|
|
459
|
+
`Function.name` for checkpointing, and `migrateMoveMemoryGraphTablesToMemoryDb`
|
|
460
|
+
names the string `"migrateToolCreatedItems"` in its `dependsOn`. Renaming
|
|
461
|
+
it re-runs the migration on existing installs and breaks that dependency
|
|
462
|
+
edge.
|
|
463
|
+
- **Its position** in the ordered `steps.ts` list — it must still run before
|
|
464
|
+
`migrateDropMemoryItemsTables`.
|
|
465
|
+
- **The persistence-layering guard's exemption.**
|
|
466
|
+
`assistant/src/__tests__/persistence-layering-guard.test.ts` maps
|
|
467
|
+
`assistant/src/persistence/steps.ts` → `{"v1/graph/bootstrap"}` in
|
|
468
|
+
**`MIGRATION_REGISTRY_MEMORY_IMPORTS`** — NOT in
|
|
469
|
+
`PERSISTENCE_TO_MEMORY_ALLOWLIST`, which holds only
|
|
470
|
+
`persistence/conversation-crud.ts`. Editing the wrong map leaves the
|
|
471
|
+
exemption in place and fails the guard. The exemption itself is permanent
|
|
472
|
+
(a migration registry referencing the domain that owns each step is the
|
|
473
|
+
registry's job); what moves is the pointer. Repoint the entry at the new
|
|
474
|
+
module, or drop it only if the function lands inside `persistence/`; the
|
|
475
|
+
guard's stale-entry test fails on a left-behind exemption either way.
|
|
476
|
+
|
|
477
|
+
The function reads and writes only `memory_items`, `memory_graph_nodes`, and
|
|
478
|
+
its own memory checkpoint, so `persistence/migrations/` or the all-tier
|
|
479
|
+
`graph/` are both viable homes. `bootstrap.ts`'s other exports
|
|
480
|
+
(`bootstrapFromHistory`, `maybeEnqueueGraphBootstrap`) are genuinely v1 and
|
|
481
|
+
go with the tier.
|
|
482
|
+
|
|
483
|
+
**Re-run the scan at deletion time** rather than trusting this list — consumers
|
|
484
|
+
accrue:
|
|
485
|
+
`grep -rnE '(from|import\() *"[^"]*v1/' assistant/src --include='*.ts' --include='*.tsx' --exclude-dir=__tests__ --exclude-dir=v1 | grep -v '\.test\.'`
|
|
486
|
+
(spine hits are the composition points the steps below already cover; anything
|
|
487
|
+
else is a new external consumer needing its own repoint-or-retire decision).
|
|
488
|
+
|
|
489
|
+
**Then re-run it WITHOUT the test exclusions** — drop `--exclude-dir=__tests__`
|
|
490
|
+
and the `grep -v '\.test\.'`. Test files import `v1/` too, and not all of them
|
|
491
|
+
are v1 tier tests that die with the tier; the non-tier ones get **repointed,
|
|
492
|
+
not deleted**. Today the test-only hits are:
|
|
493
|
+
|
|
494
|
+
- v1 tier tests, deleted with the tier: `src/__tests__/pkb-autoinject.test.ts`,
|
|
495
|
+
`injection-block.test.ts`, `graph-extraction-event-date.test.ts`,
|
|
496
|
+
`memory-identity-context-parity.test.ts`,
|
|
497
|
+
`rebuild-index-graph-nodes.test.ts`, and
|
|
498
|
+
`injector-pkb-v2-silenced.test.ts` (its subject is the v1 PKB pair being
|
|
499
|
+
silenced under the substrate — keep its one tier-agnostic `now-md` case by
|
|
500
|
+
moving it, rather than losing the coverage).
|
|
501
|
+
- **not** v1 tests — repoint: `src/__tests__/injector-chain.test.ts` and
|
|
502
|
+
`src/__tests__/conversation-runtime-assembly.test.ts` both pull `getPkbRoot`
|
|
503
|
+
from `v1/pkb/types.js` purely to place a temp workspace; they cover the
|
|
504
|
+
injector chain and runtime assembly on every tier.
|
|
505
|
+
- a false positive: `MEM/__tests__/memory-tier-boundary-guard.test.ts` matches
|
|
506
|
+
on `"./v1/a.js"`-style string literals in its own parser tests.
|
|
507
|
+
|
|
508
|
+
### Steps
|
|
509
|
+
|
|
510
|
+
1. Delete `MEM/v1/**` (including `v1/README.md` and `v1/graph/graph-search.ts`,
|
|
511
|
+
the hybrid node-SEARCH half) — **after** `migrateToolCreatedItems` has been
|
|
512
|
+
moved out of `v1/graph/bootstrap.ts` per the external-consumers section
|
|
513
|
+
above. `graph/graph-search.ts` is the all-tier embedding plumbing and
|
|
514
|
+
**stays**.
|
|
515
|
+
2. Delete `runtime/routes/filing-routes.ts` and drop its `ROUTES` entry from
|
|
516
|
+
`runtime/routes/index.ts`.
|
|
517
|
+
3. Retire the `memory-items` route family (`MEM/src/memory-item-routes.ts`'s
|
|
518
|
+
item half) and `cli/commands/memory/items.ts`. Re-verify callers at deletion
|
|
519
|
+
time with `grep -rl 'memory-items' --exclude-dir=node_modules .` — today the
|
|
520
|
+
only hits outside the assistant are the generated `assistant/openapi.yaml`
|
|
521
|
+
and one web test (`clients/web/src/lib/api-interceptors.test.ts`); there are
|
|
522
|
+
no hand-written web callers.
|
|
523
|
+
4. Remove the v1 arm of `graph/conversation-graph-memory.ts` (its
|
|
524
|
+
`../v1/graph/injection.js` and `../v1/graph/retriever.js` imports and the
|
|
525
|
+
branches they feed).
|
|
526
|
+
5. Remove the v1 branch of `context-search/sources/memory.ts` — it is the file's
|
|
527
|
+
only non-substrate path (`searchGraphNodes` from `v1/graph/graph-search.ts`),
|
|
528
|
+
so the source collapses to its `usesConceptPageMemory` early return.
|
|
529
|
+
6. Delete the v1 sections of the spine files. Every one is banner-marked, so
|
|
530
|
+
`grep -rn 'delete with v1' src/plugins/defaults/memory/` is the authoritative
|
|
531
|
+
list — it covers `startup.ts`'s `---- v1 (legacy engine) ----` section labels
|
|
532
|
+
(which spell out the banner phrase for exactly this reason) and the dispatch
|
|
533
|
+
call sites, not only the function bodies:
|
|
534
|
+
`startup.ts` (**three** blocks — the v1 Qdrant ensure and the PKB reconcile,
|
|
535
|
+
both covered by step 8, and the graph-bootstrap tail),
|
|
536
|
+
`jobs-worker.ts` (`enqueueV1MaintenanceJobs` **and** the `else` arm
|
|
537
|
+
that calls it), `job-handlers.ts`, `indexer.ts` (`enqueueV1IndexTriggers`
|
|
538
|
+
**and** its call site), `injectors.ts` (the PKB injector pair). The same grep
|
|
539
|
+
also returns `graph/conversation-graph-memory.ts` and
|
|
540
|
+
`context-search/sources/memory.ts` — steps 4 and 5 above.
|
|
541
|
+
7. Delete `V1_QDRANT_JOB_TYPES` and the `SweepPostponedOffV1Error` postpone
|
|
542
|
+
path in `jobs-worker.ts`, plus the v1 job handlers
|
|
543
|
+
(`v1/job-handlers/{backfill,embedding,index-maintenance}.ts`) and their
|
|
544
|
+
`job-handlers.ts` registrations. Move retired job types into
|
|
545
|
+
`LEGACY_JOB_TYPES`; do NOT remove them from `MemoryJobType`.
|
|
546
|
+
8. Delete the v1 Qdrant collection lifecycle in `startup.ts` (the
|
|
547
|
+
`config.memory.qdrant.collection` `ensureCollection` block and the PKB index
|
|
548
|
+
reconcile). Both are gated on `!usesConceptPageMemory(config.memory)`, **not
|
|
549
|
+
on `isMemoryV1Active`** — and `runMemoryStartup` has no memory-enabled guard
|
|
550
|
+
of its own, so today they run on `memory.enabled: false` assistants too.
|
|
551
|
+
Delete them outright rather than assuming step 9 already reaches them. Leave
|
|
552
|
+
the lexical-messages collection alone — it is independent.
|
|
553
|
+
9. Collapse `isMemoryV1Active` call sites, then delete the predicate. Sweep for
|
|
554
|
+
`!usesConceptPageMemory(...)` separately: it is the actual v1 gate in
|
|
555
|
+
`startup.ts`, `jobs-worker.ts`, `indexer.ts`, and
|
|
556
|
+
`context-search/sources/memory.ts`, and those arms collapse the other way
|
|
557
|
+
(the substrate branch becomes unconditional).
|
|
558
|
+
10. Repoint or delete the tests pinned to v1 — the test-inclusive re-scan above
|
|
559
|
+
lists the ones the import scan finds. One more it cannot find:
|
|
560
|
+
`src/__tests__/memory-jobs-worker-lanes.test.ts` sets
|
|
561
|
+
`memory.v2.enabled: false` so v1 is the live tier and its slow-lane job
|
|
562
|
+
(`graph_consolidate`) genuinely runs instead of no-opping under the
|
|
563
|
+
substrate. Repoint it at a surviving slow-lane job type — the lane
|
|
564
|
+
independence it covers is tier-agnostic and worth keeping.
|
|
565
|
+
11. `memoryTier()`'s `"v1"` bucket becomes unreachable. **Coordinate with the
|
|
566
|
+
platform telemetry dashboard before removing the bucket** — see
|
|
567
|
+
`src/telemetry/AGENTS.md` for the `memory_tier` contract.
|
|
568
|
+
12. Shrink the boundary guard: drop `v1` from `TIER_DIRS` /
|
|
569
|
+
`FORBIDDEN_TIER_IMPORTS`, and drop any `SPINE_ALLOWLIST` entry whose second
|
|
570
|
+
tier was v1 (the reverse stale-exemption test will name them for you).
|
|
571
|
+
|
|
572
|
+
## Deletion runbook: v2
|
|
573
|
+
|
|
574
|
+
**Read this first:** the frozen substrate names merely SPELLED "v2" — the
|
|
575
|
+
`memory_v2_concept_pages` collection, the `memory_v2_consolidate` /
|
|
576
|
+
`memory_v2_sweep` / `memory_v2_reembed` job types, the `memory_v2_consolidation`
|
|
577
|
+
conversation source, the `memoryV2Consolidation` call-site id, the
|
|
578
|
+
`memory/.v2-state/` path, the `.memory-v2-reembed-required` sentinel, the
|
|
579
|
+
`memory-v2-static` injector id, and `memoryV2StaticBlock` — belong to the
|
|
580
|
+
**substrate**, which outlives the v2 engine. They survive this deletion and must
|
|
581
|
+
not be renamed opportunistically.
|
|
582
|
+
|
|
583
|
+
### External consumers to repoint or retire
|
|
584
|
+
|
|
585
|
+
Eight production files import `v2/` today. Three are composition points the
|
|
586
|
+
steps below already name (`graph/conversation-graph-memory.ts`,
|
|
587
|
+
`job-handlers.ts`, `MEM/src/memory-v2-routes.ts`); the remaining **five** are
|
|
588
|
+
itemized here, and **four of the five sit outside the plugin entirely**.
|
|
589
|
+
Deleting the tier without handling them cannot produce a buildable tree.
|
|
590
|
+
|
|
591
|
+
1. **`MEM/fork-conversation-memory.ts`** (spine, on the `SPINE_ALLOWLIST`) →
|
|
592
|
+
`forkActivationState` / `seedForkActivationState` from
|
|
593
|
+
`v2/activation-store.ts`. Remove the v2 arm; the module survives as a
|
|
594
|
+
substrate + v3 fork path (injected-block slugs, `v3/ever-injected-store`,
|
|
595
|
+
graph state, retrospective state). It stays on the `SPINE_ALLOWLIST` after
|
|
596
|
+
the cut — `substrate` is itself a tier directory in the guard's `TIER_DIRS`,
|
|
597
|
+
so substrate + v3 is still multi-tier and step 10 must **not** drop this
|
|
598
|
+
entry.
|
|
599
|
+
2. **`runtime/routes/conversation-query-routes.ts`** →
|
|
600
|
+
`getMemoryV2ActivationLogByMessageIds` from `v2/activation-log-store.ts`.
|
|
601
|
+
This is the route end of the inspector chain below: it fills the
|
|
602
|
+
`memoryV2Activation` field of the LLM-context response. It is **deleted**
|
|
603
|
+
with that surface, not replaced — the tier-agnostic
|
|
604
|
+
`getMemoryRecallLogByMessageIds` and the v3
|
|
605
|
+
`getMemoryV3SelectionForInspectorByMessageIds` reads alongside it stay.
|
|
606
|
+
3. **`daemon/conversation-agent-loop-handlers.ts`** →
|
|
607
|
+
`backfillMemoryV2ActivationMessageId` from `v2/activation-log-store.ts`. The
|
|
608
|
+
turn-end stamp that keys the activation row to the assistant `messageId` so
|
|
609
|
+
the inspector can find it. **Delete the try block**; no replacement is
|
|
610
|
+
needed, because with the engine gone nothing writes the log in the first
|
|
611
|
+
place (`v2/injection.ts`'s `recordMemoryV2ActivationLog` call dies with
|
|
612
|
+
step 1). Its two siblings — the memory-recall-log and v3-selection backfills
|
|
613
|
+
— are unaffected.
|
|
614
|
+
4. **`cli/commands/memory/memory-v2.ts`** → `import type { ComparisonReport }`
|
|
615
|
+
from `v2/harness/runner.ts`. Type-only, and it feeds `memory v2 compare`,
|
|
616
|
+
which step 1 already retires with the engine. Drop the import together with
|
|
617
|
+
the subcommand and its `memory-v2-compare-render.js` imports; the surviving
|
|
618
|
+
`reembed` / `reembed-skills` / `validate` subcommands never touch
|
|
619
|
+
`harness/`.
|
|
620
|
+
5. **`cli/commands/memory/memory-v2-compare-render.ts`** → the same
|
|
621
|
+
`import type { ComparisonReport }`. The renderer for `memory v2 compare`;
|
|
622
|
+
deleted whole in step 1, so it needs no separate decision — it is listed
|
|
623
|
+
only so the scan below reconciles against a complete list.
|
|
624
|
+
|
|
625
|
+
**The activation-log chain, end to end.** Retiring `memory_v2_activation_logs`
|
|
626
|
+
spans five layers, split across this section and steps 7–8. Land them together
|
|
627
|
+
or the tree and the published spec go out of sync:
|
|
628
|
+
|
|
629
|
+
- **writer** — `v2/injection.ts`'s `recordMemoryV2ActivationLog`, deleted with
|
|
630
|
+
`MEM/v2/**` (step 1), plus the daemon's turn-end `messageId` backfill
|
|
631
|
+
(item 3 above);
|
|
632
|
+
- **route** — `conversation-query-routes.ts`'s read (item 2 above);
|
|
633
|
+
- **wire contract** — `assistant/src/api/responses/memory-v2-activation-log.ts`
|
|
634
|
+
(`MemoryV2ActivationLogSchema`, re-exported from `src/api/index.ts` and so
|
|
635
|
+
published through `@vellumai/assistant-api`), embedded in
|
|
636
|
+
`api/responses/llm-context-response.ts`. `memoryV2Activation` is a
|
|
637
|
+
**required** property on both LLM-context responses in
|
|
638
|
+
`assistant/openapi.yaml`, so removing it regenerates the spec and the
|
|
639
|
+
generated client types — coordinate it with the web change;
|
|
640
|
+
- **web consumer** — the inspector's `memoryV2Activation` surface (step 8);
|
|
641
|
+
- **table** — the `memory_v2_activation_logs` drop (step 7).
|
|
642
|
+
|
|
643
|
+
**Re-run the scan at deletion time** rather than trusting this list — consumers
|
|
644
|
+
accrue:
|
|
645
|
+
`grep -rnE '(from|import\() *"[^"]*v2/' assistant/src --include='*.ts' --include='*.tsx' --exclude-dir=__tests__ --exclude-dir=v2 | grep -v '\.test\.'`
|
|
646
|
+
(hits inside `MEM/` are the composition points the steps below cover; anything
|
|
647
|
+
else is a new external consumer needing its own repoint-or-retire decision).
|
|
648
|
+
|
|
649
|
+
**Then re-run it WITHOUT the test exclusions** — drop `--exclude-dir=__tests__`
|
|
650
|
+
and the `grep -v '\.test\.'`. Test files import `v2/` too, and not all of them
|
|
651
|
+
are v2 tier tests that die with the tier; the non-tier ones get **repointed,
|
|
652
|
+
not deleted**. Today the test-only hits are:
|
|
653
|
+
|
|
654
|
+
- v2 tier tests and fixtures, deleted with the tier:
|
|
655
|
+
`MEM/__tests__/memory-v2-activation-log-store.test.ts`,
|
|
656
|
+
`MEM/__tests__/memory-v2-concept-frequency.test.ts`,
|
|
657
|
+
`MEM/__tests__/fixtures/memory-v2-activation-fixtures.ts` (a fixture module,
|
|
658
|
+
not a `.test.` file — the `grep -v '\.test\.'` misses it either way),
|
|
659
|
+
`MEM/graph/__tests__/conversation-graph-memory-v2-routing.test.ts` (the v2
|
|
660
|
+
half of the dispatch spine), and
|
|
661
|
+
`cli/commands/memory/__tests__/memory-v2-compare-render.test.ts`.
|
|
662
|
+
- **not** v2 tests — repoint by dropping their v2 arms:
|
|
663
|
+
`src/__tests__/injector-v3-suppression.test.ts` (pulls `INJECTION_HEADER`
|
|
664
|
+
from `v2/injection.js` to assert the v3 suppression),
|
|
665
|
+
`src/__tests__/conversation-fork-crud.test.ts` (pulls `hydrate` from
|
|
666
|
+
`v2/activation-store.js` while covering all-tier fork behavior),
|
|
667
|
+
`MEM/__tests__/memory-log-stores-degraded.test.ts` (degraded-mode coverage
|
|
668
|
+
spanning the recall log, the v2 activation log, and v3 stores), and
|
|
669
|
+
`runtime/routes/__tests__/conversation-query-routes.test.ts` (the route test
|
|
670
|
+
whose sibling recall-log and v3-selection assertions stay).
|
|
671
|
+
- a false positive: `MEM/__tests__/memory-tier-boundary-guard.test.ts` matches
|
|
672
|
+
on `"./v2/a.js"`-style string literals in its own parser tests.
|
|
673
|
+
|
|
674
|
+
### Steps
|
|
675
|
+
|
|
676
|
+
1. Delete `MEM/v2/**` and `cli/commands/memory/memory-v2-compare-render.ts`.
|
|
677
|
+
Two modules **split** rather than delete:
|
|
678
|
+
- `MEM/src/memory-v2-routes.ts` — the only multi-tier route module. Four of
|
|
679
|
+
its handlers read the substrate and must survive —
|
|
680
|
+
`memory/v2/concept-page`, `memory/v2/list-concept-pages`,
|
|
681
|
+
`memory/v2/reembed-skills`, `memory/v2/validate` — so move them (endpoint
|
|
682
|
+
strings, operation ids, and the `MEMORY_V2_DISABLED` code unchanged; they
|
|
683
|
+
are frozen wire surface) into a substrate-owned routes module.
|
|
684
|
+
`memory/v2/backfill` (operation id `memory_v2_backfill`) splits **by
|
|
685
|
+
operation** rather than dying whole: `MemoryV2BackfillParams`'s `op` enum
|
|
686
|
+
accepts three values, and `OP_TO_JOB_TYPE` sends `migrate` →
|
|
687
|
+
`memory_v2_migrate` and `activation-recompute` →
|
|
688
|
+
`memory_v2_activation_recompute` (both v2-engine jobs, retired in step 9)
|
|
689
|
+
but `reembed` → `memory_v2_reembed`, a **substrate** job whose handler
|
|
690
|
+
lives at `substrate/reembed-job.ts` and survives this deletion. Carry the
|
|
691
|
+
`reembed` arm across with its frozen operation id and endpoint intact —
|
|
692
|
+
narrow the `op` enum to `["reembed"]` and move the route with the other
|
|
693
|
+
survivors — or land a compatibility-preserving replacement first. Deleting
|
|
694
|
+
the route wholesale removes the only on-demand concept-page reembed
|
|
695
|
+
command an operator has; every other enqueue of that job is automatic
|
|
696
|
+
(consolidation follow-ups, boot maintenance, the embedding reconciler,
|
|
697
|
+
workspace migrations). Delete the remaining engine-only routes:
|
|
698
|
+
`compare-retrievers`, `concept-frequency`, `ema-scores`, `now-text`,
|
|
699
|
+
`router-prompt-template`, `simulate-router`. Publishing substrate-named
|
|
700
|
+
aliases and retiring the `memory/v2/*` spellings is a separate,
|
|
701
|
+
client-coordinated change.
|
|
702
|
+
- `cli/commands/memory/memory-v2.ts` — follows its routes rather than being
|
|
703
|
+
deleted outright. `memory v2 reembed` (which posts the surviving `reembed`
|
|
704
|
+
backfill op), `memory v2 reembed-skills`, and `memory v2 validate` keep
|
|
705
|
+
working and move with the substrate routes; `memory v2 activation` (the
|
|
706
|
+
`activation-recompute` op), `memory v2 ema`, `memory v2 simulate`, and
|
|
707
|
+
`memory v2 compare` go with the engine. There is no `migrate` subcommand —
|
|
708
|
+
the route is that job's only enqueue path.
|
|
709
|
+
2. Remove the v2 arm of `graph/conversation-graph-memory.ts` (activation-store,
|
|
710
|
+
injection, now-text, router-pair imports) and the
|
|
711
|
+
`shouldRunLegacyMemoryRetrieval` path in `hooks/user-prompt-submit.ts`.
|
|
712
|
+
3. Remove the v2-suppression strip in `daemon/conversation-runtime-assembly.ts`
|
|
713
|
+
(`suppressV2MemoryForV3`, the `memory-v2-static` capture, and the
|
|
714
|
+
`memoryV2StaticBlock` plumbing) — with no v2 engine there is nothing to
|
|
715
|
+
suppress, but the static `<info>` injector itself stays.
|
|
716
|
+
4. Delete the v2 sections of `job-handlers.ts` marked
|
|
717
|
+
`// V2 ENGINE — delete with v2`.
|
|
718
|
+
`context-search/sources/memory-v2.ts` is misnamed, not v2-owned — it reads
|
|
719
|
+
only `substrate/` and survives; rename it (the filename is not a frozen
|
|
720
|
+
name) rather than deleting it.
|
|
721
|
+
5. Collapse `usesConceptPageMemory()` to `isMemoryEnabled()` and delete
|
|
722
|
+
`isV2InjectionEngineActive`. For `isMemoryV2ExplicitlyDisabled`, decide what
|
|
723
|
+
`daemon/embedding-reconcile.ts`'s explicit-opt-out branch should mean once
|
|
724
|
+
`memory.v2.enabled` no longer exists — either drop the branch or re-express
|
|
725
|
+
it against `memory.enabled`.
|
|
726
|
+
6. Drop the `memory.v2` schema subtree and the `orV2` fallback in
|
|
727
|
+
`substrate/tuning.ts`, giving `memory.substrate` **real defaults** (the
|
|
728
|
+
values currently in `config/schemas/memory-v2.ts`). Migration 135 copied
|
|
729
|
+
user overrides, but it deliberately skips values equal to a shipped default
|
|
730
|
+
— including `bm25_b: 0.75`, the pre-migration-075 default. On a workspace
|
|
731
|
+
still persisting `0.75`, that value reaches the runtime **only** through the
|
|
732
|
+
`orV2` fallback, so dropping the fallback silently retunes it to `0.4`.
|
|
733
|
+
**Land a sweep migration first**: for every substrate tunable, copy the
|
|
734
|
+
resolved effective value into `memory.substrate` wherever it is absent there
|
|
735
|
+
and present under `memory.v2`, this time regardless of whether it matches a
|
|
736
|
+
shipped default. Only then remove the fallback. Fold the parent
|
|
737
|
+
`MemoryConfigSchema.superRefine`'s mixed-case weight check back into the
|
|
738
|
+
substrate schema's own refinement.
|
|
739
|
+
7. Drop tables `memory_v2_activation_logs`, `memory_v2_injection_events`, and
|
|
740
|
+
`activation_state` via a normal `persistence/migrations/` step (append-only —
|
|
741
|
+
never edit an existing migration). Keep the `conversation-memory-purge.ts`
|
|
742
|
+
deletes in sync.
|
|
743
|
+
8. Web surfaces to retire or repoint:
|
|
744
|
+
- the inspector memory tab's `memoryV2Activation` context
|
|
745
|
+
(`clients/web/src/domains/chat/inspector/inspector-api.ts`,
|
|
746
|
+
`components/tabs/memory-tab.tsx`, `inspector-export.ts`) — this is the web
|
|
747
|
+
end of the activation-log chain spelled out in the external-consumers
|
|
748
|
+
section above; land it with the route, the daemon backfill, the
|
|
749
|
+
`api/responses/memory-v2-activation-log.ts` wire contract, and the step-7
|
|
750
|
+
table drop,
|
|
751
|
+
- the router playground (`memory-router-playground-page.tsx`,
|
|
752
|
+
`memory-router-simulator-api.ts`, and its `routes.tsx` entry),
|
|
753
|
+
- `concept-page-api.ts` and
|
|
754
|
+
`domains/intelligence/memory-v2/list-concept-pages.ts` — these call the
|
|
755
|
+
two substrate-reading routes that survive step 1, so they keep working
|
|
756
|
+
unchanged; only rename the modules/directory if you want to.
|
|
757
|
+
9. Move the retired v2-engine job types (`memory_v2_migrate`,
|
|
758
|
+
`memory_v2_activation_recompute`) into `LEGACY_JOB_TYPES`.
|
|
759
|
+
10. Shrink the boundary guard: drop `v2` from `TIER_DIRS` /
|
|
760
|
+
`FORBIDDEN_TIER_IMPORTS` and from `TIER_KEY_READ_ALLOWLIST`, and remove the
|
|
761
|
+
`SPINE_ALLOWLIST` entries that were v2 composition points — only those left
|
|
762
|
+
importing fewer than two tier directories. `fork-conversation-memory.ts`
|
|
763
|
+
still spans `substrate/` + `v3/` and stays; let the reverse
|
|
764
|
+
stale-exemption test tell you which entries actually went single-tier.
|
|
765
|
+
|
|
766
|
+
## Where to add new code
|
|
767
|
+
|
|
768
|
+
- New shared concept-page capability (retrieval, consolidation, page/edge
|
|
769
|
+
storage, capability seeding) → `substrate/`.
|
|
770
|
+
- New lane, scorer, or injector behavior for the live engine → `v3/`.
|
|
771
|
+
- Tier-agnostic capture (retrospective, sweep triggers) → the plugin root.
|
|
772
|
+
- Multi-tier wiring → an existing spine composition point on the
|
|
773
|
+
`SPINE_ALLOWLIST`; do not create a new one.
|
|
774
|
+
- **Never add to `v1/` or `v2/`.** Both are in retirement; a new feature there
|
|
775
|
+
is work that has to be deleted twice.
|