@vellumai/assistant 0.10.12 → 0.11.0-staging.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/ARCHITECTURE.md +4 -5
- package/README.md +1 -1
- package/docs/architecture/memory.md +60 -23
- package/docs/error-handling.md +3 -3
- package/docs/guardian-request-flow.md +112 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/node_modules/@vellumai/gateway-client/package.json +1 -1
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
- package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
- package/openapi.yaml +264 -14
- package/package.json +2 -2
- package/src/__tests__/acp-session.test.ts +3 -3
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
- package/src/__tests__/anthropic-provider.test.ts +40 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
- package/src/__tests__/app-conversation-ids.test.ts +204 -0
- package/src/__tests__/approval-cascade.test.ts +5 -5
- package/src/__tests__/approval-routes-http.test.ts +3 -3
- package/src/__tests__/ask-question-resolver.test.ts +207 -0
- package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
- package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
- package/src/__tests__/assistant-event-hub.test.ts +13 -11
- package/src/__tests__/assistant-event.test.ts +12 -9
- package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
- package/src/__tests__/assistant-stream-state.test.ts +17 -7
- package/src/__tests__/avatar-identity-sync.test.ts +3 -3
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
- package/src/__tests__/call-conversation-messages.test.ts +134 -18
- package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
- package/src/__tests__/channel-approvals.test.ts +0 -27
- package/src/__tests__/channel-guardian.test.ts +85 -512
- package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
- package/src/__tests__/channel-retry-sweep.test.ts +88 -1
- package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
- package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
- package/src/__tests__/compaction-events.test.ts +8 -8
- package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
- package/src/__tests__/config-model-image-provider.test.ts +20 -0
- package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
- package/src/__tests__/config-schema.test.ts +14 -2
- package/src/__tests__/config-set-platform-guard.test.ts +11 -12
- package/src/__tests__/config-sounds-sync.test.ts +4 -4
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
- package/src/__tests__/context-search-memory-source.test.ts +1 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
- package/src/__tests__/context-token-estimator.test.ts +54 -1
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
- package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
- package/src/__tests__/conversation-agent-loop.test.ts +39 -30
- package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
- package/src/__tests__/conversation-evictor.test.ts +49 -0
- package/src/__tests__/conversation-fork-crud.test.ts +1 -1
- package/src/__tests__/conversation-group-tools.test.ts +279 -0
- package/src/__tests__/conversation-history-web-search.test.ts +1 -1
- package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
- package/src/__tests__/conversation-lineage.test.ts +235 -0
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
- package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
- package/src/__tests__/conversation-queue.test.ts +81 -81
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
- package/src/__tests__/conversation-slash-queue.test.ts +11 -11
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
- package/src/__tests__/conversation-speed-override.test.ts +2 -2
- package/src/__tests__/conversation-summarize-route.test.ts +9 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
- package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
- package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
- package/src/__tests__/conversation-sync-tags.test.ts +5 -5
- package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
- package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/daemon-assistant-events.test.ts +14 -15
- package/src/__tests__/db-test-helpers.ts +13 -27
- package/src/__tests__/disk-pressure-routes.test.ts +12 -3
- package/src/__tests__/document-tool-security.test.ts +95 -0
- package/src/__tests__/drain-kick-guard.test.ts +232 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
- package/src/__tests__/emit-event-signal.test.ts +5 -6
- package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
- package/src/__tests__/events-tail-route.test.ts +6 -4
- package/src/__tests__/feature-flag-test-helpers.ts +10 -20
- package/src/__tests__/file-edit-tool.test.ts +24 -4
- package/src/__tests__/file-list-tool.test.ts +2 -1
- package/src/__tests__/file-read-tool.test.ts +62 -10
- package/src/__tests__/file-write-tool.test.ts +24 -5
- package/src/__tests__/followup-tools.test.ts +58 -0
- package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
- package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
- package/src/__tests__/guardian-question-mode.test.ts +42 -3
- package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
- package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +1 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
- package/src/__tests__/host-browser-proxy.test.ts +1 -1
- package/src/__tests__/host-file-edit-tool.test.ts +3 -3
- package/src/__tests__/host-file-read-tool.test.ts +2 -2
- package/src/__tests__/host-file-write-tool.test.ts +7 -3
- package/src/__tests__/host-shell-tool.test.ts +17 -5
- package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
- package/src/__tests__/image-credentials.test.ts +65 -8
- package/src/__tests__/injection-block.test.ts +4 -4
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
- package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
- package/src/__tests__/injector-v3-suppression.test.ts +6 -4
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
- package/src/__tests__/list-messages-page-latest.test.ts +2 -2
- package/src/__tests__/llm-usage-store.test.ts +67 -4
- package/src/__tests__/log-redact.test.ts +18 -0
- package/src/__tests__/managed-profile-guard.test.ts +27 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
- package/src/__tests__/media-generate-image.test.ts +62 -11
- package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
- package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
- package/src/__tests__/notification-decision-strategy.test.ts +115 -11
- package/src/__tests__/notification-deep-link.test.ts +12 -12
- package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
- package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +315 -0
- package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
- package/src/__tests__/persistence-layering-guard.test.ts +2 -2
- package/src/__tests__/pkb-autoinject.test.ts +1 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
- package/src/__tests__/platform-callback-registration.test.ts +10 -10
- package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
- package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
- package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
- package/src/__tests__/require-fresh-approval.test.ts +38 -38
- package/src/__tests__/resolve-app-id.test.ts +32 -0
- package/src/__tests__/run-due-schedules.test.ts +72 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
- package/src/__tests__/runtime-events-sse.test.ts +1 -1
- package/src/__tests__/schedule-routes.test.ts +44 -5
- package/src/__tests__/schedule-store.test.ts +3 -3
- package/src/__tests__/schedule-tools.test.ts +176 -0
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
- package/src/__tests__/secret-response-routing.test.ts +3 -3
- package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
- package/src/__tests__/secret-scanner.test.ts +36 -0
- package/src/__tests__/send-endpoint-busy.test.ts +7 -7
- package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
- package/src/__tests__/starter-task-flow.test.ts +26 -3
- package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
- package/src/__tests__/subagent-disposal.test.ts +40 -11
- package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
- package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
- package/src/__tests__/subagent-manager-notify.test.ts +73 -14
- package/src/__tests__/subagent-notify-parent.test.ts +48 -4
- package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
- package/src/__tests__/subagent-tools.test.ts +64 -0
- package/src/__tests__/sync-message-contract.test.ts +3 -3
- package/src/__tests__/terminal-tools.test.ts +12 -3
- package/src/__tests__/test-preload.ts +9 -0
- package/src/__tests__/tool-approval-handler.test.ts +587 -43
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
- package/src/__tests__/tool-executor.test.ts +116 -0
- package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-start-timestamp.test.ts +4 -4
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
- package/src/__tests__/ui-work-result-surface.test.ts +3 -3
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
- package/src/__tests__/voice-session-bridge.test.ts +44 -44
- package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
- package/src/__tests__/workspace-policy.test.ts +482 -2
- package/src/acp/__tests__/client-handler.test.ts +3 -3
- package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
- package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
- package/src/acp/client-handler.ts +3 -3
- package/src/acp/session-manager.ts +8 -8
- package/src/api/events/subagent-event.ts +2 -2
- package/src/api/responses/memory-v2-activation-log.ts +2 -2
- package/src/api/responses/subagent-detail.ts +13 -0
- package/src/approvals/AGENTS.md +2 -0
- package/src/approvals/guardian-request-resolvers.ts +118 -24
- package/src/apps/app-store.ts +95 -4
- package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
- package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
- package/src/calls/call-controller.ts +27 -27
- package/src/calls/call-conversation-messages.ts +58 -18
- package/src/calls/voice-control-protocol.ts +56 -0
- package/src/calls/voice-session-bridge.ts +178 -65
- package/src/calls/voice-triage-escalate.ts +2 -3
- package/src/channels/config.ts +8 -0
- package/src/channels/types.ts +1 -0
- package/src/cli/commands/config.ts +49 -13
- package/src/cli/commands/memory/index.help.ts +4 -2
- package/src/cli/commands/memory/memory-retrospective.ts +5 -0
- package/src/cli/commands/webhooks.help.ts +9 -4
- package/src/cli/lib/bundled-marketplace.json +12 -0
- package/src/cli.ts +2 -109
- package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
- package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
- package/src/config/assistant-feature-flags.ts +1 -1
- package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
- package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
- package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
- package/src/config/bundled-skills/schedule/SKILL.md +2 -0
- package/src/config/feature-flag-cache.ts +6 -16
- package/src/config/feature-flag-registry.json +14 -38
- package/src/config/loader.ts +7 -1
- package/src/config/memory-tier.ts +15 -10
- package/src/config/memory-v3-gate.test.ts +278 -1
- package/src/config/memory-v3-gate.ts +88 -26
- package/src/config/raw-config-utils.ts +1 -1
- package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/live-voice.ts +33 -7
- package/src/config/schemas/llm.ts +1 -0
- package/src/config/schemas/memory-retrospective.ts +13 -0
- package/src/config/schemas/memory-substrate.ts +183 -0
- package/src/config/schemas/memory-v2.ts +3 -2
- package/src/config/schemas/memory-v3.ts +11 -4
- package/src/config/schemas/memory.ts +35 -1
- package/src/config/schemas/services.ts +10 -2
- package/src/config/substrate-twin-shadowing.ts +195 -0
- package/src/config/webhook-routing.ts +67 -0
- package/src/context/compactor.ts +10 -3
- package/src/context/token-estimator.ts +21 -0
- package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
- package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
- package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
- package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
- package/src/daemon/channel-ui-capability.ts +70 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
- package/src/daemon/conversation-agent-loop.ts +12 -5
- package/src/daemon/conversation-evictor.ts +26 -4
- package/src/daemon/conversation-launch.ts +11 -14
- package/src/daemon/conversation-lineage.ts +76 -0
- package/src/daemon/conversation-messaging.ts +14 -14
- package/src/daemon/conversation-notifiers.ts +2 -2
- package/src/daemon/conversation-process.ts +133 -21
- package/src/daemon/conversation-queue-manager.ts +7 -7
- package/src/daemon/conversation-runtime-assembly.ts +16 -0
- package/src/daemon/conversation-store.ts +11 -3
- package/src/daemon/conversation-surfaces.ts +8 -14
- package/src/daemon/conversation-tool-setup.ts +13 -7
- package/src/daemon/conversation-usage.ts +12 -11
- package/src/daemon/conversation.ts +38 -15
- package/src/daemon/disk-pressure-guard.ts +5 -12
- package/src/daemon/embedding-reconcile.ts +14 -9
- package/src/daemon/handlers/config-channels.ts +40 -134
- package/src/daemon/handlers/config-model.ts +15 -7
- package/src/daemon/handlers/conversations.ts +4 -2
- package/src/daemon/handlers/shared.ts +29 -0
- package/src/daemon/host-proxy-base.ts +4 -4
- package/src/daemon/lifecycle.ts +13 -0
- package/src/daemon/message-protocol.ts +8 -144
- package/src/daemon/message-types/computer-use.ts +0 -12
- package/src/daemon/message-types/conversations.ts +9 -345
- package/src/daemon/message-types/host-app-control.ts +0 -9
- package/src/daemon/message-types/host-browser.ts +0 -7
- package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
- package/src/daemon/message-types/messages.ts +0 -48
- package/src/daemon/message-types/notifications.ts +0 -7
- package/src/daemon/message-types/skills.ts +0 -5
- package/src/daemon/message-types/surfaces.ts +0 -9
- package/src/daemon/message-types/sync.ts +0 -2
- package/src/daemon/process-message.ts +5 -5
- package/src/daemon/skill-memory-refresh.ts +5 -5
- package/src/daemon/tool-side-effects.ts +32 -16
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +4 -4
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
- package/src/heartbeat/heartbeat-run-store.ts +81 -4
- package/src/heartbeat/heartbeat-service.ts +32 -1
- package/src/home/__tests__/feed-writer.test.ts +7 -7
- package/src/home/__tests__/home-content-refresh.test.ts +3 -0
- package/src/home/__tests__/suggested-prompts.test.ts +1 -0
- package/src/home/feed-writer.ts +6 -13
- package/src/home/home-content-refresh.ts +6 -9
- package/src/home/relationship-state-writer.ts +5 -12
- package/src/home/suggested-prompts-cache.ts +6 -19
- package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
- package/src/ipc/events-publish-client.ts +44 -0
- package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
- package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
- package/src/ipc/routes/events-ipc-routes.ts +11 -31
- package/src/live-voice/__tests__/front-decision.test.ts +4 -176
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
- package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
- package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
- package/src/live-voice/front-decision.ts +5 -155
- package/src/live-voice/live-voice-metrics.ts +4 -1
- package/src/live-voice/live-voice-session.ts +1288 -439
- package/src/live-voice/progress-phrases.ts +17 -0
- package/src/live-voice/protocol.ts +15 -0
- package/src/media/app-icon-generator.ts +15 -8
- package/src/media/avatar-router.ts +9 -5
- package/src/media/image-credentials.ts +42 -10
- package/src/media/image-service.ts +1 -13
- package/src/media/types.ts +26 -3
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/__tests__/broadcaster.test.ts +95 -0
- package/src/notifications/adapters/macos.ts +3 -3
- package/src/notifications/broadcaster.ts +57 -0
- package/src/notifications/copy-composer.ts +0 -15
- package/src/notifications/decision-engine.ts +21 -22
- package/src/notifications/guardian-question-mode.ts +57 -2
- package/src/notifications/home-feed-side-effect.ts +4 -0
- package/src/notifications/signal.ts +6 -4
- package/src/notifications/trusted-contact-payloads.ts +3 -4
- package/src/notifications/vellum-card-affinity.ts +39 -0
- package/src/oauth/AGENTS.md +1 -1
- package/src/permissions/channel-permission-query.test.ts +69 -0
- package/src/permissions/channel-permission-query.ts +73 -1
- package/src/permissions/checker.test.ts +298 -15
- package/src/permissions/checker.ts +102 -36
- package/src/permissions/confirmation-guardian-request.test.ts +2 -2
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/gateway-threshold-reader.test.ts +224 -17
- package/src/permissions/gateway-threshold-reader.ts +82 -10
- package/src/permissions/ipc-risk-types.ts +8 -0
- package/src/permissions/prompter.ts +5 -5
- package/src/permissions/question-guardian-request.test.ts +222 -0
- package/src/permissions/question-guardian-request.ts +179 -0
- package/src/permissions/question-prompter.test.ts +8 -8
- package/src/permissions/question-prompter.ts +18 -0
- package/src/permissions/secret-prompter.ts +2 -4
- package/src/permissions/workspace-policy.ts +269 -34
- package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
- package/src/persistence/__tests__/message-content-file.test.ts +58 -3
- package/src/persistence/conversation-crud.ts +93 -0
- package/src/persistence/conversation-key-store.ts +63 -0
- package/src/persistence/conversation-parent.ts +27 -0
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-singleton.ts +14 -27
- package/src/persistence/delivery-crud.ts +45 -0
- package/src/persistence/embeddings/embedding-backend.ts +2 -1
- package/src/persistence/embeddings/embedding-identity.ts +7 -3
- package/src/persistence/job-utils.ts +32 -27
- package/src/persistence/jobs-store.ts +92 -3
- package/src/persistence/lifecycle-quiesce.ts +80 -0
- package/src/persistence/llm-usage-store.ts +45 -8
- package/src/persistence/message-content-file.ts +4 -4
- package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
- package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
- package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
- package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
- package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
- package/src/persistence/schema/infrastructure.ts +11 -0
- package/src/persistence/steps.ts +9 -1
- package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
- package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
- package/src/plugin-api/conversation-turn.ts +4 -4
- package/src/plugin-api/event-hub-facade.ts +15 -6
- package/src/plugin-api/index.ts +10 -4
- package/src/plugin-api/publish-event.ts +36 -0
- package/src/plugins/AGENTS.md +2 -0
- package/src/plugins/defaults/compaction/window-manager.ts +9 -0
- package/src/plugins/defaults/index.ts +9 -13
- package/src/plugins/defaults/memory/AGENTS.md +775 -0
- package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
- package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
- package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
- package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
- package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
- package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
- package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
- package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
- package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
- package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
- package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
- package/src/plugins/defaults/memory/graph/store.ts +1 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
- package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
- package/src/plugins/defaults/memory/indexer.ts +146 -89
- package/src/plugins/defaults/memory/injectors.ts +86 -41
- package/src/plugins/defaults/memory/job-handlers.ts +130 -39
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
- package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
- package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
- package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
- package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
- package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
- package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
- package/src/plugins/defaults/memory/startup.ts +58 -21
- package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
- package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
- package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
- package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
- package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
- package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
- package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
- package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
- package/src/plugins/defaults/memory/tools.test.ts +1 -1
- package/src/plugins/defaults/memory/tools.ts +1 -1
- package/src/plugins/defaults/memory/v1/README.md +5 -0
- package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
- package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
- package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
- package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
- package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
- package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
- package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
- package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
- package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
- package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
- package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
- package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
- package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
- package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
- package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
- package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
- package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
- package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
- package/src/plugins/defaults/memory/v2/activation.ts +30 -163
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
- package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
- package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
- package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
- package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
- package/src/plugins/defaults/memory/v2/injection.ts +36 -26
- package/src/plugins/defaults/memory/v2/migration.ts +2 -2
- package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
- package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
- package/src/plugins/defaults/memory/v2/router.ts +38 -15
- package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
- package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
- package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
- package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
- package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
- package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
- package/src/plugins/defaults/memory/v3/card.ts +25 -9
- package/src/plugins/defaults/memory/v3/edge.ts +52 -18
- package/src/plugins/defaults/memory/v3/gate.ts +4 -4
- package/src/plugins/defaults/memory/v3/injector.ts +10 -3
- package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
- package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
- package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
- package/src/plugins/defaults/memory/v3/prune.ts +40 -16
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
- package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
- package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
- package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
- package/src/plugins/defaults/memory/v3/types.ts +4 -1
- package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
- package/src/plugins/defaults/memory/validation.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -1
- package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
- package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
- package/src/plugins/types.ts +2 -2
- package/src/prompts/sections.ts +4 -16
- package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
- package/src/providers/anthropic/client.ts +15 -6
- package/src/providers/content-block-schema.ts +26 -0
- package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
- package/src/providers/inference/adapter-factory.ts +6 -0
- package/src/providers/inference/connections.ts +30 -14
- package/src/providers/model-catalog.ts +77 -0
- package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
- package/src/providers/openai/chat-completions-provider.ts +65 -17
- package/src/providers/openai/input-audio.ts +76 -0
- package/src/providers/openrouter/client.ts +0 -2
- package/src/providers/platform-proxy/constants.ts +4 -0
- package/src/providers/poolside/client.ts +42 -0
- package/src/providers/registry.ts +40 -8
- package/src/providers/retry.ts +2 -0
- package/src/providers/types.ts +39 -1
- package/src/providers/vercel-ai-gateway/client.ts +0 -2
- package/src/runtime/AGENTS.md +7 -5
- package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
- package/src/runtime/__tests__/question-resolution.test.ts +111 -0
- package/src/runtime/access-request-helper.ts +7 -15
- package/src/runtime/assistant-event-hub.ts +43 -31
- package/src/runtime/assistant-event-publish-options.ts +31 -0
- package/src/runtime/assistant-event.ts +19 -30
- package/src/runtime/assistant-stream-state.ts +4 -4
- package/src/runtime/channel-approvals.ts +0 -25
- package/src/runtime/channel-readiness-service.ts +99 -40
- package/src/runtime/channel-retry-sweep.ts +38 -15
- package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
- package/src/runtime/guardian-reply-router.ts +108 -0
- package/src/runtime/http-server.ts +8 -0
- package/src/runtime/http-types.ts +2 -2
- package/src/runtime/process-role.ts +42 -0
- package/src/runtime/question-request-guardian-bridge.ts +184 -0
- package/src/runtime/question-resolution.ts +153 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
- package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
- package/src/runtime/routes/acp-routes.ts +2 -2
- package/src/runtime/routes/bookmark-routes.ts +3 -15
- package/src/runtime/routes/canned-message-complete.ts +2 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -2
- package/src/runtime/routes/conversation-list-routes.ts +3 -19
- package/src/runtime/routes/conversation-management-routes.ts +1 -5
- package/src/runtime/routes/conversation-query-routes.ts +52 -8
- package/src/runtime/routes/conversation-routes.ts +36 -22
- package/src/runtime/routes/credential-request-routes.ts +0 -1
- package/src/runtime/routes/filing-routes.ts +7 -7
- package/src/runtime/routes/global-search-routes.ts +1 -1
- package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
- package/src/runtime/routes/image-generation-routes.ts +12 -9
- package/src/runtime/routes/inbound-message-handler.ts +17 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
- package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
- package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/lifecycle-routes.ts +199 -0
- package/src/runtime/routes/platform-routes.ts +3 -8
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
- package/src/runtime/routes/question-routes.ts +34 -87
- package/src/runtime/routes/secret-routes.ts +11 -1
- package/src/runtime/routes/settings-routes.ts +8 -18
- package/src/runtime/routes/subagents-routes.ts +35 -8
- package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
- package/src/runtime/routes/webhook-routes.ts +89 -30
- package/src/runtime/routes/workspace-routes.test.ts +7 -4
- package/src/runtime/slack-reply-session.test.ts +12 -12
- package/src/runtime/slack-reply-session.ts +17 -17
- package/src/runtime/sync/sync-publisher.test.ts +7 -5
- package/src/runtime/tool-grant-request-helper.ts +4 -0
- package/src/schedule/schedule-store.ts +70 -0
- package/src/schedule/scheduler.ts +27 -0
- package/src/security/AGENTS.md +1 -1
- package/src/security/credential-key.ts +17 -0
- package/src/security/secret-ingress.ts +14 -105
- package/src/security/secret-patterns.ts +8 -139
- package/src/security/secret-scanner.ts +8 -3
- package/src/security/store-path-override.ts +6 -16
- package/src/sequence/store.ts +8 -0
- package/src/signals/emit-event.ts +5 -10
- package/src/signals/event-stream.ts +20 -10
- package/src/subagent/manager.ts +76 -25
- package/src/subagent/notify.ts +8 -0
- package/src/subagent/types.ts +13 -3
- package/src/telegram/__tests__/webhook-health.test.ts +442 -0
- package/src/telegram/webhook-health.ts +478 -0
- package/src/telemetry/AGENTS.md +6 -0
- package/src/telemetry/memory-corpus-size.test.ts +129 -0
- package/src/telemetry/memory-corpus-size.ts +184 -0
- package/src/telemetry/memory-tier-reporter.test.ts +67 -2
- package/src/telemetry/memory-tier-reporter.ts +30 -3
- package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
- package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
- package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
- package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
- package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
- package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
- package/src/tools/acp/abort.ts +21 -1
- package/src/tools/acp/context.ts +5 -5
- package/src/tools/acp/spawn.test.ts +15 -5
- package/src/tools/acp/spawn.ts +26 -3
- package/src/tools/acp/status.ts +20 -1
- package/src/tools/acp/steer.test.ts +20 -0
- package/src/tools/acp/steer.ts +23 -2
- package/src/tools/apps/resolve-app-id.ts +15 -3
- package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
- package/src/tools/ask-question/ask-question-tool.ts +68 -92
- package/src/tools/browser/browser-screencast.ts +6 -6
- package/src/tools/calls/call-end.ts +24 -3
- package/src/tools/calls/call-start.ts +35 -11
- package/src/tools/calls/call-status.ts +20 -1
- package/src/tools/conversation-groups/group_create.ts +63 -0
- package/src/tools/conversation-groups/group_list.ts +20 -0
- package/src/tools/conversation-groups/group_shared.ts +52 -0
- package/src/tools/conversation-groups/move_to_group.ts +106 -0
- package/src/tools/document/document-comment-tool.test.ts +49 -0
- package/src/tools/document/document-comment-tool.ts +45 -6
- package/src/tools/document/document-tool.ts +142 -24
- package/src/tools/executor.ts +27 -13
- package/src/tools/filesystem/edit.ts +62 -60
- package/src/tools/filesystem/list.ts +36 -29
- package/src/tools/filesystem/read.ts +56 -39
- package/src/tools/filesystem/write.ts +44 -38
- package/src/tools/followups/followup_create.ts +41 -12
- package/src/tools/followups/followup_list.ts +34 -6
- package/src/tools/followups/followup_resolve.ts +26 -4
- package/src/tools/host-filesystem/edit.ts +50 -60
- package/src/tools/host-filesystem/read.ts +45 -39
- package/src/tools/host-filesystem/write.ts +31 -36
- package/src/tools/host-terminal/host-shell.ts +76 -62
- package/src/tools/policy-context.ts +27 -10
- package/src/tools/schedule/create.ts +76 -33
- package/src/tools/schedule/delete.ts +21 -2
- package/src/tools/schedule/list.ts +25 -3
- package/src/tools/schedule/update.ts +105 -48
- package/src/tools/shared/filesystem/path-policy.ts +246 -40
- package/src/tools/shared/zod-tool-schema.ts +117 -0
- package/src/tools/subagent/abort.ts +12 -4
- package/src/tools/subagent/consult-deadline.ts +9 -3
- package/src/tools/subagent/message.ts +21 -5
- package/src/tools/subagent/notify-parent.ts +44 -23
- package/src/tools/subagent/read.ts +15 -4
- package/src/tools/subagent/resolve.ts +26 -4
- package/src/tools/subagent/spawn.ts +37 -13
- package/src/tools/subagent/status.ts +12 -4
- package/src/tools/system/request-permission.ts +35 -26
- package/src/tools/terminal/shell.ts +68 -55
- package/src/tools/tool-approval-handler.ts +327 -53
- package/src/tools/tool-input-schemas.ts +85 -0
- package/src/tools/tool-types.ts +7 -0
- package/src/tools/types.ts +8 -0
- package/src/tools/workflows/manage-workflows.ts +30 -2
- package/src/tools/workflows/run-workflow.test.ts +54 -2
- package/src/tools/workflows/run-workflow.ts +32 -4
- package/src/util/fs-symlinks.ts +30 -0
- package/src/util/log-redact.ts +7 -3
- package/src/util/platform.ts +15 -0
- package/src/vellum-assistant-namespace.d.ts +80 -0
- package/src/watcher/watcher-store.ts +8 -0
- package/src/workflows/leaf-runner.test.ts +104 -2
- package/src/workflows/leaf-runner.ts +31 -6
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
- package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
- package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
- package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
- package/src/workspace/migrations/registry.ts +4 -0
- package/tsconfig.plugin-api.json +1 -1
- package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
- package/src/__tests__/secret-patterns.test.ts +0 -27
- package/src/config/__tests__/proc-to-skills.test.ts +0 -21
- package/src/config/memory-tier.test.ts +0 -44
- package/src/daemon/message-types/acp.ts +0 -20
- package/src/daemon/message-types/apps.ts +0 -11
- package/src/daemon/message-types/background-tools.ts +0 -14
- package/src/daemon/message-types/bookmarks.ts +0 -13
- package/src/daemon/message-types/contacts.ts +0 -13
- package/src/daemon/message-types/document-comments.ts +0 -14
- package/src/daemon/message-types/documents.ts +0 -13
- package/src/daemon/message-types/home.ts +0 -15
- package/src/daemon/message-types/host-bash.ts +0 -12
- package/src/daemon/message-types/host-cu.ts +0 -10
- package/src/daemon/message-types/host-file.ts +0 -12
- package/src/daemon/message-types/host-transfer.ts +0 -12
- package/src/daemon/message-types/integrations.ts +0 -90
- package/src/daemon/message-types/memory.ts +0 -10
- package/src/daemon/message-types/schedules.ts +0 -14
- package/src/daemon/message-types/settings.ts +0 -17
- package/src/daemon/message-types/subagents.ts +0 -63
- package/src/daemon/message-types/upgrades.ts +0 -14
- package/src/daemon/message-types/workflows.ts +0 -25
- package/src/daemon/message-types/workspace.ts +0 -137
- package/src/live-voice/ack-phrases.ts +0 -58
- package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
- package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
- package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
- package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
- package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
- /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
4
4
|
|
|
5
|
-
let broadcastedMessages:
|
|
5
|
+
let broadcastedMessages: AssistantEvent[] = [];
|
|
6
6
|
const realEventHub = await import("../runtime/assistant-event-hub.js");
|
|
7
7
|
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
8
8
|
...realEventHub,
|
|
9
|
-
broadcastMessage: (msg:
|
|
9
|
+
broadcastMessage: (msg: AssistantEvent) => broadcastedMessages.push(msg),
|
|
10
10
|
}));
|
|
11
11
|
|
|
12
12
|
const { createSurfaceMutex, handleSurfaceAction, surfaceProxyResolver } =
|
|
@@ -25,13 +25,15 @@ interface ProcessMessageCall {
|
|
|
25
25
|
sourceActorPrincipalId?: string;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
function makeContext(
|
|
28
|
+
function makeContext(
|
|
29
|
+
sent: AssistantEvent[] = [],
|
|
30
|
+
): SurfaceConversationContext & {
|
|
29
31
|
processMessageCalls: ProcessMessageCall[];
|
|
30
32
|
} {
|
|
31
33
|
const processMessageCalls: ProcessMessageCall[] = [];
|
|
32
34
|
return {
|
|
33
35
|
conversationId: "conv-1",
|
|
34
|
-
sendToClient: (msg:
|
|
36
|
+
sendToClient: (msg: AssistantEvent) => sent.push(msg),
|
|
35
37
|
pendingSurfaceActions: new Map<string, { surfaceType: SurfaceType }>(),
|
|
36
38
|
lastSurfaceAction: new Map<
|
|
37
39
|
string,
|
|
@@ -67,7 +69,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
67
69
|
});
|
|
68
70
|
|
|
69
71
|
test("table action button click triggers processMessage with action content", async () => {
|
|
70
|
-
const sent:
|
|
72
|
+
const sent: AssistantEvent[] = [];
|
|
71
73
|
const ctx = makeContext(sent);
|
|
72
74
|
|
|
73
75
|
// Step 1: Show a table surface with actions
|
|
@@ -128,7 +130,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
128
130
|
});
|
|
129
131
|
|
|
130
132
|
test("idle pending follow-up path threads submitter principal into processMessage", async () => {
|
|
131
|
-
const sent:
|
|
133
|
+
const sent: AssistantEvent[] = [];
|
|
132
134
|
const ctx = makeContext(sent);
|
|
133
135
|
|
|
134
136
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -161,7 +163,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
161
163
|
});
|
|
162
164
|
|
|
163
165
|
test("idle history-restored path threads submitter principal into processMessage", async () => {
|
|
164
|
-
const sent:
|
|
166
|
+
const sent: AssistantEvent[] = [];
|
|
165
167
|
const ctx = makeContext(sent);
|
|
166
168
|
|
|
167
169
|
// History-restored surface: surfaceState exists, pendingSurfaceActions
|
|
@@ -191,7 +193,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
191
193
|
});
|
|
192
194
|
|
|
193
195
|
test("table action without selection data still triggers processMessage", async () => {
|
|
194
|
-
const sent:
|
|
196
|
+
const sent: AssistantEvent[] = [];
|
|
195
197
|
const ctx = makeContext(sent);
|
|
196
198
|
|
|
197
199
|
// Show table surface
|
|
@@ -267,7 +269,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
267
269
|
});
|
|
268
270
|
|
|
269
271
|
test("action on history-restored surface (no pending) still processes", async () => {
|
|
270
|
-
const sent:
|
|
272
|
+
const sent: AssistantEvent[] = [];
|
|
271
273
|
const ctx = makeContext(sent);
|
|
272
274
|
|
|
273
275
|
// Simulate a history-restored surface: surfaceState exists, but
|
|
@@ -295,7 +297,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
295
297
|
});
|
|
296
298
|
|
|
297
299
|
test("confirmation surface broadcasts ui_surface_complete on action", async () => {
|
|
298
|
-
const sent:
|
|
300
|
+
const sent: AssistantEvent[] = [];
|
|
299
301
|
const ctx = makeContext(sent);
|
|
300
302
|
|
|
301
303
|
const showResult = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -331,7 +333,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
331
333
|
});
|
|
332
334
|
|
|
333
335
|
test("file_upload surface broadcasts ui_surface_complete on action", async () => {
|
|
334
|
-
const sent:
|
|
336
|
+
const sent: AssistantEvent[] = [];
|
|
335
337
|
const ctx = makeContext(sent);
|
|
336
338
|
|
|
337
339
|
const showResult = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -370,7 +372,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
370
372
|
});
|
|
371
373
|
|
|
372
374
|
test("file_upload completion event does not include base64 file blobs", async () => {
|
|
373
|
-
const sent:
|
|
375
|
+
const sent: AssistantEvent[] = [];
|
|
374
376
|
const ctx = makeContext(sent);
|
|
375
377
|
|
|
376
378
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -414,7 +416,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
414
416
|
});
|
|
415
417
|
|
|
416
418
|
test("choice surface broadcasts ui_surface_complete on action", async () => {
|
|
417
|
-
const sent:
|
|
419
|
+
const sent: AssistantEvent[] = [];
|
|
418
420
|
const ctx = makeContext(sent);
|
|
419
421
|
|
|
420
422
|
const showResult = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -457,7 +459,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
457
459
|
});
|
|
458
460
|
|
|
459
461
|
test("oauth_connect surface broadcasts ui_surface_complete on action", async () => {
|
|
460
|
-
const sent:
|
|
462
|
+
const sent: AssistantEvent[] = [];
|
|
461
463
|
const ctx = makeContext(sent);
|
|
462
464
|
|
|
463
465
|
const showResult = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -499,7 +501,7 @@ describe("surface action delivery to assistant", () => {
|
|
|
499
501
|
});
|
|
500
502
|
|
|
501
503
|
test("table surface does NOT broadcast ui_surface_complete (not one-shot)", async () => {
|
|
502
|
-
const sent:
|
|
504
|
+
const sent: AssistantEvent[] = [];
|
|
503
505
|
const ctx = makeContext(sent);
|
|
504
506
|
|
|
505
507
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
4
4
|
|
|
5
5
|
// Analytics consent is granted so recordActivationEvent writes rows.
|
|
6
6
|
let shareAnalytics = true;
|
|
@@ -9,11 +9,11 @@ mock.module("../platform/consent-cache.js", () => ({
|
|
|
9
9
|
getRawShareAnalytics: () => shareAnalytics,
|
|
10
10
|
}));
|
|
11
11
|
|
|
12
|
-
let broadcastedMessages:
|
|
12
|
+
let broadcastedMessages: AssistantEvent[] = [];
|
|
13
13
|
const realEventHub = await import("../runtime/assistant-event-hub.js");
|
|
14
14
|
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
15
15
|
...realEventHub,
|
|
16
|
-
broadcastMessage: (msg:
|
|
16
|
+
broadcastMessage: (msg: AssistantEvent) => broadcastedMessages.push(msg),
|
|
17
17
|
}));
|
|
18
18
|
|
|
19
19
|
// Stub the child-conversation launcher so the launch_conversation commit path
|
|
@@ -60,14 +60,14 @@ interface ProcessMessageCall {
|
|
|
60
60
|
|
|
61
61
|
function makeContext(
|
|
62
62
|
conversationId: string,
|
|
63
|
-
sent:
|
|
63
|
+
sent: AssistantEvent[] = [],
|
|
64
64
|
): SurfaceConversationContext & {
|
|
65
65
|
processMessageCalls: ProcessMessageCall[];
|
|
66
66
|
} {
|
|
67
67
|
const processMessageCalls: ProcessMessageCall[] = [];
|
|
68
68
|
return {
|
|
69
69
|
conversationId,
|
|
70
|
-
sendToClient: (msg:
|
|
70
|
+
sendToClient: (msg: AssistantEvent) => sent.push(msg),
|
|
71
71
|
pendingSurfaceActions: new Map<string, { surfaceType: SurfaceType }>(),
|
|
72
72
|
lastSurfaceAction: new Map<
|
|
73
73
|
string,
|
|
@@ -103,7 +103,7 @@ function resetTables(): void {
|
|
|
103
103
|
/** Render a choice surface tagged (or not) with an activation_moment. */
|
|
104
104
|
async function showTaggedChoice(
|
|
105
105
|
ctx: SurfaceConversationContext,
|
|
106
|
-
sent:
|
|
106
|
+
sent: AssistantEvent[],
|
|
107
107
|
activationMoment?: string,
|
|
108
108
|
): Promise<string> {
|
|
109
109
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -134,7 +134,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
134
134
|
markActivationSession("conv-marked");
|
|
135
135
|
expect(isActivationSession("conv-marked")).toBe(true);
|
|
136
136
|
|
|
137
|
-
const sent:
|
|
137
|
+
const sent: AssistantEvent[] = [];
|
|
138
138
|
const ctx = makeContext("conv-marked", sent);
|
|
139
139
|
const surfaceId = await showTaggedChoice(ctx, sent, "moment_2");
|
|
140
140
|
|
|
@@ -152,7 +152,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
152
152
|
|
|
153
153
|
test("a queue-rejected commit does NOT emit; the tag survives for the retry", async () => {
|
|
154
154
|
markActivationSession("conv-rejected");
|
|
155
|
-
const sent:
|
|
155
|
+
const sent: AssistantEvent[] = [];
|
|
156
156
|
const ctx = makeContext("conv-rejected", sent);
|
|
157
157
|
const surfaceId = await showTaggedChoice(ctx, sent, "moment_2");
|
|
158
158
|
|
|
@@ -183,7 +183,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
183
183
|
|
|
184
184
|
test("first_wow_executed records at SHOW time (no commit) and never double-emits", async () => {
|
|
185
185
|
markActivationSession("conv-wow");
|
|
186
|
-
const sent:
|
|
186
|
+
const sent: AssistantEvent[] = [];
|
|
187
187
|
const ctx = makeContext("conv-wow", sent);
|
|
188
188
|
|
|
189
189
|
// A display-only result surface tagged with the execution moment.
|
|
@@ -211,7 +211,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
211
211
|
});
|
|
212
212
|
|
|
213
213
|
test("first_wow_executed in an UNMARKED session writes no row at show time", async () => {
|
|
214
|
-
const sent:
|
|
214
|
+
const sent: AssistantEvent[] = [];
|
|
215
215
|
const ctx = makeContext("conv-wow-unmarked", sent);
|
|
216
216
|
await surfaceProxyResolver(ctx, "ui_show", {
|
|
217
217
|
surface_type: "card",
|
|
@@ -224,7 +224,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
224
224
|
|
|
225
225
|
test("does not forward the daemon-only tag to the client", async () => {
|
|
226
226
|
markActivationSession("conv-marked-2");
|
|
227
|
-
const sent:
|
|
227
|
+
const sent: AssistantEvent[] = [];
|
|
228
228
|
const ctx = makeContext("conv-marked-2", sent);
|
|
229
229
|
await showTaggedChoice(ctx, sent, "moment_2");
|
|
230
230
|
|
|
@@ -239,7 +239,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
239
239
|
|
|
240
240
|
test("untagged surface writes no row", async () => {
|
|
241
241
|
markActivationSession("conv-untagged");
|
|
242
|
-
const sent:
|
|
242
|
+
const sent: AssistantEvent[] = [];
|
|
243
243
|
const ctx = makeContext("conv-untagged", sent);
|
|
244
244
|
const surfaceId = await showTaggedChoice(ctx, sent, undefined);
|
|
245
245
|
|
|
@@ -252,7 +252,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
252
252
|
});
|
|
253
253
|
|
|
254
254
|
test("tagged surface in an UNMARKED session writes no row", async () => {
|
|
255
|
-
const sent:
|
|
255
|
+
const sent: AssistantEvent[] = [];
|
|
256
256
|
const ctx = makeContext("conv-not-rail", sent);
|
|
257
257
|
const surfaceId = await showTaggedChoice(ctx, sent, "moment_2");
|
|
258
258
|
|
|
@@ -266,7 +266,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
266
266
|
|
|
267
267
|
test("an invalid activation_moment token is ignored (no row)", async () => {
|
|
268
268
|
markActivationSession("conv-bad-tag");
|
|
269
|
-
const sent:
|
|
269
|
+
const sent: AssistantEvent[] = [];
|
|
270
270
|
const ctx = makeContext("conv-bad-tag", sent);
|
|
271
271
|
const surfaceId = await showTaggedChoice(ctx, sent, "bogus_moment");
|
|
272
272
|
|
|
@@ -280,7 +280,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
280
280
|
|
|
281
281
|
test("FIX 1: launch_conversation commit on a tagged surface records exactly one row", async () => {
|
|
282
282
|
markActivationSession("conv-launch");
|
|
283
|
-
const sent:
|
|
283
|
+
const sent: AssistantEvent[] = [];
|
|
284
284
|
const ctx = makeContext("conv-launch", sent);
|
|
285
285
|
|
|
286
286
|
// A launcher card tagged with a commit-timing moment. The committed action
|
|
@@ -312,7 +312,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
312
312
|
|
|
313
313
|
test("FIX 2: commit-timing tag survives a surfaceState restore from history", async () => {
|
|
314
314
|
markActivationSession("conv-restore");
|
|
315
|
-
const sent:
|
|
315
|
+
const sent: AssistantEvent[] = [];
|
|
316
316
|
const ctx = makeContext("conv-restore", sent);
|
|
317
317
|
const surfaceId = await showTaggedChoice(ctx, sent, "moment_2");
|
|
318
318
|
|
|
@@ -361,7 +361,7 @@ describe("activation moment emission from ui_show surface commits", () => {
|
|
|
361
361
|
|
|
362
362
|
test("intermediate selection_changed does NOT emit; the terminal commit does", async () => {
|
|
363
363
|
markActivationSession("conv-table");
|
|
364
|
-
const sent:
|
|
364
|
+
const sent: AssistantEvent[] = [];
|
|
365
365
|
const ctx = makeContext("conv-table", sent);
|
|
366
366
|
|
|
367
367
|
// A table surface stays pending across selection_changed (non-terminal).
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
3
4
|
import { DynamicPagePreviewSchema } from "../api/surfaces.js";
|
|
4
5
|
import {
|
|
5
6
|
buildAppOpenPreview,
|
|
@@ -7,7 +8,9 @@ import {
|
|
|
7
8
|
type SurfaceConversationContext,
|
|
8
9
|
surfaceProxyResolver,
|
|
9
10
|
} from "../daemon/conversation-surfaces.js";
|
|
10
|
-
import type {
|
|
11
|
+
import type {
|
|
12
|
+
SurfaceType,
|
|
13
|
+
} from "../daemon/message-protocol.js";
|
|
11
14
|
|
|
12
15
|
interface ContextOptions {
|
|
13
16
|
hasNoClient?: boolean;
|
|
@@ -15,7 +18,7 @@ interface ContextOptions {
|
|
|
15
18
|
}
|
|
16
19
|
|
|
17
20
|
function makeContext(
|
|
18
|
-
sent:
|
|
21
|
+
sent: AssistantEvent[] = [],
|
|
19
22
|
options: ContextOptions = {},
|
|
20
23
|
): SurfaceConversationContext {
|
|
21
24
|
return {
|
|
@@ -43,7 +46,7 @@ function makeContext(
|
|
|
43
46
|
|
|
44
47
|
describe("app_open render-capability gate", () => {
|
|
45
48
|
test("returns an error without broadcasting on a clientless turn", async () => {
|
|
46
|
-
const sent:
|
|
49
|
+
const sent: AssistantEvent[] = [];
|
|
47
50
|
const ctx = makeContext(sent, { hasNoClient: true });
|
|
48
51
|
|
|
49
52
|
const result = await surfaceProxyResolver(ctx, "app_open", {
|
|
@@ -56,7 +59,7 @@ describe("app_open render-capability gate", () => {
|
|
|
56
59
|
});
|
|
57
60
|
|
|
58
61
|
test("returns an error on a channel without dynamic UI (e.g. Slack)", async () => {
|
|
59
|
-
const sent:
|
|
62
|
+
const sent: AssistantEvent[] = [];
|
|
60
63
|
const ctx = makeContext(sent, {
|
|
61
64
|
channelCapabilities: { channel: "slack", supportsDynamicUi: false },
|
|
62
65
|
});
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
4
4
|
|
|
5
5
|
const realEventHub = await import("../runtime/assistant-event-hub.js");
|
|
6
6
|
|
|
7
7
|
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
8
8
|
...realEventHub,
|
|
9
|
-
broadcastMessage: (_msg:
|
|
9
|
+
broadcastMessage: (_msg: AssistantEvent) => {},
|
|
10
10
|
}));
|
|
11
11
|
|
|
12
12
|
// Mock the persistence layer the surface helpers reach into so we can
|
|
@@ -53,7 +53,7 @@ import type {
|
|
|
53
53
|
SurfaceType,
|
|
54
54
|
} from "../daemon/message-protocol.js";
|
|
55
55
|
|
|
56
|
-
function makeContext(sent:
|
|
56
|
+
function makeContext(sent: AssistantEvent[] = []): SurfaceConversationContext {
|
|
57
57
|
return {
|
|
58
58
|
conversationId: "conv-persist-1",
|
|
59
59
|
sendToClient: (msg) => sent.push(msg),
|
|
@@ -111,7 +111,7 @@ describe("ui_surface_update persistence", () => {
|
|
|
111
111
|
});
|
|
112
112
|
|
|
113
113
|
test("ui_update schedules a debounced DB write that lands within ~600ms", async () => {
|
|
114
|
-
const sent:
|
|
114
|
+
const sent: AssistantEvent[] = [];
|
|
115
115
|
const ctx = makeContext(sent);
|
|
116
116
|
|
|
117
117
|
// Seed an existing in-memory surface and a persisted message that
|
|
@@ -164,7 +164,7 @@ describe("ui_surface_update persistence", () => {
|
|
|
164
164
|
});
|
|
165
165
|
|
|
166
166
|
test("multiple rapid updates collapse to a single DB write", async () => {
|
|
167
|
-
const sent:
|
|
167
|
+
const sent: AssistantEvent[] = [];
|
|
168
168
|
const ctx = makeContext(sent);
|
|
169
169
|
|
|
170
170
|
const surfaceId = "surface-debounced-2";
|
|
@@ -431,7 +431,7 @@ describe("ui_dismiss persisted-state convergence", () => {
|
|
|
431
431
|
});
|
|
432
432
|
|
|
433
433
|
test("passive dismiss drops the surface from the turn snapshot and strips the persisted block", async () => {
|
|
434
|
-
const sent:
|
|
434
|
+
const sent: AssistantEvent[] = [];
|
|
435
435
|
const ctx = makeContext(sent);
|
|
436
436
|
const surfaceId = "surface-dismiss-1";
|
|
437
437
|
// A progress card the model marked `completed` while leaving step 4 spinning.
|
|
@@ -479,7 +479,7 @@ describe("ui_dismiss persisted-state convergence", () => {
|
|
|
479
479
|
});
|
|
480
480
|
|
|
481
481
|
test("dismiss cancels a pending debounced persist so a stale update cannot re-add the block", async () => {
|
|
482
|
-
const sent:
|
|
482
|
+
const sent: AssistantEvent[] = [];
|
|
483
483
|
const ctx = makeContext(sent);
|
|
484
484
|
const surfaceId = "surface-dismiss-2";
|
|
485
485
|
const data: CardSurfaceData = {
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
|
|
20
20
|
import { describe, expect, mock, test } from "bun:test";
|
|
21
21
|
|
|
22
|
-
import type {
|
|
22
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
23
23
|
|
|
24
|
-
let broadcastImpl: (msg:
|
|
24
|
+
let broadcastImpl: (msg: AssistantEvent) => void = () => {};
|
|
25
25
|
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
26
|
-
broadcastMessage: (msg:
|
|
26
|
+
broadcastMessage: (msg: AssistantEvent) => broadcastImpl(msg),
|
|
27
27
|
}));
|
|
28
28
|
|
|
29
29
|
import {
|
|
@@ -42,11 +42,11 @@ function createMockContext(
|
|
|
42
42
|
channel: string;
|
|
43
43
|
}>,
|
|
44
44
|
): SurfaceConversationContext & {
|
|
45
|
-
sentMessages:
|
|
45
|
+
sentMessages: AssistantEvent[];
|
|
46
46
|
enqueuedMessages: Array<{ content: string; requestId: string }>;
|
|
47
47
|
} {
|
|
48
|
-
const sentMessages:
|
|
49
|
-
broadcastImpl = (msg:
|
|
48
|
+
const sentMessages: AssistantEvent[] = [];
|
|
49
|
+
broadcastImpl = (msg: AssistantEvent) => sentMessages.push(msg);
|
|
50
50
|
const enqueuedMessages: Array<{ content: string; requestId: string }> = [];
|
|
51
51
|
|
|
52
52
|
return {
|
|
@@ -59,7 +59,7 @@ function createMockContext(
|
|
|
59
59
|
supportsDynamicUi: overrides.supportsDynamicUi ?? true,
|
|
60
60
|
}
|
|
61
61
|
: undefined,
|
|
62
|
-
sendToClient: (msg:
|
|
62
|
+
sendToClient: (msg: AssistantEvent) => sentMessages.push(msg),
|
|
63
63
|
pendingSurfaceActions: new Map(),
|
|
64
64
|
lastSurfaceAction: new Map(),
|
|
65
65
|
surfaceState: new Map(),
|
|
@@ -91,7 +91,7 @@ function createMockContext(
|
|
|
91
91
|
type AnyRecord = Record<string, unknown>;
|
|
92
92
|
|
|
93
93
|
function findByType(
|
|
94
|
-
messages:
|
|
94
|
+
messages: AssistantEvent[],
|
|
95
95
|
type: string,
|
|
96
96
|
): AnyRecord | undefined {
|
|
97
97
|
return messages.find(
|
|
@@ -99,7 +99,7 @@ function findByType(
|
|
|
99
99
|
) as unknown as AnyRecord | undefined;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
function findAllByType(messages:
|
|
102
|
+
function findAllByType(messages: AssistantEvent[], type: string): AnyRecord[] {
|
|
103
103
|
return messages.filter(
|
|
104
104
|
(m) => (m as unknown as AnyRecord).type === type,
|
|
105
105
|
) as unknown as AnyRecord[];
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
4
4
|
import type { InteractiveUiResult } from "../runtime/interactive-ui.js";
|
|
5
5
|
|
|
6
|
-
let broadcastImpl: (msg:
|
|
6
|
+
let broadcastImpl: (msg: AssistantEvent) => void = () => {};
|
|
7
7
|
mock.module("../runtime/assistant-event-hub.js", () => ({
|
|
8
|
-
broadcastMessage: (msg:
|
|
8
|
+
broadcastMessage: (msg: AssistantEvent) => broadcastImpl(msg),
|
|
9
9
|
}));
|
|
10
10
|
|
|
11
11
|
import {
|
|
@@ -30,11 +30,11 @@ function createMockContext(
|
|
|
30
30
|
channel: string;
|
|
31
31
|
}>,
|
|
32
32
|
): SurfaceConversationContext & {
|
|
33
|
-
sentMessages:
|
|
33
|
+
sentMessages: AssistantEvent[];
|
|
34
34
|
enqueuedMessages: Array<{ content: string; requestId: string }>;
|
|
35
35
|
} {
|
|
36
|
-
const sentMessages:
|
|
37
|
-
broadcastImpl = (msg:
|
|
36
|
+
const sentMessages: AssistantEvent[] = [];
|
|
37
|
+
broadcastImpl = (msg: AssistantEvent) => sentMessages.push(msg);
|
|
38
38
|
const enqueuedMessages: Array<{ content: string; requestId: string }> = [];
|
|
39
39
|
|
|
40
40
|
return {
|
|
@@ -47,7 +47,7 @@ function createMockContext(
|
|
|
47
47
|
supportsDynamicUi: overrides.supportsDynamicUi ?? true,
|
|
48
48
|
}
|
|
49
49
|
: undefined,
|
|
50
|
-
sendToClient: (msg:
|
|
50
|
+
sendToClient: (msg: AssistantEvent) => sentMessages.push(msg),
|
|
51
51
|
pendingSurfaceActions: new Map(),
|
|
52
52
|
lastSurfaceAction: new Map(),
|
|
53
53
|
surfaceState: new Map(),
|
|
@@ -128,7 +128,7 @@ describe("showStandaloneSurface", () => {
|
|
|
128
128
|
|
|
129
129
|
afterEach(() => {
|
|
130
130
|
// Safety cleanup of any lingering timers
|
|
131
|
-
for (const t of timers) clearTimeout(t);
|
|
131
|
+
for (const t of timers) {clearTimeout(t);}
|
|
132
132
|
});
|
|
133
133
|
|
|
134
134
|
test("fails closed when no client is connected", async () => {
|
|
@@ -299,7 +299,7 @@ describe("showStandaloneSurface", () => {
|
|
|
299
299
|
test("timeout still resolves when emit throws", async () => {
|
|
300
300
|
const ctx = createMockContext();
|
|
301
301
|
let showEmitted = false;
|
|
302
|
-
broadcastImpl = (msg:
|
|
302
|
+
broadcastImpl = (msg: AssistantEvent) => {
|
|
303
303
|
const type = (msg as unknown as Record<string, unknown>).type;
|
|
304
304
|
if (type === "ui_surface_show") {
|
|
305
305
|
showEmitted = true;
|
|
@@ -478,7 +478,7 @@ describe("cleanupStandaloneSurface", () => {
|
|
|
478
478
|
clearTimeout(timer);
|
|
479
479
|
const tombstoneTimer =
|
|
480
480
|
ctx.recentlyCompletedStandaloneSurfaces!.get("surf-c1");
|
|
481
|
-
if (tombstoneTimer) clearTimeout(tombstoneTimer);
|
|
481
|
+
if (tombstoneTimer) {clearTimeout(tombstoneTimer);}
|
|
482
482
|
});
|
|
483
483
|
|
|
484
484
|
test("is idempotent — safe to call multiple times", () => {
|
|
@@ -530,7 +530,7 @@ describe("standalone surface cleanup on conversation dispose", () => {
|
|
|
530
530
|
type: "ui_surface_dismiss",
|
|
531
531
|
conversationId: ctx.conversationId,
|
|
532
532
|
surfaceId,
|
|
533
|
-
} as
|
|
533
|
+
} as AssistantEvent);
|
|
534
534
|
entry.resolve({ status: "cancelled", surfaceId });
|
|
535
535
|
}
|
|
536
536
|
ctx.pendingStandaloneSurfaces!.clear();
|
|
@@ -579,7 +579,7 @@ describe("standalone surface cleanup on conversation dispose", () => {
|
|
|
579
579
|
type: "ui_surface_dismiss",
|
|
580
580
|
conversationId: ctx.conversationId,
|
|
581
581
|
surfaceId,
|
|
582
|
-
} as
|
|
582
|
+
} as AssistantEvent);
|
|
583
583
|
entry.resolve({ status: "cancelled", surfaceId });
|
|
584
584
|
}
|
|
585
585
|
ctx.pendingStandaloneSurfaces!.clear();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
3
4
|
import {
|
|
4
5
|
createSurfaceMutex,
|
|
5
6
|
handleSurfaceAction,
|
|
@@ -7,7 +8,9 @@ import {
|
|
|
7
8
|
type SurfaceConversationContext,
|
|
8
9
|
surfaceProxyResolver,
|
|
9
10
|
} from "../daemon/conversation-surfaces.js";
|
|
10
|
-
import type {
|
|
11
|
+
import type {
|
|
12
|
+
SurfaceType,
|
|
13
|
+
} from "../daemon/message-protocol.js";
|
|
11
14
|
|
|
12
15
|
/**
|
|
13
16
|
* Build a minimal SurfaceConversationContext for testing.
|
|
@@ -15,7 +18,7 @@ import type { ServerMessage, SurfaceType } from "../daemon/message-protocol.js";
|
|
|
15
18
|
* whether an LLM turn was triggered.
|
|
16
19
|
*/
|
|
17
20
|
function makeContext(opts?: {
|
|
18
|
-
sent?:
|
|
21
|
+
sent?: AssistantEvent[];
|
|
19
22
|
}): SurfaceConversationContext & {
|
|
20
23
|
enqueueCalls: Array<{ content: string; requestId: string }>;
|
|
21
24
|
processCalls: Array<{ content: string; requestId?: string }>;
|
|
@@ -244,7 +247,7 @@ describe("cleanup on dismiss", () => {
|
|
|
244
247
|
|
|
245
248
|
describe("ui_update preserves client-owned keys the daemon schema omits", () => {
|
|
246
249
|
test("a valid patch keeps unmodeled keys on the merged, sent, and stored data", async () => {
|
|
247
|
-
const sent:
|
|
250
|
+
const sent: AssistantEvent[] = [];
|
|
248
251
|
const ctx = makeContext({ sent });
|
|
249
252
|
// A document_preview whose stored data carries `content`/`mimeType`
|
|
250
253
|
// (read by the client renderer, not modeled by the daemon schema).
|
|
@@ -290,7 +293,7 @@ describe("ui_update preserves client-owned keys the daemon schema omits", () =>
|
|
|
290
293
|
|
|
291
294
|
describe("ui_update on a restored unknown surface type", () => {
|
|
292
295
|
test("forwards the merge opaquely instead of throwing on the schema registry", async () => {
|
|
293
|
-
const sent:
|
|
296
|
+
const sent: AssistantEvent[] = [];
|
|
294
297
|
const ctx = makeContext({ sent });
|
|
295
298
|
// Restore preserves an unknown-but-non-empty surfaceType verbatim (a
|
|
296
299
|
// newer/custom client-rendered surface). Indexing SURFACE_DATA_SCHEMAS with
|
|
@@ -360,7 +363,7 @@ describe("ui_update on a restored unknown surface type", () => {
|
|
|
360
363
|
|
|
361
364
|
describe("ui_update normalizes modeled fields for known surface types", () => {
|
|
362
365
|
test("a malformed dynamic_page html patch is stored as its schema-coerced string", async () => {
|
|
363
|
-
const sent:
|
|
366
|
+
const sent: AssistantEvent[] = [];
|
|
364
367
|
const ctx = makeContext({ sent });
|
|
365
368
|
ctx.surfaceState.set("page-1", {
|
|
366
369
|
surfaceType: "dynamic_page",
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
|
|
3
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
3
4
|
import {
|
|
4
5
|
createSurfaceMutex,
|
|
5
6
|
handleSurfaceAction,
|
|
6
7
|
type SurfaceConversationContext,
|
|
7
8
|
} from "../daemon/conversation-surfaces.js";
|
|
8
|
-
import type {
|
|
9
|
+
import type {
|
|
10
|
+
SurfaceType,
|
|
11
|
+
} from "../daemon/message-protocol.js";
|
|
9
12
|
|
|
10
13
|
/**
|
|
11
14
|
* Build a minimal SurfaceConversationContext for testing table surface actions.
|
|
@@ -27,7 +30,7 @@ function makeContext(): SurfaceConversationContext & {
|
|
|
27
30
|
surfaceId?: string;
|
|
28
31
|
displayContent?: string;
|
|
29
32
|
}>;
|
|
30
|
-
sentMessages:
|
|
33
|
+
sentMessages: AssistantEvent[];
|
|
31
34
|
} {
|
|
32
35
|
const enqueueCalls: Array<{
|
|
33
36
|
content: string;
|
|
@@ -43,7 +46,7 @@ function makeContext(): SurfaceConversationContext & {
|
|
|
43
46
|
surfaceId?: string;
|
|
44
47
|
displayContent?: string;
|
|
45
48
|
}> = [];
|
|
46
|
-
const sentMessages:
|
|
49
|
+
const sentMessages: AssistantEvent[] = [];
|
|
47
50
|
|
|
48
51
|
return {
|
|
49
52
|
conversationId: "test-convo",
|