@vellumai/assistant 0.6.3 → 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 +5 -13
- 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/openapi.yaml +982 -72
- package/package.json +4 -6
- package/scripts/generate-openapi.ts +0 -1
- package/scripts/test.sh +73 -18
- 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__/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 +11 -0
- 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 +138 -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-schema.test.ts +1013 -66
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +43 -8
- package/src/__tests__/contact-store-user-file.test.ts +512 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- 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 +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +98 -2
- package/src/__tests__/conversation-confirmation-signals.test.ts +135 -0
- package/src/__tests__/conversation-error.test.ts +70 -0
- package/src/__tests__/conversation-history-web-search.test.ts +11 -4
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
- 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 +901 -60
- package/src/__tests__/conversation-routes-disk-view.test.ts +270 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +55 -0
- 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-tool-setup-batch-authorized.test.ts +226 -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-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +5 -3
- package/src/__tests__/credential-vault-unit.test.ts +379 -3
- package/src/__tests__/credentials-cli.test.ts +40 -16
- package/src/__tests__/cross-provider-web-search.test.ts +146 -35
- 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__/emit-event-signal.test.ts +71 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +75 -8
- package/src/__tests__/fixtures/mock-chrome-extension.ts +11 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
- package/src/__tests__/gateway-only-guard.test.ts +0 -1
- package/src/__tests__/gemini-provider.test.ts +64 -0
- 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__/headless-browser-interactions.test.ts +43 -0
- package/src/__tests__/headless-browser-mode.test.ts +614 -0
- package/src/__tests__/headless-browser-navigate.test.ts +142 -5
- package/src/__tests__/headless-browser-read-tools.test.ts +11 -0
- package/src/__tests__/headless-browser-snapshot.test.ts +10 -0
- 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 +0 -5
- package/src/__tests__/host-browser-e2e-cloud.test.ts +138 -4
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +4 -4
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +103 -0
- package/src/__tests__/host-cu-proxy.test.ts +0 -5
- package/src/__tests__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- 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__/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-export-http.test.ts +6 -6
- package/src/__tests__/migration-import-commit-http.test.ts +8 -6
- 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__/oauth-apps-routes.test.ts +1 -0
- package/src/__tests__/oauth-cli.test.ts +2 -0
- package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +1 -0
- package/src/__tests__/oauth-providers-routes.test.ts +2 -0
- package/src/__tests__/oauth-store.test.ts +85 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +249 -6
- package/src/__tests__/onboarding-template-contract.test.ts +6 -13
- package/src/__tests__/openai-provider.test.ts +176 -0
- 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-unsubscribe.test.ts +31 -2
- package/src/__tests__/persona-resolver.test.ts +251 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
- package/src/__tests__/platform.test.ts +92 -1
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
- package/src/__tests__/pricing.test.ts +174 -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__/search-skills-unified.test.ts +118 -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 +5 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +49 -0
- 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 +276 -145
- package/src/__tests__/skills-files-catalog-fallback.test.ts +381 -93
- 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 +564 -1
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -0
- package/src/__tests__/system-prompt.test.ts +112 -26
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +18 -7
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
- 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__/trust-store.test.ts +7 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- 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__/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/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +43 -3
- 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/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/types.ts +16 -0
- 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 +0 -1
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +255 -3
- package/src/cli/commands/oauth/__tests__/connect.test.ts +12 -0
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +1 -0
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -0
- package/src/cli/commands/oauth/mode.ts +12 -3
- package/src/cli/commands/oauth/providers.ts +15 -0
- package/src/cli/commands/oauth/shared.ts +2 -1
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +4 -9
- 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/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/references/CUSTOM_ROUTES.md +37 -1
- 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 +2 -2
- package/src/config/bundled-skills/gmail/SKILL.md +53 -7
- 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 +2 -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/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 +24 -0
- package/src/config/env.ts +34 -10
- package/src/config/feature-flag-registry.json +46 -14
- package/src/config/loader.ts +26 -12
- package/src/config/schema.ts +35 -10
- 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 +47 -1
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- package/src/config/schemas/services.ts +44 -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 -0
- 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 +3 -2
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +45 -12
- 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 +17 -8
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
- package/src/daemon/config-watcher.ts +99 -5
- package/src/daemon/conversation-agent-loop-handlers.ts +6 -0
- package/src/daemon/conversation-agent-loop.ts +101 -24
- 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 +581 -19
- package/src/daemon/conversation-queue-manager.ts +24 -0
- package/src/daemon/conversation-runtime-assembly.ts +11 -1
- package/src/daemon/conversation-slash.ts +36 -0
- package/src/daemon/conversation-surfaces.ts +94 -4
- package/src/daemon/conversation-tool-setup.ts +25 -0
- package/src/daemon/conversation-usage.ts +7 -4
- package/src/daemon/conversation.ts +86 -28
- package/src/daemon/handlers/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +4 -1
- package/src/daemon/handlers/shared.ts +22 -0
- package/src/daemon/handlers/skills.ts +321 -77
- package/src/daemon/host-browser-proxy.ts +2 -1
- package/src/daemon/lifecycle.ts +122 -25
- package/src/daemon/message-protocol.ts +6 -0
- package/src/daemon/message-types/conversations.ts +34 -1
- package/src/daemon/message-types/home.ts +40 -0
- package/src/daemon/message-types/meet.ts +143 -0
- package/src/daemon/message-types/messages.ts +14 -0
- package/src/daemon/message-types/schedules.ts +34 -2
- package/src/daemon/message-types/skills.ts +16 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/server.ts +347 -2
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +9 -0
- 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 +12 -3
- 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/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 +1 -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 +99 -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/db-init.ts +6 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -0
- package/src/memory/graph/conversation-graph-memory.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 +27 -18
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- 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 +92 -56
- 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 +6 -0
- package/src/memory/migrations/registry.ts +8 -0
- package/src/memory/qdrant-manager.ts +43 -16
- package/src/memory/schema/conversations.ts +2 -0
- package/src/memory/schema/oauth.ts +3 -0
- 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/__tests__/identity-verifier.test.ts +1 -0
- package/src/oauth/byo-connection.test.ts +18 -1
- package/src/oauth/byo-connection.ts +3 -1
- package/src/oauth/connect-orchestrator.ts +2 -0
- package/src/oauth/connection-resolver.ts +6 -2
- package/src/oauth/connection.ts +2 -0
- package/src/oauth/oauth-store.ts +9 -0
- package/src/oauth/platform-connection.test.ts +98 -0
- package/src/oauth/platform-connection.ts +52 -31
- package/src/oauth/seed-providers.ts +7 -0
- package/src/permissions/checker.ts +16 -6
- package/src/permissions/defaults.ts +49 -1
- package/src/permissions/trust-store.ts +3 -3
- 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 +59 -18
- package/src/prompts/templates/BOOTSTRAP.md +5 -5
- 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 -61
- 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 +9 -0
- package/src/runtime/AGENTS.md +43 -1
- package/src/runtime/__tests__/agent-wake.test.ts +831 -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/auth/__tests__/route-policy.test.ts +40 -0
- package/src/runtime/auth/route-policy.ts +30 -5
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/capability-tokens.ts +10 -10
- 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 +38 -2
- package/src/runtime/http-server.ts +395 -10
- package/src/runtime/http-types.ts +6 -2
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +36 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
- package/src/runtime/migrations/migration-transport.ts +1 -0
- package/src/runtime/migrations/migration-wizard.ts +1 -0
- package/src/runtime/migrations/vbundle-import-analyzer.ts +77 -1
- package/src/runtime/migrations/vbundle-importer.ts +34 -0
- package/src/runtime/pending-interactions.ts +0 -11
- 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/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 +82 -23
- 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 -142
- package/src/runtime/routes/conversation-management-routes.ts +115 -0
- package/src/runtime/routes/conversation-routes.ts +367 -146
- package/src/runtime/routes/filing-routes.ts +93 -0
- 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 +3 -14
- package/src/runtime/routes/identity-intro-cache.ts +7 -3
- package/src/runtime/routes/identity-routes.ts +3 -17
- 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/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/migration-routes.ts +40 -5
- package/src/runtime/routes/settings-routes.ts +22 -5
- package/src/runtime/routes/skills-routes.ts +76 -7
- package/src/runtime/routes/stt-routes.ts +233 -0
- 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 +30 -2
- 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/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 +50 -0
- package/src/security/oauth2.ts +26 -4
- package/src/security/secure-keys.ts +25 -2
- package/src/security/token-manager.ts +8 -0
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-files.ts +64 -2
- 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 +38 -14
- 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/browser-execution.ts +1163 -23
- package/src/tools/browser/browser-manager.ts +45 -0
- 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__/cdp-inspect-client.test.ts +393 -0
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +29 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1648 -32
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +264 -0
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +183 -17
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +254 -21
- package/src/tools/browser/cdp-client/errors.ts +15 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +39 -16
- package/src/tools/browser/cdp-client/factory.ts +797 -87
- package/src/tools/browser/cdp-client/index.ts +16 -2
- package/src/tools/browser/cdp-client/types.ts +68 -0
- package/src/tools/credentials/vault.ts +35 -6
- package/src/tools/network/web-fetch.ts +5 -2
- package/src/tools/network/web-search.ts +5 -2
- 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/terminal/safe-env.ts +10 -2
- package/src/tools/terminal/shell.ts +15 -4
- package/src/tools/tool-manifest.ts +21 -0
- package/src/tools/types.ts +17 -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 +54 -10
- 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 +13 -1
- package/src/workspace/turn-commit.ts +31 -0
- package/src/__tests__/email-cli.test.ts +0 -297
- package/src/__tests__/email-service-config-fallback.test.ts +0 -102
- package/src/cli/commands/browser-relay.ts +0 -466
- 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/prompts/templates/USER.md +0 -13
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/runtime/routes/browser-cdp-routes.ts +0 -229
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,21 +43,19 @@ 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
52
|
export type {
|
|
53
|
+
DesktopAutoCdpInspectConfig,
|
|
53
54
|
HostBrowserCdpInspectConfig,
|
|
54
55
|
HostBrowserConfig,
|
|
55
56
|
} from "./schemas/host-browser.js";
|
|
56
57
|
export {
|
|
58
|
+
DesktopAutoCdpInspectConfigSchema,
|
|
57
59
|
HostBrowserCdpInspectConfigSchema,
|
|
58
60
|
HostBrowserConfigSchema,
|
|
59
61
|
} from "./schemas/host-browser.js";
|
|
@@ -192,16 +194,41 @@ export {
|
|
|
192
194
|
SkillsInstallConfigSchema,
|
|
193
195
|
SkillsLoadConfigSchema,
|
|
194
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";
|
|
195
203
|
export type { RateLimitConfig, TimeoutConfig } from "./schemas/timeouts.js";
|
|
196
204
|
export {
|
|
197
205
|
RateLimitConfigSchema,
|
|
198
206
|
TimeoutConfigSchema,
|
|
199
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";
|
|
200
225
|
export type { WorkspaceGitConfig } from "./schemas/workspace-git.js";
|
|
201
226
|
export { WorkspaceGitConfigSchema } from "./schemas/workspace-git.js";
|
|
202
227
|
|
|
203
228
|
// Imports for AssistantConfigSchema composition
|
|
204
229
|
import { AcpConfigSchema } from "./acp-schema.js";
|
|
230
|
+
import { AnalysisConfigSchema } from "./schemas/analysis.js";
|
|
231
|
+
import { BackupConfigSchema } from "./schemas/backup.js";
|
|
205
232
|
import { CallsConfigSchema } from "./schemas/calls.js";
|
|
206
233
|
import {
|
|
207
234
|
SlackConfigSchema,
|
|
@@ -209,9 +236,7 @@ import {
|
|
|
209
236
|
TwilioConfigSchema,
|
|
210
237
|
WhatsAppConfigSchema,
|
|
211
238
|
} from "./schemas/channels.js";
|
|
212
|
-
import { ElevenLabsConfigSchema } from "./schemas/elevenlabs.js";
|
|
213
239
|
import { FilingConfigSchema } from "./schemas/filing.js";
|
|
214
|
-
import { FishAudioConfigSchema } from "./schemas/fish-audio.js";
|
|
215
240
|
import { HeartbeatConfigSchema } from "./schemas/heartbeat.js";
|
|
216
241
|
import { HostBrowserConfigSchema } from "./schemas/host-browser.js";
|
|
217
242
|
import {
|
|
@@ -245,6 +270,7 @@ import {
|
|
|
245
270
|
RateLimitConfigSchema,
|
|
246
271
|
TimeoutConfigSchema,
|
|
247
272
|
} from "./schemas/timeouts.js";
|
|
273
|
+
import { UpdatesConfigSchema } from "./schemas/updates.js";
|
|
248
274
|
import { WorkspaceGitConfigSchema } from "./schemas/workspace-git.js";
|
|
249
275
|
|
|
250
276
|
export const AssistantConfigSchema = z
|
|
@@ -287,10 +313,13 @@ export const AssistantConfigSchema = z
|
|
|
287
313
|
),
|
|
288
314
|
filing: FilingConfigSchema.default(FilingConfigSchema.parse({})),
|
|
289
315
|
heartbeat: HeartbeatConfigSchema.default(HeartbeatConfigSchema.parse({})),
|
|
316
|
+
updates: UpdatesConfigSchema.default(UpdatesConfigSchema.parse({})),
|
|
290
317
|
hostBrowser: HostBrowserConfigSchema.default(
|
|
291
318
|
HostBrowserConfigSchema.parse({}),
|
|
292
319
|
),
|
|
293
320
|
journal: JournalConfigSchema.default(JournalConfigSchema.parse({})),
|
|
321
|
+
analysis: AnalysisConfigSchema.default(AnalysisConfigSchema.parse({})),
|
|
322
|
+
backup: BackupConfigSchema.default(BackupConfigSchema.parse({})),
|
|
294
323
|
mcp: McpConfigSchema.default(McpConfigSchema.parse({})),
|
|
295
324
|
acp: AcpConfigSchema.default(AcpConfigSchema.parse({})),
|
|
296
325
|
skills: SkillsConfigSchema.default(SkillsConfigSchema.parse({})),
|
|
@@ -299,10 +328,6 @@ export const AssistantConfigSchema = z
|
|
|
299
328
|
),
|
|
300
329
|
twilio: TwilioConfigSchema.default(TwilioConfigSchema.parse({})),
|
|
301
330
|
calls: CallsConfigSchema.default(CallsConfigSchema.parse({})),
|
|
302
|
-
elevenlabs: ElevenLabsConfigSchema.default(
|
|
303
|
-
ElevenLabsConfigSchema.parse({}),
|
|
304
|
-
),
|
|
305
|
-
fishAudio: FishAudioConfigSchema.default(FishAudioConfigSchema.parse({})),
|
|
306
331
|
whatsapp: WhatsAppConfigSchema.default(WhatsAppConfigSchema.parse({})),
|
|
307
332
|
telegram: TelegramConfigSchema.default(TelegramConfigSchema.parse({})),
|
|
308
333
|
slack: SlackConfigSchema.default(SlackConfigSchema.parse({})),
|
|
@@ -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>;
|
|
@@ -24,26 +24,66 @@ export const FilingConfigSchema = z
|
|
|
24
24
|
.int("filing.activeHoursStart must be an integer")
|
|
25
25
|
.min(0, "filing.activeHoursStart must be >= 0")
|
|
26
26
|
.max(23, "filing.activeHoursStart must be <= 23")
|
|
27
|
-
.
|
|
28
|
-
.
|
|
27
|
+
.nullable()
|
|
28
|
+
.default(null)
|
|
29
|
+
.describe(
|
|
30
|
+
"Hour of the day (0-23) when filing runs begin, or null to disable active hours restriction",
|
|
31
|
+
),
|
|
29
32
|
activeHoursEnd: z
|
|
30
33
|
.number({ error: "filing.activeHoursEnd must be a number" })
|
|
31
34
|
.int("filing.activeHoursEnd must be an integer")
|
|
32
35
|
.min(0, "filing.activeHoursEnd must be >= 0")
|
|
33
36
|
.max(23, "filing.activeHoursEnd must be <= 23")
|
|
34
|
-
.
|
|
35
|
-
.
|
|
37
|
+
.nullable()
|
|
38
|
+
.default(null)
|
|
39
|
+
.describe(
|
|
40
|
+
"Hour of the day (0-23) when filing runs stop, or null to disable active hours restriction",
|
|
41
|
+
),
|
|
36
42
|
})
|
|
37
43
|
.describe(
|
|
38
44
|
"Periodic PKB (personal knowledge base) filing — processes the buffer into topic files and maintains knowledge organization",
|
|
39
45
|
)
|
|
40
46
|
.superRefine((config, ctx) => {
|
|
41
|
-
|
|
47
|
+
const startNull = config.activeHoursStart == null;
|
|
48
|
+
const endNull = config.activeHoursEnd == null;
|
|
49
|
+
if (startNull !== endNull) {
|
|
50
|
+
// Emit on both fields so validateWithSchema's delete-and-retry repair
|
|
51
|
+
// can strip whichever side was set (and no-op the null side), letting
|
|
52
|
+
// the config fall back to both-null defaults without a full reset.
|
|
53
|
+
const message =
|
|
54
|
+
"filing.activeHoursStart and filing.activeHoursEnd must both be set or both be null";
|
|
55
|
+
ctx.addIssue({
|
|
56
|
+
code: z.ZodIssueCode.custom,
|
|
57
|
+
path: ["activeHoursStart"],
|
|
58
|
+
message,
|
|
59
|
+
});
|
|
60
|
+
ctx.addIssue({
|
|
61
|
+
code: z.ZodIssueCode.custom,
|
|
62
|
+
path: ["activeHoursEnd"],
|
|
63
|
+
message,
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (
|
|
68
|
+
config.activeHoursStart != null &&
|
|
69
|
+
config.activeHoursEnd != null &&
|
|
70
|
+
config.activeHoursStart === config.activeHoursEnd
|
|
71
|
+
) {
|
|
72
|
+
// Emit on both fields. Filing's defaults are null/null, so single-emit
|
|
73
|
+
// on one side would cascade: delete-and-retry strips one key, the null
|
|
74
|
+
// default recreates a new mismatch, and the loader falls back to full
|
|
75
|
+
// defaults — wiping unrelated fields like maxTokens.
|
|
76
|
+
const message =
|
|
77
|
+
"filing.activeHoursStart and filing.activeHoursEnd must not be equal (would create an empty window)";
|
|
78
|
+
ctx.addIssue({
|
|
79
|
+
code: z.ZodIssueCode.custom,
|
|
80
|
+
path: ["activeHoursStart"],
|
|
81
|
+
message,
|
|
82
|
+
});
|
|
42
83
|
ctx.addIssue({
|
|
43
84
|
code: z.ZodIssueCode.custom,
|
|
44
85
|
path: ["activeHoursEnd"],
|
|
45
|
-
message
|
|
46
|
-
"filing.activeHoursStart and filing.activeHoursEnd must not be equal (would create an empty window)",
|
|
86
|
+
message,
|
|
47
87
|
});
|
|
48
88
|
}
|
|
49
89
|
});
|
|
@@ -43,11 +43,23 @@ export const HeartbeatConfigSchema = z
|
|
|
43
43
|
const startNull = config.activeHoursStart == null;
|
|
44
44
|
const endNull = config.activeHoursEnd == null;
|
|
45
45
|
if (startNull !== endNull) {
|
|
46
|
+
// Emit on both fields so validateWithSchema's delete-and-retry strips
|
|
47
|
+
// both sides in one pass. Single-emit on the null side can cascade when
|
|
48
|
+
// the explicit value happens to equal the opposite default (e.g.
|
|
49
|
+
// { start: null, end: 8 } → strip start → default 8 → equal check fires
|
|
50
|
+
// → loader falls back to full defaults, wiping unrelated keys like
|
|
51
|
+
// maxTokens).
|
|
52
|
+
const message =
|
|
53
|
+
"heartbeat.activeHoursStart and heartbeat.activeHoursEnd must both be set or both be null";
|
|
46
54
|
ctx.addIssue({
|
|
47
55
|
code: z.ZodIssueCode.custom,
|
|
48
|
-
path: [
|
|
49
|
-
message
|
|
50
|
-
|
|
56
|
+
path: ["activeHoursStart"],
|
|
57
|
+
message,
|
|
58
|
+
});
|
|
59
|
+
ctx.addIssue({
|
|
60
|
+
code: z.ZodIssueCode.custom,
|
|
61
|
+
path: ["activeHoursEnd"],
|
|
62
|
+
message,
|
|
51
63
|
});
|
|
52
64
|
return;
|
|
53
65
|
}
|
|
@@ -56,11 +68,21 @@ export const HeartbeatConfigSchema = z
|
|
|
56
68
|
config.activeHoursEnd != null &&
|
|
57
69
|
config.activeHoursStart === config.activeHoursEnd
|
|
58
70
|
) {
|
|
71
|
+
// Emit on both fields. Single-emit would strip one side and the default
|
|
72
|
+
// for that side could recreate a new mismatch (e.g. { start: 22, end: 22 }
|
|
73
|
+
// → strip end → default 22 → equal again), cascading to a full defaults
|
|
74
|
+
// reset that wipes unrelated fields.
|
|
75
|
+
const message =
|
|
76
|
+
"heartbeat.activeHoursStart and heartbeat.activeHoursEnd must not be equal (would create an empty window)";
|
|
77
|
+
ctx.addIssue({
|
|
78
|
+
code: z.ZodIssueCode.custom,
|
|
79
|
+
path: ["activeHoursStart"],
|
|
80
|
+
message,
|
|
81
|
+
});
|
|
59
82
|
ctx.addIssue({
|
|
60
83
|
code: z.ZodIssueCode.custom,
|
|
61
84
|
path: ["activeHoursEnd"],
|
|
62
|
-
message
|
|
63
|
-
"heartbeat.activeHoursStart and heartbeat.activeHoursEnd must not be equal (would create an empty window)",
|
|
85
|
+
message,
|
|
64
86
|
});
|
|
65
87
|
}
|
|
66
88
|
});
|
|
@@ -1,5 +1,48 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for the automatic cdp-inspect attempt on macOS. When a macOS
|
|
5
|
+
* turn reaches the CDP factory and `desktopAuto.enabled` is true, the factory
|
|
6
|
+
* includes cdp-inspect as a candidate even when the top-level `enabled` flag
|
|
7
|
+
* is false. This lets macOS users benefit from direct Chrome attach without
|
|
8
|
+
* requiring manual `hostBrowser.cdpInspect.enabled = true`.
|
|
9
|
+
*
|
|
10
|
+
* If the cdp-inspect probe fails (e.g. Chrome was not launched with
|
|
11
|
+
* `--remote-debugging-port`), the factory records a cooldown timestamp and
|
|
12
|
+
* skips the probe for subsequent calls until the cooldown expires. This bounds
|
|
13
|
+
* the per-call latency penalty to `probeTimeoutMs` once per cooldown window.
|
|
14
|
+
*/
|
|
15
|
+
export const DesktopAutoCdpInspectConfigSchema = z
|
|
16
|
+
.object({
|
|
17
|
+
enabled: z
|
|
18
|
+
.boolean({
|
|
19
|
+
error: "hostBrowser.cdpInspect.desktopAuto.enabled must be a boolean",
|
|
20
|
+
})
|
|
21
|
+
.default(true)
|
|
22
|
+
.describe(
|
|
23
|
+
"Whether macOS turns automatically attempt cdp-inspect before falling back to the local Playwright backend. When true (default on macOS), the factory inserts a cdp-inspect candidate between the extension and local backends even when the top-level `cdpInspect.enabled` is false.",
|
|
24
|
+
),
|
|
25
|
+
cooldownMs: z
|
|
26
|
+
.number({
|
|
27
|
+
error: "hostBrowser.cdpInspect.desktopAuto.cooldownMs must be a number",
|
|
28
|
+
})
|
|
29
|
+
.int("hostBrowser.cdpInspect.desktopAuto.cooldownMs must be an integer")
|
|
30
|
+
.min(0, "hostBrowser.cdpInspect.desktopAuto.cooldownMs must be >= 0")
|
|
31
|
+
.max(
|
|
32
|
+
300_000,
|
|
33
|
+
"hostBrowser.cdpInspect.desktopAuto.cooldownMs must be <= 300000",
|
|
34
|
+
)
|
|
35
|
+
.default(30_000)
|
|
36
|
+
.describe(
|
|
37
|
+
"Duration (in milliseconds) to suppress automatic cdp-inspect probes after a transport-level failure. While on cooldown the factory skips the cdp-inspect candidate and goes straight to the local backend. Set to 0 to disable cooldown (always probe).",
|
|
38
|
+
),
|
|
39
|
+
})
|
|
40
|
+
.describe("Auto-attempt policy for cdp-inspect on macOS-originated turns.");
|
|
41
|
+
|
|
42
|
+
export type DesktopAutoCdpInspectConfig = z.infer<
|
|
43
|
+
typeof DesktopAutoCdpInspectConfigSchema
|
|
44
|
+
>;
|
|
45
|
+
|
|
3
46
|
/**
|
|
4
47
|
* Configuration for the `cdp-inspect` browser backend — connects directly
|
|
5
48
|
* to a host Chrome instance that was launched with `--remote-debugging-port`
|
|
@@ -16,7 +59,7 @@ export const HostBrowserCdpInspectConfigSchema = z
|
|
|
16
59
|
),
|
|
17
60
|
host: z
|
|
18
61
|
.string({ error: "hostBrowser.cdpInspect.host must be a string" })
|
|
19
|
-
.
|
|
62
|
+
.transform((v) => v || "localhost")
|
|
20
63
|
.default("localhost")
|
|
21
64
|
.describe(
|
|
22
65
|
"Host name or IP address where the host Chrome instance exposes its remote debugging endpoint.",
|
|
@@ -41,6 +84,9 @@ export const HostBrowserCdpInspectConfigSchema = z
|
|
|
41
84
|
.describe(
|
|
42
85
|
"Timeout (in milliseconds) for the backend availability probe. Kept small so browser tool calls fail fast when the endpoint is unreachable.",
|
|
43
86
|
),
|
|
87
|
+
desktopAuto: DesktopAutoCdpInspectConfigSchema.default(
|
|
88
|
+
DesktopAutoCdpInspectConfigSchema.parse({}),
|
|
89
|
+
),
|
|
44
90
|
})
|
|
45
91
|
.describe(
|
|
46
92
|
"Settings for the cdp-inspect backend that connects to a host Chrome instance via its remote-debugging endpoint.",
|
|
@@ -42,7 +42,7 @@ export const SpeedSchema = z
|
|
|
42
42
|
})
|
|
43
43
|
.default("standard")
|
|
44
44
|
.describe(
|
|
45
|
-
'Inference speed mode — "fast" enables higher output token throughput on supported models (Opus 4.6) at premium pricing',
|
|
45
|
+
'Inference speed mode — "fast" enables higher output token throughput on supported models (Opus 4.6, Opus 4.7) at premium pricing',
|
|
46
46
|
);
|
|
47
47
|
|
|
48
48
|
export type Speed = z.infer<typeof SpeedSchema>;
|
|
@@ -80,9 +80,21 @@ export const MemoryCleanupConfigSchema = z
|
|
|
80
80
|
.nonnegative(
|
|
81
81
|
"memory.cleanup.llmRequestLogRetentionMs must be non-negative",
|
|
82
82
|
)
|
|
83
|
-
|
|
83
|
+
// Upper bound must match gateway MAX_LLM_REQUEST_LOG_RETENTION_MS in
|
|
84
|
+
// gateway/src/http/routes/privacy-config.ts. If a manually edited
|
|
85
|
+
// config.json sets a value larger than this, the gateway GET would
|
|
86
|
+
// return it and the macOS picker would snap it to its largest known
|
|
87
|
+
// option, and the next PATCH would silently truncate the value —
|
|
88
|
+
// causing quiet data loss. Enforcing the same cap here prevents the
|
|
89
|
+
// daemon from accepting out-of-range values in the first place.
|
|
90
|
+
.max(
|
|
91
|
+
365 * 24 * 60 * 60 * 1000,
|
|
92
|
+
"memory.cleanup.llmRequestLogRetentionMs must be <= 365 days in ms",
|
|
93
|
+
)
|
|
94
|
+
.nullable()
|
|
95
|
+
.default(1 * 60 * 60 * 1000)
|
|
84
96
|
.describe(
|
|
85
|
-
"Retention period for LLM request/response logs in milliseconds (0
|
|
97
|
+
"Retention period for LLM request/response logs in milliseconds (null keeps forever, 0 prunes immediately)",
|
|
86
98
|
),
|
|
87
99
|
})
|
|
88
100
|
.describe("Automatic memory cleanup and garbage collection settings");
|