@vellumai/assistant 0.6.2 → 0.6.4
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 +273 -10
- package/Dockerfile +2 -3
- package/bun.lock +41 -49
- package/bunfig.toml +3 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/backup-troubleshooting.md +52 -0
- package/docs/browser-use-architecture-phase2.md +174 -0
- package/docs/stt-provider-onboarding.md +120 -0
- package/knip.json +12 -2
- package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
- package/node_modules/@vellumai/ces-contracts/package.json +3 -3
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +42 -0
- package/openapi.yaml +1111 -86
- package/package.json +40 -42
- package/scripts/generate-openapi.ts +0 -2
- package/scripts/test.sh +73 -18
- package/src/__tests__/acp-session.test.ts +43 -0
- package/src/__tests__/agent-image-optimize.test.ts +28 -0
- package/src/__tests__/agent-loop.test.ts +123 -0
- package/src/__tests__/anthropic-provider.test.ts +263 -10
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +1 -0
- package/src/__tests__/app-source-watcher.test.ts +37 -11
- package/src/__tests__/approval-routes-http.test.ts +178 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +550 -0
- package/src/__tests__/auto-analysis-prompt.test.ts +50 -0
- package/src/__tests__/browser-fill-credential.test.ts +240 -94
- package/src/__tests__/browser-manager.test.ts +40 -27
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/browser-skill-endstate.test.ts +31 -7
- package/src/__tests__/btw-routes.test.ts +7 -0
- package/src/__tests__/call-controller.test.ts +581 -20
- package/src/__tests__/catalog-files.test.ts +1000 -0
- package/src/__tests__/channel-approvals.test.ts +53 -0
- package/src/__tests__/channel-invite-transport.test.ts +2 -2
- package/src/__tests__/channel-readiness-routes.test.ts +16 -20
- package/src/__tests__/channel-readiness-service.test.ts +12 -7
- package/src/__tests__/checker.test.ts +157 -10
- package/src/__tests__/clawhub-files.test.ts +347 -0
- package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
- package/src/__tests__/config-analysis.test.ts +100 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +326 -0
- package/src/__tests__/config-schema-cmd.test.ts +2 -2
- package/src/__tests__/config-schema.test.ts +1248 -224
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +43 -8
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +23 -0
- package/src/__tests__/contact-store-user-file.test.ts +512 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- package/src/__tests__/context-overflow-approval.test.ts +16 -1
- package/src/__tests__/context-window-manager.test.ts +88 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop.test.ts +99 -3
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -2
- package/src/__tests__/conversation-attachments.test.ts +80 -4
- package/src/__tests__/conversation-confirmation-signals.test.ts +290 -0
- package/src/__tests__/conversation-error.test.ts +70 -0
- package/src/__tests__/conversation-fork-crud.test.ts +17 -0
- package/src/__tests__/conversation-history-web-search.test.ts +12 -4
- package/src/__tests__/conversation-host-access-routes.test.ts +229 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
- package/src/__tests__/conversation-inject-context.test.ts +103 -0
- package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
- package/src/__tests__/conversation-list-source.test.ts +145 -0
- package/src/__tests__/conversation-pre-run-repair.test.ts +2 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
- package/src/__tests__/conversation-queue.test.ts +946 -62
- package/src/__tests__/conversation-routes-disk-view.test.ts +275 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +16 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +324 -46
- package/src/__tests__/conversation-skill-tools.test.ts +7 -4
- package/src/__tests__/conversation-slash-commands.test.ts +33 -0
- package/src/__tests__/conversation-slash-queue.test.ts +89 -18
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
- package/src/__tests__/conversation-starter-routes.test.ts +126 -0
- package/src/__tests__/conversation-starters-cadence.test.ts +161 -0
- package/src/__tests__/conversation-store.test.ts +195 -0
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +193 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
- package/src/__tests__/credential-execution-approval-bridge.test.ts +32 -1
- package/src/__tests__/credential-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +6 -3
- package/src/__tests__/credential-vault-unit.test.ts +383 -7
- package/src/__tests__/credential-vault.test.ts +152 -13
- package/src/__tests__/credentials-cli.test.ts +42 -18
- package/src/__tests__/cross-provider-web-search.test.ts +146 -35
- package/src/__tests__/date-context.test.ts +4 -4
- package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
- package/src/__tests__/device-id.test.ts +112 -0
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +167 -4
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +1 -3
- package/src/__tests__/email-html-renderer.test.ts +71 -0
- package/src/__tests__/email-invite-adapter.test.ts +36 -32
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +256 -0
- package/src/__tests__/emit-event-signal.test.ts +71 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +222 -0
- package/src/__tests__/fixtures/mock-chrome-extension.ts +386 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
- package/src/__tests__/gateway-only-guard.test.ts +2 -0
- package/src/__tests__/gemini-provider.test.ts +66 -2
- package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
- package/src/__tests__/gmail-archive-fallback.test.ts +193 -0
- package/src/__tests__/gmail-archive-gate.test.ts +246 -0
- package/src/__tests__/gmail-preferences.test.ts +117 -0
- package/src/__tests__/guardian-routing-invariants.test.ts +70 -2
- package/src/__tests__/headless-browser-interactions.test.ts +738 -359
- package/src/__tests__/headless-browser-mode.test.ts +614 -0
- package/src/__tests__/headless-browser-navigate.test.ts +528 -49
- package/src/__tests__/headless-browser-read-tools.test.ts +274 -100
- package/src/__tests__/headless-browser-snapshot.test.ts +250 -77
- package/src/__tests__/heartbeat-service.test.ts +70 -17
- package/src/__tests__/home-state-routes.test.ts +162 -0
- package/src/__tests__/host-bash-proxy.test.ts +145 -1
- package/src/__tests__/host-browser-e2e-cloud.test.ts +596 -0
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +286 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +374 -0
- package/src/__tests__/host-browser-event-routes.test.ts +350 -0
- package/src/__tests__/host-browser-proxy.test.ts +444 -0
- package/src/__tests__/host-browser-routes.test.ts +198 -0
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +423 -0
- package/src/__tests__/host-cu-proxy.test.ts +166 -1
- package/src/__tests__/host-file-proxy.test.ts +185 -1
- package/src/__tests__/host-file-read-tool.test.ts +52 -0
- package/src/__tests__/host-proxy-interface.test.ts +165 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -11
- package/src/__tests__/http-user-message-parity.test.ts +1 -0
- package/src/__tests__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/integration-status.test.ts +6 -7
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +37 -12
- package/src/__tests__/llm-context-normalization.test.ts +488 -0
- package/src/__tests__/llm-context-route-provider.test.ts +86 -5
- package/src/__tests__/llm-usage-store.test.ts +363 -0
- package/src/__tests__/mcp-client-auth.test.ts +40 -4
- package/src/__tests__/mcp-health-check.test.ts +10 -3
- package/src/__tests__/media-stream-output.test.ts +555 -0
- package/src/__tests__/media-stream-parser.test.ts +374 -0
- package/src/__tests__/media-stream-server-integration.test.ts +1234 -0
- package/src/__tests__/media-stream-stt-session.test.ts +588 -0
- package/src/__tests__/media-turn-detector.test.ts +440 -0
- package/src/__tests__/message-queue.test.ts +125 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +3 -1
- package/src/__tests__/migration-export-http.test.ts +67 -8
- package/src/__tests__/migration-export-streaming.test.ts +66 -0
- package/src/__tests__/migration-import-commit-http.test.ts +109 -7
- package/src/__tests__/migration-import-preflight-http.test.ts +6 -5
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +151 -0
- package/src/__tests__/model-intents.test.ts +2 -2
- package/src/__tests__/native-host-marker-sync-guard.test.ts +157 -0
- package/src/__tests__/oauth-apps-routes.test.ts +18 -12
- package/src/__tests__/oauth-cli.test.ts +709 -60
- package/src/__tests__/oauth-connect-orchestrator.test.ts +118 -24
- package/src/__tests__/oauth-provider-seed-logos.test.ts +23 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +147 -10
- package/src/__tests__/oauth-provider-visibility.test.ts +19 -21
- package/src/__tests__/oauth-providers-routes.test.ts +52 -14
- package/src/__tests__/oauth-store.test.ts +1465 -176
- package/src/__tests__/oauth2-gateway-transport.test.ts +460 -26
- package/src/__tests__/onboarding-template-contract.test.ts +81 -70
- package/src/__tests__/openai-provider.test.ts +178 -2
- package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
- package/src/__tests__/openai-responses-provider.test.ts +1105 -0
- package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
- package/src/__tests__/outlook-categories.test.ts +1 -1
- package/src/__tests__/outlook-client-automation.test.ts +1 -1
- package/src/__tests__/outlook-compose-tools.test.ts +1 -1
- package/src/__tests__/outlook-email-watcher.test.ts +1 -1
- package/src/__tests__/outlook-follow-up.test.ts +1 -1
- package/src/__tests__/outlook-messaging-provider.test.ts +2 -2
- package/src/__tests__/outlook-trash.test.ts +1 -1
- package/src/__tests__/outlook-unsubscribe.test.ts +32 -3
- package/src/__tests__/permission-checker-host-gate.test.ts +74 -14
- package/src/__tests__/permission-mode.test.ts +28 -56
- package/src/__tests__/persona-resolver.test.ts +251 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
- package/src/__tests__/platform-callback-registration.test.ts +19 -0
- package/src/__tests__/platform.test.ts +92 -1
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +343 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
- package/src/__tests__/pricing.test.ts +174 -0
- package/src/__tests__/proxy-approval-callback.test.ts +18 -0
- package/src/__tests__/qdrant-manager.test.ts +29 -8
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +194 -0
- package/src/__tests__/relationship-state-contract.test.ts +175 -0
- package/src/__tests__/relay-server.test.ts +423 -5
- package/src/__tests__/require-fresh-approval.test.ts +40 -1
- package/src/__tests__/sanitize-config-for-transfer.test.ts +132 -0
- package/src/__tests__/schedule-routes.test.ts +162 -0
- package/src/__tests__/search-skills-unified.test.ts +118 -0
- package/src/__tests__/secret-detection-handler.test.ts +84 -0
- package/src/__tests__/secret-ingress-http.test.ts +1 -0
- package/src/__tests__/secret-scanner-executor.test.ts +4 -0
- package/src/__tests__/secure-keys.test.ts +107 -0
- package/src/__tests__/send-endpoint-busy.test.ts +8 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +49 -0
- package/src/__tests__/set-permission-mode.test.ts +13 -250
- package/src/__tests__/settings-routes.test.ts +201 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +801 -0
- package/src/__tests__/skills-files-catalog-fallback.test.ts +738 -0
- package/src/__tests__/skills.test.ts +5 -2
- package/src/__tests__/skillssh-files.test.ts +446 -0
- package/src/__tests__/slack-block-formatting.test.ts +110 -0
- package/src/__tests__/slack-channel-config.test.ts +576 -16
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -0
- package/src/__tests__/subagent-detail.test.ts +44 -2
- package/src/__tests__/subagent-disposal.test.ts +1 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +291 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +384 -0
- package/src/__tests__/subagent-manager-notify.test.ts +1 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +411 -0
- package/src/__tests__/subagent-tools.test.ts +1 -0
- package/src/__tests__/subagent-types.test.ts +1 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +27 -71
- package/src/__tests__/system-prompt.test.ts +184 -27
- package/src/__tests__/task-scheduler.test.ts +32 -6
- package/src/__tests__/telegram-config.test.ts +10 -13
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +25 -5
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
- package/src/__tests__/tool-approval-handler.test.ts +73 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +9 -5
- package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +33 -24
- package/src/__tests__/tool-result-truncation.test.ts +36 -0
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +22 -0
- package/src/__tests__/top-level-renderer.test.ts +73 -1
- package/src/__tests__/transport-hints-queue.test.ts +14 -29
- package/src/__tests__/trust-store.test.ts +7 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +109 -0
- package/src/__tests__/tts-catalog-parity.test.ts +345 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +512 -114
- package/src/__tests__/twilio-routes.test.ts +376 -0
- package/src/__tests__/unicode.test.ts +293 -0
- package/src/__tests__/update-bulletin-format.test.ts +59 -0
- package/src/__tests__/update-bulletin.test.ts +206 -5
- package/src/__tests__/usage-routes.test.ts +25 -4
- package/src/__tests__/user-reference.test.ts +46 -61
- package/src/__tests__/v2-consent-policy.test.ts +103 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -0
- package/src/__tests__/voice-config-update.test.ts +403 -0
- package/src/__tests__/voice-quality.test.ts +434 -19
- package/src/__tests__/workspace-heartbeat-service.test.ts +7 -0
- package/src/__tests__/workspace-migration-033-stt-service-explicit-config.test.ts +547 -0
- package/src/__tests__/workspace-migration-034-remove-calls-voice-transcription-provider.test.ts +596 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +368 -0
- package/src/__tests__/workspace-migration-meets.test.ts +244 -0
- package/src/__tests__/workspace-migration-seed-device-id.test.ts +14 -20
- package/src/__tests__/workspace-policy.test.ts +2 -0
- package/src/acp/client-handler.ts +30 -4
- package/src/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +55 -9
- package/src/approvals/guardian-request-resolvers.ts +21 -15
- package/src/backup/__tests__/backup-key.test.ts +152 -0
- package/src/backup/__tests__/backup-worker.test.ts +767 -0
- package/src/backup/__tests__/list-snapshots.test.ts +87 -0
- package/src/backup/__tests__/local-writer.test.ts +218 -0
- package/src/backup/__tests__/offsite-writer.test.ts +641 -0
- package/src/backup/__tests__/paths.test.ts +300 -0
- package/src/backup/__tests__/restore.test.ts +498 -0
- package/src/backup/__tests__/snapshot-lock.test.ts +352 -0
- package/src/backup/__tests__/stream-crypt.test.ts +228 -0
- package/src/backup/backup-key.ts +137 -0
- package/src/backup/backup-worker.ts +459 -0
- package/src/backup/list-snapshots.ts +147 -0
- package/src/backup/local-writer.ts +133 -0
- package/src/backup/offsite-writer.ts +222 -0
- package/src/backup/paths.ts +226 -0
- package/src/backup/restore.ts +322 -0
- package/src/backup/snapshot-lock.ts +431 -0
- package/src/backup/stream-crypt.ts +263 -0
- package/src/browser-session/__tests__/manager.test.ts +297 -0
- package/src/browser-session/backends/cdp-inspect.ts +30 -0
- package/src/browser-session/backends/extension.ts +26 -0
- package/src/browser-session/backends/local.ts +24 -0
- package/src/browser-session/events.ts +164 -0
- package/src/browser-session/index.ts +27 -0
- package/src/browser-session/manager.ts +159 -0
- package/src/browser-session/types.ts +28 -0
- package/src/bundler/package-resolver.ts +4 -0
- package/src/calls/audio-store.ts +11 -5
- package/src/calls/call-controller.ts +226 -71
- package/src/calls/call-domain.ts +9 -0
- package/src/calls/call-speech-output.ts +190 -0
- package/src/calls/call-transport.ts +77 -0
- package/src/calls/media-stream-audio-transcode.ts +173 -0
- package/src/calls/media-stream-output.ts +660 -0
- package/src/calls/media-stream-parser.ts +300 -0
- package/src/calls/media-stream-protocol.ts +166 -0
- package/src/calls/media-stream-server.ts +592 -0
- package/src/calls/media-stream-stt-session.ts +460 -0
- package/src/calls/media-turn-detector.ts +230 -0
- package/src/calls/relay-server.ts +90 -75
- package/src/calls/resolve-call-tts-provider.ts +136 -0
- package/src/calls/telephony-stt-routing.ts +145 -0
- package/src/calls/tts-call-strategy.ts +161 -0
- package/src/calls/tts-text-sanitizer.ts +32 -16
- package/src/calls/twilio-routes.ts +281 -17
- package/src/calls/voice-quality.ts +78 -35
- package/src/calls/voice-session-bridge.ts +8 -1
- package/src/channels/__tests__/types.test.ts +134 -0
- package/src/channels/types.ts +69 -3
- package/src/cli/__tests__/run-assistant-command.ts +11 -1
- package/src/cli/commands/__tests__/backup.test.ts +1165 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +234 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +132 -0
- package/src/cli/commands/__tests__/email-attachment.test.ts +422 -0
- package/src/cli/commands/__tests__/email-download.test.ts +16 -1
- package/src/cli/commands/__tests__/email-list.test.ts +22 -4
- package/src/cli/commands/__tests__/email-register.test.ts +4 -4
- package/src/cli/commands/__tests__/email-send.test.ts +37 -4
- package/src/cli/commands/__tests__/email-status.test.ts +5 -1
- package/src/cli/commands/__tests__/email-unregister.test.ts +34 -5
- package/src/cli/commands/backup.ts +993 -0
- package/src/cli/commands/conversations.ts +77 -0
- package/src/cli/commands/credentials.ts +3 -4
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +273 -16
- package/src/cli/commands/mcp.ts +16 -4
- package/src/cli/commands/oauth/__tests__/connect.test.ts +56 -44
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +21 -21
- package/src/cli/commands/oauth/__tests__/mode.test.ts +17 -17
- package/src/cli/commands/oauth/__tests__/ping.test.ts +16 -16
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +32 -33
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +330 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +117 -12
- package/src/cli/commands/oauth/__tests__/status.test.ts +10 -10
- package/src/cli/commands/oauth/__tests__/token.test.ts +7 -7
- package/src/cli/commands/oauth/apps.ts +7 -4
- package/src/cli/commands/oauth/connect.ts +6 -3
- package/src/cli/commands/oauth/disconnect.ts +1 -1
- package/src/cli/commands/oauth/mode.ts +12 -3
- package/src/cli/commands/oauth/providers.ts +215 -36
- package/src/cli/commands/oauth/shared.ts +7 -6
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +254 -0
- package/src/cli/commands/platform/__tests__/connect.test.ts +6 -0
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +6 -0
- package/src/cli/commands/platform/index.ts +107 -10
- package/src/cli/commands/usage.ts +10 -9
- package/src/cli/lib/daemon-credential-client.ts +4 -0
- package/src/cli/program.ts +30 -4
- package/src/config/__tests__/backup-schema.test.ts +134 -0
- package/src/config/assistant-feature-flags.ts +61 -62
- package/src/config/bundled-skills/app-builder/SKILL.md +26 -249
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +141 -0
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +56 -0
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +125 -0
- package/src/config/bundled-skills/browser/SKILL.md +30 -5
- package/src/config/bundled-skills/browser/TOOLS.json +123 -0
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-status.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +17 -0
- package/src/config/bundled-skills/contacts/SKILL.md +5 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -0
- package/src/config/bundled-skills/gmail/SKILL.md +54 -8
- package/src/config/bundled-skills/gmail/TOOLS.json +33 -3
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +116 -9
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +138 -11
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +59 -0
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +82 -0
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +113 -17
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/media-processing/SKILL.md +3 -9
- package/src/config/bundled-skills/media-processing/TOOLS.json +1 -6
- package/src/config/bundled-skills/media-processing/__tests__/audio-transcribe.test.ts +125 -0
- package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +181 -0
- package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +141 -0
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +32 -87
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +8 -4
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +0 -10
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
- package/src/config/bundled-skills/outlook/SKILL.md +9 -2
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +27 -18
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +26 -22
- package/src/config/bundled-skills/slack/SKILL.md +1 -0
- package/src/config/bundled-skills/subagent/SKILL.md +21 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +8 -4
- package/src/config/bundled-skills/tasks/SKILL.md +5 -0
- package/src/config/bundled-skills/transcribe/SKILL.md +9 -14
- package/src/config/bundled-skills/transcribe/TOOLS.json +2 -7
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +256 -0
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +38 -188
- package/src/config/bundled-tool-registry.ts +8 -0
- package/src/config/env-registry.ts +38 -0
- package/src/config/env.ts +49 -4
- package/src/config/feature-flag-registry.json +85 -14
- package/src/config/loader.ts +82 -13
- package/src/config/sanitize-for-transfer.ts +47 -0
- package/src/config/schema.ts +81 -15
- package/src/config/schemas/__tests__/stt.test.ts +43 -0
- package/src/config/schemas/analysis.ts +51 -0
- package/src/config/schemas/backup.ts +72 -0
- package/src/config/schemas/calls.ts +1 -26
- package/src/config/schemas/elevenlabs.ts +0 -59
- package/src/config/schemas/filing.ts +47 -7
- package/src/config/schemas/heartbeat.ts +27 -5
- package/src/config/schemas/host-browser.ts +112 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- package/src/config/schemas/memory-retrieval.ts +103 -0
- package/src/config/schemas/security.ts +0 -6
- package/src/config/schemas/services.ts +52 -0
- package/src/config/schemas/stt.ts +59 -0
- package/src/config/schemas/tts.ts +230 -0
- package/src/config/schemas/updates.ts +14 -0
- package/src/config/skills.ts +4 -0
- package/src/config/types.ts +4 -1
- package/src/contacts/contact-store.ts +56 -11
- package/src/contacts/contacts-write.ts +38 -1
- package/src/context/post-turn-tool-result-truncation.ts +177 -0
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +61 -10
- package/src/credential-execution/approval-bridge.ts +49 -15
- package/src/credential-execution/executable-discovery.ts +12 -2
- package/src/credential-execution/process-manager.ts +33 -2
- package/src/credential-health/credential-health-service.ts +366 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +324 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +497 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +195 -0
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
- package/src/daemon/app-source-watcher.ts +35 -0
- package/src/daemon/config-watcher.ts +99 -5
- package/src/daemon/context-overflow-approval.ts +5 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +23 -2
- package/src/daemon/conversation-agent-loop.ts +153 -42
- package/src/daemon/conversation-attachments.ts +40 -0
- package/src/daemon/conversation-error.ts +11 -0
- package/src/daemon/conversation-history.ts +40 -6
- package/src/daemon/conversation-launch.ts +220 -0
- package/src/daemon/conversation-lifecycle.ts +59 -9
- package/src/daemon/conversation-messaging.ts +37 -3
- package/src/daemon/conversation-notifiers.ts +5 -0
- package/src/daemon/conversation-process.ts +622 -13
- package/src/daemon/conversation-queue-manager.ts +24 -0
- package/src/daemon/conversation-runtime-assembly.ts +128 -36
- package/src/daemon/conversation-slash.ts +36 -0
- package/src/daemon/conversation-surfaces.ts +131 -40
- package/src/daemon/conversation-tool-setup.ts +99 -8
- package/src/daemon/conversation-usage.ts +7 -4
- package/src/daemon/conversation-workspace.ts +12 -0
- package/src/daemon/conversation.ts +292 -16
- package/src/daemon/date-context.ts +10 -10
- package/src/daemon/first-greeting.ts +3 -2
- package/src/daemon/handlers/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +13 -141
- package/src/daemon/handlers/shared.ts +80 -0
- package/src/daemon/handlers/skills.ts +483 -44
- package/src/daemon/host-bash-proxy.ts +48 -13
- package/src/daemon/host-browser-proxy.ts +192 -0
- package/src/daemon/host-cu-proxy.ts +36 -11
- package/src/daemon/host-file-proxy.ts +57 -9
- package/src/daemon/lifecycle.ts +179 -28
- package/src/daemon/message-protocol.ts +13 -0
- package/src/daemon/message-types/conversations.ts +89 -14
- package/src/daemon/message-types/home.ts +40 -0
- package/src/daemon/message-types/host-browser.ts +100 -0
- package/src/daemon/message-types/meet.ts +143 -0
- package/src/daemon/message-types/messages.ts +19 -5
- package/src/daemon/message-types/schedules.ts +34 -2
- package/src/daemon/message-types/skills.ts +26 -0
- package/src/daemon/message-types/subagents.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/server.ts +439 -14
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +15 -0
- package/src/daemon/transport-hints.ts +5 -24
- package/src/email/html-renderer.ts +76 -0
- package/src/heartbeat/heartbeat-service.ts +93 -7
- package/src/home/__tests__/assistant-feed-authoring.test.ts +156 -0
- package/src/home/__tests__/emit-feed-event.test.ts +169 -0
- package/src/home/__tests__/feed-scheduler.test.ts +194 -0
- package/src/home/__tests__/feed-types.test.ts +275 -0
- package/src/home/__tests__/feed-writer.test.ts +688 -0
- package/src/home/__tests__/phase5-exit-criteria.test.ts +212 -0
- package/src/home/__tests__/platform-gmail-digest.test.ts +222 -0
- package/src/home/__tests__/progress-formula.test.ts +213 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +740 -0
- package/src/home/__tests__/rollup-producer.test.ts +398 -0
- package/src/home/assistant-feed-authoring.ts +124 -0
- package/src/home/emit-feed-event.ts +158 -0
- package/src/home/feed-scheduler.ts +247 -0
- package/src/home/feed-types.ts +181 -0
- package/src/home/feed-writer.ts +469 -0
- package/src/home/platform-gmail-digest.ts +163 -0
- package/src/home/progress-formula.ts +86 -0
- package/src/home/relationship-state-writer.ts +824 -0
- package/src/home/relationship-state.ts +143 -0
- package/src/home/rollup-producer.ts +384 -0
- package/src/hooks/runner.ts +7 -0
- package/src/inbound/platform-callback-registration.ts +30 -20
- package/src/inbound/public-ingress-urls.ts +12 -0
- package/src/instrument.ts +1 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +200 -0
- package/src/ipc/cli-client.ts +151 -0
- package/src/ipc/cli-server.ts +234 -0
- package/src/ipc/gateway-client.ts +180 -0
- package/src/ipc/routes/index.ts +5 -0
- package/src/ipc/routes/wake-conversation.ts +19 -0
- package/src/mcp/client.ts +59 -24
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +356 -0
- package/src/memory/__tests__/auto-analysis-guard.test.ts +57 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +232 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
- package/src/memory/app-store.ts +31 -1
- package/src/memory/attachments-store.ts +70 -0
- package/src/memory/auto-analysis-enqueue.ts +127 -0
- package/src/memory/auto-analysis-guard.ts +27 -0
- package/src/memory/cleanup-schedule-state.ts +37 -0
- package/src/memory/conversation-analyze-job.ts +73 -0
- package/src/memory/conversation-crud.ts +122 -0
- package/src/memory/conversation-disk-view.ts +7 -0
- package/src/memory/conversation-group-migration.ts +34 -2
- package/src/memory/conversation-queries.ts +6 -5
- package/src/memory/conversation-starters-cadence.ts +76 -0
- package/src/memory/conversation-title-service.ts +5 -2
- package/src/memory/db-init.ts +18 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -0
- package/src/memory/embedding-backend.test.ts +75 -0
- package/src/memory/embedding-backend.ts +131 -5
- package/src/memory/embedding-gemini.test.ts +54 -0
- package/src/memory/embedding-gemini.ts +20 -9
- package/src/memory/embedding-local.ts +176 -17
- package/src/memory/graph/consolidation.ts +10 -23
- package/src/memory/graph/conversation-graph-memory.ts +15 -0
- package/src/memory/graph/extraction-job.ts +15 -0
- package/src/memory/graph/extraction.test.ts +23 -0
- package/src/memory/graph/extraction.ts +8 -0
- package/src/memory/graph/retriever.ts +67 -40
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- package/src/memory/graph/store.test.ts +7 -3
- package/src/memory/graph/store.ts +47 -12
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/group-crud.ts +6 -1
- package/src/memory/indexer.ts +95 -16
- package/src/memory/job-handlers/cleanup.ts +11 -8
- package/src/memory/job-handlers/conversation-starters.ts +16 -10
- package/src/memory/jobs-store.ts +64 -4
- package/src/memory/jobs-worker.ts +22 -9
- package/src/memory/llm-usage-store.ts +137 -60
- package/src/memory/migrations/213-oauth-providers-scope-separator.ts +13 -0
- package/src/memory/migrations/214-oauth-providers-refresh-url.ts +11 -0
- package/src/memory/migrations/215-oauth-providers-revoke.ts +14 -0
- package/src/memory/migrations/216-oauth-providers-token-auth-method.ts +30 -0
- package/src/memory/migrations/217-conversation-host-access.ts +40 -0
- package/src/memory/migrations/218-oauth-providers-logo-url.ts +11 -0
- package/src/memory/migrations/219-oauth-providers-token-exchange-body-format.ts +15 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +190 -0
- package/src/memory/migrations/221-conversations-archived-at.ts +16 -0
- package/src/memory/migrations/index.ts +12 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/qdrant-manager.ts +43 -16
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/oauth.ts +21 -13
- package/src/memory/usage-buckets.ts +396 -0
- package/src/messaging/providers/gmail/client.ts +57 -6
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
- package/src/messaging/providers/slack/adapter.ts +143 -38
- package/src/messaging/providers/slack/client.ts +16 -0
- package/src/messaging/providers/slack/types.ts +4 -0
- package/src/notifications/decision-engine.ts +3 -3
- package/src/notifications/signal.ts +5 -0
- package/src/oauth/AGENTS.md +76 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +25 -19
- package/src/oauth/__tests__/seed-providers-managed.test.ts +32 -0
- package/src/oauth/byo-connection.test.ts +26 -9
- package/src/oauth/byo-connection.ts +10 -8
- package/src/oauth/connect-orchestrator.ts +25 -21
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/connection-resolver.test.ts +17 -4
- package/src/oauth/connection-resolver.ts +22 -18
- package/src/oauth/connection.ts +3 -1
- package/src/oauth/manual-token-connection.ts +13 -13
- package/src/oauth/oauth-store.ts +223 -100
- package/src/oauth/platform-connection.test.ts +101 -3
- package/src/oauth/platform-connection.ts +56 -35
- package/src/oauth/provider-serializer.ts +31 -5
- package/src/oauth/revoke.ts +76 -0
- package/src/oauth/seed-providers.ts +133 -87
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +16 -6
- package/src/permissions/defaults.ts +49 -1
- package/src/permissions/permission-mode.ts +4 -11
- package/src/permissions/prompter.ts +13 -1
- package/src/permissions/trust-store.ts +3 -3
- package/src/permissions/v2-consent-policy.ts +87 -0
- package/src/permissions/workspace-policy.ts +3 -0
- package/src/platform/client.test.ts +10 -0
- package/src/platform/sync-identity.ts +129 -0
- package/src/prompts/persona-resolver.ts +126 -2
- package/src/prompts/system-prompt.ts +76 -38
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +3 -65
- package/src/prompts/templates/BOOTSTRAP.md +59 -105
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/prompts/templates/UPDATES.md +12 -0
- package/src/prompts/templates/channels/slack.md +20 -0
- package/src/prompts/update-bulletin-format.ts +26 -9
- package/src/prompts/update-bulletin.ts +34 -23
- package/src/prompts/user-reference.ts +20 -17
- package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
- package/src/providers/anthropic/client.ts +157 -60
- package/src/providers/fireworks/client.ts +2 -2
- package/src/providers/gemini/client.ts +9 -1
- package/src/providers/model-catalog.ts +6 -0
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/ollama/client.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +474 -0
- package/src/providers/openai/client.ts +25 -440
- package/src/providers/openai/responses-provider.ts +502 -0
- package/src/providers/openrouter/client.ts +101 -4
- package/src/providers/provider-secret-catalog.ts +139 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/retry.ts +14 -3
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +828 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +980 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +767 -0
- package/src/providers/speech-to-text/deepgram.test.ts +332 -0
- package/src/providers/speech-to-text/deepgram.ts +115 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.test.ts +743 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +625 -0
- package/src/providers/speech-to-text/google-gemini.test.ts +226 -0
- package/src/providers/speech-to-text/google-gemini.ts +101 -0
- package/src/providers/speech-to-text/openai-whisper-stream.test.ts +564 -0
- package/src/providers/speech-to-text/openai-whisper-stream.ts +381 -0
- package/src/providers/speech-to-text/openai-whisper.test.ts +1 -37
- package/src/providers/speech-to-text/openai-whisper.ts +63 -33
- package/src/providers/speech-to-text/provider-catalog.ts +306 -0
- package/src/providers/speech-to-text/resolve.ts +386 -6
- package/src/providers/types.ts +10 -1
- package/src/runtime/AGENTS.md +65 -0
- package/src/runtime/__tests__/agent-wake.test.ts +831 -0
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +715 -0
- package/src/runtime/__tests__/capability-tokens.test.ts +258 -0
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +518 -0
- package/src/runtime/__tests__/runtime-mode.test.ts +62 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +481 -0
- package/src/runtime/agent-wake.ts +512 -0
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
- package/src/runtime/auth/__tests__/middleware.test.ts +116 -1
- package/src/runtime/auth/__tests__/route-policy.test.ts +48 -0
- package/src/runtime/auth/middleware.ts +98 -0
- package/src/runtime/auth/route-policy.ts +33 -9
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/capability-tokens.ts +414 -0
- package/src/runtime/channel-approvals.ts +18 -5
- package/src/runtime/channel-invite-transport.ts +1 -1
- package/src/runtime/channel-invite-transports/email.ts +14 -6
- package/src/runtime/channel-readiness-service.ts +12 -22
- package/src/runtime/chrome-extension-registry.ts +368 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +6 -0
- package/src/runtime/guardian-decision-types.ts +7 -0
- package/src/runtime/http-server.ts +815 -75
- package/src/runtime/http-types.ts +6 -2
- package/src/runtime/migrations/__tests__/rebind-secrets-credentials.test.ts +172 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +276 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +198 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
- package/src/runtime/migrations/migration-transport.ts +7 -0
- package/src/runtime/migrations/migration-wizard.ts +23 -2
- package/src/runtime/migrations/rebind-secrets-screen.ts +76 -15
- package/src/runtime/migrations/vbundle-builder.ts +145 -38
- package/src/runtime/migrations/vbundle-import-analyzer.ts +96 -1
- package/src/runtime/migrations/vbundle-importer.ts +89 -5
- package/src/runtime/pending-interactions.ts +18 -13
- package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +507 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +208 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +474 -0
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +148 -17
- package/src/runtime/routes/app-management-routes.ts +12 -18
- package/src/runtime/routes/approval-routes.ts +90 -16
- package/src/runtime/routes/attachment-routes.test.ts +9 -3
- package/src/runtime/routes/attachment-routes.ts +216 -17
- package/src/runtime/routes/backup-routes.ts +519 -0
- package/src/runtime/routes/browser-extension-pair-routes.ts +556 -0
- package/src/runtime/routes/btw-routes.ts +8 -6
- package/src/runtime/routes/contact-routes.test.ts +298 -0
- package/src/runtime/routes/contact-routes.ts +132 -5
- package/src/runtime/routes/conversation-analysis-routes.ts +22 -141
- package/src/runtime/routes/conversation-management-routes.ts +223 -0
- package/src/runtime/routes/conversation-routes.ts +598 -103
- package/src/runtime/routes/conversation-starter-routes.ts +78 -16
- package/src/runtime/routes/filing-routes.ts +93 -0
- package/src/runtime/routes/guardian-action-routes.ts +24 -13
- package/src/runtime/routes/home-feed-routes.ts +334 -0
- package/src/runtime/routes/home-state-routes.ts +138 -0
- package/src/runtime/routes/host-browser-routes.ts +268 -0
- package/src/runtime/routes/host-file-routes.ts +9 -1
- package/src/runtime/routes/identity-intro-cache.ts +7 -3
- package/src/runtime/routes/identity-routes.ts +262 -33
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +46 -39
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +15 -15
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +137 -0
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +179 -0
- package/src/runtime/routes/integrations/slack/channel.ts +11 -3
- package/src/runtime/routes/integrations/slack/share.ts +45 -7
- package/src/runtime/routes/llm-context-normalization.ts +303 -0
- package/src/runtime/routes/log-export-routes.ts +42 -22
- package/src/runtime/routes/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/memory-item-routes.ts +1 -7
- package/src/runtime/routes/migration-routes.ts +122 -2
- package/src/runtime/routes/oauth-apps.ts +15 -17
- package/src/runtime/routes/oauth-providers.ts +4 -0
- package/src/runtime/routes/schedule-routes.ts +24 -11
- package/src/runtime/routes/settings-routes.ts +31 -102
- package/src/runtime/routes/skills-routes.ts +128 -9
- package/src/runtime/routes/stt-routes.ts +233 -0
- package/src/runtime/routes/subagents-routes.ts +14 -10
- package/src/runtime/routes/surface-action-routes.ts +41 -2
- package/src/runtime/routes/tts-routes.ts +108 -24
- package/src/runtime/routes/usage-routes.ts +38 -9
- package/src/runtime/routes/user-route-dispatcher.ts +50 -5
- package/src/runtime/routes/user-routes.ts +13 -1
- package/src/runtime/routes/work-items-routes.ts +8 -1
- package/src/runtime/routes/workspace-routes.test.ts +22 -0
- package/src/runtime/routes/workspace-routes.ts +8 -1
- package/src/runtime/routes/workspace-utils.ts +2 -0
- package/src/runtime/runtime-mode.ts +33 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +444 -0
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +67 -0
- package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +53 -0
- package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +41 -0
- package/src/runtime/services/analyze-conversation.ts +344 -0
- package/src/runtime/services/analyze-deps-singleton.ts +32 -0
- package/src/runtime/services/auto-analysis-prompt.ts +55 -0
- package/src/runtime/skill-route-registry.ts +49 -0
- package/src/runtime/slack-block-formatting.ts +437 -10
- package/src/schedule/scheduler.ts +57 -5
- package/src/security/ces-credential-client.ts +20 -0
- package/src/security/ces-rpc-credential-backend.ts +17 -0
- package/src/security/credential-backend.ts +5 -0
- package/src/security/oauth2.ts +68 -29
- package/src/security/secure-keys.ts +143 -27
- package/src/security/token-manager.ts +31 -10
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-files.ts +554 -0
- package/src/skills/category-inference.ts +122 -0
- package/src/skills/clawhub-files.ts +213 -0
- package/src/skills/clawhub.ts +84 -23
- package/src/skills/skill-file-provider.ts +40 -0
- package/src/skills/skillssh-files.ts +395 -0
- package/src/skills/skillssh-registry.ts +4 -4
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +392 -0
- package/src/stt/__tests__/types.test.ts +89 -0
- package/src/stt/daemon-batch-transcriber.ts +195 -0
- package/src/stt/stt-stream-session.ts +499 -0
- package/src/stt/types.ts +330 -0
- package/src/stt/wav-encoder.test.ts +373 -0
- package/src/stt/wav-encoder.ts +175 -0
- package/src/subagent/manager.ts +169 -40
- package/src/subagent/types.ts +19 -0
- package/src/tools/apps/executors.ts +11 -2
- package/src/tools/browser/__tests__/auth-detector.test.ts +202 -108
- package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +123 -0
- package/src/tools/browser/auth-detector.ts +43 -12
- package/src/tools/browser/browser-execution.ts +1787 -342
- package/src/tools/browser/browser-manager.ts +81 -12
- package/src/tools/browser/browser-mode-constants.ts +12 -0
- package/src/tools/browser/browser-mode.ts +92 -0
- package/src/tools/browser/browser-status-constants.ts +33 -0
- package/src/tools/browser/cdp-client/__tests__/accessibility-snapshot.test.ts +318 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +1175 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1263 -0
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +359 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1993 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-nested-frames.json +64 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-simple.json +69 -0
- package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +310 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +96 -0
- package/src/tools/browser/cdp-client/accessibility-snapshot.ts +387 -0
- package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +695 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +1007 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +580 -0
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +744 -0
- package/src/tools/browser/cdp-client/cdp-inspect/ws-transport.ts +579 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +868 -0
- package/src/tools/browser/cdp-client/errors.ts +49 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +148 -0
- package/src/tools/browser/cdp-client/factory.ts +914 -0
- package/src/tools/browser/cdp-client/index.ts +28 -0
- package/src/tools/browser/cdp-client/local-cdp-client.ts +187 -0
- package/src/tools/browser/cdp-client/types.ts +120 -0
- package/src/tools/credentials/vault.ts +35 -6
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +1 -1
- package/src/tools/host-filesystem/read.ts +12 -15
- package/src/tools/host-filesystem/write.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +21 -16
- package/src/tools/network/web-fetch.ts +5 -2
- package/src/tools/network/web-search.ts +5 -2
- package/src/tools/permission-checker.ts +77 -82
- package/src/tools/registry.ts +0 -2
- package/src/tools/secret-detection-handler.ts +34 -0
- package/src/tools/shared/filesystem/image-read.ts +61 -40
- package/src/tools/shared/shell-output.ts +3 -1
- package/src/tools/side-effects.ts +2 -0
- package/src/tools/skills/sandbox-runner.ts +3 -2
- package/src/tools/subagent/spawn.ts +47 -3
- package/src/tools/subagent/status.ts +2 -0
- package/src/tools/system/register.ts +2 -16
- package/src/tools/terminal/safe-env.ts +15 -0
- package/src/tools/terminal/shell.ts +36 -20
- package/src/tools/tool-approval-handler.ts +48 -2
- package/src/tools/tool-manifest.ts +21 -0
- package/src/tools/types.ts +19 -0
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tts/__tests__/provider-adapters.test.ts +834 -0
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +196 -0
- package/src/tts/__tests__/provider-catalog.test.ts +183 -0
- package/src/tts/__tests__/provider-registry.test.ts +90 -0
- package/src/tts/provider-catalog.ts +201 -0
- package/src/tts/provider-registry.ts +73 -0
- package/src/tts/providers/deepgram-provider.ts +219 -0
- package/src/tts/providers/elevenlabs-provider.ts +211 -0
- package/src/tts/providers/fish-audio-provider.ts +183 -0
- package/src/tts/providers/index.ts +42 -0
- package/src/tts/providers/register-builtins.ts +130 -0
- package/src/tts/synthesize-text.ts +110 -0
- package/src/tts/tts-config-resolver.ts +78 -0
- package/src/tts/types.ts +153 -0
- package/src/types/onboarding-context.ts +7 -0
- package/src/util/abort-reasons.ts +58 -0
- package/src/util/device-id.ts +32 -16
- package/src/util/errors.ts +9 -1
- package/src/util/platform.ts +63 -24
- package/src/util/pricing.ts +66 -3
- package/src/util/spawn.ts +1 -1
- package/src/util/truncate.ts +4 -2
- package/src/util/unicode.ts +201 -0
- package/src/version.ts +19 -24
- package/src/watcher/engine.ts +23 -0
- package/src/watcher/watcher-store.ts +31 -0
- package/src/workspace/migrations/003-seed-device-id.ts +9 -3
- package/src/workspace/migrations/017-seed-persona-dirs.ts +68 -4
- package/src/workspace/migrations/029-seed-pkb.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +317 -0
- package/src/workspace/migrations/031-llm-log-retention-zero-to-null.ts +73 -0
- package/src/workspace/migrations/032-tts-provider-unification.ts +227 -0
- package/src/workspace/migrations/033-stt-service-explicit-config.ts +122 -0
- package/src/workspace/migrations/034-remove-calls-voice-transcription-provider.ts +215 -0
- package/src/workspace/migrations/035-seed-slack-channel-persona.ts +50 -0
- package/src/workspace/migrations/036-update-pkb-index-bar.ts +37 -0
- package/src/workspace/migrations/037-create-meets-dir.ts +61 -0
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/top-level-renderer.ts +31 -1
- package/src/workspace/turn-commit.ts +31 -0
- package/src/__tests__/chrome-cdp.test.ts +0 -419
- package/src/__tests__/email-cli.test.ts +0 -297
- package/src/__tests__/email-service-config-fallback.test.ts +0 -102
- package/src/__tests__/permission-mode-sse.test.ts +0 -418
- package/src/__tests__/permission-mode-store.test.ts +0 -277
- package/src/browser-extension-relay/protocol.ts +0 -63
- package/src/browser-extension-relay/server.ts +0 -203
- package/src/cli/commands/browser-relay.ts +0 -536
- package/src/config/schemas/sandbox.ts +0 -14
- package/src/email/guardrails.ts +0 -221
- package/src/email/provider.ts +0 -117
- package/src/email/providers/agentmail.ts +0 -361
- package/src/email/providers/index.ts +0 -65
- package/src/email/service.ts +0 -384
- package/src/email/types.ts +0 -126
- package/src/permissions/permission-mode-store.ts +0 -180
- package/src/prompts/templates/USER.md +0 -13
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/tools/browser/chrome-cdp.ts +0 -239
- package/src/tools/system/set-permission-mode.ts +0 -103
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider adapter factory map.
|
|
3
|
+
*
|
|
4
|
+
* Maps every canonical {@link TtsProviderId} from the provider catalog to a
|
|
5
|
+
* factory function that creates the corresponding {@link TtsProvider} adapter.
|
|
6
|
+
*
|
|
7
|
+
* This module is the single place to wire a new provider adapter — adding a
|
|
8
|
+
* provider to the catalog without a corresponding factory entry here will
|
|
9
|
+
* cause a startup-time error (enforced by {@link registerBuiltinTtsProviders}).
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { TtsProvider, TtsProviderId } from "../types.js";
|
|
13
|
+
import { createDeepgramProvider } from "./deepgram-provider.js";
|
|
14
|
+
import { createElevenLabsProvider } from "./elevenlabs-provider.js";
|
|
15
|
+
import { createFishAudioProvider } from "./fish-audio-provider.js";
|
|
16
|
+
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Factory type
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* A zero-argument function that constructs a {@link TtsProvider} adapter.
|
|
23
|
+
*/
|
|
24
|
+
export type TtsProviderFactory = () => TtsProvider;
|
|
25
|
+
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Factory map
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Provider adapter factories keyed by catalog provider ID.
|
|
32
|
+
*
|
|
33
|
+
* When a new provider is added to `provider-catalog.ts`, a matching entry
|
|
34
|
+
* must be added here. The built-in registration module iterates the catalog
|
|
35
|
+
* IDs and looks up each one in this map — a missing entry is a fatal error.
|
|
36
|
+
*/
|
|
37
|
+
export const providerFactories: ReadonlyMap<TtsProviderId, TtsProviderFactory> =
|
|
38
|
+
new Map<TtsProviderId, TtsProviderFactory>([
|
|
39
|
+
["elevenlabs", createElevenLabsProvider],
|
|
40
|
+
["fish-audio", createFishAudioProvider],
|
|
41
|
+
["deepgram", createDeepgramProvider],
|
|
42
|
+
]);
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register built-in TTS providers at startup.
|
|
3
|
+
*
|
|
4
|
+
* Call {@link registerBuiltinTtsProviders} once during daemon initialization
|
|
5
|
+
* to make all catalog-declared providers discoverable via the provider
|
|
6
|
+
* registry. The function iterates {@link listCatalogProviderIds} and looks up
|
|
7
|
+
* each ID in the {@link providerFactories} map — a missing factory entry
|
|
8
|
+
* causes a clear startup-time error so that new catalog providers cannot be
|
|
9
|
+
* added without also wiring an adapter factory.
|
|
10
|
+
*
|
|
11
|
+
* Also registers native Twilio voice-spec builders for providers whose
|
|
12
|
+
* catalog `callMode` is `"native-twilio"`. These builders are consumed by
|
|
13
|
+
* the call strategy abstraction in `tts-call-strategy.ts`.
|
|
14
|
+
*
|
|
15
|
+
* This module is the single entry point for built-in registration — new
|
|
16
|
+
* providers should be added to the catalog and the factory map so they are
|
|
17
|
+
* available from first request.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
_resetNativeTwilioVoiceSpecRegistry,
|
|
22
|
+
type NativeTwilioVoiceSpec,
|
|
23
|
+
registerNativeTwilioVoiceSpec,
|
|
24
|
+
} from "../../calls/tts-call-strategy.js";
|
|
25
|
+
import { buildElevenLabsVoiceSpec } from "../../calls/voice-quality.js";
|
|
26
|
+
import {
|
|
27
|
+
getCatalogProvider,
|
|
28
|
+
listCatalogProviderIds,
|
|
29
|
+
} from "../provider-catalog.js";
|
|
30
|
+
import { registerTtsProvider } from "../provider-registry.js";
|
|
31
|
+
import type { TtsProviderId } from "../types.js";
|
|
32
|
+
import { providerFactories } from "./index.js";
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Native Twilio voice-spec builders
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Maps provider IDs with `callMode: "native-twilio"` to their Twilio
|
|
40
|
+
* voice-spec builder metadata.
|
|
41
|
+
*
|
|
42
|
+
* When onboarding a new native Twilio provider, add an entry here.
|
|
43
|
+
* Synthesized-play providers do not need an entry — they use a
|
|
44
|
+
* placeholder TTS provider and empty voice string.
|
|
45
|
+
*/
|
|
46
|
+
const nativeVoiceSpecs = new Map<TtsProviderId, NativeTwilioVoiceSpec>([
|
|
47
|
+
[
|
|
48
|
+
"elevenlabs",
|
|
49
|
+
{
|
|
50
|
+
twilioProviderName: "ElevenLabs",
|
|
51
|
+
buildVoiceSpec: (providerConfig) =>
|
|
52
|
+
buildElevenLabsVoiceSpec(
|
|
53
|
+
providerConfig as {
|
|
54
|
+
voiceId: string;
|
|
55
|
+
voiceModelId?: string;
|
|
56
|
+
speed?: number;
|
|
57
|
+
stability?: number;
|
|
58
|
+
similarityBoost?: number;
|
|
59
|
+
},
|
|
60
|
+
),
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
]);
|
|
64
|
+
|
|
65
|
+
let registered = false;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Register all built-in TTS providers with the global registry.
|
|
69
|
+
*
|
|
70
|
+
* Iterates every provider ID declared in the canonical catalog and creates
|
|
71
|
+
* an adapter via the corresponding factory in {@link providerFactories}.
|
|
72
|
+
* For providers whose catalog `callMode` is `"native-twilio"`, also
|
|
73
|
+
* registers the corresponding native Twilio voice-spec builder.
|
|
74
|
+
*
|
|
75
|
+
* Safe to call multiple times — subsequent calls are no-ops. This prevents
|
|
76
|
+
* double-registration when the daemon restarts hot-module paths.
|
|
77
|
+
*
|
|
78
|
+
* @throws if any catalog provider ID has no corresponding adapter factory.
|
|
79
|
+
* @throws if a native-twilio provider has no corresponding voice-spec entry.
|
|
80
|
+
*/
|
|
81
|
+
export function registerBuiltinTtsProviders(): void {
|
|
82
|
+
if (registered) return;
|
|
83
|
+
|
|
84
|
+
const catalogIds = listCatalogProviderIds();
|
|
85
|
+
|
|
86
|
+
for (const id of catalogIds) {
|
|
87
|
+
// Register the TTS provider adapter.
|
|
88
|
+
const factory = providerFactories.get(id);
|
|
89
|
+
if (!factory) {
|
|
90
|
+
throw new Error(
|
|
91
|
+
`TTS provider "${id}" is declared in the catalog but has no adapter factory. ` +
|
|
92
|
+
`Add a factory entry for "${id}" in providers/index.ts.`,
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
registerTtsProvider(factory());
|
|
96
|
+
|
|
97
|
+
// Register the native Twilio voice-spec builder when applicable.
|
|
98
|
+
const catalogEntry = getCatalogProvider(id);
|
|
99
|
+
if (catalogEntry.callMode === "native-twilio") {
|
|
100
|
+
const voiceSpec = nativeVoiceSpecs.get(id);
|
|
101
|
+
if (!voiceSpec) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
`TTS provider "${id}" has callMode "native-twilio" but no native ` +
|
|
104
|
+
`voice-spec builder. Add an entry in register-builtins.ts nativeVoiceSpecs.`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
registerNativeTwilioVoiceSpec(id, voiceSpec);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
registered = true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Test helpers
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Reset the registration guard so {@link registerBuiltinTtsProviders} can
|
|
120
|
+
* re-register providers after a test clears the global registry.
|
|
121
|
+
*
|
|
122
|
+
* Also clears the native Twilio voice-spec registry to avoid
|
|
123
|
+
* duplicate-registration errors on subsequent calls.
|
|
124
|
+
*
|
|
125
|
+
* **Test-only** — must not be called in production code.
|
|
126
|
+
*/
|
|
127
|
+
export function _resetBuiltinRegistration(): void {
|
|
128
|
+
registered = false;
|
|
129
|
+
_resetNativeTwilioVoiceSpecRegistry();
|
|
130
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Top-level TTS orchestration layer.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the globally configured provider via {@link resolveTtsConfig},
|
|
5
|
+
* looks up the provider adapter in the registry, and delegates synthesis.
|
|
6
|
+
* Callers supply the pre-sanitized text and a use-case discriminator;
|
|
7
|
+
* provider selection is always global — per-use-case policy only gates
|
|
8
|
+
* capabilities (e.g. format checks), never overrides the chosen provider.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { getConfig } from "../config/loader.js";
|
|
12
|
+
import { getLogger } from "../util/logger.js";
|
|
13
|
+
import { getTtsProvider } from "./provider-registry.js";
|
|
14
|
+
import { resolveTtsConfig } from "./tts-config-resolver.js";
|
|
15
|
+
import type { TtsSynthesisResult, TtsUseCase } from "./types.js";
|
|
16
|
+
|
|
17
|
+
const log = getLogger("tts:synthesize");
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Public types
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
export interface SynthesizeTextOptions {
|
|
24
|
+
/** Pre-sanitized text to speak. */
|
|
25
|
+
text: string;
|
|
26
|
+
|
|
27
|
+
/** Product surface requesting synthesis. */
|
|
28
|
+
useCase: TtsUseCase;
|
|
29
|
+
|
|
30
|
+
/** Optional voice override (provider-specific identifier). */
|
|
31
|
+
voiceId?: string;
|
|
32
|
+
|
|
33
|
+
/** Optional abort signal. */
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Error types
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
export type TtsSynthesisErrorCode =
|
|
42
|
+
| "TTS_PROVIDER_NOT_CONFIGURED"
|
|
43
|
+
| "TTS_SYNTHESIS_FAILED";
|
|
44
|
+
|
|
45
|
+
export class TtsSynthesisError extends Error {
|
|
46
|
+
readonly code: TtsSynthesisErrorCode;
|
|
47
|
+
|
|
48
|
+
constructor(code: TtsSynthesisErrorCode, message: string) {
|
|
49
|
+
super(message);
|
|
50
|
+
this.name = "TtsSynthesisError";
|
|
51
|
+
this.code = code;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Public API
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Synthesize text to audio using the globally configured TTS provider.
|
|
61
|
+
*
|
|
62
|
+
* 1. Resolves the active provider and its config via `tts-config-resolver`.
|
|
63
|
+
* 2. Looks up the provider adapter in the registry.
|
|
64
|
+
* 3. Delegates to the adapter's `synthesize` method.
|
|
65
|
+
*
|
|
66
|
+
* Throws {@link TtsSynthesisError} when the provider is not registered
|
|
67
|
+
* or synthesis fails.
|
|
68
|
+
*/
|
|
69
|
+
export async function synthesizeText(
|
|
70
|
+
options: SynthesizeTextOptions,
|
|
71
|
+
): Promise<TtsSynthesisResult> {
|
|
72
|
+
const config = getConfig();
|
|
73
|
+
const { provider: providerId } = resolveTtsConfig(config);
|
|
74
|
+
|
|
75
|
+
let provider;
|
|
76
|
+
try {
|
|
77
|
+
provider = getTtsProvider(providerId);
|
|
78
|
+
} catch {
|
|
79
|
+
throw new TtsSynthesisError(
|
|
80
|
+
"TTS_PROVIDER_NOT_CONFIGURED",
|
|
81
|
+
`TTS provider "${providerId}" is not configured or not registered.`,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
log.info(
|
|
86
|
+
{
|
|
87
|
+
provider: providerId,
|
|
88
|
+
useCase: options.useCase,
|
|
89
|
+
textLength: options.text.length,
|
|
90
|
+
},
|
|
91
|
+
"Synthesizing text with TTS provider",
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
return await provider.synthesize({
|
|
96
|
+
text: options.text,
|
|
97
|
+
useCase: options.useCase,
|
|
98
|
+
voiceId: options.voiceId,
|
|
99
|
+
signal: options.signal,
|
|
100
|
+
});
|
|
101
|
+
} catch (err) {
|
|
102
|
+
// Re-throw TtsSynthesisError as-is (e.g. from inner adapter errors).
|
|
103
|
+
if (err instanceof TtsSynthesisError) throw err;
|
|
104
|
+
|
|
105
|
+
throw new TtsSynthesisError(
|
|
106
|
+
"TTS_SYNTHESIS_FAILED",
|
|
107
|
+
`TTS synthesis failed (provider: ${providerId}): ${err instanceof Error ? err.message : String(err)}`,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the effective TTS provider and provider-specific configuration
|
|
3
|
+
* from the canonical `services.tts` config block.
|
|
4
|
+
*
|
|
5
|
+
* Reads exclusively from `services.tts.provider` and
|
|
6
|
+
* `services.tts.providers.<id>`. Migration 032 ensures all workspaces
|
|
7
|
+
* have canonical fields materialised.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { AssistantConfig } from "../config/types.js";
|
|
11
|
+
import type { TtsProviderId } from "./types.js";
|
|
12
|
+
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Public types
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
/** Resolved TTS configuration for a single provider. */
|
|
18
|
+
export interface ResolvedTtsConfig {
|
|
19
|
+
/** The active TTS provider. */
|
|
20
|
+
provider: TtsProviderId;
|
|
21
|
+
|
|
22
|
+
/** Provider-specific settings for the active provider. */
|
|
23
|
+
providerConfig: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Defaults (must match the schema defaults in tts.ts)
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
|
|
30
|
+
const DEFAULT_TTS_PROVIDER: TtsProviderId = "elevenlabs";
|
|
31
|
+
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Public API
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the effective TTS provider and its configuration from the
|
|
38
|
+
* assistant config.
|
|
39
|
+
*
|
|
40
|
+
* Reads exclusively from `services.tts.provider` and
|
|
41
|
+
* `services.tts.providers.<id>`. No legacy fallback logic.
|
|
42
|
+
*/
|
|
43
|
+
export function resolveTtsConfig(config: AssistantConfig): ResolvedTtsConfig {
|
|
44
|
+
const ttsService = config.services.tts;
|
|
45
|
+
|
|
46
|
+
const provider: TtsProviderId = ttsService.provider ?? DEFAULT_TTS_PROVIDER;
|
|
47
|
+
|
|
48
|
+
// Resolve provider-specific config from the canonical providers map.
|
|
49
|
+
const providerConfig = resolveProviderConfig(config, provider);
|
|
50
|
+
|
|
51
|
+
return { provider, providerConfig };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Internal helpers
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Build the provider-specific config object from the canonical
|
|
60
|
+
* `services.tts.providers.<id>` block.
|
|
61
|
+
*
|
|
62
|
+
* Uses a generic lookup against the providers map — no provider-specific
|
|
63
|
+
* branching. Unknown providers (not in the catalog / schema) receive an
|
|
64
|
+
* empty config; their adapters are responsible for validating required fields.
|
|
65
|
+
*/
|
|
66
|
+
function resolveProviderConfig(
|
|
67
|
+
config: AssistantConfig,
|
|
68
|
+
provider: TtsProviderId,
|
|
69
|
+
): Record<string, unknown> {
|
|
70
|
+
const ttsProviders = config.services.tts.providers as Record<string, unknown>;
|
|
71
|
+
|
|
72
|
+
const providerBlock = ttsProviders[provider];
|
|
73
|
+
if (providerBlock != null && typeof providerBlock === "object") {
|
|
74
|
+
return { ...providerBlock } as Record<string, unknown>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return {};
|
|
78
|
+
}
|
package/src/tts/types.ts
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core domain types for the provider-agnostic TTS abstraction.
|
|
3
|
+
*
|
|
4
|
+
* These contracts decouple callers (phone calls, message TTS routes, native
|
|
5
|
+
* clients) from concrete TTS backends (ElevenLabs, Fish Audio, etc.).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Provider identity
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Unique identifier for a registered TTS provider.
|
|
14
|
+
*
|
|
15
|
+
* Values correspond to the provider names already used in config schemas
|
|
16
|
+
* (e.g. `"elevenlabs"`, `"fish-audio"`). New providers simply add a new
|
|
17
|
+
* string to this union — the registry enforces uniqueness at runtime.
|
|
18
|
+
*/
|
|
19
|
+
export type TtsProviderId =
|
|
20
|
+
| "elevenlabs"
|
|
21
|
+
| "fish-audio"
|
|
22
|
+
| "deepgram"
|
|
23
|
+
| (string & {});
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Call-mode discriminator
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Describes how a TTS provider integrates with the telephony call path.
|
|
31
|
+
*
|
|
32
|
+
* - `native-twilio` — Twilio handles TTS natively via ConversationRelay;
|
|
33
|
+
* text tokens are forwarded to the relay and Twilio
|
|
34
|
+
* synthesises audio using the provider's built-in
|
|
35
|
+
* integration.
|
|
36
|
+
* - `synthesized-play` — The assistant synthesises audio via the provider's
|
|
37
|
+
* HTTP API and streams chunks to Twilio via `play`
|
|
38
|
+
* messages. Used when the provider is not natively
|
|
39
|
+
* supported by Twilio.
|
|
40
|
+
*/
|
|
41
|
+
export type TtsCallMode = "native-twilio" | "synthesized-play";
|
|
42
|
+
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// Use-case discriminator
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Describes the product surface that is requesting synthesis so providers
|
|
49
|
+
* can tailor format, latency, and quality trade-offs.
|
|
50
|
+
*/
|
|
51
|
+
export type TtsUseCase =
|
|
52
|
+
/** Real-time phone call — prioritize low latency and streaming. */
|
|
53
|
+
| "phone-call"
|
|
54
|
+
/** In-app message playback — buffer-oriented, higher quality acceptable. */
|
|
55
|
+
| "message-playback";
|
|
56
|
+
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Synthesis request / result
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
/** Input to a TTS synthesis call. */
|
|
62
|
+
export interface TtsSynthesisRequest {
|
|
63
|
+
/** Pre-sanitized text to synthesize. */
|
|
64
|
+
text: string;
|
|
65
|
+
|
|
66
|
+
/** Product surface requesting synthesis. */
|
|
67
|
+
useCase: TtsUseCase;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Optional voice identifier whose format is provider-specific
|
|
71
|
+
* (e.g. an ElevenLabs voice ID or a Fish Audio reference ID).
|
|
72
|
+
*/
|
|
73
|
+
voiceId?: string;
|
|
74
|
+
|
|
75
|
+
/** Optional abort signal for cancelling in-flight synthesis. */
|
|
76
|
+
signal?: AbortSignal;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Optional hint requesting a specific output encoding from the provider.
|
|
80
|
+
*
|
|
81
|
+
* - `"pcm"` — Request raw PCM output (e.g. 16-bit signed LE). The
|
|
82
|
+
* media-stream transport sets this because its mu-law transcoder
|
|
83
|
+
* can handle raw PCM but not compressed formats like mp3/opus.
|
|
84
|
+
*
|
|
85
|
+
* Providers that support the requested format should honour the hint;
|
|
86
|
+
* providers that don't may ignore it and return their default format.
|
|
87
|
+
* The caller must always check `result.contentType` to determine the
|
|
88
|
+
* actual format of the returned audio.
|
|
89
|
+
*/
|
|
90
|
+
outputFormat?: "pcm";
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Output of a completed TTS synthesis call. */
|
|
94
|
+
export interface TtsSynthesisResult {
|
|
95
|
+
/** Complete audio buffer. */
|
|
96
|
+
audio: Buffer;
|
|
97
|
+
|
|
98
|
+
/** MIME type of the returned audio (e.g. `"audio/mpeg"`, `"audio/wav"`). */
|
|
99
|
+
contentType: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
// Provider capabilities
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
|
|
106
|
+
/** Advertised capabilities of a TTS provider. */
|
|
107
|
+
export interface TtsProviderCapabilities {
|
|
108
|
+
/** Whether the provider supports chunk-level streaming via `synthesizeStream`. */
|
|
109
|
+
supportsStreaming: boolean;
|
|
110
|
+
|
|
111
|
+
/** Audio formats the provider can produce (e.g. `["mp3", "wav", "opus"]`). */
|
|
112
|
+
supportedFormats: string[];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// Provider interface
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Contract that every TTS provider adapter must implement.
|
|
121
|
+
*
|
|
122
|
+
* At minimum a provider must support buffer-oriented synthesis. Streaming
|
|
123
|
+
* synthesis is optional — providers that support it set
|
|
124
|
+
* `capabilities.supportsStreaming` to `true` and implement
|
|
125
|
+
* `synthesizeStream`.
|
|
126
|
+
*/
|
|
127
|
+
export interface TtsProvider {
|
|
128
|
+
/** Unique provider identifier used for registry lookup. */
|
|
129
|
+
readonly id: TtsProviderId;
|
|
130
|
+
|
|
131
|
+
/** Static capability advertisement. */
|
|
132
|
+
readonly capabilities: TtsProviderCapabilities;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Synthesize text and return the complete audio buffer.
|
|
136
|
+
*
|
|
137
|
+
* This is the universal code-path — every provider must implement it.
|
|
138
|
+
*/
|
|
139
|
+
synthesize(request: TtsSynthesisRequest): Promise<TtsSynthesisResult>;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Synthesize text with chunk-level streaming.
|
|
143
|
+
*
|
|
144
|
+
* Only required when `capabilities.supportsStreaming` is `true`.
|
|
145
|
+
* The `onChunk` callback is invoked with each audio chunk as it arrives
|
|
146
|
+
* from the upstream provider. The returned promise resolves with the
|
|
147
|
+
* complete concatenated result once all chunks have been delivered.
|
|
148
|
+
*/
|
|
149
|
+
synthesizeStream?(
|
|
150
|
+
request: TtsSynthesisRequest,
|
|
151
|
+
onChunk: (chunk: Uint8Array) => void,
|
|
152
|
+
): Promise<TtsSynthesisResult>;
|
|
153
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tagged AbortReason objects passed as the `reason` argument to
|
|
3
|
+
* `AbortController.abort()` for daemon-owned conversation aborts.
|
|
4
|
+
*
|
|
5
|
+
* The reason flows through the AbortSignal into provider SDKs (Anthropic,
|
|
6
|
+
* OpenAI, etc.). When a provider wraps the abort error, the wrapped
|
|
7
|
+
* `ProviderError` carries the original reason via `ProviderError.abortReason`,
|
|
8
|
+
* letting `isUserCancellation` distinguish a user-initiated abort from a
|
|
9
|
+
* genuine provider failure even after wrapping erases the `AbortError` name.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export type AbortReasonKind =
|
|
13
|
+
/** User explicitly hit Stop / Esc on the active conversation. */
|
|
14
|
+
| "user_cancel"
|
|
15
|
+
/** A new user message arrived for the same conversation, preempting the in-flight turn. */
|
|
16
|
+
| "preempted_by_new_message"
|
|
17
|
+
/** The conversation was disposed (eviction, shutdown) while still processing. */
|
|
18
|
+
| "conversation_disposed"
|
|
19
|
+
/** A subagent's owning conversation was aborted (parent abort, dispose, or explicit subagent abort). */
|
|
20
|
+
| "subagent_aborted"
|
|
21
|
+
/** A signal-file cancel was written by an out-of-process caller (CLI, hook). */
|
|
22
|
+
| "signal_cancel"
|
|
23
|
+
/** Voice session bridge aborted the conversation (turn supersession, call end). */
|
|
24
|
+
| "voice_session_aborted"
|
|
25
|
+
/** A scheduled work item run was cancelled or its conversation reset. */
|
|
26
|
+
| "work_item_aborted";
|
|
27
|
+
|
|
28
|
+
const ABORT_REASON_TAG = "__vellumAbortReason" as const;
|
|
29
|
+
|
|
30
|
+
export interface AbortReason {
|
|
31
|
+
readonly [ABORT_REASON_TAG]: true;
|
|
32
|
+
readonly kind: AbortReasonKind;
|
|
33
|
+
/** Short identifier of the call site for logging (e.g. "cancelGeneration"). */
|
|
34
|
+
readonly source: string;
|
|
35
|
+
readonly conversationId?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function createAbortReason(
|
|
39
|
+
kind: AbortReasonKind,
|
|
40
|
+
source: string,
|
|
41
|
+
conversationId?: string,
|
|
42
|
+
): AbortReason {
|
|
43
|
+
return {
|
|
44
|
+
[ABORT_REASON_TAG]: true,
|
|
45
|
+
kind,
|
|
46
|
+
source,
|
|
47
|
+
...(conversationId ? { conversationId } : {}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function isAbortReason(value: unknown): value is AbortReason {
|
|
52
|
+
if (typeof value !== "object" || value === null) return false;
|
|
53
|
+
return (
|
|
54
|
+
(value as Record<string, unknown>)[ABORT_REASON_TAG] === true &&
|
|
55
|
+
typeof (value as Record<string, unknown>).kind === "string" &&
|
|
56
|
+
typeof (value as Record<string, unknown>).source === "string"
|
|
57
|
+
);
|
|
58
|
+
}
|
package/src/util/device-id.ts
CHANGED
|
@@ -6,11 +6,14 @@
|
|
|
6
6
|
* extensible for future per-device metadata.
|
|
7
7
|
*
|
|
8
8
|
* Path resolution:
|
|
9
|
-
* - Containerized (IS_CONTAINERIZED=true):
|
|
10
|
-
* user's persistent home dir
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
9
|
+
* - Containerized (IS_CONTAINERIZED=true): `/home/assistant/.vellum/device.json`
|
|
10
|
+
* — the assistant user's persistent home dir, kept off the shared data
|
|
11
|
+
* volume. Not affected by VELLUM_ENVIRONMENT because the container fs
|
|
12
|
+
* has no cross-process contract with the Swift client.
|
|
13
|
+
* - Non-containerized production: `~/.vellum/device.json` (legacy, shared
|
|
14
|
+
* across all local instances on the same machine).
|
|
15
|
+
* - Non-containerized non-production: `$XDG_CONFIG_HOME/vellum-<env>/device.json`,
|
|
16
|
+
* matching Swift's `VellumPaths.deviceIdFile`.
|
|
14
17
|
*
|
|
15
18
|
* The value is cached in memory after the first successful read/write.
|
|
16
19
|
* Falls back to a generated UUID if the file cannot be read or written.
|
|
@@ -23,25 +26,39 @@ import { join } from "node:path";
|
|
|
23
26
|
|
|
24
27
|
import { getIsContainerized } from "../config/env-registry.js";
|
|
25
28
|
import { getLogger } from "./logger.js";
|
|
29
|
+
import { getXdgVellumConfigDirName } from "./platform.js";
|
|
26
30
|
|
|
27
31
|
const log = getLogger("device-id");
|
|
28
32
|
|
|
29
33
|
let cached: string | undefined;
|
|
30
34
|
|
|
31
35
|
/**
|
|
32
|
-
* Resolve the
|
|
36
|
+
* Resolve the directory and file path for `device.json` based on the
|
|
37
|
+
* runtime environment. See the module docblock for the resolution table.
|
|
33
38
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* shared across instances, giving a true per-machine device ID.
|
|
39
|
+
* Production and containerized modes preserve the legacy `~/.vellum` /
|
|
40
|
+
* `/home/assistant/.vellum` paths. Non-production, non-containerized
|
|
41
|
+
* deployments route through `$XDG_CONFIG_HOME/vellum-<env>` to match
|
|
42
|
+
* the Swift client's `VellumPaths.deviceIdFile`.
|
|
39
43
|
*/
|
|
40
|
-
|
|
44
|
+
function resolveDeviceIdPaths(): { dir: string; file: string } {
|
|
41
45
|
if (getIsContainerized()) {
|
|
42
|
-
|
|
46
|
+
const dir = join("/home/assistant", ".vellum");
|
|
47
|
+
return { dir, file: join(dir, "device.json") };
|
|
43
48
|
}
|
|
44
|
-
|
|
49
|
+
|
|
50
|
+
const configDirName = getXdgVellumConfigDirName();
|
|
51
|
+
if (configDirName === "vellum") {
|
|
52
|
+
// Production: device.json lives at ~/.vellum/device.json, shared
|
|
53
|
+
// across all local instances on the same machine.
|
|
54
|
+
const dir = join(homedir(), ".vellum");
|
|
55
|
+
return { dir, file: join(dir, "device.json") };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const configHome =
|
|
59
|
+
process.env.XDG_CONFIG_HOME?.trim() || join(homedir(), ".config");
|
|
60
|
+
const dir = join(configHome, configDirName);
|
|
61
|
+
return { dir, file: join(dir, "device.json") };
|
|
45
62
|
}
|
|
46
63
|
|
|
47
64
|
/**
|
|
@@ -60,8 +77,7 @@ export function getDeviceId(): string {
|
|
|
60
77
|
return cached;
|
|
61
78
|
}
|
|
62
79
|
|
|
63
|
-
const vellumDir =
|
|
64
|
-
const filePath = join(vellumDir, "device.json");
|
|
80
|
+
const { dir: vellumDir, file: filePath } = resolveDeviceIdPaths();
|
|
65
81
|
const generated = randomUUID();
|
|
66
82
|
|
|
67
83
|
try {
|