@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
package/src/config/loader.ts
CHANGED
|
@@ -11,22 +11,13 @@ import { dirname, join } from "node:path";
|
|
|
11
11
|
import { ConfigError } from "../util/errors.js";
|
|
12
12
|
import { getLogger } from "../util/logger.js";
|
|
13
13
|
import { ensureDataDir, getWorkspaceConfigPath } from "../util/platform.js";
|
|
14
|
+
import { isAssistantFeatureFlagEnabled } from "./assistant-feature-flags.js";
|
|
14
15
|
import { AssistantConfigSchema } from "./schema.js";
|
|
15
16
|
import type { AssistantConfig } from "./types.js";
|
|
16
17
|
|
|
17
|
-
|
|
18
|
+
export { API_KEY_PROVIDERS } from "../providers/provider-secret-catalog.js";
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
export const API_KEY_PROVIDERS = [
|
|
21
|
-
"anthropic",
|
|
22
|
-
"openai",
|
|
23
|
-
"gemini",
|
|
24
|
-
"ollama",
|
|
25
|
-
"fireworks",
|
|
26
|
-
"openrouter",
|
|
27
|
-
"brave",
|
|
28
|
-
"perplexity",
|
|
29
|
-
] as const;
|
|
20
|
+
const log = getLogger("config");
|
|
30
21
|
|
|
31
22
|
let cached: AssistantConfig | null = null;
|
|
32
23
|
let loading = false;
|
|
@@ -385,7 +376,46 @@ export function loadConfig(): AssistantConfig {
|
|
|
385
376
|
warnAndStripDeprecatedFields(fileConfig, configPath);
|
|
386
377
|
|
|
387
378
|
// Validate and apply defaults via Zod schema
|
|
388
|
-
|
|
379
|
+
let config = validateWithSchema(fileConfig);
|
|
380
|
+
|
|
381
|
+
// Managed Gemini embedding defaults migration.
|
|
382
|
+
// When on a managed platform (IS_PLATFORM=true) with the feature flag
|
|
383
|
+
// enabled and no explicit embedding provider chosen (provider=auto),
|
|
384
|
+
// persist Gemini embedding defaults into the raw config file.
|
|
385
|
+
// Idempotent: once provider=gemini is written, subsequent loads skip this.
|
|
386
|
+
if (config.memory.embeddings.provider === "auto") {
|
|
387
|
+
try {
|
|
388
|
+
if (
|
|
389
|
+
(process.env.IS_PLATFORM === "true" ||
|
|
390
|
+
process.env.IS_PLATFORM === "1") &&
|
|
391
|
+
isManagedGeminiFFEnabled(config)
|
|
392
|
+
) {
|
|
393
|
+
setNestedValue(fileConfig, "memory.embeddings.provider", "gemini");
|
|
394
|
+
setNestedValue(
|
|
395
|
+
fileConfig,
|
|
396
|
+
"memory.embeddings.geminiModel",
|
|
397
|
+
"gemini-embedding-2-preview",
|
|
398
|
+
);
|
|
399
|
+
setNestedValue(
|
|
400
|
+
fileConfig,
|
|
401
|
+
"memory.embeddings.geminiDimensions",
|
|
402
|
+
3072,
|
|
403
|
+
);
|
|
404
|
+
setNestedValue(fileConfig, "memory.qdrant.vectorSize", 3072);
|
|
405
|
+
writeFileSync(configPath, JSON.stringify(fileConfig, null, 2) + "\n");
|
|
406
|
+
log.info(
|
|
407
|
+
"Applied managed Gemini embedding defaults (provider=gemini, model=gemini-embedding-2-preview, dimensions=3072, vectorSize=3072)",
|
|
408
|
+
);
|
|
409
|
+
// Re-validate so the returned config reflects the migration.
|
|
410
|
+
config = validateWithSchema(fileConfig);
|
|
411
|
+
}
|
|
412
|
+
} catch (err) {
|
|
413
|
+
log.warn(
|
|
414
|
+
{ err },
|
|
415
|
+
"Managed Gemini defaults migration failed — continuing with existing config",
|
|
416
|
+
);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
389
419
|
|
|
390
420
|
// If the config file didn't exist, write the full defaults to disk so
|
|
391
421
|
// users can discover and edit all available options.
|
|
@@ -421,6 +451,21 @@ export function loadConfig(): AssistantConfig {
|
|
|
421
451
|
}
|
|
422
452
|
}
|
|
423
453
|
|
|
454
|
+
/**
|
|
455
|
+
* Check whether the managed-gemini-embeddings-enabled feature flag is on.
|
|
456
|
+
* Wrapped in a try/catch so a flag-resolver failure never breaks config loading.
|
|
457
|
+
*/
|
|
458
|
+
function isManagedGeminiFFEnabled(config: AssistantConfig): boolean {
|
|
459
|
+
try {
|
|
460
|
+
return isAssistantFeatureFlagEnabled(
|
|
461
|
+
"managed-gemini-embeddings-enabled",
|
|
462
|
+
config,
|
|
463
|
+
);
|
|
464
|
+
} catch {
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
424
469
|
export function saveConfig(config: AssistantConfig): void {
|
|
425
470
|
ensureMigratedDataDir();
|
|
426
471
|
const configPath = getConfigPath();
|
|
@@ -434,6 +479,30 @@ export function getConfig(): AssistantConfig {
|
|
|
434
479
|
return loadConfig();
|
|
435
480
|
}
|
|
436
481
|
|
|
482
|
+
/**
|
|
483
|
+
* Read-only config accessor: returns the current config without creating
|
|
484
|
+
* directories or writing files. Reads config.json if it exists on disk;
|
|
485
|
+
* returns schema defaults otherwise. Unlike `getConfig()` / `loadConfig()`,
|
|
486
|
+
* this never calls `ensureDataDir()` or writes a default config to disk,
|
|
487
|
+
* making it safe to call during CLI program construction before the
|
|
488
|
+
* workspace-existence check runs.
|
|
489
|
+
*/
|
|
490
|
+
export function getConfigReadOnly(): AssistantConfig {
|
|
491
|
+
if (cached) return cached;
|
|
492
|
+
|
|
493
|
+
const configPath = getConfigPath();
|
|
494
|
+
let fileConfig: Record<string, unknown> = {};
|
|
495
|
+
if (existsSync(configPath)) {
|
|
496
|
+
try {
|
|
497
|
+
fileConfig = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
498
|
+
} catch {
|
|
499
|
+
return cloneDefaultConfig();
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
return validateWithSchema(fileConfig);
|
|
504
|
+
}
|
|
505
|
+
|
|
437
506
|
export function invalidateConfigCache(): void {
|
|
438
507
|
cached = null;
|
|
439
508
|
loading = false;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strips environment-specific fields from config JSON before transferring
|
|
3
|
+
* between local and platform environments (teleport/restore).
|
|
4
|
+
*
|
|
5
|
+
* Fields removed or reset:
|
|
6
|
+
* - `ingress.publicBaseUrl` → set to `""`
|
|
7
|
+
* - `ingress.enabled` → deleted
|
|
8
|
+
* - `daemon` → deleted entirely
|
|
9
|
+
* - `skills.load.extraDirs` → set to `[]`
|
|
10
|
+
*/
|
|
11
|
+
export function sanitizeConfigForTransfer(configJson: string): string {
|
|
12
|
+
let config: Record<string, unknown>;
|
|
13
|
+
try {
|
|
14
|
+
const parsed = JSON.parse(configJson);
|
|
15
|
+
if (
|
|
16
|
+
typeof parsed !== "object" ||
|
|
17
|
+
parsed === null ||
|
|
18
|
+
Array.isArray(parsed)
|
|
19
|
+
) {
|
|
20
|
+
return configJson;
|
|
21
|
+
}
|
|
22
|
+
config = parsed;
|
|
23
|
+
} catch {
|
|
24
|
+
return configJson;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Strip ingress environment-specific fields
|
|
28
|
+
if (config.ingress && typeof config.ingress === "object") {
|
|
29
|
+
const ingress = config.ingress as Record<string, unknown>;
|
|
30
|
+
ingress.publicBaseUrl = "";
|
|
31
|
+
delete ingress.enabled;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Strip daemon entirely
|
|
35
|
+
delete config.daemon;
|
|
36
|
+
|
|
37
|
+
// Strip skills.load.extraDirs
|
|
38
|
+
if (config.skills && typeof config.skills === "object") {
|
|
39
|
+
const skills = config.skills as Record<string, unknown>;
|
|
40
|
+
if (skills.load && typeof skills.load === "object") {
|
|
41
|
+
const load = skills.load as Record<string, unknown>;
|
|
42
|
+
load.extraDirs = [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return JSON.stringify(config, null, 2) + "\n";
|
|
47
|
+
}
|
package/src/config/schema.ts
CHANGED
|
@@ -10,6 +10,10 @@ export {
|
|
|
10
10
|
} from "../permissions/permission-mode.js";
|
|
11
11
|
export type { AcpAgentConfig, AcpConfig } from "./acp-schema.js";
|
|
12
12
|
export { AcpAgentConfigSchema, AcpConfigSchema } from "./acp-schema.js";
|
|
13
|
+
export type { AnalysisConfig } from "./schemas/analysis.js";
|
|
14
|
+
export { AnalysisConfigSchema } from "./schemas/analysis.js";
|
|
15
|
+
export type { BackupConfig, BackupDestination } from "./schemas/backup.js";
|
|
16
|
+
export { BackupConfigSchema } from "./schemas/backup.js";
|
|
13
17
|
export type {
|
|
14
18
|
CallerIdentityConfig,
|
|
15
19
|
CallsConfig,
|
|
@@ -39,16 +43,22 @@ export {
|
|
|
39
43
|
TwilioConfigSchema,
|
|
40
44
|
WhatsAppConfigSchema,
|
|
41
45
|
} from "./schemas/channels.js";
|
|
42
|
-
export type { ElevenLabsConfig } from "./schemas/elevenlabs.js";
|
|
43
46
|
export {
|
|
44
47
|
DEFAULT_ELEVENLABS_VOICE_ID,
|
|
45
|
-
ElevenLabsConfigSchema,
|
|
46
48
|
VALID_CONVERSATION_TIMEOUTS,
|
|
47
49
|
} from "./schemas/elevenlabs.js";
|
|
48
|
-
export type { FishAudioConfig } from "./schemas/fish-audio.js";
|
|
49
|
-
export { FishAudioConfigSchema } from "./schemas/fish-audio.js";
|
|
50
50
|
export type { HeartbeatConfig } from "./schemas/heartbeat.js";
|
|
51
51
|
export { HeartbeatConfigSchema } from "./schemas/heartbeat.js";
|
|
52
|
+
export type {
|
|
53
|
+
DesktopAutoCdpInspectConfig,
|
|
54
|
+
HostBrowserCdpInspectConfig,
|
|
55
|
+
HostBrowserConfig,
|
|
56
|
+
} from "./schemas/host-browser.js";
|
|
57
|
+
export {
|
|
58
|
+
DesktopAutoCdpInspectConfigSchema,
|
|
59
|
+
HostBrowserCdpInspectConfigSchema,
|
|
60
|
+
HostBrowserConfigSchema,
|
|
61
|
+
} from "./schemas/host-browser.js";
|
|
52
62
|
export type {
|
|
53
63
|
ContextOverflowRecoveryConfig,
|
|
54
64
|
ContextWindowConfig,
|
|
@@ -115,6 +125,7 @@ export {
|
|
|
115
125
|
export type { MemoryRetrievalConfig } from "./schemas/memory-retrieval.js";
|
|
116
126
|
export {
|
|
117
127
|
MemoryDynamicBudgetConfigSchema,
|
|
128
|
+
MemoryInjectionConfigSchema,
|
|
118
129
|
MemoryRetrievalConfigSchema,
|
|
119
130
|
} from "./schemas/memory-retrieval.js";
|
|
120
131
|
export type {
|
|
@@ -139,8 +150,6 @@ export {
|
|
|
139
150
|
PlatformConfigSchema,
|
|
140
151
|
UiConfigSchema,
|
|
141
152
|
} from "./schemas/platform.js";
|
|
142
|
-
export type { SandboxConfig } from "./schemas/sandbox.js";
|
|
143
|
-
export { SandboxConfigSchema } from "./schemas/sandbox.js";
|
|
144
153
|
export type {
|
|
145
154
|
PermissionsConfig,
|
|
146
155
|
SecretDetectionConfig,
|
|
@@ -185,16 +194,41 @@ export {
|
|
|
185
194
|
SkillsInstallConfigSchema,
|
|
186
195
|
SkillsLoadConfigSchema,
|
|
187
196
|
} from "./schemas/skills.js";
|
|
197
|
+
export type { SttProviders, SttService } from "./schemas/stt.js";
|
|
198
|
+
export {
|
|
199
|
+
SttProvidersSchema,
|
|
200
|
+
SttServiceSchema,
|
|
201
|
+
VALID_STT_PROVIDERS,
|
|
202
|
+
} from "./schemas/stt.js";
|
|
188
203
|
export type { RateLimitConfig, TimeoutConfig } from "./schemas/timeouts.js";
|
|
189
204
|
export {
|
|
190
205
|
RateLimitConfigSchema,
|
|
191
206
|
TimeoutConfigSchema,
|
|
192
207
|
} from "./schemas/timeouts.js";
|
|
208
|
+
export type {
|
|
209
|
+
TtsDeepgramProviderConfig,
|
|
210
|
+
TtsElevenLabsProviderConfig,
|
|
211
|
+
TtsFishAudioProviderConfig,
|
|
212
|
+
TtsProviders,
|
|
213
|
+
TtsService,
|
|
214
|
+
} from "./schemas/tts.js";
|
|
215
|
+
export {
|
|
216
|
+
TtsDeepgramProviderConfigSchema,
|
|
217
|
+
TtsElevenLabsProviderConfigSchema,
|
|
218
|
+
TtsFishAudioProviderConfigSchema,
|
|
219
|
+
TtsProvidersSchema,
|
|
220
|
+
TtsServiceSchema,
|
|
221
|
+
VALID_TTS_PROVIDERS as VALID_TTS_SERVICE_PROVIDERS,
|
|
222
|
+
} from "./schemas/tts.js";
|
|
223
|
+
export type { UpdatesConfig } from "./schemas/updates.js";
|
|
224
|
+
export { UpdatesConfigSchema } from "./schemas/updates.js";
|
|
193
225
|
export type { WorkspaceGitConfig } from "./schemas/workspace-git.js";
|
|
194
226
|
export { WorkspaceGitConfigSchema } from "./schemas/workspace-git.js";
|
|
195
227
|
|
|
196
228
|
// Imports for AssistantConfigSchema composition
|
|
197
229
|
import { AcpConfigSchema } from "./acp-schema.js";
|
|
230
|
+
import { AnalysisConfigSchema } from "./schemas/analysis.js";
|
|
231
|
+
import { BackupConfigSchema } from "./schemas/backup.js";
|
|
198
232
|
import { CallsConfigSchema } from "./schemas/calls.js";
|
|
199
233
|
import {
|
|
200
234
|
SlackConfigSchema,
|
|
@@ -202,10 +236,9 @@ import {
|
|
|
202
236
|
TwilioConfigSchema,
|
|
203
237
|
WhatsAppConfigSchema,
|
|
204
238
|
} from "./schemas/channels.js";
|
|
205
|
-
import { ElevenLabsConfigSchema } from "./schemas/elevenlabs.js";
|
|
206
239
|
import { FilingConfigSchema } from "./schemas/filing.js";
|
|
207
|
-
import { FishAudioConfigSchema } from "./schemas/fish-audio.js";
|
|
208
240
|
import { HeartbeatConfigSchema } from "./schemas/heartbeat.js";
|
|
241
|
+
import { HostBrowserConfigSchema } from "./schemas/host-browser.js";
|
|
209
242
|
import {
|
|
210
243
|
ContextWindowConfigSchema,
|
|
211
244
|
EffortSchema,
|
|
@@ -227,7 +260,6 @@ import {
|
|
|
227
260
|
PlatformConfigSchema,
|
|
228
261
|
UiConfigSchema,
|
|
229
262
|
} from "./schemas/platform.js";
|
|
230
|
-
import { SandboxConfigSchema } from "./schemas/sandbox.js";
|
|
231
263
|
import {
|
|
232
264
|
PermissionsConfigSchema,
|
|
233
265
|
SecretDetectionConfigSchema,
|
|
@@ -238,6 +270,7 @@ import {
|
|
|
238
270
|
RateLimitConfigSchema,
|
|
239
271
|
TimeoutConfigSchema,
|
|
240
272
|
} from "./schemas/timeouts.js";
|
|
273
|
+
import { UpdatesConfigSchema } from "./schemas/updates.js";
|
|
241
274
|
import { WorkspaceGitConfigSchema } from "./schemas/workspace-git.js";
|
|
242
275
|
|
|
243
276
|
export const AssistantConfigSchema = z
|
|
@@ -247,7 +280,7 @@ export const AssistantConfigSchema = z
|
|
|
247
280
|
.number({ error: "maxTokens must be a number" })
|
|
248
281
|
.int("maxTokens must be an integer")
|
|
249
282
|
.positive("maxTokens must be a positive integer")
|
|
250
|
-
.default(
|
|
283
|
+
.default(64000)
|
|
251
284
|
.describe("Maximum number of output tokens per LLM response"),
|
|
252
285
|
effort: EffortSchema,
|
|
253
286
|
speed: SpeedSchema,
|
|
@@ -261,7 +294,6 @@ export const AssistantConfigSchema = z
|
|
|
261
294
|
.default(getDataDir())
|
|
262
295
|
.describe("Directory for storing assistant data (database, logs, etc.)"),
|
|
263
296
|
timeouts: TimeoutConfigSchema.default(TimeoutConfigSchema.parse({})),
|
|
264
|
-
sandbox: SandboxConfigSchema.default(SandboxConfigSchema.parse({})),
|
|
265
297
|
rateLimit: RateLimitConfigSchema.default(RateLimitConfigSchema.parse({})),
|
|
266
298
|
secretDetection: SecretDetectionConfigSchema.default(
|
|
267
299
|
SecretDetectionConfigSchema.parse({}),
|
|
@@ -281,7 +313,13 @@ export const AssistantConfigSchema = z
|
|
|
281
313
|
),
|
|
282
314
|
filing: FilingConfigSchema.default(FilingConfigSchema.parse({})),
|
|
283
315
|
heartbeat: HeartbeatConfigSchema.default(HeartbeatConfigSchema.parse({})),
|
|
316
|
+
updates: UpdatesConfigSchema.default(UpdatesConfigSchema.parse({})),
|
|
317
|
+
hostBrowser: HostBrowserConfigSchema.default(
|
|
318
|
+
HostBrowserConfigSchema.parse({}),
|
|
319
|
+
),
|
|
284
320
|
journal: JournalConfigSchema.default(JournalConfigSchema.parse({})),
|
|
321
|
+
analysis: AnalysisConfigSchema.default(AnalysisConfigSchema.parse({})),
|
|
322
|
+
backup: BackupConfigSchema.default(BackupConfigSchema.parse({})),
|
|
285
323
|
mcp: McpConfigSchema.default(McpConfigSchema.parse({})),
|
|
286
324
|
acp: AcpConfigSchema.default(AcpConfigSchema.parse({})),
|
|
287
325
|
skills: SkillsConfigSchema.default(SkillsConfigSchema.parse({})),
|
|
@@ -290,10 +328,6 @@ export const AssistantConfigSchema = z
|
|
|
290
328
|
),
|
|
291
329
|
twilio: TwilioConfigSchema.default(TwilioConfigSchema.parse({})),
|
|
292
330
|
calls: CallsConfigSchema.default(CallsConfigSchema.parse({})),
|
|
293
|
-
elevenlabs: ElevenLabsConfigSchema.default(
|
|
294
|
-
ElevenLabsConfigSchema.parse({}),
|
|
295
|
-
),
|
|
296
|
-
fishAudio: FishAudioConfigSchema.default(FishAudioConfigSchema.parse({})),
|
|
297
331
|
whatsapp: WhatsAppConfigSchema.default(WhatsAppConfigSchema.parse({})),
|
|
298
332
|
telegram: TelegramConfigSchema.default(TelegramConfigSchema.parse({})),
|
|
299
333
|
slack: SlackConfigSchema.default(SlackConfigSchema.parse({})),
|
|
@@ -321,6 +355,13 @@ export const AssistantConfigSchema = z
|
|
|
321
355
|
.max(200, "maxStepsPerSession must be <= 200")
|
|
322
356
|
.default(50)
|
|
323
357
|
.describe("Maximum number of computer-use steps per session"),
|
|
358
|
+
systemPromptPrefix: z
|
|
359
|
+
.string({ error: "systemPromptPrefix must be a string" })
|
|
360
|
+
.nullable()
|
|
361
|
+
.default(null)
|
|
362
|
+
.describe(
|
|
363
|
+
"Custom text injected at the very beginning of the system prompt. Defaults to null (no injection).",
|
|
364
|
+
),
|
|
324
365
|
})
|
|
325
366
|
.superRefine((config, ctx) => {
|
|
326
367
|
if (
|
|
@@ -373,6 +414,31 @@ export const AssistantConfigSchema = z
|
|
|
373
414
|
"memory.retrieval.dynamicBudget.minInjectTokens must be <= memory.retrieval.dynamicBudget.maxInjectTokens",
|
|
374
415
|
});
|
|
375
416
|
}
|
|
417
|
+
const injection = config.memory?.retrieval?.injection;
|
|
418
|
+
const ctxLoad = injection?.contextLoad;
|
|
419
|
+
if (
|
|
420
|
+
ctxLoad &&
|
|
421
|
+
ctxLoad.capabilityReserve + ctxLoad.serendipitySlots >= ctxLoad.maxNodes
|
|
422
|
+
) {
|
|
423
|
+
ctx.addIssue({
|
|
424
|
+
code: z.ZodIssueCode.custom,
|
|
425
|
+
path: ["memory", "retrieval", "injection", "contextLoad"],
|
|
426
|
+
message:
|
|
427
|
+
"memory.retrieval.injection.contextLoad.capabilityReserve + serendipitySlots must be less than maxNodes",
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
const perTurn = injection?.perTurn;
|
|
431
|
+
if (
|
|
432
|
+
perTurn &&
|
|
433
|
+
perTurn.capabilityReserve + perTurn.serendipitySlots >= perTurn.maxNodes
|
|
434
|
+
) {
|
|
435
|
+
ctx.addIssue({
|
|
436
|
+
code: z.ZodIssueCode.custom,
|
|
437
|
+
path: ["memory", "retrieval", "injection", "perTurn"],
|
|
438
|
+
message:
|
|
439
|
+
"memory.retrieval.injection.perTurn.capabilityReserve + serendipitySlots must be less than maxNodes",
|
|
440
|
+
});
|
|
441
|
+
}
|
|
376
442
|
});
|
|
377
443
|
|
|
378
444
|
export type AssistantConfig = z.infer<typeof AssistantConfigSchema>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
SttProvidersSchema,
|
|
5
|
+
SttServiceSchema,
|
|
6
|
+
VALID_STT_PROVIDERS,
|
|
7
|
+
} from "../stt.js";
|
|
8
|
+
|
|
9
|
+
describe("SttProvidersSchema", () => {
|
|
10
|
+
test("accepts a Deepgram entry with arbitrary fields (generic record)", () => {
|
|
11
|
+
const parsed = SttProvidersSchema.parse({
|
|
12
|
+
deepgram: { diarize: true },
|
|
13
|
+
});
|
|
14
|
+
expect(parsed).toEqual({ deepgram: { diarize: true } });
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
test("forward-compatible: unknown provider keys still pass validation", () => {
|
|
18
|
+
const parsed = SttProvidersSchema.parse({
|
|
19
|
+
"future-provider": { someField: 42 },
|
|
20
|
+
});
|
|
21
|
+
expect(parsed).toEqual({ "future-provider": { someField: 42 } });
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("empty providers map parses to {}", () => {
|
|
25
|
+
const parsed = SttProvidersSchema.parse({});
|
|
26
|
+
expect(parsed).toEqual({});
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe("SttServiceSchema", () => {
|
|
31
|
+
test("stt.provider=deepgram with providers.deepgram round-trips", () => {
|
|
32
|
+
const parsed = SttServiceSchema.parse({
|
|
33
|
+
provider: "deepgram",
|
|
34
|
+
providers: { deepgram: { diarize: true } },
|
|
35
|
+
});
|
|
36
|
+
expect(parsed.provider).toBe("deepgram");
|
|
37
|
+
expect(parsed.providers.deepgram).toEqual({ diarize: true });
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("VALID_STT_PROVIDERS includes deepgram", () => {
|
|
41
|
+
expect(VALID_STT_PROVIDERS).toContain("deepgram");
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const AnalysisConfigSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
// Number of new messages in the source conversation that trigger an
|
|
6
|
+
// analysis enqueue. Defaults to 3× the extraction batch size so analysis
|
|
7
|
+
// fires less often than extraction.
|
|
8
|
+
batchSize: z
|
|
9
|
+
.number({ error: "analysis.batchSize must be a number" })
|
|
10
|
+
.int("analysis.batchSize must be an integer")
|
|
11
|
+
.positive("analysis.batchSize must be a positive integer")
|
|
12
|
+
.default(30)
|
|
13
|
+
.describe(
|
|
14
|
+
"Number of new messages in the source conversation that trigger an analysis enqueue",
|
|
15
|
+
),
|
|
16
|
+
|
|
17
|
+
// Idle window after the last message before the debounced analysis
|
|
18
|
+
// job fires. Defaults to 2× the extraction idle window.
|
|
19
|
+
idleTimeoutMs: z
|
|
20
|
+
.number({ error: "analysis.idleTimeoutMs must be a number" })
|
|
21
|
+
.int("analysis.idleTimeoutMs must be an integer")
|
|
22
|
+
.positive("analysis.idleTimeoutMs must be a positive integer")
|
|
23
|
+
.default(600_000)
|
|
24
|
+
.describe(
|
|
25
|
+
"Milliseconds of idle time after the last message before the debounced analysis job fires",
|
|
26
|
+
),
|
|
27
|
+
|
|
28
|
+
// Optional model intent for the analysis agent loop. When omitted,
|
|
29
|
+
// the analysis agent uses the same model as the main agent.
|
|
30
|
+
// Accepted values match the main agent's model-intent vocabulary.
|
|
31
|
+
modelIntent: z
|
|
32
|
+
.enum(["latency-optimized", "quality-optimized", "vision-optimized"], {
|
|
33
|
+
error: "analysis.modelIntent must be a valid model intent",
|
|
34
|
+
})
|
|
35
|
+
.optional()
|
|
36
|
+
.describe(
|
|
37
|
+
"Model selection strategy for the analysis agent loop — falls back to the main agent's model when omitted",
|
|
38
|
+
),
|
|
39
|
+
|
|
40
|
+
// Optional explicit model override (provider/model string). Takes
|
|
41
|
+
// precedence over modelIntent when both are set.
|
|
42
|
+
modelOverride: z
|
|
43
|
+
.string({ error: "analysis.modelOverride must be a string" })
|
|
44
|
+
.optional()
|
|
45
|
+
.describe(
|
|
46
|
+
"Explicit model override (provider/model string) for the analysis agent loop — takes precedence over modelIntent when both are set",
|
|
47
|
+
),
|
|
48
|
+
})
|
|
49
|
+
.describe("Controls the auto-analyze agent loop triggered by conversation activity");
|
|
50
|
+
|
|
51
|
+
export type AnalysisConfig = z.infer<typeof AnalysisConfigSchema>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const BackupDestinationSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
path: z
|
|
6
|
+
.string({ error: "backup.offsite.destinations[].path must be a string" })
|
|
7
|
+
.describe("Absolute path to the offsite destination directory"),
|
|
8
|
+
encrypt: z
|
|
9
|
+
.boolean({
|
|
10
|
+
error: "backup.offsite.destinations[].encrypt must be a boolean",
|
|
11
|
+
})
|
|
12
|
+
.default(true)
|
|
13
|
+
.describe(
|
|
14
|
+
"Encrypt backups written to this destination. Defaults to true; set to false only for destinations where the user trusts physical control (e.g. an external SSD).",
|
|
15
|
+
),
|
|
16
|
+
})
|
|
17
|
+
.describe("A single offsite backup destination");
|
|
18
|
+
|
|
19
|
+
export type BackupDestination = z.infer<typeof BackupDestinationSchema>;
|
|
20
|
+
|
|
21
|
+
export const BackupOffsiteConfigSchema = z
|
|
22
|
+
.object({
|
|
23
|
+
enabled: z
|
|
24
|
+
.boolean({ error: "backup.offsite.enabled must be a boolean" })
|
|
25
|
+
.default(true)
|
|
26
|
+
.describe("Whether offsite backup is enabled"),
|
|
27
|
+
destinations: z
|
|
28
|
+
.array(BackupDestinationSchema)
|
|
29
|
+
.nullable()
|
|
30
|
+
.default(null)
|
|
31
|
+
.describe(
|
|
32
|
+
"Offsite destinations. null means use the default iCloud Drive destination with encryption on; an explicit array (including []) overrides the default.",
|
|
33
|
+
),
|
|
34
|
+
})
|
|
35
|
+
.describe("Offsite backup configuration");
|
|
36
|
+
|
|
37
|
+
export type BackupOffsiteConfig = z.infer<typeof BackupOffsiteConfigSchema>;
|
|
38
|
+
|
|
39
|
+
export const BackupConfigSchema = z
|
|
40
|
+
.object({
|
|
41
|
+
enabled: z
|
|
42
|
+
.boolean({ error: "backup.enabled must be a boolean" })
|
|
43
|
+
.default(false)
|
|
44
|
+
.describe("Whether automated backups are enabled"),
|
|
45
|
+
intervalHours: z
|
|
46
|
+
.number({ error: "backup.intervalHours must be a number" })
|
|
47
|
+
.int("backup.intervalHours must be an integer")
|
|
48
|
+
.min(1, "backup.intervalHours must be >= 1")
|
|
49
|
+
.max(168, "backup.intervalHours must be <= 168")
|
|
50
|
+
.default(6)
|
|
51
|
+
.describe("Interval between automated backups, in hours"),
|
|
52
|
+
retention: z
|
|
53
|
+
.number({ error: "backup.retention must be a number" })
|
|
54
|
+
.int("backup.retention must be an integer")
|
|
55
|
+
.min(1, "backup.retention must be >= 1")
|
|
56
|
+
.max(100, "backup.retention must be <= 100")
|
|
57
|
+
.default(7)
|
|
58
|
+
.describe("Number of recent backups to retain"),
|
|
59
|
+
offsite: BackupOffsiteConfigSchema.default(
|
|
60
|
+
BackupOffsiteConfigSchema.parse({}),
|
|
61
|
+
),
|
|
62
|
+
localDirectory: z
|
|
63
|
+
.string({ error: "backup.localDirectory must be a string" })
|
|
64
|
+
.nullable()
|
|
65
|
+
.default(null)
|
|
66
|
+
.describe(
|
|
67
|
+
"Directory for local backup snapshots. null means use the default workspace-adjacent location.",
|
|
68
|
+
),
|
|
69
|
+
})
|
|
70
|
+
.describe("Automated backup configuration");
|
|
71
|
+
|
|
72
|
+
export type BackupConfig = z.infer<typeof BackupConfigSchema>;
|
|
@@ -5,9 +5,6 @@ export const VALID_CALLER_IDENTITY_MODES = [
|
|
|
5
5
|
"assistant_number",
|
|
6
6
|
"user_number",
|
|
7
7
|
] as const;
|
|
8
|
-
const VALID_CALL_TRANSCRIPTION_PROVIDERS = ["Deepgram", "Google"] as const;
|
|
9
|
-
export const VALID_TTS_PROVIDERS = ["elevenlabs", "fish-audio"] as const;
|
|
10
|
-
|
|
11
8
|
export const CallsDisclosureConfigSchema = z
|
|
12
9
|
.object({
|
|
13
10
|
enabled: z
|
|
@@ -50,30 +47,8 @@ export const CallsVoiceConfigSchema = z
|
|
|
50
47
|
.string({ error: "calls.voice.language must be a string" })
|
|
51
48
|
.default("en-US")
|
|
52
49
|
.describe("BCP-47 language code for speech recognition and synthesis"),
|
|
53
|
-
transcriptionProvider: z
|
|
54
|
-
.enum(VALID_CALL_TRANSCRIPTION_PROVIDERS, {
|
|
55
|
-
error: `calls.voice.transcriptionProvider must be one of: ${VALID_CALL_TRANSCRIPTION_PROVIDERS.join(
|
|
56
|
-
", ",
|
|
57
|
-
)}`,
|
|
58
|
-
})
|
|
59
|
-
.default("Deepgram")
|
|
60
|
-
.describe("Speech-to-text provider used for call transcription"),
|
|
61
|
-
speechModel: z
|
|
62
|
-
.string({ error: "calls.voice.speechModel must be a string" })
|
|
63
|
-
.optional()
|
|
64
|
-
.describe(
|
|
65
|
-
"ASR model to use for speech recognition (e.g. nova-3, nova-2-phonecall for Deepgram; telephony, long for Google)",
|
|
66
|
-
),
|
|
67
|
-
ttsProvider: z
|
|
68
|
-
.enum(VALID_TTS_PROVIDERS, {
|
|
69
|
-
error: `calls.voice.ttsProvider must be one of: ${VALID_TTS_PROVIDERS.join(", ")}`,
|
|
70
|
-
})
|
|
71
|
-
.default("elevenlabs")
|
|
72
|
-
.describe("Text-to-speech provider for phone calls"),
|
|
73
50
|
hints: z
|
|
74
|
-
.array(
|
|
75
|
-
z.string({ error: "calls.voice.hints values must be strings" }),
|
|
76
|
-
)
|
|
51
|
+
.array(z.string({ error: "calls.voice.hints values must be strings" }))
|
|
77
52
|
.default([])
|
|
78
53
|
.describe(
|
|
79
54
|
"Static vocabulary hints for speech recognition — proper nouns, domain terms, and other words the STT provider should prioritize",
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
|
|
3
1
|
// Default ElevenLabs voice — "Amelia" (expressive, enthusiastic, British English).
|
|
4
2
|
// Used by both in-app TTS and phone calls (via Twilio ConversationRelay).
|
|
5
3
|
// Mirrored in: clients/macos/.../OpenAIVoiceService.swift (defaultVoiceId)
|
|
@@ -7,60 +5,3 @@ export const DEFAULT_ELEVENLABS_VOICE_ID = "ZF6FPAbjXT4488VcRRnw";
|
|
|
7
5
|
|
|
8
6
|
/** Valid conversation timeout values (seconds). Shared with voice-config-update tool. */
|
|
9
7
|
export const VALID_CONVERSATION_TIMEOUTS = [5, 10, 15, 30, 60] as const;
|
|
10
|
-
|
|
11
|
-
export const ElevenLabsConfigSchema = z
|
|
12
|
-
.object({
|
|
13
|
-
voiceId: z
|
|
14
|
-
.string({ error: "elevenlabs.voiceId must be a string" })
|
|
15
|
-
.min(1, "elevenlabs.voiceId must not be empty")
|
|
16
|
-
.default(DEFAULT_ELEVENLABS_VOICE_ID)
|
|
17
|
-
.describe("ElevenLabs voice ID for text-to-speech"),
|
|
18
|
-
voiceModelId: z
|
|
19
|
-
.string({ error: "elevenlabs.voiceModelId must be a string" })
|
|
20
|
-
.default("")
|
|
21
|
-
.describe(
|
|
22
|
-
"ElevenLabs model ID override (leave empty to use the default model)",
|
|
23
|
-
),
|
|
24
|
-
speed: z
|
|
25
|
-
.number({ error: "elevenlabs.speed must be a number" })
|
|
26
|
-
.min(0.7, "elevenlabs.speed must be >= 0.7")
|
|
27
|
-
.max(1.2, "elevenlabs.speed must be <= 1.2")
|
|
28
|
-
.default(1.0)
|
|
29
|
-
.describe(
|
|
30
|
-
"Speech playback speed multiplier (0.7 = slower, 1.2 = faster)",
|
|
31
|
-
),
|
|
32
|
-
stability: z
|
|
33
|
-
.number({ error: "elevenlabs.stability must be a number" })
|
|
34
|
-
.min(0, "elevenlabs.stability must be >= 0")
|
|
35
|
-
.max(1, "elevenlabs.stability must be <= 1")
|
|
36
|
-
.default(0.5)
|
|
37
|
-
.describe(
|
|
38
|
-
"Voice stability — higher values produce more consistent speech, lower values add expressiveness",
|
|
39
|
-
),
|
|
40
|
-
similarityBoost: z
|
|
41
|
-
.number({ error: "elevenlabs.similarityBoost must be a number" })
|
|
42
|
-
.min(0, "elevenlabs.similarityBoost must be >= 0")
|
|
43
|
-
.max(1, "elevenlabs.similarityBoost must be <= 1")
|
|
44
|
-
.default(0.75)
|
|
45
|
-
.describe(
|
|
46
|
-
"How closely the output matches the original voice — higher values increase similarity",
|
|
47
|
-
),
|
|
48
|
-
conversationTimeoutSeconds: z
|
|
49
|
-
.number({
|
|
50
|
-
error: "elevenlabs.conversationTimeoutSeconds must be a number",
|
|
51
|
-
})
|
|
52
|
-
.refine(
|
|
53
|
-
(v) =>
|
|
54
|
-
VALID_CONVERSATION_TIMEOUTS.includes(
|
|
55
|
-
v as (typeof VALID_CONVERSATION_TIMEOUTS)[number],
|
|
56
|
-
),
|
|
57
|
-
{
|
|
58
|
-
message: `elevenlabs.conversationTimeoutSeconds must be one of: ${VALID_CONVERSATION_TIMEOUTS.join(", ")}`,
|
|
59
|
-
},
|
|
60
|
-
)
|
|
61
|
-
.default(30)
|
|
62
|
-
.describe("Seconds of silence before voice conversation auto-ends"),
|
|
63
|
-
})
|
|
64
|
-
.describe("ElevenLabs text-to-speech configuration");
|
|
65
|
-
|
|
66
|
-
export type ElevenLabsConfig = z.infer<typeof ElevenLabsConfigSchema>;
|