@vellumai/assistant 0.10.12 → 0.11.0-staging.1
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 +246 -10
- 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__/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-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- 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__/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__/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 +6 -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 +583 -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-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 +399 -0
- 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/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +158 -4
- 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 +156 -58
- 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/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/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -30
- 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-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 +4 -4
- 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 +13 -13
- 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-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 +218 -422
- 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 +650 -333
- 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 +85 -9
- package/src/permissions/checker.ts +17 -22
- 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 +236 -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/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/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +7 -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/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/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/upgrade-broadcast-routes.ts +4 -5
- 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__/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/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/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/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/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
|
@@ -12,18 +12,11 @@
|
|
|
12
12
|
// + c_user · α · r_norm(User_{t+1}, n) [n ∈ topK]
|
|
13
13
|
// + c_assistant · α · r_norm(Assistant_t, n) [n ∈ topK]
|
|
14
14
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
// Edges are directed: edge A→B means A's activation contributes to B's. The
|
|
21
|
-
// per-target BFS walks *incoming* adjacency, so `in1(n)` is the set of nodes
|
|
22
|
-
// with an edge A→n and `in2(n)` adds another hop in the same direction.
|
|
23
|
-
//
|
|
24
|
-
// Bounded in [0, 1]. Pure sources (no incoming edges within `hops`) reduce to
|
|
25
|
-
// A == A_o because both numerator and denominator collapse to `A_o(n)` and
|
|
26
|
-
// `1`, respectively.
|
|
15
|
+
// The spread step that turns A_o into the final A(n, t+1) lives in the
|
|
16
|
+
// substrate (`substrate/spread.ts` — `spreadActivation`) because the `memory`
|
|
17
|
+
// recall source also spreads activation under v3. Callers import it from there
|
|
18
|
+
// directly; this module deliberately does not re-export it, so the symbol has
|
|
19
|
+
// one import path.
|
|
27
20
|
//
|
|
28
21
|
// Candidate selection (§6) keeps the per-turn cost linear in the size of the
|
|
29
22
|
// active set rather than the entire concept-page collection. The candidate
|
|
@@ -38,14 +31,10 @@ import type { AssistantConfig } from "../../../../config/types.js";
|
|
|
38
31
|
import { isEmbeddingDimensionAvailable } from "../../../../persistence/embeddings/embedding-backend.js";
|
|
39
32
|
import { applyCorrectionIfCalibrated } from "../anisotropy.js";
|
|
40
33
|
import { embedWithBackend } from "../embeddings.js";
|
|
41
|
-
import
|
|
42
|
-
import {
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import type {
|
|
46
|
-
ActivationState,
|
|
47
|
-
EverInjectedEntry,
|
|
48
|
-
} from "../v3/substrate/types.js";
|
|
34
|
+
import { hybridQueryConceptPages } from "../substrate/qdrant.js";
|
|
35
|
+
import { simBatch } from "../substrate/sim.js";
|
|
36
|
+
import { generateBm25QueryEmbedding } from "../substrate/sparse-bm25.js";
|
|
37
|
+
import type { ActivationState, EverInjectedEntry } from "../substrate/types.js";
|
|
49
38
|
import { clampUnitInterval } from "../validation.js";
|
|
50
39
|
import { rerankCandidates } from "./reranker.js";
|
|
51
40
|
|
|
@@ -121,7 +110,9 @@ export async function selectCandidates(
|
|
|
121
110
|
if (priorState) {
|
|
122
111
|
const epsilon = config.memory.v2.epsilon;
|
|
123
112
|
for (const [slug, activation] of Object.entries(priorState.state)) {
|
|
124
|
-
if (activation > epsilon)
|
|
113
|
+
if (activation > epsilon) {
|
|
114
|
+
fromPrior.add(slug);
|
|
115
|
+
}
|
|
125
116
|
}
|
|
126
117
|
}
|
|
127
118
|
|
|
@@ -157,7 +148,9 @@ export async function selectCandidates(
|
|
|
157
148
|
const limit =
|
|
158
149
|
config.memory.v2.ann_candidate_limit ?? UNLIMITED_ANN_CANDIDATE_LIMIT;
|
|
159
150
|
const hits = await hybridQueryConceptPages(dense, sparse, limit);
|
|
160
|
-
for (const hit of hits)
|
|
151
|
+
for (const hit of hits) {
|
|
152
|
+
fromAnn.add(hit.slug);
|
|
153
|
+
}
|
|
161
154
|
}
|
|
162
155
|
|
|
163
156
|
const candidates = new Set<string>([...fromPrior, ...fromAnn]);
|
|
@@ -243,7 +236,9 @@ export async function computeOwnActivation(
|
|
|
243
236
|
|
|
244
237
|
const activation = new Map<string, number>();
|
|
245
238
|
const breakdown = new Map<string, OwnActivationBreakdown>();
|
|
246
|
-
if (candidates.size === 0)
|
|
239
|
+
if (candidates.size === 0) {
|
|
240
|
+
return { activation, breakdown };
|
|
241
|
+
}
|
|
247
242
|
|
|
248
243
|
const { d, c_user, c_assistant, c_now } = config.memory.v2;
|
|
249
244
|
const slugList = [...candidates];
|
|
@@ -358,12 +353,18 @@ function normalizeRerankScores(
|
|
|
358
353
|
alpha: number,
|
|
359
354
|
): Map<string, number> {
|
|
360
355
|
const out = new Map<string, number>();
|
|
361
|
-
if (rawScores.size === 0)
|
|
356
|
+
if (rawScores.size === 0) {
|
|
357
|
+
return out;
|
|
358
|
+
}
|
|
362
359
|
let maxScore = 0;
|
|
363
360
|
for (const v of rawScores.values()) {
|
|
364
|
-
if (v > maxScore)
|
|
361
|
+
if (v > maxScore) {
|
|
362
|
+
maxScore = v;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
if (maxScore === 0) {
|
|
366
|
+
return out;
|
|
365
367
|
}
|
|
366
|
-
if (maxScore === 0) return out;
|
|
367
368
|
for (const [slug, raw] of rawScores) {
|
|
368
369
|
out.set(slug, alpha * (raw / maxScore));
|
|
369
370
|
}
|
|
@@ -376,142 +377,6 @@ function throwIfAborted(signal: AbortSignal | undefined): void {
|
|
|
376
377
|
}
|
|
377
378
|
}
|
|
378
379
|
|
|
379
|
-
// ---------------------------------------------------------------------------
|
|
380
|
-
// Spreading activation
|
|
381
|
-
// ---------------------------------------------------------------------------
|
|
382
|
-
|
|
383
|
-
interface SpreadActivationResult {
|
|
384
|
-
/** Final activation value per slug after spreading. */
|
|
385
|
-
final: Map<string, number>;
|
|
386
|
-
/**
|
|
387
|
-
* Per-slug spread delta: `final[slug] - own[slug]`. Captures how much
|
|
388
|
-
* the spread step nudged each node above (or below) its own activation —
|
|
389
|
-
* useful for inspector views that want to show graph contributions
|
|
390
|
-
* separate from raw sim contributions. Always 0 when `hops == 0` or
|
|
391
|
-
* `k == 0` because both short-circuit to `final == own`.
|
|
392
|
-
*/
|
|
393
|
-
contribution: Map<string, number>;
|
|
394
|
-
}
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Apply 2-hop spreading activation with neighborhood normalization. Edges are
|
|
398
|
-
* directed: an edge A→B means A's activation contributes to B's final value.
|
|
399
|
-
*
|
|
400
|
-
* A(n) = [ A_o(n) + Σ_{r: |active_inR(n)| > 0} k^r · L2(active_inR(n)) ]
|
|
401
|
-
* / [ 1 + Σ_{r: |active_inR(n)| > 0} k^r ]
|
|
402
|
-
*
|
|
403
|
-
* `active_inR(n)` is the subset of structural predecessors at hop `r` that
|
|
404
|
-
* also appear in `ownActivation` (i.e. made the candidate set). `L2(.)` is
|
|
405
|
-
* the quadratic mean √(mean(A_o²)) — a mild bias toward strong outliers
|
|
406
|
-
* compared to the arithmetic mean, without letting a single high-cosine
|
|
407
|
-
* predecessor dominate the way `max` would.
|
|
408
|
-
*
|
|
409
|
-
* Hops with **no** active predecessors are dropped from BOTH numerator and
|
|
410
|
-
* denominator so a high-in-degree hub with mostly-inactive neighbors stays
|
|
411
|
-
* near `A_o` instead of being crushed by the structural count. A pure
|
|
412
|
-
* source (no incoming edges, or every edge points at a non-candidate)
|
|
413
|
-
* collapses to `A == A_o`.
|
|
414
|
-
*
|
|
415
|
-
* Bounded in [0, 1]: every `L2` term ≤ max active A_o ≤ 1, so the numerator
|
|
416
|
-
* is at most `1 + Σ k^r` — exactly the denominator — so the ratio is at most
|
|
417
|
-
* 1. `clampUnitInterval` guards against numerical drift and out-of-range
|
|
418
|
-
* inputs.
|
|
419
|
-
*
|
|
420
|
-
* Pure function — no I/O. Reads the precomputed `incoming` map from
|
|
421
|
-
* `edgeIndex` and runs a per-source BFS bounded by `hops`.
|
|
422
|
-
*/
|
|
423
|
-
export function spreadActivation(
|
|
424
|
-
ownActivation: ReadonlyMap<string, number>,
|
|
425
|
-
edgeIndex: EdgeIndex,
|
|
426
|
-
k: number,
|
|
427
|
-
hops: number,
|
|
428
|
-
): SpreadActivationResult {
|
|
429
|
-
const final = new Map<string, number>();
|
|
430
|
-
const contribution = new Map<string, number>();
|
|
431
|
-
if (ownActivation.size === 0) return { final, contribution };
|
|
432
|
-
|
|
433
|
-
// Short-circuit: with no spread the formula collapses to A == A_o.
|
|
434
|
-
if (hops <= 0 || k <= 0) {
|
|
435
|
-
for (const [slug, ownValue] of ownActivation) {
|
|
436
|
-
final.set(slug, clampUnitInterval(ownValue));
|
|
437
|
-
contribution.set(slug, 0);
|
|
438
|
-
}
|
|
439
|
-
return { final, contribution };
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
for (const [slug, ownValue] of ownActivation) {
|
|
443
|
-
// Single bounded BFS from `slug` over incoming edges. `distance` maps
|
|
444
|
-
// predecessor → hop count (1..hops). Source is excluded so it contributes
|
|
445
|
-
// hop-0 only via `numerator = ownValue`.
|
|
446
|
-
const distance = bfsPredecessorDistances(edgeIndex.incoming, slug, hops);
|
|
447
|
-
|
|
448
|
-
// Bucket only predecessors that are in `ownActivation` (the candidate
|
|
449
|
-
// set). Structural predecessors that didn't make the cut contribute
|
|
450
|
-
// nothing — neither to the numerator nor the denominator — so hub
|
|
451
|
-
// in-degree alone never penalizes a node.
|
|
452
|
-
const ringActiveCounts: number[] = new Array(hops + 1).fill(0);
|
|
453
|
-
const ringSquareSums: number[] = new Array(hops + 1).fill(0);
|
|
454
|
-
for (const [predecessor, hop] of distance) {
|
|
455
|
-
const predValue = ownActivation.get(predecessor);
|
|
456
|
-
if (predValue === undefined) continue;
|
|
457
|
-
ringActiveCounts[hop] += 1;
|
|
458
|
-
ringSquareSums[hop] += predValue * predValue;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
let numerator = ownValue;
|
|
462
|
-
let denominator = 1;
|
|
463
|
-
let kPow = 1;
|
|
464
|
-
for (let r = 1; r <= hops; r++) {
|
|
465
|
-
kPow *= k;
|
|
466
|
-
if (ringActiveCounts[r] === 0) continue;
|
|
467
|
-
const rms = Math.sqrt(ringSquareSums[r] / ringActiveCounts[r]);
|
|
468
|
-
numerator += kPow * rms;
|
|
469
|
-
denominator += kPow;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
const finalValue = clampUnitInterval(numerator / denominator);
|
|
473
|
-
final.set(slug, finalValue);
|
|
474
|
-
contribution.set(slug, finalValue - ownValue);
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
return { final, contribution };
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
// ---------------------------------------------------------------------------
|
|
481
|
-
// Internal helpers
|
|
482
|
-
// ---------------------------------------------------------------------------
|
|
483
|
-
|
|
484
|
-
/**
|
|
485
|
-
* Bounded BFS over the *incoming* adjacency map. Returns each reachable
|
|
486
|
-
* predecessor's hop-distance in [1, maxHops] from `target` — i.e. nodes from
|
|
487
|
-
* which a directed path of that length leads into `target`. The target itself
|
|
488
|
-
* is excluded.
|
|
489
|
-
*/
|
|
490
|
-
function bfsPredecessorDistances(
|
|
491
|
-
incoming: ReadonlyMap<string, ReadonlySet<string>>,
|
|
492
|
-
target: string,
|
|
493
|
-
maxHops: number,
|
|
494
|
-
): Map<string, number> {
|
|
495
|
-
const distance = new Map<string, number>();
|
|
496
|
-
let frontier: string[] = [target];
|
|
497
|
-
const visited = new Set<string>([target]);
|
|
498
|
-
for (let hop = 1; hop <= maxHops && frontier.length > 0; hop++) {
|
|
499
|
-
const next: string[] = [];
|
|
500
|
-
for (const node of frontier) {
|
|
501
|
-
const predecessors = incoming.get(node);
|
|
502
|
-
if (!predecessors) continue;
|
|
503
|
-
for (const predecessor of predecessors) {
|
|
504
|
-
if (visited.has(predecessor)) continue;
|
|
505
|
-
visited.add(predecessor);
|
|
506
|
-
distance.set(predecessor, hop);
|
|
507
|
-
next.push(predecessor);
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
frontier = next;
|
|
511
|
-
}
|
|
512
|
-
return distance;
|
|
513
|
-
}
|
|
514
|
-
|
|
515
380
|
// ---------------------------------------------------------------------------
|
|
516
381
|
// Injection selection
|
|
517
382
|
// ---------------------------------------------------------------------------
|
|
@@ -549,7 +414,9 @@ export function selectInjections(
|
|
|
549
414
|
}
|
|
550
415
|
|
|
551
416
|
const ranked = [...A.entries()].sort(([slugA, valA], [slugB, valB]) => {
|
|
552
|
-
if (valB !== valA)
|
|
417
|
+
if (valB !== valA) {
|
|
418
|
+
return valB - valA;
|
|
419
|
+
} // higher activation first
|
|
553
420
|
return slugA < slugB ? -1 : slugA > slugB ? 1 : 0; // stable tie-break
|
|
554
421
|
});
|
|
555
422
|
|
|
@@ -2,21 +2,18 @@
|
|
|
2
2
|
// Memory v2 — Backfill job handlers
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
//
|
|
5
|
-
//
|
|
5
|
+
// Two operator-triggered v2 backfills, wired through the same job queue so
|
|
6
6
|
// they can be enqueued from the IPC route, the CLI, or recovery paths:
|
|
7
7
|
//
|
|
8
8
|
// - `memory_v2_migrate` — one-shot v1→v2 synthesis (PR 16).
|
|
9
|
-
// - `memory_v2_reembed` — fan out an `embed_concept_page` job
|
|
10
|
-
// per concept-page slug.
|
|
11
9
|
// - `memory_v2_activation_recompute` — recompute persisted activation
|
|
12
10
|
// state for every conversation, no rendering. Used after consolidation
|
|
13
11
|
// replaces or deletes pages that other conversations still reference.
|
|
14
12
|
//
|
|
15
13
|
// Each handler is intentionally small — heavy lifting lives in the modules
|
|
16
|
-
// they delegate to (`migration.ts`, `
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
// a backfill kicks them off.
|
|
14
|
+
// they delegate to (`migration.ts`, `activation.ts`, `activation-store.ts`).
|
|
15
|
+
// Keeping the wrappers thin means the same code paths exercised by tests of
|
|
16
|
+
// those modules run unchanged when a backfill kicks them off.
|
|
20
17
|
|
|
21
18
|
import {
|
|
22
19
|
getMessages,
|
|
@@ -27,16 +24,11 @@ import {
|
|
|
27
24
|
import type { AssistantConfig } from "../../../../config/types.js";
|
|
28
25
|
import { getMemoryDb } from "../../../../persistence/db-connection.js";
|
|
29
26
|
import type { MemoryJob } from "../../../../persistence/jobs-store.js";
|
|
30
|
-
import { enqueueEmbedConceptPageJob } from "../jobs/embed-concept-page.js";
|
|
31
27
|
import { getLogger } from "../logging.js";
|
|
32
28
|
import { getWorkspaceDir } from "../paths.js";
|
|
33
|
-
import { getEdgeIndex } from "../
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
computeOwnActivation,
|
|
37
|
-
selectCandidates,
|
|
38
|
-
spreadActivation,
|
|
39
|
-
} from "./activation.js";
|
|
29
|
+
import { getEdgeIndex } from "../substrate/edge-index.js";
|
|
30
|
+
import { spreadActivation } from "../substrate/spread.js";
|
|
31
|
+
import { computeOwnActivation, selectCandidates } from "./activation.js";
|
|
40
32
|
import { hydrate, save } from "./activation-store.js";
|
|
41
33
|
import {
|
|
42
34
|
MigrationAlreadyAppliedError,
|
|
@@ -101,45 +93,6 @@ export async function memoryV2MigrateJob(
|
|
|
101
93
|
}
|
|
102
94
|
}
|
|
103
95
|
|
|
104
|
-
// ---------------------------------------------------------------------------
|
|
105
|
-
// memory_v2_reembed — fan out embed jobs for every concept page
|
|
106
|
-
// ---------------------------------------------------------------------------
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Job handler: enqueue an `embed_concept_page` job per concept-page slug.
|
|
110
|
-
* Each enqueue coalesces with an already-pending job for the same slug, so
|
|
111
|
-
* stacked reembed runs converge on at most one pending embed per page.
|
|
112
|
-
*
|
|
113
|
-
* Returns the number of pages fanned out (enqueue attempts, not necessarily
|
|
114
|
-
* fresh rows). Callers (and tests) use the return value to assert progress
|
|
115
|
-
* without inspecting the job table directly.
|
|
116
|
-
*
|
|
117
|
-
* Note on meta files: `essentials.md` / `threads.md` / `recent.md` /
|
|
118
|
-
* `buffer.md` are direct-injected into the system prompt every turn via
|
|
119
|
-
* `_autoinject.md`. They are NOT enqueued for embedding here — their slugs
|
|
120
|
-
* (`__essentials__` etc.) contain underscores that the concept-page slug
|
|
121
|
-
* validator rejects (`[a-z0-9][a-z0-9-]*`), and they live at `memory/<name>.md`
|
|
122
|
-
* rather than `memory/concepts/<name>.md`, so path resolution would also miss.
|
|
123
|
-
* Embedding them would be redundant with the direct injection regardless.
|
|
124
|
-
*/
|
|
125
|
-
export async function memoryV2ReembedJob(
|
|
126
|
-
_job: MemoryJob,
|
|
127
|
-
_config: AssistantConfig,
|
|
128
|
-
): Promise<number> {
|
|
129
|
-
const workspaceDir = getWorkspaceDir();
|
|
130
|
-
const slugs = await listPages(workspaceDir);
|
|
131
|
-
|
|
132
|
-
for (const slug of slugs) {
|
|
133
|
-
enqueueEmbedConceptPageJob({ slug });
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
log.info(
|
|
137
|
-
{ conceptPages: slugs.length, total: slugs.length },
|
|
138
|
-
"Memory v2 reembed enqueued",
|
|
139
|
-
);
|
|
140
|
-
return slugs.length;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
96
|
// ---------------------------------------------------------------------------
|
|
144
97
|
// memory_v2_activation_recompute — refresh persisted activation state
|
|
145
98
|
// ---------------------------------------------------------------------------
|
package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts}
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { memorySqliteOrNull } from "
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
1
|
+
import { memorySqliteOrNull } from "../memory-db.js";
|
|
2
|
+
import { listPages } from "../substrate/page-store.js";
|
|
3
|
+
import type { MemoryV2ConceptRowRecord } from "./activation-log-store.js";
|
|
4
4
|
|
|
5
5
|
type ConceptStatus = MemoryV2ConceptRowRecord["status"];
|
|
6
6
|
|
|
@@ -23,7 +23,7 @@ import { memorySqliteOrNull } from "../../memory-db.js";
|
|
|
23
23
|
import type {
|
|
24
24
|
MemoryV2ConceptRowRecord,
|
|
25
25
|
MemoryV2ConfigSnapshot,
|
|
26
|
-
} from "
|
|
26
|
+
} from "../activation-log-store.js";
|
|
27
27
|
|
|
28
28
|
export interface OracleTurn {
|
|
29
29
|
conversationId: string;
|
|
@@ -27,8 +27,8 @@ import type { AssistantConfig } from "../../../../../config/types.js";
|
|
|
27
27
|
import type { DrizzleDb } from "../../../../../persistence/db-connection.js";
|
|
28
28
|
import { messages } from "../../../../../persistence/schema/index.js";
|
|
29
29
|
import { memorySqliteOrNull } from "../../memory-db.js";
|
|
30
|
-
import type {
|
|
31
|
-
import type {
|
|
30
|
+
import type { EverInjectedEntry } from "../../substrate/types.js";
|
|
31
|
+
import type { MemoryV2ConceptRowRecord } from "../activation-log-store.js";
|
|
32
32
|
import { loadNowText } from "../now-text.js";
|
|
33
33
|
import type { RouterTurnPair } from "../router.js";
|
|
34
34
|
import type { OracleTurn } from "./oracle.js";
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import type { AssistantConfig } from "../../../../../config/types.js";
|
|
13
|
-
import type { EverInjectedEntry } from "../../
|
|
13
|
+
import type { EverInjectedEntry } from "../../substrate/types.js";
|
|
14
14
|
import type { RouterTurnPair } from "../router.js";
|
|
15
15
|
import type { RetrievalCost } from "./harness-types.js";
|
|
16
16
|
import type { DescentTrace } from "./trace.js";
|
|
@@ -25,32 +25,26 @@
|
|
|
25
25
|
|
|
26
26
|
import type { AssistantConfig } from "../../../../config/types.js";
|
|
27
27
|
import { getLogger } from "../logging.js";
|
|
28
|
-
import {
|
|
29
|
-
type MemoryV2ConceptRowRecord,
|
|
30
|
-
recordMemoryV2ActivationLog,
|
|
31
|
-
} from "../memory-v2-activation-log-store.js";
|
|
32
28
|
import { getWorkspaceDir } from "../paths.js";
|
|
33
29
|
import {
|
|
34
30
|
getCliCommandCapability,
|
|
35
31
|
isCliCommandSlug,
|
|
36
|
-
} from "../
|
|
37
|
-
import { getEdgeIndex } from "../
|
|
38
|
-
import { getPageIndex } from "../
|
|
39
|
-
import { readPage, renderPageContent } from "../
|
|
40
|
-
import {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} from "../v3/substrate/skill-store.js";
|
|
44
|
-
import type {
|
|
45
|
-
ActivationState,
|
|
46
|
-
EverInjectedEntry,
|
|
47
|
-
} from "../v3/substrate/types.js";
|
|
32
|
+
} from "../substrate/cli-command-store.js";
|
|
33
|
+
import { getEdgeIndex } from "../substrate/edge-index.js";
|
|
34
|
+
import { getPageIndex } from "../substrate/page-index.js";
|
|
35
|
+
import { readPage, renderPageContent } from "../substrate/page-store.js";
|
|
36
|
+
import { getSkillCapability, isSkillSlug } from "../substrate/skill-store.js";
|
|
37
|
+
import { spreadActivation } from "../substrate/spread.js";
|
|
38
|
+
import type { ActivationState, EverInjectedEntry } from "../substrate/types.js";
|
|
48
39
|
import {
|
|
49
40
|
computeOwnActivation,
|
|
50
41
|
selectCandidates,
|
|
51
42
|
selectInjections,
|
|
52
|
-
spreadActivation,
|
|
53
43
|
} from "./activation.js";
|
|
44
|
+
import {
|
|
45
|
+
type MemoryV2ConceptRowRecord,
|
|
46
|
+
recordMemoryV2ActivationLog,
|
|
47
|
+
} from "./activation-log-store.js";
|
|
54
48
|
import { hydrate, save } from "./activation-store.js";
|
|
55
49
|
import { recordInjectionEvents } from "./injection-events.js";
|
|
56
50
|
import { type RouterTurnPair, runRouter } from "./router.js";
|
|
@@ -253,7 +247,9 @@ export async function injectMemoryV2Block(
|
|
|
253
247
|
// slugs drop out of consideration next turn.
|
|
254
248
|
const nextStateMap: Record<string, number> = {};
|
|
255
249
|
for (const [slug, value] of finalActivation) {
|
|
256
|
-
if (value > epsilon)
|
|
250
|
+
if (value > epsilon) {
|
|
251
|
+
nextStateMap[slug] = value;
|
|
252
|
+
}
|
|
257
253
|
}
|
|
258
254
|
|
|
259
255
|
// Build the rich per-candidate telemetry rows up front (status assigned
|
|
@@ -506,7 +502,9 @@ async function finalizeInjection(args: {
|
|
|
506
502
|
}
|
|
507
503
|
}
|
|
508
504
|
|
|
509
|
-
if (caughtErr !== undefined && !args.bestEffort)
|
|
505
|
+
if (caughtErr !== undefined && !args.bestEffort) {
|
|
506
|
+
throw caughtErr;
|
|
507
|
+
}
|
|
510
508
|
return { block, toInject: newlyInjected };
|
|
511
509
|
}
|
|
512
510
|
|
|
@@ -673,7 +671,9 @@ async function injectViaRouter(args: {
|
|
|
673
671
|
// `source: "carry_over"`. The `status` placeholder is overwritten by
|
|
674
672
|
// `finalizeInjection`.
|
|
675
673
|
const telemetrySlugs = new Set<string>(routerResult.selectedSlugs);
|
|
676
|
-
for (const entry of priorEverInjected)
|
|
674
|
+
for (const entry of priorEverInjected) {
|
|
675
|
+
telemetrySlugs.add(entry.slug);
|
|
676
|
+
}
|
|
677
677
|
const telemetryRows: MemoryV2ConceptRowRecord[] = [...telemetrySlugs].map(
|
|
678
678
|
(slug) => ({
|
|
679
679
|
slug,
|
|
@@ -846,9 +846,13 @@ async function renderInjectionBlock(
|
|
|
846
846
|
const skillSlugs: string[] = [];
|
|
847
847
|
const cliCommandSlugs: string[] = [];
|
|
848
848
|
for (const slug of slugs) {
|
|
849
|
-
if (isSkillSlug(slug))
|
|
850
|
-
|
|
851
|
-
else
|
|
849
|
+
if (isSkillSlug(slug)) {
|
|
850
|
+
skillSlugs.push(slug);
|
|
851
|
+
} else if (isCliCommandSlug(slug)) {
|
|
852
|
+
cliCommandSlugs.push(slug);
|
|
853
|
+
} else {
|
|
854
|
+
conceptSlugs.push(slug);
|
|
855
|
+
}
|
|
852
856
|
}
|
|
853
857
|
|
|
854
858
|
const settled = await Promise.allSettled(
|
|
@@ -886,14 +890,18 @@ async function renderInjectionBlock(
|
|
|
886
890
|
// empty). Render the full page — frontmatter + body — so retrieval
|
|
887
891
|
// still surfaces the same content the agent saw before this change.
|
|
888
892
|
const content = renderPageContent(page).trim();
|
|
889
|
-
if (content.length === 0)
|
|
893
|
+
if (content.length === 0) {
|
|
894
|
+
continue;
|
|
895
|
+
}
|
|
890
896
|
sections.push(`# ${path}\n${content}`);
|
|
891
897
|
}
|
|
892
898
|
|
|
893
899
|
const skillLines: string[] = [];
|
|
894
900
|
for (const slug of skillSlugs) {
|
|
895
901
|
const entry = getSkillCapability(slug);
|
|
896
|
-
if (!entry)
|
|
902
|
+
if (!entry) {
|
|
903
|
+
continue;
|
|
904
|
+
}
|
|
897
905
|
skillLines.push(`- ${entry.content} → use skill_load to activate`);
|
|
898
906
|
}
|
|
899
907
|
if (skillLines.length > 0) {
|
|
@@ -903,7 +911,9 @@ async function renderInjectionBlock(
|
|
|
903
911
|
const cliCommandLines: string[] = [];
|
|
904
912
|
for (const slug of cliCommandSlugs) {
|
|
905
913
|
const entry = getCliCommandCapability(slug);
|
|
906
|
-
if (!entry)
|
|
914
|
+
if (!entry) {
|
|
915
|
+
continue;
|
|
916
|
+
}
|
|
907
917
|
cliCommandLines.push(`- \`assistant ${entry.id}\`: ${entry.description}`);
|
|
908
918
|
}
|
|
909
919
|
if (cliCommandLines.length > 0) {
|
|
@@ -37,8 +37,8 @@ import {
|
|
|
37
37
|
listPages,
|
|
38
38
|
slugify,
|
|
39
39
|
writePage,
|
|
40
|
-
} from "../
|
|
41
|
-
import type { ConceptPage } from "../
|
|
40
|
+
} from "../substrate/page-store.js";
|
|
41
|
+
import type { ConceptPage } from "../substrate/types.js";
|
|
42
42
|
|
|
43
43
|
const log = getLogger("memory-v2-migration");
|
|
44
44
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/** Local cross-encoder rerank backend — drives the rerank-worker subprocess. */
|
|
2
2
|
import { existsSync } from "node:fs";
|
|
3
3
|
|
|
4
|
-
import type { RerankDtype } from "
|
|
5
|
-
import { EmbeddingRuntimeManager } from "
|
|
6
|
-
import { PromiseGuard, workerMemoryEnv } from "
|
|
7
|
-
import { getLogger } from "
|
|
8
|
-
import { getEmbeddingModelsDir } from "
|
|
4
|
+
import type { RerankDtype } from "../../../../config/schemas/memory-v2.js";
|
|
5
|
+
import { EmbeddingRuntimeManager } from "../../../../persistence/embeddings/embedding-runtime-manager.js";
|
|
6
|
+
import { PromiseGuard, workerMemoryEnv } from "../host-utils.js";
|
|
7
|
+
import { getLogger } from "../logging.js";
|
|
8
|
+
import { getEmbeddingModelsDir } from "../paths.js";
|
|
9
9
|
|
|
10
10
|
const log = getLogger("memory-rerank-local");
|
|
11
11
|
|
|
@@ -52,7 +52,9 @@ export class LocalRerankBackend {
|
|
|
52
52
|
if (this.disposeRequested) {
|
|
53
53
|
throw new Error("Local rerank backend is shutting down");
|
|
54
54
|
}
|
|
55
|
-
if (passages.length === 0)
|
|
55
|
+
if (passages.length === 0) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
56
58
|
if (queries.length !== passages.length) {
|
|
57
59
|
throw new Error(
|
|
58
60
|
`Rerank backend got ${queries.length} queries for ${passages.length} passages`,
|
|
@@ -107,7 +109,9 @@ export class LocalRerankBackend {
|
|
|
107
109
|
}
|
|
108
110
|
|
|
109
111
|
private async ensureInitialized(): Promise<void> {
|
|
110
|
-
if (this.workerProc)
|
|
112
|
+
if (this.workerProc) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
111
115
|
await this.initGuard.run(() => this.initialize());
|
|
112
116
|
}
|
|
113
117
|
|
|
@@ -203,9 +207,13 @@ export class LocalRerankBackend {
|
|
|
203
207
|
try {
|
|
204
208
|
while (true) {
|
|
205
209
|
const { done, value } = await reader.read();
|
|
206
|
-
if (done)
|
|
210
|
+
if (done) {
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
207
213
|
const text = decoder.decode(value, { stream: true }).trim();
|
|
208
|
-
if (text)
|
|
214
|
+
if (text) {
|
|
215
|
+
log.debug({ workerStderr: text }, "Rerank worker stderr");
|
|
216
|
+
}
|
|
209
217
|
}
|
|
210
218
|
} catch {
|
|
211
219
|
/* expected on shutdown */
|
|
@@ -214,7 +222,9 @@ export class LocalRerankBackend {
|
|
|
214
222
|
}
|
|
215
223
|
|
|
216
224
|
private startStdoutReader(): void {
|
|
217
|
-
if (this.stdoutReaderActive || !this.workerProc)
|
|
225
|
+
if (this.stdoutReaderActive || !this.workerProc) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
218
228
|
this.stdoutReaderActive = true;
|
|
219
229
|
|
|
220
230
|
const proc = this.workerProc;
|
|
@@ -225,7 +235,9 @@ export class LocalRerankBackend {
|
|
|
225
235
|
try {
|
|
226
236
|
while (true) {
|
|
227
237
|
const { done, value } = await reader.read();
|
|
228
|
-
if (done)
|
|
238
|
+
if (done) {
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
229
241
|
this.stdoutBuffer += decoder.decode(value, { stream: true });
|
|
230
242
|
this.processStdoutBuffer();
|
|
231
243
|
}
|
|
@@ -253,7 +265,9 @@ export class LocalRerankBackend {
|
|
|
253
265
|
while ((idx = this.stdoutBuffer.indexOf("\n")) !== -1) {
|
|
254
266
|
const line = this.stdoutBuffer.slice(0, idx);
|
|
255
267
|
this.stdoutBuffer = this.stdoutBuffer.slice(idx + 1);
|
|
256
|
-
if (!line.trim())
|
|
268
|
+
if (!line.trim()) {
|
|
269
|
+
continue;
|
|
270
|
+
}
|
|
257
271
|
|
|
258
272
|
let msg: WorkerResponse;
|
|
259
273
|
try {
|
|
@@ -321,10 +335,18 @@ export class LocalRerankBackend {
|
|
|
321
335
|
}
|
|
322
336
|
|
|
323
337
|
private disposeIfIdle(): void {
|
|
324
|
-
if (!this.disposeRequested)
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
if (this.
|
|
338
|
+
if (!this.disposeRequested) {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
if (this.activeRequests > 0) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
if (this.pendingRequests.size > 0) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
if (this.readyResolve || this.readyReject) {
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
328
350
|
|
|
329
351
|
const proc = this.workerProc;
|
|
330
352
|
this.workerProc = null;
|
|
@@ -332,7 +354,9 @@ export class LocalRerankBackend {
|
|
|
332
354
|
this.stdoutBuffer = "";
|
|
333
355
|
this.initGuard.reset();
|
|
334
356
|
|
|
335
|
-
if (!proc)
|
|
357
|
+
if (!proc) {
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
336
360
|
|
|
337
361
|
try {
|
|
338
362
|
proc.kill();
|
|
@@ -350,7 +374,9 @@ export function getOrCreateRerankBackend(
|
|
|
350
374
|
model: string,
|
|
351
375
|
dtype: RerankDtype,
|
|
352
376
|
): LocalRerankBackend {
|
|
353
|
-
if (_backend?.model === model && _backend.dtype === dtype)
|
|
377
|
+
if (_backend?.model === model && _backend.dtype === dtype) {
|
|
378
|
+
return _backend;
|
|
379
|
+
}
|
|
354
380
|
if (_backend) {
|
|
355
381
|
try {
|
|
356
382
|
_backend.dispose();
|