@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,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* STT provider catalog — single source of truth for provider metadata.
|
|
3
|
+
*
|
|
4
|
+
* Every STT provider is described by a {@link SttProviderEntry} that
|
|
5
|
+
* captures its canonical ID, the credential-provider name used to look up
|
|
6
|
+
* API keys, supported runtime boundaries, and telephony support mode.
|
|
7
|
+
*
|
|
8
|
+
* All other modules that need provider metadata (resolve.ts,
|
|
9
|
+
* daemon-batch-transcriber.ts, future telephony adapters) read from this
|
|
10
|
+
* catalog rather than maintaining their own hardcoded maps.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type {
|
|
14
|
+
ConversationStreamingMode,
|
|
15
|
+
SttBoundaryId,
|
|
16
|
+
SttProviderId,
|
|
17
|
+
TelephonySttMode,
|
|
18
|
+
} from "../../stt/types.js";
|
|
19
|
+
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Telephony routing metadata
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Strategy kind for telephony call setup.
|
|
26
|
+
*
|
|
27
|
+
* Determines how the telephony routing resolver (`telephony-stt-routing.ts`)
|
|
28
|
+
* wires the STT provider into a Twilio call:
|
|
29
|
+
*
|
|
30
|
+
* - `"conversation-relay-native"` — the provider is natively supported by
|
|
31
|
+
* Twilio ConversationRelay. TwiML includes `transcriptionProvider` /
|
|
32
|
+
* `speechModel` attributes and Twilio handles audio ingestion.
|
|
33
|
+
* - `"media-stream-custom"` — the provider is not natively supported by
|
|
34
|
+
* Twilio. A `<Stream>` media-stream is opened and the daemon transcribes
|
|
35
|
+
* audio server-side via the provider's batch API.
|
|
36
|
+
*/
|
|
37
|
+
export type TelephonyStrategyKind =
|
|
38
|
+
| "conversation-relay-native"
|
|
39
|
+
| "media-stream-custom";
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Twilio-native ConversationRelay provider name.
|
|
43
|
+
*
|
|
44
|
+
* These are the values Twilio accepts in the `transcriptionProvider` TwiML
|
|
45
|
+
* attribute on `<ConversationRelay>`.
|
|
46
|
+
*/
|
|
47
|
+
export type TwilioNativeProvider = "Deepgram" | "Google";
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Twilio-native mapping details for providers routed through
|
|
51
|
+
* ConversationRelay. Only present when `strategyKind` is
|
|
52
|
+
* `"conversation-relay-native"`.
|
|
53
|
+
*/
|
|
54
|
+
export interface TwilioNativeMapping {
|
|
55
|
+
/** Twilio-native provider name for the TwiML `transcriptionProvider` attribute. */
|
|
56
|
+
readonly provider: TwilioNativeProvider;
|
|
57
|
+
/**
|
|
58
|
+
* Default ASR speech model identifier, or `undefined` to use the
|
|
59
|
+
* provider's default model. Individual providers override as needed
|
|
60
|
+
* (e.g. Deepgram defaults to `"nova-3"`).
|
|
61
|
+
*/
|
|
62
|
+
readonly defaultSpeechModel: string | undefined;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Telephony routing metadata — the single source of truth for how a
|
|
67
|
+
* provider is wired into Twilio call setup.
|
|
68
|
+
*
|
|
69
|
+
* The telephony routing resolver reads these fields from the catalog
|
|
70
|
+
* instead of maintaining its own hardcoded maps.
|
|
71
|
+
*/
|
|
72
|
+
export interface TelephonyRouting {
|
|
73
|
+
/** Which Twilio call-setup strategy this provider uses. */
|
|
74
|
+
readonly strategyKind: TelephonyStrategyKind;
|
|
75
|
+
/**
|
|
76
|
+
* Twilio-native mapping details. Present when `strategyKind` is
|
|
77
|
+
* `"conversation-relay-native"`, absent for `"media-stream-custom"`.
|
|
78
|
+
*/
|
|
79
|
+
readonly twilioNativeMapping?: TwilioNativeMapping;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Catalog entry
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Metadata for a single STT provider.
|
|
88
|
+
*/
|
|
89
|
+
export interface SttProviderEntry {
|
|
90
|
+
/** Canonical provider identifier (must match an {@link SttProviderId} variant). */
|
|
91
|
+
readonly id: SttProviderId;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Name of the credential provider used by `getProviderKeyAsync` to
|
|
95
|
+
* retrieve the API key. Multiple STT providers may share a credential
|
|
96
|
+
* provider (e.g. a future "openai-realtime" provider would also map to
|
|
97
|
+
* `"openai"`).
|
|
98
|
+
*/
|
|
99
|
+
readonly credentialProvider: string;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Set of runtime boundaries this provider supports. A provider may
|
|
103
|
+
* support more than one boundary (e.g. both `daemon-batch` and a future
|
|
104
|
+
* `realtime-ws` boundary).
|
|
105
|
+
*/
|
|
106
|
+
readonly supportedBoundaries: ReadonlySet<SttBoundaryId>;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Telephony capability class — describes the provider's native
|
|
110
|
+
* audio-ingestion capability for telephony contexts.
|
|
111
|
+
*/
|
|
112
|
+
readonly telephonyMode: TelephonySttMode;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Conversation streaming mode — describes whether and how the provider
|
|
116
|
+
* can participate in real-time conversation chat message capture
|
|
117
|
+
* (chat composer and iOS input bar).
|
|
118
|
+
*
|
|
119
|
+
* - `"realtime-ws"` — native WebSocket streaming with partial/final events.
|
|
120
|
+
* - `"incremental-batch"` — polling-based incremental batch approximation.
|
|
121
|
+
* - `"none"` — no streaming support; fall back to batch transcription.
|
|
122
|
+
*/
|
|
123
|
+
readonly conversationStreamingMode: ConversationStreamingMode;
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Whether the provider can attribute transcribed speech to distinct
|
|
127
|
+
* speakers (speaker diarization). When `true`, callers may opt in to
|
|
128
|
+
* per-utterance speaker labels via the provider's streaming/batch
|
|
129
|
+
* configuration. When `false`, speaker-label callers must fall back to
|
|
130
|
+
* single-speaker output.
|
|
131
|
+
*
|
|
132
|
+
* Flip this flag in the catalog if a provider gains diarization support;
|
|
133
|
+
* downstream code reads the capability from here via
|
|
134
|
+
* {@link supportsDiarization}.
|
|
135
|
+
*/
|
|
136
|
+
readonly supportsDiarization: boolean;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Telephony routing metadata — describes how this provider is wired
|
|
140
|
+
* into Twilio call setup. This is the single source of truth for
|
|
141
|
+
* strategy selection and Twilio-native mapping details.
|
|
142
|
+
*/
|
|
143
|
+
readonly telephonyRouting: TelephonyRouting;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Catalog data
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Provider catalog entries, keyed by provider ID.
|
|
152
|
+
*
|
|
153
|
+
* To add a new STT provider:
|
|
154
|
+
* 1. Add a new variant to `SttProviderId` in `stt/types.ts`.
|
|
155
|
+
* 2. Add an entry here with the credential mapping and boundary support.
|
|
156
|
+
* 3. Wire up the adapter in `daemon-batch-transcriber.ts` (and/or a
|
|
157
|
+
* future realtime adapter) for the boundaries the provider supports.
|
|
158
|
+
*/
|
|
159
|
+
const CATALOG: ReadonlyMap<SttProviderId, SttProviderEntry> = new Map<
|
|
160
|
+
SttProviderId,
|
|
161
|
+
SttProviderEntry
|
|
162
|
+
>([
|
|
163
|
+
[
|
|
164
|
+
"deepgram",
|
|
165
|
+
{
|
|
166
|
+
id: "deepgram",
|
|
167
|
+
credentialProvider: "deepgram",
|
|
168
|
+
supportedBoundaries: new Set<SttBoundaryId>([
|
|
169
|
+
"daemon-batch",
|
|
170
|
+
"daemon-streaming",
|
|
171
|
+
]),
|
|
172
|
+
telephonyMode: "realtime-ws",
|
|
173
|
+
conversationStreamingMode: "realtime-ws",
|
|
174
|
+
supportsDiarization: true,
|
|
175
|
+
telephonyRouting: {
|
|
176
|
+
strategyKind: "conversation-relay-native",
|
|
177
|
+
twilioNativeMapping: {
|
|
178
|
+
provider: "Deepgram",
|
|
179
|
+
defaultSpeechModel: "nova-3",
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
[
|
|
185
|
+
"google-gemini",
|
|
186
|
+
{
|
|
187
|
+
id: "google-gemini",
|
|
188
|
+
credentialProvider: "gemini",
|
|
189
|
+
supportedBoundaries: new Set<SttBoundaryId>([
|
|
190
|
+
"daemon-batch",
|
|
191
|
+
"daemon-streaming",
|
|
192
|
+
]),
|
|
193
|
+
telephonyMode: "batch-only",
|
|
194
|
+
conversationStreamingMode: "realtime-ws",
|
|
195
|
+
supportsDiarization: false,
|
|
196
|
+
telephonyRouting: {
|
|
197
|
+
strategyKind: "conversation-relay-native",
|
|
198
|
+
twilioNativeMapping: {
|
|
199
|
+
provider: "Google",
|
|
200
|
+
defaultSpeechModel: undefined,
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
[
|
|
206
|
+
"openai-whisper",
|
|
207
|
+
{
|
|
208
|
+
id: "openai-whisper",
|
|
209
|
+
credentialProvider: "openai",
|
|
210
|
+
supportedBoundaries: new Set<SttBoundaryId>([
|
|
211
|
+
"daemon-batch",
|
|
212
|
+
"daemon-streaming",
|
|
213
|
+
]),
|
|
214
|
+
telephonyMode: "batch-only",
|
|
215
|
+
conversationStreamingMode: "incremental-batch",
|
|
216
|
+
supportsDiarization: false,
|
|
217
|
+
telephonyRouting: {
|
|
218
|
+
strategyKind: "media-stream-custom",
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
]);
|
|
223
|
+
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
// Public API
|
|
226
|
+
// ---------------------------------------------------------------------------
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Look up a provider entry by its canonical ID.
|
|
230
|
+
*
|
|
231
|
+
* Returns `undefined` when the ID is not present in the catalog (e.g. an
|
|
232
|
+
* unknown runtime value that passed schema validation).
|
|
233
|
+
*/
|
|
234
|
+
export function getProviderEntry(
|
|
235
|
+
id: SttProviderId,
|
|
236
|
+
): SttProviderEntry | undefined {
|
|
237
|
+
return CATALOG.get(id);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Return all catalog entries in deterministic (insertion) order.
|
|
242
|
+
*/
|
|
243
|
+
export function listProviderEntries(): readonly SttProviderEntry[] {
|
|
244
|
+
return [...CATALOG.values()];
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Look up the credential-provider name for a given STT provider.
|
|
249
|
+
*
|
|
250
|
+
* Convenience wrapper around `getProviderEntry` for callers that only need
|
|
251
|
+
* the credential mapping. Returns `undefined` when the provider is unknown.
|
|
252
|
+
*/
|
|
253
|
+
export function getCredentialProvider(id: SttProviderId): string | undefined {
|
|
254
|
+
return CATALOG.get(id)?.credentialProvider;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Check whether a provider supports a specific runtime boundary.
|
|
259
|
+
*
|
|
260
|
+
* Returns `false` for unknown provider IDs.
|
|
261
|
+
*/
|
|
262
|
+
export function supportsBoundary(
|
|
263
|
+
id: SttProviderId,
|
|
264
|
+
boundary: SttBoundaryId,
|
|
265
|
+
): boolean {
|
|
266
|
+
return CATALOG.get(id)?.supportedBoundaries.has(boundary) ?? false;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Check whether a provider supports speaker diarization.
|
|
271
|
+
*
|
|
272
|
+
* Returns `false` for unknown provider IDs. Callers use this to decide
|
|
273
|
+
* whether to request speaker labels from the provider's streaming or
|
|
274
|
+
* batch configuration.
|
|
275
|
+
*/
|
|
276
|
+
export function supportsDiarization(id: SttProviderId): boolean {
|
|
277
|
+
return CATALOG.get(id)?.supportsDiarization ?? false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Return all canonical provider IDs in deterministic (insertion) order.
|
|
282
|
+
*/
|
|
283
|
+
export function listProviderIds(): readonly SttProviderId[] {
|
|
284
|
+
return [...CATALOG.keys()];
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Return the deduplicated set of credential-provider names used by STT
|
|
289
|
+
* providers, in deterministic (first-seen) order.
|
|
290
|
+
*
|
|
291
|
+
* Multiple STT providers may share a single credential provider (e.g.
|
|
292
|
+
* `openai-whisper` and a future `openai-realtime` both map to `"openai"`).
|
|
293
|
+
* This helper deduplicates so that callers composing API-key provider
|
|
294
|
+
* lists do not produce duplicate entries.
|
|
295
|
+
*/
|
|
296
|
+
export function listCredentialProviderNames(): readonly string[] {
|
|
297
|
+
const seen = new Set<string>();
|
|
298
|
+
const result: string[] = [];
|
|
299
|
+
for (const entry of CATALOG.values()) {
|
|
300
|
+
if (!seen.has(entry.credentialProvider)) {
|
|
301
|
+
seen.add(entry.credentialProvider);
|
|
302
|
+
result.push(entry.credentialProvider);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
@@ -1,9 +1,389 @@
|
|
|
1
|
+
import { getConfig } from "../../config/loader.js";
|
|
1
2
|
import { getProviderKeyAsync } from "../../security/secure-keys.js";
|
|
2
|
-
import {
|
|
3
|
-
import type {
|
|
3
|
+
import { createDaemonBatchTranscriber } from "../../stt/daemon-batch-transcriber.js";
|
|
4
|
+
import type {
|
|
5
|
+
BatchTranscriber,
|
|
6
|
+
StreamingTranscriber,
|
|
7
|
+
SttProviderId,
|
|
8
|
+
} from "../../stt/types.js";
|
|
9
|
+
import { getLogger } from "../../util/logger.js";
|
|
10
|
+
import {
|
|
11
|
+
getCredentialProvider,
|
|
12
|
+
getProviderEntry,
|
|
13
|
+
supportsBoundary,
|
|
14
|
+
supportsDiarization,
|
|
15
|
+
} from "./provider-catalog.js";
|
|
4
16
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
17
|
+
const log = getLogger("stt-resolver");
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Batch transcriber resolver (existing public API — unchanged contract)
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Resolve a `BatchTranscriber` for daemon-hosted batch transcription.
|
|
25
|
+
*
|
|
26
|
+
* Reads `services.stt.provider` from the assistant config to determine which
|
|
27
|
+
* STT provider to use, then looks up the corresponding credential via the
|
|
28
|
+
* provider catalog. Credential lookup is centralized here (an authorized
|
|
29
|
+
* secure-keys importer) so callers don't need to import secure-keys directly.
|
|
30
|
+
*
|
|
31
|
+
* Returns `null` when:
|
|
32
|
+
* - The configured provider is not in the catalog.
|
|
33
|
+
* - The configured provider doesn't support the `daemon-batch` boundary.
|
|
34
|
+
* - No credentials are configured for the resolved provider.
|
|
35
|
+
*/
|
|
36
|
+
export async function resolveBatchTranscriber(): Promise<BatchTranscriber | null> {
|
|
37
|
+
const config = getConfig();
|
|
38
|
+
const provider = config.services.stt.provider;
|
|
39
|
+
|
|
40
|
+
// Look up credential provider via the catalog.
|
|
41
|
+
const credentialProviderName = getCredentialProvider(
|
|
42
|
+
provider as SttProviderId,
|
|
43
|
+
);
|
|
44
|
+
if (!credentialProviderName) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Verify the provider supports the daemon-batch boundary.
|
|
49
|
+
if (!supportsBoundary(provider as SttProviderId, "daemon-batch")) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const apiKey = await getProviderKeyAsync(credentialProviderName);
|
|
54
|
+
return createDaemonBatchTranscriber(apiKey, provider as SttProviderId);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Telephony capability resolver
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Result of resolving whether the configured `services.stt` provider is
|
|
63
|
+
* eligible for telephony call ingestion.
|
|
64
|
+
*/
|
|
65
|
+
export type TelephonySttCapability =
|
|
66
|
+
| {
|
|
67
|
+
/** The configured provider supports telephony. */
|
|
68
|
+
status: "supported";
|
|
69
|
+
providerId: SttProviderId;
|
|
70
|
+
/** How the provider participates in real-time call ingestion. */
|
|
71
|
+
telephonyMode: "realtime-ws" | "batch-only";
|
|
72
|
+
}
|
|
73
|
+
| {
|
|
74
|
+
/** The configured provider does not support telephony. */
|
|
75
|
+
status: "unsupported";
|
|
76
|
+
providerId: SttProviderId;
|
|
77
|
+
reason: string;
|
|
78
|
+
}
|
|
79
|
+
| {
|
|
80
|
+
/** The configured provider is unknown or not in the catalog. */
|
|
81
|
+
status: "unconfigured";
|
|
82
|
+
reason: string;
|
|
83
|
+
}
|
|
84
|
+
| {
|
|
85
|
+
/** The provider is eligible but missing credentials. */
|
|
86
|
+
status: "missing-credentials";
|
|
87
|
+
providerId: SttProviderId;
|
|
88
|
+
credentialProvider: string;
|
|
89
|
+
reason: string;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Validate whether the configured `services.stt` provider is eligible for
|
|
94
|
+
* future real-time telephony call ingestion.
|
|
95
|
+
*
|
|
96
|
+
* This resolver does **not** create a live transcriber — it only validates
|
|
97
|
+
* that the configuration, catalog entry, and credentials are all in order.
|
|
98
|
+
* The actual wiring is deferred to a future media-stream call adapter PR.
|
|
99
|
+
*
|
|
100
|
+
* Callers can branch on the discriminated `status` field:
|
|
101
|
+
* - `"supported"` — the provider is telephony-eligible and credentials exist.
|
|
102
|
+
* - `"unsupported"` — the provider exists but has `telephonyMode: "none"`.
|
|
103
|
+
* - `"unconfigured"` — the provider is unknown or missing from the catalog.
|
|
104
|
+
* - `"missing-credentials"` — the provider is eligible but has no API key.
|
|
105
|
+
*/
|
|
106
|
+
export async function resolveTelephonySttCapability(): Promise<TelephonySttCapability> {
|
|
107
|
+
const config = getConfig();
|
|
108
|
+
const provider = config.services.stt.provider;
|
|
109
|
+
|
|
110
|
+
const entry = getProviderEntry(provider as SttProviderId);
|
|
111
|
+
if (!entry) {
|
|
112
|
+
return {
|
|
113
|
+
status: "unconfigured",
|
|
114
|
+
reason: `STT provider "${provider}" is not in the provider catalog`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (entry.telephonyMode === "none") {
|
|
119
|
+
return {
|
|
120
|
+
status: "unsupported",
|
|
121
|
+
providerId: entry.id,
|
|
122
|
+
reason: `STT provider "${entry.id}" does not support telephony`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Provider is telephony-eligible — verify credentials exist.
|
|
127
|
+
const apiKey = await getProviderKeyAsync(entry.credentialProvider);
|
|
128
|
+
if (!apiKey) {
|
|
129
|
+
return {
|
|
130
|
+
status: "missing-credentials",
|
|
131
|
+
providerId: entry.id,
|
|
132
|
+
credentialProvider: entry.credentialProvider,
|
|
133
|
+
reason: `No API key configured for credential provider "${entry.credentialProvider}"`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
status: "supported",
|
|
139
|
+
providerId: entry.id,
|
|
140
|
+
telephonyMode: entry.telephonyMode,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// Conversation streaming capability resolver
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Result of resolving whether the configured `services.stt` provider
|
|
150
|
+
* supports conversation streaming for chat message capture.
|
|
151
|
+
*/
|
|
152
|
+
export type ConversationStreamingSttCapability =
|
|
153
|
+
| {
|
|
154
|
+
/** The configured provider supports conversation streaming. */
|
|
155
|
+
status: "supported";
|
|
156
|
+
providerId: SttProviderId;
|
|
157
|
+
/** How the provider implements conversation streaming. */
|
|
158
|
+
streamingMode: "realtime-ws" | "incremental-batch";
|
|
159
|
+
}
|
|
160
|
+
| {
|
|
161
|
+
/** The configured provider does not support conversation streaming. */
|
|
162
|
+
status: "unsupported";
|
|
163
|
+
providerId: SttProviderId;
|
|
164
|
+
reason: string;
|
|
165
|
+
}
|
|
166
|
+
| {
|
|
167
|
+
/** The configured provider is unknown or not in the catalog. */
|
|
168
|
+
status: "unconfigured";
|
|
169
|
+
reason: string;
|
|
170
|
+
}
|
|
171
|
+
| {
|
|
172
|
+
/** The provider is eligible but missing credentials. */
|
|
173
|
+
status: "missing-credentials";
|
|
174
|
+
providerId: SttProviderId;
|
|
175
|
+
credentialProvider: string;
|
|
176
|
+
reason: string;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Validate whether the configured `services.stt` provider supports
|
|
181
|
+
* conversation streaming for chat message capture (chat composer and
|
|
182
|
+
* iOS input bar).
|
|
183
|
+
*
|
|
184
|
+
* This resolver does **not** create a live streaming session — it only
|
|
185
|
+
* validates that the configuration, catalog entry, and credentials are
|
|
186
|
+
* all in order. The actual session creation is handled by the runtime
|
|
187
|
+
* session orchestrator (PR 5).
|
|
188
|
+
*
|
|
189
|
+
* Callers can branch on the discriminated `status` field:
|
|
190
|
+
* - `"supported"` — the provider supports streaming and credentials exist.
|
|
191
|
+
* - `"unsupported"` — the provider exists but has
|
|
192
|
+
* `conversationStreamingMode: "none"`.
|
|
193
|
+
* - `"unconfigured"` — the provider is unknown or missing from the catalog.
|
|
194
|
+
* - `"missing-credentials"` — the provider is eligible but has no API key.
|
|
195
|
+
*/
|
|
196
|
+
export async function resolveConversationStreamingSttCapability(): Promise<ConversationStreamingSttCapability> {
|
|
197
|
+
const config = getConfig();
|
|
198
|
+
const provider = config.services.stt.provider;
|
|
199
|
+
|
|
200
|
+
const entry = getProviderEntry(provider as SttProviderId);
|
|
201
|
+
if (!entry) {
|
|
202
|
+
return {
|
|
203
|
+
status: "unconfigured",
|
|
204
|
+
reason: `STT provider "${provider}" is not in the provider catalog`,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (entry.conversationStreamingMode === "none") {
|
|
209
|
+
return {
|
|
210
|
+
status: "unsupported",
|
|
211
|
+
providerId: entry.id,
|
|
212
|
+
reason: `STT provider "${entry.id}" does not support conversation streaming`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Provider is streaming-eligible — verify credentials exist.
|
|
217
|
+
const apiKey = await getProviderKeyAsync(entry.credentialProvider);
|
|
218
|
+
if (!apiKey) {
|
|
219
|
+
return {
|
|
220
|
+
status: "missing-credentials",
|
|
221
|
+
providerId: entry.id,
|
|
222
|
+
credentialProvider: entry.credentialProvider,
|
|
223
|
+
reason: `No API key configured for credential provider "${entry.credentialProvider}"`,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
status: "supported",
|
|
229
|
+
providerId: entry.id,
|
|
230
|
+
streamingMode: entry.conversationStreamingMode,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// Streaming transcriber resolver
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Speaker diarization preference for a streaming session.
|
|
240
|
+
*
|
|
241
|
+
* - `"off"` (default): never request diarization. Behavior unchanged from
|
|
242
|
+
* pre-diarization callers.
|
|
243
|
+
* - `"preferred"`: enable diarization when the configured provider supports
|
|
244
|
+
* it; silently proceed without it on non-capable providers.
|
|
245
|
+
* - `"required"`: enable diarization on capable providers; return `null` and
|
|
246
|
+
* log a warning on non-capable providers. Callers that pass `"required"`
|
|
247
|
+
* are expected to surface a clear error to the user.
|
|
248
|
+
*/
|
|
249
|
+
export type DiarizePreference = "preferred" | "required" | "off";
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Options for resolving a streaming transcriber.
|
|
253
|
+
*/
|
|
254
|
+
export interface ResolveStreamingTranscriberOptions {
|
|
255
|
+
/** Audio sample rate in Hz from the client WebSocket connection. */
|
|
256
|
+
sampleRate?: number;
|
|
257
|
+
/**
|
|
258
|
+
* Speaker diarization preference. Default: `"off"`.
|
|
259
|
+
*
|
|
260
|
+
* See {@link DiarizePreference} for semantics.
|
|
261
|
+
*/
|
|
262
|
+
diarize?: DiarizePreference;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Resolve a `StreamingTranscriber` for daemon-hosted streaming transcription.
|
|
267
|
+
*
|
|
268
|
+
* Reads `services.stt.provider` from the assistant config to determine which
|
|
269
|
+
* STT provider to use, verifies it supports the `daemon-streaming` boundary,
|
|
270
|
+
* and constructs the appropriate streaming adapter. Credential lookup is
|
|
271
|
+
* centralized here (an authorized secure-keys importer) so callers don't
|
|
272
|
+
* need to import secure-keys directly.
|
|
273
|
+
*
|
|
274
|
+
* Returns `null` when:
|
|
275
|
+
* - The configured provider is not in the catalog.
|
|
276
|
+
* - The configured provider doesn't support the `daemon-streaming` boundary.
|
|
277
|
+
* - No credentials are configured for the resolved provider.
|
|
278
|
+
* - No streaming adapter exists for the configured provider.
|
|
279
|
+
* - `diarize` is `"required"` but the configured provider cannot diarize.
|
|
280
|
+
*/
|
|
281
|
+
export async function resolveStreamingTranscriber(
|
|
282
|
+
options: ResolveStreamingTranscriberOptions = {},
|
|
283
|
+
): Promise<StreamingTranscriber | null> {
|
|
284
|
+
const config = getConfig();
|
|
285
|
+
const provider = config.services.stt.provider;
|
|
286
|
+
const diarizePreference: DiarizePreference = options.diarize ?? "off";
|
|
287
|
+
|
|
288
|
+
// Look up credential provider via the catalog.
|
|
289
|
+
const credentialProviderName = getCredentialProvider(
|
|
290
|
+
provider as SttProviderId,
|
|
291
|
+
);
|
|
292
|
+
if (!credentialProviderName) {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// Verify the provider supports the daemon-streaming boundary.
|
|
297
|
+
if (!supportsBoundary(provider as SttProviderId, "daemon-streaming")) {
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Resolve diarization capability against the catalog. For `"required"`
|
|
302
|
+
// callers, bail early (with a warning) when the configured provider can't
|
|
303
|
+
// diarize so the caller can surface a clear error to the user.
|
|
304
|
+
const providerSupportsDiarization = supportsDiarization(
|
|
305
|
+
provider as SttProviderId,
|
|
306
|
+
);
|
|
307
|
+
if (diarizePreference === "required" && !providerSupportsDiarization) {
|
|
308
|
+
log.warn(
|
|
309
|
+
{ providerId: provider },
|
|
310
|
+
"diarization is required but configured STT provider does not support it",
|
|
311
|
+
);
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
const enableDiarization =
|
|
315
|
+
(diarizePreference === "preferred" || diarizePreference === "required") &&
|
|
316
|
+
providerSupportsDiarization;
|
|
317
|
+
|
|
318
|
+
const apiKey = await getProviderKeyAsync(credentialProviderName);
|
|
319
|
+
if (!apiKey) {
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return createStreamingTranscriber(apiKey, provider as SttProviderId, {
|
|
324
|
+
sampleRate: options.sampleRate,
|
|
325
|
+
diarize: enableDiarization,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Options forwarded to individual streaming adapter constructors.
|
|
331
|
+
*/
|
|
332
|
+
interface CreateStreamingTranscriberOptions {
|
|
333
|
+
sampleRate?: number;
|
|
334
|
+
/**
|
|
335
|
+
* Whether to enable speaker diarization on providers that support it.
|
|
336
|
+
* Only forwarded to provider adapters that accept a diarize option
|
|
337
|
+
* (e.g. Deepgram). Silently ignored by adapters without diarization
|
|
338
|
+
* support.
|
|
339
|
+
*/
|
|
340
|
+
diarize?: boolean;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Create a `StreamingTranscriber` for the given provider.
|
|
345
|
+
*
|
|
346
|
+
* Uses lazy imports so the adapter modules are only loaded when needed,
|
|
347
|
+
* keeping the module graph lightweight for callers that only need batch
|
|
348
|
+
* transcription.
|
|
349
|
+
*
|
|
350
|
+
* Returns `null` for providers that do not have a streaming adapter.
|
|
351
|
+
*/
|
|
352
|
+
async function createStreamingTranscriber(
|
|
353
|
+
apiKey: string,
|
|
354
|
+
providerId: SttProviderId,
|
|
355
|
+
options: CreateStreamingTranscriberOptions = {},
|
|
356
|
+
): Promise<StreamingTranscriber | null> {
|
|
357
|
+
switch (providerId) {
|
|
358
|
+
case "deepgram": {
|
|
359
|
+
const { DeepgramRealtimeTranscriber } =
|
|
360
|
+
await import("./deepgram-realtime.js");
|
|
361
|
+
return new DeepgramRealtimeTranscriber(apiKey, {
|
|
362
|
+
sampleRate: options.sampleRate,
|
|
363
|
+
...(options.diarize ? { diarize: true } : {}),
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
case "google-gemini": {
|
|
367
|
+
// Gemini does not support speaker diarization; the diarize option is
|
|
368
|
+
// silently ignored here.
|
|
369
|
+
const { GoogleGeminiLiveStreamingTranscriber } =
|
|
370
|
+
await import("./google-gemini-live-stream.js");
|
|
371
|
+
return new GoogleGeminiLiveStreamingTranscriber(apiKey, {
|
|
372
|
+
pcmSampleRate: options.sampleRate,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
case "openai-whisper": {
|
|
376
|
+
// OpenAI Whisper does not support speaker diarization; the diarize
|
|
377
|
+
// option is silently ignored here.
|
|
378
|
+
const { OpenAIWhisperStreamingTranscriber } =
|
|
379
|
+
await import("./openai-whisper-stream.js");
|
|
380
|
+
return new OpenAIWhisperStreamingTranscriber(apiKey, {
|
|
381
|
+
pcmSampleRate: options.sampleRate,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
default: {
|
|
385
|
+
const _exhaustive: never = providerId;
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
9
389
|
}
|