@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
|
@@ -9,7 +9,7 @@ import type {
|
|
|
9
9
|
CheckpointInfo,
|
|
10
10
|
ExitReason,
|
|
11
11
|
} from "../agent/loop.js";
|
|
12
|
-
import type {
|
|
12
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
13
13
|
import type { Message, ProviderResponse } from "../providers/types.js";
|
|
14
14
|
import { stampAndBuffer } from "../runtime/assistant-stream-state.js";
|
|
15
15
|
import { setConfig } from "./helpers/set-config.js";
|
|
@@ -376,7 +376,7 @@ type ConversationWithWorkspaceDeps = Conversation & {
|
|
|
376
376
|
};
|
|
377
377
|
|
|
378
378
|
function makeConversation(
|
|
379
|
-
sendToClient?: (msg:
|
|
379
|
+
sendToClient?: (msg: AssistantEvent) => void,
|
|
380
380
|
): Conversation {
|
|
381
381
|
const provider = {
|
|
382
382
|
name: "mock",
|
|
@@ -504,8 +504,8 @@ describe("Conversation message queue", () => {
|
|
|
504
504
|
const conversation = makeConversation();
|
|
505
505
|
await conversation.loadFromDb();
|
|
506
506
|
|
|
507
|
-
const events1:
|
|
508
|
-
const events2:
|
|
507
|
+
const events1: AssistantEvent[] = [];
|
|
508
|
+
const events2: AssistantEvent[] = [];
|
|
509
509
|
|
|
510
510
|
// Start first message — this will block on AgentLoop.run
|
|
511
511
|
const p1 = conversation.processMessage({
|
|
@@ -553,9 +553,9 @@ describe("Conversation message queue", () => {
|
|
|
553
553
|
const conversation = makeConversation();
|
|
554
554
|
await conversation.loadFromDb();
|
|
555
555
|
|
|
556
|
-
const events1:
|
|
557
|
-
const events2:
|
|
558
|
-
const events3:
|
|
556
|
+
const events1: AssistantEvent[] = [];
|
|
557
|
+
const events2: AssistantEvent[] = [];
|
|
558
|
+
const events3: AssistantEvent[] = [];
|
|
559
559
|
|
|
560
560
|
// Start first message
|
|
561
561
|
const p1 = conversation.processMessage({
|
|
@@ -673,7 +673,7 @@ describe("Conversation message queue", () => {
|
|
|
673
673
|
const conversation = makeConversation();
|
|
674
674
|
await conversation.loadFromDb();
|
|
675
675
|
|
|
676
|
-
const events2:
|
|
676
|
+
const events2: AssistantEvent[] = [];
|
|
677
677
|
|
|
678
678
|
// Start first message
|
|
679
679
|
const p1 = conversation.processMessage({
|
|
@@ -714,8 +714,8 @@ describe("Conversation message queue", () => {
|
|
|
714
714
|
const conversation = makeConversation();
|
|
715
715
|
await conversation.loadFromDb();
|
|
716
716
|
|
|
717
|
-
const events2:
|
|
718
|
-
const events3:
|
|
717
|
+
const events2: AssistantEvent[] = [];
|
|
718
|
+
const events3: AssistantEvent[] = [];
|
|
719
719
|
|
|
720
720
|
// Start first message
|
|
721
721
|
conversation.processMessage({
|
|
@@ -785,7 +785,7 @@ describe("Conversation message queue", () => {
|
|
|
785
785
|
const conversation = makeConversation();
|
|
786
786
|
await conversation.loadFromDb();
|
|
787
787
|
|
|
788
|
-
const events:
|
|
788
|
+
const events: AssistantEvent[] = [];
|
|
789
789
|
|
|
790
790
|
// Start a message — blocks on AgentLoop.run
|
|
791
791
|
const p1 = conversation.processMessage({
|
|
@@ -851,9 +851,9 @@ describe("Conversation message queue", () => {
|
|
|
851
851
|
const conversation = makeConversation();
|
|
852
852
|
await conversation.loadFromDb();
|
|
853
853
|
|
|
854
|
-
const events1:
|
|
855
|
-
const events2:
|
|
856
|
-
const events3:
|
|
854
|
+
const events1: AssistantEvent[] = [];
|
|
855
|
+
const events2: AssistantEvent[] = [];
|
|
856
|
+
const events3: AssistantEvent[] = [];
|
|
857
857
|
|
|
858
858
|
// Start first message — blocks on AgentLoop.run
|
|
859
859
|
const p1 = conversation.processMessage({
|
|
@@ -973,10 +973,10 @@ describe("Batched drain", () => {
|
|
|
973
973
|
const conversation = makeConversation();
|
|
974
974
|
await conversation.loadFromDb();
|
|
975
975
|
|
|
976
|
-
const events2:
|
|
977
|
-
const events3:
|
|
978
|
-
const events4:
|
|
979
|
-
const events5:
|
|
976
|
+
const events2: AssistantEvent[] = [];
|
|
977
|
+
const events3: AssistantEvent[] = [];
|
|
978
|
+
const events4: AssistantEvent[] = [];
|
|
979
|
+
const events5: AssistantEvent[] = [];
|
|
980
980
|
|
|
981
981
|
// Start in-flight message (msg-1)
|
|
982
982
|
const p1 = conversation.processMessage({
|
|
@@ -1085,9 +1085,9 @@ describe("Batched drain", () => {
|
|
|
1085
1085
|
const conversation = makeConversation();
|
|
1086
1086
|
await conversation.loadFromDb();
|
|
1087
1087
|
|
|
1088
|
-
const eventsHello:
|
|
1089
|
-
const eventsSlash:
|
|
1090
|
-
const eventsWorld:
|
|
1088
|
+
const eventsHello: AssistantEvent[] = [];
|
|
1089
|
+
const eventsSlash: AssistantEvent[] = [];
|
|
1090
|
+
const eventsWorld: AssistantEvent[] = [];
|
|
1091
1091
|
|
|
1092
1092
|
// Start in-flight message
|
|
1093
1093
|
const p1 = conversation.processMessage({
|
|
@@ -1158,9 +1158,9 @@ describe("Batched drain", () => {
|
|
|
1158
1158
|
const conversation = makeConversation();
|
|
1159
1159
|
await conversation.loadFromDb();
|
|
1160
1160
|
|
|
1161
|
-
const eventsPlainA:
|
|
1162
|
-
const eventsSlash:
|
|
1163
|
-
const eventsPlainB:
|
|
1161
|
+
const eventsPlainA: AssistantEvent[] = [];
|
|
1162
|
+
const eventsSlash: AssistantEvent[] = [];
|
|
1163
|
+
const eventsPlainB: AssistantEvent[] = [];
|
|
1164
1164
|
|
|
1165
1165
|
// Start in-flight message
|
|
1166
1166
|
const p1 = conversation.processMessage({
|
|
@@ -1343,7 +1343,7 @@ describe("Batched drain", () => {
|
|
|
1343
1343
|
// A third would push the queue over budget → rejected. Capture its
|
|
1344
1344
|
// onEvent callback so we can verify the queue_full error event reaches
|
|
1345
1345
|
// the rejected caller (not just the synchronous return value).
|
|
1346
|
-
const rejectedEvents:
|
|
1346
|
+
const rejectedEvents: AssistantEvent[] = [];
|
|
1347
1347
|
const rejected = conversation.enqueueMessage({
|
|
1348
1348
|
content: "z".repeat(500),
|
|
1349
1349
|
onEvent: (e) => rejectedEvents.push(e),
|
|
@@ -1421,8 +1421,8 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1421
1421
|
const conversation = makeConversation();
|
|
1422
1422
|
await conversation.loadFromDb();
|
|
1423
1423
|
|
|
1424
|
-
const eventsSurface:
|
|
1425
|
-
const eventsRegular:
|
|
1424
|
+
const eventsSurface: AssistantEvent[] = [];
|
|
1425
|
+
const eventsRegular: AssistantEvent[] = [];
|
|
1426
1426
|
|
|
1427
1427
|
// Start in-flight message
|
|
1428
1428
|
const p1 = conversation.processMessage({
|
|
@@ -1485,10 +1485,10 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1485
1485
|
const conversation = makeConversation();
|
|
1486
1486
|
await conversation.loadFromDb();
|
|
1487
1487
|
|
|
1488
|
-
const events1:
|
|
1489
|
-
const events2:
|
|
1490
|
-
const events3:
|
|
1491
|
-
const events4:
|
|
1488
|
+
const events1: AssistantEvent[] = [];
|
|
1489
|
+
const events2: AssistantEvent[] = [];
|
|
1490
|
+
const events3: AssistantEvent[] = [];
|
|
1491
|
+
const events4: AssistantEvent[] = [];
|
|
1492
1492
|
|
|
1493
1493
|
// Start in-flight message
|
|
1494
1494
|
const p1 = conversation.processMessage({
|
|
@@ -1516,7 +1516,7 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1516
1516
|
// this before enqueueing so the wrapped callback is what drainBatch
|
|
1517
1517
|
// invokes.
|
|
1518
1518
|
let aborted = false;
|
|
1519
|
-
const onMsg3Event = (e:
|
|
1519
|
+
const onMsg3Event = (e: AssistantEvent) => {
|
|
1520
1520
|
events3.push(e);
|
|
1521
1521
|
if (!aborted && e.type === "message_dequeued") {
|
|
1522
1522
|
aborted = true;
|
|
@@ -1564,10 +1564,10 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1564
1564
|
const conversation = makeConversation();
|
|
1565
1565
|
await conversation.loadFromDb();
|
|
1566
1566
|
|
|
1567
|
-
const events1:
|
|
1568
|
-
const events2:
|
|
1569
|
-
const events3:
|
|
1570
|
-
const events4:
|
|
1567
|
+
const events1: AssistantEvent[] = [];
|
|
1568
|
+
const events2: AssistantEvent[] = [];
|
|
1569
|
+
const events3: AssistantEvent[] = [];
|
|
1570
|
+
const events4: AssistantEvent[] = [];
|
|
1571
1571
|
|
|
1572
1572
|
// Start in-flight message
|
|
1573
1573
|
const p1 = conversation.processMessage({
|
|
@@ -1627,10 +1627,10 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1627
1627
|
const conversation = makeConversation();
|
|
1628
1628
|
await conversation.loadFromDb();
|
|
1629
1629
|
|
|
1630
|
-
const events1:
|
|
1631
|
-
const events2:
|
|
1632
|
-
const events3:
|
|
1633
|
-
const events4:
|
|
1630
|
+
const events1: AssistantEvent[] = [];
|
|
1631
|
+
const events2: AssistantEvent[] = [];
|
|
1632
|
+
const events3: AssistantEvent[] = [];
|
|
1633
|
+
const events4: AssistantEvent[] = [];
|
|
1634
1634
|
|
|
1635
1635
|
const p1 = conversation.processMessage({
|
|
1636
1636
|
content: "msg-1",
|
|
@@ -1679,7 +1679,7 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1679
1679
|
});
|
|
1680
1680
|
|
|
1681
1681
|
test("drainBatch emits exactly one activity-state event for the whole batch", async () => {
|
|
1682
|
-
const activityStates:
|
|
1682
|
+
const activityStates: AssistantEvent[] = [];
|
|
1683
1683
|
const conversation = makeConversation((msg) => {
|
|
1684
1684
|
if ("type" in msg && msg.type === "assistant_activity_state") {
|
|
1685
1685
|
activityStates.push(msg);
|
|
@@ -1870,7 +1870,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1870
1870
|
const conversation = makeConversation();
|
|
1871
1871
|
await conversation.loadFromDb();
|
|
1872
1872
|
|
|
1873
|
-
const events1:
|
|
1873
|
+
const events1: AssistantEvent[] = [];
|
|
1874
1874
|
|
|
1875
1875
|
// Start processing first message
|
|
1876
1876
|
const p1 = conversation.processMessage({
|
|
@@ -1955,10 +1955,10 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1955
1955
|
const conversation = makeConversation();
|
|
1956
1956
|
await conversation.loadFromDb();
|
|
1957
1957
|
|
|
1958
|
-
const events1:
|
|
1959
|
-
const events2:
|
|
1960
|
-
const events3:
|
|
1961
|
-
const events4:
|
|
1958
|
+
const events1: AssistantEvent[] = [];
|
|
1959
|
+
const events2: AssistantEvent[] = [];
|
|
1960
|
+
const events3: AssistantEvent[] = [];
|
|
1961
|
+
const events4: AssistantEvent[] = [];
|
|
1962
1962
|
|
|
1963
1963
|
// Start first message (mid-tool-use — will yield at the next checkpoint)
|
|
1964
1964
|
const p1 = conversation.processMessage({
|
|
@@ -2025,8 +2025,8 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2025
2025
|
const conversation = makeConversation();
|
|
2026
2026
|
await conversation.loadFromDb();
|
|
2027
2027
|
|
|
2028
|
-
const events1:
|
|
2029
|
-
const events2:
|
|
2028
|
+
const events1: AssistantEvent[] = [];
|
|
2029
|
+
const events2: AssistantEvent[] = [];
|
|
2030
2030
|
|
|
2031
2031
|
// Start processing first message
|
|
2032
2032
|
const p1 = conversation.processMessage({
|
|
@@ -2094,8 +2094,8 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2094
2094
|
|
|
2095
2095
|
const dequeueOrder: string[] = [];
|
|
2096
2096
|
|
|
2097
|
-
const eventsA:
|
|
2098
|
-
const makeHandler = (label: string) => (e:
|
|
2097
|
+
const eventsA: AssistantEvent[] = [];
|
|
2098
|
+
const makeHandler = (label: string) => (e: AssistantEvent) => {
|
|
2099
2099
|
if (e.type === "message_dequeued") {
|
|
2100
2100
|
dequeueOrder.push(label);
|
|
2101
2101
|
}
|
|
@@ -2205,9 +2205,9 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2205
2205
|
const conversation = makeConversation();
|
|
2206
2206
|
await conversation.loadFromDb();
|
|
2207
2207
|
|
|
2208
|
-
const eventsA:
|
|
2209
|
-
const eventsB:
|
|
2210
|
-
const eventsC:
|
|
2208
|
+
const eventsA: AssistantEvent[] = [];
|
|
2209
|
+
const eventsB: AssistantEvent[] = [];
|
|
2210
|
+
const eventsC: AssistantEvent[] = [];
|
|
2211
2211
|
|
|
2212
2212
|
// Start processing message A
|
|
2213
2213
|
const pA = conversation.processMessage({
|
|
@@ -2305,8 +2305,8 @@ describe("Conversation host attachment directives", () => {
|
|
|
2305
2305
|
writeFileSync(hostPath, "host attachment content");
|
|
2306
2306
|
|
|
2307
2307
|
try {
|
|
2308
|
-
const clientEvents:
|
|
2309
|
-
const events:
|
|
2308
|
+
const clientEvents: AssistantEvent[] = [];
|
|
2309
|
+
const events: AssistantEvent[] = [];
|
|
2310
2310
|
const conversation = makeConversation((msg) => clientEvents.push(msg));
|
|
2311
2311
|
await conversation.loadFromDb();
|
|
2312
2312
|
|
|
@@ -2375,8 +2375,8 @@ describe("Conversation host attachment directives", () => {
|
|
|
2375
2375
|
writeFileSync(hostPath, "host attachment content");
|
|
2376
2376
|
|
|
2377
2377
|
try {
|
|
2378
|
-
const clientEvents:
|
|
2379
|
-
const events:
|
|
2378
|
+
const clientEvents: AssistantEvent[] = [];
|
|
2379
|
+
const events: AssistantEvent[] = [];
|
|
2380
2380
|
const conversation = makeConversation((msg) => clientEvents.push(msg));
|
|
2381
2381
|
await conversation.loadFromDb();
|
|
2382
2382
|
|
|
@@ -2463,7 +2463,7 @@ describe("Conversation attachment event payloads", () => {
|
|
|
2463
2463
|
});
|
|
2464
2464
|
|
|
2465
2465
|
test("message_complete includes assistant attachments", async () => {
|
|
2466
|
-
const events:
|
|
2466
|
+
const events: AssistantEvent[] = [];
|
|
2467
2467
|
const conversation = makeConversation();
|
|
2468
2468
|
await conversation.loadFromDb();
|
|
2469
2469
|
|
|
@@ -2526,7 +2526,7 @@ describe("Conversation attachment event payloads", () => {
|
|
|
2526
2526
|
});
|
|
2527
2527
|
|
|
2528
2528
|
test("generation_handoff includes assistant attachments", async () => {
|
|
2529
|
-
const events1:
|
|
2529
|
+
const events1: AssistantEvent[] = [];
|
|
2530
2530
|
const conversation = makeConversation();
|
|
2531
2531
|
await conversation.loadFromDb();
|
|
2532
2532
|
|
|
@@ -2610,7 +2610,7 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2610
2610
|
});
|
|
2611
2611
|
|
|
2612
2612
|
test("user cancellation emits generation_cancelled, never conversation_error", async () => {
|
|
2613
|
-
const msgEvents:
|
|
2613
|
+
const msgEvents: AssistantEvent[] = [];
|
|
2614
2614
|
const conversation = makeConversation();
|
|
2615
2615
|
await conversation.loadFromDb();
|
|
2616
2616
|
|
|
@@ -2644,7 +2644,7 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2644
2644
|
});
|
|
2645
2645
|
|
|
2646
2646
|
test("post-processing failure still attempts turn-boundary commit", async () => {
|
|
2647
|
-
const events:
|
|
2647
|
+
const events: AssistantEvent[] = [];
|
|
2648
2648
|
const conversation = makeConversation();
|
|
2649
2649
|
await conversation.loadFromDb();
|
|
2650
2650
|
linkAttachmentShouldThrow = true;
|
|
@@ -2699,7 +2699,7 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2699
2699
|
});
|
|
2700
2700
|
|
|
2701
2701
|
test("provider failure during processing emits both conversation_error and generic error", async () => {
|
|
2702
|
-
const allEvents:
|
|
2702
|
+
const allEvents: AssistantEvent[] = [];
|
|
2703
2703
|
const conversation = makeConversation();
|
|
2704
2704
|
await conversation.loadFromDb();
|
|
2705
2705
|
|
|
@@ -2730,7 +2730,7 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2730
2730
|
const conversation = makeConversation();
|
|
2731
2731
|
await conversation.loadFromDb();
|
|
2732
2732
|
|
|
2733
|
-
const eventsPerMsg:
|
|
2733
|
+
const eventsPerMsg: AssistantEvent[][] = [[], [], []];
|
|
2734
2734
|
|
|
2735
2735
|
conversation.processMessage({
|
|
2736
2736
|
content: "msg-1",
|
|
@@ -2787,8 +2787,8 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2787
2787
|
|
|
2788
2788
|
turnCommitHangForever = true;
|
|
2789
2789
|
|
|
2790
|
-
const events1:
|
|
2791
|
-
const events2:
|
|
2790
|
+
const events1: AssistantEvent[] = [];
|
|
2791
|
+
const events2: AssistantEvent[] = [];
|
|
2792
2792
|
|
|
2793
2793
|
// Start first message (promise intentionally not awaited — we test queue drain behavior)
|
|
2794
2794
|
const _p1 = conversation.processMessage({
|
|
@@ -2937,11 +2937,11 @@ describe("persisted-seq anchor advance on user_message_echo", () => {
|
|
|
2937
2937
|
const conversation = makeConversation();
|
|
2938
2938
|
await conversation.loadFromDb();
|
|
2939
2939
|
|
|
2940
|
-
const events1:
|
|
2941
|
-
const eventsQueued:
|
|
2940
|
+
const events1: AssistantEvent[] = [];
|
|
2941
|
+
const eventsQueued: AssistantEvent[] = [];
|
|
2942
2942
|
// Mirror `broadcastMessage`'s inline stamp so `getCurrentSeq()` read
|
|
2943
2943
|
// right after the emit is this echo's seq, as in production.
|
|
2944
|
-
const stampingOnEvent = (sink:
|
|
2944
|
+
const stampingOnEvent = (sink: AssistantEvent[]) => (e: AssistantEvent) => {
|
|
2945
2945
|
stampAndBuffer(e as unknown as Parameters<typeof stampAndBuffer>[0]);
|
|
2946
2946
|
sink.push(e);
|
|
2947
2947
|
};
|
|
@@ -2965,7 +2965,7 @@ describe("persisted-seq anchor advance on user_message_echo", () => {
|
|
|
2965
2965
|
await waitForPendingRun(2);
|
|
2966
2966
|
|
|
2967
2967
|
const echo = eventsQueued.find((e) => e.type === "user_message_echo") as
|
|
2968
|
-
| (
|
|
2968
|
+
| (AssistantEvent & { seq?: number })
|
|
2969
2969
|
| undefined;
|
|
2970
2970
|
const echoSeq = echo?.seq;
|
|
2971
2971
|
if (typeof echoSeq !== "number") {
|
|
@@ -2988,8 +2988,8 @@ describe("persisted-seq anchor advance on user_message_echo", () => {
|
|
|
2988
2988
|
const conversation = makeConversation();
|
|
2989
2989
|
await conversation.loadFromDb();
|
|
2990
2990
|
|
|
2991
|
-
const events1:
|
|
2992
|
-
const eventsNotif:
|
|
2991
|
+
const events1: AssistantEvent[] = [];
|
|
2992
|
+
const eventsNotif: AssistantEvent[] = [];
|
|
2993
2993
|
|
|
2994
2994
|
const p1 = conversation.processMessage({
|
|
2995
2995
|
content: "msg-1",
|
|
@@ -3037,8 +3037,8 @@ describe("subagent notification user_message_echo suppression", () => {
|
|
|
3037
3037
|
const conversation = makeConversation();
|
|
3038
3038
|
await conversation.loadFromDb();
|
|
3039
3039
|
|
|
3040
|
-
const events1:
|
|
3041
|
-
const eventsNotif:
|
|
3040
|
+
const events1: AssistantEvent[] = [];
|
|
3041
|
+
const eventsNotif: AssistantEvent[] = [];
|
|
3042
3042
|
|
|
3043
3043
|
// Occupy the conversation so the injected notification queues.
|
|
3044
3044
|
const p1 = conversation.processMessage({
|
|
@@ -3088,8 +3088,8 @@ describe("subagent notification user_message_echo suppression", () => {
|
|
|
3088
3088
|
const conversation = makeConversation();
|
|
3089
3089
|
await conversation.loadFromDb();
|
|
3090
3090
|
|
|
3091
|
-
const events1:
|
|
3092
|
-
const eventsNormal:
|
|
3091
|
+
const events1: AssistantEvent[] = [];
|
|
3092
|
+
const eventsNormal: AssistantEvent[] = [];
|
|
3093
3093
|
|
|
3094
3094
|
const p1 = conversation.processMessage({
|
|
3095
3095
|
content: "msg-1",
|
|
@@ -3119,8 +3119,8 @@ describe("subagent notification user_message_echo suppression", () => {
|
|
|
3119
3119
|
const conversation = makeConversation();
|
|
3120
3120
|
await conversation.loadFromDb();
|
|
3121
3121
|
|
|
3122
|
-
const events1:
|
|
3123
|
-
const eventsHidden:
|
|
3122
|
+
const events1: AssistantEvent[] = [];
|
|
3123
|
+
const eventsHidden: AssistantEvent[] = [];
|
|
3124
3124
|
|
|
3125
3125
|
// Occupy the conversation so the hidden send queues — e.g. the user
|
|
3126
3126
|
// closes the channel-setup wizard while the assistant is mid-turn.
|
|
@@ -3167,8 +3167,8 @@ describe("subagent notification user_message_echo suppression", () => {
|
|
|
3167
3167
|
const conversation = makeConversation();
|
|
3168
3168
|
await conversation.loadFromDb();
|
|
3169
3169
|
|
|
3170
|
-
const events1:
|
|
3171
|
-
const eventsNotif:
|
|
3170
|
+
const events1: AssistantEvent[] = [];
|
|
3171
|
+
const eventsNotif: AssistantEvent[] = [];
|
|
3172
3172
|
|
|
3173
3173
|
// Occupy the conversation so the injected notification queues.
|
|
3174
3174
|
const p1 = conversation.processMessage({
|
|
@@ -3210,8 +3210,8 @@ describe("subagent notification user_message_echo suppression", () => {
|
|
|
3210
3210
|
const conversation = makeConversation();
|
|
3211
3211
|
await conversation.loadFromDb();
|
|
3212
3212
|
|
|
3213
|
-
const events1:
|
|
3214
|
-
const eventsNotif:
|
|
3213
|
+
const events1: AssistantEvent[] = [];
|
|
3214
|
+
const eventsNotif: AssistantEvent[] = [];
|
|
3215
3215
|
|
|
3216
3216
|
// Occupy the conversation so the injected wake queues.
|
|
3217
3217
|
const p1 = conversation.processMessage({
|
|
@@ -182,7 +182,14 @@ function makeConversation() {
|
|
|
182
182
|
persistUserMessage,
|
|
183
183
|
runAgentLoop,
|
|
184
184
|
setPreactivatedSkillIds: () => {},
|
|
185
|
-
drainQueue: async () => {},
|
|
185
|
+
drainQueue: async (_reason?: string) => {},
|
|
186
|
+
kickDrainQueue(
|
|
187
|
+
this: { drainQueue: (reason?: string) => unknown },
|
|
188
|
+
reason: string = "loop_complete",
|
|
189
|
+
_origin?: string,
|
|
190
|
+
) {
|
|
191
|
+
return this.drainQueue(reason);
|
|
192
|
+
},
|
|
186
193
|
warmPromptCache: () => {},
|
|
187
194
|
getMessages: () => messages,
|
|
188
195
|
assistantId: "self",
|
|
@@ -195,7 +195,14 @@ function makeConversationWithPendingConfirmation(
|
|
|
195
195
|
agentLoopOptions = options;
|
|
196
196
|
},
|
|
197
197
|
setPreactivatedSkillIds: () => {},
|
|
198
|
-
drainQueue: async () => {},
|
|
198
|
+
drainQueue: async (_reason?: string) => {},
|
|
199
|
+
kickDrainQueue(
|
|
200
|
+
this: { drainQueue: (reason?: string) => unknown },
|
|
201
|
+
reason: string = "loop_complete",
|
|
202
|
+
_origin?: string,
|
|
203
|
+
) {
|
|
204
|
+
return this.drainQueue(reason);
|
|
205
|
+
},
|
|
199
206
|
warmPromptCache: () => {},
|
|
200
207
|
getMessages: () => [],
|
|
201
208
|
assistantId: "self",
|
|
@@ -252,7 +252,16 @@ function makeConversation() {
|
|
|
252
252
|
runAgentLoop,
|
|
253
253
|
forceCompact,
|
|
254
254
|
setPreactivatedSkillIds,
|
|
255
|
-
drainQueue: async () => {},
|
|
255
|
+
drainQueue: async (_reason?: string) => {},
|
|
256
|
+
// Forwards to drainQueue so tests that replace the drain observe the
|
|
257
|
+
// route's queue kick through the guarded entry point.
|
|
258
|
+
kickDrainQueue(
|
|
259
|
+
this: { drainQueue: (reason?: string) => unknown },
|
|
260
|
+
reason: string = "loop_complete",
|
|
261
|
+
_origin?: string,
|
|
262
|
+
) {
|
|
263
|
+
return this.drainQueue(reason);
|
|
264
|
+
},
|
|
256
265
|
warmPromptCache: () => {},
|
|
257
266
|
getMessages: () => messages,
|
|
258
267
|
assistantId: "self",
|
|
@@ -78,7 +78,7 @@ let pkbSearchResults: Array<{
|
|
|
78
78
|
hybridScore?: number;
|
|
79
79
|
}> = [];
|
|
80
80
|
let pkbSearchThrows: Error | null = null;
|
|
81
|
-
mock.module("../plugins/defaults/memory/pkb/pkb-search.js", () => ({
|
|
81
|
+
mock.module("../plugins/defaults/memory/v1/pkb/pkb-search.js", () => ({
|
|
82
82
|
searchPkbFiles: async () => {
|
|
83
83
|
if (pkbSearchThrows) {
|
|
84
84
|
throw pkbSearchThrows;
|
|
@@ -151,7 +151,7 @@ import { conversations, messages } from "../persistence/schema/index.js";
|
|
|
151
151
|
import { registerDefaultPluginInjectors } from "../plugins/defaults/index.js";
|
|
152
152
|
import { ConversationGraphMemory } from "../plugins/defaults/memory/graph/conversation-graph-memory.js";
|
|
153
153
|
import postCompact from "../plugins/defaults/memory/hooks/post-compact.js";
|
|
154
|
-
import { getPkbRoot } from "../plugins/defaults/memory/pkb/types.js";
|
|
154
|
+
import { getPkbRoot } from "../plugins/defaults/memory/v1/pkb/types.js";
|
|
155
155
|
import {
|
|
156
156
|
buildUnifiedTurnContextBlock,
|
|
157
157
|
type UnifiedTurnContextOptions,
|
|
@@ -374,6 +374,33 @@ describe("resolveChannelCapabilities", () => {
|
|
|
374
374
|
expect(caps.supportsVoiceInput).toBe(false);
|
|
375
375
|
});
|
|
376
376
|
|
|
377
|
+
test("supportsInlineOptions is true only for inline-button channels", () => {
|
|
378
|
+
// Drives rich approval delivery (and, next, channel-native questions).
|
|
379
|
+
// Same membership as the retired RICH_APPROVAL_CHANNELS set — a channel can
|
|
380
|
+
// render inline buttons yet have no dynamic UI.
|
|
381
|
+
expect(resolveChannelCapabilities("telegram").supportsInlineOptions).toBe(
|
|
382
|
+
true,
|
|
383
|
+
);
|
|
384
|
+
expect(resolveChannelCapabilities("whatsapp").supportsInlineOptions).toBe(
|
|
385
|
+
true,
|
|
386
|
+
);
|
|
387
|
+
expect(resolveChannelCapabilities("slack").supportsInlineOptions).toBe(
|
|
388
|
+
true,
|
|
389
|
+
);
|
|
390
|
+
expect(resolveChannelCapabilities("email").supportsInlineOptions).toBe(
|
|
391
|
+
false,
|
|
392
|
+
);
|
|
393
|
+
expect(resolveChannelCapabilities("phone").supportsInlineOptions).toBe(
|
|
394
|
+
false,
|
|
395
|
+
);
|
|
396
|
+
expect(
|
|
397
|
+
resolveChannelCapabilities(undefined, "macos").supportsInlineOptions,
|
|
398
|
+
).toBe(false);
|
|
399
|
+
expect(
|
|
400
|
+
resolveChannelCapabilities("unknown-thing").supportsInlineOptions,
|
|
401
|
+
).toBe(false);
|
|
402
|
+
});
|
|
403
|
+
|
|
377
404
|
test("propagates chatType when provided", () => {
|
|
378
405
|
const caps = resolveChannelCapabilities("telegram", null, "group");
|
|
379
406
|
expect(caps.chatType).toBe("group");
|
|
@@ -2,7 +2,7 @@ import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
|
2
2
|
|
|
3
3
|
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
4
4
|
import type { AgentEvent, AgentLoopRunResult } from "../agent/loop.js";
|
|
5
|
-
import type {
|
|
5
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
6
6
|
import {
|
|
7
7
|
conversationMessagesSyncTag,
|
|
8
8
|
type SyncChangedEvent,
|
|
@@ -301,9 +301,9 @@ describe("Conversation queue — slash-like messages pass through to agent loop"
|
|
|
301
301
|
const conversation = makeConversation();
|
|
302
302
|
await conversation.loadFromDb();
|
|
303
303
|
|
|
304
|
-
const events1:
|
|
305
|
-
const eventsSlash:
|
|
306
|
-
const events3:
|
|
304
|
+
const events1: AssistantEvent[] = [];
|
|
305
|
+
const eventsSlash: AssistantEvent[] = [];
|
|
306
|
+
const events3: AssistantEvent[] = [];
|
|
307
307
|
|
|
308
308
|
// Start first message — blocks on agent loop
|
|
309
309
|
const p1 = conversation.processMessage({
|
|
@@ -348,8 +348,8 @@ describe("Conversation queue — slash-like messages pass through to agent loop"
|
|
|
348
348
|
const conversation = makeConversation();
|
|
349
349
|
await conversation.loadFromDb();
|
|
350
350
|
|
|
351
|
-
const sharedEvents:
|
|
352
|
-
const sharedOnEvent = (event:
|
|
351
|
+
const sharedEvents: AssistantEvent[] = [];
|
|
352
|
+
const sharedOnEvent = (event: AssistantEvent) => sharedEvents.push(event);
|
|
353
353
|
|
|
354
354
|
const p1 = conversation.processMessage({
|
|
355
355
|
content: "msg-1",
|
|
@@ -390,8 +390,8 @@ describe("Conversation queue — slash-like messages pass through to agent loop"
|
|
|
390
390
|
const conversation = makeConversation();
|
|
391
391
|
await conversation.loadFromDb();
|
|
392
392
|
|
|
393
|
-
const events1:
|
|
394
|
-
const eventsSlash:
|
|
393
|
+
const events1: AssistantEvent[] = [];
|
|
394
|
+
const eventsSlash: AssistantEvent[] = [];
|
|
395
395
|
|
|
396
396
|
// Start first message — blocks on agent loop
|
|
397
397
|
const p1 = conversation.processMessage({
|
|
@@ -433,9 +433,9 @@ describe("Conversation queue — slash-like messages pass through to agent loop"
|
|
|
433
433
|
const conversation = makeConversation();
|
|
434
434
|
await conversation.loadFromDb();
|
|
435
435
|
|
|
436
|
-
const eventsHi:
|
|
437
|
-
const eventsCompact:
|
|
438
|
-
const eventsBye:
|
|
436
|
+
const eventsHi: AssistantEvent[] = [];
|
|
437
|
+
const eventsCompact: AssistantEvent[] = [];
|
|
438
|
+
const eventsBye: AssistantEvent[] = [];
|
|
439
439
|
|
|
440
440
|
// Start in-flight message
|
|
441
441
|
const p1 = conversation.processMessage({
|
|
@@ -2,7 +2,7 @@ import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
|
2
2
|
|
|
3
3
|
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
4
4
|
import type { AgentEvent } from "../agent/loop.js";
|
|
5
|
-
import type {
|
|
5
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
6
6
|
import type { Message, ProviderResponse } from "../providers/types.js";
|
|
7
7
|
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
@@ -255,7 +255,7 @@ describe("Conversation slash command — passthrough for unknown tokens", () =>
|
|
|
255
255
|
|
|
256
256
|
test("normal messages still go through standard path", async () => {
|
|
257
257
|
const conversation = makeConversation();
|
|
258
|
-
const events:
|
|
258
|
+
const events: AssistantEvent[] = [];
|
|
259
259
|
await conversation.processMessage({
|
|
260
260
|
content: "hello world",
|
|
261
261
|
attachments: [],
|
|
@@ -9,7 +9,7 @@ import { describe, expect, mock, test } from "bun:test";
|
|
|
9
9
|
|
|
10
10
|
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
11
11
|
import type { AgentEvent, AgentLoopConfig } from "../agent/loop.js";
|
|
12
|
-
import type {
|
|
12
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
13
13
|
import type { Message, ProviderResponse } from "../providers/types.js";
|
|
14
14
|
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
@@ -208,7 +208,7 @@ function makeProvider() {
|
|
|
208
208
|
};
|
|
209
209
|
}
|
|
210
210
|
|
|
211
|
-
function makeSendToClient(): (msg:
|
|
211
|
+
function makeSendToClient(): (msg: AssistantEvent) => void {
|
|
212
212
|
return () => {};
|
|
213
213
|
}
|
|
214
214
|
|
|
@@ -183,6 +183,15 @@ function makeConversation(opts: { processing?: boolean } = {}) {
|
|
|
183
183
|
summarizeUpToMessage,
|
|
184
184
|
emitActivityState,
|
|
185
185
|
drainQueue,
|
|
186
|
+
// Forwards to drainQueue so tests that spy the drain observe the route's
|
|
187
|
+
// queue kick through the guarded entry point.
|
|
188
|
+
kickDrainQueue(
|
|
189
|
+
this: { drainQueue: (reason?: string) => unknown },
|
|
190
|
+
reason: string = "loop_complete",
|
|
191
|
+
_origin?: string,
|
|
192
|
+
) {
|
|
193
|
+
return this.drainQueue(reason);
|
|
194
|
+
},
|
|
186
195
|
getMessages: () => messages,
|
|
187
196
|
};
|
|
188
197
|
return {
|