@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/daemon/lifecycle.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { config as dotenvConfig } from "dotenv";
|
|
2
2
|
|
|
3
|
+
import type { BackupWorkerHandle } from "../backup/backup-worker.js";
|
|
4
|
+
import { startBackupWorker } from "../backup/backup-worker.js";
|
|
3
5
|
import { setPointerMessageProcessor } from "../calls/call-pointer-messages.js";
|
|
4
6
|
import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
|
|
5
7
|
import { setRelayBroadcast } from "../calls/relay-server.js";
|
|
@@ -34,6 +36,11 @@ import {
|
|
|
34
36
|
} from "../credential-execution/startup-timeout.js";
|
|
35
37
|
import { FilingService } from "../filing/filing-service.js";
|
|
36
38
|
import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
39
|
+
import {
|
|
40
|
+
type FeedSchedulerHandle,
|
|
41
|
+
startFeedScheduler,
|
|
42
|
+
} from "../home/feed-scheduler.js";
|
|
43
|
+
import { backfillRelationshipStateIfMissing } from "../home/relationship-state-writer.js";
|
|
37
44
|
import { getHookManager } from "../hooks/manager.js";
|
|
38
45
|
import { installTemplates } from "../hooks/templates.js";
|
|
39
46
|
import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
|
|
@@ -75,6 +82,11 @@ import {
|
|
|
75
82
|
mintPairingBearerToken,
|
|
76
83
|
resolveSigningKey,
|
|
77
84
|
} from "../runtime/auth/token-service.js";
|
|
85
|
+
import {
|
|
86
|
+
initCapabilityTokenSecret,
|
|
87
|
+
loadOrCreateCapabilityTokenSecret,
|
|
88
|
+
writeDaemonTokenFallback,
|
|
89
|
+
} from "../runtime/capability-tokens.js";
|
|
78
90
|
import { ensureVellumGuardianBinding } from "../runtime/guardian-vellum-migration.js";
|
|
79
91
|
import { RuntimeHttpServer } from "../runtime/http-server.js";
|
|
80
92
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
@@ -84,6 +96,7 @@ import {
|
|
|
84
96
|
setCesReconnect,
|
|
85
97
|
} from "../security/secure-keys.js";
|
|
86
98
|
import { UsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
|
|
99
|
+
import { registerBuiltinTtsProviders } from "../tts/providers/register-builtins.js";
|
|
87
100
|
import { getDeviceId } from "../util/device-id.js";
|
|
88
101
|
import { getLogger, initLogger } from "../util/logger.js";
|
|
89
102
|
import {
|
|
@@ -270,11 +283,25 @@ export async function runDaemon(): Promise<void> {
|
|
|
270
283
|
const signingKey = resolveSigningKey();
|
|
271
284
|
initAuthSigningKey(signingKey);
|
|
272
285
|
|
|
286
|
+
// Load (or generate + persist) the capability-token HMAC secret used
|
|
287
|
+
// to mint scoped tokens for the chrome extension pair endpoint.
|
|
288
|
+
// Wrapped in try/catch so a disk failure here never blocks startup —
|
|
289
|
+
// tokens can still be minted using a lazy on-demand load inside the
|
|
290
|
+
// capability-tokens module.
|
|
291
|
+
try {
|
|
292
|
+
initCapabilityTokenSecret(loadOrCreateCapabilityTokenSecret());
|
|
293
|
+
} catch (err) {
|
|
294
|
+
log.warn(
|
|
295
|
+
{ err },
|
|
296
|
+
"Failed to pre-load capability token secret — continuing startup (lazy load will handle subsequent calls)",
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
|
|
273
300
|
// Pre-populate the feature flag cache from the gateway so all
|
|
274
301
|
// subsequent sync isAssistantFeatureFlagEnabled() calls have data.
|
|
275
302
|
// Fired non-blocking so a slow or unreachable gateway doesn't delay
|
|
276
|
-
// daemon startup (the
|
|
277
|
-
// stall the critical path).
|
|
303
|
+
// daemon startup (the IPC call has a 3s connect + 5s call timeout
|
|
304
|
+
// that would otherwise stall the critical path).
|
|
278
305
|
void initFeatureFlagOverrides().catch((err) =>
|
|
279
306
|
log.warn({ err }, "Background feature flag init failed"),
|
|
280
307
|
);
|
|
@@ -360,6 +387,29 @@ export async function runDaemon(): Promise<void> {
|
|
|
360
387
|
);
|
|
361
388
|
}
|
|
362
389
|
|
|
390
|
+
// One-time backfill of `relationship-state.json` for existing or
|
|
391
|
+
// upgraded users so they don't land on an empty Home page after the
|
|
392
|
+
// Phase 3 ship. Runs after DB init + workspace migrations so the
|
|
393
|
+
// writer can actually resolve the guardian persona file and list
|
|
394
|
+
// connected OAuth providers — firing this from `ensurePromptFiles()`
|
|
395
|
+
// would be too early (DB isn't ready yet) and produce a degraded
|
|
396
|
+
// snapshot with zero facts and zero unlocked capabilities.
|
|
397
|
+
//
|
|
398
|
+
// Deferred via `setImmediate` so any sync filesystem/DB work the
|
|
399
|
+
// writer does (`readdirSync`, `readFileSync`, contact + provider
|
|
400
|
+
// lookups) happens on a later tick, off the startup critical path.
|
|
401
|
+
// Failures are logged — not silenced — to match the pattern used by
|
|
402
|
+
// other `void … .catch()` fire-and-forgets in this file and the
|
|
403
|
+
// assistant/CLAUDE.md rule that all errors must be observable.
|
|
404
|
+
setImmediate(() => {
|
|
405
|
+
void backfillRelationshipStateIfMissing().catch((err) =>
|
|
406
|
+
log.warn(
|
|
407
|
+
{ err },
|
|
408
|
+
"Relationship state backfill failed — continuing startup",
|
|
409
|
+
),
|
|
410
|
+
);
|
|
411
|
+
});
|
|
412
|
+
|
|
363
413
|
// Backfill injection templates on Slack bot token credentials so the
|
|
364
414
|
// credential proxy can inject Authorization headers. Safe on every startup.
|
|
365
415
|
try {
|
|
@@ -432,8 +482,11 @@ export async function runDaemon(): Promise<void> {
|
|
|
432
482
|
|
|
433
483
|
// Ensure a vellum guardian binding exists so the identity system works
|
|
434
484
|
// without requiring a manual bootstrap step.
|
|
485
|
+
let localGuardianPrincipalId = "local";
|
|
435
486
|
try {
|
|
436
|
-
ensureVellumGuardianBinding(
|
|
487
|
+
localGuardianPrincipalId = ensureVellumGuardianBinding(
|
|
488
|
+
DAEMON_INTERNAL_ASSISTANT_ID,
|
|
489
|
+
);
|
|
437
490
|
} catch (err) {
|
|
438
491
|
log.warn(
|
|
439
492
|
{ err },
|
|
@@ -441,10 +494,17 @@ export async function runDaemon(): Promise<void> {
|
|
|
441
494
|
);
|
|
442
495
|
}
|
|
443
496
|
|
|
497
|
+
// Write a dev-only fallback capability token to the per-instance
|
|
498
|
+
// protected directory so developers can manually pair the chrome
|
|
499
|
+
// extension without the native messaging helper. Production pairing
|
|
500
|
+
// goes through `POST /v1/browser-extension-pair` via the native helper.
|
|
444
501
|
try {
|
|
445
|
-
|
|
502
|
+
writeDaemonTokenFallback(localGuardianPrincipalId);
|
|
446
503
|
} catch (err) {
|
|
447
|
-
log.warn(
|
|
504
|
+
log.warn(
|
|
505
|
+
{ err },
|
|
506
|
+
"Failed to write dev daemon-token fallback — continuing startup",
|
|
507
|
+
);
|
|
448
508
|
}
|
|
449
509
|
|
|
450
510
|
// Recover orphaned work items that were left in 'running' state when the
|
|
@@ -483,6 +543,18 @@ export async function runDaemon(): Promise<void> {
|
|
|
483
543
|
log.info("Daemon startup: loading config");
|
|
484
544
|
const config = loadConfig();
|
|
485
545
|
|
|
546
|
+
// Run bulletin sync AFTER the config merge + load so that getConfig()
|
|
547
|
+
// inside syncUpdateBulletinOnStartup() observes the fully merged config.
|
|
548
|
+
// Running it earlier would populate the config cache with pre-merge
|
|
549
|
+
// values, poisoning every downstream getConfig() consumer.
|
|
550
|
+
if (dbReady) {
|
|
551
|
+
try {
|
|
552
|
+
syncUpdateBulletinOnStartup();
|
|
553
|
+
} catch (err) {
|
|
554
|
+
log.warn({ err }, "Bulletin sync failed — continuing startup");
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
486
558
|
// Seed module-level ingress state from the workspace config so that
|
|
487
559
|
// getIngressPublicBaseUrl() returns the correct value immediately after
|
|
488
560
|
// startup (before any handleIngressConfig("set") call). Without this,
|
|
@@ -556,18 +628,34 @@ export async function runDaemon(): Promise<void> {
|
|
|
556
628
|
// falling back to the encrypted file store.
|
|
557
629
|
if (cesResult.processManager) {
|
|
558
630
|
const pm = cesResult.processManager;
|
|
631
|
+
|
|
632
|
+
// Snapshot the managed-proxy context and assistant ID at CES startup
|
|
633
|
+
// so the reconnect closure below never calls back into
|
|
634
|
+
// `resolveManagedProxyContext()`. That function reads the assistant
|
|
635
|
+
// API key via `getSecureKeyAsync()`, which — once `setCesClient()`
|
|
636
|
+
// has resolved the backend to CES RPC — routes the read through CES
|
|
637
|
+
// itself. During a reconnect the old transport is dead and a new
|
|
638
|
+
// one is being set up by this very closure, so the nested credential
|
|
639
|
+
// read recursively awaits its own in-flight reconnection and
|
|
640
|
+
// deadlocks until `CREDENTIAL_OP_TIMEOUT_MS` (45s) fires. That
|
|
641
|
+
// 45-second stall delays every CES restart and causes dependent
|
|
642
|
+
// credential reads (e.g. Meet's STT provider resolution) to return
|
|
643
|
+
// `undefined` during the window. API key rotation uses the
|
|
644
|
+
// `updateAssistantApiKey` RPC on the live client, not a reconnect,
|
|
645
|
+
// so caching at startup is safe.
|
|
646
|
+
const startupProxyCtx = await resolveManagedProxyContext();
|
|
647
|
+
const startupAssistantId = getPlatformAssistantId();
|
|
648
|
+
|
|
559
649
|
setCesReconnect(async () => {
|
|
560
650
|
try {
|
|
561
651
|
await pm.stop();
|
|
562
652
|
const transport = await pm.start();
|
|
563
653
|
const newClient = createCesClient(transport);
|
|
564
|
-
const proxyCtx = await resolveManagedProxyContext();
|
|
565
|
-
const assistantId = getPlatformAssistantId();
|
|
566
654
|
const { accepted, reason } = await newClient.handshake({
|
|
567
|
-
...(
|
|
568
|
-
? { assistantApiKey:
|
|
655
|
+
...(startupProxyCtx.assistantApiKey
|
|
656
|
+
? { assistantApiKey: startupProxyCtx.assistantApiKey }
|
|
569
657
|
: {}),
|
|
570
|
-
...(
|
|
658
|
+
...(startupAssistantId ? { assistantId: startupAssistantId } : {}),
|
|
571
659
|
});
|
|
572
660
|
if (accepted) {
|
|
573
661
|
log.info("CES reconnection handshake accepted");
|
|
@@ -589,8 +677,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
589
677
|
}
|
|
590
678
|
}
|
|
591
679
|
|
|
592
|
-
await initializeProvidersAndTools(config);
|
|
593
|
-
|
|
594
680
|
// Start the DaemonServer (conversation manager) before Qdrant so HTTP
|
|
595
681
|
// routes can begin accepting requests while Qdrant initializes.
|
|
596
682
|
log.info("Daemon startup: starting DaemonServer");
|
|
@@ -604,12 +690,13 @@ export async function runDaemon(): Promise<void> {
|
|
|
604
690
|
await server.start();
|
|
605
691
|
log.info("Daemon startup: DaemonServer started");
|
|
606
692
|
|
|
607
|
-
// Mutable refs for Qdrant and
|
|
608
|
-
// them and the shutdown handler always sees the latest value.
|
|
693
|
+
// Mutable refs for Qdrant, memory worker, and backup worker so background
|
|
694
|
+
// init can assign them and the shutdown handler always sees the latest value.
|
|
609
695
|
const bgRefs: {
|
|
610
696
|
qdrantManager: QdrantManager | null;
|
|
611
697
|
memoryWorker: { stop(): void } | null;
|
|
612
|
-
|
|
698
|
+
backupWorker: BackupWorkerHandle | null;
|
|
699
|
+
} = { qdrantManager: null, memoryWorker: null, backupWorker: null };
|
|
613
700
|
|
|
614
701
|
// Initialize Qdrant vector store and memory worker in the background so the
|
|
615
702
|
// RuntimeHttpServer can start accepting requests without waiting for Qdrant.
|
|
@@ -692,6 +779,16 @@ export async function runDaemon(): Promise<void> {
|
|
|
692
779
|
log.info("Daemon startup: starting memory worker");
|
|
693
780
|
bgRefs.memoryWorker = startMemoryJobsWorker();
|
|
694
781
|
|
|
782
|
+
log.info("Daemon startup: starting backup worker");
|
|
783
|
+
try {
|
|
784
|
+
bgRefs.backupWorker = startBackupWorker();
|
|
785
|
+
} catch (err) {
|
|
786
|
+
log.warn(
|
|
787
|
+
{ err },
|
|
788
|
+
"Backup worker failed to start — continuing without backups",
|
|
789
|
+
);
|
|
790
|
+
}
|
|
791
|
+
|
|
695
792
|
// Seed capability graph nodes (new memory graph system)
|
|
696
793
|
try {
|
|
697
794
|
const {
|
|
@@ -727,11 +824,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
727
824
|
}
|
|
728
825
|
}
|
|
729
826
|
|
|
730
|
-
// Fire-and-forget: Qdrant init runs concurrently with the rest of startup
|
|
731
|
-
void initializeQdrantAndMemory().catch((err) =>
|
|
732
|
-
log.warn({ err }, "Background Qdrant init failed"),
|
|
733
|
-
);
|
|
734
|
-
|
|
735
827
|
registerWatcherProviders();
|
|
736
828
|
registerMessagingProviders();
|
|
737
829
|
|
|
@@ -745,12 +837,17 @@ export async function runDaemon(): Promise<void> {
|
|
|
745
837
|
conversationId,
|
|
746
838
|
message,
|
|
747
839
|
undefined,
|
|
748
|
-
options
|
|
840
|
+
options
|
|
749
841
|
? {
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
842
|
+
...(options.trustClass
|
|
843
|
+
? {
|
|
844
|
+
trustContext: {
|
|
845
|
+
sourceChannel: "vellum",
|
|
846
|
+
trustClass: options.trustClass,
|
|
847
|
+
},
|
|
848
|
+
}
|
|
849
|
+
: {}),
|
|
850
|
+
...(options.taskRunId ? { taskRunId: options.taskRunId } : {}),
|
|
754
851
|
}
|
|
755
852
|
: undefined,
|
|
756
853
|
);
|
|
@@ -851,6 +948,19 @@ export async function runDaemon(): Promise<void> {
|
|
|
851
948
|
},
|
|
852
949
|
);
|
|
853
950
|
|
|
951
|
+
// Home activity feed scheduler — drives the assistant reflection
|
|
952
|
+
// loop + the platform Gmail digest. Fire-and-forget; a startup
|
|
953
|
+
// failure must never block the rest of daemon boot (CLAUDE.md).
|
|
954
|
+
let feedScheduler: FeedSchedulerHandle | null = null;
|
|
955
|
+
try {
|
|
956
|
+
feedScheduler = startFeedScheduler();
|
|
957
|
+
} catch (err) {
|
|
958
|
+
log.warn(
|
|
959
|
+
{ err },
|
|
960
|
+
"Failed to start home feed scheduler — continuing startup",
|
|
961
|
+
);
|
|
962
|
+
}
|
|
963
|
+
|
|
854
964
|
// Start the runtime HTTP server. Required for iOS pairing (gateway proxies
|
|
855
965
|
// to it) and optional REST API access. Defaults to port 7821.
|
|
856
966
|
let runtimeHttp: RuntimeHttpServer | null = null;
|
|
@@ -989,8 +1099,19 @@ export async function runDaemon(): Promise<void> {
|
|
|
989
1099
|
onProviderCredentialsChanged: () =>
|
|
990
1100
|
server.refreshConversationsForProviderChange(),
|
|
991
1101
|
getHeartbeatService: () => server.getHeartbeatService(),
|
|
1102
|
+
getFilingService: () => server.getFilingService(),
|
|
992
1103
|
});
|
|
993
1104
|
|
|
1105
|
+
// Fire-and-forget: Qdrant init and memory worker startup run concurrently
|
|
1106
|
+
// with the rest of daemon boot. Must run AFTER `new RuntimeHttpServer(...)`
|
|
1107
|
+
// so the analyze-deps singleton (populated inside `buildRouteTable()`) is
|
|
1108
|
+
// available before the memory worker can claim leftover
|
|
1109
|
+
// `conversation_analyze` jobs from a prior run. See the daemon-startup
|
|
1110
|
+
// ordering test in `assistant/src/daemon/__tests__/`.
|
|
1111
|
+
void initializeQdrantAndMemory().catch((err) =>
|
|
1112
|
+
log.warn({ err }, "Background Qdrant init failed"),
|
|
1113
|
+
);
|
|
1114
|
+
|
|
994
1115
|
// Inject voice bridge deps BEFORE attempting to start the HTTP server.
|
|
995
1116
|
// The bridge must be available even when the HTTP server fails to bind.
|
|
996
1117
|
setVoiceBridgeDeps({
|
|
@@ -1170,6 +1291,32 @@ export async function runDaemon(): Promise<void> {
|
|
|
1170
1291
|
runtimeHttp = null;
|
|
1171
1292
|
}
|
|
1172
1293
|
|
|
1294
|
+
// Register built-in TTS providers so the provider abstraction can resolve
|
|
1295
|
+
// them by ID. Must happen before call controllers or routes are created.
|
|
1296
|
+
try {
|
|
1297
|
+
registerBuiltinTtsProviders();
|
|
1298
|
+
} catch (err) {
|
|
1299
|
+
log.warn(
|
|
1300
|
+
{ err },
|
|
1301
|
+
"TTS provider registration failed — continuing with degraded TTS",
|
|
1302
|
+
);
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
// Initialize providers and tools after the HTTP server is listening so
|
|
1306
|
+
// health-check and pairing requests can be served immediately. Wrapped in
|
|
1307
|
+
// its own try/catch so a failure here doesn't tear down the running HTTP
|
|
1308
|
+
// server (DaemonServer.start() already calls initializeProviders internally
|
|
1309
|
+
// and tools are resolved lazily at conversation creation time).
|
|
1310
|
+
try {
|
|
1311
|
+
log.info("Daemon startup: initializing providers and tools");
|
|
1312
|
+
await initializeProvidersAndTools(config);
|
|
1313
|
+
} catch (err) {
|
|
1314
|
+
log.warn(
|
|
1315
|
+
{ err },
|
|
1316
|
+
"Provider/tool initialization failed — continuing with degraded functionality",
|
|
1317
|
+
);
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1173
1320
|
writePid(process.pid);
|
|
1174
1321
|
log.info({ pid: process.pid }, "Daemon started");
|
|
1175
1322
|
|
|
@@ -1198,10 +1345,11 @@ export async function runDaemon(): Promise<void> {
|
|
|
1198
1345
|
if (!runtimeManager.isReady()) {
|
|
1199
1346
|
log.info("Downloading embedding runtime in background...");
|
|
1200
1347
|
await runtimeManager.ensureInstalled();
|
|
1201
|
-
// Reset the
|
|
1202
|
-
|
|
1348
|
+
// Reset the sticky local-backend failure flag so auto mode retries
|
|
1349
|
+
// local embeddings without evicting a worker that may already be live.
|
|
1350
|
+
const { resetLocalEmbeddingFailureState } =
|
|
1203
1351
|
await import("../memory/embedding-backend.js");
|
|
1204
|
-
|
|
1352
|
+
resetLocalEmbeddingFailureState();
|
|
1205
1353
|
log.info("Embedding runtime download complete");
|
|
1206
1354
|
}
|
|
1207
1355
|
} catch (err) {
|
|
@@ -1279,6 +1427,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1279
1427
|
}),
|
|
1280
1428
|
});
|
|
1281
1429
|
filing.start();
|
|
1430
|
+
server.setFilingService(filing);
|
|
1282
1431
|
log.info(
|
|
1283
1432
|
{
|
|
1284
1433
|
enabled: filingConfig.enabled,
|
|
@@ -1302,7 +1451,9 @@ export async function runDaemon(): Promise<void> {
|
|
|
1302
1451
|
hookManager,
|
|
1303
1452
|
runtimeHttp,
|
|
1304
1453
|
scheduler,
|
|
1454
|
+
feedScheduler,
|
|
1305
1455
|
getMemoryWorker: () => bgRefs.memoryWorker,
|
|
1456
|
+
getBackupWorker: () => bgRefs.backupWorker,
|
|
1306
1457
|
getQdrantManager: () => bgRefs.qdrantManager,
|
|
1307
1458
|
mcpManager,
|
|
1308
1459
|
telemetryReporter,
|
|
@@ -22,11 +22,14 @@ export * from "./message-types/conversations.js";
|
|
|
22
22
|
export * from "./message-types/diagnostics.js";
|
|
23
23
|
export * from "./message-types/documents.js";
|
|
24
24
|
export * from "./message-types/guardian-actions.js";
|
|
25
|
+
export * from "./message-types/home.js";
|
|
25
26
|
export * from "./message-types/host-bash.js";
|
|
27
|
+
export * from "./message-types/host-browser.js";
|
|
26
28
|
export * from "./message-types/host-cu.js";
|
|
27
29
|
export * from "./message-types/host-file.js";
|
|
28
30
|
export * from "./message-types/inbox.js";
|
|
29
31
|
export * from "./message-types/integrations.js";
|
|
32
|
+
export * from "./message-types/meet.js";
|
|
30
33
|
export * from "./message-types/memory.js";
|
|
31
34
|
export * from "./message-types/messages.js";
|
|
32
35
|
export * from "./message-types/notifications.js";
|
|
@@ -76,7 +79,12 @@ import type {
|
|
|
76
79
|
_GuardianActionsClientMessages,
|
|
77
80
|
_GuardianActionsServerMessages,
|
|
78
81
|
} from "./message-types/guardian-actions.js";
|
|
82
|
+
import type { _HomeServerMessages } from "./message-types/home.js";
|
|
79
83
|
import type { _HostBashServerMessages } from "./message-types/host-bash.js";
|
|
84
|
+
import type {
|
|
85
|
+
_HostBrowserClientMessages,
|
|
86
|
+
_HostBrowserServerMessages,
|
|
87
|
+
} from "./message-types/host-browser.js";
|
|
80
88
|
import type { _HostCuServerMessages } from "./message-types/host-cu.js";
|
|
81
89
|
import type { _HostFileServerMessages } from "./message-types/host-file.js";
|
|
82
90
|
import type {
|
|
@@ -87,6 +95,7 @@ import type {
|
|
|
87
95
|
_IntegrationsClientMessages,
|
|
88
96
|
_IntegrationsServerMessages,
|
|
89
97
|
} from "./message-types/integrations.js";
|
|
98
|
+
import type { _MeetServerMessages } from "./message-types/meet.js";
|
|
90
99
|
import type { _MemoryServerMessages } from "./message-types/memory.js";
|
|
91
100
|
import type {
|
|
92
101
|
_MessagesClientMessages,
|
|
@@ -157,6 +166,7 @@ export type ClientMessage =
|
|
|
157
166
|
| _ContactsClientMessages
|
|
158
167
|
| _WorkItemsClientMessages
|
|
159
168
|
| _BrowserClientMessages
|
|
169
|
+
| _HostBrowserClientMessages
|
|
160
170
|
| _SubagentsClientMessages
|
|
161
171
|
| _DocumentsClientMessages
|
|
162
172
|
| _GuardianActionsClientMessages
|
|
@@ -185,9 +195,12 @@ export type ServerMessage =
|
|
|
185
195
|
| _SubagentsServerMessages
|
|
186
196
|
| _DocumentsServerMessages
|
|
187
197
|
| _GuardianActionsServerMessages
|
|
198
|
+
| _HomeServerMessages
|
|
188
199
|
| _HostBashServerMessages
|
|
200
|
+
| _HostBrowserServerMessages
|
|
189
201
|
| _HostCuServerMessages
|
|
190
202
|
| _HostFileServerMessages
|
|
203
|
+
| _MeetServerMessages
|
|
191
204
|
| _MemoryServerMessages
|
|
192
205
|
| _WorkspaceServerMessages
|
|
193
206
|
| _SchedulesServerMessages
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
// Conversation lifecycle, auth, model config, and history types.
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
ChannelId,
|
|
5
|
+
HostProxyInterfaceId,
|
|
6
|
+
InterfaceId,
|
|
7
|
+
} from "../../channels/types.js";
|
|
8
|
+
import { supportsHostProxy } from "../../channels/types.js";
|
|
4
9
|
import type { ConversationType } from "./shared.js";
|
|
5
10
|
import type { UserMessageAttachment } from "./shared.js";
|
|
6
11
|
|
|
@@ -26,26 +31,61 @@ interface BaseTransportMetadata {
|
|
|
26
31
|
chatType?: string;
|
|
27
32
|
}
|
|
28
33
|
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Transport metadata for interfaces that support the full desktop host-proxy
|
|
36
|
+
* set (see `HostProxyInterfaceId` / `supportsHostProxy`). Carries the host
|
|
37
|
+
* environment fields the client reports so the `<workspace>` block renders
|
|
38
|
+
* the user's actual machine rather than a containerized daemon's own OS.
|
|
39
|
+
*
|
|
40
|
+
* Today this variant is populated only by the macOS client, but the shape
|
|
41
|
+
* is capability-keyed (not interface-name-keyed) so future host-capable
|
|
42
|
+
* clients (e.g. a native Linux or Windows desktop) get the same treatment
|
|
43
|
+
* automatically when added to `HostProxyInterfaceId`.
|
|
44
|
+
*/
|
|
45
|
+
export interface HostProxyTransportMetadata extends BaseTransportMetadata {
|
|
46
|
+
/** Interface identifier — restricted to interfaces that support host proxies. */
|
|
47
|
+
interfaceId: HostProxyInterfaceId;
|
|
48
|
+
/** Home directory of the user on the host machine (e.g. `NSHomeDirectory()`). */
|
|
34
49
|
hostHomeDir?: string;
|
|
35
|
-
/** Username of the host
|
|
50
|
+
/** Username of the user on the host machine (e.g. `NSUserName()`). */
|
|
36
51
|
hostUsername?: string;
|
|
37
52
|
}
|
|
38
53
|
|
|
39
|
-
/**
|
|
40
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Transport metadata for interfaces that do NOT support host-proxy tools
|
|
56
|
+
* (iOS, CLI, channel ingress, chrome-extension, etc.). No host environment
|
|
57
|
+
* because the assistant has no local filesystem to address on the client.
|
|
58
|
+
*/
|
|
59
|
+
export interface NonHostProxyTransportMetadata extends BaseTransportMetadata {
|
|
41
60
|
/** Interface identifier for this transport (e.g. "ios", "cli"). */
|
|
42
|
-
interfaceId?: Exclude<InterfaceId,
|
|
61
|
+
interfaceId?: Exclude<InterfaceId, HostProxyInterfaceId>;
|
|
43
62
|
}
|
|
44
63
|
|
|
45
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* Discriminated union of transport metadata variants, keyed on whether the
|
|
66
|
+
* interface supports host-proxy tools (`supportsHostProxy`). The daemon uses
|
|
67
|
+
* that same predicate at runtime to decide whether to populate / read host
|
|
68
|
+
* environment fields on the conversation, so the type system and the runtime
|
|
69
|
+
* gate stay in lock-step as new host-capable interfaces are added.
|
|
70
|
+
*/
|
|
46
71
|
export type ConversationTransportMetadata =
|
|
47
|
-
|
|
|
48
|
-
|
|
|
72
|
+
| HostProxyTransportMetadata
|
|
73
|
+
| NonHostProxyTransportMetadata;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Type guard: does this transport belong to an interface that supports the
|
|
77
|
+
* full host-proxy set? Wraps `supportsHostProxy` so the capability logic
|
|
78
|
+
* stays in one place (channels/types.ts) and narrows the discriminated
|
|
79
|
+
* union to `HostProxyTransportMetadata` for safe field access.
|
|
80
|
+
*/
|
|
81
|
+
export function isHostProxyTransport(
|
|
82
|
+
transport: ConversationTransportMetadata,
|
|
83
|
+
): transport is HostProxyTransportMetadata {
|
|
84
|
+
return (
|
|
85
|
+
transport.interfaceId !== undefined &&
|
|
86
|
+
supportsHostProxy(transport.interfaceId)
|
|
87
|
+
);
|
|
88
|
+
}
|
|
49
89
|
|
|
50
90
|
export interface ConversationCreateRequest {
|
|
51
91
|
type: "conversation_create";
|
|
@@ -171,6 +211,7 @@ export interface ConversationInfo {
|
|
|
171
211
|
title: string;
|
|
172
212
|
correlationId?: string;
|
|
173
213
|
conversationType?: ConversationType;
|
|
214
|
+
hostAccess: boolean;
|
|
174
215
|
}
|
|
175
216
|
|
|
176
217
|
export interface ConversationTitleUpdated {
|
|
@@ -212,6 +253,7 @@ export interface ConversationListResponse {
|
|
|
212
253
|
updatedAt: number;
|
|
213
254
|
conversationType?: ConversationType;
|
|
214
255
|
source?: string;
|
|
256
|
+
hostAccess: boolean;
|
|
215
257
|
scheduleJobId?: string;
|
|
216
258
|
channelBinding?: ChannelBinding;
|
|
217
259
|
conversationOriginChannel?: ChannelId;
|
|
@@ -419,6 +461,20 @@ export interface ConversationErrorMessage {
|
|
|
419
461
|
errorCategory?: string;
|
|
420
462
|
}
|
|
421
463
|
|
|
464
|
+
/** Reason the conversation list was invalidated. */
|
|
465
|
+
export type ConversationListInvalidatedReason =
|
|
466
|
+
| "created"
|
|
467
|
+
| "renamed"
|
|
468
|
+
| "deleted"
|
|
469
|
+
| "reordered"
|
|
470
|
+
| "seen_changed";
|
|
471
|
+
|
|
472
|
+
/** Server push — tells clients their sidebar conversation list is stale. */
|
|
473
|
+
export interface ConversationListInvalidated {
|
|
474
|
+
type: "conversation_list_invalidated";
|
|
475
|
+
reason: ConversationListInvalidatedReason;
|
|
476
|
+
}
|
|
477
|
+
|
|
422
478
|
/** Server push — broadcast when a schedule creates a conversation. */
|
|
423
479
|
export interface ScheduleConversationCreated {
|
|
424
480
|
type: "schedule_conversation_created";
|
|
@@ -427,6 +483,23 @@ export interface ScheduleConversationCreated {
|
|
|
427
483
|
title: string;
|
|
428
484
|
}
|
|
429
485
|
|
|
486
|
+
/**
|
|
487
|
+
* Server push — instructs the client to open and focus a conversation. If
|
|
488
|
+
* the conversation isn't already present in the client's sidebar list (e.g.
|
|
489
|
+
* it was just created via `POST /v1/conversations`), the client should stub
|
|
490
|
+
* a sidebar entry using the provided `title` before navigating.
|
|
491
|
+
*/
|
|
492
|
+
export interface OpenConversation {
|
|
493
|
+
type: "open_conversation";
|
|
494
|
+
conversationId: string;
|
|
495
|
+
/** Optional conversation title; supplied when the client may not yet have the conversation in its list. */
|
|
496
|
+
title?: string;
|
|
497
|
+
/** Optional message ID to scroll to after focus. */
|
|
498
|
+
anchorMessageId?: string;
|
|
499
|
+
/** When `false`, the client should register the conversation in its sidebar (so it's visible and navigable) but must NOT switch focus to it. Omitting the field defaults to `true` for backward compatibility with existing single-target 'jump to conversation' callers. */
|
|
500
|
+
focus?: boolean;
|
|
501
|
+
}
|
|
502
|
+
|
|
430
503
|
// --- Domain-level union aliases (consumed by the barrel file) ---
|
|
431
504
|
|
|
432
505
|
export type _ConversationsClientMessages =
|
|
@@ -465,4 +538,6 @@ export type _ConversationsServerMessages =
|
|
|
465
538
|
| ConversationsClearResponse
|
|
466
539
|
| ConversationSearchResponse
|
|
467
540
|
| MessageContentResponse
|
|
468
|
-
|
|
|
541
|
+
| ConversationListInvalidated
|
|
542
|
+
| ScheduleConversationCreated
|
|
543
|
+
| OpenConversation;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Home — server → client push messages for the macOS Home page.
|
|
3
|
+
*
|
|
4
|
+
* These messages are fire-and-forget notifications; the client reacts
|
|
5
|
+
* by refetching the authoritative state from the HTTP route
|
|
6
|
+
* (`GET /v1/home/state`). Payloads stay deliberately tiny — they carry
|
|
7
|
+
* just enough metadata to invalidate a cache and trigger a refetch.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Broadcast after the daemon successfully writes a fresh
|
|
12
|
+
* `relationship-state.json` snapshot to disk. Subscribers should
|
|
13
|
+
* refetch `GET /v1/home/state` to read the new state.
|
|
14
|
+
*
|
|
15
|
+
* Only emitted on the success branch of the writer — if the
|
|
16
|
+
* underlying `writeFileSync` throws, this event is NOT published.
|
|
17
|
+
*/
|
|
18
|
+
export interface RelationshipStateUpdated {
|
|
19
|
+
type: "relationship_state_updated";
|
|
20
|
+
/** ISO-8601 timestamp of the newly-written state's `updatedAt` field. */
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Broadcast after the daemon successfully writes a fresh home activity
|
|
26
|
+
* feed snapshot. Subscribers (e.g. `HomeFeedStore` on the client) should
|
|
27
|
+
* refetch the authoritative feed from its HTTP route.
|
|
28
|
+
*
|
|
29
|
+
* Only emitted on the success branch of the feed writer — if the
|
|
30
|
+
* underlying write fails, this event is NOT published.
|
|
31
|
+
*/
|
|
32
|
+
export interface HomeFeedUpdated {
|
|
33
|
+
type: "home_feed_updated";
|
|
34
|
+
/** ISO-8601 timestamp of when the feed was written. */
|
|
35
|
+
updatedAt: string;
|
|
36
|
+
/** Count of items with `status === "new"` after this write. */
|
|
37
|
+
newItemCount: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type _HomeServerMessages = RelationshipStateUpdated | HomeFeedUpdated;
|