@vellumai/assistant 0.10.12 → 0.11.0-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +264 -14
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
- package/src/__tests__/app-conversation-ids.test.ts +204 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-group-tools.test.ts +279 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-lineage.test.ts +235 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/platform-callback-registration.test.ts +10 -10
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/resolve-app-id.test.ts +32 -0
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +26 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +587 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +482 -2
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/api/responses/subagent-detail.ts +13 -0
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/apps/app-store.ts +95 -4
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +178 -65
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/commands/webhooks.help.ts +9 -4
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
- package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/bundled-skills/schedule/SKILL.md +2 -0
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -38
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-lineage.ts +76 -0
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +8 -14
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +32 -16
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +1288 -439
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +298 -15
- package/src/permissions/checker.ts +102 -36
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +269 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/conversation-parent.ts +27 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +9 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/prompts/sections.ts +4 -16
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/subagents-routes.ts +35 -8
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/webhook-routes.ts +89 -30
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/apps/resolve-app-id.ts +15 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/conversation-groups/group_create.ts +63 -0
- package/src/tools/conversation-groups/group_list.ts +20 -0
- package/src/tools/conversation-groups/group_shared.ts +52 -0
- package/src/tools/conversation-groups/move_to_group.ts +106 -0
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/util/platform.ts +15 -0
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/tsconfig.plugin-api.json +1 -1
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `default-memory` plugin injectors — the personal-memory per-turn injections
|
|
2
|
+
* `default-memory` plugin injectors — the personal-memory per-turn injections,
|
|
3
|
+
* and the plugin's single injector entry point: {@link memoryInjectors} is the
|
|
4
|
+
* complete set `defaultMemoryPlugin` contributes, so the host registers memory
|
|
5
|
+
* injectors without reaching into a tier directory for one.
|
|
3
6
|
*
|
|
4
7
|
* Contributes the PKB `<knowledge_base>` block, the PKB `<system_reminder>`
|
|
5
|
-
* (with hybrid-search hints),
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
8
|
+
* (with hybrid-search hints), the memory-v2 static `<info>` block, and the two
|
|
9
|
+
* memory-v3 injectors defined in `v3/injector.ts`. Each reads its inputs
|
|
10
|
+
* directly off the {@link TurnContext} (and the workspace memory/PKB files),
|
|
11
|
+
* runs its own gating (injection mode, the personal-memory trust gate, the
|
|
12
|
+
* memory-tier gate, null-input short-circuits), and returns an
|
|
9
13
|
* {@link InjectionBlock} with the placement that yields the canonical
|
|
10
14
|
* positional semantics.
|
|
11
15
|
*
|
|
12
|
-
* `defaultMemoryPlugin` contributes
|
|
13
|
-
* `v3/injector.ts`) to the global injector registry
|
|
16
|
+
* `defaultMemoryPlugin` contributes the array to the global injector registry
|
|
14
17
|
* (`plugins/injector-registry.ts`), which unions every plugin's injectors and
|
|
15
18
|
* sorts by `order` into the single sequence `applyRuntimeInjections` walks each
|
|
16
19
|
* turn. The shared ordering contract lives in {@link DEFAULT_INJECTOR_ORDER}.
|
|
@@ -20,7 +23,7 @@ import { resolve } from "node:path";
|
|
|
20
23
|
|
|
21
24
|
import type { Message } from "@vellumai/plugin-api";
|
|
22
25
|
|
|
23
|
-
import {
|
|
26
|
+
import { isMemoryV1Active } from "../../../config/memory-v3-gate.js";
|
|
24
27
|
import type { InjectionMatcher } from "../../../context/strip-injections.js";
|
|
25
28
|
import { getInContextPkbPaths } from "../../../daemon/pkb-context-tracker.js";
|
|
26
29
|
import { buildPkbReminder } from "../../../daemon/pkb-reminder-builder.js";
|
|
@@ -37,11 +40,16 @@ import { getMemoryConfig } from "./config.js";
|
|
|
37
40
|
import { getLiveGraphMemory } from "./graph/conversation-graph-memory.js";
|
|
38
41
|
import { getLogger } from "./logging.js";
|
|
39
42
|
import { getSandboxWorkingDir } from "./paths.js";
|
|
40
|
-
|
|
41
|
-
import {
|
|
42
|
-
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
43
|
+
// SUBSTRATE (v2+v3) — feeds `memoryV2StaticInjector`.
|
|
44
|
+
import { readMemoryV2StaticContent } from "./substrate/static-context.js";
|
|
45
|
+
// V1 — delete with v1. Feeds the PKB injector pair.
|
|
46
|
+
import { getPkbAutoInjectList } from "./v1/pkb/autoinject.js";
|
|
47
|
+
import { readPkbContext } from "./v1/pkb/context.js";
|
|
48
|
+
import { searchPkbFiles } from "./v1/pkb/pkb-search.js";
|
|
49
|
+
import { getPkbRoot } from "./v1/pkb/types.js";
|
|
50
|
+
// V3 — delete with v3. Re-exported through `memoryInjectors` below so the
|
|
51
|
+
// host registers them without importing `v3/` itself.
|
|
52
|
+
import { memoryV3Injector, memoryV3SpotlightInjector } from "./v3/injector.js";
|
|
45
53
|
|
|
46
54
|
const pkbReminderLog = getLogger("pkb-reminder");
|
|
47
55
|
|
|
@@ -56,18 +64,18 @@ const PKB_HINT_THRESHOLD = 0.5;
|
|
|
56
64
|
const PKB_HINT_ARCHIVE_THRESHOLD = 0.7;
|
|
57
65
|
|
|
58
66
|
/**
|
|
59
|
-
* Read-side
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
+
* Read-side tier gate. The PKB injectors (`pkb-context`, `pkb-reminder`) are
|
|
68
|
+
* the v1 injection surface, active only when v1 is the live memory tier
|
|
69
|
+
* ({@link isMemoryV1Active}). Under concept-page memory both silence
|
|
70
|
+
* themselves entirely — the `<knowledge_base>` content and the generic
|
|
71
|
+
* recall/remember nudge are both supplanted by the static memory block. They
|
|
72
|
+
* are also silenced when memory is disabled outright: these injectors have no
|
|
73
|
+
* other `memory.enabled` gate, and a workspace with leftover `pkb/*` files
|
|
74
|
+
* must not keep surfacing long-term memory after the user turns memory off.
|
|
75
|
+
* NOW.md is workspace state independent of PKB and fires unchanged.
|
|
67
76
|
*/
|
|
68
77
|
function isPkbInjectionSilenced(): boolean {
|
|
69
|
-
|
|
70
|
-
return memory.enabled === false || usesConceptPageMemory(memory);
|
|
78
|
+
return !isMemoryV1Active({ memory: getMemoryConfig() });
|
|
71
79
|
}
|
|
72
80
|
|
|
73
81
|
/**
|
|
@@ -103,12 +111,19 @@ const pkbContextInjector: Injector = {
|
|
|
103
111
|
runMessages?: Message[],
|
|
104
112
|
): Promise<InjectionBlock | null> {
|
|
105
113
|
const mode = ctx.mode ?? "full";
|
|
106
|
-
if (mode !== "full")
|
|
107
|
-
|
|
114
|
+
if (mode !== "full") {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
if (isPkbInjectionSilenced()) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
108
120
|
const content = readGatedPkbContext(ctx.trust);
|
|
109
|
-
if (!content)
|
|
110
|
-
|
|
121
|
+
if (!content) {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
if (hasInjectedUserTextBlock(runMessages, KNOWLEDGE_BASE_BLOCK_PREFIXES)) {
|
|
111
125
|
return null;
|
|
126
|
+
}
|
|
112
127
|
return {
|
|
113
128
|
id: "pkb-context",
|
|
114
129
|
text: buildPkbContextBlock(content),
|
|
@@ -138,9 +153,15 @@ const pkbReminderInjector: Injector = {
|
|
|
138
153
|
runMessages?: Message[],
|
|
139
154
|
): Promise<InjectionBlock | null> {
|
|
140
155
|
const mode = ctx.mode ?? "full";
|
|
141
|
-
if (mode !== "full")
|
|
142
|
-
|
|
143
|
-
|
|
156
|
+
if (mode !== "full") {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
if (!isPkbActive(ctx.trust)) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
if (isPkbInjectionSilenced()) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
144
165
|
const reminder = await buildPkbReminderWithHints(ctx, runMessages);
|
|
145
166
|
return {
|
|
146
167
|
id: "pkb-reminder",
|
|
@@ -277,7 +298,9 @@ async function buildPkbReminderWithHints(
|
|
|
277
298
|
hints = results
|
|
278
299
|
.filter((r) => {
|
|
279
300
|
const abs = resolve(pkbRoot, r.path);
|
|
280
|
-
if (inContext.has(abs))
|
|
301
|
+
if (inContext.has(abs)) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
281
304
|
const threshold = r.path.replace(/\\/g, "/").startsWith("archive/")
|
|
282
305
|
? PKB_HINT_ARCHIVE_THRESHOLD
|
|
283
306
|
: PKB_HINT_THRESHOLD;
|
|
@@ -286,8 +309,12 @@ async function buildPkbReminderWithHints(
|
|
|
286
309
|
.sort((a, b) => {
|
|
287
310
|
const aHasHybrid = a.hybridScore !== undefined;
|
|
288
311
|
const bHasHybrid = b.hybridScore !== undefined;
|
|
289
|
-
if (aHasHybrid && !bHasHybrid)
|
|
290
|
-
|
|
312
|
+
if (aHasHybrid && !bHasHybrid) {
|
|
313
|
+
return -1;
|
|
314
|
+
}
|
|
315
|
+
if (!aHasHybrid && bHasHybrid) {
|
|
316
|
+
return 1;
|
|
317
|
+
}
|
|
291
318
|
if (aHasHybrid && bHasHybrid) {
|
|
292
319
|
return b.hybridScore! - a.hybridScore!;
|
|
293
320
|
}
|
|
@@ -344,16 +371,23 @@ const memoryV2StaticInjector: Injector = {
|
|
|
344
371
|
runMessages?: Message[],
|
|
345
372
|
): Promise<InjectionBlock | null> {
|
|
346
373
|
const mode = ctx.mode ?? "full";
|
|
347
|
-
if (mode !== "full")
|
|
374
|
+
if (mode !== "full") {
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
348
377
|
// The consolidation agent reads and rewrites memory/buffer.md through
|
|
349
378
|
// file tools; injecting the buffer section here would duplicate the
|
|
350
379
|
// entire backlog into its context (and go stale as it edits the file).
|
|
351
380
|
const content = readGatedMemoryV2Static(ctx.trust, {
|
|
352
381
|
excludeBuffer: ctx.callSite === "memoryV2Consolidation",
|
|
353
382
|
});
|
|
354
|
-
if (!content)
|
|
355
|
-
if (hasInjectedUserTextBlock(runMessages, MEMORY_V2_STATIC_BLOCK_MATCHERS))
|
|
383
|
+
if (!content) {
|
|
356
384
|
return null;
|
|
385
|
+
}
|
|
386
|
+
if (
|
|
387
|
+
hasInjectedUserTextBlock(runMessages, MEMORY_V2_STATIC_BLOCK_MATCHERS)
|
|
388
|
+
) {
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
357
391
|
return {
|
|
358
392
|
id: "memory-v2-static",
|
|
359
393
|
text: buildMemoryV2StaticBlock(content),
|
|
@@ -377,14 +411,25 @@ function buildMemoryV2StaticBlock(content: string): string {
|
|
|
377
411
|
}
|
|
378
412
|
|
|
379
413
|
/**
|
|
380
|
-
*
|
|
381
|
-
* `order`.
|
|
382
|
-
*
|
|
383
|
-
* {@link DEFAULT_INJECTOR_ORDER}), so this array's
|
|
384
|
-
* readability convenience.
|
|
414
|
+
* Every injector the `default-memory` plugin contributes, in ascending
|
|
415
|
+
* `order`. This is the plugin's whole injector surface — `defaultMemoryPlugin`
|
|
416
|
+
* passes the array straight through, and the registry sorts the cross-plugin
|
|
417
|
+
* union by `order` (see {@link DEFAULT_INJECTOR_ORDER}), so this array's
|
|
418
|
+
* literal order is only a readability convenience.
|
|
385
419
|
*/
|
|
386
420
|
export const memoryInjectors: Injector[] = [
|
|
421
|
+
// V1 — delete with v1. The PKB pair is the legacy engine's entire injection
|
|
422
|
+
// surface; both self-silence through `isPkbInjectionSilenced` whenever v1 is
|
|
423
|
+
// not the live tier.
|
|
387
424
|
pkbContextInjector,
|
|
388
425
|
pkbReminderInjector,
|
|
426
|
+
// SUBSTRATE (v2+v3). Emits the static `<info>` block read off the concept
|
|
427
|
+
// pages, so it serves the v2 injection engine and v3 alike. Its block id
|
|
428
|
+
// `memory-v2-static` is FROZEN: `daemon/conversation-runtime-assembly.ts`
|
|
429
|
+
// switches on it to capture the block into persisted message metadata.
|
|
389
430
|
memoryV2StaticInjector,
|
|
431
|
+
// V3 — delete with v3. The frozen net-new card block and its ephemeral
|
|
432
|
+
// spotlight companion; both self-gate on `memory.v3.live`.
|
|
433
|
+
memoryV3Injector,
|
|
434
|
+
memoryV3SpotlightInjector,
|
|
390
435
|
];
|
|
@@ -10,55 +10,97 @@
|
|
|
10
10
|
* Each handler is wrapped in an arrow that reads the imported binding at
|
|
11
11
|
* dispatch time rather than capturing it eagerly, so a per-test `mock.module` of
|
|
12
12
|
* the underlying handler is honored.
|
|
13
|
+
*
|
|
14
|
+
* The table is grouped into labeled per-tier sections (V1 / SUBSTRATE / V2
|
|
15
|
+
* ENGINE / V3 / RETROSPECTIVE) so retiring a tier is deleting its section and
|
|
16
|
+
* its import group. Registration keys off `type` alone, so the literal order
|
|
17
|
+
* is a readability convenience.
|
|
13
18
|
*/
|
|
14
19
|
|
|
15
|
-
import {
|
|
20
|
+
import { isMemoryV1Active } from "../../../config/memory-v3-gate.js";
|
|
16
21
|
import type { AssistantConfig } from "../../../config/types.js";
|
|
17
22
|
import type { MemoryJob } from "../../../persistence/jobs-store.js";
|
|
18
23
|
import type { JobHandlerEntry } from "../../types.js";
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
import { runConsolidation } from "./graph/consolidation.js";
|
|
22
|
-
import { runDecayTick } from "./graph/decay.js";
|
|
23
|
-
import { graphExtractJob } from "./graph/extraction-job.js";
|
|
24
|
+
// The all-tier graph store: `embedGraphNodeJob` serves the V1 section,
|
|
25
|
+
// `embedGraphTriggerJob` the SUBSTRATE one.
|
|
24
26
|
import {
|
|
25
27
|
embedGraphNodeJob,
|
|
26
28
|
embedGraphTriggerJob,
|
|
27
29
|
} from "./graph/graph-search.js";
|
|
28
|
-
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
30
|
+
// SUBSTRATE (v2+v3).
|
|
31
|
+
import { embedConceptPageJob } from "./jobs/embed-concept-page.js";
|
|
32
|
+
import { getLogger } from "./logging.js";
|
|
33
|
+
// RETROSPECTIVE (all tiers).
|
|
34
|
+
import { memoryRetrospectiveJob } from "./memory-retrospective-job.js";
|
|
35
|
+
import { skillCardInsertJob } from "./memory-retrospective-skill-card.js";
|
|
36
|
+
import { memoryRetrospectiveSweepJob } from "./memory-retrospective-sweep.js";
|
|
37
|
+
// SUBSTRATE (v2+v3).
|
|
38
|
+
import { memoryV2ConsolidateJob } from "./substrate/consolidation-job.js";
|
|
39
|
+
import { memoryV2ReembedJob } from "./substrate/reembed-job.js";
|
|
40
|
+
import { memoryV2SweepJob } from "./substrate/sweep-job.js";
|
|
41
|
+
// V1 — delete with v1.
|
|
42
|
+
import { pkbCompactionJob, pkbFilingJob } from "./v1/filing-jobs.js";
|
|
43
|
+
import { bootstrapFromHistory } from "./v1/graph/bootstrap.js";
|
|
44
|
+
import { runConsolidation } from "./v1/graph/consolidation.js";
|
|
45
|
+
import { runDecayTick } from "./v1/graph/decay.js";
|
|
46
|
+
import { graphExtractJob } from "./v1/graph/extraction-job.js";
|
|
47
|
+
import { runNarrativeRefinement } from "./v1/graph/narrative.js";
|
|
48
|
+
import { runPatternScan } from "./v1/graph/pattern-scan.js";
|
|
49
|
+
import { backfillJob } from "./v1/job-handlers/backfill.js";
|
|
31
50
|
import {
|
|
32
51
|
embedAttachmentJob,
|
|
33
52
|
embedMediaJob,
|
|
34
53
|
embedSegmentJob,
|
|
35
54
|
embedSummaryJob,
|
|
36
|
-
} from "./job-handlers/embedding.js";
|
|
55
|
+
} from "./v1/job-handlers/embedding.js";
|
|
37
56
|
import {
|
|
38
57
|
deleteQdrantVectorsJob,
|
|
39
58
|
rebuildIndexJob,
|
|
40
59
|
sweepOrphanedGraphNodePointsJob,
|
|
41
|
-
} from "./job-handlers/index-maintenance.js";
|
|
42
|
-
import {
|
|
43
|
-
|
|
44
|
-
import { getLogger } from "./logging.js";
|
|
45
|
-
import { memoryRetrospectiveJob } from "./memory-retrospective-job.js";
|
|
46
|
-
import { skillCardInsertJob } from "./memory-retrospective-skill-card.js";
|
|
47
|
-
import { memoryRetrospectiveSweepJob } from "./memory-retrospective-sweep.js";
|
|
60
|
+
} from "./v1/job-handlers/index-maintenance.js";
|
|
61
|
+
import { embedPkbFileJob } from "./v1/jobs/embed-pkb-file.js";
|
|
62
|
+
// V2 ENGINE — delete with v2.
|
|
48
63
|
import {
|
|
49
64
|
memoryV2ActivationRecomputeJob,
|
|
50
65
|
memoryV2MigrateJob,
|
|
51
|
-
memoryV2ReembedJob,
|
|
52
66
|
} from "./v2/backfill-jobs.js";
|
|
67
|
+
// V3.
|
|
53
68
|
import { maintainJob as memoryV3MaintainJob } from "./v3/maintain-job.js";
|
|
54
|
-
import { memoryV2ConsolidateJob } from "./v3/substrate/consolidation-job.js";
|
|
55
|
-
import { memoryV2SweepJob } from "./v3/substrate/sweep-job.js";
|
|
56
69
|
|
|
57
70
|
const log = getLogger("memory-job-handlers");
|
|
58
71
|
|
|
59
72
|
// ── Graph lifecycle job handlers ──────────────────────────────────
|
|
60
73
|
|
|
61
|
-
|
|
74
|
+
/**
|
|
75
|
+
* Tier gate shared by the v1 graph handlers below (the lifecycle jobs and
|
|
76
|
+
* `graph_extract`). These jobs mutate — and some LLM-process into — the legacy
|
|
77
|
+
* v1 graph, which only the v1 tier reads, so a stale or hand-enqueued row
|
|
78
|
+
* claimed while v1 is not the active memory tier must complete as a logged
|
|
79
|
+
* no-op instead of doing that work. Returns true when the row should be
|
|
80
|
+
* skipped.
|
|
81
|
+
*
|
|
82
|
+
* The condition is `isMemoryV1Active` and nothing else — the same predicate
|
|
83
|
+
* `processJob` applies to `V1_QDRANT_JOB_TYPES` in `jobs-worker.ts`, so every
|
|
84
|
+
* v1 job type answers to one definition of "v1 is the live tier". That
|
|
85
|
+
* predicate's docstring carries the memory-off semantics the two share: memory
|
|
86
|
+
* being off is not v1, so v1 work is skipped there exactly as it is under the
|
|
87
|
+
* concept-page substrate.
|
|
88
|
+
*/
|
|
89
|
+
function isStaleV1GraphJob(job: MemoryJob, config: AssistantConfig): boolean {
|
|
90
|
+
if (isMemoryV1Active(config)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
log.info(
|
|
94
|
+
{ jobId: job.id, type: job.type },
|
|
95
|
+
"Skipping v1 graph job — the legacy graph is not the active memory tier",
|
|
96
|
+
);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function graphDecayJob(job: MemoryJob, config: AssistantConfig): void {
|
|
101
|
+
if (isStaleV1GraphJob(job, config)) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
62
104
|
const result = runDecayTick();
|
|
63
105
|
log.info({ jobId: job.id, ...result }, "Graph decay tick complete");
|
|
64
106
|
}
|
|
@@ -67,6 +109,9 @@ async function graphConsolidateJob(
|
|
|
67
109
|
job: MemoryJob,
|
|
68
110
|
config: AssistantConfig,
|
|
69
111
|
): Promise<void> {
|
|
112
|
+
if (isStaleV1GraphJob(job, config)) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
70
115
|
const result = await runConsolidation(config);
|
|
71
116
|
log.info(
|
|
72
117
|
{
|
|
@@ -83,6 +128,9 @@ async function graphPatternScanJob(
|
|
|
83
128
|
job: MemoryJob,
|
|
84
129
|
config: AssistantConfig,
|
|
85
130
|
): Promise<void> {
|
|
131
|
+
if (isStaleV1GraphJob(job, config)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
86
134
|
const result = await runPatternScan(config);
|
|
87
135
|
log.info(
|
|
88
136
|
{
|
|
@@ -98,6 +146,9 @@ async function graphNarrativeRefineJob(
|
|
|
98
146
|
job: MemoryJob,
|
|
99
147
|
config: AssistantConfig,
|
|
100
148
|
): Promise<void> {
|
|
149
|
+
if (isStaleV1GraphJob(job, config)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
101
152
|
const result = await runNarrativeRefinement(config);
|
|
102
153
|
log.info(
|
|
103
154
|
{
|
|
@@ -109,11 +160,27 @@ async function graphNarrativeRefineJob(
|
|
|
109
160
|
);
|
|
110
161
|
}
|
|
111
162
|
|
|
163
|
+
async function graphBootstrapJob(
|
|
164
|
+
job: MemoryJob,
|
|
165
|
+
config: AssistantConfig,
|
|
166
|
+
): Promise<void> {
|
|
167
|
+
if (isStaleV1GraphJob(job, config)) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
await bootstrapFromHistory();
|
|
171
|
+
}
|
|
172
|
+
|
|
112
173
|
/**
|
|
113
174
|
* The memory feature's per-job-type handlers, registered directly into the
|
|
114
175
|
* worker dispatch table by the memory plugin's `init` hook.
|
|
115
176
|
*/
|
|
116
177
|
export const memoryJobHandlers: readonly JobHandlerEntry[] = [
|
|
178
|
+
// V1 — delete with v1.
|
|
179
|
+
// Segment/summary/media embedding, the Qdrant index-maintenance jobs, the
|
|
180
|
+
// graph lifecycle, and PKB filing. Their stale-row guards live at dispatch
|
|
181
|
+
// (`V1_QDRANT_JOB_TYPES` in `jobs-worker.ts`), in `isStaleV1GraphJob` above,
|
|
182
|
+
// and at the `jobs-worker.ts` scheduling sites — all three on the one
|
|
183
|
+
// `isMemoryV1Active` condition.
|
|
117
184
|
{
|
|
118
185
|
type: "embed_segment",
|
|
119
186
|
handler: (job) => embedSegmentJob(job),
|
|
@@ -145,22 +212,18 @@ export const memoryJobHandlers: readonly JobHandlerEntry[] = [
|
|
|
145
212
|
type: "embed_pkb_file",
|
|
146
213
|
handler: (job, config) => embedPkbFileJob(job, config),
|
|
147
214
|
},
|
|
148
|
-
{
|
|
149
|
-
type: "graph_trigger_embed",
|
|
150
|
-
handler: (job, config) => embedGraphTriggerJob(job, config),
|
|
151
|
-
},
|
|
152
215
|
{
|
|
153
216
|
type: "graph_extract",
|
|
154
217
|
handler: async (job, config) => {
|
|
155
218
|
// Stale rows enqueued by any unguarded v1 path must not consume
|
|
156
|
-
// embedding/extraction budget while
|
|
157
|
-
if (
|
|
219
|
+
// embedding/extraction budget while v1 is not the live tier.
|
|
220
|
+
if (isStaleV1GraphJob(job, config)) {
|
|
158
221
|
return;
|
|
159
222
|
}
|
|
160
223
|
await graphExtractJob(job, config);
|
|
161
224
|
},
|
|
162
225
|
},
|
|
163
|
-
{ type: "graph_decay", handler: (job) => graphDecayJob(job) },
|
|
226
|
+
{ type: "graph_decay", handler: (job, config) => graphDecayJob(job, config) },
|
|
164
227
|
{
|
|
165
228
|
type: "graph_consolidate",
|
|
166
229
|
handler: (job, config) => graphConsolidateJob(job, config),
|
|
@@ -173,7 +236,29 @@ export const memoryJobHandlers: readonly JobHandlerEntry[] = [
|
|
|
173
236
|
type: "graph_narrative_refine",
|
|
174
237
|
handler: (job, config) => graphNarrativeRefineJob(job, config),
|
|
175
238
|
},
|
|
176
|
-
{
|
|
239
|
+
{
|
|
240
|
+
type: "graph_bootstrap",
|
|
241
|
+
handler: (job, config) => graphBootstrapJob(job, config),
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
type: "pkb_filing",
|
|
245
|
+
handler: (job) => pkbFilingJob(job),
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
type: "pkb_compaction",
|
|
249
|
+
handler: () => pkbCompactionJob(),
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
// SUBSTRATE (v2+v3).
|
|
253
|
+
// Concept-page embedding, the buffer sweep and consolidator, and the
|
|
254
|
+
// corpus reembed — shared by the v2 injection engine and v3, so they
|
|
255
|
+
// outlive v1 and v2 alike. `graph_trigger_embed` deliberately lives here
|
|
256
|
+
// rather than with the v1 graph jobs: it embeds trigger text the substrate
|
|
257
|
+
// reads (locked by `__tests__/jobs-worker-v2-graph-trigger-embed.test.ts`).
|
|
258
|
+
{
|
|
259
|
+
type: "graph_trigger_embed",
|
|
260
|
+
handler: (job, config) => embedGraphTriggerJob(job, config),
|
|
261
|
+
},
|
|
177
262
|
{
|
|
178
263
|
type: "embed_concept_page",
|
|
179
264
|
handler: (job, config) => embedConceptPageJob(job, config),
|
|
@@ -187,29 +272,35 @@ export const memoryJobHandlers: readonly JobHandlerEntry[] = [
|
|
|
187
272
|
handler: (job, config) => memoryV2ConsolidateJob(job, config),
|
|
188
273
|
},
|
|
189
274
|
{
|
|
190
|
-
type: "
|
|
191
|
-
handler: (job) =>
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
type: "pkb_compaction",
|
|
195
|
-
handler: () => pkbCompactionJob(),
|
|
275
|
+
type: "memory_v2_reembed",
|
|
276
|
+
handler: (job, config) => memoryV2ReembedJob(job, config),
|
|
196
277
|
},
|
|
278
|
+
|
|
279
|
+
// V2 ENGINE — delete with v2.
|
|
280
|
+
// Operator-triggered backfills owned by the activation/router engine: the
|
|
281
|
+
// one-shot v1→v2 synthesis and the persisted-activation recompute. The job
|
|
282
|
+
// types share the `memory_v2_` prefix with the substrate entries above, but
|
|
283
|
+
// the work is engine-local.
|
|
197
284
|
{
|
|
198
285
|
type: "memory_v2_migrate",
|
|
199
286
|
handler: (job, config) => memoryV2MigrateJob(job, config),
|
|
200
287
|
},
|
|
201
|
-
{
|
|
202
|
-
type: "memory_v2_reembed",
|
|
203
|
-
handler: (job, config) => memoryV2ReembedJob(job, config),
|
|
204
|
-
},
|
|
205
288
|
{
|
|
206
289
|
type: "memory_v2_activation_recompute",
|
|
207
290
|
handler: (job, config) => memoryV2ActivationRecomputeJob(job, config),
|
|
208
291
|
},
|
|
292
|
+
|
|
293
|
+
// V3.
|
|
294
|
+
// Topic-tree self-maintenance; the handler no-ops when v3 is not live.
|
|
209
295
|
{
|
|
210
296
|
type: "memory_v3_maintain",
|
|
211
297
|
handler: (job, config) => memoryV3MaintainJob(job, config),
|
|
212
298
|
},
|
|
299
|
+
|
|
300
|
+
// RETROSPECTIVE (all tiers).
|
|
301
|
+
// The retrospective pass and its cross-conversation sweep are tier-agnostic
|
|
302
|
+
// and survive every tier deletion. `skill_card_insert` is emitted only on
|
|
303
|
+
// v3 but is owned by the retrospective, so it groups here.
|
|
213
304
|
{
|
|
214
305
|
type: "memory_retrospective",
|
|
215
306
|
handler: (job, config) => memoryRetrospectiveJob(job, config),
|
|
@@ -91,7 +91,7 @@ const upsertCalls: Array<{
|
|
|
91
91
|
|
|
92
92
|
const deleteCalls: string[] = [];
|
|
93
93
|
|
|
94
|
-
mock.module("../../
|
|
94
|
+
mock.module("../../substrate/qdrant.js", () => ({
|
|
95
95
|
upsertConceptPageEmbedding: async (params: {
|
|
96
96
|
slug: string;
|
|
97
97
|
dense: number[];
|
|
@@ -151,7 +151,7 @@ type MemoryJobMod = typeof import("../../../../../persistence/jobs-store.js");
|
|
|
151
151
|
type MemoryJob = ReturnType<MemoryJobMod["claimMemoryJobs"]>[number];
|
|
152
152
|
const { embedConceptPageJob, enqueueEmbedConceptPageJob } =
|
|
153
153
|
await import("../embed-concept-page.js");
|
|
154
|
-
const { writePage } = await import("../../
|
|
154
|
+
const { writePage } = await import("../../substrate/page-store.js");
|
|
155
155
|
const { _resetQdrantBreaker, isQdrantBreakerOpen, withQdrantBreaker } =
|
|
156
156
|
await import("../../../../../persistence/embeddings/qdrant-circuit-breaker.js");
|
|
157
157
|
|
|
@@ -43,15 +43,16 @@ import { embedWithBackend } from "../embeddings.js";
|
|
|
43
43
|
import { BackendUnavailableError } from "../host-utils.js";
|
|
44
44
|
import { getLogger } from "../logging.js";
|
|
45
45
|
import { getWorkspaceDir } from "../paths.js";
|
|
46
|
-
import { readPage } from "../
|
|
46
|
+
import { readPage } from "../substrate/page-store.js";
|
|
47
47
|
import {
|
|
48
48
|
deleteConceptPageEmbedding,
|
|
49
49
|
upsertConceptPageEmbedding,
|
|
50
|
-
} from "../
|
|
50
|
+
} from "../substrate/qdrant.js";
|
|
51
51
|
import {
|
|
52
52
|
generateBm25DocEmbedding,
|
|
53
53
|
getConceptPageCorpusStats,
|
|
54
|
-
} from "../
|
|
54
|
+
} from "../substrate/sparse-bm25.js";
|
|
55
|
+
import { resolveSubstrateTuning } from "../substrate/tuning.js";
|
|
55
56
|
|
|
56
57
|
const log = getLogger("memory-v2-embed-concept-page");
|
|
57
58
|
|
|
@@ -81,7 +82,9 @@ export async function embedConceptPageJob(
|
|
|
81
82
|
config: AssistantConfig,
|
|
82
83
|
): Promise<void> {
|
|
83
84
|
const slug = asString(job.payload.slug);
|
|
84
|
-
if (!slug)
|
|
85
|
+
if (!slug) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
85
88
|
|
|
86
89
|
const workspaceDir = getWorkspaceDir();
|
|
87
90
|
const page = await readPage(workspaceDir, slug);
|
|
@@ -214,7 +217,9 @@ export async function embedConceptPageJob(
|
|
|
214
217
|
writeModel = embedded.model;
|
|
215
218
|
for (let i = 0; i < appliedSlots.length; i++) {
|
|
216
219
|
const vector = embedded.vectors[i];
|
|
217
|
-
if (!vector)
|
|
220
|
+
if (!vector) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
218
223
|
if (appliedSlots[i] === "body") {
|
|
219
224
|
bodyDense = vector;
|
|
220
225
|
bodyFresh = true;
|
|
@@ -227,7 +232,9 @@ export async function embedConceptPageJob(
|
|
|
227
232
|
// Body embedding is the ground truth — without it the page can't surface.
|
|
228
233
|
// (Cache hit paths populate `bodyDense` above; a fresh embed that returned
|
|
229
234
|
// no vectors short-circuits here too.)
|
|
230
|
-
if (!bodyDense)
|
|
235
|
+
if (!bodyDense) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
231
238
|
|
|
232
239
|
// Sparse is cheap (in-process tokenization) and changes any time the body
|
|
233
240
|
// changes, so we always recompute it rather than caching alongside dense.
|
|
@@ -236,11 +243,12 @@ export async function embedConceptPageJob(
|
|
|
236
243
|
// corpus for the first time), fall back to the legacy TF-only encoding —
|
|
237
244
|
// the next reembed pass overwrites the page once stats are available.
|
|
238
245
|
const corpusStats = getConceptPageCorpusStats();
|
|
246
|
+
const { bm25_k1, bm25_b } = resolveSubstrateTuning(config.memory);
|
|
239
247
|
const encodeSparse = (input: string) =>
|
|
240
248
|
corpusStats
|
|
241
249
|
? generateBm25DocEmbedding(input, corpusStats, {
|
|
242
|
-
k1:
|
|
243
|
-
b:
|
|
250
|
+
k1: bm25_k1,
|
|
251
|
+
b: bm25_b,
|
|
244
252
|
})
|
|
245
253
|
: generateSparseEmbedding(input);
|
|
246
254
|
const sparse = encodeSparse(text);
|
|
@@ -344,10 +352,14 @@ function readEmbeddingCache(
|
|
|
344
352
|
),
|
|
345
353
|
)
|
|
346
354
|
.get();
|
|
347
|
-
if (!row || row.dimensions !== expectedDim)
|
|
355
|
+
if (!row || row.dimensions !== expectedDim) {
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
348
358
|
// A row without a contentHash is a legacy/corrupt entry — treat as a miss
|
|
349
359
|
// and force a re-embed rather than misalign the cache key.
|
|
350
|
-
if (row.contentHash === null)
|
|
360
|
+
if (row.contentHash === null) {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
351
363
|
const dense = row.vectorBlob
|
|
352
364
|
? blobToVector(row.vectorBlob as Buffer)
|
|
353
365
|
: (JSON.parse(row.vectorJson!) as number[]);
|