@vellumai/assistant 0.10.12 → 0.11.0-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +264 -14
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
- package/src/__tests__/app-conversation-ids.test.ts +204 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-group-tools.test.ts +279 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-lineage.test.ts +235 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/platform-callback-registration.test.ts +10 -10
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/resolve-app-id.test.ts +32 -0
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +26 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +587 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +482 -2
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/api/responses/subagent-detail.ts +13 -0
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/apps/app-store.ts +95 -4
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +178 -65
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/commands/webhooks.help.ts +9 -4
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
- package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/bundled-skills/schedule/SKILL.md +2 -0
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -38
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-lineage.ts +76 -0
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +8 -14
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +32 -16
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +1288 -439
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +298 -15
- package/src/permissions/checker.ts +102 -36
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +269 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/conversation-parent.ts +27 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +9 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/prompts/sections.ts +4 -16
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/subagents-routes.ts +35 -8
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/webhook-routes.ts +89 -30
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/apps/resolve-app-id.ts +15 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/conversation-groups/group_create.ts +63 -0
- package/src/tools/conversation-groups/group_list.ts +20 -0
- package/src/tools/conversation-groups/group_shared.ts +52 -0
- package/src/tools/conversation-groups/move_to_group.ts +106 -0
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/util/platform.ts +15 -0
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/tsconfig.plugin-api.json +1 -1
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests that daemon outbound messages are mirrored into the
|
|
3
|
-
* assistant-events hub as
|
|
3
|
+
* assistant-events hub as AssistantEventEnvelope objects.
|
|
4
4
|
*
|
|
5
5
|
* Tests:
|
|
6
6
|
* - send() → one mirrored assistant event per message
|
|
@@ -8,9 +8,8 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { describe, expect, test } from "bun:test";
|
|
10
10
|
|
|
11
|
+
import type { AssistantEvent, AssistantEventEnvelope } from "../api/index.js";
|
|
11
12
|
// ── Imports (after mocks) ────────────────────────────────────────────────────
|
|
12
|
-
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
13
|
-
import type { AssistantEvent } from "../runtime/assistant-event.js";
|
|
14
13
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
15
14
|
import { AssistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
16
15
|
|
|
@@ -20,7 +19,7 @@ import { AssistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
|
20
19
|
|
|
21
20
|
describe("buildAssistantEvent", () => {
|
|
22
21
|
test("returns event with correct shape", () => {
|
|
23
|
-
const msg:
|
|
22
|
+
const msg: AssistantEvent = {
|
|
24
23
|
type: "assistant_text_delta",
|
|
25
24
|
conversationId: "sess_1",
|
|
26
25
|
text: "hi",
|
|
@@ -36,14 +35,14 @@ describe("buildAssistantEvent", () => {
|
|
|
36
35
|
});
|
|
37
36
|
|
|
38
37
|
test("generates unique ids for each call", () => {
|
|
39
|
-
const msg:
|
|
38
|
+
const msg: AssistantEvent = { type: "message_complete" };
|
|
40
39
|
const a = buildAssistantEvent(msg);
|
|
41
40
|
const b = buildAssistantEvent(msg);
|
|
42
41
|
expect(a.id).not.toBe(b.id);
|
|
43
42
|
});
|
|
44
43
|
|
|
45
44
|
test("conversationId is undefined when omitted", () => {
|
|
46
|
-
const msg:
|
|
45
|
+
const msg: AssistantEvent = { type: "message_complete" };
|
|
47
46
|
const event = buildAssistantEvent(msg);
|
|
48
47
|
expect(event.conversationId).toBeUndefined();
|
|
49
48
|
});
|
|
@@ -54,7 +53,7 @@ describe("buildAssistantEvent", () => {
|
|
|
54
53
|
describe("daemon send → one mirrored assistant event", () => {
|
|
55
54
|
test("publishing a single event to the hub delivers exactly one event", async () => {
|
|
56
55
|
const hub = new AssistantEventHub();
|
|
57
|
-
const received:
|
|
56
|
+
const received: AssistantEventEnvelope[] = [];
|
|
58
57
|
|
|
59
58
|
hub.subscribe({
|
|
60
59
|
type: "process",
|
|
@@ -63,7 +62,7 @@ describe("daemon send → one mirrored assistant event", () => {
|
|
|
63
62
|
},
|
|
64
63
|
});
|
|
65
64
|
|
|
66
|
-
const msg:
|
|
65
|
+
const msg: AssistantEvent = {
|
|
67
66
|
type: "assistant_text_delta",
|
|
68
67
|
conversationId: "sess_a",
|
|
69
68
|
text: "hello",
|
|
@@ -78,7 +77,7 @@ describe("daemon send → one mirrored assistant event", () => {
|
|
|
78
77
|
|
|
79
78
|
test("conversationId falls back to explicit parameter when message lacks it", async () => {
|
|
80
79
|
const hub = new AssistantEventHub();
|
|
81
|
-
const received:
|
|
80
|
+
const received: AssistantEventEnvelope[] = [];
|
|
82
81
|
|
|
83
82
|
hub.subscribe({
|
|
84
83
|
type: "process",
|
|
@@ -87,7 +86,7 @@ describe("daemon send → one mirrored assistant event", () => {
|
|
|
87
86
|
},
|
|
88
87
|
});
|
|
89
88
|
|
|
90
|
-
const msg:
|
|
89
|
+
const msg: AssistantEvent = { type: "message_complete" }; // no conversationId field
|
|
91
90
|
const event = buildAssistantEvent(msg, "sess_explicit");
|
|
92
91
|
|
|
93
92
|
await hub.publish(event);
|
|
@@ -100,7 +99,7 @@ describe("daemon send → one mirrored assistant event", () => {
|
|
|
100
99
|
describe("daemon broadcast → one mirrored event per message (not per socket)", () => {
|
|
101
100
|
test("one broadcast publish produces exactly one hub event regardless of subscriber count", async () => {
|
|
102
101
|
const hub = new AssistantEventHub();
|
|
103
|
-
const received:
|
|
102
|
+
const received: AssistantEventEnvelope[] = [];
|
|
104
103
|
|
|
105
104
|
// Two subscribers (simulating two wire clients)
|
|
106
105
|
hub.subscribe({
|
|
@@ -117,7 +116,7 @@ describe("daemon broadcast → one mirrored event per message (not per socket)",
|
|
|
117
116
|
});
|
|
118
117
|
|
|
119
118
|
// Simulate broadcast: server calls publishAssistantEvent once
|
|
120
|
-
const msg:
|
|
119
|
+
const msg: AssistantEvent = {
|
|
121
120
|
type: "message_complete",
|
|
122
121
|
conversationId: "sess_b",
|
|
123
122
|
};
|
|
@@ -130,7 +129,7 @@ describe("daemon broadcast → one mirrored event per message (not per socket)",
|
|
|
130
129
|
|
|
131
130
|
test("broadcast publishes once; single send publishes once — not additive", async () => {
|
|
132
131
|
const hub = new AssistantEventHub();
|
|
133
|
-
const publishedEvents:
|
|
132
|
+
const publishedEvents: AssistantEventEnvelope[] = [];
|
|
134
133
|
|
|
135
134
|
hub.subscribe({
|
|
136
135
|
type: "process",
|
|
@@ -139,12 +138,12 @@ describe("daemon broadcast → one mirrored event per message (not per socket)",
|
|
|
139
138
|
},
|
|
140
139
|
});
|
|
141
140
|
|
|
142
|
-
const msgA:
|
|
141
|
+
const msgA: AssistantEvent = {
|
|
143
142
|
type: "assistant_text_delta",
|
|
144
143
|
conversationId: "s1",
|
|
145
144
|
text: "a",
|
|
146
145
|
};
|
|
147
|
-
const msgB:
|
|
146
|
+
const msgB: AssistantEvent = {
|
|
148
147
|
type: "message_complete",
|
|
149
148
|
conversationId: "s1",
|
|
150
149
|
};
|
|
@@ -7,43 +7,29 @@
|
|
|
7
7
|
*
|
|
8
8
|
* No source-module imports
|
|
9
9
|
* ------------------------
|
|
10
|
-
* This file has ZERO imports from `src/`. It accesses the DB
|
|
11
|
-
* state via the shared `globalThis.vellumAssistant.dbSingletons`
|
|
12
|
-
* that `src/
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
10
|
+
* This file has ZERO runtime imports from `src/`. It accesses the DB
|
|
11
|
+
* singletons' state via the shared `globalThis.vellumAssistant.dbSingletons`
|
|
12
|
+
* slots that `src/persistence/db-singleton.ts` also reads/writes, typed by the
|
|
13
|
+
* shared ambient `VellumDbSlots` (declared in
|
|
14
|
+
* `src/vellum-assistant-namespace.d.ts`). That ambient type is pure
|
|
15
|
+
* compile-time information — referencing it adds nothing to this file's runtime
|
|
16
|
+
* import graph — so keeping the helper off the production import graph (what
|
|
17
|
+
* protects the test preload from a broken `node_modules` symlink, DB ghost #3)
|
|
18
|
+
* still holds.
|
|
17
19
|
*
|
|
18
20
|
* Production code that needs to close + reopen the DBs (post-migration,
|
|
19
21
|
* post-restore, post-vbundle-import, on shutdown) should use `resetDb()`
|
|
20
|
-
* from `src/
|
|
22
|
+
* from `src/persistence/db-connection.ts` instead.
|
|
21
23
|
*/
|
|
22
24
|
|
|
23
25
|
import { resetGatewayAclStore } from "./helpers/gateway-acl-store.js";
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
// "No source-module imports" section above.
|
|
27
|
-
type DbSlotKey = "main" | "main-readonly" | "logs" | "memory" | "telemetry";
|
|
28
|
-
|
|
29
|
-
type DbSlot = {
|
|
30
|
-
db: unknown;
|
|
31
|
-
closer: (() => void) | null;
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
type DbSlots = Record<DbSlotKey, DbSlot>;
|
|
35
|
-
|
|
36
|
-
type VellumAssistantNamespace = {
|
|
37
|
-
dbSingletons?: DbSlots;
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
function emptySlot(): DbSlot {
|
|
27
|
+
function emptySlot(): VellumDbSlot {
|
|
41
28
|
return { db: null, closer: null };
|
|
42
29
|
}
|
|
43
30
|
|
|
44
|
-
function dbSlots():
|
|
45
|
-
const
|
|
46
|
-
const ns = (g.vellumAssistant ??= {});
|
|
31
|
+
function dbSlots(): VellumDbSlots {
|
|
32
|
+
const ns = (globalThis.vellumAssistant ??= {});
|
|
47
33
|
return (ns.dbSingletons ??= {
|
|
48
34
|
main: emptySlot(),
|
|
49
35
|
"main-readonly": emptySlot(),
|
|
@@ -21,11 +21,18 @@ mock.module("../runtime/assistant-event.js", () => ({
|
|
|
21
21
|
|
|
22
22
|
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
23
23
|
AssistantEventHub: class {},
|
|
24
|
-
broadcastMessage: () => {
|
|
24
|
+
broadcastMessage: (message: unknown, conversationId?: string) => {
|
|
25
|
+
const event = { message, conversationId };
|
|
26
|
+
for (const callback of eventSubscribers) {
|
|
27
|
+
callback(event);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
25
30
|
capabilityForMessageType: () => undefined,
|
|
26
31
|
assistantEventHub: {
|
|
27
32
|
publish: async (event: unknown) => {
|
|
28
|
-
for (const callback of eventSubscribers)
|
|
33
|
+
for (const callback of eventSubscribers) {
|
|
34
|
+
callback(event);
|
|
35
|
+
}
|
|
29
36
|
},
|
|
30
37
|
subscribe: ({ callback }: { callback: (event: unknown) => void }) => {
|
|
31
38
|
eventSubscribers.add(callback);
|
|
@@ -87,7 +94,9 @@ function getRoute(endpoint: string, method: string) {
|
|
|
87
94
|
const route = ROUTES.find(
|
|
88
95
|
(r) => r.endpoint === endpoint && r.method === method,
|
|
89
96
|
);
|
|
90
|
-
if (!route)
|
|
97
|
+
if (!route) {
|
|
98
|
+
throw new Error(`${method} ${endpoint} route not registered`);
|
|
99
|
+
}
|
|
91
100
|
return route;
|
|
92
101
|
}
|
|
93
102
|
|
|
@@ -3,9 +3,12 @@ import { beforeEach, describe, expect, test } from "bun:test";
|
|
|
3
3
|
import { getDocumentById } from "../documents/document-store.js";
|
|
4
4
|
import { getSqlite } from "../persistence/db-connection.js";
|
|
5
5
|
import {
|
|
6
|
+
executeDocumentCreate,
|
|
6
7
|
executeDocumentDelete,
|
|
8
|
+
executeDocumentFind,
|
|
7
9
|
executeDocumentList,
|
|
8
10
|
executeDocumentRead,
|
|
11
|
+
executeDocumentReplaceText,
|
|
9
12
|
executeDocumentUpdate,
|
|
10
13
|
} from "../tools/document/document-tool.js";
|
|
11
14
|
import type { ToolContext, ToolExecutionResult } from "../tools/types.js";
|
|
@@ -338,3 +341,95 @@ describe("executeDocumentUpdate — input validation", () => {
|
|
|
338
341
|
expect(body.error).toContain("Invalid input: surface_id is required");
|
|
339
342
|
});
|
|
340
343
|
});
|
|
344
|
+
|
|
345
|
+
// ── model-input schema validation (LUM-2854) ─────────────────────────
|
|
346
|
+
|
|
347
|
+
describe("document tools — model-input schema validation", () => {
|
|
348
|
+
beforeEach(() => {
|
|
349
|
+
bootstrapDocumentTables();
|
|
350
|
+
seedFixtureDocuments();
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
test("document_find rejects a non-string query instead of crashing downstream", () => {
|
|
354
|
+
const result = executeDocumentFind(
|
|
355
|
+
{ surface_id: "doc-current", query: 42 },
|
|
356
|
+
makeContext(),
|
|
357
|
+
);
|
|
358
|
+
expect(result.isError).toBe(true);
|
|
359
|
+
expect(result.content).toContain('Invalid input for tool "document_find"');
|
|
360
|
+
expect(result.content).toContain("query");
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
test("document_find rejects a missing query cleanly", () => {
|
|
364
|
+
const result = executeDocumentFind(
|
|
365
|
+
{ surface_id: "doc-current" },
|
|
366
|
+
makeContext(),
|
|
367
|
+
);
|
|
368
|
+
expect(result.isError).toBe(true);
|
|
369
|
+
expect(result.content).toContain('Invalid input for tool "document_find"');
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
test("document_find treats null option flags as omitted", () => {
|
|
373
|
+
const result = executeDocumentFind(
|
|
374
|
+
{
|
|
375
|
+
surface_id: "doc-current",
|
|
376
|
+
query: "current",
|
|
377
|
+
regex: null,
|
|
378
|
+
case_sensitive: null,
|
|
379
|
+
},
|
|
380
|
+
makeContext(),
|
|
381
|
+
);
|
|
382
|
+
expect(result.isError).toBe(false);
|
|
383
|
+
const body = parseResult<{ total_matches: number }>(result);
|
|
384
|
+
expect(body.total_matches).toBe(1);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
test("document_create rejects a non-string title instead of persisting it", () => {
|
|
388
|
+
const result = executeDocumentCreate(
|
|
389
|
+
{ title: 42, initial_content: "hello" },
|
|
390
|
+
makeContext({ conversationId: "conv-current" }),
|
|
391
|
+
);
|
|
392
|
+
expect(result.isError).toBe(true);
|
|
393
|
+
expect(result.content).toContain(
|
|
394
|
+
'Invalid input for tool "document_create"',
|
|
395
|
+
);
|
|
396
|
+
expect(result.content).toContain("title");
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
test("document_update rejects a non-string content before the bespoke checks", () => {
|
|
400
|
+
const result = executeDocumentUpdate(
|
|
401
|
+
{ surface_id: "doc-current", content: 42 },
|
|
402
|
+
makeContext(),
|
|
403
|
+
);
|
|
404
|
+
expect(result.isError).toBe(true);
|
|
405
|
+
expect(result.content).toContain(
|
|
406
|
+
'Invalid input for tool "document_update"',
|
|
407
|
+
);
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
test("document_list still silently ignores a malformed query", () => {
|
|
411
|
+
const result = executeDocumentList({ query: 42 }, makeContext());
|
|
412
|
+
expect(result.isError).toBe(false);
|
|
413
|
+
const body = parseResult<{ documents: Array<{ surface_id: string }> }>(
|
|
414
|
+
result,
|
|
415
|
+
);
|
|
416
|
+
expect(body.documents.map((d) => d.surface_id)).toEqual(["doc-current"]);
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
test("document_replace_text rejects a non-number max_replacements", () => {
|
|
420
|
+
const result = executeDocumentReplaceText(
|
|
421
|
+
{
|
|
422
|
+
surface_id: "doc-current",
|
|
423
|
+
find: "current",
|
|
424
|
+
replace: "new",
|
|
425
|
+
max_replacements: "3",
|
|
426
|
+
},
|
|
427
|
+
makeContext(),
|
|
428
|
+
);
|
|
429
|
+
expect(result.isError).toBe(true);
|
|
430
|
+
expect(result.content).toContain(
|
|
431
|
+
'Invalid input for tool "document_replace_text"',
|
|
432
|
+
);
|
|
433
|
+
expect(result.content).toContain("max_replacements");
|
|
434
|
+
});
|
|
435
|
+
});
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* kickQueueDrain — the never-rejecting drain trigger.
|
|
3
|
+
*
|
|
4
|
+
* Fire-and-forget drain sites (the agent loop's `finally`, route handlers
|
|
5
|
+
* releasing the processing lock) call kickQueueDrain instead of drainQueue
|
|
6
|
+
* directly. A drain whose promise rejects has nothing left to re-trigger it,
|
|
7
|
+
* so the guard retries once, and on a second failure notifies every queued
|
|
8
|
+
* sender while leaving the queue intact for the next drain trigger.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, expect, test } from "bun:test";
|
|
11
|
+
|
|
12
|
+
import { kickQueueDrain } from "../daemon/conversation-process.js";
|
|
13
|
+
import {
|
|
14
|
+
MessageQueue,
|
|
15
|
+
type QueuedMessage,
|
|
16
|
+
} from "../daemon/conversation-queue-manager.js";
|
|
17
|
+
|
|
18
|
+
interface FakeEvent {
|
|
19
|
+
type: string;
|
|
20
|
+
message?: string;
|
|
21
|
+
category?: string;
|
|
22
|
+
requestId?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* MessageQueue whose `peek` throws for the first `peekFailures` calls.
|
|
27
|
+
* `drainQueue`'s batch builder reads `peek(0)` before anything else, so
|
|
28
|
+
* each induced failure rejects exactly one drain attempt.
|
|
29
|
+
*/
|
|
30
|
+
class FlakyQueue extends MessageQueue {
|
|
31
|
+
peekFailures = 0;
|
|
32
|
+
|
|
33
|
+
override peek(index: number = 0): QueuedMessage | undefined {
|
|
34
|
+
if (this.peekFailures > 0) {
|
|
35
|
+
this.peekFailures -= 1;
|
|
36
|
+
throw new Error("batch build exploded");
|
|
37
|
+
}
|
|
38
|
+
return super.peek(index);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function makeQueued(
|
|
43
|
+
content: string,
|
|
44
|
+
requestId: string,
|
|
45
|
+
events: FakeEvent[],
|
|
46
|
+
): QueuedMessage {
|
|
47
|
+
return {
|
|
48
|
+
content,
|
|
49
|
+
attachments: [],
|
|
50
|
+
requestId,
|
|
51
|
+
onEvent: (event: FakeEvent) => {
|
|
52
|
+
events.push(event);
|
|
53
|
+
},
|
|
54
|
+
sentAt: Date.now(),
|
|
55
|
+
} as unknown as QueuedMessage;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function makeFakeConversation(
|
|
59
|
+
options: { persistError?: Error; activityFailures?: number } = {},
|
|
60
|
+
) {
|
|
61
|
+
const queue = new FlakyQueue();
|
|
62
|
+
const persistCalls: string[] = [];
|
|
63
|
+
// Post-dequeue failure injection: emitActivityState runs after the
|
|
64
|
+
// message has been popped from the queue, so a throw here exercises the
|
|
65
|
+
// restore path rather than the pre-mutation (peek) path.
|
|
66
|
+
let activityFailures = options.activityFailures ?? 0;
|
|
67
|
+
const conversation = {
|
|
68
|
+
conversationId: "conv-drain-kick",
|
|
69
|
+
queue,
|
|
70
|
+
pendingSteerRepair: false,
|
|
71
|
+
preactivatedSkillIds: undefined as string[] | undefined,
|
|
72
|
+
messages: [] as unknown[],
|
|
73
|
+
surfaceActionRequestIds: new Set<string>(),
|
|
74
|
+
activeSurfaceId: undefined,
|
|
75
|
+
ensureHostProxiesForTurn: () => {},
|
|
76
|
+
usageStats: { inputTokens: 0, outputTokens: 0, estimatedCost: 0 },
|
|
77
|
+
getTurnChannelContext: () => null,
|
|
78
|
+
setTurnChannelContext: () => {},
|
|
79
|
+
getTurnInterfaceContext: () => null,
|
|
80
|
+
setTurnInterfaceContext: () => {},
|
|
81
|
+
setTransportHints: () => {},
|
|
82
|
+
emitActivityState: () => {
|
|
83
|
+
if (activityFailures > 0) {
|
|
84
|
+
activityFailures -= 1;
|
|
85
|
+
throw new Error("activity emit exploded");
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
isProcessing: () => false,
|
|
89
|
+
persistUserMessage: async (opts: { content: string }) => {
|
|
90
|
+
persistCalls.push(opts.content);
|
|
91
|
+
if (options.persistError) {
|
|
92
|
+
throw options.persistError;
|
|
93
|
+
}
|
|
94
|
+
return { id: `msg-${persistCalls.length}`, deduplicated: true };
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
return { conversation, queue, persistCalls };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
describe("kickQueueDrain", () => {
|
|
101
|
+
test("a drain that rejects is retried once and the retry drains the queue", async () => {
|
|
102
|
+
const events: FakeEvent[] = [];
|
|
103
|
+
// Persist fails with a non-busy error so the retry terminates on the
|
|
104
|
+
// drop-and-continue path instead of entering the full agent loop.
|
|
105
|
+
const { conversation, queue, persistCalls } = makeFakeConversation({
|
|
106
|
+
persistError: new Error("disk exploded"),
|
|
107
|
+
});
|
|
108
|
+
queue.push(makeQueued("hello there", "r1", events));
|
|
109
|
+
queue.peekFailures = 1;
|
|
110
|
+
|
|
111
|
+
await kickQueueDrain(conversation as never);
|
|
112
|
+
|
|
113
|
+
// The first attempt rejected before touching the queue; the retry got
|
|
114
|
+
// all the way to persist — the queue did not strand.
|
|
115
|
+
expect(persistCalls.length).toBe(1);
|
|
116
|
+
expect(queue.length).toBe(0);
|
|
117
|
+
expect(
|
|
118
|
+
events.filter((event) => event.category === "queue_drain_failed"),
|
|
119
|
+
).toEqual([]);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("a second failure notifies every queued sender and keeps the queue intact", async () => {
|
|
123
|
+
const events: FakeEvent[] = [];
|
|
124
|
+
const { conversation, queue, persistCalls } = makeFakeConversation();
|
|
125
|
+
queue.push(makeQueued("first", "r1", events));
|
|
126
|
+
queue.push(makeQueued("second", "r2", events));
|
|
127
|
+
queue.peekFailures = 2;
|
|
128
|
+
|
|
129
|
+
await kickQueueDrain(conversation as never);
|
|
130
|
+
|
|
131
|
+
// Both attempts rejected: nothing was drained or dropped, and each
|
|
132
|
+
// sender received a queue_drain_failed error so the stall is visible.
|
|
133
|
+
expect(persistCalls).toEqual([]);
|
|
134
|
+
expect(queue.length).toBe(2);
|
|
135
|
+
expect(queue.peek(0)?.requestId).toBe("r1");
|
|
136
|
+
expect(queue.peek(1)?.requestId).toBe("r2");
|
|
137
|
+
const failures = events.filter(
|
|
138
|
+
(event) =>
|
|
139
|
+
event.type === "error" && event.category === "queue_drain_failed",
|
|
140
|
+
);
|
|
141
|
+
expect(failures.map((event) => event.requestId).sort()).toEqual([
|
|
142
|
+
"r1",
|
|
143
|
+
"r2",
|
|
144
|
+
]);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("a throw after the dequeue restores the message so the retry retries it", async () => {
|
|
148
|
+
const events: FakeEvent[] = [];
|
|
149
|
+
// Persist fails with a non-busy error so the retry terminates on the
|
|
150
|
+
// drop-and-continue path instead of entering the full agent loop.
|
|
151
|
+
const { conversation, queue, persistCalls } = makeFakeConversation({
|
|
152
|
+
persistError: new Error("disk exploded"),
|
|
153
|
+
activityFailures: 1,
|
|
154
|
+
});
|
|
155
|
+
queue.push(makeQueued("hello there", "r1", events));
|
|
156
|
+
|
|
157
|
+
await kickQueueDrain(conversation as never);
|
|
158
|
+
|
|
159
|
+
// The first attempt popped r1 and then threw; the restore put it back,
|
|
160
|
+
// so the retry drained r1 itself instead of skipping past it.
|
|
161
|
+
expect(persistCalls).toEqual(["hello there"]);
|
|
162
|
+
expect(queue.length).toBe(0);
|
|
163
|
+
expect(
|
|
164
|
+
events.filter((event) => event.category === "queue_drain_failed"),
|
|
165
|
+
).toEqual([]);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test("a persistent post-dequeue throw leaves the message queued and notified", async () => {
|
|
169
|
+
const events: FakeEvent[] = [];
|
|
170
|
+
const { conversation, queue, persistCalls } = makeFakeConversation({
|
|
171
|
+
activityFailures: 2,
|
|
172
|
+
});
|
|
173
|
+
queue.push(makeQueued("hello there", "r1", events));
|
|
174
|
+
|
|
175
|
+
await kickQueueDrain(conversation as never);
|
|
176
|
+
|
|
177
|
+
// Both attempts popped and restored r1: it is back at the head and its
|
|
178
|
+
// sender was told about the stall — not silently lost.
|
|
179
|
+
expect(persistCalls).toEqual([]);
|
|
180
|
+
expect(queue.length).toBe(1);
|
|
181
|
+
expect(queue.peek(0)?.requestId).toBe("r1");
|
|
182
|
+
expect(
|
|
183
|
+
events.filter(
|
|
184
|
+
(event) =>
|
|
185
|
+
event.type === "error" && event.category === "queue_drain_failed",
|
|
186
|
+
).length,
|
|
187
|
+
).toBe(1);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test("a batch popped before a throw is restored in order", async () => {
|
|
191
|
+
const events: FakeEvent[] = [];
|
|
192
|
+
const { conversation, queue, persistCalls } = makeFakeConversation({
|
|
193
|
+
activityFailures: 2,
|
|
194
|
+
});
|
|
195
|
+
queue.push(makeQueued("first", "r1", events));
|
|
196
|
+
queue.push(makeQueued("second", "r2", events));
|
|
197
|
+
|
|
198
|
+
await kickQueueDrain(conversation as never);
|
|
199
|
+
|
|
200
|
+
// Both batchable messages were shifted out together; both attempts threw
|
|
201
|
+
// after the pop, and the restore preserved their order for the next
|
|
202
|
+
// drain trigger.
|
|
203
|
+
expect(persistCalls).toEqual([]);
|
|
204
|
+
expect(queue.length).toBe(2);
|
|
205
|
+
expect(queue.peek(0)?.requestId).toBe("r1");
|
|
206
|
+
expect(queue.peek(1)?.requestId).toBe("r2");
|
|
207
|
+
const failures = events.filter(
|
|
208
|
+
(event) =>
|
|
209
|
+
event.type === "error" && event.category === "queue_drain_failed",
|
|
210
|
+
);
|
|
211
|
+
expect(failures.map((event) => event.requestId).sort()).toEqual([
|
|
212
|
+
"r1",
|
|
213
|
+
"r2",
|
|
214
|
+
]);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test("a healthy drain runs once with no retry and no failure events", async () => {
|
|
218
|
+
const events: FakeEvent[] = [];
|
|
219
|
+
const { conversation, queue, persistCalls } = makeFakeConversation({
|
|
220
|
+
persistError: new Error("disk exploded"),
|
|
221
|
+
});
|
|
222
|
+
queue.push(makeQueued("hello there", "r1", events));
|
|
223
|
+
|
|
224
|
+
await kickQueueDrain(conversation as never);
|
|
225
|
+
|
|
226
|
+
expect(persistCalls.length).toBe(1);
|
|
227
|
+
expect(queue.length).toBe(0);
|
|
228
|
+
expect(
|
|
229
|
+
events.filter((event) => event.category === "queue_drain_failed"),
|
|
230
|
+
).toEqual([]);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
@@ -19,6 +19,10 @@ import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
|
19
19
|
|
|
20
20
|
import { RiskLevel } from "../permissions/types.js";
|
|
21
21
|
import type { ToolExecutionResult } from "../tools/types.js";
|
|
22
|
+
import {
|
|
23
|
+
installThresholdReaderMock,
|
|
24
|
+
thresholdReaderMock,
|
|
25
|
+
} from "./gateway-threshold-reader-mock.js";
|
|
22
26
|
|
|
23
27
|
// ---------------------------------------------------------------------------
|
|
24
28
|
// Mock setup — mirrors require-fresh-approval.test.ts patterns
|
|
@@ -37,8 +41,20 @@ let dynamicSkillLoad = false;
|
|
|
37
41
|
*/
|
|
38
42
|
let checkDecision = "prompt";
|
|
39
43
|
|
|
44
|
+
// The real builder returns undefined for these contexts (guardian turns with
|
|
45
|
+
// no channel coordinates), which is what this suite wants. It is registered
|
|
46
|
+
// rather than hard-coded because `mock.module` is process-global: a stub that
|
|
47
|
+
// always returned undefined would also be the builder other test files see,
|
|
48
|
+
// silently stripping the channel coordinates their contexts supply. Captured
|
|
49
|
+
// by value first — `mock.module` swaps the module's exports in place, so
|
|
50
|
+
// reading it through the namespace inside the factory would recurse.
|
|
51
|
+
const realCellQueryModule =
|
|
52
|
+
await import("../permissions/channel-permission-query.js");
|
|
40
53
|
mock.module("../permissions/channel-permission-query.js", () => ({
|
|
41
|
-
buildChannelPermissionCellQuery:
|
|
54
|
+
buildChannelPermissionCellQuery:
|
|
55
|
+
realCellQueryModule.buildChannelPermissionCellQuery,
|
|
56
|
+
effectiveChannelCellThreshold:
|
|
57
|
+
realCellQueryModule.effectiveChannelCellThreshold,
|
|
42
58
|
}));
|
|
43
59
|
|
|
44
60
|
// The scenario under test is "no trust rule covers this load" (a covering rule
|
|
@@ -74,11 +90,8 @@ mock.module("../tools/registry.js", () => ({
|
|
|
74
90
|
|
|
75
91
|
// Background threshold "medium" covers the medium-risk load — the guard,
|
|
76
92
|
// not the threshold, must be what blocks the dynamic case.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
refreshAutoApproveThreshold: async () => null,
|
|
80
|
-
_clearGlobalCacheForTesting: () => {},
|
|
81
|
-
}));
|
|
93
|
+
installThresholdReaderMock();
|
|
94
|
+
thresholdReaderMock.threshold = "medium";
|
|
82
95
|
|
|
83
96
|
mock.module("../tools/shared/filesystem/path-policy.js", () => ({
|
|
84
97
|
sandboxPolicy: () => ({ ok: false }),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Behavioral test for the generic CLI→daemon event bridge.
|
|
3
3
|
*
|
|
4
|
-
* Callers write a JSON-encoded {@link
|
|
4
|
+
* Callers write a JSON-encoded {@link AssistantEvent} to
|
|
5
5
|
* `<signalsDir>/emit-event`. {@link handleEmitEventSignal} reads that
|
|
6
6
|
* payload and republishes it through the {@link assistantEventHub} so
|
|
7
7
|
* SSE subscribers receive it.
|
|
@@ -10,8 +10,7 @@ import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
|
10
10
|
import { join } from "node:path";
|
|
11
11
|
import { afterEach, describe, expect, test } from "bun:test";
|
|
12
12
|
|
|
13
|
-
import type {
|
|
14
|
-
import type { AssistantEvent } from "../runtime/assistant-event.js";
|
|
13
|
+
import type { AssistantEvent, AssistantEventEnvelope } from "../api/index.js";
|
|
15
14
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
16
15
|
import { handleEmitEventSignal } from "../signals/emit-event.js";
|
|
17
16
|
import { getSignalsDir } from "../util/platform.js";
|
|
@@ -33,14 +32,14 @@ afterEach(() => {
|
|
|
33
32
|
});
|
|
34
33
|
|
|
35
34
|
describe("handleEmitEventSignal", () => {
|
|
36
|
-
test("reads a
|
|
35
|
+
test("reads a AssistantEvent from the signal file and publishes it to the event hub", async () => {
|
|
37
36
|
mkdirSync(getSignalsDir(), { recursive: true });
|
|
38
37
|
|
|
39
|
-
const payload:
|
|
38
|
+
const payload: AssistantEvent = { type: "contacts_changed" };
|
|
40
39
|
|
|
41
40
|
writeFileSync(signalPath(), JSON.stringify(payload), "utf-8");
|
|
42
41
|
|
|
43
|
-
const received:
|
|
42
|
+
const received: AssistantEventEnvelope[] = [];
|
|
44
43
|
let resolveDelivered: (() => void) | null = null;
|
|
45
44
|
const delivered = new Promise<void>((resolve) => {
|
|
46
45
|
resolveDelivered = resolve;
|
|
@@ -7,13 +7,15 @@
|
|
|
7
7
|
*
|
|
8
8
|
* No source-module imports
|
|
9
9
|
* ------------------------
|
|
10
|
-
* This file has ZERO imports from `src/`. It accesses the store-path
|
|
10
|
+
* This file has ZERO runtime imports from `src/`. It accesses the store-path
|
|
11
11
|
* override state via the shared `globalThis.vellumAssistant.storePathOverride`
|
|
12
|
-
* slot that `src/security/store-path-override.ts` also reads/writes
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
12
|
+
* slot that `src/security/store-path-override.ts` also reads/writes, typed by
|
|
13
|
+
* the shared ambient `VellumStorePathOverride` (declared in
|
|
14
|
+
* `src/vellum-assistant-namespace.d.ts`). That ambient type is pure
|
|
15
|
+
* compile-time information — referencing it adds nothing to this file's runtime
|
|
16
|
+
* import graph — so keeping the helper off the production import graph (what
|
|
17
|
+
* protects the test preload from a broken `node_modules` symlink, DB ghost #3)
|
|
18
|
+
* still holds.
|
|
17
19
|
*
|
|
18
20
|
* Most tests no longer need these overrides: the test preload places
|
|
19
21
|
* `VELLUM_WORKSPACE_DIR` at `<tmpRoot>/workspace`, so `getProtectedDir()`
|
|
@@ -22,20 +24,8 @@
|
|
|
22
24
|
* (env-var fallbacks, migration corner cases, etc.).
|
|
23
25
|
*/
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
type PathSlot = {
|
|
28
|
-
storePath: string | null;
|
|
29
|
-
storeKeyPath: string | null;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
type VellumAssistantNamespace = {
|
|
33
|
-
storePathOverride?: PathSlot;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
function pathSlot(): PathSlot {
|
|
37
|
-
const g = globalThis as { vellumAssistant?: VellumAssistantNamespace };
|
|
38
|
-
const ns = (g.vellumAssistant ??= {});
|
|
27
|
+
function pathSlot(): VellumStorePathOverride {
|
|
28
|
+
const ns = (globalThis.vellumAssistant ??= {});
|
|
39
29
|
return (ns.storePathOverride ??= { storePath: null, storeKeyPath: null });
|
|
40
30
|
}
|
|
41
31
|
|