@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
|
@@ -2,6 +2,7 @@ import { describe, expect, test } from "bun:test";
|
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
LiveVoiceConfigSchema,
|
|
5
|
+
LiveVoiceFluxConfigSchema,
|
|
5
6
|
LiveVoiceFrontModelConfigSchema,
|
|
6
7
|
LiveVoiceVadConfigSchema,
|
|
7
8
|
VALID_LIVE_VOICE_MODES,
|
|
@@ -21,11 +22,18 @@ const FRONT_MODEL_DEFAULTS = {
|
|
|
21
22
|
endpointDecisionTimeoutMs: 1200,
|
|
22
23
|
endpointExtensionMs: 1500,
|
|
23
24
|
endpointMaxExtensions: 2,
|
|
24
|
-
ackFirstDeltaTimeoutMs: 2500,
|
|
25
|
-
ackGenerationTimeoutMs: 600,
|
|
26
25
|
progress: PROGRESS_DEFAULTS,
|
|
27
26
|
};
|
|
28
27
|
|
|
28
|
+
// `eagerEotThreshold` is deliberately absent: it has no default, and leaving it
|
|
29
|
+
// unset is what keeps Deepgram from emitting speculative turn events.
|
|
30
|
+
const FLUX_DEFAULTS = {
|
|
31
|
+
turnEnd: { enabled: false },
|
|
32
|
+
model: "flux-general-en",
|
|
33
|
+
eotThreshold: 0.7,
|
|
34
|
+
eotTimeoutMs: 5_000,
|
|
35
|
+
};
|
|
36
|
+
|
|
29
37
|
describe("LiveVoiceVadConfigSchema", () => {
|
|
30
38
|
test("empty object parses to defaults", () => {
|
|
31
39
|
const parsed = LiveVoiceVadConfigSchema.parse({});
|
|
@@ -34,6 +42,9 @@ describe("LiveVoiceVadConfigSchema", () => {
|
|
|
34
42
|
silenceThresholdMs: 1200,
|
|
35
43
|
maxTurnDurationMs: 30_000,
|
|
36
44
|
bargeInMinSpeechMs: 250,
|
|
45
|
+
echoBargeInMargin: 1.5,
|
|
46
|
+
echoEmaHalfLifeMs: 400,
|
|
47
|
+
echoDrainSlackMs: 300,
|
|
37
48
|
});
|
|
38
49
|
});
|
|
39
50
|
|
|
@@ -75,6 +86,35 @@ describe("LiveVoiceVadConfigSchema", () => {
|
|
|
75
86
|
});
|
|
76
87
|
expect(result.success).toBe(false);
|
|
77
88
|
});
|
|
89
|
+
|
|
90
|
+
test("accepts echo gate overrides", () => {
|
|
91
|
+
const parsed = LiveVoiceVadConfigSchema.parse({
|
|
92
|
+
echoBargeInMargin: 2.25,
|
|
93
|
+
echoEmaHalfLifeMs: 250,
|
|
94
|
+
echoDrainSlackMs: 500,
|
|
95
|
+
});
|
|
96
|
+
expect(parsed.echoBargeInMargin).toBe(2.25);
|
|
97
|
+
expect(parsed.echoEmaHalfLifeMs).toBe(250);
|
|
98
|
+
expect(parsed.echoDrainSlackMs).toBe(500);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("rejects an echo margin that cannot exceed its reference", () => {
|
|
102
|
+
expect(
|
|
103
|
+
LiveVoiceVadConfigSchema.safeParse({ echoBargeInMargin: 1 }).success,
|
|
104
|
+
).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("rejects invalid echo timing values", () => {
|
|
108
|
+
expect(
|
|
109
|
+
LiveVoiceVadConfigSchema.safeParse({ echoEmaHalfLifeMs: 0 }).success,
|
|
110
|
+
).toBe(false);
|
|
111
|
+
expect(
|
|
112
|
+
LiveVoiceVadConfigSchema.safeParse({ echoEmaHalfLifeMs: 250.5 }).success,
|
|
113
|
+
).toBe(false);
|
|
114
|
+
expect(
|
|
115
|
+
LiveVoiceVadConfigSchema.safeParse({ echoDrainSlackMs: -1 }).success,
|
|
116
|
+
).toBe(false);
|
|
117
|
+
});
|
|
78
118
|
});
|
|
79
119
|
|
|
80
120
|
describe("LiveVoiceFrontModelConfigSchema", () => {
|
|
@@ -92,8 +132,15 @@ describe("LiveVoiceFrontModelConfigSchema", () => {
|
|
|
92
132
|
expect(parsed.endpointMaxExtensions).toBe(0);
|
|
93
133
|
// Unspecified fields still get defaults
|
|
94
134
|
expect(parsed.endpointExtensionMs).toBe(1500);
|
|
95
|
-
|
|
96
|
-
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("strips retired generated-ack settings", () => {
|
|
138
|
+
const parsed = LiveVoiceFrontModelConfigSchema.parse({
|
|
139
|
+
ackFirstDeltaTimeoutMs: 2500,
|
|
140
|
+
ackGenerationTimeoutMs: 600,
|
|
141
|
+
});
|
|
142
|
+
expect(parsed).not.toHaveProperty("ackFirstDeltaTimeoutMs");
|
|
143
|
+
expect(parsed).not.toHaveProperty("ackGenerationTimeoutMs");
|
|
97
144
|
});
|
|
98
145
|
|
|
99
146
|
test("rejects non-positive endpointDecisionTimeoutMs", () => {
|
|
@@ -181,6 +228,87 @@ describe("LiveVoiceFrontModelConfigSchema", () => {
|
|
|
181
228
|
});
|
|
182
229
|
});
|
|
183
230
|
|
|
231
|
+
describe("LiveVoiceFluxConfigSchema", () => {
|
|
232
|
+
test("empty object parses to defaults, with turn-end off", () => {
|
|
233
|
+
expect(LiveVoiceFluxConfigSchema.parse({})).toEqual(FLUX_DEFAULTS);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test("an unset eagerEotThreshold is absent, not zero", () => {
|
|
237
|
+
expect("eagerEotThreshold" in LiveVoiceFluxConfigSchema.parse({})).toBe(
|
|
238
|
+
false,
|
|
239
|
+
);
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test("accepts overrides", () => {
|
|
243
|
+
const parsed = LiveVoiceFluxConfigSchema.parse({
|
|
244
|
+
turnEnd: { enabled: true },
|
|
245
|
+
model: "flux-general-multi",
|
|
246
|
+
eotThreshold: 0.85,
|
|
247
|
+
eagerEotThreshold: 0.45,
|
|
248
|
+
eotTimeoutMs: 12_000,
|
|
249
|
+
});
|
|
250
|
+
expect(parsed.turnEnd.enabled).toBe(true);
|
|
251
|
+
expect(parsed.model).toBe("flux-general-multi");
|
|
252
|
+
expect(parsed.eotThreshold).toBe(0.85);
|
|
253
|
+
expect(parsed.eagerEotThreshold).toBe(0.45);
|
|
254
|
+
expect(parsed.eotTimeoutMs).toBe(12_000);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("partial overrides merge with defaults", () => {
|
|
258
|
+
const parsed = LiveVoiceFluxConfigSchema.parse({ eotThreshold: 0.6 });
|
|
259
|
+
expect(parsed.eotThreshold).toBe(0.6);
|
|
260
|
+
expect(parsed.turnEnd.enabled).toBe(false);
|
|
261
|
+
expect(parsed.model).toBe("flux-general-en");
|
|
262
|
+
expect(parsed.eotTimeoutMs).toBe(5_000);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test("rejects an eotThreshold outside 0.5..0.9", () => {
|
|
266
|
+
const above = LiveVoiceFluxConfigSchema.safeParse({ eotThreshold: 0.95 });
|
|
267
|
+
expect(above.success).toBe(false);
|
|
268
|
+
expect(above.error?.issues.map((i) => i.message)).toEqual([
|
|
269
|
+
"liveVoice.flux.eotThreshold must be <= 0.9",
|
|
270
|
+
]);
|
|
271
|
+
|
|
272
|
+
const below = LiveVoiceFluxConfigSchema.safeParse({ eotThreshold: 0.4 });
|
|
273
|
+
expect(below.success).toBe(false);
|
|
274
|
+
expect(below.error?.issues.map((i) => i.message)).toEqual([
|
|
275
|
+
"liveVoice.flux.eotThreshold must be >= 0.5",
|
|
276
|
+
]);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
test("rejects an eagerEotThreshold outside 0.3..0.9", () => {
|
|
280
|
+
expect(
|
|
281
|
+
LiveVoiceFluxConfigSchema.safeParse({ eagerEotThreshold: 0.2 }).success,
|
|
282
|
+
).toBe(false);
|
|
283
|
+
expect(
|
|
284
|
+
LiveVoiceFluxConfigSchema.safeParse({ eagerEotThreshold: 0.95 }).success,
|
|
285
|
+
).toBe(false);
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
test("rejects an eotTimeoutMs outside 500..60000, and non-integers", () => {
|
|
289
|
+
expect(
|
|
290
|
+
LiveVoiceFluxConfigSchema.safeParse({ eotTimeoutMs: 499 }).success,
|
|
291
|
+
).toBe(false);
|
|
292
|
+
expect(
|
|
293
|
+
LiveVoiceFluxConfigSchema.safeParse({ eotTimeoutMs: 60_001 }).success,
|
|
294
|
+
).toBe(false);
|
|
295
|
+
expect(
|
|
296
|
+
LiveVoiceFluxConfigSchema.safeParse({ eotTimeoutMs: 1_500.5 }).success,
|
|
297
|
+
).toBe(false);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
test("rejects a non-boolean turnEnd.enabled", () => {
|
|
301
|
+
const result = LiveVoiceFluxConfigSchema.safeParse({
|
|
302
|
+
turnEnd: { enabled: "yes" },
|
|
303
|
+
});
|
|
304
|
+
expect(result.success).toBe(false);
|
|
305
|
+
const msgs = result.error?.issues.map((i) => i.message) ?? [];
|
|
306
|
+
expect(msgs.some((m) => m.includes("liveVoice.flux.turnEnd.enabled"))).toBe(
|
|
307
|
+
true,
|
|
308
|
+
);
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
|
|
184
312
|
describe("LiveVoiceConfigSchema", () => {
|
|
185
313
|
test("empty object parses to defaults", () => {
|
|
186
314
|
const parsed = LiveVoiceConfigSchema.parse({});
|
|
@@ -191,8 +319,14 @@ describe("LiveVoiceConfigSchema", () => {
|
|
|
191
319
|
silenceThresholdMs: 1200,
|
|
192
320
|
maxTurnDurationMs: 30_000,
|
|
193
321
|
bargeInMinSpeechMs: 250,
|
|
322
|
+
echoBargeInMargin: 1.5,
|
|
323
|
+
echoEmaHalfLifeMs: 400,
|
|
324
|
+
echoDrainSlackMs: 300,
|
|
194
325
|
},
|
|
195
326
|
frontModel: FRONT_MODEL_DEFAULTS,
|
|
327
|
+
// Off by default: Flux turn detection is opt-in, so the front-door hold
|
|
328
|
+
// verdict keeps committing turns until it is enabled.
|
|
329
|
+
flux: FLUX_DEFAULTS,
|
|
196
330
|
maxSessionDurationSeconds: 1800,
|
|
197
331
|
// Off by default: voice turns carry only their transcript, no audio
|
|
198
332
|
// artifacts on the conversation messages (JARVIS-1283).
|
|
@@ -220,6 +354,7 @@ describe("LiveVoiceConfigSchema", () => {
|
|
|
220
354
|
mode: "ptt",
|
|
221
355
|
vad: { silenceThresholdMs: 900 },
|
|
222
356
|
frontModel: { endpointDecisionTimeoutMs: 300 },
|
|
357
|
+
flux: { turnEnd: { enabled: true } },
|
|
223
358
|
maxSessionDurationSeconds: 600,
|
|
224
359
|
});
|
|
225
360
|
expect(parsed.mode).toBe("ptt");
|
|
@@ -230,6 +365,9 @@ describe("LiveVoiceConfigSchema", () => {
|
|
|
230
365
|
// Partial frontModel overrides merge with defaults
|
|
231
366
|
expect(parsed.frontModel.endpointDecisionTimeoutMs).toBe(300);
|
|
232
367
|
expect(parsed.frontModel.endpointExtensionMs).toBe(1500);
|
|
368
|
+
// Partial flux overrides merge with defaults
|
|
369
|
+
expect(parsed.flux.turnEnd.enabled).toBe(true);
|
|
370
|
+
expect(parsed.flux.eotThreshold).toBe(0.7);
|
|
233
371
|
expect(parsed.maxSessionDurationSeconds).toBe(600);
|
|
234
372
|
});
|
|
235
373
|
|
|
@@ -66,11 +66,22 @@ describe("SttServiceSchema", () => {
|
|
|
66
66
|
);
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
test("language
|
|
70
|
-
//
|
|
71
|
-
//
|
|
69
|
+
test("language defaults to multilingual rather than staying absent", () => {
|
|
70
|
+
// Every config carries a real language, so nothing downstream has to
|
|
71
|
+
// infer one from an absent key. Omitting the param entirely is not a
|
|
72
|
+
// neutral state on Deepgram and the managed relay: it decodes as
|
|
73
|
+
// English, which is what this default exists to stop.
|
|
72
74
|
const parsed = SttServiceSchema.parse({ provider: "vellum" });
|
|
73
|
-
expect(parsed.language).
|
|
75
|
+
expect(parsed.language).toBe("multi");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("a chosen language is never replaced by the default", () => {
|
|
79
|
+
expect(
|
|
80
|
+
SttServiceSchema.parse({ provider: "deepgram", language: "ta" }).language,
|
|
81
|
+
).toBe("ta");
|
|
82
|
+
expect(
|
|
83
|
+
SttServiceSchema.parse({ provider: "deepgram", language: "en" }).language,
|
|
84
|
+
).toBe("en");
|
|
74
85
|
});
|
|
75
86
|
|
|
76
87
|
test("language round-trips a code and the multi code-switching mode", () => {
|
|
@@ -107,6 +118,10 @@ describe("managed provider", () => {
|
|
|
107
118
|
mode: "managed",
|
|
108
119
|
provider: "vellum",
|
|
109
120
|
});
|
|
110
|
-
expect(parsed).toEqual({
|
|
121
|
+
expect(parsed).toEqual({
|
|
122
|
+
provider: "vellum",
|
|
123
|
+
language: "multi",
|
|
124
|
+
providers: {},
|
|
125
|
+
});
|
|
111
126
|
});
|
|
112
127
|
});
|
|
@@ -289,11 +289,11 @@ const CATALOG_RECORD: CatalogRecord = {
|
|
|
289
289
|
"Captions images via a vision-capable profile for text-only model fallback.",
|
|
290
290
|
domain: "skills",
|
|
291
291
|
},
|
|
292
|
-
|
|
293
|
-
id: "
|
|
294
|
-
displayName: "Voice
|
|
292
|
+
voiceProgressNarration: {
|
|
293
|
+
id: "voiceProgressNarration",
|
|
294
|
+
displayName: "Voice Progress Narration",
|
|
295
295
|
description:
|
|
296
|
-
"
|
|
296
|
+
"Phrases short spoken progress updates during long-running live voice turns.",
|
|
297
297
|
domain: "agentLoop",
|
|
298
298
|
},
|
|
299
299
|
voiceFrontDoor: {
|
|
@@ -43,10 +43,6 @@ const CallsSafetyConfigSchema = z
|
|
|
43
43
|
|
|
44
44
|
const CallsVoiceConfigSchema = z
|
|
45
45
|
.object({
|
|
46
|
-
language: z
|
|
47
|
-
.string({ error: "calls.voice.language must be a string" })
|
|
48
|
-
.default("en-US")
|
|
49
|
-
.describe("BCP-47 language code for speech recognition and synthesis"),
|
|
50
46
|
interruptSensitivity: z
|
|
51
47
|
.enum(["low", "medium", "high"], {
|
|
52
48
|
error:
|
|
@@ -68,6 +68,19 @@ export const TelegramConfigSchema = z
|
|
|
68
68
|
.string({ error: "telegram.apiBaseUrl must be a string" })
|
|
69
69
|
.default("https://api.telegram.org")
|
|
70
70
|
.describe("Base URL for the Telegram Bot API"),
|
|
71
|
+
// Written by the gateway reconciler, read by the health sweep. Deployment
|
|
72
|
+
// state rather than user configuration: it records where this deployment
|
|
73
|
+
// last pointed Telegram, so the sweep can tell our own registration from a
|
|
74
|
+
// stale tunnel address or another deployment's callback. Unset until a
|
|
75
|
+
// reconciliation succeeds, which the sweep reports as unverified rather
|
|
76
|
+
// than healthy. Stripped by sanitize-for-transfer, like
|
|
77
|
+
// ingress.publicBaseUrlManagedBy, because it does not travel between hosts.
|
|
78
|
+
registeredWebhookUrl: z
|
|
79
|
+
.string({ error: "telegram.registeredWebhookUrl must be a string" })
|
|
80
|
+
.optional()
|
|
81
|
+
.describe(
|
|
82
|
+
"Webhook URL this deployment last registered with Telegram (managed by the gateway)",
|
|
83
|
+
),
|
|
71
84
|
deliverAuthBypass: z
|
|
72
85
|
.boolean({ error: "telegram.deliverAuthBypass must be a boolean" })
|
|
73
86
|
.default(false)
|
|
@@ -42,6 +42,31 @@ export const LiveVoiceVadConfigSchema = z
|
|
|
42
42
|
.describe(
|
|
43
43
|
"Sustained speech (ms) required before speech during assistant playback interrupts it — the default 'interrupt sensitivity' (higher = harder to interrupt). 0 disables the guard. Clients may override it per-session via the start frame. Raised from 60 so brief TTS bleed through imperfect echo cancellation no longer self-interrupts the assistant.",
|
|
44
44
|
),
|
|
45
|
+
echoBargeInMargin: z
|
|
46
|
+
.number({ error: "liveVoice.vad.echoBargeInMargin must be a number" })
|
|
47
|
+
.gt(1, "liveVoice.vad.echoBargeInMargin must be greater than 1")
|
|
48
|
+
.default(1.5)
|
|
49
|
+
.describe(
|
|
50
|
+
"Multiplier over the learned playback echo level that microphone input must exceed to count as speech during playback. Higher values reduce false interruptions but require louder barge-in speech.",
|
|
51
|
+
),
|
|
52
|
+
echoEmaHalfLifeMs: z
|
|
53
|
+
.number({ error: "liveVoice.vad.echoEmaHalfLifeMs must be a number" })
|
|
54
|
+
.int("liveVoice.vad.echoEmaHalfLifeMs must be an integer")
|
|
55
|
+
.positive("liveVoice.vad.echoEmaHalfLifeMs must be a positive integer")
|
|
56
|
+
.default(400)
|
|
57
|
+
.describe(
|
|
58
|
+
"Half-life (ms) of the learned playback echo level. Smaller values adapt faster to changing speaker volume; larger values are steadier against transients.",
|
|
59
|
+
),
|
|
60
|
+
echoDrainSlackMs: z
|
|
61
|
+
.number({ error: "liveVoice.vad.echoDrainSlackMs must be a number" })
|
|
62
|
+
.int("liveVoice.vad.echoDrainSlackMs must be an integer")
|
|
63
|
+
.nonnegative(
|
|
64
|
+
"liveVoice.vad.echoDrainSlackMs must be a nonnegative integer",
|
|
65
|
+
)
|
|
66
|
+
.default(300)
|
|
67
|
+
.describe(
|
|
68
|
+
"Time (ms) after the estimated client playback tail during which microphone input can still be classified as playback echo.",
|
|
69
|
+
),
|
|
45
70
|
})
|
|
46
71
|
.describe(
|
|
47
72
|
"Voice-activity-detection tuning for live voice sessions (open-mic turn segmentation)",
|
|
@@ -182,34 +207,64 @@ export const LiveVoiceFrontModelConfigSchema = z
|
|
|
182
207
|
)
|
|
183
208
|
.default(2)
|
|
184
209
|
.describe("Cap on consecutive 'hold' extensions per utterance"),
|
|
185
|
-
ackFirstDeltaTimeoutMs: z
|
|
186
|
-
.number({
|
|
187
|
-
error: "liveVoice.frontModel.ackFirstDeltaTimeoutMs must be a number",
|
|
188
|
-
})
|
|
189
|
-
.int("liveVoice.frontModel.ackFirstDeltaTimeoutMs must be an integer")
|
|
190
|
-
.positive(
|
|
191
|
-
"liveVoice.frontModel.ackFirstDeltaTimeoutMs must be a positive integer",
|
|
192
|
-
)
|
|
193
|
-
.default(2500)
|
|
194
|
-
.describe(
|
|
195
|
-
"Keyword-delay budget (ms): a spoken ack fires if no first assistant delta has arrived by then",
|
|
196
|
-
),
|
|
197
|
-
ackGenerationTimeoutMs: z
|
|
198
|
-
.number({
|
|
199
|
-
error: "liveVoice.frontModel.ackGenerationTimeoutMs must be a number",
|
|
200
|
-
})
|
|
201
|
-
.int("liveVoice.frontModel.ackGenerationTimeoutMs must be an integer")
|
|
202
|
-
.positive(
|
|
203
|
-
"liveVoice.frontModel.ackGenerationTimeoutMs must be a positive integer",
|
|
204
|
-
)
|
|
205
|
-
.default(600)
|
|
206
|
-
.describe("Budget (ms) for LLM-generated ack text"),
|
|
207
210
|
progress: LiveVoiceProgressConfigSchema.default(
|
|
208
211
|
LiveVoiceProgressConfigSchema.parse({}),
|
|
209
212
|
),
|
|
210
213
|
})
|
|
211
214
|
.describe(
|
|
212
|
-
"
|
|
215
|
+
"Voice front-door endpointing and long-turn progress narration tuning",
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
const LiveVoiceFluxTurnEndConfigSchema = z
|
|
219
|
+
.object({
|
|
220
|
+
enabled: z
|
|
221
|
+
.boolean({ error: "liveVoice.flux.turnEnd.enabled must be a boolean" })
|
|
222
|
+
.default(false)
|
|
223
|
+
.describe(
|
|
224
|
+
"Commit the live-voice turn on Flux's EndOfTurn instead of the front-door [0] hold verdict. Requires services.stt.provider to be deepgram-flux; ignored otherwise.",
|
|
225
|
+
),
|
|
226
|
+
})
|
|
227
|
+
.describe(
|
|
228
|
+
"Which signal commits a live voice turn when Deepgram Flux is the STT provider",
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
export const LiveVoiceFluxConfigSchema = z
|
|
232
|
+
.object({
|
|
233
|
+
turnEnd: LiveVoiceFluxTurnEndConfigSchema.default(
|
|
234
|
+
LiveVoiceFluxTurnEndConfigSchema.parse({}),
|
|
235
|
+
),
|
|
236
|
+
model: z
|
|
237
|
+
.string({ error: "liveVoice.flux.model must be a string" })
|
|
238
|
+
.default("flux-general-en")
|
|
239
|
+
.describe("Deepgram Flux model requested when opening the STT stream"),
|
|
240
|
+
eotThreshold: z
|
|
241
|
+
.number({ error: "liveVoice.flux.eotThreshold must be a number" })
|
|
242
|
+
.min(0.5, "liveVoice.flux.eotThreshold must be >= 0.5")
|
|
243
|
+
.max(0.9, "liveVoice.flux.eotThreshold must be <= 0.9")
|
|
244
|
+
.default(0.7)
|
|
245
|
+
.describe(
|
|
246
|
+
"End-of-turn confidence Flux must reach before it emits EndOfTurn. Lower values commit sooner and cut speakers off more often; higher values wait longer and add end-of-turn latency.",
|
|
247
|
+
),
|
|
248
|
+
eagerEotThreshold: z
|
|
249
|
+
.number({ error: "liveVoice.flux.eagerEotThreshold must be a number" })
|
|
250
|
+
.min(0.3, "liveVoice.flux.eagerEotThreshold must be >= 0.3")
|
|
251
|
+
.max(0.9, "liveVoice.flux.eagerEotThreshold must be <= 0.9")
|
|
252
|
+
.optional()
|
|
253
|
+
.describe(
|
|
254
|
+
"Confidence at which Flux starts speculating that the turn has ended. Leaving it unset disables Deepgram's EagerEndOfTurn / TurnResumed events; enabling it raises LLM calls 50-70% because speculative turns that resume are thrown away.",
|
|
255
|
+
),
|
|
256
|
+
eotTimeoutMs: z
|
|
257
|
+
.number({ error: "liveVoice.flux.eotTimeoutMs must be a number" })
|
|
258
|
+
.int("liveVoice.flux.eotTimeoutMs must be an integer")
|
|
259
|
+
.min(500, "liveVoice.flux.eotTimeoutMs must be >= 500")
|
|
260
|
+
.max(60_000, "liveVoice.flux.eotTimeoutMs must be <= 60000")
|
|
261
|
+
.default(5_000)
|
|
262
|
+
.describe(
|
|
263
|
+
"Silence (ms) after which Flux force-ends the turn even though its end-of-turn confidence never reached eotThreshold",
|
|
264
|
+
),
|
|
265
|
+
})
|
|
266
|
+
.describe(
|
|
267
|
+
"Deepgram Flux turn-detection tuning for live voice sessions (model-integrated end-of-turn)",
|
|
213
268
|
);
|
|
214
269
|
|
|
215
270
|
export const LiveVoiceConfigSchema = z
|
|
@@ -226,6 +281,9 @@ export const LiveVoiceConfigSchema = z
|
|
|
226
281
|
frontModel: LiveVoiceFrontModelConfigSchema.default(
|
|
227
282
|
LiveVoiceFrontModelConfigSchema.parse({}),
|
|
228
283
|
),
|
|
284
|
+
flux: LiveVoiceFluxConfigSchema.default(
|
|
285
|
+
LiveVoiceFluxConfigSchema.parse({}),
|
|
286
|
+
),
|
|
229
287
|
maxSessionDurationSeconds: z
|
|
230
288
|
.number({
|
|
231
289
|
error: "liveVoice.maxSessionDurationSeconds must be a number",
|
|
@@ -255,3 +313,4 @@ export type LiveVoiceFrontModelConfig = z.infer<
|
|
|
255
313
|
export type LiveVoiceProgressConfig = z.infer<
|
|
256
314
|
typeof LiveVoiceProgressConfigSchema
|
|
257
315
|
>;
|
|
316
|
+
export type LiveVoiceFluxConfig = z.infer<typeof LiveVoiceFluxConfigSchema>;
|
|
@@ -2,6 +2,28 @@ import { z } from "zod";
|
|
|
2
2
|
|
|
3
3
|
export const MemoryRetrospectiveConfigSchema = z
|
|
4
4
|
.object({
|
|
5
|
+
// This kill switch exists only because conversation forking is expensive:
|
|
6
|
+
// a fork full-copies the source conversation (messages + attachments), so
|
|
7
|
+
// on a large conversation the retrospective's write burst can lock the
|
|
8
|
+
// SQLite table against other writers. Until forking is referential, an
|
|
9
|
+
// operator needs a way to stop retrospectives without turning off memory.
|
|
10
|
+
enabled: z
|
|
11
|
+
.boolean({ error: "memory.retrospective.enabled must be a boolean" })
|
|
12
|
+
.default(true)
|
|
13
|
+
.describe(
|
|
14
|
+
"Whether the memory-retrospective background pass runs. When false, no retrospective is enqueued by any trigger (interval, message count, pre-compaction, scheduled sweep), the scheduled sweep job stops being queued, and any row already queued completes as a no-op. The rest of the memory system (extraction, retrieval, embeddings, `<memory>` injection) is unaffected. Use `memory.enabled` to disable memory as a whole.",
|
|
15
|
+
),
|
|
16
|
+
|
|
17
|
+
forkStrategy: z
|
|
18
|
+
.enum(["cloning", "reference"], {
|
|
19
|
+
error:
|
|
20
|
+
"memory.retrospective.forkStrategy must be 'cloning' or 'reference'",
|
|
21
|
+
})
|
|
22
|
+
.default("cloning")
|
|
23
|
+
.describe(
|
|
24
|
+
"How a retrospective's fork of the source conversation is materialized. `cloning` (default) full-copies the source conversation's messages and attachments into the fork. `reference` makes the fork referential: it holds only its own messages and reads the source's through `fork_parent_message_id`, so a fork costs a single row instead of a full copy of the conversation.",
|
|
25
|
+
),
|
|
26
|
+
|
|
5
27
|
timeThresholdMs: z
|
|
6
28
|
.number({
|
|
7
29
|
error: "memory.retrospective.timeThresholdMs must be a number",
|
|
@@ -108,3 +130,6 @@ export const MemoryRetrospectiveConfigSchema = z
|
|
|
108
130
|
export type MemoryRetrospectiveConfig = z.infer<
|
|
109
131
|
typeof MemoryRetrospectiveConfigSchema
|
|
110
132
|
>;
|
|
133
|
+
|
|
134
|
+
/** How a retrospective materializes its fork of the source conversation. */
|
|
135
|
+
export type MemoryForkStrategy = MemoryRetrospectiveConfig["forkStrategy"];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Unattended plugin upgrade configuration.
|
|
5
|
+
*
|
|
6
|
+
* The resource monitor process runs a periodic sweep (see
|
|
7
|
+
* `monitoring/plugin-auto-update.ts`) that moves every installed, enabled
|
|
8
|
+
* marketplace plugin to the catalog's current pin. The sweep is off by default:
|
|
9
|
+
* `mode: "manual"` means nothing upgrades unless a human runs
|
|
10
|
+
* `assistant plugins upgrade <name>` (or the equivalent route), which is the
|
|
11
|
+
* behavior every workspace had before this block existed. Setting
|
|
12
|
+
* `mode: "auto"` opts the workspace into the hourly sweep.
|
|
13
|
+
*
|
|
14
|
+
* Opting in never covers plugins installed straight from a GitHub URL. Those
|
|
15
|
+
* track a mutable ref rather than a reviewed pin, so the sweep leaves them to
|
|
16
|
+
* an explicit `assistant plugins upgrade`.
|
|
17
|
+
*/
|
|
18
|
+
export const PluginUpdatesConfigSchema = z
|
|
19
|
+
.object({
|
|
20
|
+
mode: z
|
|
21
|
+
.enum(["manual", "auto"], {
|
|
22
|
+
error: 'pluginUpdates.mode must be "manual" or "auto"',
|
|
23
|
+
})
|
|
24
|
+
.default("manual")
|
|
25
|
+
.describe(
|
|
26
|
+
'How installed plugins move to newer revisions. "manual" (default) never upgrades on its own: upgrades happen only when a human asks for one. "auto" lets the resource monitor upgrade every installed, enabled marketplace plugin on the `checkIntervalMs` cadence. Plugins installed directly from a GitHub URL are never upgraded automatically, since they track a mutable ref instead of a reviewed pin.',
|
|
27
|
+
),
|
|
28
|
+
strategy: z
|
|
29
|
+
// Deliberately narrower than the full `PluginUpgradeStrategy` union: the
|
|
30
|
+
// `assistant` strategy resolves conflicts by writing git conflict
|
|
31
|
+
// markers into the plugin's files and expecting someone to resolve
|
|
32
|
+
// them. Unattended, that would leave a syntactically broken plugin on
|
|
33
|
+
// disk with nobody in the loop, so it is not selectable here. It stays
|
|
34
|
+
// available for interactive `assistant plugins upgrade --strategy
|
|
35
|
+
// assistant`.
|
|
36
|
+
.enum(["theirs", "ours", "overwrite"], {
|
|
37
|
+
error:
|
|
38
|
+
'pluginUpdates.strategy must be "theirs", "ours", or "overwrite"',
|
|
39
|
+
})
|
|
40
|
+
.default("theirs")
|
|
41
|
+
.describe(
|
|
42
|
+
'How an automatic upgrade reconciles local edits to a plugin with the incoming revision. "theirs" (default) three-way merges and resolves conflicting hunks toward the incoming revision, keeping non-conflicting local edits; "ours" merges the same way but resolves conflicts toward the local edit; "overwrite" discards local edits and re-installs the revision wholesale. Only consulted when `mode` is "auto".',
|
|
43
|
+
),
|
|
44
|
+
checkIntervalMs: z
|
|
45
|
+
.number({ error: "pluginUpdates.checkIntervalMs must be a number" })
|
|
46
|
+
.int("pluginUpdates.checkIntervalMs must be an integer")
|
|
47
|
+
.min(300_000, "pluginUpdates.checkIntervalMs must be at least 300000ms")
|
|
48
|
+
.max(
|
|
49
|
+
604_800_000,
|
|
50
|
+
"pluginUpdates.checkIntervalMs must be <= 604800000ms (7 days)",
|
|
51
|
+
)
|
|
52
|
+
.default(3_600_000)
|
|
53
|
+
.describe(
|
|
54
|
+
'Minimum interval between automatic upgrade sweeps, in milliseconds (default 1 hour). The last sweep is stamped on disk, so restarting the daemon does not re-run a sweep that already ran within the interval. Only consulted when `mode` is "auto".',
|
|
55
|
+
),
|
|
56
|
+
})
|
|
57
|
+
.describe("Unattended plugin upgrade configuration");
|
|
58
|
+
|
|
59
|
+
export type PluginUpdatesConfig = z.infer<typeof PluginUpdatesConfigSchema>;
|
|
@@ -139,10 +139,14 @@ export const ServicesSchema = z.object({
|
|
|
139
139
|
WebSearchServiceSchema.parse({}),
|
|
140
140
|
),
|
|
141
141
|
"web-fetch": WebFetchServiceSchema.default(WebFetchServiceSchema.parse({})),
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
142
|
+
// Parsed rather than handed a literal, like every sibling here: a literal
|
|
143
|
+
// default short-circuits the inner parse, so field-level defaults inside
|
|
144
|
+
// the block (the multilingual `language`) would never materialize for a
|
|
145
|
+
// config that omits `services.stt` entirely, which is every fresh
|
|
146
|
+
// workspace.
|
|
147
|
+
stt: SttServiceSchema.default(
|
|
148
|
+
SttServiceSchema.parse({ provider: "deepgram", providers: {} }),
|
|
149
|
+
),
|
|
146
150
|
tts: TtsServiceSchema.default(TtsServiceSchema.parse({})),
|
|
147
151
|
"google-oauth": GoogleOAuthServiceSchema.default(
|
|
148
152
|
GoogleOAuthServiceSchema.parse({}),
|
|
@@ -6,6 +6,7 @@ import { z } from "zod";
|
|
|
6
6
|
*/
|
|
7
7
|
export const VALID_STT_PROVIDERS = [
|
|
8
8
|
"deepgram",
|
|
9
|
+
"deepgram-flux",
|
|
9
10
|
"google-gemini",
|
|
10
11
|
"openai-whisper",
|
|
11
12
|
"xai",
|
|
@@ -67,22 +68,34 @@ export const SttServiceSchema = z
|
|
|
67
68
|
.describe("Active STT provider used for speech-to-text transcription"),
|
|
68
69
|
/**
|
|
69
70
|
* Spoken-language selection, forwarded to providers whose adapters accept
|
|
70
|
-
* a language (Deepgram, xAI, and the managed relay).
|
|
71
|
-
* provider applies its own default, which for Deepgram (and therefore
|
|
72
|
-
* for the managed relay) is English, NOT auto-detection.
|
|
71
|
+
* a language (Deepgram, xAI, and the managed relay).
|
|
73
72
|
*
|
|
74
73
|
* `"multi"` selects Deepgram's nova-3 code-switching mode, which follows
|
|
75
74
|
* a speaker moving between languages inside a single utterance (e.g.
|
|
76
75
|
* Hinglish). Providers that auto-detect natively and take no language
|
|
77
76
|
* option (Gemini, Whisper) ignore this field.
|
|
77
|
+
*
|
|
78
|
+
* Defaults to `"multi"` rather than staying unset, so there is no state
|
|
79
|
+
* where the answer to "what language is this assistant listening for"
|
|
80
|
+
* has to be inferred. Every config carries the answer, and the settings
|
|
81
|
+
* surfaces render a real selection rather than a sentinel standing in
|
|
82
|
+
* for one.
|
|
83
|
+
*
|
|
84
|
+
* The default applies on load, not just at creation, so an existing
|
|
85
|
+
* config that never set a language materializes `"multi"` on its next
|
|
86
|
+
* start. That changes no behavior: `effectiveSttLanguage` already
|
|
87
|
+
* resolved unset to `"multi"` on Deepgram and the managed relay, and the
|
|
88
|
+
* providers that detect natively ignore the field either way. It only
|
|
89
|
+
* makes the value explicit. An assistant that has chosen a language
|
|
90
|
+
* keeps it, since a default fills nothing that is already set.
|
|
78
91
|
*/
|
|
79
92
|
language: z
|
|
80
93
|
.string({ error: "services.stt.language must be a string" })
|
|
81
94
|
.trim()
|
|
82
95
|
.min(1, { error: "services.stt.language must not be empty" })
|
|
83
|
-
.
|
|
96
|
+
.default("multi")
|
|
84
97
|
.describe(
|
|
85
|
-
"BCP-47 language code (e.g. 'en-US', 'hi') or 'multi' for code-switching across languages.
|
|
98
|
+
"BCP-47 language code (e.g. 'en-US', 'hi') or 'multi' for code-switching across languages. Defaults to 'multi'; providers that detect natively ignore it",
|
|
86
99
|
),
|
|
87
100
|
providers: SttProvidersSchema.default({}),
|
|
88
101
|
})
|
|
@@ -26,7 +26,7 @@ export const TimeoutConfigSchema = z
|
|
|
26
26
|
.positive("timeouts.permissionTimeoutSec must be a positive number")
|
|
27
27
|
.default(300)
|
|
28
28
|
.describe(
|
|
29
|
-
"How long to wait for
|
|
29
|
+
"How long to wait for a human to approve a tool call before timing out (seconds). Spent by both approval paths: the interactive permission prompt, and the inline wait when a contact's sensitive tool call is escalated to the guardian.",
|
|
30
30
|
),
|
|
31
31
|
questionResponseTimeoutSec: z
|
|
32
32
|
.number({ error: "timeouts.questionResponseTimeoutSec must be a number" })
|