@vellumai/assistant 0.10.12 → 0.11.0-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +264 -14
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
- package/src/__tests__/app-conversation-ids.test.ts +204 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-group-tools.test.ts +279 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-lineage.test.ts +235 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/platform-callback-registration.test.ts +10 -10
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/resolve-app-id.test.ts +32 -0
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +26 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +587 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +482 -2
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/api/responses/subagent-detail.ts +13 -0
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/apps/app-store.ts +95 -4
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +178 -65
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/commands/webhooks.help.ts +9 -4
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
- package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/bundled-skills/schedule/SKILL.md +2 -0
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -38
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-lineage.ts +76 -0
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +8 -14
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +32 -16
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +1288 -439
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +298 -15
- package/src/permissions/checker.ts +102 -36
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +269 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/conversation-parent.ts +27 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +9 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/prompts/sections.ts +4 -16
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/subagents-routes.ts +35 -8
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/webhook-routes.ts +89 -30
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/apps/resolve-app-id.ts +15 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/conversation-groups/group_create.ts +63 -0
- package/src/tools/conversation-groups/group_list.ts +20 -0
- package/src/tools/conversation-groups/group_shared.ts +52 -0
- package/src/tools/conversation-groups/move_to_group.ts +106 -0
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/util/platform.ts +15 -0
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/tsconfig.plugin-api.json +1 -1
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -12,11 +12,11 @@ import {
|
|
|
12
12
|
} from "bun:test";
|
|
13
13
|
|
|
14
14
|
import type { LoopToolExecutor } from "../agent/loop.js";
|
|
15
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
15
16
|
import {
|
|
16
17
|
queueConversationNotice,
|
|
17
18
|
resetConversationNoticesForTests,
|
|
18
19
|
} from "../daemon/conversation-notices.js";
|
|
19
|
-
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
20
20
|
import { getConversationDirName } from "../persistence/conversation-directories.js";
|
|
21
21
|
import type { UserPromptSubmitContext } from "../plugin-api/types.js";
|
|
22
22
|
import { resetPluginRegistryAndRegisterDefaults } from "../plugins/defaults/index.js";
|
|
@@ -804,7 +804,16 @@ function makeCtx(
|
|
|
804
804
|
getQueueDepth: () => 0,
|
|
805
805
|
hasQueuedMessages: () => false,
|
|
806
806
|
canHandoffAtCheckpoint: () => false,
|
|
807
|
-
drainQueue: () => {},
|
|
807
|
+
drainQueue: (_reason?: string) => {},
|
|
808
|
+
// Forwards to drainQueue so tests that spy the drain observe the agent
|
|
809
|
+
// loop's post-turn kick through the guarded entry point.
|
|
810
|
+
kickDrainQueue(
|
|
811
|
+
this: { drainQueue: (reason?: string) => unknown },
|
|
812
|
+
reason: string = "loop_complete",
|
|
813
|
+
_origin?: string,
|
|
814
|
+
) {
|
|
815
|
+
return this.drainQueue(reason);
|
|
816
|
+
},
|
|
808
817
|
getTurnInterfaceContext: () => null,
|
|
809
818
|
getTurnChannelContext: () => ({
|
|
810
819
|
userMessageChannel: "vellum" as const,
|
|
@@ -1017,7 +1026,7 @@ describe("session-agent-loop", () => {
|
|
|
1017
1026
|
},
|
|
1018
1027
|
});
|
|
1019
1028
|
|
|
1020
|
-
const events:
|
|
1029
|
+
const events: AssistantEvent[] = [];
|
|
1021
1030
|
const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
|
|
1022
1031
|
const runSpy = spyOn(ctx.agentLoop, "run");
|
|
1023
1032
|
|
|
@@ -1041,7 +1050,7 @@ describe("session-agent-loop", () => {
|
|
|
1041
1050
|
|
|
1042
1051
|
describe("conversation notices", () => {
|
|
1043
1052
|
test("emits queued billing notices after a successful turn", async () => {
|
|
1044
|
-
const events:
|
|
1053
|
+
const events: AssistantEvent[] = [];
|
|
1045
1054
|
const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
|
|
1046
1055
|
queueConversationNotice(ctx.conversationId, "memory-v3-test", {
|
|
1047
1056
|
source: "memory_v3",
|
|
@@ -1078,7 +1087,7 @@ describe("session-agent-loop", () => {
|
|
|
1078
1087
|
resolveAssistantAttachmentsMock.mockImplementation(async () => {
|
|
1079
1088
|
throw new Error("attachment resolution failed");
|
|
1080
1089
|
});
|
|
1081
|
-
const events:
|
|
1090
|
+
const events: AssistantEvent[] = [];
|
|
1082
1091
|
const ctx = makeCtx({ providerResponses: [textResponse("ok")] });
|
|
1083
1092
|
queueConversationNotice(ctx.conversationId, "memory-v3-test", {
|
|
1084
1093
|
source: "memory_v3",
|
|
@@ -1289,7 +1298,7 @@ describe("session-agent-loop", () => {
|
|
|
1289
1298
|
action: "block",
|
|
1290
1299
|
reason: "trusted-contact",
|
|
1291
1300
|
};
|
|
1292
|
-
const events:
|
|
1301
|
+
const events: AssistantEvent[] = [];
|
|
1293
1302
|
const activityStates: unknown[][] = [];
|
|
1294
1303
|
const ctx = makeCtx({
|
|
1295
1304
|
emitActivityState: (...args: unknown[]) => {
|
|
@@ -1361,7 +1370,7 @@ describe("session-agent-loop", () => {
|
|
|
1361
1370
|
|
|
1362
1371
|
describe("tool execution errors via agent loop", () => {
|
|
1363
1372
|
test("error events from agent loop are classified and emitted", async () => {
|
|
1364
|
-
const events:
|
|
1373
|
+
const events: AssistantEvent[] = [];
|
|
1365
1374
|
|
|
1366
1375
|
// The model calls a tool whose executor throws, surfacing an `error`
|
|
1367
1376
|
// event from the loop's catch handler.
|
|
@@ -1380,7 +1389,7 @@ describe("session-agent-loop", () => {
|
|
|
1380
1389
|
});
|
|
1381
1390
|
|
|
1382
1391
|
test("non-error agent loop completion does not emit conversation_error", async () => {
|
|
1383
|
-
const events:
|
|
1392
|
+
const events: AssistantEvent[] = [];
|
|
1384
1393
|
|
|
1385
1394
|
const ctx = makeCtx({
|
|
1386
1395
|
providerResponses: [textResponse("All good")],
|
|
@@ -1398,7 +1407,7 @@ describe("session-agent-loop", () => {
|
|
|
1398
1407
|
|
|
1399
1408
|
describe("LLM request log persistence", () => {
|
|
1400
1409
|
test("record request log captures the actual provider name", async () => {
|
|
1401
|
-
const events:
|
|
1410
|
+
const events: AssistantEvent[] = [];
|
|
1402
1411
|
const rawRequest = {
|
|
1403
1412
|
model: "gpt-4.1",
|
|
1404
1413
|
messages: [{ role: "user", content: "Hello" }],
|
|
@@ -1508,7 +1517,7 @@ describe("session-agent-loop", () => {
|
|
|
1508
1517
|
});
|
|
1509
1518
|
|
|
1510
1519
|
test("record request log handles Responses API shaped payloads", async () => {
|
|
1511
|
-
const events:
|
|
1520
|
+
const events: AssistantEvent[] = [];
|
|
1512
1521
|
const rawRequest = {
|
|
1513
1522
|
model: "gpt-5.4",
|
|
1514
1523
|
instructions: "Be helpful.",
|
|
@@ -1571,7 +1580,7 @@ describe("session-agent-loop", () => {
|
|
|
1571
1580
|
|
|
1572
1581
|
describe("usage accounting", () => {
|
|
1573
1582
|
test("records the actual provider for usage accounting", async () => {
|
|
1574
|
-
const events:
|
|
1583
|
+
const events: AssistantEvent[] = [];
|
|
1575
1584
|
|
|
1576
1585
|
const ctx = makeCtx({
|
|
1577
1586
|
providerResponses: [
|
|
@@ -1627,7 +1636,7 @@ describe("session-agent-loop", () => {
|
|
|
1627
1636
|
});
|
|
1628
1637
|
|
|
1629
1638
|
test("persists the served model onto the assistant row's metadata at finalize", async () => {
|
|
1630
|
-
const events:
|
|
1639
|
+
const events: AssistantEvent[] = [];
|
|
1631
1640
|
|
|
1632
1641
|
const ctx = makeCtx({
|
|
1633
1642
|
providerResponses: [
|
|
@@ -1654,7 +1663,7 @@ describe("session-agent-loop", () => {
|
|
|
1654
1663
|
|
|
1655
1664
|
describe("checkpoint handoff (infinite loop prevention)", () => {
|
|
1656
1665
|
test("yields at checkpoint when canHandoffAtCheckpoint returns true", async () => {
|
|
1657
|
-
const events:
|
|
1666
|
+
const events: AssistantEvent[] = [];
|
|
1658
1667
|
|
|
1659
1668
|
// A tool turn drives the loop to its first mid-loop checkpoint, where the
|
|
1660
1669
|
// orchestrator yields for a queued handoff.
|
|
@@ -1682,7 +1691,7 @@ describe("session-agent-loop", () => {
|
|
|
1682
1691
|
});
|
|
1683
1692
|
|
|
1684
1693
|
test("continues when canHandoffAtCheckpoint returns false", async () => {
|
|
1685
|
-
const events:
|
|
1694
|
+
const events: AssistantEvent[] = [];
|
|
1686
1695
|
|
|
1687
1696
|
// The tool turn reaches a checkpoint, but with handoff disabled the loop
|
|
1688
1697
|
// continues to the next turn and completes normally.
|
|
@@ -1717,7 +1726,7 @@ describe("session-agent-loop", () => {
|
|
|
1717
1726
|
|
|
1718
1727
|
describe("user cancellation", () => {
|
|
1719
1728
|
test("emits generation_cancelled when abort signal fires", async () => {
|
|
1720
|
-
const events:
|
|
1729
|
+
const events: AssistantEvent[] = [];
|
|
1721
1730
|
const abortController = new AbortController();
|
|
1722
1731
|
|
|
1723
1732
|
// The provider completes its response but the user cancels mid-turn, so
|
|
@@ -1739,7 +1748,7 @@ describe("session-agent-loop", () => {
|
|
|
1739
1748
|
});
|
|
1740
1749
|
|
|
1741
1750
|
test("handles AbortError thrown from agent loop as user cancellation", async () => {
|
|
1742
|
-
const events:
|
|
1751
|
+
const events: AssistantEvent[] = [];
|
|
1743
1752
|
const abortController = new AbortController();
|
|
1744
1753
|
|
|
1745
1754
|
// The provider rejects with an AbortError after the user cancels.
|
|
@@ -1764,7 +1773,7 @@ describe("session-agent-loop", () => {
|
|
|
1764
1773
|
});
|
|
1765
1774
|
|
|
1766
1775
|
test("skips resolveAssistantAttachments when cancelled", async () => {
|
|
1767
|
-
const events:
|
|
1776
|
+
const events: AssistantEvent[] = [];
|
|
1768
1777
|
const abortController = new AbortController();
|
|
1769
1778
|
resolveAssistantAttachmentsMock.mockClear();
|
|
1770
1779
|
|
|
@@ -1821,7 +1830,7 @@ describe("session-agent-loop", () => {
|
|
|
1821
1830
|
|
|
1822
1831
|
test("clears state and surfaces a processing error when the provider call fails", async () => {
|
|
1823
1832
|
// GIVEN a real loop whose provider rejects with an unexpected error
|
|
1824
|
-
const events:
|
|
1833
|
+
const events: AssistantEvent[] = [];
|
|
1825
1834
|
const ctx = makeCtx({
|
|
1826
1835
|
loopProvider: {
|
|
1827
1836
|
name: "mock-provider",
|
|
@@ -1868,7 +1877,7 @@ describe("session-agent-loop", () => {
|
|
|
1868
1877
|
// GIVEN a provider whose call wedges: it acknowledges the user cancel
|
|
1869
1878
|
// (aborts the signal) but its promise never settles and never observes
|
|
1870
1879
|
// the signal — the exact condition that latched `processing` true.
|
|
1871
|
-
const events:
|
|
1880
|
+
const events: AssistantEvent[] = [];
|
|
1872
1881
|
const abortController = new AbortController();
|
|
1873
1882
|
let drainReason: string | undefined;
|
|
1874
1883
|
// The provider's call wedges on this promise. It settles only on test
|
|
@@ -1925,7 +1934,7 @@ describe("session-agent-loop", () => {
|
|
|
1925
1934
|
|
|
1926
1935
|
describe("stale pending surface cleanup", () => {
|
|
1927
1936
|
test("auto-completes non-dynamic_page pending surfaces on regular user message", async () => {
|
|
1928
|
-
const events:
|
|
1937
|
+
const events: AssistantEvent[] = [];
|
|
1929
1938
|
|
|
1930
1939
|
const ctx = makeCtx();
|
|
1931
1940
|
// Pre-populate a stale pending table surface
|
|
@@ -1956,7 +1965,7 @@ describe("session-agent-loop", () => {
|
|
|
1956
1965
|
});
|
|
1957
1966
|
|
|
1958
1967
|
test("does not auto-complete surfaces when request is a surface action", async () => {
|
|
1959
|
-
const events:
|
|
1968
|
+
const events: AssistantEvent[] = [];
|
|
1960
1969
|
|
|
1961
1970
|
const ctx = makeCtx();
|
|
1962
1971
|
ctx.pendingSurfaceActions.set("active-table-1", { surfaceType: "table" });
|
|
@@ -1982,7 +1991,7 @@ describe("session-agent-loop", () => {
|
|
|
1982
1991
|
});
|
|
1983
1992
|
|
|
1984
1993
|
test("no-op when no pending surfaces exist", async () => {
|
|
1985
|
-
const events:
|
|
1994
|
+
const events: AssistantEvent[] = [];
|
|
1986
1995
|
|
|
1987
1996
|
const ctx = makeCtx();
|
|
1988
1997
|
// No pending surfaces
|
|
@@ -1998,7 +2007,7 @@ describe("session-agent-loop", () => {
|
|
|
1998
2007
|
});
|
|
1999
2008
|
|
|
2000
2009
|
test("does not auto-complete surfaces for internal/subagent turns (no isUserMessage)", async () => {
|
|
2001
|
-
const events:
|
|
2010
|
+
const events: AssistantEvent[] = [];
|
|
2002
2011
|
|
|
2003
2012
|
const ctx = makeCtx();
|
|
2004
2013
|
ctx.pendingSurfaceActions.set("active-table-1", { surfaceType: "table" });
|
|
@@ -2024,7 +2033,7 @@ describe("session-agent-loop", () => {
|
|
|
2024
2033
|
const ctx = makeCtx();
|
|
2025
2034
|
ctx.pendingSurfaceActions.set("stale-table-1", { surfaceType: "table" });
|
|
2026
2035
|
|
|
2027
|
-
const throwingOnEvent = (msg:
|
|
2036
|
+
const throwingOnEvent = (msg: AssistantEvent) => {
|
|
2028
2037
|
_eventCount++;
|
|
2029
2038
|
if (msg.type === "ui_surface_complete") {
|
|
2030
2039
|
throw new Error("onEvent sink failed");
|
|
@@ -2130,7 +2139,7 @@ describe("session-agent-loop", () => {
|
|
|
2130
2139
|
throw new Error("simulated DB failure");
|
|
2131
2140
|
});
|
|
2132
2141
|
|
|
2133
|
-
const events:
|
|
2142
|
+
const events: AssistantEvent[] = [];
|
|
2134
2143
|
const ctx = makeCtx();
|
|
2135
2144
|
|
|
2136
2145
|
// Should not throw; agent loop continues and emits message_complete.
|
|
@@ -2145,7 +2154,7 @@ describe("session-agent-loop", () => {
|
|
|
2145
2154
|
|
|
2146
2155
|
describe("error-only response with no assistant text", () => {
|
|
2147
2156
|
test("synthesizes error assistant message when provider returns no response", async () => {
|
|
2148
|
-
const events:
|
|
2157
|
+
const events: AssistantEvent[] = [];
|
|
2149
2158
|
|
|
2150
2159
|
// GIVEN a real loop whose provider rejects with a generic error
|
|
2151
2160
|
// (non-ordering, non-context-too-large) so the loop emits `error` and
|
|
@@ -2179,7 +2188,7 @@ describe("session-agent-loop", () => {
|
|
|
2179
2188
|
// its `llm_request_logs` row orphaned. Without the backfill call in
|
|
2180
2189
|
// the synthetic-message branch, a later turn's `handleMessageComplete`
|
|
2181
2190
|
// sweep would wrong-attach this row to the wrong assistant message.
|
|
2182
|
-
const events:
|
|
2191
|
+
const events: AssistantEvent[] = [];
|
|
2183
2192
|
|
|
2184
2193
|
// GIVEN a real loop whose provider rejects: the loop emits
|
|
2185
2194
|
// `provider_error` (writing an `llm_request_logs` row with
|
|
@@ -2225,7 +2234,7 @@ describe("session-agent-loop", () => {
|
|
|
2225
2234
|
retryable: false,
|
|
2226
2235
|
errorCategory: "managed_key_invalid",
|
|
2227
2236
|
};
|
|
2228
|
-
const events:
|
|
2237
|
+
const events: AssistantEvent[] = [];
|
|
2229
2238
|
|
|
2230
2239
|
const ctx = makeCtx({
|
|
2231
2240
|
loopProvider: {
|
|
@@ -2351,7 +2360,7 @@ describe("session-agent-loop", () => {
|
|
|
2351
2360
|
metadata: null,
|
|
2352
2361
|
};
|
|
2353
2362
|
|
|
2354
|
-
const events:
|
|
2363
|
+
const events: AssistantEvent[] = [];
|
|
2355
2364
|
let messageCompleteSeenWhenIndexed: boolean | undefined;
|
|
2356
2365
|
indexMessageNowMock.mockImplementationOnce(async () => {
|
|
2357
2366
|
messageCompleteSeenWhenIndexed = events.some(
|
|
@@ -3370,7 +3379,7 @@ describe("session-agent-loop", () => {
|
|
|
3370
3379
|
|
|
3371
3380
|
test("applyCompactionResult records Slack timestamp watermark when provided", async () => {
|
|
3372
3381
|
const ctx = makeCtx();
|
|
3373
|
-
const events:
|
|
3382
|
+
const events: AssistantEvent[] = [];
|
|
3374
3383
|
|
|
3375
3384
|
await applyCompactionResult(
|
|
3376
3385
|
ctx,
|
|
@@ -13,7 +13,7 @@ import { describe, expect, mock, test } from "bun:test";
|
|
|
13
13
|
|
|
14
14
|
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
15
15
|
import type { AgentEvent } from "../agent/loop.js";
|
|
16
|
-
import type {
|
|
16
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
17
17
|
import type { Message, ProviderResponse } from "../providers/types.js";
|
|
18
18
|
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
@@ -176,7 +176,7 @@ function makeProvider() {
|
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
function makeConversation(
|
|
179
|
-
sendToClient?: (msg:
|
|
179
|
+
sendToClient?: (msg: AssistantEvent) => void,
|
|
180
180
|
): Conversation {
|
|
181
181
|
return new Conversation(
|
|
182
182
|
"conv-signals-test",
|
|
@@ -212,7 +212,7 @@ function seedPendingConfirmation(
|
|
|
212
212
|
|
|
213
213
|
describe("centralized confirmation emissions", () => {
|
|
214
214
|
test("handleConfirmationResponse emits confirmation_state_changed with approved state for allow decision", () => {
|
|
215
|
-
const emitted:
|
|
215
|
+
const emitted: AssistantEvent[] = [];
|
|
216
216
|
const conversation = makeConversation((msg) => emitted.push(msg));
|
|
217
217
|
|
|
218
218
|
seedPendingConfirmation(conversation, "req-allow-1");
|
|
@@ -240,7 +240,7 @@ describe("centralized confirmation emissions", () => {
|
|
|
240
240
|
});
|
|
241
241
|
|
|
242
242
|
test("handleConfirmationResponse emits confirmation_state_changed with denied state for deny decision", () => {
|
|
243
|
-
const emitted:
|
|
243
|
+
const emitted: AssistantEvent[] = [];
|
|
244
244
|
const conversation = makeConversation((msg) => emitted.push(msg));
|
|
245
245
|
|
|
246
246
|
seedPendingConfirmation(conversation, "req-deny-1");
|
|
@@ -264,7 +264,7 @@ describe("centralized confirmation emissions", () => {
|
|
|
264
264
|
});
|
|
265
265
|
|
|
266
266
|
test("handleConfirmationResponse emits assistant_activity_state with thinking phase", () => {
|
|
267
|
-
const emitted:
|
|
267
|
+
const emitted: AssistantEvent[] = [];
|
|
268
268
|
const conversation = makeConversation((msg) => emitted.push(msg));
|
|
269
269
|
|
|
270
270
|
seedPendingConfirmation(conversation, "req-activity-1");
|
|
@@ -287,7 +287,7 @@ describe("centralized confirmation emissions", () => {
|
|
|
287
287
|
});
|
|
288
288
|
|
|
289
289
|
test("handleConfirmationResponse passes emissionContext source", () => {
|
|
290
|
-
const emitted:
|
|
290
|
+
const emitted: AssistantEvent[] = [];
|
|
291
291
|
const conversation = makeConversation((msg) => emitted.push(msg));
|
|
292
292
|
|
|
293
293
|
seedPendingConfirmation(conversation, "req-ctx-1");
|
|
@@ -314,7 +314,7 @@ describe("centralized confirmation emissions", () => {
|
|
|
314
314
|
|
|
315
315
|
describe("activity version ordering", () => {
|
|
316
316
|
test("emitActivityState produces monotonically increasing activityVersion", () => {
|
|
317
|
-
const emitted:
|
|
317
|
+
const emitted: AssistantEvent[] = [];
|
|
318
318
|
const conversation = makeConversation((msg) => emitted.push(msg));
|
|
319
319
|
|
|
320
320
|
conversation.emitActivityState("thinking", "message_dequeued");
|
|
@@ -326,7 +326,7 @@ describe("activity version ordering", () => {
|
|
|
326
326
|
|
|
327
327
|
const activityMsgs = emitted.filter(
|
|
328
328
|
(m) => m.type === "assistant_activity_state",
|
|
329
|
-
) as Array<
|
|
329
|
+
) as Array<AssistantEvent & { activityVersion: number }>;
|
|
330
330
|
|
|
331
331
|
expect(activityMsgs).toHaveLength(4);
|
|
332
332
|
|
|
@@ -342,7 +342,7 @@ describe("activity version ordering", () => {
|
|
|
342
342
|
});
|
|
343
343
|
|
|
344
344
|
test("handleConfirmationResponse increments activityVersion for its activity emission", () => {
|
|
345
|
-
const emitted:
|
|
345
|
+
const emitted: AssistantEvent[] = [];
|
|
346
346
|
const conversation = makeConversation((msg) => emitted.push(msg));
|
|
347
347
|
|
|
348
348
|
// Emit a baseline activity state
|
|
@@ -350,7 +350,7 @@ describe("activity version ordering", () => {
|
|
|
350
350
|
|
|
351
351
|
const baselineMsg = emitted.find(
|
|
352
352
|
(m) => m.type === "assistant_activity_state",
|
|
353
|
-
) as
|
|
353
|
+
) as AssistantEvent & { activityVersion: number };
|
|
354
354
|
const baselineVersion = baselineMsg.activityVersion;
|
|
355
355
|
|
|
356
356
|
// Now handle a confirmation
|
|
@@ -359,7 +359,7 @@ describe("activity version ordering", () => {
|
|
|
359
359
|
|
|
360
360
|
const activityMsgs = emitted.filter(
|
|
361
361
|
(m) => m.type === "assistant_activity_state",
|
|
362
|
-
) as Array<
|
|
362
|
+
) as Array<AssistantEvent & { activityVersion: number; reason: string }>;
|
|
363
363
|
|
|
364
364
|
// The confirmation_resolved activity message should have a higher version
|
|
365
365
|
const resolvedMsg = activityMsgs.find(
|
|
@@ -372,7 +372,7 @@ describe("activity version ordering", () => {
|
|
|
372
372
|
|
|
373
373
|
describe("sendToClient receives state signals", () => {
|
|
374
374
|
test("emitActivityState delivers to sendToClient", () => {
|
|
375
|
-
const clientMsgs:
|
|
375
|
+
const clientMsgs: AssistantEvent[] = [];
|
|
376
376
|
const conversation = makeConversation((msg) => clientMsgs.push(msg));
|
|
377
377
|
|
|
378
378
|
conversation.emitActivityState("thinking", "message_dequeued");
|
|
@@ -383,7 +383,7 @@ describe("sendToClient receives state signals", () => {
|
|
|
383
383
|
});
|
|
384
384
|
|
|
385
385
|
test("emitConfirmationStateChanged delivers to sendToClient", () => {
|
|
386
|
-
const clientMsgs:
|
|
386
|
+
const clientMsgs: AssistantEvent[] = [];
|
|
387
387
|
const conversation = makeConversation((msg) => clientMsgs.push(msg));
|
|
388
388
|
|
|
389
389
|
conversation.emitConfirmationStateChanged({
|
|
@@ -399,7 +399,7 @@ describe("sendToClient receives state signals", () => {
|
|
|
399
399
|
});
|
|
400
400
|
|
|
401
401
|
test("handleConfirmationResponse delivers state signals to sendToClient", () => {
|
|
402
|
-
const clientMsgs:
|
|
402
|
+
const clientMsgs: AssistantEvent[] = [];
|
|
403
403
|
const conversation = makeConversation((msg) => clientMsgs.push(msg));
|
|
404
404
|
|
|
405
405
|
seedPendingConfirmation(conversation, "req-signal-confirm");
|
|
@@ -19,12 +19,16 @@ import {
|
|
|
19
19
|
|
|
20
20
|
function createMockSession(
|
|
21
21
|
processing = false,
|
|
22
|
+
queued = false,
|
|
22
23
|
): EvictableConversation & { disposed: boolean } {
|
|
23
24
|
return {
|
|
24
25
|
disposed: false,
|
|
25
26
|
isProcessing() {
|
|
26
27
|
return processing;
|
|
27
28
|
},
|
|
29
|
+
hasQueuedMessages() {
|
|
30
|
+
return queued;
|
|
31
|
+
},
|
|
28
32
|
dispose() {
|
|
29
33
|
this.disposed = true;
|
|
30
34
|
},
|
|
@@ -98,6 +102,21 @@ describe("ConversationEvictor", () => {
|
|
|
98
102
|
expect(sessions.has("a")).toBe(true);
|
|
99
103
|
expect(s1.disposed).toBe(false);
|
|
100
104
|
});
|
|
105
|
+
|
|
106
|
+
test("skips sessions with queued messages even when not processing", () => {
|
|
107
|
+
// Models the gap between a turn's `finally` and the async queue-drain
|
|
108
|
+
// dispatch: isProcessing() is false but a queued turn (e.g. a subagent
|
|
109
|
+
// completion wake) is still pending.
|
|
110
|
+
const s1 = createMockSession(false, true);
|
|
111
|
+
sessions.set("a", s1);
|
|
112
|
+
|
|
113
|
+
const result = evictor.sweep();
|
|
114
|
+
|
|
115
|
+
expect(result.ttlEvicted).toBe(0);
|
|
116
|
+
expect(result.skipped).toBe(1);
|
|
117
|
+
expect(sessions.has("a")).toBe(true);
|
|
118
|
+
expect(s1.disposed).toBe(false);
|
|
119
|
+
});
|
|
101
120
|
});
|
|
102
121
|
|
|
103
122
|
describe("LRU eviction", () => {
|
|
@@ -132,6 +151,36 @@ describe("ConversationEvictor", () => {
|
|
|
132
151
|
expect(sessions.has("s4")).toBe(true);
|
|
133
152
|
});
|
|
134
153
|
|
|
154
|
+
test("skips sessions with queued messages during LRU eviction", () => {
|
|
155
|
+
// maxConversations = 3, add 4 sessions; the LRU one has a queued turn.
|
|
156
|
+
const s0 = createMockSession(false, true); // queued — should not be evicted
|
|
157
|
+
const s1 = createMockSession();
|
|
158
|
+
const s2 = createMockSession();
|
|
159
|
+
const s3 = createMockSession();
|
|
160
|
+
sessions.set("s0", s0);
|
|
161
|
+
sessions.set("s1", s1);
|
|
162
|
+
sessions.set("s2", s2);
|
|
163
|
+
sessions.set("s3", s3);
|
|
164
|
+
|
|
165
|
+
const now = Date.now();
|
|
166
|
+
const lastAccess = (
|
|
167
|
+
evictor as unknown as { lastAccess: Map<string, number> }
|
|
168
|
+
).lastAccess;
|
|
169
|
+
lastAccess.set("s0", now - 50); // old but has queued messages
|
|
170
|
+
lastAccess.set("s1", now - 40);
|
|
171
|
+
lastAccess.set("s2", now);
|
|
172
|
+
lastAccess.set("s3", now);
|
|
173
|
+
|
|
174
|
+
const result = evictor.sweep();
|
|
175
|
+
|
|
176
|
+
// s1 is the LRU evictable session, gets evicted
|
|
177
|
+
expect(result.lruEvicted).toBe(1);
|
|
178
|
+
expect(sessions.has("s0")).toBe(true); // kept: queued messages
|
|
179
|
+
expect(sessions.has("s1")).toBe(false); // evicted: LRU
|
|
180
|
+
expect(s0.disposed).toBe(false);
|
|
181
|
+
expect(s1.disposed).toBe(true);
|
|
182
|
+
});
|
|
183
|
+
|
|
135
184
|
test("skips processing sessions during LRU eviction", () => {
|
|
136
185
|
// maxConversations = 3, add 4 sessions, one processing
|
|
137
186
|
const s0 = createMockSession(true); // processing — should not be evicted
|
|
@@ -483,7 +483,7 @@ describe("forkConversation", () => {
|
|
|
483
483
|
// message — same-millisecond inserts would otherwise make the event
|
|
484
484
|
// "at-or-before" the branch point and inherit.
|
|
485
485
|
const db = getDb();
|
|
486
|
-
const base = Date.now();
|
|
486
|
+
const base = Date.now() - 10_000;
|
|
487
487
|
db.run(
|
|
488
488
|
`UPDATE messages SET created_at = ${base} WHERE id = '${compactedBranchPoint.id}'`,
|
|
489
489
|
);
|