@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,109 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Memory Graph — injection tracking
|
|
3
|
+
//
|
|
4
|
+
// `ConversationGraphMemory` keeps a tracker per conversation on every tier;
|
|
5
|
+
// the v1 read engine (`../v1/graph/`) consumes it during retrieval.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
import type { ScoredNode } from "./types.js";
|
|
9
|
+
|
|
10
|
+
export interface InjectionLogEntry {
|
|
11
|
+
nodeId: string;
|
|
12
|
+
turn: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface InContextTrackerSnapshot {
|
|
16
|
+
inContext: string[];
|
|
17
|
+
log: InjectionLogEntry[];
|
|
18
|
+
currentTurn: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Tracks which memory graph nodes are currently in the LLM's context.
|
|
23
|
+
* Handles:
|
|
24
|
+
* - Deduplication: never re-inject a node already visible
|
|
25
|
+
* - Compaction eviction: when context compaction removes turns,
|
|
26
|
+
* evict those nodes so they can be re-injected if relevant later
|
|
27
|
+
*/
|
|
28
|
+
export class InContextTracker {
|
|
29
|
+
private inContext = new Set<string>();
|
|
30
|
+
private log: InjectionLogEntry[] = [];
|
|
31
|
+
private currentTurn = 0;
|
|
32
|
+
|
|
33
|
+
/** Mark nodes as loaded into context. */
|
|
34
|
+
add(nodeIds: string[]): void {
|
|
35
|
+
for (const id of nodeIds) {
|
|
36
|
+
this.inContext.add(id);
|
|
37
|
+
this.log.push({ nodeId: id, turn: this.currentTurn });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Check if a node is already in context. */
|
|
42
|
+
isInContext(nodeId: string): boolean {
|
|
43
|
+
return this.inContext.has(nodeId);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Filter candidates to only those not already in context. */
|
|
47
|
+
filterNew(candidates: ScoredNode[]): ScoredNode[] {
|
|
48
|
+
return candidates.filter((c) => !this.inContext.has(c.node.id));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Advance the turn counter. Called before each retrieval step. */
|
|
52
|
+
advanceTurn(): void {
|
|
53
|
+
this.currentTurn++;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Evict nodes that were injected in compacted turns.
|
|
58
|
+
* Called when context compaction removes message history.
|
|
59
|
+
*/
|
|
60
|
+
evictCompactedTurns(upToTurn: number): void {
|
|
61
|
+
const evicted: string[] = [];
|
|
62
|
+
this.log = this.log.filter((entry) => {
|
|
63
|
+
if (entry.turn <= upToTurn) {
|
|
64
|
+
evicted.push(entry.nodeId);
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Only evict if the node isn't also loaded in a later turn
|
|
71
|
+
const stillPresent = new Set(this.log.map((e) => e.nodeId));
|
|
72
|
+
for (const id of evicted) {
|
|
73
|
+
if (!stillPresent.has(id)) {
|
|
74
|
+
this.inContext.delete(id);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Get all node IDs currently in context. Useful for extraction. */
|
|
80
|
+
getActiveNodeIds(): string[] {
|
|
81
|
+
return [...this.inContext];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Get the injection log. Useful for debugging. */
|
|
85
|
+
getLog(): InjectionLogEntry[] {
|
|
86
|
+
return [...this.log];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Current turn number. */
|
|
90
|
+
getTurn(): number {
|
|
91
|
+
return this.currentTurn;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Serialize tracker state for persistence across eviction. */
|
|
95
|
+
toJSON(): InContextTrackerSnapshot {
|
|
96
|
+
return {
|
|
97
|
+
inContext: [...this.inContext],
|
|
98
|
+
log: [...this.log],
|
|
99
|
+
currentTurn: this.currentTurn,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Restore tracker state from a persisted snapshot. Replaces current state. */
|
|
104
|
+
restoreFrom(snapshot: InContextTrackerSnapshot): void {
|
|
105
|
+
this.inContext = new Set(snapshot.inContext);
|
|
106
|
+
this.log = [...snapshot.log];
|
|
107
|
+
this.currentTurn = snapshot.currentTurn;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -54,6 +54,7 @@ function memoryDb(): DrizzleDb {
|
|
|
54
54
|
// Row ↔ Domain conversion helpers
|
|
55
55
|
// ---------------------------------------------------------------------------
|
|
56
56
|
|
|
57
|
+
/** Project a `memory_graph_nodes` row onto its domain node. */
|
|
57
58
|
function rowToNode(row: typeof memoryGraphNodes.$inferSelect): MemoryNode {
|
|
58
59
|
return {
|
|
59
60
|
id: row.id,
|
|
@@ -44,7 +44,7 @@ mock.module("../../../../util/platform.js", () => ({
|
|
|
44
44
|
getWorkspaceDir: () => "/tmp/test-workspace",
|
|
45
45
|
}));
|
|
46
46
|
|
|
47
|
-
mock.module("../jobs/embed-pkb-file.js", () => ({
|
|
47
|
+
mock.module("../v1/jobs/embed-pkb-file.js", () => ({
|
|
48
48
|
enqueuePkbIndexJob: () => {},
|
|
49
49
|
}));
|
|
50
50
|
|
|
@@ -9,7 +9,10 @@
|
|
|
9
9
|
import { appendFileSync, existsSync, mkdirSync } from "node:fs";
|
|
10
10
|
import { join } from "node:path";
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
isMemoryEnabled,
|
|
14
|
+
usesConceptPageMemory,
|
|
15
|
+
} from "../../../../config/memory-v3-gate.js";
|
|
13
16
|
import type { AssistantConfig } from "../../../../config/types.js";
|
|
14
17
|
import { enqueueMemoryJob } from "../../../../persistence/jobs-store.js";
|
|
15
18
|
import { getWorkspaceDir } from "../paths.js";
|
|
@@ -71,7 +74,7 @@ export function handleRemember(
|
|
|
71
74
|
if (facts.length === 0) {
|
|
72
75
|
return { success: false, message: "content is required" };
|
|
73
76
|
}
|
|
74
|
-
if (config
|
|
77
|
+
if (!isMemoryEnabled(config)) {
|
|
75
78
|
return { success: false, message: "Memory is disabled." };
|
|
76
79
|
}
|
|
77
80
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import type { PageIndexEntry } from "../../
|
|
3
|
+
import type { PageIndexEntry } from "../../substrate/page-index.js";
|
|
4
4
|
import type { Slug } from "../../v3/types.js";
|
|
5
5
|
import { assembleMemoryGraph } from "../build-memory-graph.js";
|
|
6
6
|
|
|
@@ -15,20 +15,17 @@
|
|
|
15
15
|
* a call into `backend.getGraph()` — the contract and its route do not change.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
import {
|
|
18
|
+
import { isV3TierActive } from "../../../../config/memory-v3-gate.js";
|
|
19
19
|
import type { AssistantConfig } from "../../../../config/types.js";
|
|
20
20
|
import { getWorkspaceDir } from "../paths.js";
|
|
21
|
+
import { getPageIndex, type PageIndexEntry } from "../substrate/page-index.js";
|
|
22
|
+
import { readPage, renderPageContent } from "../substrate/page-store.js";
|
|
23
|
+
import { isSkillSlug } from "../substrate/skill-store.js";
|
|
21
24
|
import {
|
|
22
25
|
isCapabilitySlug,
|
|
23
26
|
renderCapabilityContent,
|
|
24
27
|
} from "../v3/capabilities.js";
|
|
25
28
|
import { buildEdgeGraph } from "../v3/edge.js";
|
|
26
|
-
import {
|
|
27
|
-
getPageIndex,
|
|
28
|
-
type PageIndexEntry,
|
|
29
|
-
} from "../v3/substrate/page-index.js";
|
|
30
|
-
import { readPage, renderPageContent } from "../v3/substrate/page-store.js";
|
|
31
|
-
import { isSkillSlug } from "../v3/substrate/skill-store.js";
|
|
32
29
|
import type { Slug } from "../v3/types.js";
|
|
33
30
|
import {
|
|
34
31
|
buildPendingGraph,
|
|
@@ -235,7 +232,7 @@ export function assembleMemoryGraph(input: AssembleMemoryGraphInput): {
|
|
|
235
232
|
export async function getMemoryGraph(
|
|
236
233
|
config: AssistantConfig,
|
|
237
234
|
): Promise<MemoryGraph> {
|
|
238
|
-
if (!
|
|
235
|
+
if (!isV3TierActive(config)) {
|
|
239
236
|
return { backend: null, supported: false, nodes: [], edges: [] };
|
|
240
237
|
}
|
|
241
238
|
|
|
@@ -299,7 +296,7 @@ export async function getMemoryGraphNode(
|
|
|
299
296
|
config: AssistantConfig,
|
|
300
297
|
id: string,
|
|
301
298
|
): Promise<MemoryGraphNodeDetail> {
|
|
302
|
-
if (!
|
|
299
|
+
if (!isV3TierActive(config) || !id) {
|
|
303
300
|
return { found: false };
|
|
304
301
|
}
|
|
305
302
|
// Pending buffer entries: resolve the id back to its buffer fact. `found:
|
|
@@ -1,37 +1,51 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { shouldRunLegacyMemoryRetrieval } from "../user-prompt-submit.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* v2 graph-memory retrieval is the deprecated path
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
6
|
+
* Legacy (v1/v2) graph-memory retrieval is the deprecated path — the gate
|
|
7
|
+
* covers both pre-v3 engines, which `prepareMemory` dispatches between
|
|
8
|
+
* internally. It is gated off under `memory-v3-live` — v3 owns the
|
|
9
|
+
* injected-memory layer and runtime assembly strips any legacy `<memory>`
|
|
10
|
+
* block, so running the legacy per-turn retrieval (embedding + hybrid search
|
|
11
|
+
* + the `memoryRetrieval` LLM router) would only have its result discarded.
|
|
12
|
+
* It is also skipped for untrusted actors. The conversation/abort-signal
|
|
13
|
+
* presence checks stay inline at the call site (for type narrowing) and are
|
|
14
|
+
* deliberately NOT part of this policy decision.
|
|
13
15
|
*/
|
|
14
|
-
describe("
|
|
15
|
-
test("runs for a trusted actor when memory-v3-live is off (v2
|
|
16
|
+
describe("shouldRunLegacyMemoryRetrieval", () => {
|
|
17
|
+
test("runs for a trusted actor when memory-v3-live is off (v1/v2 path)", () => {
|
|
16
18
|
expect(
|
|
17
|
-
|
|
19
|
+
shouldRunLegacyMemoryRetrieval({
|
|
20
|
+
isTrustedActor: true,
|
|
21
|
+
memoryV3Live: false,
|
|
22
|
+
}),
|
|
18
23
|
).toBe(true);
|
|
19
24
|
});
|
|
20
25
|
|
|
21
26
|
test("is skipped under memory-v3-live even for a trusted actor", () => {
|
|
22
|
-
// The cutover: v3 owns memory, so
|
|
23
|
-
// not fire — this is the per-turn cost the gate removes.
|
|
27
|
+
// The cutover: v3 owns memory, so legacy retrieval (and its LLM router)
|
|
28
|
+
// must not fire — this is the per-turn cost the gate removes.
|
|
24
29
|
expect(
|
|
25
|
-
|
|
30
|
+
shouldRunLegacyMemoryRetrieval({
|
|
31
|
+
isTrustedActor: true,
|
|
32
|
+
memoryV3Live: true,
|
|
33
|
+
}),
|
|
26
34
|
).toBe(false);
|
|
27
35
|
});
|
|
28
36
|
|
|
29
37
|
test("is skipped for an untrusted actor regardless of the flag", () => {
|
|
30
38
|
expect(
|
|
31
|
-
|
|
39
|
+
shouldRunLegacyMemoryRetrieval({
|
|
40
|
+
isTrustedActor: false,
|
|
41
|
+
memoryV3Live: false,
|
|
42
|
+
}),
|
|
32
43
|
).toBe(false);
|
|
33
44
|
expect(
|
|
34
|
-
|
|
45
|
+
shouldRunLegacyMemoryRetrieval({
|
|
46
|
+
isTrustedActor: false,
|
|
47
|
+
memoryV3Live: true,
|
|
48
|
+
}),
|
|
35
49
|
).toBe(false);
|
|
36
50
|
});
|
|
37
51
|
});
|
|
@@ -51,15 +51,18 @@ import { recordMemoryRecallLog } from "../memory-recall-log-store.js";
|
|
|
51
51
|
import { MEMORY_V3_INJECTED_BLOCK_METADATA_KEY } from "../v3/ever-injected-store.js";
|
|
52
52
|
|
|
53
53
|
/**
|
|
54
|
-
* Whether to run
|
|
54
|
+
* Whether to run legacy graph-memory retrieval this turn. It gates BOTH
|
|
55
|
+
* pre-v3 read paths — `prepareMemory` dispatches internally between v1
|
|
56
|
+
* retrieval and the v2 activation engine. The legacy retrieval is the
|
|
55
57
|
* deprecated path: under `memory-v3-live`, v3 is the injected-memory source and
|
|
56
|
-
* runtime assembly strips any
|
|
57
|
-
* (embedding + hybrid search + the `memoryRetrieval` LLM router)
|
|
58
|
-
* discard the result is pure per-turn waste. Untrusted actors never
|
|
59
|
-
* either. The caller additionally requires the live conversation and
|
|
60
|
-
* signal to be present (kept inline at the call site for type
|
|
58
|
+
* runtime assembly strips any legacy `<memory>` block, so running the legacy
|
|
59
|
+
* retrieval (embedding + hybrid search + the `memoryRetrieval` LLM router)
|
|
60
|
+
* only to discard the result is pure per-turn waste. Untrusted actors never
|
|
61
|
+
* run it either. The caller additionally requires the live conversation and
|
|
62
|
+
* its abort signal to be present (kept inline at the call site for type
|
|
63
|
+
* narrowing).
|
|
61
64
|
*/
|
|
62
|
-
export function
|
|
65
|
+
export function shouldRunLegacyMemoryRetrieval(params: {
|
|
63
66
|
isTrustedActor: boolean;
|
|
64
67
|
memoryV3Live: boolean;
|
|
65
68
|
}): boolean {
|
|
@@ -281,16 +284,17 @@ const userPromptSubmitMemoryRetrieval: HookFunction<
|
|
|
281
284
|
conversation?.trustContext,
|
|
282
285
|
);
|
|
283
286
|
|
|
284
|
-
// v2 graph retrieval is the deprecated path:
|
|
285
|
-
// under memory-v3-live (v3 owns
|
|
286
|
-
//
|
|
287
|
-
//
|
|
288
|
-
// the
|
|
289
|
-
//
|
|
287
|
+
// Legacy (v1/v2) graph retrieval is the deprecated path:
|
|
288
|
+
// `shouldRunLegacyMemoryRetrieval` skips it under memory-v3-live (v3 owns
|
|
289
|
+
// the `<memory>` layer and assembly strips any legacy block) and for
|
|
290
|
+
// untrusted actors. The `conversation && abortSignal` presence checks stay
|
|
291
|
+
// inline so the block below narrows. NOTE: under v3-live there is no legacy
|
|
292
|
+
// fallback — a v3 empty/failed selection yields no NEW injected memory that
|
|
293
|
+
// turn (prior turns' frozen v3 cards still ride history).
|
|
290
294
|
const memoryV3Live = isMemoryV3Live(config);
|
|
291
295
|
let v2BlockPersisted = false;
|
|
292
296
|
if (
|
|
293
|
-
|
|
297
|
+
shouldRunLegacyMemoryRetrieval({ isTrustedActor, memoryV3Live }) &&
|
|
294
298
|
conversation &&
|
|
295
299
|
abortSignal
|
|
296
300
|
) {
|
|
@@ -7,7 +7,10 @@ import { createHash } from "crypto";
|
|
|
7
7
|
import { eq } from "drizzle-orm";
|
|
8
8
|
|
|
9
9
|
import { getConfig } from "../../../config/loader.js";
|
|
10
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
isMemoryV1Active,
|
|
12
|
+
usesConceptPageMemory,
|
|
13
|
+
} from "../../../config/memory-v3-gate.js";
|
|
11
14
|
import type { MemoryConfig } from "../../../config/types.js";
|
|
12
15
|
import {
|
|
13
16
|
getMemoryCheckpoint,
|
|
@@ -27,6 +30,9 @@ import { isMemoryRetrospectiveConversation } from "./memory-retrospective-enqueu
|
|
|
27
30
|
import { maybeEnqueueRetrospective } from "./memory-retrospective-trigger-check.js";
|
|
28
31
|
import { extractMediaBlockMeta } from "./message-media.js";
|
|
29
32
|
import { segmentText } from "./segmenter.js";
|
|
33
|
+
// SUBSTRATE (v2+v3) — the only tier-owned import here; the v1 triggers reach
|
|
34
|
+
// their work through job-type strings alone.
|
|
35
|
+
import { resolveSubstrateTuning } from "./substrate/tuning.js";
|
|
30
36
|
|
|
31
37
|
const log = getLogger("memory-indexer");
|
|
32
38
|
|
|
@@ -206,98 +212,55 @@ export async function indexMessageNow(
|
|
|
206
212
|
? triggerConfig
|
|
207
213
|
: null;
|
|
208
214
|
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
//
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
//
|
|
220
|
-
//
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Single pending `graph_extract` row per conversation. If the
|
|
235
|
-
// batch threshold just fired, pull `runAfter` back to now so the
|
|
236
|
-
// job runs immediately; otherwise debounce by the idle timeout.
|
|
237
|
-
// Routing both paths through `upsertDebouncedJob` ensures the
|
|
238
|
-
// row's `runAfter` reflects whichever trigger ran last, so a
|
|
239
|
-
// batch crossing always takes effect immediately.
|
|
240
|
-
extractRunAfter = graphBatchFired
|
|
241
|
-
? Date.now()
|
|
242
|
-
: Date.now() + idleTimeoutMs;
|
|
243
|
-
if (isMemoryEnabled()) {
|
|
244
|
-
upsertDebouncedJob(
|
|
245
|
-
"graph_extract",
|
|
246
|
-
{
|
|
247
|
-
conversationId: input.conversationId,
|
|
248
|
-
},
|
|
249
|
-
extractRunAfter,
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
} else {
|
|
253
|
-
extractRunAfter = Date.now() + idleTimeoutMs;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// Memory sweep: when concept-page memory is on AND `sweep_enabled` is
|
|
257
|
-
// set, every extraction trigger also enqueues a sweep. The sweep
|
|
258
|
-
// itself reads recent messages globally, so the `conversationId` here
|
|
259
|
-
// is just the dedup key — one pending row per active conversation.
|
|
260
|
-
// `sweep_enabled` defaults to false because `remember()` is the
|
|
261
|
-
// primary capture path; the sweep is opt-in.
|
|
262
|
-
if (conceptConfig != null && conceptConfig.memory.v2.sweep_enabled) {
|
|
263
|
-
upsertDebouncedJob(
|
|
264
|
-
"memory_v2_sweep",
|
|
265
|
-
{ conversationId: input.conversationId },
|
|
266
|
-
extractRunAfter,
|
|
215
|
+
// Per-tier trigger dispatch, three-way. Memory off enqueues nothing: no
|
|
216
|
+
// tier is live, and the pending counts the v1 arm would accumulate
|
|
217
|
+
// meanwhile fire an immediate batch on a later switch back to v1. The v1
|
|
218
|
+
// extraction/summarization triggers run when the legacy graph engine is
|
|
219
|
+
// the live tier, and the substrate sweep trigger runs under a concept-page
|
|
220
|
+
// consumer. `isAutoAnalysisSource` is the recursion guard threaded into
|
|
221
|
+
// both live arms: the analysis agent writes memory directly via tools, so
|
|
222
|
+
// extracting from its reflective musings would double-count and analyzing
|
|
223
|
+
// its own output would loop indefinitely.
|
|
224
|
+
if (conceptConfig == null) {
|
|
225
|
+
// A null `conceptConfig` covers two states — v1 live and memory off — so
|
|
226
|
+
// the v1 arm asks the named predicate rather than assuming v1. A failed
|
|
227
|
+
// config load leaves `triggerConfig` null and fails open to v1: a
|
|
228
|
+
// transient read error must not silently drop indexing.
|
|
229
|
+
if (triggerConfig == null || isMemoryV1Active(triggerConfig)) {
|
|
230
|
+
// V1 — delete with v1. Dropping only the banner-marked function body
|
|
231
|
+
// below would leave this call dangling: collapse the branch to the
|
|
232
|
+
// substrate arm.
|
|
233
|
+
enqueueV1IndexTriggers(
|
|
234
|
+
input.conversationId,
|
|
235
|
+
isAutoAnalysisSource,
|
|
236
|
+
batchSize,
|
|
237
|
+
idleTimeoutMs,
|
|
267
238
|
);
|
|
268
239
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
// cooldown gate against retry storms. Recursion guard skips the
|
|
277
|
-
// memory-retrospective background conversation itself.
|
|
278
|
-
if (
|
|
279
|
-
triggerConfig != null &&
|
|
280
|
-
!isMemoryRetrospectiveConversation(input.conversationId)
|
|
281
|
-
) {
|
|
282
|
-
maybeEnqueueRetrospective(input.conversationId, triggerConfig);
|
|
283
|
-
}
|
|
240
|
+
} else {
|
|
241
|
+
enqueueSubstrateIndexTriggers(
|
|
242
|
+
input.conversationId,
|
|
243
|
+
conceptConfig,
|
|
244
|
+
isAutoAnalysisSource,
|
|
245
|
+
idleTimeoutMs,
|
|
246
|
+
);
|
|
284
247
|
}
|
|
285
248
|
|
|
286
|
-
// ──
|
|
287
|
-
//
|
|
288
|
-
//
|
|
289
|
-
//
|
|
290
|
-
//
|
|
291
|
-
//
|
|
292
|
-
//
|
|
293
|
-
//
|
|
294
|
-
//
|
|
295
|
-
if (
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
);
|
|
249
|
+
// ── Memory retrospective triggers (all tiers) ─────────────────────
|
|
250
|
+
// The retrospective is a focused,
|
|
251
|
+
// memory-only pass that re-reads messages since its last successful
|
|
252
|
+
// run and saves what the in-conversation `remember` calls didn't
|
|
253
|
+
// capture. Triggers (interval / message_count) are evaluated by
|
|
254
|
+
// `maybeEnqueueRetrospective`, which also enforces the per-conversation
|
|
255
|
+
// cooldown gate against retry storms. Recursion guards skip auto-analysis
|
|
256
|
+
// conversations and the memory-retrospective background conversation
|
|
257
|
+
// itself.
|
|
258
|
+
if (
|
|
259
|
+
!isAutoAnalysisSource &&
|
|
260
|
+
triggerConfig != null &&
|
|
261
|
+
!isMemoryRetrospectiveConversation(input.conversationId)
|
|
262
|
+
) {
|
|
263
|
+
maybeEnqueueRetrospective(input.conversationId, triggerConfig);
|
|
301
264
|
}
|
|
302
265
|
}
|
|
303
266
|
|
|
@@ -354,6 +317,100 @@ export async function indexMessageNow(
|
|
|
354
317
|
};
|
|
355
318
|
}
|
|
356
319
|
|
|
320
|
+
// ── V1 index-time triggers — delete with v1 ───────────────────────
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* V1 extraction/summarization triggers; run only when the legacy graph engine
|
|
324
|
+
* is the live tier (`isMemoryV1Active` — under the substrate, and with memory
|
|
325
|
+
* off, the v1 graph and `memorySummaries` would be stale data nobody consumes,
|
|
326
|
+
* and pending-count tracking is suppressed too so a later switch back to v1
|
|
327
|
+
* does not fire an immediate batch from counts accumulated in the meantime).
|
|
328
|
+
*
|
|
329
|
+
* Tracks the per-conversation pending-message count to debounce the
|
|
330
|
+
* `graph_extract` batch job, and debounces the conversation-summary build
|
|
331
|
+
* that feeds the v1 graph retrieval pipeline (fetchRecentSummaries, semantic
|
|
332
|
+
* search).
|
|
333
|
+
*
|
|
334
|
+
* `isAutoAnalysisSource` suppresses only the graph-extraction arm — summaries
|
|
335
|
+
* compress the whole conversation and build for auto-analysis conversations
|
|
336
|
+
* too.
|
|
337
|
+
*/
|
|
338
|
+
function enqueueV1IndexTriggers(
|
|
339
|
+
conversationId: string,
|
|
340
|
+
isAutoAnalysisSource: boolean,
|
|
341
|
+
batchSize: number,
|
|
342
|
+
idleTimeoutMs: number,
|
|
343
|
+
): void {
|
|
344
|
+
if (!isAutoAnalysisSource) {
|
|
345
|
+
const graphPendingKey = `graph_extract:${conversationId}:pending_count`;
|
|
346
|
+
const graphCurrentVal = getMemoryCheckpoint(graphPendingKey);
|
|
347
|
+
const graphPendingCount =
|
|
348
|
+
(graphCurrentVal ? parseInt(graphCurrentVal, 10) : 0) + 1;
|
|
349
|
+
setMemoryCheckpoint(graphPendingKey, String(graphPendingCount));
|
|
350
|
+
|
|
351
|
+
const graphBatchFired = graphPendingCount >= batchSize;
|
|
352
|
+
if (graphBatchFired) {
|
|
353
|
+
setMemoryCheckpoint(graphPendingKey, "0");
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// Single pending `graph_extract` row per conversation. If the
|
|
357
|
+
// batch threshold just fired, pull `runAfter` back to now so the
|
|
358
|
+
// job runs immediately; otherwise debounce by the idle timeout.
|
|
359
|
+
// Routing both paths through `upsertDebouncedJob` ensures the
|
|
360
|
+
// row's `runAfter` reflects whichever trigger ran last, so a
|
|
361
|
+
// batch crossing always takes effect immediately.
|
|
362
|
+
const extractRunAfter = graphBatchFired
|
|
363
|
+
? Date.now()
|
|
364
|
+
: Date.now() + idleTimeoutMs;
|
|
365
|
+
if (isMemoryEnabled()) {
|
|
366
|
+
upsertDebouncedJob("graph_extract", { conversationId }, extractRunAfter);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Conversation summarization. Stale v1 rows are short-circuited at
|
|
371
|
+
// dispatch in jobs-worker.ts. Debounced on the same idle timeout — no
|
|
372
|
+
// threshold trigger needed since summaries compress the whole
|
|
373
|
+
// conversation, not incremental batches.
|
|
374
|
+
if (isMemoryEnabled()) {
|
|
375
|
+
upsertDebouncedJob(
|
|
376
|
+
"build_conversation_summary",
|
|
377
|
+
{ conversationId },
|
|
378
|
+
Date.now() + idleTimeoutMs,
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// ── SUBSTRATE (v2+v3) index-time triggers ─────────────────────────
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Substrate index-time trigger; runs while concept-page memory is active.
|
|
387
|
+
* When `sweep_enabled` is set, every extraction trigger debounces a
|
|
388
|
+
* `memory_v2_sweep`. The sweep itself reads recent messages globally, so the
|
|
389
|
+
* `conversationId` here is just the dedup key — one pending row per active
|
|
390
|
+
* conversation. `sweep_enabled` defaults to false because `remember()` is
|
|
391
|
+
* the primary capture path; the sweep is opt-in.
|
|
392
|
+
*
|
|
393
|
+
* `isAutoAnalysisSource` is the same recursion guard the v1 arm applies: the
|
|
394
|
+
* analysis agent writes memory directly, so its output is never swept.
|
|
395
|
+
*/
|
|
396
|
+
function enqueueSubstrateIndexTriggers(
|
|
397
|
+
conversationId: string,
|
|
398
|
+
conceptConfig: ReturnType<typeof getConfig>,
|
|
399
|
+
isAutoAnalysisSource: boolean,
|
|
400
|
+
idleTimeoutMs: number,
|
|
401
|
+
): void {
|
|
402
|
+
if (isAutoAnalysisSource) {
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (resolveSubstrateTuning(conceptConfig.memory).sweep_enabled) {
|
|
406
|
+
upsertDebouncedJob(
|
|
407
|
+
"memory_v2_sweep",
|
|
408
|
+
{ conversationId },
|
|
409
|
+
Date.now() + idleTimeoutMs,
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
357
414
|
export function enqueueBackfillJob(force = false): string {
|
|
358
415
|
if (!isMemoryEnabled()) {
|
|
359
416
|
return "";
|