@vellumai/assistant 0.11.2 → 0.11.3-dev.202608080427.92f668a
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/ARCHITECTURE.md +69 -9
- package/docs/flux-turn-detection-spike.md +243 -0
- package/docs/stt-provider-onboarding.md +3 -1
- package/docs/trusted-contact-access.md +9 -5
- package/docs/vellum-doctor.md +195 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +50 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/ingress.ts +10 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +6 -0
- package/node_modules/@vellumai/ces-client/src/index.ts +1 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +19 -2
- package/node_modules/@vellumai/environments/package.json +2 -1
- package/node_modules/@vellumai/environments/src/__tests__/cloud-assistant-hub-url.test.ts +38 -0
- package/node_modules/@vellumai/environments/src/__tests__/install-layout.test.ts +98 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +5 -5
- package/node_modules/@vellumai/environments/src/index.ts +17 -6
- package/node_modules/@vellumai/environments/src/install-layout.ts +49 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +29 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +50 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/ingress.ts +10 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +6 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +4 -0
- package/node_modules/@vellumai/gateway-client/src/verification-session-contract.ts +91 -6
- package/node_modules/@vellumai/ipc-server-utils/src/endpoint.test.ts +36 -0
- package/node_modules/@vellumai/ipc-server-utils/src/endpoint.ts +142 -0
- package/node_modules/@vellumai/ipc-server-utils/src/index.ts +2 -0
- package/node_modules/@vellumai/ipc-server-utils/src/listen-options.ts +3 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.test.ts +15 -1
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.ts +17 -2
- package/node_modules/@vellumai/service-contracts/src/channels.ts +50 -0
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +10 -0
- package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +6 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +16 -2
- package/openapi.yaml +619 -47
- package/package.json +1 -1
- package/scripts/voice-ttft-spike.ts +3 -3
- package/src/__tests__/agent-image-optimize.test.ts +4 -4
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +113 -66
- package/src/__tests__/agent-loop-override-profile.test.ts +38 -48
- package/src/__tests__/agent-loop-subagent-billing-headers.test.ts +166 -0
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +1 -0
- package/src/__tests__/agent-wake-override-profile.test.ts +1 -0
- package/src/__tests__/answered-question-persistence.test.ts +240 -0
- package/src/__tests__/anthropic-provider.test.ts +165 -30
- package/src/__tests__/app-control-flow.test.ts +9 -8
- package/src/__tests__/assistant-event-hub.test.ts +48 -0
- package/src/__tests__/attachments-store-heic-normalize.test.ts +16 -12
- package/src/__tests__/attachments-store.test.ts +130 -68
- package/src/__tests__/attachments.test.ts +36 -36
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
- package/src/__tests__/call-controller.test.ts +120 -0
- package/src/__tests__/call-start-guardian-guard.test.ts +18 -4
- package/src/__tests__/canned-reply-release.test.ts +86 -0
- package/src/__tests__/channel-availability-routes.test.ts +14 -1
- package/src/__tests__/channel-guardian.test.ts +59 -29
- package/src/__tests__/channel-readiness-telegram-remote.test.ts +154 -0
- package/src/__tests__/channel-setup-panel-ack.test.ts +6 -5
- package/src/__tests__/client-os-metadata-persistence.test.ts +103 -4
- package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
- package/src/__tests__/config-loader-backfill.test.ts +19 -0
- package/src/__tests__/config-schema.test.ts +150 -7
- package/src/__tests__/consult-deadline.test.ts +65 -0
- package/src/__tests__/conversation-agent-loop.test.ts +438 -2
- package/src/__tests__/conversation-disk-view-integration.test.ts +5 -1
- package/src/__tests__/conversation-disk-view.test.ts +4 -4
- package/src/__tests__/conversation-error.test.ts +22 -3
- package/src/__tests__/conversation-fork-crud.test.ts +5 -1
- package/src/__tests__/conversation-fork-referential.test.ts +352 -0
- package/src/__tests__/conversation-fork-retrospective.test.ts +5 -1
- package/src/__tests__/conversation-group-tools.test.ts +32 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +27 -1
- package/src/__tests__/conversation-initial-prompt.test.ts +51 -22
- package/src/__tests__/conversation-key-store-bootstrap-cleanup.test.ts +119 -0
- package/src/__tests__/conversation-key-store-origin.test.ts +105 -0
- package/src/__tests__/conversation-list-recency-ordering.test.ts +104 -0
- package/src/__tests__/conversation-origin-at-creation.test.ts +153 -0
- package/src/__tests__/conversation-origin-channel-filter.test.ts +95 -0
- package/src/__tests__/conversation-placement-promotion.test.ts +172 -0
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +123 -0
- package/src/__tests__/conversation-queue.test.ts +433 -1
- package/src/__tests__/conversation-retry-route.test.ts +3 -1
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +64 -1
- package/src/__tests__/conversation-store-ephemeral.test.ts +4 -0
- package/src/__tests__/conversation-store.test.ts +26 -10
- package/src/__tests__/conversation-summarize-route.test.ts +1 -1
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +15 -6
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -5
- package/src/__tests__/conversation-surfaces-app-control.test.ts +12 -11
- package/src/__tests__/conversation-surfaces-app-open.test.ts +11 -5
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +5 -4
- package/src/__tests__/conversation-surfaces-history-restored-completion.test.ts +967 -0
- package/src/__tests__/conversation-surfaces-persisted-info.test.ts +312 -0
- package/src/__tests__/conversation-surfaces-queued-emit.test.ts +6 -5
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -8
- package/src/__tests__/conversation-surfaces-standalone.test.ts +21 -11
- package/src/__tests__/conversation-surfaces-state-update.test.ts +7 -11
- package/src/__tests__/conversation-surfaces-table-action.test.ts +7 -6
- package/src/__tests__/conversation-surfaces-task-progress.test.ts +11 -6
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +9 -6
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +70 -7
- package/src/__tests__/conversation-wait-for-idle.test.ts +6 -11
- package/src/__tests__/credential-prompt-route.test.ts +54 -7
- package/src/__tests__/credential-security-invariants.test.ts +1 -0
- package/src/__tests__/cu-unified-flow.test.ts +89 -28
- package/src/__tests__/custom-group-listing-visibility.test.ts +1 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +4 -1
- package/src/__tests__/discord-access-request-privacy.test.ts +366 -0
- package/src/__tests__/discord-requester-notice-privacy.test.ts +87 -0
- package/src/__tests__/disk-pressure-guard.test.ts +55 -55
- package/src/__tests__/disk-pressure-routes.test.ts +10 -10
- package/src/__tests__/disk-pressure-tools.test.ts +2 -2
- package/src/__tests__/disk-usage.test.ts +35 -20
- package/src/__tests__/document-sync-tags.test.ts +379 -0
- package/src/__tests__/document-update-default-surface.test.ts +28 -0
- package/src/__tests__/dynamic-skill-background-guard.test.ts +2 -2
- package/src/__tests__/emit-signal-routing-intent.test.ts +3 -4
- package/src/__tests__/ensure-conversation-exists.test.ts +8 -5
- package/src/__tests__/events-dev-bypass-actor.test.ts +294 -1
- package/src/__tests__/evict-conversations-for-reload.test.ts +90 -0
- package/src/__tests__/file-list-tool.test.ts +12 -10
- package/src/__tests__/file-ops-service.test.ts +151 -44
- package/src/__tests__/file-read-container-boundary.test.ts +137 -0
- package/src/__tests__/file-read-tool.test.ts +21 -9
- package/src/__tests__/file-url-path-guard.test.ts +83 -0
- package/src/__tests__/filesystem-tools.test.ts +82 -66
- package/src/__tests__/guardian-outbound-http.test.ts +8 -8
- package/src/__tests__/helpers/gateway-verification-sessions-stub.ts +14 -1
- package/src/__tests__/helpers/hub-clients.ts +42 -0
- package/src/__tests__/helpers/mock-conversation.ts +46 -0
- package/src/__tests__/helpers/verification-sessions-ipc-sim.ts +61 -57
- package/src/__tests__/history-repair.test.ts +112 -12
- package/src/__tests__/host-bash-proxy.test.ts +10 -5
- package/src/__tests__/host-bash-routes.test.ts +67 -0
- package/src/__tests__/host-browser-proxy.test.ts +2 -2
- package/src/__tests__/host-cu-proxy.test.ts +3 -7
- package/src/__tests__/host-file-proxy.test.ts +3 -7
- package/src/__tests__/host-file-read-tool.test.ts +5 -1
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +6 -4
- package/src/__tests__/http-conversation-lineage.test.ts +2 -5
- package/src/__tests__/http-user-message-parity.test.ts +44 -0
- package/src/__tests__/identity-routes.test.ts +13 -13
- package/src/__tests__/image-conversion.test.ts +29 -26
- package/src/__tests__/image-source-path-reinject.test.ts +2 -2
- package/src/__tests__/inference-profile-session-handler.test.ts +95 -0
- package/src/__tests__/inference-profile-session-ipc.test.ts +25 -0
- package/src/__tests__/introduction-card-resolver.test.ts +6 -1
- package/src/__tests__/list-messages-attachments.test.ts +56 -32
- package/src/__tests__/list-messages-background-tool-completion.test.ts +4 -4
- package/src/__tests__/list-messages-client-message-id.test.ts +2 -2
- package/src/__tests__/list-messages-hidden-metadata.test.ts +16 -16
- package/src/__tests__/list-messages-page-latest.test.ts +61 -61
- package/src/__tests__/list-messages-provider-error.test.ts +6 -6
- package/src/__tests__/list-messages-queued.test.ts +49 -6
- package/src/__tests__/list-messages-system-card.test.ts +4 -4
- package/src/__tests__/list-messages-tool-merge.test.ts +9 -9
- package/src/__tests__/llm-resolver-override-or-default.test.ts +141 -0
- package/src/__tests__/llm-usage-store.test.ts +55 -0
- package/src/__tests__/manual-token-reconciliation.test.ts +45 -0
- package/src/__tests__/mcp-list-plugin-servers.test.ts +250 -0
- package/src/__tests__/mcp-tool-annotations-risk.test.ts +133 -0
- package/src/__tests__/media-stream-output.test.ts +175 -0
- package/src/__tests__/media-stream-server-integration.test.ts +36 -0
- package/src/__tests__/media-stream-stt-session.test.ts +67 -0
- package/src/__tests__/migration-export-http.test.ts +1 -1
- package/src/__tests__/migration-import-commit-http.test.ts +1 -1
- package/src/__tests__/migration-import-preflight-http.test.ts +1 -1
- package/src/__tests__/migration-validate-http.test.ts +1 -1
- package/src/__tests__/mtime-cache.test.ts +65 -3
- package/src/__tests__/notification-platform-adapter.test.ts +104 -0
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
- package/src/__tests__/oauth-provider-profiles.test.ts +4 -2
- package/src/__tests__/oauth-provider-seed-logos.test.ts +65 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +17 -0
- package/src/__tests__/oauth-providers-routes.test.ts +1 -0
- package/src/__tests__/openai-responses-prompt-cache.test.ts +5 -2
- package/src/__tests__/path-policy.test.ts +164 -1
- package/src/__tests__/persist-media-references.test.ts +2 -2
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +5 -5
- package/src/__tests__/persist-unsendable-image.test.ts +23 -23
- package/src/__tests__/persona-resolver.test.ts +154 -0
- package/src/__tests__/plugin-api-webhook-url.test.ts +170 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +6 -0
- package/src/__tests__/processing-flag-persist-failure.test.ts +15 -10
- package/src/__tests__/profile-availability-incomplete.test.ts +113 -0
- package/src/__tests__/profiler-routes.test.ts +13 -13
- package/src/__tests__/prompt-cache-cross-turn-stability.test.ts +593 -0
- package/src/__tests__/proxy-approval-callback.test.ts +3 -3
- package/src/__tests__/queued-message-cancel-and-steer.test.ts +189 -0
- package/src/__tests__/queued-message-steer-actor-scoping.test.ts +164 -0
- package/src/__tests__/resolve-trust-class.test.ts +20 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +1 -1
- package/src/__tests__/run-due-schedules.test.ts +174 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +15 -7
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +166 -0
- package/src/__tests__/schedule-routes.test.ts +730 -8
- package/src/__tests__/schedule-store.test.ts +540 -0
- package/src/__tests__/schedule-tools.test.ts +103 -0
- package/src/__tests__/scheduler-wake.test.ts +5 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +29 -1
- package/src/__tests__/secure-keys.test.ts +91 -0
- package/src/__tests__/server-history-render.test.ts +97 -7
- package/src/__tests__/size-guard.test.ts +8 -8
- package/src/__tests__/skill-docs-sync-guard.test.ts +3 -2
- package/src/__tests__/skill-tool-factory.test.ts +247 -0
- package/src/__tests__/skills-install-staging.test.ts +15 -6
- package/src/__tests__/skills.test.ts +32 -0
- package/src/__tests__/slack-edit-ordering-characterization.test.ts +103 -0
- package/src/__tests__/slack-inbound-verification.test.ts +4 -1
- package/src/__tests__/slack-mention-binding-invariance.test.ts +103 -0
- package/src/__tests__/slack-mention-provider-leak-audit.test.ts +135 -0
- package/src/__tests__/starter-task-flow.test.ts +5 -4
- package/src/__tests__/steer-on-enqueue-question.test.ts +3 -2
- package/src/__tests__/stt-language-catalog-parity.test.ts +38 -0
- package/src/__tests__/subagent-allowlist-validation.test.ts +26 -4
- package/src/__tests__/subagent-cron-run-attribution.test.ts +301 -0
- package/src/__tests__/subagent-disposal.test.ts +10 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +10 -0
- package/src/__tests__/subagent-fork-prompt-role.test.ts +85 -11
- package/src/__tests__/subagent-fork-spawn.test.ts +15 -7
- package/src/__tests__/subagent-manager-notify.test.ts +148 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -1
- package/src/__tests__/subagent-persistence.test.ts +141 -0
- package/src/__tests__/subagent-role-registry.test.ts +172 -63
- package/src/__tests__/subagent-role-resolution.test.ts +88 -0
- package/src/__tests__/subagent-spawn-and-await.test.ts +48 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +111 -10
- package/src/__tests__/subagent-terminal-message.test.ts +88 -1
- package/src/__tests__/subagent-tool-gate-mode.test.ts +225 -10
- package/src/__tests__/subagent-tools.test.ts +1901 -108
- package/src/__tests__/surface-completion-compaction-boundary.test.ts +124 -0
- package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +298 -0
- package/src/__tests__/system-prompt.test.ts +82 -7
- package/src/__tests__/tool-grant-request-escalation.test.ts +40 -1
- package/src/__tests__/tool-result-spool.test.ts +74 -18
- package/src/__tests__/tool-side-effects-documents.test.ts +174 -0
- package/src/__tests__/tool-side-effects-hook-failures.test.ts +129 -0
- package/src/__tests__/tools-audio-read.test.ts +10 -10
- package/src/__tests__/tools-get-route.test.ts +85 -12
- package/src/__tests__/tools-list-cli.test.ts +171 -0
- package/src/__tests__/top-level-renderer.test.ts +54 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +68 -1
- package/src/__tests__/trusted-contact-multichannel.test.ts +4 -1
- package/src/__tests__/turn-tail-chain.test.ts +135 -0
- package/src/__tests__/ui-choice-copy-surfaces.test.ts +6 -4
- package/src/__tests__/ui-visual-surface.test.ts +5 -4
- package/src/__tests__/ui-work-result-surface.test.ts +5 -4
- package/src/__tests__/unified-turn-context-visible-app.test.ts +7 -8
- package/src/__tests__/usage-routes.test.ts +62 -0
- package/src/__tests__/verification-outbound-delivery.test.ts +176 -0
- package/src/__tests__/visible-app-context.test.ts +20 -4
- package/src/__tests__/web-search-history.test.ts +96 -0
- package/src/__tests__/workspace-migration-139-clear-renamed-cost-profile-label.test.ts +6 -6
- package/src/__tests__/workspace-migration-140-repair-seed-pinned-memory-v3-live.test.ts +330 -0
- package/src/__tests__/workspace-migration-142-consolidate-voice-front-door.test.ts +150 -0
- package/src/acp/failure-error.ts +3 -5
- package/src/agent/attachments.ts +26 -24
- package/src/agent/history-repair/history-repair.ts +27 -26
- package/src/agent/image-optimize.ts +6 -6
- package/src/agent/loop.ts +40 -22
- package/src/agent/message-types.ts +3 -3
- package/src/api/constants/document-tools.ts +55 -0
- package/src/api/events/question-answered.ts +53 -0
- package/src/api/events/tool-result.ts +7 -0
- package/src/api/index.ts +13 -0
- package/src/api/responses/conversation-message.ts +11 -0
- package/src/api/surfaces-oauth-connect.test.ts +96 -0
- package/src/api/surfaces.ts +36 -8
- package/src/approvals/guardian-channel-delivery.ts +83 -0
- package/src/approvals/guardian-expiry-notifier.ts +13 -11
- package/src/approvals/guardian-request-resolvers.ts +222 -135
- package/src/calls/__tests__/tts-text-sanitizer.test.ts +13 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +131 -12
- package/src/calls/__tests__/voice-triage-escalate.test.ts +106 -0
- package/src/calls/call-controller.ts +30 -2
- package/src/calls/call-speech-output.ts +12 -4
- package/src/calls/call-transport.ts +18 -1
- package/src/calls/media-stream-output.ts +53 -5
- package/src/calls/media-stream-server.ts +21 -1
- package/src/calls/media-stream-stt-session.ts +49 -0
- package/src/calls/telephony-synthesis-language.ts +84 -0
- package/src/calls/tts-text-sanitizer.ts +12 -5
- package/src/calls/voice-session-bridge.ts +86 -17
- package/src/calls/voice-triage-escalate.ts +54 -7
- package/src/channels/__tests__/gateway-verification-sessions.test.ts +3 -3
- package/src/channels/__tests__/plugin-channel-declarations.test.ts +161 -0
- package/src/channels/config.ts +20 -2
- package/src/channels/gateway-verification-sessions.ts +7 -2
- package/src/channels/plugin-channel-declarations.ts +108 -0
- package/src/channels/types.ts +37 -1
- package/src/cli/AGENTS.md +5 -2
- package/src/cli/commands/__tests__/cache.test.ts +7 -4
- package/src/cli/commands/__tests__/cli-test-harness.ts +82 -0
- package/src/cli/commands/__tests__/conversations-wake.test.ts +51 -6
- package/src/cli/commands/__tests__/inference-models.test.ts +14 -0
- package/src/cli/commands/__tests__/inference-profiles.test.ts +44 -1
- package/src/cli/commands/__tests__/inference-providers.test.ts +7 -0
- package/src/cli/commands/__tests__/plugins.test.ts +692 -0
- package/src/cli/commands/__tests__/schedules.test.ts +136 -37
- package/src/cli/commands/conversations.ts +7 -3
- package/src/cli/commands/credentials.help.ts +7 -0
- package/src/cli/commands/inference-profiles.ts +9 -3
- package/src/cli/commands/inference.help.ts +16 -2
- package/src/cli/commands/mcp.help.ts +17 -6
- package/src/cli/commands/mcp.ts +9 -0
- package/src/cli/commands/memory/memory-retrospective.ts +18 -0
- package/src/cli/commands/notifications.ts +3 -6
- package/src/cli/commands/oauth/connect-surface-guidance.test.ts +16 -0
- package/src/cli/commands/oauth/connect-surface-guidance.ts +25 -7
- package/src/cli/commands/oauth/connect.test.ts +26 -1
- package/src/cli/commands/oauth/connect.ts +4 -1
- package/src/cli/commands/oauth/index.help.ts +3 -1
- package/src/cli/commands/oauth/providers.ts +3 -0
- package/src/cli/commands/plugins.help.ts +25 -2
- package/src/cli/commands/plugins.ts +289 -10
- package/src/cli/commands/schedules.help.ts +14 -12
- package/src/cli/commands/schedules.ts +19 -5
- package/src/cli/commands/stt.help.ts +27 -2
- package/src/cli/commands/tools.help.ts +4 -2
- package/src/cli/commands/tools.ts +38 -0
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +1 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +79 -0
- package/src/cli/lib/__tests__/install-from-platform.test.ts +47 -1
- package/src/cli/lib/__tests__/plugin-surfaces.test.ts +86 -7
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +161 -0
- package/src/cli/lib/install-from-github.ts +61 -0
- package/src/cli/lib/install-from-platform.ts +13 -2
- package/src/cli/lib/plugin-surfaces.ts +124 -4
- package/src/cli/lib/upgrade-plugin.ts +60 -0
- package/src/cli.ts +1 -1
- package/src/config/__tests__/default-profile-catalog.test.ts +11 -1
- package/src/config/__tests__/deployment-context-defaults.test.ts +73 -0
- package/src/config/__tests__/memory-retrospective-schema.test.ts +40 -0
- package/src/config/__tests__/plugin-updates-schema.test.ts +43 -0
- package/src/config/__tests__/profile-tool-support.test.ts +131 -0
- package/src/config/bundled-skills/AGENTS.md +1 -1
- package/src/config/bundled-skills/acp/SKILL.md +6 -7
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -1
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +3 -3
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +14 -4
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +15 -15
- package/src/config/bundled-skills/schedule/SKILL.md +5 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +1 -0
- package/src/config/bundled-skills/subagent/SKILL.md +53 -22
- package/src/config/bundled-skills/subagent/TOOLS.json +14 -13
- 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/bundled-skills/visualize/SKILL.md +1 -1
- package/src/config/call-site-defaults.ts +4 -5
- package/src/config/default-profile-catalog.ts +9 -5
- package/src/config/feature-flag-registry.json +25 -17
- package/src/config/llm-resolver.ts +45 -15
- package/src/config/loader.ts +75 -1
- package/src/config/profile-tool-support.ts +110 -0
- package/src/config/sanitize-for-transfer.ts +11 -0
- package/src/config/schema.ts +4 -0
- package/src/config/schemas/__tests__/live-voice.test.ts +142 -4
- package/src/config/schemas/__tests__/stt.test.ts +20 -5
- package/src/config/schemas/call-site-catalog.ts +4 -4
- package/src/config/schemas/calls.ts +0 -4
- package/src/config/schemas/channels.ts +13 -0
- package/src/config/schemas/live-voice.ts +82 -23
- package/src/config/schemas/llm.ts +1 -1
- package/src/config/schemas/memory-retrospective.ts +25 -0
- package/src/config/schemas/plugin-updates.ts +59 -0
- package/src/config/schemas/services.ts +8 -4
- package/src/config/schemas/stt.ts +18 -5
- package/src/config/schemas/timeouts.ts +1 -1
- package/src/config/schemas/tts.ts +63 -0
- package/src/contacts/__tests__/guardian-delivery-reader.test.ts +16 -0
- package/src/contacts/guardian-delivery-reader.ts +29 -2
- package/src/context/compactor.ts +4 -4
- package/src/context/post-turn-tool-result-truncation.ts +32 -16
- package/src/context/strip-injections.ts +42 -0
- package/src/context/tool-result-spool.ts +32 -18
- package/src/credential-execution/ces-runtime.ts +3 -0
- package/src/credential-execution/client.ts +22 -1
- package/src/credential-execution/process-manager.test.ts +99 -0
- package/src/credential-execution/process-manager.ts +62 -16
- package/src/daemon/__tests__/abort-null-controller.test.ts +141 -5
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +8 -12
- package/src/daemon/__tests__/install-assistant-command.test.ts +234 -0
- package/src/daemon/__tests__/turn-tail-assistant-reply-notify.test.ts +2 -4
- package/src/daemon/__tests__/turn-tail-deleted-conversation.test.ts +20 -29
- package/src/daemon/channel-ui-capability.ts +4 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +117 -61
- package/src/daemon/conversation-agent-loop.ts +318 -148
- package/src/daemon/conversation-attachments.ts +1 -1
- package/src/daemon/conversation-error.ts +8 -1
- package/src/daemon/conversation-initial-prompt.ts +16 -38
- package/src/daemon/conversation-lifecycle.ts +154 -32
- package/src/daemon/conversation-messaging.ts +106 -43
- package/src/daemon/conversation-process.ts +131 -33
- package/src/daemon/conversation-queue-manager.ts +10 -0
- package/src/daemon/conversation-runtime-assembly.ts +9 -4
- package/src/daemon/conversation-store.ts +52 -3
- package/src/daemon/conversation-surface-state.ts +9 -0
- package/src/daemon/conversation-surfaces.ts +403 -210
- package/src/daemon/conversation-tool-setup.ts +56 -7
- package/src/daemon/conversation-turn-finalize.ts +134 -89
- package/src/daemon/conversation.ts +111 -27
- package/src/daemon/disk-pressure-guard-lifecycle.ts +2 -2
- package/src/daemon/disk-pressure-guard.ts +3 -3
- package/src/daemon/doordash-steps.ts +5 -5
- package/src/daemon/external-plugins-bootstrap.ts +7 -1
- package/src/daemon/handlers/config-channels.ts +48 -5
- package/src/daemon/handlers/conversation-history.ts +1 -1
- package/src/daemon/handlers/conversations.ts +62 -17
- package/src/daemon/handlers/shared.ts +12 -0
- package/src/daemon/handlers/skills.ts +11 -1
- package/src/daemon/identity-helpers.ts +38 -10
- package/src/daemon/install-assistant-command.ts +322 -0
- package/src/daemon/lifecycle.ts +14 -3
- package/src/daemon/message-types/conversations.ts +6 -7
- package/src/daemon/message-types/sync.ts +1 -0
- package/src/daemon/persist-media-references.ts +23 -14
- package/src/daemon/process-message.ts +6 -6
- package/src/daemon/tool-setup-types.ts +19 -122
- package/src/daemon/tool-side-effects.ts +17 -94
- package/src/daemon/trust-context-types.ts +39 -0
- package/src/daemon/trust-context.ts +14 -6
- package/src/daemon/turn-tail-chain.ts +73 -0
- package/src/daemon/web-search-history.ts +47 -33
- package/src/heartbeat/heartbeat-service.ts +6 -6
- package/src/inbound/__tests__/oauth-callback-url.test.ts +83 -0
- package/src/inbound/oauth-callback-url.ts +61 -0
- package/src/ipc/__tests__/socket-path.test.ts +21 -0
- package/src/ipc/assistant-server.ts +17 -10
- package/src/ipc/cli-client.ts +10 -1
- package/src/ipc/routes/__tests__/documents-sync-ipc-routes.test.ts +56 -0
- package/src/ipc/routes/documents-sync-ipc-routes.ts +42 -0
- package/src/ipc/socket-cleanup.ts +9 -7
- package/src/ipc/socket-path.ts +4 -96
- package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +1 -104
- package/src/live-voice/__tests__/live-voice-archive.test.ts +16 -16
- package/src/live-voice/__tests__/live-voice-attach-image.test.ts +209 -0
- package/src/live-voice/__tests__/live-voice-connection.test.ts +20 -0
- package/src/live-voice/__tests__/live-voice-events.test.ts +7 -8
- package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +932 -0
- package/src/live-voice/__tests__/live-voice-integration.test.ts +12 -5
- 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 +179 -146
- package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +265 -0
- package/src/live-voice/__tests__/live-voice-stt.test.ts +324 -2
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +131 -2
- package/src/live-voice/__tests__/live-voice-tts-session.test.ts +0 -483
- package/src/live-voice/__tests__/live-voice-tts.test.ts +148 -2
- package/src/live-voice/__tests__/live-voice-vad.test.ts +313 -32
- package/src/live-voice/__tests__/progress-narration.test.ts +214 -0
- package/src/live-voice/__tests__/progress-phrases.test.ts +167 -0
- package/src/live-voice/__tests__/protocol.test.ts +52 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +3 -0
- package/src/live-voice/live-voice-archive.ts +13 -13
- package/src/live-voice/live-voice-connection.ts +7 -1
- package/src/live-voice/live-voice-metrics.ts +57 -32
- package/src/live-voice/live-voice-photo.ts +168 -0
- package/src/live-voice/live-voice-session.ts +1137 -351
- package/src/live-voice/live-voice-tts.ts +18 -2
- package/src/live-voice/progress-narration.ts +277 -0
- package/src/live-voice/progress-phrases.ts +105 -2
- package/src/live-voice/protocol.ts +110 -2
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +196 -0
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +9 -9
- package/src/mcp/client.ts +14 -7
- package/src/mcp/mcp-auth-orchestrator.ts +13 -22
- package/src/mcp/mcp-oauth-provider.ts +195 -240
- package/src/messaging/providers/__tests__/callback-routing.test.ts +5 -1
- package/src/messaging/providers/__tests__/transport-dispatch.test.ts +66 -4
- package/src/messaging/providers/callback-routing.ts +1 -0
- package/src/messaging/providers/discord/api.ts +312 -0
- package/src/messaging/providers/discord/dm-delivery.test.ts +204 -0
- package/src/messaging/providers/discord/render.test.ts +204 -0
- package/src/messaging/providers/discord/render.ts +195 -0
- package/src/messaging/providers/discord/send.test.ts +179 -0
- package/src/messaging/providers/discord/send.ts +212 -0
- package/src/messaging/providers/discord/transport.ts +81 -0
- package/src/messaging/providers/index.ts +3 -1
- package/src/messaging/providers/retry-policy.test.ts +247 -0
- package/src/messaging/providers/retry-policy.ts +206 -0
- package/src/messaging/providers/slack/mention-source.test.ts +285 -0
- package/src/messaging/providers/slack/mention-source.ts +287 -0
- package/src/messaging/providers/telegram-bot/api.ts +47 -130
- package/src/messaging/providers/whatsapp/api.ts +47 -136
- package/src/monitoring/__tests__/db-integrity-sample.test.ts +4 -1
- package/src/monitoring/__tests__/plugin-auto-update.test.ts +495 -0
- package/src/monitoring/db-integrity-sample.ts +6 -1
- package/src/monitoring/plugin-auto-update.ts +463 -0
- package/src/monitoring/resource-sampler.ts +21 -5
- package/src/monitoring/worker.ts +13 -0
- package/src/notifications/__tests__/assistant-reply-producer.test.ts +375 -2
- package/src/notifications/__tests__/broadcaster.test.ts +37 -1
- package/src/notifications/__tests__/copy-composer.test.ts +165 -0
- package/src/notifications/__tests__/emit-signal-pipeline-failure.test.ts +205 -0
- package/src/notifications/__tests__/notification-utils.test.ts +249 -0
- package/src/notifications/adapters/platform.ts +31 -2
- package/src/notifications/assistant-reply-producer.ts +79 -32
- package/src/notifications/broadcaster.ts +30 -10
- package/src/notifications/copy-composer.ts +69 -0
- package/src/notifications/emit-signal.ts +82 -15
- package/src/notifications/events-store.ts +10 -2
- package/src/notifications/home-feed-side-effect.ts +6 -3
- package/src/notifications/notification-utils.ts +173 -5
- package/src/notifications/signal.ts +13 -0
- package/src/oauth/AGENTS.md +4 -2
- package/src/oauth/byo-connection.ts +6 -1
- package/src/oauth/credential-token-resolver.ts +3 -10
- package/src/oauth/manual-token-connection.ts +29 -64
- package/src/oauth/manual-token-providers.ts +62 -0
- package/src/oauth/provider-serializer.ts +13 -0
- package/src/oauth/seed-providers.ts +62 -11
- package/src/onboarding/onboarding-events-store.ts +91 -1
- package/src/permissions/question-prompter.test.ts +4 -0
- package/src/permissions/question-prompter.ts +21 -4
- package/src/persistence/__tests__/conversation-lineage.test.ts +248 -0
- package/src/persistence/attachments-store.ts +15 -15
- package/src/persistence/conversation-attention-store.ts +30 -10
- package/src/persistence/conversation-bootstrap.ts +17 -0
- package/src/persistence/conversation-crud.ts +363 -97
- package/src/persistence/conversation-group-migration.ts +1 -1
- package/src/persistence/conversation-key-store.ts +38 -10
- package/src/persistence/conversation-lineage.ts +226 -0
- package/src/persistence/conversation-plugin-facade.ts +28 -3
- package/src/persistence/conversation-queries.ts +207 -33
- package/src/persistence/conversation-types.ts +107 -1
- package/src/persistence/jobs-store.ts +32 -8
- package/src/persistence/llm-usage-store.ts +22 -0
- package/src/persistence/migrations/361-normalize-managed-connection-rows.test.ts +168 -0
- package/src/persistence/migrations/361-normalize-managed-connection-rows.ts +76 -0
- package/src/persistence/migrations/362-add-conversation-subagent-kind.test.ts +187 -0
- package/src/persistence/migrations/362-add-conversation-subagent-kind.ts +93 -0
- package/src/persistence/migrations/363-backfill-schedule-inference-profile.test.ts +229 -0
- package/src/persistence/migrations/363-backfill-schedule-inference-profile.ts +127 -0
- package/src/persistence/migrations/364-add-schedule-source-key.test.ts +120 -0
- package/src/persistence/migrations/364-add-schedule-source-key.ts +43 -0
- package/src/persistence/migrations/365-add-conversation-fork-strategy.ts +27 -0
- package/src/persistence/schema/conversations.ts +32 -0
- package/src/persistence/schema/infrastructure.ts +3 -0
- package/src/persistence/steps.ts +30 -0
- package/src/persistence/subagent-store.ts +148 -6
- package/src/platform/managed-speech.test.ts +20 -0
- package/src/platform/managed-speech.ts +9 -0
- package/src/plugin-api/__tests__/oauth-callback-url-export.test.ts +29 -0
- package/src/plugin-api/index.ts +28 -5
- package/src/plugin-api/webhook-url.ts +151 -0
- package/src/plugins/__tests__/installed-plugin-dirs.test.ts +82 -0
- package/src/plugins/__tests__/mcp-servers.test.ts +370 -0
- package/src/plugins/__tests__/source-fingerprint.test.ts +5 -1
- package/src/plugins/collect-source-versions.ts +4 -27
- package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +5 -5
- package/src/plugins/defaults/exploration-drift/package.json +1 -1
- package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +4 -2
- package/src/plugins/defaults/image-recovery/recover.ts +67 -57
- package/src/plugins/defaults/index.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +64 -18
- package/src/plugins/defaults/memory/__tests__/jobs-worker-outcome-contract.test.ts +242 -0
- package/src/plugins/defaults/memory/__tests__/jobs-worker-retrospective-sweep.test.ts +24 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +48 -3
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +511 -19
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +39 -3
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +493 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-wake-chain.test.ts +5 -4
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +5 -1
- package/src/plugins/defaults/memory/job-handlers.ts +87 -5
- package/src/plugins/defaults/memory/jobs-worker.ts +60 -6
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +11 -0
- package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +29 -0
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +342 -60
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +23 -3
- package/src/plugins/defaults/memory/substrate/consolidation-lock.ts +9 -4
- package/src/plugins/defaults/memory/substrate/skill-content.ts +8 -1
- package/src/plugins/defaults/memory/substrate/sweep-job.ts +7 -0
- package/src/plugins/defaults/memory/v1/graph/injection.ts +1 -1
- package/src/plugins/defaults/memory/v2/router.ts +8 -0
- package/src/plugins/defaults/turn-context/unified-turn-context.ts +1 -2
- package/src/plugins/external-plugin-loader.ts +64 -8
- package/src/plugins/installed-plugin-dirs.ts +101 -0
- package/src/plugins/mcp-servers.ts +343 -0
- package/src/plugins/mtime-cache.ts +34 -22
- package/src/plugins/types.ts +69 -8
- package/src/prompts/persona-resolver.ts +6 -2
- package/src/prompts/system-prompt.ts +72 -17
- package/src/providers/__tests__/inference.test.ts +40 -0
- package/src/providers/__tests__/preflight-resolved-config.test.ts +58 -1
- package/src/providers/__tests__/retry-callsite.test.ts +72 -2
- package/src/providers/__tests__/vellum-connection-routing.test.ts +42 -11
- package/src/providers/anthropic/client.ts +112 -95
- package/src/providers/connection-resolution.ts +35 -1
- package/src/providers/gemini/client.ts +5 -5
- package/src/providers/inference/adapter-factory.ts +16 -10
- package/src/providers/inference/auth.ts +16 -0
- package/src/providers/inference/connection-availability.ts +164 -12
- package/src/providers/inference/connections.ts +25 -1
- package/src/providers/media-resolve.ts +21 -11
- package/src/providers/model-catalog.ts +15 -0
- package/src/providers/openai/chat-completions-provider.ts +4 -4
- package/src/providers/openai/responses-provider.ts +12 -25
- package/src/providers/registry.ts +9 -4
- package/src/providers/retry.ts +25 -0
- package/src/providers/server-tool-pairing.ts +134 -0
- 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 +620 -0
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +34 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +472 -12
- package/src/providers/speech-to-text/deepgram-flux-frames.ts +395 -0
- package/src/providers/speech-to-text/deepgram-flux-realtime.ts +719 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +283 -1
- package/src/providers/speech-to-text/deepgram-realtime.ts +117 -3
- package/src/providers/speech-to-text/deepgram.ts +1 -0
- package/src/providers/speech-to-text/provider-catalog.ts +137 -8
- package/src/providers/speech-to-text/resolve.ts +105 -12
- package/src/providers/speech-to-text/vellum-managed.ts +7 -1
- package/src/providers/speech-to-text/vellum-speech-relay-connection.ts +3 -1
- package/src/providers/types.ts +26 -6
- package/src/providers/vellum-model-routing.ts +6 -7
- package/src/runtime/AGENTS.md +2 -0
- package/src/runtime/__tests__/agent-wake.test.ts +16 -16
- package/src/runtime/__tests__/background-job-runner.test.ts +0 -144
- package/src/runtime/__tests__/desktop-presence.test.ts +162 -0
- package/src/runtime/__tests__/local-actor-identity-force-refresh.test.ts +104 -0
- package/src/runtime/agent-wake.ts +63 -24
- package/src/runtime/assistant-event-hub.ts +110 -12
- package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -0
- package/src/runtime/auth/__tests__/scopes.test.ts +20 -0
- package/src/runtime/auth/same-actor.ts +56 -8
- package/src/runtime/auth/scopes.ts +12 -0
- package/src/runtime/auth/types.ts +2 -0
- package/src/runtime/background-job-runner.ts +5 -27
- package/src/runtime/channel-readiness-service.ts +59 -3
- package/src/runtime/channel-readiness-types.ts +18 -0
- package/src/runtime/desktop-presence.ts +69 -0
- package/src/runtime/http-server.ts +12 -0
- package/src/runtime/local-actor-identity.ts +29 -14
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/client-routes.test.ts +186 -14
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +547 -1
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +162 -7
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +14 -10
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +340 -3
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +28 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +217 -1
- package/src/runtime/routes/__tests__/question-routes.test.ts +64 -0
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +20 -0
- package/src/runtime/routes/__tests__/skill-history-route.test.ts +116 -0
- package/src/runtime/routes/__tests__/sse-actor-principal-heal.test.ts +165 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +25 -0
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +2 -0
- package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +60 -2
- package/src/runtime/routes/archive-utils.ts +16 -12
- package/src/runtime/routes/attachment-routes.ts +13 -6
- package/src/runtime/routes/canned-reply-release.ts +54 -0
- package/src/runtime/routes/channel-availability-routes.ts +32 -14
- package/src/runtime/routes/channel-verification-routes.ts +2 -27
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +5 -0
- package/src/runtime/routes/client-routes.ts +114 -2
- package/src/runtime/routes/conversation-cli-routes.ts +10 -12
- package/src/runtime/routes/conversation-list-routes.ts +59 -10
- package/src/runtime/routes/conversation-management-routes.ts +47 -18
- package/src/runtime/routes/conversation-query-routes.ts +32 -53
- package/src/runtime/routes/conversation-routes.ts +360 -293
- package/src/runtime/routes/credential-prompt-routes.ts +20 -2
- package/src/runtime/routes/debug-routes.ts +4 -1
- package/src/runtime/routes/default-provider-routes.ts +7 -11
- package/src/runtime/routes/documents-routes.ts +44 -1
- package/src/runtime/routes/events-routes.ts +29 -1
- package/src/runtime/routes/host-app-control-routes.ts +2 -0
- package/src/runtime/routes/host-bash-routes.ts +2 -0
- package/src/runtime/routes/host-browser-routes.ts +2 -0
- package/src/runtime/routes/host-cu-routes.ts +2 -0
- package/src/runtime/routes/host-file-routes.ts +2 -0
- package/src/runtime/routes/host-transfer-routes.ts +4 -0
- package/src/runtime/routes/identity-routes.ts +6 -6
- package/src/runtime/routes/inbound-message-handler.ts +5 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +7 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +14 -0
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +2 -2
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +14 -11
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -17
- package/src/runtime/routes/inference-profile-availability-guard.ts +171 -0
- package/src/runtime/routes/inference-profile-session-handler.ts +26 -2
- package/src/runtime/routes/inference-profile-session-routes.ts +2 -1
- package/src/runtime/routes/inference-profiles-routes.ts +152 -73
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -16
- package/src/runtime/routes/llm-call-sites-routes.ts +13 -0
- package/src/runtime/routes/log-export-routes.ts +1 -1
- package/src/runtime/routes/mcp-auth-routes.ts +141 -57
- package/src/runtime/routes/notification-routes.ts +0 -14
- package/src/runtime/routes/oauth-providers.ts +1 -0
- package/src/runtime/routes/plugins-routes.ts +127 -4
- package/src/runtime/routes/profiler-routes.ts +4 -2
- package/src/runtime/routes/question-routes.ts +28 -10
- package/src/runtime/routes/retrospective-routes.ts +9 -3
- package/src/runtime/routes/schedule-routes.ts +210 -12
- package/src/runtime/routes/secret-routes.ts +40 -23
- package/src/runtime/routes/settings-routes.ts +41 -13
- package/src/runtime/routes/skills-routes.ts +79 -0
- package/src/runtime/routes/sse-actor-principal-heal.ts +113 -0
- package/src/runtime/routes/stt-routes.ts +31 -25
- package/src/runtime/routes/ui-snapshot-routes.ts +1 -0
- package/src/runtime/routes/wake-conversation-routes.ts +23 -0
- package/src/runtime/services/__tests__/conversation-serializer.test.ts +1 -0
- package/src/runtime/services/conversation-serializer.ts +24 -9
- package/src/runtime/sync/documents-sidecar-publish.test.ts +101 -0
- package/src/runtime/sync/resource-sync-events.ts +79 -1
- package/src/runtime/sync/worker-daemon-notify.test.ts +34 -0
- package/src/runtime/sync/worker-daemon-notify.ts +44 -6
- package/src/runtime/verification-outbound-actions.ts +250 -222
- package/src/runtime/verification-templates.ts +41 -30
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +614 -0
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1066 -0
- package/src/schedule/inference-profile.ts +64 -3
- package/src/schedule/plugin-schedule-declarations.ts +518 -0
- package/src/schedule/plugin-schedule-reconciler.ts +605 -0
- package/src/schedule/plugin-schedules-gate.ts +23 -0
- package/src/schedule/schedule-store.ts +520 -26
- package/src/schedule/scheduler.ts +38 -0
- package/src/security/credential-backend.ts +51 -4
- package/src/security/encrypted-store.ts +64 -42
- package/src/security/oauth2.ts +6 -22
- package/src/security/secure-keys.ts +55 -7
- package/src/skills/catalog-install.ts +20 -7
- package/src/skills/inline-command-runner.ts +2 -7
- package/src/skills/skill-history.test.ts +269 -0
- package/src/skills/skill-history.ts +250 -0
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +22 -0
- package/src/stt/__tests__/language-metadata.test.ts +85 -0
- package/src/stt/__tests__/speech-energy.test.ts +79 -0
- package/src/stt/__tests__/types.test.ts +94 -0
- package/src/stt/daemon-batch-transcriber.ts +18 -6
- package/src/stt/language-metadata.ts +65 -0
- package/src/stt/speech-energy.ts +115 -12
- package/src/stt/stt-stream-session.ts +8 -4
- package/src/stt/types.ts +119 -0
- package/src/subagent/__tests__/consult-prompt.test.ts +25 -0
- package/src/subagent/consult-prompt.ts +3 -1
- package/src/subagent/consult-transcript.ts +1 -1
- package/src/subagent/manager.ts +304 -44
- package/src/subagent/progress-events.ts +35 -0
- package/src/subagent/role-resolution.ts +88 -0
- package/src/subagent/types.ts +303 -67
- package/src/subagent/validate-allowlists.ts +3 -4
- package/src/telegram/__tests__/webhook-health.test.ts +73 -1
- package/src/telegram/webhook-health.ts +101 -3
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +2 -0
- package/src/telemetry/activation-funnel.ts +6 -1
- package/src/telemetry/live-voice-funnel.ts +75 -0
- package/src/telemetry/telemetry-event-sources.ts +6 -0
- package/src/telemetry/telemetry-wire-source.json +1 -1
- package/src/telemetry/telemetry-wire.generated.ts +2 -0
- package/src/telemetry/types.ts +23 -4
- package/src/telemetry/usage-telemetry-reporter.test.ts +4 -0
- package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +1 -1
- package/src/tools/ask-question/ask-question-tool.test.ts +118 -3
- package/src/tools/ask-question/ask-question-tool.ts +56 -2
- package/src/tools/browser/browser-execution.ts +1 -1
- package/src/tools/calls/call-start.ts +8 -5
- package/src/tools/conversation-groups/move_to_group.ts +10 -12
- package/src/tools/document/document-tool.ts +11 -4
- package/src/tools/execution-timeout.ts +9 -2
- package/src/tools/executor.ts +7 -6
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +7 -13
- package/src/tools/filesystem/search.ts +23 -21
- package/src/tools/filesystem/write.ts +4 -1
- package/src/tools/host-filesystem/edit.ts +7 -2
- package/src/tools/host-filesystem/read.ts +21 -8
- package/src/tools/host-filesystem/write.ts +10 -2
- package/src/tools/host-terminal/host-shell.ts +2 -2
- package/src/tools/mcp/mcp-tool-factory.ts +25 -1
- package/src/tools/permission-checker.ts +8 -3
- package/src/tools/schedule/delete.ts +13 -1
- package/src/tools/schedule/list.ts +14 -3
- package/src/tools/schedule/update.ts +56 -33
- package/src/tools/shared/filesystem/audio-read.ts +6 -4
- package/src/tools/shared/filesystem/file-ops-service.ts +176 -116
- package/src/tools/shared/filesystem/image-read.ts +12 -12
- package/src/tools/shared/filesystem/path-policy.ts +70 -5
- package/src/tools/shared/filesystem/size-guard.ts +6 -6
- package/src/tools/shared/input-misuse.ts +72 -0
- package/src/tools/skills/scaffold-managed.ts +82 -0
- package/src/tools/skills/skill-tool-factory.ts +14 -1
- package/src/tools/subagent/consult-deadline.ts +12 -7
- package/src/tools/subagent/message.ts +3 -1
- package/src/tools/subagent/read.ts +66 -4
- package/src/tools/subagent/spawn.ts +500 -78
- package/src/tools/tool-approval-handler.ts +45 -4
- package/src/tools/types.ts +22 -3
- package/src/tools/ui-surface/surface-shape-docs.ts +1 -1
- package/src/tools/ui-surface/visual-validation.ts +2 -0
- package/src/tts/__tests__/provider-adapters.test.ts +147 -0
- package/src/tts/__tests__/speakable-segments.test.ts +470 -0
- package/src/tts/language-voices.ts +23 -0
- package/src/tts/providers/deepgram-provider.ts +3 -1
- package/src/tts/providers/elevenlabs-provider.ts +73 -1
- package/src/tts/providers/xai-provider.ts +28 -2
- package/src/tts/speakable-segments.ts +293 -23
- package/src/tts/synthesis-stream.ts +7 -0
- package/src/tts/types.ts +7 -0
- package/src/usage/__tests__/subagent-attribution.test.ts +109 -0
- package/src/usage/subagent-attribution.ts +108 -0
- package/src/util/__tests__/language-subtag.test.ts +54 -0
- package/src/util/__tests__/sqlite-retry.test.ts +112 -0
- package/src/util/abort-reasons.ts +16 -0
- package/src/util/ansi.ts +44 -0
- package/src/util/disk-usage.ts +17 -13
- package/src/util/image-conversion.ts +20 -13
- package/src/util/language-subtag.ts +43 -0
- package/src/util/schedule-source-key.ts +23 -0
- package/src/util/unicode.ts +1 -1
- package/src/util/worker-process.ts +7 -1
- package/src/workspace/git-service.ts +33 -9
- package/src/workspace/migrations/140-repair-seed-pinned-memory-v3-live.ts +260 -0
- package/src/workspace/migrations/141-stt-english-default-to-multilingual.ts +111 -0
- package/src/workspace/migrations/142-consolidate-voice-front-door.ts +70 -0
- package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +116 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/workspace/top-level-renderer.ts +15 -2
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -357
- package/src/daemon/install-symlink.ts +0 -207
- package/src/live-voice/__tests__/front-decision.test.ts +0 -525
- package/src/live-voice/front-decision.ts +0 -429
- package/src/notifications/deferred-emit.ts +0 -147
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the shared OAuth callback URL resolver.
|
|
3
|
+
*
|
|
4
|
+
* The property that matters is stability: every caller and every attempt
|
|
5
|
+
* must get the same redirect URI. Dynamic client registration and Client
|
|
6
|
+
* ID Metadata Documents both pin `redirect_uris` when the client is
|
|
7
|
+
* registered, and the authorization server matches the value exactly on
|
|
8
|
+
* each authorization request, so a URI that varies per attempt makes both
|
|
9
|
+
* mechanisms unusable.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { afterEach, describe, expect, mock, test } from "bun:test";
|
|
13
|
+
|
|
14
|
+
const resolveCallbackUrl = mock(
|
|
15
|
+
async () => "https://ingress.example/webhooks/oauth/callback",
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
mock.module("../platform-callback-registration.js", () => ({
|
|
19
|
+
resolveCallbackUrl,
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
mock.module("../public-ingress-urls.js", () => ({
|
|
23
|
+
getOAuthCallbackUrl: () => "https://direct.example/webhooks/oauth/callback",
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
mock.module("../../config/loader.js", () => ({
|
|
27
|
+
loadConfig: () => ({}),
|
|
28
|
+
}));
|
|
29
|
+
|
|
30
|
+
const { OAUTH_CALLBACK_PATH, resolveOauthCallbackUrl } =
|
|
31
|
+
await import("../oauth-callback-url.js");
|
|
32
|
+
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
resolveCallbackUrl.mockClear();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe("resolveOauthCallbackUrl", () => {
|
|
38
|
+
test("returns whatever the shared resolver decides", async () => {
|
|
39
|
+
await expect(resolveOauthCallbackUrl()).resolves.toEqual(
|
|
40
|
+
"https://ingress.example/webhooks/oauth/callback",
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("registers the shared callback path, not a per-caller one", async () => {
|
|
45
|
+
await resolveOauthCallbackUrl();
|
|
46
|
+
const [, callbackPath] = resolveCallbackUrl.mock.calls[0] as unknown[];
|
|
47
|
+
expect(callbackPath).toEqual(OAUTH_CALLBACK_PATH);
|
|
48
|
+
expect(OAUTH_CALLBACK_PATH).toEqual("webhooks/oauth/callback");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("every call resolves to the same URL, path, and registration type", async () => {
|
|
52
|
+
// The URI a client registers and the URI it later authorizes with are
|
|
53
|
+
// the same string, which is what an exact-match redirect_uri check
|
|
54
|
+
// needs. Nothing about the caller can vary it: the function takes no
|
|
55
|
+
// arguments.
|
|
56
|
+
const first = await resolveOauthCallbackUrl();
|
|
57
|
+
const second = await resolveOauthCallbackUrl();
|
|
58
|
+
expect(first).toEqual(second);
|
|
59
|
+
|
|
60
|
+
const [, pathA, typeA] = resolveCallbackUrl.mock.calls[0] as unknown[];
|
|
61
|
+
const [, pathB, typeB] = resolveCallbackUrl.mock.calls[1] as unknown[];
|
|
62
|
+
expect(pathA).toEqual(pathB);
|
|
63
|
+
expect(typeA).toEqual(typeB);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("registers one route type so the platform holds a single admin row", async () => {
|
|
67
|
+
await resolveOauthCallbackUrl();
|
|
68
|
+
const [, , type] = resolveCallbackUrl.mock.calls[0] as unknown[];
|
|
69
|
+
expect(type).toEqual("oauth");
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("propagates the resolver's failure rather than inventing a URL", async () => {
|
|
73
|
+
// No ingress and no platform connection means there is no URL that
|
|
74
|
+
// would work. Returning a plausible one produces an authorization
|
|
75
|
+
// request whose callback silently never arrives.
|
|
76
|
+
resolveCallbackUrl.mockImplementationOnce(async () => {
|
|
77
|
+
throw new Error("No public base URL configured.");
|
|
78
|
+
});
|
|
79
|
+
await expect(resolveOauthCallbackUrl()).rejects.toThrow(
|
|
80
|
+
/No public base URL/,
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public URL resolution for the assistant's shared OAuth callback route.
|
|
3
|
+
*
|
|
4
|
+
* Every browser-based OAuth flow in the daemon redirects back to one path,
|
|
5
|
+
* `webhooks/oauth/callback`, which the gateway serves and forwards to
|
|
6
|
+
* `POST /v1/internal/oauth/callback`. The runtime matches the arriving
|
|
7
|
+
* `state` against `security/oauth-callback-registry.ts` and resolves the
|
|
8
|
+
* waiting flow, so one route multiplexes every concurrent handshake and no
|
|
9
|
+
* caller needs a listener of its own.
|
|
10
|
+
*
|
|
11
|
+
* Which base URL is correct depends on how the assistant is reachable: a
|
|
12
|
+
* platform pod and a platform-connected assistant are served through a
|
|
13
|
+
* managed callback route, a self-hosted deployment through its configured
|
|
14
|
+
* public ingress. `resolveCallbackUrl` owns that decision, and this is the
|
|
15
|
+
* OAuth-shaped entry point to it, mirroring `plugin-api/webhook-url.ts`
|
|
16
|
+
* for plugin ingress.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { loadConfig } from "../config/loader.js";
|
|
20
|
+
import { resolveCallbackUrl } from "./platform-callback-registration.js";
|
|
21
|
+
import { getOAuthCallbackUrl } from "./public-ingress-urls.js";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Path the gateway serves the shared OAuth callback on.
|
|
25
|
+
*
|
|
26
|
+
* Fixed rather than caller-supplied. Every flow is demultiplexed by OAuth
|
|
27
|
+
* `state`, so a per-caller path would buy nothing and would need its own
|
|
28
|
+
* gateway route and its own platform registration.
|
|
29
|
+
*/
|
|
30
|
+
export const OAUTH_CALLBACK_PATH = "webhooks/oauth/callback";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Registration type recorded with the platform.
|
|
34
|
+
*
|
|
35
|
+
* The platform keys a callback route by `(path, type)`, and there is one
|
|
36
|
+
* OAuth route, so one type describes it. Registering the same path under
|
|
37
|
+
* several types would produce duplicate admin rows pointing at the same
|
|
38
|
+
* URL.
|
|
39
|
+
*/
|
|
40
|
+
const OAUTH_REGISTRATION_TYPE = "oauth";
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolve the redirect URI an authorization server should send the user
|
|
44
|
+
* back to.
|
|
45
|
+
*
|
|
46
|
+
* Takes no arguments on purpose: every caller shares one route, so there
|
|
47
|
+
* is nothing to vary. That is what makes the URI stable across callers and
|
|
48
|
+
* across attempts, which is what an exact-match `redirect_uri` check needs.
|
|
49
|
+
*
|
|
50
|
+
* @throws when no public ingress is configured and the assistant is not
|
|
51
|
+
* connected to the platform. There is no URL that would work in that
|
|
52
|
+
* case, and returning a plausible one produces an authorization request
|
|
53
|
+
* whose callback silently never arrives.
|
|
54
|
+
*/
|
|
55
|
+
export async function resolveOauthCallbackUrl(): Promise<string> {
|
|
56
|
+
return resolveCallbackUrl(
|
|
57
|
+
() => getOAuthCallbackUrl(loadConfig()),
|
|
58
|
+
OAUTH_CALLBACK_PATH,
|
|
59
|
+
OAUTH_REGISTRATION_TYPE,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { createServer } from "node:net";
|
|
1
2
|
import { tmpdir } from "node:os";
|
|
2
3
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
3
4
|
|
|
5
|
+
import { ensureSocketPathFree } from "../socket-cleanup.js";
|
|
4
6
|
import { resolveIpcSocketPath } from "../socket-path.js";
|
|
5
7
|
|
|
6
8
|
let savedWorkspaceDir: string | undefined;
|
|
@@ -77,4 +79,23 @@ describe("resolveIpcSocketPath", () => {
|
|
|
77
79
|
|
|
78
80
|
delete process.env.EXAMPLE_SERVICE_IPC_SOCKET_DIR;
|
|
79
81
|
});
|
|
82
|
+
|
|
83
|
+
test.skipIf(process.platform !== "win32")(
|
|
84
|
+
"rejects an occupied named pipe",
|
|
85
|
+
async () => {
|
|
86
|
+
const pipe = `\\\\.\\pipe\\vellum-ipc-test-${process.pid}`;
|
|
87
|
+
const server = createServer();
|
|
88
|
+
await new Promise<void>((resolve, reject) => {
|
|
89
|
+
server.once("error", reject);
|
|
90
|
+
server.listen(pipe, resolve);
|
|
91
|
+
});
|
|
92
|
+
try {
|
|
93
|
+
await expect(ensureSocketPathFree(pipe)).rejects.toMatchObject({
|
|
94
|
+
code: "EADDRINUSE",
|
|
95
|
+
});
|
|
96
|
+
} finally {
|
|
97
|
+
server.close();
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
);
|
|
80
101
|
});
|
|
@@ -28,13 +28,14 @@
|
|
|
28
28
|
* back to a shorter deterministic path so CLI commands can still connect.
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
32
31
|
import { createServer, type Server, type Socket } from "node:net";
|
|
33
32
|
|
|
34
33
|
import {
|
|
35
34
|
ensureSocketDir,
|
|
36
35
|
type IpcEnvelope,
|
|
37
36
|
IpcFrameReader,
|
|
37
|
+
ipcListenOptions,
|
|
38
|
+
removeIpcEndpointFile,
|
|
38
39
|
SocketWatchdog,
|
|
39
40
|
writeLegacyMessage,
|
|
40
41
|
writeMessage,
|
|
@@ -60,6 +61,7 @@ import { CONTACTS_INFO_IPC_METHODS } from "./routes/contacts-info-ipc-routes.js"
|
|
|
60
61
|
import { CONTACTS_MIRROR_IPC_METHODS } from "./routes/contacts-mirror-ipc-routes.js";
|
|
61
62
|
import { CONVERSATION_SYNC_IPC_METHODS } from "./routes/conversation-sync-ipc-routes.js";
|
|
62
63
|
import { type DbProxyParams, handleDbProxy } from "./routes/db-proxy.js";
|
|
64
|
+
import { DOCUMENTS_SYNC_IPC_METHODS } from "./routes/documents-sync-ipc-routes.js";
|
|
63
65
|
import { EVENTS_IPC_METHODS } from "./routes/events-ipc-routes.js";
|
|
64
66
|
import { GUARDIAN_LABEL_IPC_METHODS } from "./routes/guardian-label-ipc-routes.js";
|
|
65
67
|
import { INVITE_IPC_METHODS } from "./routes/invite-ipc-routes.js";
|
|
@@ -215,6 +217,7 @@ export class AssistantIpcServer {
|
|
|
215
217
|
CONTACTS_MIRROR_IPC_METHODS,
|
|
216
218
|
GUARDIAN_LABEL_IPC_METHODS,
|
|
217
219
|
CONVERSATION_SYNC_IPC_METHODS,
|
|
220
|
+
DOCUMENTS_SYNC_IPC_METHODS,
|
|
218
221
|
EVENTS_IPC_METHODS,
|
|
219
222
|
]) {
|
|
220
223
|
for (const [operationId, handler] of Object.entries(methodMap)) {
|
|
@@ -257,8 +260,18 @@ export class AssistantIpcServer {
|
|
|
257
260
|
await ensureSocketPathFree(this.socketPath);
|
|
258
261
|
|
|
259
262
|
this.server = this.createListeningServer();
|
|
260
|
-
|
|
261
|
-
|
|
263
|
+
await new Promise<void>((resolve, reject) => {
|
|
264
|
+
const server = this.server!;
|
|
265
|
+
const onError = (err: Error): void => {
|
|
266
|
+
this.server = null;
|
|
267
|
+
reject(err);
|
|
268
|
+
};
|
|
269
|
+
server.once("error", onError);
|
|
270
|
+
server.listen(ipcListenOptions(this.socketPath), () => {
|
|
271
|
+
server.off("error", onError);
|
|
272
|
+
log.info({ path: this.socketPath }, "Assistant IPC server listening");
|
|
273
|
+
resolve();
|
|
274
|
+
});
|
|
262
275
|
});
|
|
263
276
|
|
|
264
277
|
this.watchdog.start();
|
|
@@ -290,13 +303,7 @@ export class AssistantIpcServer {
|
|
|
290
303
|
this.server = null;
|
|
291
304
|
}
|
|
292
305
|
|
|
293
|
-
|
|
294
|
-
try {
|
|
295
|
-
unlinkSync(this.socketPath);
|
|
296
|
-
} catch {
|
|
297
|
-
// Ignore
|
|
298
|
-
}
|
|
299
|
-
}
|
|
306
|
+
removeIpcEndpointFile(this.socketPath);
|
|
300
307
|
}
|
|
301
308
|
|
|
302
309
|
/** Get the socket path (for diagnostics). */
|
package/src/ipc/cli-client.ts
CHANGED
|
@@ -58,6 +58,15 @@ export interface CliIpcCallResult<T = unknown> {
|
|
|
58
58
|
* when the originating daemon-side error carried a `details` field.
|
|
59
59
|
*/
|
|
60
60
|
errorDetails?: unknown;
|
|
61
|
+
/**
|
|
62
|
+
* Set when the call was abandoned because `timeoutMs` elapsed with no
|
|
63
|
+
* response. Distinct from every other `ok: false` shape: the request WAS
|
|
64
|
+
* delivered and the daemon may still be executing it — closing the client
|
|
65
|
+
* socket does not abort the handler. Callers that would otherwise retry a
|
|
66
|
+
* transport failure must not retry this one until the original can no
|
|
67
|
+
* longer be in flight.
|
|
68
|
+
*/
|
|
69
|
+
timedOut?: boolean;
|
|
61
70
|
}
|
|
62
71
|
|
|
63
72
|
/**
|
|
@@ -178,7 +187,7 @@ export async function cliIpcCall<T = unknown>(
|
|
|
178
187
|
{ method, socketPath, timeoutMs: callTimeoutMs },
|
|
179
188
|
"CLI IPC call timed out waiting for response",
|
|
180
189
|
);
|
|
181
|
-
finish({ ok: false, error: "Request timed out" });
|
|
190
|
+
finish({ ok: false, error: "Request timed out", timedOut: true });
|
|
182
191
|
}, callTimeoutMs);
|
|
183
192
|
|
|
184
193
|
socket.on("data", (chunk) => {
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The daemon-side handler for the worker → daemon documents-changed hand-off.
|
|
3
|
+
* A sidecar worker's own hub has no SSE subscriber, so it asks the daemon to
|
|
4
|
+
* republish the invalidation where clients actually observe it.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { beforeEach, describe, expect, mock, test } from "bun:test";
|
|
8
|
+
|
|
9
|
+
const publishCalls: Array<string | undefined> = [];
|
|
10
|
+
|
|
11
|
+
mock.module("../../../runtime/sync/resource-sync-events.js", () => ({
|
|
12
|
+
publishDocumentsChanged: (originClientId?: string) => {
|
|
13
|
+
publishCalls.push(originClientId);
|
|
14
|
+
},
|
|
15
|
+
}));
|
|
16
|
+
|
|
17
|
+
import { DB_MIGRATION_READINESS_EXEMPT_OPERATIONS } from "../../../daemon/daemon-readiness.js";
|
|
18
|
+
import { NOTIFY_DOCUMENTS_CHANGED_IPC_METHOD } from "../../../runtime/sync/worker-daemon-notify.js";
|
|
19
|
+
import {
|
|
20
|
+
DOCUMENTS_SYNC_IPC_METHODS,
|
|
21
|
+
handleNotifyDocumentsChanged,
|
|
22
|
+
} from "../documents-sync-ipc-routes.js";
|
|
23
|
+
|
|
24
|
+
describe("documents-sync IPC route", () => {
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
publishCalls.length = 0;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("republishes the documents-changed invalidation on the daemon", () => {
|
|
30
|
+
const result = handleNotifyDocumentsChanged({ body: {} });
|
|
31
|
+
|
|
32
|
+
expect(result).toEqual({ ok: true });
|
|
33
|
+
expect(publishCalls).toEqual([undefined]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("carries no origin client id, so no client suppresses it", () => {
|
|
37
|
+
// The hand-off comes from a background turn with no originating client.
|
|
38
|
+
handleNotifyDocumentsChanged({ body: {} });
|
|
39
|
+
|
|
40
|
+
expect(publishCalls[0]).toBeUndefined();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("is reachable on the IPC surface under the shared method name", () => {
|
|
44
|
+
expect(
|
|
45
|
+
typeof DOCUMENTS_SYNC_IPC_METHODS[NOTIFY_DOCUMENTS_CHANGED_IPC_METHOD],
|
|
46
|
+
).toBe("function");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("is DB-migration readiness gated (absent from the exempt set)", () => {
|
|
50
|
+
expect(
|
|
51
|
+
DB_MIGRATION_READINESS_EXEMPT_OPERATIONS.has(
|
|
52
|
+
NOTIFY_DOCUMENTS_CHANGED_IPC_METHOD,
|
|
53
|
+
),
|
|
54
|
+
).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC-only route the sidecar workers (schedule, memory) call after a turn
|
|
3
|
+
* changed a document.
|
|
4
|
+
*
|
|
5
|
+
* Workers disable SSE seq stamping (`disableStreamSeqStamping`) so the daemon
|
|
6
|
+
* is the sole seq authority, and the SSE subscribers live in the daemon too. A
|
|
7
|
+
* worker that published `documents:list` on its own hub would reach nobody, so
|
|
8
|
+
* a scheduled or background turn's document edit would stay invisible: the
|
|
9
|
+
* conversation assets pill and the Library would keep serving their cached
|
|
10
|
+
* list. That is precisely the case the changed-document surfacing exists for.
|
|
11
|
+
*
|
|
12
|
+
* This route runs the publish on the daemon instead, where real subscribers
|
|
13
|
+
* observe it. The hand-off carries no originating client, so nothing suppresses
|
|
14
|
+
* the broadcast as its own echo.
|
|
15
|
+
*
|
|
16
|
+
* IPC-only: registered directly on the assistant IPC server (see
|
|
17
|
+
* `assistant-server.ts`), never in the shared `ROUTES` array. The handler
|
|
18
|
+
* touches no database, but the IPC server's uniform DB-migration gate still
|
|
19
|
+
* applies (the method is not exempt); the worker's call is best-effort and
|
|
20
|
+
* tolerates that.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import type { RouteHandlerArgs } from "../../runtime/routes/types.js";
|
|
24
|
+
import { publishDocumentsChanged } from "../../runtime/sync/resource-sync-events.js";
|
|
25
|
+
import { NOTIFY_DOCUMENTS_CHANGED_IPC_METHOD } from "../../runtime/sync/worker-daemon-notify.js";
|
|
26
|
+
|
|
27
|
+
/** Republish a worker's documents-changed invalidation to daemon subscribers. */
|
|
28
|
+
export function handleNotifyDocumentsChanged(_args: RouteHandlerArgs) {
|
|
29
|
+
publishDocumentsChanged();
|
|
30
|
+
return { ok: true };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* IPC-only documents-sync methods, keyed by operationId. Registered directly on
|
|
35
|
+
* the assistant IPC server (see `assistant-server.ts`).
|
|
36
|
+
*/
|
|
37
|
+
export const DOCUMENTS_SYNC_IPC_METHODS: Record<
|
|
38
|
+
string,
|
|
39
|
+
(args: RouteHandlerArgs) => unknown
|
|
40
|
+
> = {
|
|
41
|
+
[NOTIFY_DOCUMENTS_CHANGED_IPC_METHOD]: handleNotifyDocumentsChanged,
|
|
42
|
+
};
|
|
@@ -7,9 +7,14 @@
|
|
|
7
7
|
* inode, leaving two daemons in conflict with no error.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { existsSync
|
|
10
|
+
import { existsSync } from "node:fs";
|
|
11
11
|
import { connect } from "node:net";
|
|
12
12
|
|
|
13
|
+
import {
|
|
14
|
+
isNamedPipePath,
|
|
15
|
+
removeIpcEndpointFile,
|
|
16
|
+
} from "@vellumai/ipc-server-utils";
|
|
17
|
+
|
|
13
18
|
/**
|
|
14
19
|
* Maximum time to wait for the probe `connect()` to settle before declaring
|
|
15
20
|
* the path occupied. Without a bound, a hung process holding the socket would
|
|
@@ -44,7 +49,8 @@ function makeAddrInUseError(message: string): NodeJS.ErrnoException {
|
|
|
44
49
|
* - Any other socket error → propagate.
|
|
45
50
|
*/
|
|
46
51
|
export async function ensureSocketPathFree(socketPath: string): Promise<void> {
|
|
47
|
-
|
|
52
|
+
const namedPipe = isNamedPipePath(socketPath);
|
|
53
|
+
if (!namedPipe && !existsSync(socketPath)) {
|
|
48
54
|
return;
|
|
49
55
|
}
|
|
50
56
|
await new Promise<void>((resolve, reject) => {
|
|
@@ -81,11 +87,7 @@ export async function ensureSocketPathFree(socketPath: string): Promise<void> {
|
|
|
81
87
|
client.once("error", (err: NodeJS.ErrnoException) => {
|
|
82
88
|
if (err.code === "ECONNREFUSED" || err.code === "ENOENT") {
|
|
83
89
|
settle(() => {
|
|
84
|
-
|
|
85
|
-
unlinkSync(socketPath);
|
|
86
|
-
} catch {
|
|
87
|
-
// Ignore — may already be gone
|
|
88
|
-
}
|
|
90
|
+
removeIpcEndpointFile(socketPath);
|
|
89
91
|
resolve();
|
|
90
92
|
});
|
|
91
93
|
} else {
|
package/src/ipc/socket-path.ts
CHANGED
|
@@ -1,106 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
1
|
+
import { resolveIpcEndpoint } from "@vellumai/ipc-server-utils";
|
|
4
2
|
|
|
5
3
|
import { getWorkspaceDir } from "../util/platform.js";
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
const DEFAULT_UNIX_SOCKET_MAX_PATH_BYTES = 107;
|
|
9
|
-
const IPC_TMP_DIR_NAME = "vellum-ipc";
|
|
10
|
-
|
|
11
|
-
export type IpcSocketPathSource =
|
|
12
|
-
| "env-override"
|
|
13
|
-
| "workspace"
|
|
14
|
-
| "tmp-hash"
|
|
15
|
-
| "tmp-short-hash";
|
|
16
|
-
|
|
17
|
-
export interface IpcSocketPathResolution {
|
|
5
|
+
export function resolveIpcSocketPath(socketName: string): {
|
|
18
6
|
path: string;
|
|
19
|
-
source:
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function getUnixSocketMaxPathBytes(): number {
|
|
23
|
-
return process.platform === "darwin"
|
|
24
|
-
? DARWIN_UNIX_SOCKET_MAX_PATH_BYTES
|
|
25
|
-
: DEFAULT_UNIX_SOCKET_MAX_PATH_BYTES;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function isPathWithinSocketLimit(path: string, maxPathBytes: number): boolean {
|
|
29
|
-
return Buffer.byteLength(path, "utf8") <= maxPathBytes;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Derive the env var name and socket filename from a socket name.
|
|
34
|
-
*
|
|
35
|
-
* Examples (hyphens in the name become underscores in the env var):
|
|
36
|
-
* "gateway" → { envVar: "GATEWAY_IPC_SOCKET_DIR", fileName: "gateway.sock" }
|
|
37
|
-
* "assistant" → { envVar: "ASSISTANT_IPC_SOCKET_DIR", fileName: "assistant.sock" }
|
|
38
|
-
*/
|
|
39
|
-
function deriveSocketNames(socketName: string): {
|
|
40
|
-
envVar: string;
|
|
41
|
-
fileName: string;
|
|
7
|
+
source: string;
|
|
42
8
|
} {
|
|
43
|
-
|
|
44
|
-
const fileName = `${socketName}.sock`;
|
|
45
|
-
return { envVar, fileName };
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Resolve the path to an IPC socket file.
|
|
50
|
-
*
|
|
51
|
-
* Resolution order:
|
|
52
|
-
* 1. `${SOCKET_NAME}_IPC_SOCKET_DIR` env var override — used in
|
|
53
|
-
* containerized deployments (emptyDir volume) and by hatch on macOS
|
|
54
|
-
* when the workspace path would exceed the AF_UNIX limit.
|
|
55
|
-
* 2. `{workspaceDir}/{socketName}.sock` — default for local dev.
|
|
56
|
-
* 3. tmpdir fallback — if the workspace path exceeds the platform's
|
|
57
|
-
* AF_UNIX path limit (103 bytes on macOS, 107 on Linux).
|
|
58
|
-
*/
|
|
59
|
-
export function resolveIpcSocketPath(
|
|
60
|
-
socketName: string,
|
|
61
|
-
): IpcSocketPathResolution {
|
|
62
|
-
const workspaceDir = getWorkspaceDir();
|
|
63
|
-
const { envVar, fileName } = deriveSocketNames(socketName);
|
|
64
|
-
|
|
65
|
-
// Explicit override via env var.
|
|
66
|
-
const envSocketDir = process.env[envVar]?.trim();
|
|
67
|
-
if (envSocketDir) {
|
|
68
|
-
return {
|
|
69
|
-
path: join(envSocketDir, fileName),
|
|
70
|
-
source: "env-override",
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const maxPathBytes = getUnixSocketMaxPathBytes();
|
|
75
|
-
const workspacePath = join(workspaceDir, fileName);
|
|
76
|
-
|
|
77
|
-
if (isPathWithinSocketLimit(workspacePath, maxPathBytes)) {
|
|
78
|
-
return {
|
|
79
|
-
path: workspacePath,
|
|
80
|
-
source: "workspace",
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Workspace path exceeds AF_UNIX limit — fall back to tmpdir.
|
|
85
|
-
const hash = createHash("sha256")
|
|
86
|
-
.update(workspacePath)
|
|
87
|
-
.digest("hex")
|
|
88
|
-
.slice(0, 12);
|
|
89
|
-
const hashedPath = join(tmpdir(), IPC_TMP_DIR_NAME, `${hash}-${fileName}`);
|
|
90
|
-
if (isPathWithinSocketLimit(hashedPath, maxPathBytes)) {
|
|
91
|
-
return {
|
|
92
|
-
path: hashedPath,
|
|
93
|
-
source: "tmp-hash",
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return {
|
|
98
|
-
path: join(tmpdir(), `v-${hash}.sock`),
|
|
99
|
-
source: "tmp-short-hash",
|
|
100
|
-
};
|
|
9
|
+
return resolveIpcEndpoint(socketName, { workspaceDir: getWorkspaceDir() });
|
|
101
10
|
}
|
|
102
11
|
|
|
103
|
-
/** Shorthand — resolves the assistant CLI IPC socket path. */
|
|
104
12
|
export function getAssistantSocketPath(): string {
|
|
105
13
|
return resolveIpcSocketPath("assistant").path;
|
|
106
14
|
}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import { describe, expect, mock, test } from "bun:test";
|
|
2
2
|
|
|
3
|
-
import { sanitizeForTts } from "../../calls/tts-text-sanitizer.js";
|
|
4
3
|
import type {
|
|
5
4
|
VoiceTurnCallbacks,
|
|
6
5
|
VoiceTurnOptions,
|
|
7
6
|
} from "../../calls/voice-session-bridge.js";
|
|
8
|
-
import type { LiveVoiceFrontModelConfig } from "../../config/schemas/live-voice.js";
|
|
9
7
|
import type {
|
|
10
8
|
StreamingTranscriber,
|
|
11
9
|
SttStreamServerEvent,
|
|
12
10
|
} from "../../stt/types.js";
|
|
13
|
-
import type { VoiceFrontDecider } from "../front-decision.js";
|
|
14
11
|
import {
|
|
15
12
|
LiveVoiceSession,
|
|
16
13
|
type LiveVoiceTtsStreamer,
|
|
@@ -96,8 +93,6 @@ function createSessionHarness(
|
|
|
96
93
|
createTurnId?: () => string;
|
|
97
94
|
emitMetrics?: boolean;
|
|
98
95
|
streamTtsAudio?: LiveVoiceTtsStreamer;
|
|
99
|
-
frontModelConfig?: Partial<LiveVoiceFrontModelConfig>;
|
|
100
|
-
frontDecider?: VoiceFrontDecider;
|
|
101
96
|
} = {},
|
|
102
97
|
) {
|
|
103
98
|
const transcriber =
|
|
@@ -119,10 +114,6 @@ function createSessionHarness(
|
|
|
119
114
|
...(options.streamTtsAudio
|
|
120
115
|
? { streamTtsAudio: options.streamTtsAudio }
|
|
121
116
|
: {}),
|
|
122
|
-
...(options.frontModelConfig
|
|
123
|
-
? { frontModelConfig: options.frontModelConfig }
|
|
124
|
-
: {}),
|
|
125
|
-
...(options.frontDecider ? { frontDecider: options.frontDecider } : {}),
|
|
126
117
|
});
|
|
127
118
|
|
|
128
119
|
return { frames, session, startVoiceTurn, transcriber };
|
|
@@ -468,7 +459,7 @@ describe("LiveVoiceSession assistant turn", () => {
|
|
|
468
459
|
});
|
|
469
460
|
});
|
|
470
461
|
|
|
471
|
-
test("
|
|
462
|
+
test("publishes tool activity while the turn is running", async () => {
|
|
472
463
|
let callbacks: VoiceTurnCallbacks | undefined;
|
|
473
464
|
const startVoiceTurn = mock(async (options: VoiceTurnOptions) => {
|
|
474
465
|
callbacks = options.callbacks;
|
|
@@ -488,12 +479,6 @@ describe("LiveVoiceSession assistant turn", () => {
|
|
|
488
479
|
callbacks?.tool_use_start?.("some_tool");
|
|
489
480
|
await waitForFrameCount(frames, 4);
|
|
490
481
|
|
|
491
|
-
const activeTurn = (
|
|
492
|
-
session as unknown as {
|
|
493
|
-
activeAssistantTurn: { toolUseStarted: boolean } | null;
|
|
494
|
-
}
|
|
495
|
-
).activeAssistantTurn;
|
|
496
|
-
expect(activeTurn?.toolUseStarted).toBe(true);
|
|
497
482
|
// One activity frame, so a silent stretch of tool work is visible on the
|
|
498
483
|
// surfaces that show the session. An unrecognized tool still gets a line.
|
|
499
484
|
expect(frames.at(-1)).toMatchObject({
|
|
@@ -560,90 +545,6 @@ describe("LiveVoiceSession assistant turn", () => {
|
|
|
560
545
|
});
|
|
561
546
|
});
|
|
562
547
|
|
|
563
|
-
describe("LiveVoiceSession tool-use spoken ack", () => {
|
|
564
|
-
const ACK_TIMEOUT_MS = 40;
|
|
565
|
-
// Every ack is front-model-phrased; the generated text passes through the
|
|
566
|
-
// same TTS sanitizer as regular segments. The stub varies its phrasing by
|
|
567
|
-
// trigger so the two ack kinds stay distinguishable in assertions.
|
|
568
|
-
const TOOL_ACK = "Let me look that up.";
|
|
569
|
-
const FIRST_DELTA_ACK = "Sure — one moment.";
|
|
570
|
-
const EXPECTED_TOOL_ACK = sanitizeForTts(TOOL_ACK).trim();
|
|
571
|
-
const EXPECTED_FIRST_DELTA_ACK = sanitizeForTts(FIRST_DELTA_ACK).trim();
|
|
572
|
-
|
|
573
|
-
const ackDecider: VoiceFrontDecider = {
|
|
574
|
-
generateAckText: async (input) =>
|
|
575
|
-
input.toolName ? TOOL_ACK : FIRST_DELTA_ACK,
|
|
576
|
-
generateProgressText: async () => null,
|
|
577
|
-
};
|
|
578
|
-
|
|
579
|
-
function createAckHarness() {
|
|
580
|
-
const { startVoiceTurn, getCallbacks } = createCapturingTurnStarter();
|
|
581
|
-
const { streamTtsAudio, ttsTexts } = createRecordingTtsStreamer();
|
|
582
|
-
const harness = createSessionHarness({
|
|
583
|
-
startVoiceTurn,
|
|
584
|
-
streamTtsAudio,
|
|
585
|
-
frontModelConfig: { ackFirstDeltaTimeoutMs: ACK_TIMEOUT_MS },
|
|
586
|
-
frontDecider: ackDecider,
|
|
587
|
-
});
|
|
588
|
-
return { ...harness, getCallbacks, ttsTexts };
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
test("tool_use_start before any delta speaks an immediate tool ack and cancels the timer", async () => {
|
|
592
|
-
const { frames, session, getCallbacks, ttsTexts } = createAckHarness();
|
|
593
|
-
|
|
594
|
-
await startReleasedTurn(session, getCallbacks);
|
|
595
|
-
getCallbacks()?.tool_use_start?.("web_search");
|
|
596
|
-
await waitFor(() => ttsTexts.length === 1);
|
|
597
|
-
expect(ttsTexts).toEqual([EXPECTED_TOOL_ACK]);
|
|
598
|
-
|
|
599
|
-
// The pending first-delta timer was cancelled: letting its budget elapse
|
|
600
|
-
// speaks no second ack.
|
|
601
|
-
await new Promise((resolve) => setTimeout(resolve, ACK_TIMEOUT_MS + 40));
|
|
602
|
-
expect(ttsTexts).toEqual([EXPECTED_TOOL_ACK]);
|
|
603
|
-
|
|
604
|
-
// The ack is audio-only — no caption frame carries it.
|
|
605
|
-
expect(frames.some((frame) => frame.type === "assistant_text_delta")).toBe(
|
|
606
|
-
false,
|
|
607
|
-
);
|
|
608
|
-
|
|
609
|
-
emitTextDelta(getCallbacks, "Hello there.");
|
|
610
|
-
emitMessageComplete(getCallbacks);
|
|
611
|
-
await waitFor(() => frames.some((frame) => frame.type === "tts_done"));
|
|
612
|
-
expect(ttsTexts).toEqual([EXPECTED_TOOL_ACK, "Hello there."]);
|
|
613
|
-
});
|
|
614
|
-
|
|
615
|
-
test("tool_use_start after the first delta speaks no ack", async () => {
|
|
616
|
-
const { frames, session, getCallbacks, ttsTexts } = createAckHarness();
|
|
617
|
-
|
|
618
|
-
await startReleasedTurn(session, getCallbacks);
|
|
619
|
-
emitTextDelta(getCallbacks, "Hello there.");
|
|
620
|
-
getCallbacks()?.tool_use_start?.("web_search");
|
|
621
|
-
emitMessageComplete(getCallbacks);
|
|
622
|
-
await waitFor(() => frames.some((frame) => frame.type === "tts_done"));
|
|
623
|
-
await new Promise((resolve) => setTimeout(resolve, ACK_TIMEOUT_MS + 40));
|
|
624
|
-
|
|
625
|
-
expect(ttsTexts).toEqual(["Hello there."]);
|
|
626
|
-
});
|
|
627
|
-
|
|
628
|
-
test("tool_use_start after a first-delta ack already spoke adds no second ack", async () => {
|
|
629
|
-
const { frames, session, getCallbacks, ttsTexts } = createAckHarness();
|
|
630
|
-
|
|
631
|
-
await startReleasedTurn(session, getCallbacks);
|
|
632
|
-
// Let the slow-first-delta timer speak the turn's one ack first.
|
|
633
|
-
await waitFor(() => ttsTexts.length === 1);
|
|
634
|
-
expect(ttsTexts).toEqual([EXPECTED_FIRST_DELTA_ACK]);
|
|
635
|
-
|
|
636
|
-
getCallbacks()?.tool_use_start?.("web_search");
|
|
637
|
-
await flushAsyncCallbacks();
|
|
638
|
-
expect(ttsTexts).toEqual([EXPECTED_FIRST_DELTA_ACK]);
|
|
639
|
-
|
|
640
|
-
emitTextDelta(getCallbacks, "Hello there.");
|
|
641
|
-
emitMessageComplete(getCallbacks);
|
|
642
|
-
await waitFor(() => frames.some((frame) => frame.type === "tts_done"));
|
|
643
|
-
expect(ttsTexts).toEqual([EXPECTED_FIRST_DELTA_ACK, "Hello there."]);
|
|
644
|
-
});
|
|
645
|
-
});
|
|
646
|
-
|
|
647
548
|
describe("LiveVoiceSession room reveal", () => {
|
|
648
549
|
function createMarkerHarness() {
|
|
649
550
|
const { startVoiceTurn, getCallbacks } = createCapturingTurnStarter();
|
|
@@ -651,9 +552,6 @@ describe("LiveVoiceSession room reveal", () => {
|
|
|
651
552
|
const harness = createSessionHarness({
|
|
652
553
|
startVoiceTurn,
|
|
653
554
|
streamTtsAudio,
|
|
654
|
-
// Deltas are emitted immediately in these runs; a long ack budget keeps
|
|
655
|
-
// filler phrases out of the recorded TTS text.
|
|
656
|
-
frontModelConfig: { ackFirstDeltaTimeoutMs: 10_000 },
|
|
657
555
|
});
|
|
658
556
|
return { ...harness, getCallbacks, ttsTexts };
|
|
659
557
|
}
|
|
@@ -689,7 +587,6 @@ describe("LiveVoiceSession room reveal", () => {
|
|
|
689
587
|
const harness = createSessionHarness({
|
|
690
588
|
startVoiceTurn,
|
|
691
589
|
streamTtsAudio,
|
|
692
|
-
frontModelConfig: { ackFirstDeltaTimeoutMs: 10_000 },
|
|
693
590
|
});
|
|
694
591
|
return {
|
|
695
592
|
...harness,
|