@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
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
import { beforeAll, describe, expect, mock, test } from "bun:test";
|
|
20
20
|
|
|
21
21
|
import * as realPlatform from "../util/platform.js";
|
|
22
|
+
import { installThresholdReaderMock } from "./gateway-threshold-reader-mock.js";
|
|
22
23
|
|
|
23
24
|
// Local registry for ToolExecutor tests — the mock delegates to this map
|
|
24
25
|
// so that registerTool/getTool/getAllTools work for our benchmark tools.
|
|
@@ -54,13 +55,15 @@ mock.module("../util/platform.js", () => ({
|
|
|
54
55
|
getDeprecatedDir: () => "/tmp/deprecated",
|
|
55
56
|
}));
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}));
|
|
58
|
+
// Mock defaults: no threshold, and no cell at any cascade level — the
|
|
59
|
+
// benchmark measures the pipeline, not the channel matrix.
|
|
60
|
+
installThresholdReaderMock();
|
|
61
61
|
|
|
62
|
+
const realWorkspacePolicy = await import("../permissions/workspace-policy.js");
|
|
62
63
|
mock.module("../permissions/workspace-policy.js", () => ({
|
|
64
|
+
...realWorkspacePolicy,
|
|
63
65
|
isWorkspaceScopedInvocation: () => false,
|
|
66
|
+
isOutOfWorkspaceFileInvocation: () => false,
|
|
64
67
|
isPathWithinWorkspaceRoot: () => false,
|
|
65
68
|
}));
|
|
66
69
|
|
|
@@ -128,6 +128,7 @@ mock.module("../tools/registry.js", () => ({
|
|
|
128
128
|
|
|
129
129
|
mock.module("../tools/shared/filesystem/path-policy.js", () => ({
|
|
130
130
|
sandboxPolicy: () => ({ ok: false }),
|
|
131
|
+
sandboxPolicyWithHostFallback: () => ({ ok: false }),
|
|
131
132
|
hostPolicy: () => ({ ok: false }),
|
|
132
133
|
}));
|
|
133
134
|
|
|
@@ -1397,3 +1398,118 @@ describe("ToolExecutor thrown-value rendering", () => {
|
|
|
1397
1398
|
expect(result.content).toContain("unexpected error: boom");
|
|
1398
1399
|
});
|
|
1399
1400
|
});
|
|
1401
|
+
|
|
1402
|
+
describe("ToolExecutor input-schema validation gate", () => {
|
|
1403
|
+
beforeEach(() => {
|
|
1404
|
+
fakeToolResult = { content: "ok", isError: false };
|
|
1405
|
+
getToolOverride = undefined;
|
|
1406
|
+
getAllToolsOverride = undefined;
|
|
1407
|
+
checkResultOverride = undefined;
|
|
1408
|
+
checkFnOverride = undefined;
|
|
1409
|
+
cachedAssessmentOverride = undefined;
|
|
1410
|
+
});
|
|
1411
|
+
|
|
1412
|
+
/**
|
|
1413
|
+
* Registry-shaped tool with an explicit owner and an execute that records
|
|
1414
|
+
* the input it actually received (undefined until the tool runs).
|
|
1415
|
+
*/
|
|
1416
|
+
function ownedTool(
|
|
1417
|
+
name: string,
|
|
1418
|
+
ownerKind: string,
|
|
1419
|
+
): { seenInput: () => Record<string, unknown> | undefined } {
|
|
1420
|
+
let seen: Record<string, unknown> | undefined;
|
|
1421
|
+
getToolOverride = (n: string) =>
|
|
1422
|
+
n === name
|
|
1423
|
+
? ({
|
|
1424
|
+
name,
|
|
1425
|
+
description: "owned tool",
|
|
1426
|
+
category: "test",
|
|
1427
|
+
defaultRiskLevel: RiskLevel.Low,
|
|
1428
|
+
executionTarget: "sandbox" as const,
|
|
1429
|
+
input_schema: { type: "object" as const, properties: {} },
|
|
1430
|
+
execute: async (input: Record<string, unknown>) => {
|
|
1431
|
+
seen = input;
|
|
1432
|
+
return fakeToolResult;
|
|
1433
|
+
},
|
|
1434
|
+
owner: { kind: ownerKind, id: ownerKind },
|
|
1435
|
+
} as unknown as Tool)
|
|
1436
|
+
: undefined;
|
|
1437
|
+
return { seenInput: () => seen };
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
test("malformed input for a built-in tool returns a clean error without executing", async () => {
|
|
1441
|
+
const probe = ownedTool("file_write", "default");
|
|
1442
|
+
const executor = new ToolExecutor(makePrompter());
|
|
1443
|
+
const result = await executor.execute(
|
|
1444
|
+
"file_write",
|
|
1445
|
+
{ path: 42, content: "hello" },
|
|
1446
|
+
makeContext(),
|
|
1447
|
+
);
|
|
1448
|
+
|
|
1449
|
+
expect(result.isError).toBe(true);
|
|
1450
|
+
expect(result.content).toContain('Invalid input for tool "file_write"');
|
|
1451
|
+
expect(result.content).toContain("path:");
|
|
1452
|
+
expect(probe.seenInput()).toBeUndefined();
|
|
1453
|
+
});
|
|
1454
|
+
|
|
1455
|
+
test("valid input executes with catch-recovered data, unknown keys intact", async () => {
|
|
1456
|
+
const probe = ownedTool("file_read", "default");
|
|
1457
|
+
const executor = new ToolExecutor(makePrompter());
|
|
1458
|
+
const result = await executor.execute(
|
|
1459
|
+
"file_read",
|
|
1460
|
+
{ path: "a.txt", offset: "not-a-number", activity: "Reading a file" },
|
|
1461
|
+
makeContext(),
|
|
1462
|
+
);
|
|
1463
|
+
|
|
1464
|
+
expect(result.isError).toBe(false);
|
|
1465
|
+
expect(probe.seenInput()).toEqual({
|
|
1466
|
+
path: "a.txt",
|
|
1467
|
+
activity: "Reading a file",
|
|
1468
|
+
});
|
|
1469
|
+
});
|
|
1470
|
+
|
|
1471
|
+
test("a non-default owner shadowing a registered name skips registry validation", async () => {
|
|
1472
|
+
const probe = ownedTool("file_write", "workspace");
|
|
1473
|
+
const executor = new ToolExecutor(makePrompter());
|
|
1474
|
+
const result = await executor.execute(
|
|
1475
|
+
"file_write",
|
|
1476
|
+
{ path: 42 },
|
|
1477
|
+
makeContext(),
|
|
1478
|
+
);
|
|
1479
|
+
|
|
1480
|
+
expect(result.isError).toBe(false);
|
|
1481
|
+
expect(probe.seenInput()).toEqual({ path: 42 });
|
|
1482
|
+
});
|
|
1483
|
+
|
|
1484
|
+
test("a built-in tool with no registered schema executes unchanged", async () => {
|
|
1485
|
+
const probe = ownedTool("web_search", "default");
|
|
1486
|
+
const executor = new ToolExecutor(makePrompter());
|
|
1487
|
+
const result = await executor.execute(
|
|
1488
|
+
"web_search",
|
|
1489
|
+
{ query: 42 },
|
|
1490
|
+
makeContext(),
|
|
1491
|
+
);
|
|
1492
|
+
|
|
1493
|
+
expect(result.isError).toBe(false);
|
|
1494
|
+
expect(probe.seenInput()).toEqual({ query: 42 });
|
|
1495
|
+
});
|
|
1496
|
+
|
|
1497
|
+
test("malformed input for a sensitive tool fails validation before any grant flow", async () => {
|
|
1498
|
+
// An unknown actor invoking a sensitive built-in normally routes into the
|
|
1499
|
+
// scoped-grant machinery inside checkPreExecutionGates. Malformed input
|
|
1500
|
+
// must short-circuit BEFORE that point — the validation error proves the
|
|
1501
|
+
// call never reached grant consumption or guardian escalation.
|
|
1502
|
+
const probe = ownedTool("file_write", "default");
|
|
1503
|
+
const executor = new ToolExecutor(makePrompter());
|
|
1504
|
+
const result = await executor.execute(
|
|
1505
|
+
"file_write",
|
|
1506
|
+
{ path: 42 },
|
|
1507
|
+
makeContext({ trustClass: "unknown" }),
|
|
1508
|
+
);
|
|
1509
|
+
|
|
1510
|
+
expect(result.isError).toBe(true);
|
|
1511
|
+
expect(result.content).toContain('Invalid input for tool "file_write"');
|
|
1512
|
+
expect(result.content).not.toContain("guardian");
|
|
1513
|
+
expect(probe.seenInput()).toBeUndefined();
|
|
1514
|
+
});
|
|
1515
|
+
});
|
|
@@ -228,6 +228,11 @@ describe("ToolApprovalHandler / grant-miss escalation", () => {
|
|
|
228
228
|
|
|
229
229
|
// The guardian-facing question asks about the tool, never about the person.
|
|
230
230
|
expect(emittedSignals.length).toBe(1);
|
|
231
|
+
// The in-app card is pinned to the conversation the escalated tool runs
|
|
232
|
+
// in — never left to LLM conversation routing.
|
|
233
|
+
expect(emittedSignals[0].conversationAffinityHint).toEqual({
|
|
234
|
+
vellum: "conv-1",
|
|
235
|
+
});
|
|
231
236
|
const payload = emittedSignals[0].contextPayload as Record<string, unknown>;
|
|
232
237
|
const questionText = payload.questionText as string;
|
|
233
238
|
expect(questionText.startsWith("Approve tool: bash")).toBe(true);
|
|
@@ -48,9 +48,13 @@ mock.module("../persistence/conversation-crud.js", () => ({
|
|
|
48
48
|
provenanceFromTrustContext: () => ({}),
|
|
49
49
|
reserveMessage: reserveMessageMock,
|
|
50
50
|
recordConversationPersistedSeq: (id: string, seq: number) => {
|
|
51
|
-
if (!Number.isFinite(seq) || seq <= 0)
|
|
51
|
+
if (!Number.isFinite(seq) || seq <= 0) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
52
54
|
const prev = persistedSeqByConversation.get(id);
|
|
53
|
-
if (prev == null || prev < seq)
|
|
55
|
+
if (prev == null || prev < seq) {
|
|
56
|
+
persistedSeqByConversation.set(id, seq);
|
|
57
|
+
}
|
|
54
58
|
},
|
|
55
59
|
getConversationPersistedSeq: (id: string) =>
|
|
56
60
|
persistedSeqByConversation.get(id) ?? null,
|
|
@@ -70,7 +74,7 @@ mock.module("../plugins/defaults/memory/memory-recall-log-store.js", () => ({
|
|
|
70
74
|
}));
|
|
71
75
|
|
|
72
76
|
mock.module(
|
|
73
|
-
"../plugins/defaults/memory/
|
|
77
|
+
"../plugins/defaults/memory/v2/activation-log-store.js",
|
|
74
78
|
() => ({
|
|
75
79
|
backfillMemoryV2ActivationMessageId: () => {},
|
|
76
80
|
}),
|
|
@@ -78,6 +82,7 @@ mock.module(
|
|
|
78
82
|
|
|
79
83
|
// ── Imports (after mocks) ─────────────────────────────────────────────────────
|
|
80
84
|
import type { AgentEvent } from "../agent/loop.js";
|
|
85
|
+
import type { AssistantEvent, AssistantEventEnvelope } from "../api/index.js";
|
|
81
86
|
import type {
|
|
82
87
|
EventHandlerDeps,
|
|
83
88
|
EventHandlerState,
|
|
@@ -91,9 +96,7 @@ import {
|
|
|
91
96
|
handleToolUse,
|
|
92
97
|
handleToolUsePreviewStart,
|
|
93
98
|
} from "../daemon/conversation-agent-loop-handlers.js";
|
|
94
|
-
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
95
99
|
import { getConversationPersistedSeq } from "../persistence/conversation-crud.js";
|
|
96
|
-
import type { AssistantEvent } from "../runtime/assistant-event.js";
|
|
97
100
|
import {
|
|
98
101
|
_resetStreamStateForTesting,
|
|
99
102
|
getCurrentSeq,
|
|
@@ -105,7 +108,7 @@ import {
|
|
|
105
108
|
function createMockDeps(
|
|
106
109
|
overrides: Partial<EventHandlerDeps> = {},
|
|
107
110
|
): EventHandlerDeps {
|
|
108
|
-
const emittedEvents:
|
|
111
|
+
const emittedEvents: AssistantEvent[] = [];
|
|
109
112
|
const emittedActivityStates: Array<{
|
|
110
113
|
phase: string;
|
|
111
114
|
reason: string;
|
|
@@ -135,7 +138,7 @@ function createMockDeps(
|
|
|
135
138
|
markWorkspaceTopLevelDirty: () => {},
|
|
136
139
|
currentTurnSurfaces: [],
|
|
137
140
|
} as unknown as EventHandlerDeps["ctx"],
|
|
138
|
-
onEvent: (msg:
|
|
141
|
+
onEvent: (msg: AssistantEvent) => {
|
|
139
142
|
emittedEvents.push(msg);
|
|
140
143
|
},
|
|
141
144
|
reqId: "test-req-id",
|
|
@@ -158,7 +161,7 @@ function createMockDeps(
|
|
|
158
161
|
|
|
159
162
|
/** Collect events by wrapping onEvent. */
|
|
160
163
|
function createEventCollector(): {
|
|
161
|
-
events:
|
|
164
|
+
events: AssistantEvent[];
|
|
162
165
|
activityStates: Array<{
|
|
163
166
|
phase: string;
|
|
164
167
|
reason: string;
|
|
@@ -166,14 +169,14 @@ function createEventCollector(): {
|
|
|
166
169
|
requestId?: string;
|
|
167
170
|
statusText?: string;
|
|
168
171
|
}>;
|
|
169
|
-
onEvent: (msg:
|
|
172
|
+
onEvent: (msg: AssistantEvent) => void;
|
|
170
173
|
emitActivityState: (
|
|
171
174
|
phase: string,
|
|
172
175
|
reason: string,
|
|
173
176
|
options?: { anchor?: string; requestId?: string; statusText?: string },
|
|
174
177
|
) => void;
|
|
175
178
|
} {
|
|
176
|
-
const events:
|
|
179
|
+
const events: AssistantEvent[] = [];
|
|
177
180
|
const activityStates: Array<{
|
|
178
181
|
phase: string;
|
|
179
182
|
reason: string;
|
|
@@ -184,7 +187,7 @@ function createEventCollector(): {
|
|
|
184
187
|
return {
|
|
185
188
|
events,
|
|
186
189
|
activityStates,
|
|
187
|
-
onEvent: (msg:
|
|
190
|
+
onEvent: (msg: AssistantEvent) => events.push(msg),
|
|
188
191
|
emitActivityState: (phase, reason, options) =>
|
|
189
192
|
activityStates.push({
|
|
190
193
|
phase,
|
|
@@ -392,9 +395,9 @@ describe("tool preview lifecycle", () => {
|
|
|
392
395
|
const collector = createEventCollector();
|
|
393
396
|
const conversationId = "test-session-id";
|
|
394
397
|
const deps = createMockDeps({
|
|
395
|
-
onEvent: (msg:
|
|
398
|
+
onEvent: (msg: AssistantEvent) => {
|
|
396
399
|
collector.events.push(msg);
|
|
397
|
-
stampAndBuffer(msg as unknown as
|
|
400
|
+
stampAndBuffer(msg as unknown as AssistantEventEnvelope);
|
|
398
401
|
},
|
|
399
402
|
ctx: {
|
|
400
403
|
...createMockDeps().ctx,
|
|
@@ -408,12 +411,12 @@ describe("tool preview lifecycle", () => {
|
|
|
408
411
|
type: "assistant_text_delta",
|
|
409
412
|
text: "hello",
|
|
410
413
|
conversationId,
|
|
411
|
-
} as unknown as
|
|
414
|
+
} as unknown as AssistantEventEnvelope);
|
|
412
415
|
stampAndBuffer({
|
|
413
416
|
type: "assistant_text_delta",
|
|
414
417
|
text: " world",
|
|
415
418
|
conversationId,
|
|
416
|
-
} as unknown as
|
|
419
|
+
} as unknown as AssistantEventEnvelope);
|
|
417
420
|
|
|
418
421
|
// WHEN a tool_use is handled (its block is already durable)
|
|
419
422
|
handleToolUse(state, deps, {
|
|
@@ -430,7 +433,7 @@ describe("tool preview lifecycle", () => {
|
|
|
430
433
|
expect(toolUseStart).toBeDefined();
|
|
431
434
|
expect(getConversationPersistedSeq(conversationId)).toBe(getCurrentSeq());
|
|
432
435
|
expect(getConversationPersistedSeq(conversationId)).toBe(
|
|
433
|
-
(toolUseStart as unknown as
|
|
436
|
+
(toolUseStart as unknown as AssistantEventEnvelope).seq ?? null,
|
|
434
437
|
);
|
|
435
438
|
});
|
|
436
439
|
});
|
|
@@ -446,12 +449,12 @@ describe("tool preview lifecycle", () => {
|
|
|
446
449
|
/** onEvent that stamps conversation-scoped events like the runtime hub. */
|
|
447
450
|
function makeStampingDeps(
|
|
448
451
|
overrides: Partial<EventHandlerDeps["ctx"]> = {},
|
|
449
|
-
): { deps: EventHandlerDeps; events:
|
|
450
|
-
const events:
|
|
452
|
+
): { deps: EventHandlerDeps; events: AssistantEvent[] } {
|
|
453
|
+
const events: AssistantEvent[] = [];
|
|
451
454
|
const deps = createMockDeps({
|
|
452
|
-
onEvent: (msg:
|
|
455
|
+
onEvent: (msg: AssistantEvent) => {
|
|
453
456
|
events.push(msg);
|
|
454
|
-
stampAndBuffer(msg as unknown as
|
|
457
|
+
stampAndBuffer(msg as unknown as AssistantEventEnvelope);
|
|
455
458
|
},
|
|
456
459
|
ctx: {
|
|
457
460
|
...createMockDeps().ctx,
|
|
@@ -494,7 +497,7 @@ describe("tool preview lifecycle", () => {
|
|
|
494
497
|
},
|
|
495
498
|
]);
|
|
496
499
|
expect(state.lastStreamedContentSeq).toBe(
|
|
497
|
-
(thinkingDelta as unknown as
|
|
500
|
+
(thinkingDelta as unknown as AssistantEventEnvelope).seq ?? undefined,
|
|
498
501
|
);
|
|
499
502
|
});
|
|
500
503
|
|
|
@@ -531,7 +534,7 @@ describe("tool preview lifecycle", () => {
|
|
|
531
534
|
expect(thinkingDelta).toBeDefined();
|
|
532
535
|
expect(getConversationPersistedSeq(conversationId)).toBe(getCurrentSeq());
|
|
533
536
|
expect(getConversationPersistedSeq(conversationId)).toBe(
|
|
534
|
-
(thinkingDelta as unknown as
|
|
537
|
+
(thinkingDelta as unknown as AssistantEventEnvelope).seq ?? null,
|
|
535
538
|
);
|
|
536
539
|
});
|
|
537
540
|
|
|
@@ -562,7 +565,7 @@ describe("tool preview lifecycle", () => {
|
|
|
562
565
|
expect(toolResult).toBeDefined();
|
|
563
566
|
expect(getConversationPersistedSeq(conversationId)).toBe(getCurrentSeq());
|
|
564
567
|
expect(getConversationPersistedSeq(conversationId)).toBe(
|
|
565
|
-
(toolResult as unknown as
|
|
568
|
+
(toolResult as unknown as AssistantEventEnvelope).seq ?? null,
|
|
566
569
|
);
|
|
567
570
|
});
|
|
568
571
|
|
|
@@ -611,13 +614,13 @@ describe("tool preview lifecycle", () => {
|
|
|
611
614
|
/** onEvent that stamps conversation-scoped events like the runtime hub. */
|
|
612
615
|
function makeStampingDeps(): {
|
|
613
616
|
deps: EventHandlerDeps;
|
|
614
|
-
events:
|
|
617
|
+
events: AssistantEvent[];
|
|
615
618
|
} {
|
|
616
|
-
const events:
|
|
619
|
+
const events: AssistantEvent[] = [];
|
|
617
620
|
const deps = createMockDeps({
|
|
618
|
-
onEvent: (msg:
|
|
621
|
+
onEvent: (msg: AssistantEvent) => {
|
|
619
622
|
events.push(msg);
|
|
620
|
-
stampAndBuffer(msg as unknown as
|
|
623
|
+
stampAndBuffer(msg as unknown as AssistantEventEnvelope);
|
|
621
624
|
},
|
|
622
625
|
ctx: {
|
|
623
626
|
...createMockDeps().ctx,
|
|
@@ -803,7 +806,7 @@ describe("tool preview lifecycle", () => {
|
|
|
803
806
|
/** Deps wired to a fresh collector. */
|
|
804
807
|
function makeCollectingDeps(): {
|
|
805
808
|
deps: EventHandlerDeps;
|
|
806
|
-
events:
|
|
809
|
+
events: AssistantEvent[];
|
|
807
810
|
} {
|
|
808
811
|
const collector = createEventCollector();
|
|
809
812
|
const deps = createMockDeps({
|
|
@@ -817,7 +820,7 @@ describe("tool preview lifecycle", () => {
|
|
|
817
820
|
}
|
|
818
821
|
|
|
819
822
|
function emittedToolResult(
|
|
820
|
-
events:
|
|
823
|
+
events: AssistantEvent[],
|
|
821
824
|
): Record<string, unknown> {
|
|
822
825
|
const toolResult = events.find((e) => e.type === "tool_result");
|
|
823
826
|
expect(toolResult).toBeDefined();
|
|
@@ -26,6 +26,7 @@ mock.module("../persistence/llm-request-log-store.js", () => ({
|
|
|
26
26
|
}));
|
|
27
27
|
|
|
28
28
|
// ── Imports (after mocks) ─────────────────────────────────────────────────────
|
|
29
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
29
30
|
import type {
|
|
30
31
|
EventHandlerDeps,
|
|
31
32
|
EventHandlerState,
|
|
@@ -34,18 +35,17 @@ import {
|
|
|
34
35
|
createEventHandlerState,
|
|
35
36
|
handleToolResult,
|
|
36
37
|
} from "../daemon/conversation-agent-loop-handlers.js";
|
|
37
|
-
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
38
38
|
import type { ToolActivityMetadata } from "../daemon/message-types/web-activity.js";
|
|
39
39
|
|
|
40
|
-
type ToolResultEvent = Extract<
|
|
40
|
+
type ToolResultEvent = Extract<AssistantEvent, { type: "tool_result" }>;
|
|
41
41
|
|
|
42
42
|
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
43
43
|
|
|
44
44
|
function createCollectorDeps(): {
|
|
45
45
|
deps: EventHandlerDeps;
|
|
46
|
-
events:
|
|
46
|
+
events: AssistantEvent[];
|
|
47
47
|
} {
|
|
48
|
-
const events:
|
|
48
|
+
const events: AssistantEvent[] = [];
|
|
49
49
|
const deps = {
|
|
50
50
|
ctx: {
|
|
51
51
|
conversationId: "conv-meta",
|
|
@@ -55,7 +55,7 @@ function createCollectorDeps(): {
|
|
|
55
55
|
markWorkspaceTopLevelDirty: () => {},
|
|
56
56
|
currentTurnSurfaces: [],
|
|
57
57
|
} as unknown as EventHandlerDeps["ctx"],
|
|
58
|
-
onEvent: (msg:
|
|
58
|
+
onEvent: (msg: AssistantEvent) => events.push(msg),
|
|
59
59
|
reqId: "req-meta",
|
|
60
60
|
isFirstMessage: false,
|
|
61
61
|
shouldGenerateTitle: false,
|
|
@@ -54,6 +54,7 @@ mock.module("../apps/app-store.js", () => ({
|
|
|
54
54
|
editAppFile: mock(() => ({})),
|
|
55
55
|
inlineDistAssets: mock((_, html: string) => html),
|
|
56
56
|
addAppConversationId: mock(() => false),
|
|
57
|
+
linkAppToConversationLineage: mock(() => {}),
|
|
57
58
|
}));
|
|
58
59
|
mock.module("../services/published-app-updater.js", () => ({
|
|
59
60
|
updatePublishedAppDeployment: mock(() => Promise.resolve()),
|
|
@@ -39,6 +39,7 @@ mock.module("../runtime/assistant-stream-state.js", () => ({
|
|
|
39
39
|
|
|
40
40
|
// ── Imports (after mocks) ─────────────────────────────────────────────────────
|
|
41
41
|
import type { AgentEvent } from "../agent/loop.js";
|
|
42
|
+
import type { AssistantEvent } from "../api/index.js";
|
|
42
43
|
import type {
|
|
43
44
|
EventHandlerDeps,
|
|
44
45
|
EventHandlerState,
|
|
@@ -47,11 +48,10 @@ import {
|
|
|
47
48
|
createEventHandlerState,
|
|
48
49
|
handleToolUse,
|
|
49
50
|
} from "../daemon/conversation-agent-loop-handlers.js";
|
|
50
|
-
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
51
51
|
|
|
52
52
|
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
53
53
|
|
|
54
|
-
function makeDeps(onEvent: (event:
|
|
54
|
+
function makeDeps(onEvent: (event: AssistantEvent) => void): EventHandlerDeps {
|
|
55
55
|
return {
|
|
56
56
|
ctx: {
|
|
57
57
|
conversationId: "test-conv",
|
|
@@ -120,7 +120,7 @@ describe("handleToolUse — tool start timestamp", () => {
|
|
|
120
120
|
input: { command: "ls" },
|
|
121
121
|
},
|
|
122
122
|
]);
|
|
123
|
-
const events:
|
|
123
|
+
const events: AssistantEvent[] = [];
|
|
124
124
|
const before = Date.now();
|
|
125
125
|
|
|
126
126
|
// WHEN the tool begins
|
|
@@ -155,7 +155,7 @@ describe("handleToolUse — tool start timestamp", () => {
|
|
|
155
155
|
input: { command: "ls" },
|
|
156
156
|
},
|
|
157
157
|
]);
|
|
158
|
-
const events:
|
|
158
|
+
const events: AssistantEvent[] = [];
|
|
159
159
|
|
|
160
160
|
// WHEN the tool begins
|
|
161
161
|
handleToolUse(
|
|
@@ -206,8 +206,9 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
206
206
|
|
|
207
207
|
await handleChannelInbound(guardianReq, undefined, TEST_BEARER_TOKEN);
|
|
208
208
|
|
|
209
|
-
//
|
|
210
|
-
|
|
209
|
+
// A denial emits exactly one lifecycle signal — guardian_decision with
|
|
210
|
+
// decision: "denied". A second event for the same verdict would escape
|
|
211
|
+
// dedupe (distinct keys) and duplicate the guardian-facing notification.
|
|
211
212
|
const guardianDecisionSignals = emitSignalCalls.filter(
|
|
212
213
|
(c) => c.sourceEventName === "ingress.trusted_contact.guardian_decision",
|
|
213
214
|
);
|
|
@@ -216,7 +217,7 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
216
217
|
);
|
|
217
218
|
|
|
218
219
|
expect(guardianDecisionSignals.length).toBe(1);
|
|
219
|
-
expect(deniedSignals.length).toBe(
|
|
220
|
+
expect(deniedSignals.length).toBe(0);
|
|
220
221
|
|
|
221
222
|
// Verify guardian_decision payload
|
|
222
223
|
const gdPayload = guardianDecisionSignals[0].contextPayload as Record<
|
|
@@ -229,18 +230,9 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
229
230
|
expect(gdPayload.requesterDisplayName).toBe("Alice Requester");
|
|
230
231
|
expect(gdPayload.decidedByDisplayName).toBe("Guardian Bob");
|
|
231
232
|
|
|
232
|
-
// Verify denied payload
|
|
233
|
-
const dPayload = deniedSignals[0].contextPayload as Record<string, unknown>;
|
|
234
|
-
expect(dPayload.decision).toBe("denied");
|
|
235
|
-
expect(dPayload.requesterExternalUserId).toBe("requester-user-456");
|
|
236
|
-
expect(dPayload.requesterDisplayName).toBe("Alice Requester");
|
|
237
|
-
expect(dPayload.decidedByDisplayName).toBe("Guardian Bob");
|
|
238
|
-
|
|
239
|
-
// Verify deduplication keys are distinct
|
|
240
233
|
expect(guardianDecisionSignals[0].dedupeKey).toContain(
|
|
241
234
|
"trusted-contact:guardian-decision:",
|
|
242
235
|
);
|
|
243
|
-
expect(deniedSignals[0].dedupeKey).toContain("trusted-contact:denied:");
|
|
244
236
|
});
|
|
245
237
|
|
|
246
238
|
test("guardian approve emits guardian_decision and verification_sent signals with display names", async () => {
|
|
@@ -381,8 +373,11 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
381
373
|
typeof c.dedupeKey === "string" &&
|
|
382
374
|
(c.dedupeKey as string).includes(approval.id),
|
|
383
375
|
);
|
|
384
|
-
//
|
|
385
|
-
expect(signals.length).toBe(
|
|
376
|
+
// Exactly one lifecycle signal per denial, keyed on the request id.
|
|
377
|
+
expect(signals.length).toBe(1);
|
|
378
|
+
expect(signals[0].sourceEventName).toBe(
|
|
379
|
+
"ingress.trusted_contact.guardian_decision",
|
|
380
|
+
);
|
|
386
381
|
});
|
|
387
382
|
|
|
388
383
|
test("display name fields fall back to null when contacts have no display name", async () => {
|
|
@@ -451,12 +446,8 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
451
446
|
const guardianDecisionSignals = emitSignalCalls.filter(
|
|
452
447
|
(c) => c.sourceEventName === "ingress.trusted_contact.guardian_decision",
|
|
453
448
|
);
|
|
454
|
-
const deniedSignals = emitSignalCalls.filter(
|
|
455
|
-
(c) => c.sourceEventName === "ingress.trusted_contact.denied",
|
|
456
|
-
);
|
|
457
449
|
|
|
458
450
|
expect(guardianDecisionSignals.length).toBe(1);
|
|
459
|
-
expect(deniedSignals.length).toBe(1);
|
|
460
451
|
|
|
461
452
|
// Verify display names fall back to null/empty when contacts have no
|
|
462
453
|
// display name set.
|
|
@@ -469,10 +460,6 @@ describe("trusted contact lifecycle notification signals", () => {
|
|
|
469
460
|
// The signal enrichment resolves displayName from the contact record,
|
|
470
461
|
// so decidedByDisplayName will be "" (empty string) rather than null.
|
|
471
462
|
expect(gdPayload.decidedByDisplayName).toBe("");
|
|
472
|
-
|
|
473
|
-
const dPayload = deniedSignals[0].contextPayload as Record<string, unknown>;
|
|
474
|
-
expect(dPayload.requesterDisplayName).toBeNull();
|
|
475
|
-
expect(dPayload.decidedByDisplayName).toBe("");
|
|
476
463
|
});
|
|
477
464
|
});
|
|
478
465
|
|
|
@@ -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
|
buildCompletionSummary,
|
|
5
6
|
createSurfaceMutex,
|
|
@@ -10,7 +11,6 @@ import type {
|
|
|
10
11
|
ChoiceSurfaceData,
|
|
11
12
|
CopyBlockSurfaceData,
|
|
12
13
|
OAuthConnectSurfaceData,
|
|
13
|
-
ServerMessage,
|
|
14
14
|
SurfaceType,
|
|
15
15
|
UiSurfaceShow,
|
|
16
16
|
} from "../daemon/message-protocol.js";
|
|
@@ -18,7 +18,7 @@ import { INTERACTIVE_SURFACE_TYPES } from "../daemon/message-protocol.js";
|
|
|
18
18
|
import { uiShowTool } from "../tools/ui-surface/definitions.js";
|
|
19
19
|
import { uiShowTeachingError } from "../tools/ui-surface/surface-shape-docs.js";
|
|
20
20
|
|
|
21
|
-
function makeContext(sent:
|
|
21
|
+
function makeContext(sent: AssistantEvent[] = []): SurfaceConversationContext {
|
|
22
22
|
return {
|
|
23
23
|
conversationId: "session-1",
|
|
24
24
|
sendToClient: (msg) => sent.push(msg),
|
|
@@ -67,7 +67,7 @@ describe("choice and copy_block surface definitions", () => {
|
|
|
67
67
|
|
|
68
68
|
describe("choice and copy_block surface proxying", () => {
|
|
69
69
|
test("ui_show normalizes choice options and creates recommended action payloads", async () => {
|
|
70
|
-
const sent:
|
|
70
|
+
const sent: AssistantEvent[] = [];
|
|
71
71
|
const ctx = makeContext(sent);
|
|
72
72
|
|
|
73
73
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -126,7 +126,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
126
126
|
});
|
|
127
127
|
|
|
128
128
|
test("ui_show rejects choice surfaces without valid options", async () => {
|
|
129
|
-
const sent:
|
|
129
|
+
const sent: AssistantEvent[] = [];
|
|
130
130
|
const ctx = makeContext(sent);
|
|
131
131
|
|
|
132
132
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -142,7 +142,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
142
142
|
});
|
|
143
143
|
|
|
144
144
|
test("ui_show passes copy_block data through without awaiting action", async () => {
|
|
145
|
-
const sent:
|
|
145
|
+
const sent: AssistantEvent[] = [];
|
|
146
146
|
const ctx = makeContext(sent);
|
|
147
147
|
|
|
148
148
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -174,7 +174,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
174
174
|
});
|
|
175
175
|
|
|
176
176
|
test("ui_show passes oauth_connect data through and awaits action", async () => {
|
|
177
|
-
const sent:
|
|
177
|
+
const sent: AssistantEvent[] = [];
|
|
178
178
|
const ctx = makeContext(sent);
|
|
179
179
|
|
|
180
180
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -211,7 +211,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
211
211
|
});
|
|
212
212
|
|
|
213
213
|
test("ui_show rejects oauth_connect without providerKey", async () => {
|
|
214
|
-
const sent:
|
|
214
|
+
const sent: AssistantEvent[] = [];
|
|
215
215
|
const ctx = makeContext(sent);
|
|
216
216
|
|
|
217
217
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -225,7 +225,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
225
225
|
});
|
|
226
226
|
|
|
227
227
|
test("ui_show recovers copy_block data sent as a JSON-encoded string", async () => {
|
|
228
|
-
const sent:
|
|
228
|
+
const sent: AssistantEvent[] = [];
|
|
229
229
|
const ctx = makeContext(sent);
|
|
230
230
|
|
|
231
231
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -249,7 +249,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
249
249
|
});
|
|
250
250
|
|
|
251
251
|
test("ui_show recovers copy_block fields placed at the top level of the input", async () => {
|
|
252
|
-
const sent:
|
|
252
|
+
const sent: AssistantEvent[] = [];
|
|
253
253
|
const ctx = makeContext(sent);
|
|
254
254
|
|
|
255
255
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -275,7 +275,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
275
275
|
});
|
|
276
276
|
|
|
277
277
|
test("ui_show rejects an unknown surface_type with the valid values", async () => {
|
|
278
|
-
const sent:
|
|
278
|
+
const sent: AssistantEvent[] = [];
|
|
279
279
|
const ctx = makeContext(sent);
|
|
280
280
|
|
|
281
281
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -291,7 +291,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
291
291
|
|
|
292
292
|
test("ui_show rejects daemon-internal surface types and omits them from the valid list", async () => {
|
|
293
293
|
for (const internalType of ["skill_card", "call_summary"]) {
|
|
294
|
-
const sent:
|
|
294
|
+
const sent: AssistantEvent[] = [];
|
|
295
295
|
const ctx = makeContext(sent);
|
|
296
296
|
|
|
297
297
|
const result = await surfaceProxyResolver(ctx, "ui_show", {
|
|
@@ -325,7 +325,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
325
325
|
});
|
|
326
326
|
|
|
327
327
|
test("uiShowTool.execute renders a copy_block whose text is at the top level", async () => {
|
|
328
|
-
const sent:
|
|
328
|
+
const sent: AssistantEvent[] = [];
|
|
329
329
|
const ctx = makeContext(sent);
|
|
330
330
|
const result = await uiShowTool.execute(
|
|
331
331
|
{ surface_type: "copy_block", text: "bunx vellum doctor", data: {} },
|
|
@@ -347,7 +347,7 @@ describe("choice and copy_block surface proxying", () => {
|
|
|
347
347
|
});
|
|
348
348
|
|
|
349
349
|
test("uiShowTool.execute renders a dynamic_page whose html is at the top level", async () => {
|
|
350
|
-
const sent:
|
|
350
|
+
const sent: AssistantEvent[] = [];
|
|
351
351
|
const ctx = makeContext(sent);
|
|
352
352
|
const result = await uiShowTool.execute(
|
|
353
353
|
{ surface_type: "dynamic_page", html: "<p>hello</p>", data: {} },
|