@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
|
@@ -12,6 +12,15 @@
|
|
|
12
12
|
* before this is kicked off — so the memory handlers are guaranteed to be in the
|
|
13
13
|
* dispatch table before the jobs worker started near the end of this function
|
|
14
14
|
* claims its first job.
|
|
15
|
+
*
|
|
16
|
+
* This is a multi-tier composition point, so the body carries `// ---- ... ----`
|
|
17
|
+
* section labels naming which tier owns each group of steps. The v1 labels also
|
|
18
|
+
* carry the `delete with v1` banner the deletion runbook greps for (see
|
|
19
|
+
* `../AGENTS.md`), so none of the three v1 blocks here can be missed at
|
|
20
|
+
* deletion time. The labels do not form a single contiguous run per tier: the
|
|
21
|
+
* v1 Qdrant collection ensure has to precede the shared embedding-identity
|
|
22
|
+
* reconcile, and the v1 graph bootstrap belongs to the post-worker seeding
|
|
23
|
+
* tail. Steps only move when the move is provably unobservable.
|
|
15
24
|
*/
|
|
16
25
|
|
|
17
26
|
import { join } from "node:path";
|
|
@@ -38,15 +47,20 @@ import { resolveQdrantUrl } from "./embeddings.js";
|
|
|
38
47
|
import { startMemoryJobsWorker } from "./jobs-worker.js";
|
|
39
48
|
import { getLogger } from "./logging.js";
|
|
40
49
|
import { getWorkspaceDir } from "./paths.js";
|
|
41
|
-
|
|
50
|
+
// ---- substrate (v2+v3) ---- the only tier-owned static import group here;
|
|
51
|
+
// the v1 steps reach their modules through dynamic `./v1/*` imports so the
|
|
52
|
+
// legacy engine loads only on the tier that runs it.
|
|
42
53
|
import {
|
|
43
|
-
|
|
54
|
+
maybeRebuildConceptCollection,
|
|
44
55
|
rebuildBm25CorpusStatsAndReseedSkills,
|
|
45
|
-
} from "./
|
|
56
|
+
} from "./substrate/boot-maintenance.js";
|
|
57
|
+
import { sweepConceptPageFrontmatter } from "./substrate/frontmatter-sweep.js";
|
|
46
58
|
|
|
47
59
|
const log = getLogger("memory-startup");
|
|
48
60
|
|
|
49
61
|
export async function runMemoryStartup(config: AssistantConfig): Promise<void> {
|
|
62
|
+
// ---- shared infra ----
|
|
63
|
+
// Boot the Qdrant process every tier's vector work sits on.
|
|
50
64
|
const qdrantUrl = resolveQdrantUrl();
|
|
51
65
|
log.info({ qdrantUrl }, "Daemon startup: initializing Qdrant");
|
|
52
66
|
const manager = createQdrantManager({ url: qdrantUrl });
|
|
@@ -80,6 +94,13 @@ export async function runMemoryStartup(config: AssistantConfig): Promise<void> {
|
|
|
80
94
|
}
|
|
81
95
|
|
|
82
96
|
if (qdrantStarted) {
|
|
97
|
+
// ---- v1 (legacy engine) — delete with v1 ----
|
|
98
|
+
// Stays ahead of the shared embedding-identity reconcile below: that
|
|
99
|
+
// reconcile persists a new `memory.qdrant.vectorSize` on a commit-fresh or
|
|
100
|
+
// migrate action, and the v1 client must have been constructed at the
|
|
101
|
+
// dimension it owns before that happens (see `daemon/embedding-reconcile.ts`,
|
|
102
|
+
// which skips itself entirely on a v2-disabled install for the same reason).
|
|
103
|
+
//
|
|
83
104
|
// Skip the v1 Qdrant collection lifecycle when concept-page memory is
|
|
84
105
|
// active — the v1 collection has no writers or readers (graph search is
|
|
85
106
|
// bypassed) in that state, so ensuring/migrating it just maintains a
|
|
@@ -128,6 +149,7 @@ export async function runMemoryStartup(config: AssistantConfig): Promise<void> {
|
|
|
128
149
|
}
|
|
129
150
|
}
|
|
130
151
|
|
|
152
|
+
// ---- shared infra ----
|
|
131
153
|
// Initialize the messages lexical index — a dedicated sparse-only Qdrant
|
|
132
154
|
// collection that is the lexical (BM25-style) replacement for SQLite FTS5
|
|
133
155
|
// over message content. Independent of the v1 dense collection lifecycle
|
|
@@ -161,31 +183,24 @@ export async function runMemoryStartup(config: AssistantConfig): Promise<void> {
|
|
|
161
183
|
);
|
|
162
184
|
}
|
|
163
185
|
|
|
164
|
-
//
|
|
165
|
-
// pre-#29823 collections lacking summary_dense / summary_sparse) and
|
|
166
|
-
// recreate + enqueue a reembed when needed. Awaited inline so the
|
|
167
|
-
// reembed enqueue happens before the memory worker drains its first
|
|
168
|
-
// batch; the call's own try/catch keeps any v2-side failure from
|
|
169
|
-
// blocking the v1 PKB reconcile or BM25 build below.
|
|
170
|
-
try {
|
|
171
|
-
await maybeRebuildMemoryV2Concepts(config);
|
|
172
|
-
} catch (err) {
|
|
173
|
-
log.warn(
|
|
174
|
-
{ err },
|
|
175
|
-
"Memory v2 collection schema check threw — continuing startup",
|
|
176
|
-
);
|
|
177
|
-
}
|
|
178
|
-
|
|
186
|
+
// ---- v1 (legacy engine) — delete with v1 ----
|
|
179
187
|
// Reconcile the PKB Qdrant index against the on-disk tree. Gated off
|
|
180
188
|
// while concept-page memory is active because PKB is the v1 storage
|
|
181
189
|
// layer; in that state the v1 collection is not initialized, so calling
|
|
182
190
|
// `getQdrantClient()` here would throw. Fire-and-forget so enqueued
|
|
183
191
|
// re-index jobs drain in the background and first-turn latency stays
|
|
184
192
|
// unaffected.
|
|
193
|
+
//
|
|
194
|
+
// Sits ahead of the substrate block purely so each tier's steps are
|
|
195
|
+
// contiguous: the two are mutually exclusive on `usesConceptPageMemory`
|
|
196
|
+
// — every substrate step below re-checks the same predicate and returns
|
|
197
|
+
// immediately when v1 is the live tier — so their relative order is
|
|
198
|
+
// unobservable.
|
|
185
199
|
if (!usesConceptPageMemory(config.memory)) {
|
|
186
200
|
void (async () => {
|
|
187
201
|
try {
|
|
188
|
-
const { reconcilePkbIndex } =
|
|
202
|
+
const { reconcilePkbIndex } =
|
|
203
|
+
await import("./v1/pkb/pkb-reconcile.js");
|
|
189
204
|
const pkbRoot = join(getWorkspaceDir(), "pkb");
|
|
190
205
|
await reconcilePkbIndex(pkbRoot);
|
|
191
206
|
} catch (err) {
|
|
@@ -197,6 +212,22 @@ export async function runMemoryStartup(config: AssistantConfig): Promise<void> {
|
|
|
197
212
|
})();
|
|
198
213
|
}
|
|
199
214
|
|
|
215
|
+
// ---- substrate (v2+v3) ----
|
|
216
|
+
// Detect schema drift on the v2 concept-page collection (e.g.
|
|
217
|
+
// pre-#29823 collections lacking summary_dense / summary_sparse) and
|
|
218
|
+
// recreate + enqueue a reembed when needed. Awaited inline so the
|
|
219
|
+
// reembed enqueue happens before the memory worker drains its first
|
|
220
|
+
// batch; the call's own try/catch keeps any v2-side failure from
|
|
221
|
+
// blocking the BM25 build or the frontmatter sweep below.
|
|
222
|
+
try {
|
|
223
|
+
await maybeRebuildConceptCollection(config);
|
|
224
|
+
} catch (err) {
|
|
225
|
+
log.warn(
|
|
226
|
+
{ err },
|
|
227
|
+
"Memory v2 collection schema check threw — continuing startup",
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
200
231
|
void rebuildBm25CorpusStatsAndReseedSkills(config);
|
|
201
232
|
|
|
202
233
|
try {
|
|
@@ -209,6 +240,7 @@ export async function runMemoryStartup(config: AssistantConfig): Promise<void> {
|
|
|
209
240
|
}
|
|
210
241
|
}
|
|
211
242
|
|
|
243
|
+
// ---- shared infra ----
|
|
212
244
|
// `startMemoryJobsWorker` spawns the out-of-process memory worker as a child
|
|
213
245
|
// of the daemon; it is the sole drainer of the memory job queue. Shutdown
|
|
214
246
|
// stops it — see shutdown-handlers.ts and the memory plugin's `shutdown`
|
|
@@ -218,7 +250,11 @@ export async function runMemoryStartup(config: AssistantConfig): Promise<void> {
|
|
|
218
250
|
log.info("Daemon startup: starting memory worker");
|
|
219
251
|
startMemoryJobsWorker();
|
|
220
252
|
|
|
221
|
-
// Seed capability graph nodes (new memory graph system)
|
|
253
|
+
// Seed capability graph nodes (new memory graph system). All-tier, not v1:
|
|
254
|
+
// `refreshSkillCapabilityMemories` seeds both the graph nodes the
|
|
255
|
+
// `list_memory` surface reads on every tier and the substrate's skill /
|
|
256
|
+
// CLI-command cards, and `capability-seed.ts` self-skips the v1-only
|
|
257
|
+
// `embed_graph_node` enqueues when v1 is not the live tier.
|
|
222
258
|
try {
|
|
223
259
|
const { seedCliGraphNodes } = await import("./graph/capability-seed.js");
|
|
224
260
|
refreshSkillCapabilityMemories(config);
|
|
@@ -227,12 +263,13 @@ export async function runMemoryStartup(config: AssistantConfig): Promise<void> {
|
|
|
227
263
|
log.warn({ err }, "Graph capability seeding failed — continuing");
|
|
228
264
|
}
|
|
229
265
|
|
|
266
|
+
// ---- v1 (legacy engine) — delete with v1 ----
|
|
230
267
|
// Auto-bootstrap: if the graph has no non-procedural nodes but historical
|
|
231
268
|
// segments exist, enqueue a one-time graph_bootstrap job to populate the
|
|
232
269
|
// graph from conversation history and journal files.
|
|
233
270
|
try {
|
|
234
271
|
const { maybeEnqueueGraphBootstrap, cleanupStaleItemVectors } =
|
|
235
|
-
await import("./graph/bootstrap.js");
|
|
272
|
+
await import("./v1/graph/bootstrap.js");
|
|
236
273
|
maybeEnqueueGraphBootstrap();
|
|
237
274
|
// Fire-and-forget: clean up orphaned Qdrant vectors from dropped memory_items table
|
|
238
275
|
void cleanupStaleItemVectors().catch((err) =>
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the boot-maintenance helpers in `boot-maintenance.ts`:
|
|
3
|
+
*
|
|
4
|
+
* - `maybeReseedCapabilitiesAfterManagedCredential`: the secrets route calls
|
|
5
|
+
* this when a managed-proxy credential lands, to close the first-boot race
|
|
6
|
+
* where the daemon's startup capability seed (skills + CLI commands) runs
|
|
7
|
+
* before the platform provisions the managed embedding credential — the
|
|
8
|
+
* seed's embed throws and the synthetic capability pages never reach the
|
|
9
|
+
* page index. The reseed must fire only when the substrate is active AND the
|
|
10
|
+
* managed-proxy prerequisites are now satisfied, so self-hosted / BYOK
|
|
11
|
+
* assistants (no managed proxy) are never made to run a doomed embed. When
|
|
12
|
+
* v3 is live it then enqueues a `memory_v3_maintain` job so v3 picks up the
|
|
13
|
+
* capability pages immediately instead of waiting out the 6h maintain
|
|
14
|
+
* backstop.
|
|
15
|
+
*
|
|
16
|
+
* - `maybeRebuildConceptCollection`: reembed-enqueue dedup against an
|
|
17
|
+
* in-flight `memory_v2_reembed` job.
|
|
18
|
+
*
|
|
19
|
+
* Dynamic-imported collaborators are mocked; `bun:test` isolates
|
|
20
|
+
* `mock.module` per test file. Every collaborator mock is installed at module
|
|
21
|
+
* scope, BEFORE the first import of the module under test, behind swappable
|
|
22
|
+
* delegate objects; tests retarget delegates instead of calling `mock.module`
|
|
23
|
+
* mid-file. This ordering is load-bearing: `mock.module` on a module that has
|
|
24
|
+
* already been evaluated is not reliably re-linked for a subsequent dynamic
|
|
25
|
+
* import across bun versions (CI's bun served the real, cached
|
|
26
|
+
* `qdrant.js` — pulled in via the real `embedding-reconcile.js` import graph —
|
|
27
|
+
* to the first rebuild test even after `mock.module` ran). Module-scope
|
|
28
|
+
* registration means the real collaborators never load at all.
|
|
29
|
+
*/
|
|
30
|
+
import { afterEach, describe, expect, mock, test } from "bun:test";
|
|
31
|
+
|
|
32
|
+
import type { AssistantConfig } from "../../../../../config/schema.js";
|
|
33
|
+
|
|
34
|
+
const proxyState = { prereqs: true };
|
|
35
|
+
const seedSkill = mock(async () => {});
|
|
36
|
+
const seedCli = mock(async () => {});
|
|
37
|
+
const enqueueJob = mock(
|
|
38
|
+
(_type: string, _payload: Record<string, unknown>) => 1,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Swappable delegates behind the module-scope mocks. A module namespace's
|
|
43
|
+
* export set is fixed at instantiation, so every export is declared up front
|
|
44
|
+
* and `withMocks` retargets the delegates instead of re-installing a mock.
|
|
45
|
+
*/
|
|
46
|
+
const jobsStoreDelegates: {
|
|
47
|
+
enqueueMemoryJob: (type: string, payload: Record<string, unknown>) => unknown;
|
|
48
|
+
hasActiveJobOfType: (type: string) => boolean;
|
|
49
|
+
} = {
|
|
50
|
+
enqueueMemoryJob: enqueueJob,
|
|
51
|
+
hasActiveJobOfType: () => false,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const qdrantDelegates: {
|
|
55
|
+
ensureConceptPageCollection: () => Promise<{ migrated: boolean }>;
|
|
56
|
+
countConceptPagePoints: () => Promise<number>;
|
|
57
|
+
clearReembedSentinel: () => Promise<void>;
|
|
58
|
+
} = {
|
|
59
|
+
ensureConceptPageCollection: async () => ({ migrated: false }),
|
|
60
|
+
countConceptPagePoints: async () => 0,
|
|
61
|
+
clearReembedSentinel: async () => {},
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const pageStoreDelegates: {
|
|
65
|
+
hasConceptPages: (workspaceDir: string) => Promise<boolean>;
|
|
66
|
+
} = {
|
|
67
|
+
hasConceptPages: async () => true,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
mock.module("../../../../../providers/platform-proxy/context.js", () => ({
|
|
71
|
+
hasManagedProxyPrereqs: async () => proxyState.prereqs,
|
|
72
|
+
}));
|
|
73
|
+
|
|
74
|
+
// `config/memory-v3-gate.js` is deliberately NOT mocked. It is pure (its only
|
|
75
|
+
// import is a type) and it is the predicate under test as much as
|
|
76
|
+
// `boot-maintenance.ts` is: the tiers are selected by real config here, so a
|
|
77
|
+
// semantics change in `usesConceptPageMemory` / `isMemoryV3Live` fails these
|
|
78
|
+
// tests instead of passing against a hand-inlined copy.
|
|
79
|
+
|
|
80
|
+
mock.module("../../../../../persistence/jobs-store.js", () => ({
|
|
81
|
+
enqueueMemoryJob: (type: string, payload: Record<string, unknown>) =>
|
|
82
|
+
jobsStoreDelegates.enqueueMemoryJob(type, payload),
|
|
83
|
+
hasActiveJobOfType: (type: string) =>
|
|
84
|
+
jobsStoreDelegates.hasActiveJobOfType(type),
|
|
85
|
+
}));
|
|
86
|
+
|
|
87
|
+
mock.module("../skill-store.js", () => ({
|
|
88
|
+
seedV2SkillEntries: seedSkill,
|
|
89
|
+
}));
|
|
90
|
+
|
|
91
|
+
mock.module("../cli-command-store.js", () => ({
|
|
92
|
+
seedV2CliCommandEntries: seedCli,
|
|
93
|
+
}));
|
|
94
|
+
|
|
95
|
+
mock.module("../qdrant.js", () => ({
|
|
96
|
+
ensureConceptPageCollection: () =>
|
|
97
|
+
qdrantDelegates.ensureConceptPageCollection(),
|
|
98
|
+
countConceptPagePoints: () => qdrantDelegates.countConceptPagePoints(),
|
|
99
|
+
clearReembedSentinel: () => qdrantDelegates.clearReembedSentinel(),
|
|
100
|
+
dropLegacySkillsCollection: async () => {},
|
|
101
|
+
}));
|
|
102
|
+
|
|
103
|
+
mock.module("../page-store.js", () => ({
|
|
104
|
+
hasConceptPages: (workspaceDir: string) =>
|
|
105
|
+
pageStoreDelegates.hasConceptPages(workspaceDir),
|
|
106
|
+
}));
|
|
107
|
+
|
|
108
|
+
// The real embedding-reconcile statically imports the real `../qdrant.js`
|
|
109
|
+
// (among a large daemon graph); mocking it keeps that graph out of the module
|
|
110
|
+
// cache entirely. No test here asserts on the reconcile itself — the reseed
|
|
111
|
+
// path contains its failures by contract.
|
|
112
|
+
mock.module("../../../../../daemon/embedding-reconcile.js", () => ({
|
|
113
|
+
reconcileEmbeddingIdentity: async () => {},
|
|
114
|
+
}));
|
|
115
|
+
|
|
116
|
+
const {
|
|
117
|
+
maybeRebuildConceptCollection,
|
|
118
|
+
maybeReseedCapabilitiesAfterManagedCredential,
|
|
119
|
+
} = await import("../boot-maintenance.js");
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Substrate active (or not) via the v2 injection engine, with v3 NOT live:
|
|
123
|
+
* `usesConceptPageMemory` follows `enabled`, `isMemoryV3Live` is false.
|
|
124
|
+
*/
|
|
125
|
+
function configWithV2(enabled: boolean): AssistantConfig {
|
|
126
|
+
return { memory: { v2: { enabled } } } as unknown as AssistantConfig;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Substrate active with memory-v3 as the live injected source — the shape a
|
|
131
|
+
* v3-live assistant actually carries (`v2.enabled` stays set alongside
|
|
132
|
+
* `v3.live`).
|
|
133
|
+
*/
|
|
134
|
+
function configWithV3(): AssistantConfig {
|
|
135
|
+
return {
|
|
136
|
+
memory: { v2: { enabled: true }, v3: { live: true } },
|
|
137
|
+
} as unknown as AssistantConfig;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Poll until `m` has been called at least `n` times, or `timeoutMs` elapses. */
|
|
141
|
+
async function waitForCalls(
|
|
142
|
+
m: { mock: { calls: unknown[] } },
|
|
143
|
+
n: number,
|
|
144
|
+
timeoutMs = 1000,
|
|
145
|
+
): Promise<void> {
|
|
146
|
+
const start = Date.now();
|
|
147
|
+
while (m.mock.calls.length < n && Date.now() - start < timeoutMs) {
|
|
148
|
+
await new Promise((resolve) => setTimeout(resolve, 5));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
afterEach(() => {
|
|
153
|
+
seedSkill.mockClear();
|
|
154
|
+
seedCli.mockClear();
|
|
155
|
+
enqueueJob.mockClear();
|
|
156
|
+
proxyState.prereqs = true;
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
describe("maybeReseedCapabilitiesAfterManagedCredential", () => {
|
|
160
|
+
test("reseeds both skill and CLI entries when v2 is enabled and managed-proxy prereqs are satisfied", async () => {
|
|
161
|
+
proxyState.prereqs = true;
|
|
162
|
+
|
|
163
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true));
|
|
164
|
+
|
|
165
|
+
expect(seedSkill).toHaveBeenCalledTimes(1);
|
|
166
|
+
expect(seedCli).toHaveBeenCalledTimes(1);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
test("enqueues a v3 maintain pass after reseeding when v3 is live", async () => {
|
|
170
|
+
proxyState.prereqs = true;
|
|
171
|
+
|
|
172
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV3());
|
|
173
|
+
|
|
174
|
+
expect(enqueueJob).toHaveBeenCalledTimes(1);
|
|
175
|
+
expect(enqueueJob).toHaveBeenCalledWith("memory_v3_maintain", {});
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test("reseeds but does not enqueue a v3 maintain pass when v3 is not live", async () => {
|
|
179
|
+
proxyState.prereqs = true;
|
|
180
|
+
|
|
181
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true));
|
|
182
|
+
|
|
183
|
+
expect(seedSkill).toHaveBeenCalledTimes(1);
|
|
184
|
+
expect(seedCli).toHaveBeenCalledTimes(1);
|
|
185
|
+
expect(enqueueJob).not.toHaveBeenCalled();
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test("no-op when v2 memory is disabled", async () => {
|
|
189
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(false));
|
|
190
|
+
|
|
191
|
+
expect(seedSkill).not.toHaveBeenCalled();
|
|
192
|
+
expect(seedCli).not.toHaveBeenCalled();
|
|
193
|
+
expect(enqueueJob).not.toHaveBeenCalled();
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test("no-op for non-managed assistants (managed-proxy prereqs not satisfied)", async () => {
|
|
197
|
+
proxyState.prereqs = false;
|
|
198
|
+
|
|
199
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true));
|
|
200
|
+
|
|
201
|
+
expect(seedSkill).not.toHaveBeenCalled();
|
|
202
|
+
expect(seedCli).not.toHaveBeenCalled();
|
|
203
|
+
expect(enqueueJob).not.toHaveBeenCalled();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("swallows a seed failure and still reseeds the other catalog", async () => {
|
|
207
|
+
proxyState.prereqs = true;
|
|
208
|
+
seedSkill.mockImplementationOnce(async () => {
|
|
209
|
+
throw new Error('Embedding backend "gemini" is not configured');
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// Must not reject — the helper contains each seed's failure so a doomed
|
|
213
|
+
// embed never propagates back to the credential-store caller.
|
|
214
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV2(true));
|
|
215
|
+
|
|
216
|
+
expect(seedCli).toHaveBeenCalledTimes(1);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test("enqueues the v3 maintain pass even when one catalog reseed rejects", async () => {
|
|
220
|
+
proxyState.prereqs = true;
|
|
221
|
+
seedSkill.mockImplementationOnce(async () => {
|
|
222
|
+
throw new Error('Embedding backend "gemini" is not configured');
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV3());
|
|
226
|
+
|
|
227
|
+
// The CLI catalog seeded, so v3 must still rebuild its lanes — a single
|
|
228
|
+
// catalog failure cannot suppress the maintain pass.
|
|
229
|
+
expect(seedCli).toHaveBeenCalledTimes(1);
|
|
230
|
+
expect(enqueueJob).toHaveBeenCalledTimes(1);
|
|
231
|
+
expect(enqueueJob).toHaveBeenCalledWith("memory_v3_maintain", {});
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test("enqueues the v3 maintain pass without blocking when a catalog reseed exceeds the timeout", async () => {
|
|
235
|
+
proxyState.prereqs = true;
|
|
236
|
+
// Skill reseed never settles — mirrors the wedged getCatalog()/embed seen in
|
|
237
|
+
// the field. The CLI reseed completes normally.
|
|
238
|
+
seedSkill.mockImplementationOnce(() => new Promise<void>(() => {}));
|
|
239
|
+
|
|
240
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV3(), {
|
|
241
|
+
reseedTimeoutMs: 20,
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// An unbounded `Promise.all` barrier would hang here forever; the bounded
|
|
245
|
+
// barrier lets the CLI catalog's maintain pass enqueue regardless.
|
|
246
|
+
expect(seedCli).toHaveBeenCalledTimes(1);
|
|
247
|
+
expect(enqueueJob).toHaveBeenCalledTimes(1);
|
|
248
|
+
expect(enqueueJob).toHaveBeenCalledWith("memory_v3_maintain", {});
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test("re-enqueues the v3 maintain pass when a straggler catalog finishes after the timeout", async () => {
|
|
252
|
+
proxyState.prereqs = true;
|
|
253
|
+
let resolveSkill!: () => void;
|
|
254
|
+
seedSkill.mockImplementationOnce(
|
|
255
|
+
() =>
|
|
256
|
+
new Promise<void>((resolve) => {
|
|
257
|
+
resolveSkill = resolve;
|
|
258
|
+
}),
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
await maybeReseedCapabilitiesAfterManagedCredential(configWithV3(), {
|
|
262
|
+
reseedTimeoutMs: 10,
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
// Post-barrier enqueue fires once even though the skill catalog is still
|
|
266
|
+
// embedding.
|
|
267
|
+
expect(enqueueJob).toHaveBeenCalledTimes(1);
|
|
268
|
+
|
|
269
|
+
// The straggler lands; maintain re-enqueues so its late capability rows are
|
|
270
|
+
// reconciled without waiting out the 6h backstop.
|
|
271
|
+
resolveSkill();
|
|
272
|
+
await waitForCalls(enqueueJob, 2);
|
|
273
|
+
expect(enqueueJob).toHaveBeenCalledTimes(2);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Retarget the module-scope delegates at fresh spies for one
|
|
279
|
+
* `maybeRebuildConceptCollection` test and return them.
|
|
280
|
+
*
|
|
281
|
+
* Drives the empty-after-create branch (collection not migrated, zero points,
|
|
282
|
+
* pages on disk) so the reembed enqueue decision is reached, and lets the test
|
|
283
|
+
* choose whether a `memory_v2_reembed` job is already in-flight.
|
|
284
|
+
* `hasConceptPages` ignores its workspace-dir argument, so the real
|
|
285
|
+
* `getWorkspaceDir()` (resolving to the preload's per-test temp workspace)
|
|
286
|
+
* needs no mock.
|
|
287
|
+
*/
|
|
288
|
+
function withMocks(opts: { reembedInFlight: boolean }) {
|
|
289
|
+
const spies = {
|
|
290
|
+
enqueueMemoryJob: mock(() => "job-id"),
|
|
291
|
+
hasActiveJobOfType: mock(
|
|
292
|
+
(type: string) => opts.reembedInFlight && type === "memory_v2_reembed",
|
|
293
|
+
),
|
|
294
|
+
ensureConceptPageCollection: mock(async () => ({ migrated: false })),
|
|
295
|
+
countConceptPagePoints: mock(async () => 0),
|
|
296
|
+
clearReembedSentinel: mock(async () => {}),
|
|
297
|
+
hasConceptPages: mock(async () => true),
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
jobsStoreDelegates.enqueueMemoryJob = spies.enqueueMemoryJob;
|
|
301
|
+
jobsStoreDelegates.hasActiveJobOfType = spies.hasActiveJobOfType;
|
|
302
|
+
qdrantDelegates.ensureConceptPageCollection =
|
|
303
|
+
spies.ensureConceptPageCollection;
|
|
304
|
+
qdrantDelegates.countConceptPagePoints = spies.countConceptPagePoints;
|
|
305
|
+
qdrantDelegates.clearReembedSentinel = spies.clearReembedSentinel;
|
|
306
|
+
pageStoreDelegates.hasConceptPages = spies.hasConceptPages;
|
|
307
|
+
|
|
308
|
+
return spies;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
describe("maybeRebuildConceptCollection reembed dedup", () => {
|
|
312
|
+
test("does NOT enqueue a second reembed when one is already in-flight", async () => {
|
|
313
|
+
const spies = withMocks({ reembedInFlight: true });
|
|
314
|
+
|
|
315
|
+
await maybeRebuildConceptCollection(configWithV2(true));
|
|
316
|
+
|
|
317
|
+
expect(spies.hasActiveJobOfType).toHaveBeenCalledWith("memory_v2_reembed");
|
|
318
|
+
expect(spies.enqueueMemoryJob).toHaveBeenCalledTimes(0);
|
|
319
|
+
// The sentinel is still retired even when the enqueue is skipped.
|
|
320
|
+
expect(spies.clearReembedSentinel).toHaveBeenCalledTimes(1);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
test("enqueues the reembed when none is in-flight", async () => {
|
|
324
|
+
const spies = withMocks({ reembedInFlight: false });
|
|
325
|
+
|
|
326
|
+
await maybeRebuildConceptCollection(configWithV2(true));
|
|
327
|
+
|
|
328
|
+
expect(spies.enqueueMemoryJob).toHaveBeenCalledTimes(1);
|
|
329
|
+
expect(spies.enqueueMemoryJob).toHaveBeenCalledWith(
|
|
330
|
+
"memory_v2_reembed",
|
|
331
|
+
{},
|
|
332
|
+
);
|
|
333
|
+
expect(spies.clearReembedSentinel).toHaveBeenCalledTimes(1);
|
|
334
|
+
});
|
|
335
|
+
});
|
package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tests for `
|
|
2
|
+
* Tests for `substrate/cli-command-store.ts`.
|
|
3
3
|
*
|
|
4
4
|
* Coverage matrix:
|
|
5
5
|
* - `seedV2CliCommandEntries` renders one `cli-commands/<name>` point per
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
21
21
|
|
|
22
|
-
import type { CliCommandHelp } from "
|
|
22
|
+
import type { CliCommandHelp } from "../../../../../cli/lib/cli-command-help.js";
|
|
23
23
|
|
|
24
24
|
// ---------------------------------------------------------------------------
|
|
25
25
|
// Programmable test state
|
|
@@ -94,15 +94,17 @@ function setCommands(...commands: CliCommandHelp[]): void {
|
|
|
94
94
|
// `CLI_COMMAND_HELP` from `@vellumai/plugin-api`, which re-exports it from
|
|
95
95
|
// `cli/index.help.js` — mocking that module drives the seed with pure data,
|
|
96
96
|
// so no test wires the Commander action graph.
|
|
97
|
-
mock.module("
|
|
97
|
+
mock.module("../../../../../cli/index.help.js", () => ({
|
|
98
98
|
CLI_COMMAND_HELP: state.commands,
|
|
99
99
|
}));
|
|
100
100
|
|
|
101
101
|
mock.module(
|
|
102
|
-
"
|
|
102
|
+
"../../../../../persistence/embeddings/embedding-backend.js",
|
|
103
103
|
() => ({
|
|
104
104
|
embedWithBackend: async (_config: unknown, inputs: unknown[]) => {
|
|
105
|
-
if (state.embedThrows)
|
|
105
|
+
if (state.embedThrows) {
|
|
106
|
+
throw state.embedThrows;
|
|
107
|
+
}
|
|
106
108
|
const vectors = state.embedReturn.length
|
|
107
109
|
? state.embedReturn
|
|
108
110
|
: inputs.map(() => [0.1, 0.2, 0.3]);
|
|
@@ -117,7 +119,7 @@ mock.module("../sparse-bm25.js", () => ({
|
|
|
117
119
|
getConceptPageCorpusStats: () => null,
|
|
118
120
|
}));
|
|
119
121
|
|
|
120
|
-
mock.module("
|
|
122
|
+
mock.module("../../anisotropy.js", () => ({
|
|
121
123
|
applyCorrectionIfCalibrated: async (v: number[]) => v,
|
|
122
124
|
}));
|
|
123
125
|
|
|
@@ -127,7 +129,9 @@ mock.module("../page-index.js", () => ({
|
|
|
127
129
|
|
|
128
130
|
mock.module("../qdrant.js", () => ({
|
|
129
131
|
upsertConceptPageEmbedding: async (params: UpsertCall) => {
|
|
130
|
-
if (state.upsertThrows)
|
|
132
|
+
if (state.upsertThrows) {
|
|
133
|
+
throw state.upsertThrows;
|
|
134
|
+
}
|
|
131
135
|
state.callSequence.push("upsert");
|
|
132
136
|
state.upsertCalls.push(params);
|
|
133
137
|
},
|
|
@@ -144,7 +148,9 @@ mock.module("../qdrant.js", () => ({
|
|
|
144
148
|
kind: string,
|
|
145
149
|
allowedSuffixes: ReadonlySet<string>,
|
|
146
150
|
) => {
|
|
147
|
-
if (state.backfillThrows)
|
|
151
|
+
if (state.backfillThrows) {
|
|
152
|
+
throw state.backfillThrows;
|
|
153
|
+
}
|
|
148
154
|
state.callSequence.push("backfill");
|
|
149
155
|
state.backfillCalls.push({ prefix, kind, allowedSuffixes });
|
|
150
156
|
return 0;
|