@vellumai/assistant 0.11.3 → 0.11.4-dev.202608190019.b94dbf2
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 +9 -3
- package/ARCHITECTURE.md +32 -10
- package/docs/architecture/memory.md +43 -5
- package/docs/architecture/security.md +96 -152
- package/docs/architecture/turn-actor.md +70 -0
- package/docs/browser-use-architecture-phase2.md +128 -56
- package/docs/flux-turn-detection-spike.md +248 -0
- package/docs/guardian-request-flow.md +35 -0
- package/docs/stt-provider-onboarding.md +3 -1
- package/knip.json +3 -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__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- 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__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +34 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +166 -1
- package/node_modules/@vellumai/gateway-client/src/index.ts +2 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
- package/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
- package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
- package/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
- package/openapi.yaml +289 -113
- package/package.json +1 -1
- package/scripts/voice-ttft-spike.ts +3 -3
- package/scripts/write-plugin-api-shim.ts +10 -0
- package/src/__tests__/app-compiler.test.ts +38 -3
- package/src/__tests__/app-control-flow.test.ts +1 -0
- package/src/__tests__/approval-routes-http.test.ts +2 -2
- package/src/__tests__/assistant-feature-flag-guard.test.ts +25 -3
- package/src/__tests__/attachments-store.test.ts +21 -12
- package/src/__tests__/byok-default-profile-ensure.test.ts +17 -0
- package/src/__tests__/call-setup-flow-name-capture.test.ts +0 -1
- package/src/__tests__/call-site-routing-provider.test.ts +1 -1
- package/src/__tests__/channel-availability-routes.test.ts +14 -1
- package/src/__tests__/channel-capabilities-dedupe.test.ts +214 -0
- package/src/__tests__/channel-delivery-store.test.ts +14 -14
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +4 -4
- package/src/__tests__/channel-setup-panel-ack.test.ts +1 -1
- package/src/__tests__/checker.test.ts +20 -314
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +6 -2
- package/src/__tests__/compaction-events.test.ts +8 -10
- package/src/__tests__/config-loader-backfill.test.ts +3 -3
- package/src/__tests__/config-schema.test.ts +25 -10
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +8 -11
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +8 -11
- package/src/__tests__/conversation-agent-loop.test.ts +32 -21
- package/src/__tests__/conversation-attachments.test.ts +0 -1
- package/src/__tests__/conversation-attention-store.test.ts +63 -0
- package/src/__tests__/conversation-confirmation-signals.test.ts +112 -0
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -4
- package/src/__tests__/conversation-fork-crud.test.ts +69 -0
- package/src/__tests__/conversation-fork-referential.test.ts +67 -0
- package/src/__tests__/conversation-fork-retrospective.test.ts +24 -0
- package/src/__tests__/conversation-load-history-repair.test.ts +209 -0
- package/src/__tests__/conversation-notifiers-provenance.test.ts +59 -0
- package/src/__tests__/conversation-queue.test.ts +154 -4
- package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +1 -1
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +9 -9
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +1 -1
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +187 -102
- package/src/__tests__/conversation-runtime-workspace.test.ts +14 -10
- package/src/__tests__/conversation-slash-queue.test.ts +3 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-app-open.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-history-restored-completion.test.ts +21 -14
- package/src/__tests__/conversation-surfaces-queued-emit.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-state-update.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-table-action.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +1 -1
- package/src/__tests__/credential-prompt-route.test.ts +7 -10
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +1 -0
- package/src/__tests__/custom-profile-ensure.test.ts +5 -1
- package/src/__tests__/default-plugin-names-guard.test.ts +12 -1
- package/src/__tests__/discord-access-request-privacy.test.ts +5 -1
- package/src/__tests__/discord-requester-notice-privacy.test.ts +3 -3
- package/src/__tests__/document-append-idempotency.test.ts +233 -0
- package/src/__tests__/document-sync-tags.test.ts +0 -75
- package/src/__tests__/dynamic-skill-background-guard.test.ts +0 -2
- package/src/__tests__/edit-propagation.test.ts +107 -11
- package/src/__tests__/file-ops-service.test.ts +163 -30
- package/src/__tests__/filesystem-tools.test.ts +23 -24
- package/src/__tests__/gateway-only-guard.test.ts +2 -5
- package/src/__tests__/helpers/gateway-classify-mock.ts +27 -6
- package/src/__tests__/helpers/mock-actor-context.ts +49 -0
- package/src/__tests__/helpers/mock-conversation.ts +13 -1
- package/src/__tests__/host-file-read-tool.test.ts +16 -19
- package/src/__tests__/http-user-message-parity.test.ts +1 -1
- package/src/__tests__/init-feature-flag-overrides.test.ts +49 -0
- package/src/__tests__/injector-chain.test.ts +63 -41
- package/src/__tests__/injector-disk-pressure.test.ts +11 -23
- package/src/__tests__/inline-skill-load-permissions.test.ts +47 -36
- package/src/__tests__/llm-context-resolution.test.ts +73 -1
- package/src/__tests__/llm-schema.test.ts +5 -2
- package/src/__tests__/managed-skill-lifecycle.test.ts +7 -0
- package/src/__tests__/mcp-list-plugin-servers.test.ts +250 -0
- package/src/__tests__/media-generate-image.test.ts +131 -21
- package/src/__tests__/memory-retrieval-hook.test.ts +100 -7
- package/src/__tests__/messages-read-boundary-guard.test.ts +134 -0
- package/src/__tests__/mtime-cache.test.ts +3 -1
- package/src/__tests__/non-member-access-request.test.ts +0 -20
- package/src/__tests__/outbound-slack-persistence.test.ts +40 -1
- package/src/__tests__/platform-bash-auto-approve.test.ts +0 -4
- package/src/__tests__/plugin-api-store-credential.test.ts +261 -0
- package/src/__tests__/plugin-api-webhook-url.test.ts +10 -7
- package/src/__tests__/plugin-disabled-state.test.ts +2 -0
- package/src/__tests__/plugin-effective-enabled-set.test.ts +55 -3
- package/src/__tests__/plugin-execution-context.test.ts +73 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +5 -1
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +7 -4
- package/src/__tests__/plugin-secret-pattern-contribution.test.ts +1 -1
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +14 -7
- package/src/__tests__/provider-commit-message-generator.test.ts +20 -0
- package/src/__tests__/proxy-approval-callback.test.ts +1 -0
- package/src/__tests__/qdrant-manager.test.ts +14 -1
- package/src/__tests__/reaction-persistence.test.ts +200 -7
- package/src/__tests__/require-fresh-approval.test.ts +0 -4
- package/src/__tests__/risk-classification-boundary-guard.test.ts +115 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +460 -105
- package/src/__tests__/run-due-schedules.test.ts +21 -0
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +187 -18
- package/src/__tests__/schedule-routes.test.ts +23 -0
- package/src/__tests__/schedule-store.test.ts +17 -0
- package/src/__tests__/scoped-approval-grants.test.ts +11 -6
- package/src/__tests__/secret-ingress-channel.test.ts +0 -1
- package/src/__tests__/secret-ingress-http.test.ts +1 -1
- package/src/__tests__/send-endpoint-busy.test.ts +3 -3
- package/src/__tests__/skills.test.ts +32 -0
- package/src/__tests__/slack-edit-ordering-characterization.test.ts +0 -1
- package/src/__tests__/starter-task-flow.test.ts +5 -4
- package/src/__tests__/subagent-call-site-routing.test.ts +31 -19
- package/src/__tests__/subagent-fork-prompt-role.test.ts +1 -1
- package/src/__tests__/subagent-spawn-and-await.test.ts +18 -17
- package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -1
- package/src/__tests__/subagent-tools.test.ts +81 -101
- package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +1 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +132 -5
- package/src/__tests__/tool-executor.test.ts +68 -39
- package/src/__tests__/turn-events-store.test.ts +43 -0
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +1 -1
- package/src/__tests__/ui-shape-teaching.test.ts +33 -0
- package/src/__tests__/ui-visual-surface.test.ts +1 -1
- package/src/__tests__/ui-voice-picker-surface.test.ts +128 -0
- package/src/__tests__/ui-work-result-surface.test.ts +1 -1
- package/src/__tests__/user-plugin-loader.test.ts +3 -1
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
- package/src/__tests__/visible-app-context.test.ts +16 -9
- package/src/__tests__/voice-config-update.test.ts +40 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +5 -3
- package/src/__tests__/voice-session-bridge.test.ts +85 -29
- package/src/__tests__/worker-entrypoint-guards.test.ts +54 -0
- package/src/__tests__/worker-plugin-surface.test.ts +77 -0
- package/src/__tests__/workspace-migration-142-consolidate-voice-front-door.test.ts +158 -0
- package/src/__tests__/workspace-migration-143-repair-deprecated-codex-model-id.test.ts +133 -0
- package/src/__tests__/workspace-migration-144-convert-stranded-subscription-openai-profiles.test.ts +316 -0
- package/src/__tests__/workspace-migration-145-collapse-profile-bindings-to-entries.test.ts +325 -0
- package/src/__tests__/workspace-migration-146-repair-retired-fireworks-deepseek-flash-model-id.test.ts +235 -0
- package/src/acp/__tests__/acp-claude-oauth.test.ts +10 -2
- package/src/acp/__tests__/auth-required.test.ts +161 -0
- package/src/acp/acp-claude-oauth.ts +19 -2
- package/src/acp/agent-process.test.ts +100 -0
- package/src/acp/agent-process.ts +29 -26
- package/src/acp/auth-required.ts +102 -0
- package/src/acp/session-manager.test.ts +119 -0
- package/src/acp/session-manager.ts +76 -3
- package/src/api/events/acp-auth-required.ts +55 -0
- package/src/api/events/host-file.ts +2 -2
- package/src/api/index.ts +7 -0
- package/src/api/surfaces.ts +12 -3
- package/src/apps/app-store.ts +3 -0
- package/src/bundler/package-resolver.ts +2 -30
- package/src/calls/__tests__/voice-session-bridge.test.ts +194 -11
- package/src/calls/__tests__/voice-triage-escalate.test.ts +102 -0
- package/src/calls/call-controller.ts +19 -3
- package/src/calls/call-setup-flow.ts +0 -1
- package/src/calls/media-stream-stt-session.ts +15 -0
- package/src/calls/voice-session-bridge.ts +115 -41
- package/src/calls/voice-triage-escalate.ts +105 -2
- package/src/channels/__tests__/plugin-channel-declarations.test.ts +161 -0
- package/src/channels/config.ts +13 -0
- package/src/channels/plugin-channel-declarations.ts +108 -0
- package/src/channels/types.ts +30 -0
- package/src/cli/AGENTS.md +5 -2
- package/src/cli/bundled-modules.ts +29 -0
- package/src/cli/commands/credentials.help.ts +2 -2
- package/src/cli/commands/db/repair.ts +4 -8
- package/src/cli/commands/domain.ts +6 -3
- package/src/cli/commands/email.ts +6 -3
- package/src/cli/commands/inference-providers.ts +1 -1
- package/src/cli/commands/keys.ts +8 -3
- package/src/cli/commands/mcp.help.ts +13 -4
- package/src/cli/commands/mcp.ts +9 -0
- package/src/cli/commands/memory/__tests__/memory-v2.test.ts +57 -7
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +128 -5
- package/src/cli/commands/memory/index.help.ts +84 -28
- package/src/cli/commands/memory/index.ts +2 -0
- package/src/cli/commands/memory/memory-v2.ts +58 -54
- package/src/cli/commands/memory/memory-v3.ts +64 -0
- package/src/cli/commands/memory/memory-validate.ts +18 -0
- package/src/cli/commands/plugins.ts +85 -36
- package/src/cli/commands/schedules.ts +35 -1
- package/src/cli/commands/stt.help.ts +27 -2
- package/src/cli/commands/trust.ts +3 -14
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +39 -0
- package/src/cli/lib/bundled-marketplace.json +14 -1
- package/src/cli/lib/upgrade-plugin.ts +42 -0
- package/src/config/__tests__/balanced-model-experiment.test.ts +278 -0
- package/src/config/__tests__/default-profile-catalog.test.ts +34 -2
- package/src/config/__tests__/default-provider.test.ts +6 -1
- package/src/config/__tests__/profile-materialization.test.ts +75 -19
- package/src/config/assistant-feature-flags.ts +36 -15
- package/src/config/balanced-model-experiment.ts +35 -0
- package/src/config/bundled-skills/acp/SKILL.md +6 -7
- package/src/config/bundled-skills/document-editor/SKILL.md +2 -2
- package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
- package/src/config/bundled-skills/image-studio/SKILL.md +5 -4
- package/src/config/bundled-skills/image-studio/TOOLS.json +1 -1
- package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +101 -0
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +14 -4
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.test.ts +65 -0
- package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +7 -1
- package/src/config/bundled-skills/settings/tools/shared.ts +16 -0
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +19 -1
- package/src/config/bundled-skills/skill-management/TOOLS.json +9 -3
- package/src/config/bundled-skills/subagent/SKILL.md +17 -12
- package/src/config/bundled-skills/subagent/TOOLS.json +4 -4
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +22 -1
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +9 -2
- package/src/config/call-site-defaults.ts +11 -5
- package/src/config/default-profile-catalog.ts +179 -16
- package/src/config/default-profile-names.ts +4 -1
- package/src/config/default-provider-resolution.ts +4 -0
- package/src/config/feature-flag-registry.json +12 -12
- package/src/config/llm-context-resolution.ts +11 -3
- package/src/config/llm-resolver.ts +28 -1
- package/src/config/profile-materialization.ts +70 -22
- package/src/config/schemas/__tests__/live-voice.test.ts +107 -4
- package/src/config/schemas/call-site-catalog.ts +4 -4
- package/src/config/schemas/live-voice.ts +57 -23
- package/src/config/schemas/llm.ts +59 -32
- package/src/config/schemas/mcp.ts +23 -0
- package/src/config/schemas/plugin-updates.ts +6 -2
- package/src/config/schemas/stt.ts +1 -0
- package/src/config/skills.ts +9 -2
- package/src/context/outbound-sanitize.ts +96 -1
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
- package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +82 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +15 -10
- package/src/daemon/conversation-agent-loop.ts +31 -19
- package/src/daemon/conversation-messaging.ts +5 -1
- package/src/daemon/conversation-notifiers.ts +20 -10
- package/src/daemon/conversation-process.ts +20 -6
- package/src/daemon/conversation-runtime-assembly.ts +12 -6
- package/src/daemon/conversation-store.ts +14 -4
- package/src/daemon/conversation-surfaces.ts +75 -26
- package/src/daemon/conversation-tool-setup.ts +3 -6
- package/src/daemon/conversation.ts +154 -51
- package/src/daemon/doordash-steps.ts +2 -2
- package/src/daemon/lifecycle.ts +14 -1
- package/src/daemon/mcp-reload-service.ts +36 -6
- package/src/daemon/process-message.ts +13 -26
- package/src/daemon/providers-setup.ts +6 -3
- package/src/daemon/trust-context-types.ts +29 -0
- package/src/daemon/trust-context.ts +12 -7
- package/src/daemon/wake-conversation-ops.ts +3 -2
- package/src/daemon/windows-compiled-entry.ts +4 -0
- package/src/documents/document-store.ts +143 -240
- package/src/hooks/hook-loader.ts +3 -3
- package/src/hooks/registry.ts +103 -45
- package/src/hooks/types.ts +5 -0
- package/src/inbound/__tests__/oauth-callback-url.test.ts +83 -0
- package/src/inbound/oauth-callback-url.ts +61 -0
- package/src/ipc/gateway-client.test.ts +1 -1
- package/src/ipc/gateway-client.ts +14 -21
- package/src/ipc/gateway-flag-listener.ts +17 -3
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +1 -104
- package/src/live-voice/__tests__/live-voice-events.test.ts +7 -8
- package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +1050 -0
- package/src/live-voice/__tests__/live-voice-metrics.test.ts +115 -8
- package/src/live-voice/__tests__/live-voice-photo.test.ts +100 -0
- package/src/live-voice/__tests__/live-voice-progress.test.ts +60 -194
- package/src/live-voice/__tests__/live-voice-stt.test.ts +14 -0
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +29 -0
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +0 -483
- package/src/live-voice/__tests__/live-voice-vad.test.ts +0 -16
- package/src/live-voice/__tests__/progress-narration.test.ts +214 -0
- package/src/live-voice/live-voice-archive.ts +2 -0
- package/src/live-voice/live-voice-manager.ts +16 -3
- package/src/live-voice/live-voice-metrics.ts +57 -32
- package/src/live-voice/live-voice-photo.ts +1 -2
- package/src/live-voice/live-voice-session.ts +598 -323
- package/src/live-voice/progress-narration.ts +277 -0
- package/src/live-voice/protocol.ts +21 -1
- package/src/live-voice/windows-compiled-live-voice.ts +4 -0
- package/src/mcp/__tests__/effective-config.test.ts +238 -0
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +200 -0
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +9 -9
- package/src/mcp/__tests__/plugin-server-credential-isolation.test.ts +95 -0
- package/src/mcp/client.ts +16 -11
- package/src/mcp/effective-config.ts +113 -0
- package/src/mcp/manager.ts +11 -6
- package/src/mcp/mcp-auth-orchestrator.ts +13 -22
- package/src/mcp/mcp-oauth-provider.ts +205 -240
- package/src/monitoring/__tests__/plugin-auto-update.test.ts +166 -3
- package/src/monitoring/control.ts +1 -0
- package/src/monitoring/db-integrity-sample.ts +4 -5
- package/src/monitoring/plugin-auto-update.ts +128 -24
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/approval-card-data.ts +33 -0
- package/src/notifications/signal.ts +1 -0
- package/src/permissions/AGENTS.md +16 -0
- package/src/permissions/checker.test.ts +75 -122
- package/src/permissions/checker.ts +44 -560
- package/src/permissions/confirmation-guardian-request.test.ts +15 -11
- package/src/permissions/confirmation-guardian-request.ts +2 -2
- package/src/permissions/prompter.ts +1 -5
- package/src/permissions/question-guardian-request.test.ts +14 -6
- package/src/permissions/question-guardian-request.ts +1 -2
- package/src/persistence/attachments-store.ts +8 -1
- package/src/persistence/bookmark-crud.ts +3 -7
- package/src/persistence/conversation-attention-store.ts +16 -45
- package/src/persistence/conversation-crud.ts +33 -4
- package/src/persistence/conversation-lineage.ts +9 -0
- package/src/persistence/conversation-queries.ts +182 -52
- package/src/persistence/delivery-crud.ts +150 -36
- package/src/persistence/embeddings/qdrant-manager.ts +84 -49
- package/src/persistence/external-conversation-store.ts +32 -4
- package/src/persistence/llm-request-log-store.ts +4 -10
- package/src/persistence/llm-usage-store.ts +8 -3
- package/src/persistence/message-reads.test.ts +197 -0
- package/src/persistence/message-reads.ts +211 -0
- package/src/persistence/migrations/360-add-document-workspace-path.ts +5 -14
- package/src/persistence/migrations/366-chatgpt-subscription-row-identity.test.ts +120 -0
- package/src/persistence/migrations/366-chatgpt-subscription-row-identity.ts +62 -0
- package/src/persistence/real-user-turn-filter.ts +27 -3
- package/src/persistence/schema/documents.ts +4 -4
- package/src/persistence/steps.ts +9 -0
- package/src/plugin-api/__tests__/oauth-callback-url-export.test.ts +29 -0
- package/src/plugin-api/constants.ts +8 -0
- package/src/plugin-api/conversation-turn.ts +195 -5
- package/src/plugin-api/index.ts +38 -6
- package/src/plugin-api/resolve-credential.ts +3 -2
- package/src/plugin-api/store-credential.ts +146 -0
- package/src/plugin-api/vision-support.test.ts +1 -1
- package/src/plugin-api/webhook-url.ts +13 -11
- package/src/plugins/__tests__/mcp-servers.test.ts +371 -0
- package/src/plugins/defaults/main.ts +21 -7
- package/src/plugins/defaults/memory/AGENTS.md +15 -3
- package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +204 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +72 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +4 -1
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -1
- package/src/plugins/defaults/memory/buffer-format.ts +165 -0
- package/src/plugins/defaults/memory/context-search/sources/conversations.ts +6 -0
- package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +77 -0
- package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +24 -6
- package/src/plugins/defaults/memory/graph/image-ref-utils.ts +3 -0
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +1 -30
- package/src/plugins/defaults/memory/graph-topology/pending-buffer.test.ts +34 -0
- package/src/plugins/defaults/memory/graph-topology/pending-buffer.ts +17 -24
- package/src/plugins/defaults/memory/hooks/post-compact.ts +1 -4
- package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +53 -5
- package/src/plugins/defaults/memory/indexer.ts +3 -1
- package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +19 -7
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +281 -0
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +12 -10
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +207 -0
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +147 -0
- package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +8 -0
- package/src/plugins/defaults/memory/substrate/__tests__/edge-index.test.ts +0 -30
- package/src/plugins/defaults/memory/substrate/__tests__/ingest.test.ts +73 -1
- package/src/plugins/defaults/memory/substrate/__tests__/page-index.test.ts +37 -0
- package/src/plugins/defaults/memory/substrate/__tests__/page-links.test.ts +208 -0
- package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +158 -1
- package/src/plugins/defaults/memory/substrate/__tests__/static-context.test.ts +195 -58
- package/src/plugins/defaults/memory/substrate/consolidation-job.ts +93 -24
- package/src/plugins/defaults/memory/substrate/edge-index.ts +0 -31
- package/src/plugins/defaults/memory/substrate/ingest.ts +59 -0
- package/src/plugins/defaults/memory/substrate/page-index.ts +35 -8
- package/src/plugins/defaults/memory/substrate/page-links.ts +133 -0
- package/src/plugins/defaults/memory/substrate/page-store.ts +10 -0
- package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +124 -34
- package/src/plugins/defaults/memory/substrate/skill-content.ts +8 -1
- package/src/plugins/defaults/memory/substrate/static-context.ts +160 -33
- package/src/plugins/defaults/memory/substrate/sweep-job.ts +2 -4
- package/src/plugins/defaults/memory/v1/graph/extraction.ts +3 -1
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +18 -0
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +66 -1
- package/src/plugins/defaults/memory/v3/card.ts +9 -9
- package/src/plugins/defaults/memory/v3/core-set.test.ts +7 -0
- package/src/plugins/defaults/memory/v3/core-set.ts +5 -1
- package/src/plugins/defaults/memory/v3/edge.ts +13 -57
- package/src/plugins/defaults/memory/v3/injector.ts +8 -0
- package/src/plugins/defaults/memory/v3/prune.ts +2 -0
- package/src/plugins/defaults/memory/v3/selection-log-store.ts +2 -0
- package/src/plugins/defaults/memory/v3/shadow-plugin.ts +23 -9
- package/src/plugins/defaults/memory/worker-control.ts +1 -0
- package/src/plugins/defaults/memory/worker.ts +6 -3
- package/src/plugins/defaults/worker-entrypoints.ts +3 -0
- package/src/plugins/external-plugin-loader.ts +47 -0
- package/src/plugins/mcp-servers.ts +361 -0
- package/src/plugins/mtime-cache.ts +37 -46
- package/src/plugins/pipeline.ts +14 -7
- package/src/plugins/plugin-execution-context.ts +35 -11
- package/src/plugins/worker-plugin-surface.ts +33 -0
- package/src/prompts/templates/system-sections.ts +0 -7
- package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
- package/src/providers/__tests__/context-overflow-error.test.ts +24 -0
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +214 -2
- package/src/providers/__tests__/preflight-resolved-config.test.ts +57 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -2
- package/src/providers/anthropic/__tests__/pause-turn-continuation.test.ts +170 -0
- package/src/providers/anthropic/client.ts +332 -241
- package/src/providers/call-site-routing.ts +30 -3
- package/src/providers/connection-resolution.ts +194 -11
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +4 -0
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/inference/auth.ts +6 -0
- package/src/providers/inference/connection-availability.ts +24 -2
- package/src/providers/inference/connections.ts +2 -0
- package/src/providers/model-catalog.ts +3 -3
- package/src/providers/model-intents.ts +28 -8
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +163 -40
- package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +125 -2
- package/src/providers/openai/chat-completions-provider.ts +133 -36
- package/src/providers/openai/codex-models.ts +2 -1
- package/src/providers/provider-send-message.ts +32 -3
- package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +433 -0
- package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +625 -0
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +34 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +285 -6
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +395 -0
- package/src/providers/speech-to-text/deepgram-flux-realtime.ts +679 -0
- package/src/providers/speech-to-text/provider-catalog.ts +99 -8
- package/src/providers/speech-to-text/resolve.ts +25 -2
- package/src/routes/control.ts +1 -0
- package/src/routes/route-host-client.ts +1 -0
- package/src/routes/route-host-protocol.ts +7 -0
- package/src/routes/worker.ts +48 -15
- package/src/runtime/AGENTS.md +16 -17
- package/src/runtime/access-request-helper.ts +9 -12
- package/src/runtime/agent-wake.ts +18 -15
- package/src/runtime/effective-capabilities.test.ts +43 -0
- package/src/runtime/effective-capabilities.ts +27 -0
- package/src/runtime/guardian-reply-router.ts +6 -2
- package/src/runtime/pre-first-message-gate.ts +4 -0
- package/src/runtime/routes/__tests__/acp-claude-auth-routes.test.ts +12 -4
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +522 -2
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +52 -0
- package/src/runtime/routes/__tests__/default-provider-routes.test.ts +61 -0
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +44 -0
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +102 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +132 -35
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +215 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +25 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +55 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +52 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +133 -1
- package/src/runtime/routes/channel-availability-routes.ts +32 -14
- package/src/runtime/routes/channel-route-shared.ts +0 -6
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +6 -6
- package/src/runtime/routes/conversation-list-routes.ts +181 -23
- package/src/runtime/routes/conversation-management-routes.ts +17 -12
- package/src/runtime/routes/conversation-query-routes.ts +40 -27
- package/src/runtime/routes/conversation-routes.ts +43 -29
- package/src/runtime/routes/credential-prompt-routes.ts +4 -7
- package/src/runtime/routes/credential-routes.ts +26 -82
- package/src/runtime/routes/default-provider-routes.ts +15 -0
- package/src/runtime/routes/documents-routes.ts +3 -222
- package/src/runtime/routes/inbound-message-handler.ts +21 -45
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -9
- package/src/runtime/routes/inbound-stages/admission-policy.ts +1 -17
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +2 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +101 -79
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +0 -1
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +12 -7
- package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +91 -8
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +72 -79
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +2 -3
- package/src/runtime/routes/inference-profiles-routes.ts +20 -11
- package/src/runtime/routes/inference-provider-connection-routes.ts +77 -15
- package/src/runtime/routes/log-export-routes.ts +3 -0
- package/src/runtime/routes/mcp-auth-routes.ts +148 -57
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +2 -0
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +3 -0
- package/src/runtime/routes/playground/inject-failures.ts +2 -2
- package/src/runtime/routes/playground/reset-circuit.ts +1 -1
- package/src/runtime/routes/plugins-routes.ts +38 -8
- package/src/runtime/routes/schedule-routes.ts +94 -7
- package/src/runtime/routes/settings-routes.ts +6 -6
- package/src/runtime/routes/stt-routes.ts +31 -25
- package/src/runtime/routes/surface-action-routes.ts +20 -19
- package/src/runtime/routes/surface-conversation-resolver.ts +3 -0
- package/src/runtime/routes/user-route-dispatcher.ts +69 -15
- package/src/runtime/routes/user-route-import.ts +108 -0
- package/src/runtime/routes/user-route-resolution.ts +18 -1
- package/src/runtime/routes/workspace-routes.ts +0 -9
- package/src/runtime/routes/workspace-utils.ts +3 -13
- package/src/runtime/services/conversation-serializer.ts +7 -2
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +68 -5
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +81 -0
- package/src/schedule/plugin-schedule-availability.ts +58 -0
- package/src/schedule/plugin-schedule-declarations.ts +23 -27
- package/src/schedule/plugin-schedule-reconciler.ts +12 -3
- package/src/schedule/schedule-store.ts +5 -1
- package/src/schedule/scheduler.ts +9 -4
- package/src/schedule/worker-control.ts +1 -0
- package/src/schedule/worker.ts +6 -0
- package/src/security/oauth2.ts +6 -22
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +22 -0
- package/src/stt/__tests__/types.test.ts +94 -0
- package/src/stt/daemon-batch-transcriber.ts +10 -0
- package/src/stt/stt-stream-session.ts +8 -4
- package/src/stt/types.ts +103 -0
- package/src/subagent/__tests__/consult-prompt.test.ts +26 -15
- package/src/subagent/consult-context.ts +11 -11
- package/src/subagent/consult-prompt.ts +26 -35
- package/src/subagent/manager.ts +21 -40
- package/src/subagent/notify.ts +7 -1
- package/src/subagent/types.ts +15 -12
- package/src/tools/__tests__/tool-input-schemas.test.ts +7 -7
- package/src/tools/acp/spawn.test.ts +97 -0
- package/src/tools/acp/spawn.ts +38 -4
- package/src/tools/credentials/ref-parse.ts +35 -0
- package/src/tools/credentials/resolve.ts +4 -10
- package/src/tools/credentials/store.ts +168 -0
- package/src/tools/document/document-tool.ts +12 -3
- package/src/tools/executor.ts +53 -15
- package/src/tools/filesystem/read.ts +27 -10
- package/src/tools/host-filesystem/read.ts +27 -15
- package/src/tools/network/url-safety.ts +9 -16
- package/src/tools/permission-checker.ts +43 -52
- package/src/tools/registry.ts +2 -1
- package/src/tools/shared/filesystem/file-ops-service.ts +63 -35
- package/src/tools/shared/filesystem/legacy-read-args.ts +22 -0
- package/src/tools/shared/filesystem/types.ts +5 -5
- package/src/tools/skills/scaffold-managed.ts +25 -7
- package/src/tools/subagent/spawn.ts +28 -88
- package/src/tools/tool-types.ts +26 -13
- package/src/tools/types.ts +6 -6
- package/src/tools/ui-surface/surface-shape-docs.ts +12 -1
- package/src/tools/workflows/run-workflow.ts +1 -2
- package/src/tts/__tests__/reasoning-tag-filter.test.ts +78 -0
- package/src/tts/reasoning-tag-filter.ts +89 -0
- package/src/util/__tests__/worker-process-command.test.ts +37 -0
- package/src/util/logger.ts +16 -0
- package/src/util/think-tag-stream.ts +95 -0
- package/src/util/worker-process.ts +37 -4
- package/src/windows-compiled-cli.ts +32 -0
- package/src/windows-compiled-entry.ts +4 -0
- package/src/windows-compiled-logger.ts +6 -0
- package/src/windows-compiled-worker-entry.ts +29 -0
- package/src/workspace/byok-default-profile-ensure.ts +76 -24
- package/src/workspace/custom-profile-ensure.ts +4 -24
- package/src/workspace/migrations/142-consolidate-voice-front-door.ts +70 -0
- package/src/workspace/migrations/143-repair-deprecated-codex-model-id.ts +134 -0
- package/src/workspace/migrations/144-convert-stranded-subscription-openai-profiles.ts +265 -0
- package/src/workspace/migrations/145-collapse-profile-bindings-to-entries.ts +328 -0
- package/src/workspace/migrations/146-repair-retired-fireworks-deepseek-flash-model-id.ts +195 -0
- package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +0 -10
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/provider-commit-message-generator.ts +7 -5
- package/src/__tests__/document-workspace-file.test.ts +0 -467
- package/src/live-voice/__tests__/front-decision.test.ts +0 -645
- package/src/live-voice/front-decision.ts +0 -476
- package/src/permissions/ipc-risk-types.ts +0 -143
- package/src/permissions/risk-types.ts +0 -76
- package/src/subagent/__tests__/consult-transcript.test.ts +0 -184
- package/src/subagent/consult-transcript.ts +0 -90
|
@@ -713,3 +713,212 @@ describe("loadFromDb tool-result truncation", () => {
|
|
|
713
713
|
).toBe(preStubbed);
|
|
714
714
|
});
|
|
715
715
|
});
|
|
716
|
+
|
|
717
|
+
/**
|
|
718
|
+
* A guardian card is written into the conversation the request came from by
|
|
719
|
+
* the notification pairing layer, straight to the DB, while that
|
|
720
|
+
* conversation's turn is parked awaiting the approval. On the next load it
|
|
721
|
+
* lands between the parked turn's `tool_use` and its `tool_result`.
|
|
722
|
+
*
|
|
723
|
+
* The card is recognized by its own `ui_surface` id rather than a stored
|
|
724
|
+
* marker, so rows written before this rule existed are dropped on the same
|
|
725
|
+
* terms as new ones.
|
|
726
|
+
*/
|
|
727
|
+
describe("guardian card rows are not replayed as conversation history", () => {
|
|
728
|
+
const baseConversation = {
|
|
729
|
+
id: "conv-1",
|
|
730
|
+
contextSummary: null,
|
|
731
|
+
contextCompactedMessageCount: 0,
|
|
732
|
+
totalInputTokens: 0,
|
|
733
|
+
totalOutputTokens: 0,
|
|
734
|
+
totalEstimatedCost: 0,
|
|
735
|
+
};
|
|
736
|
+
|
|
737
|
+
/** The parked turn: an approval-gated `tool_use` and the result it got. */
|
|
738
|
+
const toolUseRow = {
|
|
739
|
+
id: "m-use",
|
|
740
|
+
role: "assistant",
|
|
741
|
+
content: [
|
|
742
|
+
{ type: "text", text: "Running that now." },
|
|
743
|
+
{ type: "tool_use", id: "tu_1", name: "bash", input: { cmd: "ls" } },
|
|
744
|
+
],
|
|
745
|
+
};
|
|
746
|
+
const toolResultRow = {
|
|
747
|
+
id: "m-result",
|
|
748
|
+
role: "user",
|
|
749
|
+
content: [
|
|
750
|
+
{ type: "tool_result", tool_use_id: "tu_1", content: "REAL RESULT" },
|
|
751
|
+
],
|
|
752
|
+
};
|
|
753
|
+
|
|
754
|
+
/** What `buildApprovalCardBlocks` persists: the surface, then its text. */
|
|
755
|
+
function cardRow(surfaceId: string) {
|
|
756
|
+
return {
|
|
757
|
+
id: "m-card",
|
|
758
|
+
role: "assistant",
|
|
759
|
+
content: [
|
|
760
|
+
{
|
|
761
|
+
type: "ui_surface",
|
|
762
|
+
surfaceId,
|
|
763
|
+
surfaceType: "card",
|
|
764
|
+
title: "Tool Approval",
|
|
765
|
+
data: {},
|
|
766
|
+
display: "inline",
|
|
767
|
+
},
|
|
768
|
+
{ type: "text", text: "Tool Approval\nbash - requested by Alice" },
|
|
769
|
+
],
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
function allBlocks(messages: Message[]) {
|
|
774
|
+
return messages.flatMap((m) => m.content);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
function toolResultsFor(messages: Message[], toolUseId: string) {
|
|
778
|
+
return allBlocks(messages).filter(
|
|
779
|
+
(b) => b.type === "tool_result" && b.tool_use_id === toolUseId,
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
function serialized(value: unknown): string {
|
|
784
|
+
return JSON.stringify(value);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
beforeEach(() => {
|
|
788
|
+
nextMockMessageId = 1;
|
|
789
|
+
mockConversation = { ...baseConversation };
|
|
790
|
+
});
|
|
791
|
+
|
|
792
|
+
// Sensitivity check for the drop below: an ordinary assistant turn in the
|
|
793
|
+
// same position still corrupts the pair. If the rule ever widened past
|
|
794
|
+
// guardian cards, this test fails first and says so.
|
|
795
|
+
test("an ordinary assistant turn between a tool_use and its result still corrupts it", async () => {
|
|
796
|
+
mockDbMessages = [
|
|
797
|
+
toolUseRow,
|
|
798
|
+
{
|
|
799
|
+
id: "m-card",
|
|
800
|
+
role: "assistant",
|
|
801
|
+
content: [{ type: "text", text: "Still working on it." }],
|
|
802
|
+
},
|
|
803
|
+
toolResultRow,
|
|
804
|
+
];
|
|
805
|
+
|
|
806
|
+
const conversation = makeConversation();
|
|
807
|
+
await conversation.loadFromDb();
|
|
808
|
+
const messages = conversation.getMessages();
|
|
809
|
+
|
|
810
|
+
expect(serialized(messages)).toContain("tool result missing from history");
|
|
811
|
+
expect(serialized(messages)).toContain("[orphaned tool_result for tu_1]");
|
|
812
|
+
expect(serialized(toolResultsFor(messages, "tu_1"))).not.toContain(
|
|
813
|
+
"REAL RESULT",
|
|
814
|
+
);
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
test("a guardian card is dropped and the real tool_result survives", async () => {
|
|
818
|
+
mockDbMessages = [
|
|
819
|
+
toolUseRow,
|
|
820
|
+
cardRow("tool-approval-req-1"),
|
|
821
|
+
toolResultRow,
|
|
822
|
+
];
|
|
823
|
+
|
|
824
|
+
const conversation = makeConversation();
|
|
825
|
+
await conversation.loadFromDb();
|
|
826
|
+
const messages = conversation.getMessages();
|
|
827
|
+
|
|
828
|
+
// The pair is adjacent and intact: no stub, no downgrade, and exactly one
|
|
829
|
+
// tool_result for tu_1 carrying the tool's own output.
|
|
830
|
+
expect(serialized(messages)).not.toContain(
|
|
831
|
+
"tool result missing from history",
|
|
832
|
+
);
|
|
833
|
+
expect(serialized(messages)).not.toContain("[orphaned tool_result");
|
|
834
|
+
const results = toolResultsFor(messages, "tu_1");
|
|
835
|
+
expect(results).toHaveLength(1);
|
|
836
|
+
expect(results[0].type === "tool_result" && results[0].content).toBe(
|
|
837
|
+
"REAL RESULT",
|
|
838
|
+
);
|
|
839
|
+
expect(serialized(messages)).not.toContain("Tool Approval");
|
|
840
|
+
expect(messages).toHaveLength(2);
|
|
841
|
+
});
|
|
842
|
+
|
|
843
|
+
test("an access-request card is dropped on the same terms", async () => {
|
|
844
|
+
mockDbMessages = [
|
|
845
|
+
toolUseRow,
|
|
846
|
+
cardRow("access-request-req-9"),
|
|
847
|
+
toolResultRow,
|
|
848
|
+
];
|
|
849
|
+
|
|
850
|
+
const conversation = makeConversation();
|
|
851
|
+
await conversation.loadFromDb();
|
|
852
|
+
const messages = conversation.getMessages();
|
|
853
|
+
|
|
854
|
+
expect(serialized(messages)).not.toContain("[orphaned tool_result");
|
|
855
|
+
expect(messages).toHaveLength(2);
|
|
856
|
+
});
|
|
857
|
+
|
|
858
|
+
test("a card as the tail row leaves history ending on a user message", async () => {
|
|
859
|
+
// The prefill shape: the approval was delivered and the turn never
|
|
860
|
+
// resumed, so the card is the last row. Replayed, it makes the history
|
|
861
|
+
// end on an assistant turn, which extended-thinking models reject with
|
|
862
|
+
// "does not support assistant message prefill".
|
|
863
|
+
mockDbMessages = [toolUseRow, cardRow("tool-approval-req-1")];
|
|
864
|
+
|
|
865
|
+
const conversation = makeConversation();
|
|
866
|
+
await conversation.loadFromDb();
|
|
867
|
+
const messages = conversation.getMessages();
|
|
868
|
+
|
|
869
|
+
expect(messages[messages.length - 1].role).toBe("user");
|
|
870
|
+
// The tail is repair's fill for the still-unanswered tool_use, which is
|
|
871
|
+
// correct here: the tool genuinely never ran.
|
|
872
|
+
expect(toolResultsFor(messages, "tu_1")).toHaveLength(1);
|
|
873
|
+
});
|
|
874
|
+
|
|
875
|
+
test("a dropped card still restores its ui_surface for action routing", async () => {
|
|
876
|
+
// Surface lifecycle and model context are different questions. The card is
|
|
877
|
+
// absent from history, but its Approve/Reject buttons must keep routing
|
|
878
|
+
// after a restart, which `findConversationBySurfaceId` resolves through
|
|
879
|
+
// surfaceState rebuilt at load.
|
|
880
|
+
mockDbMessages = [toolUseRow, cardRow("tool-approval-req-1")];
|
|
881
|
+
|
|
882
|
+
const conversation = makeConversation();
|
|
883
|
+
await conversation.loadFromDb();
|
|
884
|
+
|
|
885
|
+
expect(serialized(conversation.getMessages())).not.toContain(
|
|
886
|
+
"tool-approval-req-1",
|
|
887
|
+
);
|
|
888
|
+
expect(
|
|
889
|
+
(
|
|
890
|
+
conversation as unknown as { surfaceState: Map<string, unknown> }
|
|
891
|
+
).surfaceState.has("tool-approval-req-1"),
|
|
892
|
+
).toBe(true);
|
|
893
|
+
});
|
|
894
|
+
|
|
895
|
+
test("an assistant turn carrying a non-approval surface stays in history", async () => {
|
|
896
|
+
// A wake card is unshifted onto a real turn's own content. Its surface id
|
|
897
|
+
// uses a different prefix, and dropping that row would discard speech.
|
|
898
|
+
mockDbMessages = [
|
|
899
|
+
{ id: "m-ask", role: "user", content: [{ type: "text", text: "hi" }] },
|
|
900
|
+
{
|
|
901
|
+
id: "m-wake",
|
|
902
|
+
role: "assistant",
|
|
903
|
+
content: [
|
|
904
|
+
{
|
|
905
|
+
type: "ui_surface",
|
|
906
|
+
surfaceId: "wake-conv-1-1700000000",
|
|
907
|
+
surfaceType: "card",
|
|
908
|
+
title: "Conversation Woke",
|
|
909
|
+
data: {},
|
|
910
|
+
display: "inline",
|
|
911
|
+
},
|
|
912
|
+
{ type: "text", text: "Picking this back up." },
|
|
913
|
+
],
|
|
914
|
+
},
|
|
915
|
+
];
|
|
916
|
+
|
|
917
|
+
const conversation = makeConversation();
|
|
918
|
+
await conversation.loadFromDb();
|
|
919
|
+
|
|
920
|
+
expect(serialized(conversation.getMessages())).toContain(
|
|
921
|
+
"Picking this back up.",
|
|
922
|
+
);
|
|
923
|
+
});
|
|
924
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live-call question notifier persists its row after the voice turn has
|
|
3
|
+
* settled. The per-turn trust field is not cleared at release, so at that
|
|
4
|
+
* moment it can still hold the finished turn's actor while voice cleanup has
|
|
5
|
+
* restored the conversation's resting trust. The row must carry the owner,
|
|
6
|
+
* not the stale turn actor.
|
|
7
|
+
*/
|
|
8
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
9
|
+
|
|
10
|
+
const added: Array<{ metadata?: Record<string, unknown> }> = [];
|
|
11
|
+
mock.module("../persistence/conversation-crud.js", () => ({
|
|
12
|
+
addMessage: async (
|
|
13
|
+
_conversationId: string,
|
|
14
|
+
_role: string,
|
|
15
|
+
_content: string,
|
|
16
|
+
options?: { metadata?: Record<string, unknown> },
|
|
17
|
+
) => {
|
|
18
|
+
added.push({ metadata: options?.metadata });
|
|
19
|
+
return { id: "msg-1", deduplicated: false };
|
|
20
|
+
},
|
|
21
|
+
provenanceFromTrustContext: (ctx?: { trustClass?: string }) =>
|
|
22
|
+
ctx ? { provenanceTrustClass: ctx.trustClass } : {},
|
|
23
|
+
}));
|
|
24
|
+
mock.module("../calls/call-store.js", () => ({
|
|
25
|
+
getCallSession: () => ({ toNumber: "+15550100" }),
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
import { fireCallQuestionNotifier } from "../calls/call-state.js";
|
|
29
|
+
import { registerConversationNotifiers } from "../daemon/conversation-notifiers.js";
|
|
30
|
+
|
|
31
|
+
describe("live-call question provenance", () => {
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
added.length = 0;
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("a row persisted after the turn settled carries the owner, not the stale turn actor", async () => {
|
|
37
|
+
registerConversationNotifiers("conv-n1", {
|
|
38
|
+
emit: () => {},
|
|
39
|
+
messages: [],
|
|
40
|
+
// Voice cleanup restored the owner; the per-turn field still holds the
|
|
41
|
+
// finished voice turn's contact.
|
|
42
|
+
trustContext: {
|
|
43
|
+
trustClass: "guardian",
|
|
44
|
+
sourceChannel: "vellum",
|
|
45
|
+
},
|
|
46
|
+
currentTurnTrustContext: {
|
|
47
|
+
trustClass: "trusted_contact",
|
|
48
|
+
sourceChannel: "phone",
|
|
49
|
+
requesterExternalUserId: "caller-1",
|
|
50
|
+
},
|
|
51
|
+
} as never);
|
|
52
|
+
|
|
53
|
+
fireCallQuestionNotifier("conv-n1", "sess-1", "Which slot works?");
|
|
54
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
55
|
+
|
|
56
|
+
expect(added.length).toBe(1);
|
|
57
|
+
expect(added[0]?.metadata?.provenanceTrustClass).toBe("guardian");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -79,10 +79,12 @@ mock.module("../persistence/conversation-crud.js", () => ({
|
|
|
79
79
|
setConversationOriginInterfaceIfUnset: () => {},
|
|
80
80
|
updateConversationContextWindow: () => {},
|
|
81
81
|
deleteMessageById: () => {},
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
// Mirrors the real mapping so provenance assertions observe what production
|
|
83
|
+
// would stamp, rather than a placeholder.
|
|
84
|
+
provenanceFromTrustContext: (ctx?: { trustClass?: string }) =>
|
|
85
|
+
ctx
|
|
86
|
+
? { provenanceTrustClass: ctx.trustClass }
|
|
87
|
+
: { provenanceTrustClass: "unknown" },
|
|
86
88
|
getConversationOriginInterface: () => null,
|
|
87
89
|
getConversationOriginChannel: () => null,
|
|
88
90
|
getMessages: () => [],
|
|
@@ -597,6 +599,55 @@ describe("Conversation message queue", () => {
|
|
|
597
599
|
await new Promise((r) => setTimeout(r, 10));
|
|
598
600
|
});
|
|
599
601
|
|
|
602
|
+
test("a drained slash exchange is stamped with its sender's provenance, not the slot's", async () => {
|
|
603
|
+
// Provenance gates memory extraction and untrusted-content wrapping, so
|
|
604
|
+
// the stamped class must be the actor whose message this is. The unknown-
|
|
605
|
+
// slash drain branch persists an exchange for the queued sender; if the
|
|
606
|
+
// guardian wrote the conversation slot while that message waited, the
|
|
607
|
+
// rows must still carry the sender's class.
|
|
608
|
+
const conversation = makeConversation();
|
|
609
|
+
await conversation.loadFromDb();
|
|
610
|
+
|
|
611
|
+
conversation.setTrustContext({
|
|
612
|
+
trustClass: "trusted_contact",
|
|
613
|
+
sourceChannel: "slack",
|
|
614
|
+
requesterExternalUserId: "U-contact",
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
const p1 = conversation.processMessage({
|
|
618
|
+
content: "msg-1",
|
|
619
|
+
attachments: [],
|
|
620
|
+
onEvent: () => {},
|
|
621
|
+
requestId: "req-1",
|
|
622
|
+
});
|
|
623
|
+
await waitForPendingRun(1);
|
|
624
|
+
|
|
625
|
+
conversation.enqueueMessage({
|
|
626
|
+
content: "/definitely-not-a-command",
|
|
627
|
+
requestId: "req-slash",
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
// The guardian moves the slot while the contact's message waits.
|
|
631
|
+
conversation.setTrustContext({
|
|
632
|
+
trustClass: "guardian",
|
|
633
|
+
sourceChannel: "vellum",
|
|
634
|
+
requesterExternalUserId: "guardian-principal",
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
capturedAddMessages.length = 0;
|
|
638
|
+
await resolveRun(0);
|
|
639
|
+
await p1;
|
|
640
|
+
await new Promise((r) => setTimeout(r, 20));
|
|
641
|
+
|
|
642
|
+
const exchange = capturedAddMessages.filter((m) =>
|
|
643
|
+
m.content.includes("definitely-not-a-command"),
|
|
644
|
+
);
|
|
645
|
+
expect(exchange.length).toBeGreaterThan(0);
|
|
646
|
+
for (const row of exchange) {
|
|
647
|
+
expect(row.metadata?.provenanceTrustClass).toBe("trusted_contact");
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
|
|
600
651
|
test("a drained turn keeps its sender's trust once the agent loop is running", async () => {
|
|
601
652
|
// Exercises the real drain -> runAgentLoop ordering against a live
|
|
602
653
|
// Conversation. The loop re-initializes the per-turn trust snapshot on
|
|
@@ -2937,6 +2988,9 @@ describe("Conversation host attachment directives", () => {
|
|
|
2937
2988
|
attachments: [],
|
|
2938
2989
|
onEvent: (e) => events.push(e),
|
|
2939
2990
|
requestId: "req-1",
|
|
2991
|
+
// A host attachment read prompts only when a human is present to
|
|
2992
|
+
// answer; presence is declared per turn.
|
|
2993
|
+
isInteractive: true,
|
|
2940
2994
|
});
|
|
2941
2995
|
await waitForPendingRun(1);
|
|
2942
2996
|
|
|
@@ -3007,6 +3061,9 @@ describe("Conversation host attachment directives", () => {
|
|
|
3007
3061
|
attachments: [],
|
|
3008
3062
|
onEvent: (e) => events.push(e),
|
|
3009
3063
|
requestId: "req-1",
|
|
3064
|
+
// A host attachment read prompts only when a human is present to
|
|
3065
|
+
// answer; presence is declared per turn.
|
|
3066
|
+
isInteractive: true,
|
|
3010
3067
|
});
|
|
3011
3068
|
await waitForPendingRun(1);
|
|
3012
3069
|
|
|
@@ -3872,3 +3929,96 @@ describe("subagent notification user_message_echo suppression", () => {
|
|
|
3872
3929
|
await new Promise((r) => setTimeout(r, 10));
|
|
3873
3930
|
});
|
|
3874
3931
|
});
|
|
3932
|
+
|
|
3933
|
+
describe("drained turns deliver through the conversation sink", () => {
|
|
3934
|
+
beforeEach(() => {
|
|
3935
|
+
pendingRuns = [];
|
|
3936
|
+
});
|
|
3937
|
+
|
|
3938
|
+
test("a confirmation prompt raised in a drained interactive turn reaches the sink", async () => {
|
|
3939
|
+
// The sink is fixed for the conversation's life, so an interactive turn
|
|
3940
|
+
// drained from the queue delivers exactly like a live one: no per-turn
|
|
3941
|
+
// rebinding, nothing for the previous turn's cleanup to clobber. This is
|
|
3942
|
+
// the invariant behind the acp_spawn permission-prompt timeouts (a queued
|
|
3943
|
+
// interactive turn's confirmation_request used to be emitted into a
|
|
3944
|
+
// reset no-op sender and hang until the permission timeout).
|
|
3945
|
+
const sink: AssistantEvent[] = [];
|
|
3946
|
+
const conversation = makeConversation((msg) => sink.push(msg));
|
|
3947
|
+
await conversation.loadFromDb();
|
|
3948
|
+
|
|
3949
|
+
const p1 = conversation.processMessage({
|
|
3950
|
+
content: "msg-1",
|
|
3951
|
+
attachments: [],
|
|
3952
|
+
onEvent: () => {},
|
|
3953
|
+
requestId: "req-1",
|
|
3954
|
+
});
|
|
3955
|
+
await waitForPendingRun(1);
|
|
3956
|
+
|
|
3957
|
+
conversation.enqueueMessage({
|
|
3958
|
+
content: "msg-2",
|
|
3959
|
+
requestId: "req-2",
|
|
3960
|
+
onEvent: () => {},
|
|
3961
|
+
isInteractive: true,
|
|
3962
|
+
});
|
|
3963
|
+
|
|
3964
|
+
await resolveRun(0);
|
|
3965
|
+
await p1;
|
|
3966
|
+
await waitForPendingRun(2);
|
|
3967
|
+
|
|
3968
|
+
// The drained turn is in flight and interactive: presence reads a human.
|
|
3969
|
+
expect(conversation.hasNoClient).toBe(false);
|
|
3970
|
+
|
|
3971
|
+
// A prompt raised now, mid-drained-turn, must land on the sink.
|
|
3972
|
+
void conversation.prompter.prompt(
|
|
3973
|
+
"acp_spawn",
|
|
3974
|
+
{ agent: "claude", task: "t" },
|
|
3975
|
+
"high",
|
|
3976
|
+
[],
|
|
3977
|
+
[],
|
|
3978
|
+
undefined,
|
|
3979
|
+
conversation.conversationId,
|
|
3980
|
+
"host",
|
|
3981
|
+
false,
|
|
3982
|
+
undefined,
|
|
3983
|
+
"tool-use-1",
|
|
3984
|
+
);
|
|
3985
|
+
const prompt = sink.find((e) => e.type === "confirmation_request");
|
|
3986
|
+
expect(prompt).toBeDefined();
|
|
3987
|
+
expect((prompt as { toolName: string }).toolName).toBe("acp_spawn");
|
|
3988
|
+
// Settle it so the prompt's timer does not outlive the test.
|
|
3989
|
+
conversation.prompter.denyAllPending();
|
|
3990
|
+
|
|
3991
|
+
await resolveRun(1);
|
|
3992
|
+
// Turn over: nothing is in flight, so no human is asserted present.
|
|
3993
|
+
await waitForCondition(() => conversation.hasNoClient);
|
|
3994
|
+
});
|
|
3995
|
+
|
|
3996
|
+
test("a drained non-interactive turn asserts no human present", async () => {
|
|
3997
|
+
const conversation = makeConversation();
|
|
3998
|
+
await conversation.loadFromDb();
|
|
3999
|
+
|
|
4000
|
+
const p1 = conversation.processMessage({
|
|
4001
|
+
content: "msg-1",
|
|
4002
|
+
attachments: [],
|
|
4003
|
+
onEvent: () => {},
|
|
4004
|
+
requestId: "req-1",
|
|
4005
|
+
});
|
|
4006
|
+
await waitForPendingRun(1);
|
|
4007
|
+
|
|
4008
|
+
conversation.enqueueMessage({
|
|
4009
|
+
content: "msg-2",
|
|
4010
|
+
requestId: "req-2",
|
|
4011
|
+
onEvent: () => {},
|
|
4012
|
+
isInteractive: false,
|
|
4013
|
+
});
|
|
4014
|
+
|
|
4015
|
+
await resolveRun(0);
|
|
4016
|
+
await p1;
|
|
4017
|
+
await waitForPendingRun(2);
|
|
4018
|
+
|
|
4019
|
+
expect(conversation.hasNoClient).toBe(true);
|
|
4020
|
+
|
|
4021
|
+
await resolveRun(1);
|
|
4022
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
4023
|
+
});
|
|
4024
|
+
});
|
|
@@ -149,7 +149,7 @@ function createFakeConversation(conversationId: string): Conversation {
|
|
|
149
149
|
return this.turnInterfaceContext;
|
|
150
150
|
},
|
|
151
151
|
ensureActorScopedHistory: async () => {},
|
|
152
|
-
|
|
152
|
+
replayActivityState: () => {},
|
|
153
153
|
|
|
154
154
|
setHostCuProxy(this: { hostCuProxy: unknown }, proxy: unknown) {
|
|
155
155
|
this.hostCuProxy = proxy;
|
|
@@ -158,7 +158,7 @@ function makeConversation() {
|
|
|
158
158
|
currentRequestId: undefined,
|
|
159
159
|
queue: { length: 0 },
|
|
160
160
|
setTrustContext: () => {},
|
|
161
|
-
|
|
161
|
+
replayActivityState: () => {},
|
|
162
162
|
emitConfirmationStateChanged: () => {},
|
|
163
163
|
emitActivityState: () => {},
|
|
164
164
|
setTurnChannelContext: () => {},
|
|
@@ -163,7 +163,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
163
163
|
const runAgentLoop = mock(async () => undefined);
|
|
164
164
|
const session = {
|
|
165
165
|
setTrustContext: () => {},
|
|
166
|
-
|
|
166
|
+
replayActivityState: () => {},
|
|
167
167
|
emitConfirmationStateChanged: () => {},
|
|
168
168
|
emitActivityState: () => {},
|
|
169
169
|
setTurnChannelContext: () => {},
|
|
@@ -253,7 +253,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
253
253
|
const runAgentLoop = mock(async () => undefined);
|
|
254
254
|
const session = {
|
|
255
255
|
setTrustContext: () => {},
|
|
256
|
-
|
|
256
|
+
replayActivityState: () => {},
|
|
257
257
|
emitConfirmationStateChanged: () => {},
|
|
258
258
|
emitActivityState: () => {},
|
|
259
259
|
setTurnChannelContext: () => {},
|
|
@@ -331,7 +331,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
331
331
|
const runAgentLoop = mock(async () => undefined);
|
|
332
332
|
const session = {
|
|
333
333
|
setTrustContext: () => {},
|
|
334
|
-
|
|
334
|
+
replayActivityState: () => {},
|
|
335
335
|
emitConfirmationStateChanged: () => {},
|
|
336
336
|
emitActivityState: () => {},
|
|
337
337
|
setTurnChannelContext: () => {},
|
|
@@ -419,7 +419,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
419
419
|
const runAgentLoop = mock(async () => undefined);
|
|
420
420
|
const session = {
|
|
421
421
|
setTrustContext: () => {},
|
|
422
|
-
|
|
422
|
+
replayActivityState: () => {},
|
|
423
423
|
emitConfirmationStateChanged: () => {},
|
|
424
424
|
emitActivityState: () => {},
|
|
425
425
|
setTurnChannelContext: () => {},
|
|
@@ -507,7 +507,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
507
507
|
const runAgentLoop = mock(async () => undefined);
|
|
508
508
|
const session = {
|
|
509
509
|
setTrustContext: () => {},
|
|
510
|
-
|
|
510
|
+
replayActivityState: () => {},
|
|
511
511
|
emitConfirmationStateChanged: () => {},
|
|
512
512
|
emitActivityState: () => {},
|
|
513
513
|
setTurnChannelContext: () => {},
|
|
@@ -590,7 +590,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
590
590
|
const runAgentLoop = mock(async () => undefined);
|
|
591
591
|
const session = {
|
|
592
592
|
setTrustContext: () => {},
|
|
593
|
-
|
|
593
|
+
replayActivityState: () => {},
|
|
594
594
|
emitConfirmationStateChanged: () => {},
|
|
595
595
|
emitActivityState: () => {},
|
|
596
596
|
setTurnChannelContext: () => {},
|
|
@@ -667,7 +667,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
667
667
|
const runAgentLoop = mock(async () => undefined);
|
|
668
668
|
const session = {
|
|
669
669
|
setTrustContext: () => {},
|
|
670
|
-
|
|
670
|
+
replayActivityState: () => {},
|
|
671
671
|
emitConfirmationStateChanged: () => {},
|
|
672
672
|
emitActivityState: () => {},
|
|
673
673
|
setTurnChannelContext: () => {},
|
|
@@ -746,7 +746,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
746
746
|
const runAgentLoop = mock(async () => undefined);
|
|
747
747
|
const session = {
|
|
748
748
|
setTrustContext: () => {},
|
|
749
|
-
|
|
749
|
+
replayActivityState: () => {},
|
|
750
750
|
emitConfirmationStateChanged: () => {},
|
|
751
751
|
emitActivityState: () => {},
|
|
752
752
|
setTurnChannelContext: () => {},
|
|
@@ -826,7 +826,7 @@ describe("handleSendMessage guardian reply interception", () => {
|
|
|
826
826
|
const runAgentLoop = mock(async () => undefined);
|
|
827
827
|
const session = {
|
|
828
828
|
setTrustContext: () => {},
|
|
829
|
-
|
|
829
|
+
replayActivityState: () => {},
|
|
830
830
|
emitConfirmationStateChanged: () => {},
|
|
831
831
|
emitActivityState: () => {},
|
|
832
832
|
setTurnChannelContext: () => {},
|
|
@@ -169,7 +169,7 @@ function makeConversationWithPendingConfirmation(
|
|
|
169
169
|
setTrustContext(this: { trustContext: unknown }, ctx: unknown) {
|
|
170
170
|
this.trustContext = ctx;
|
|
171
171
|
},
|
|
172
|
-
|
|
172
|
+
replayActivityState: () => {},
|
|
173
173
|
emitConfirmationStateChanged: () => {},
|
|
174
174
|
emitActivityState: () => {},
|
|
175
175
|
setTurnChannelContext: () => {},
|
|
@@ -233,7 +233,7 @@ function makeConversation() {
|
|
|
233
233
|
currentRequestId: undefined,
|
|
234
234
|
queue: { length: 0 },
|
|
235
235
|
setTrustContext: () => {},
|
|
236
|
-
|
|
236
|
+
replayActivityState: () => {},
|
|
237
237
|
emitConfirmationStateChanged: () => {},
|
|
238
238
|
emitActivityState: () => {},
|
|
239
239
|
setTurnChannelContext: () => {},
|