@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/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";
|
|
@@ -89,6 +96,7 @@ import {
|
|
|
89
96
|
setCesReconnect,
|
|
90
97
|
} from "../security/secure-keys.js";
|
|
91
98
|
import { UsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
|
|
99
|
+
import { registerBuiltinTtsProviders } from "../tts/providers/register-builtins.js";
|
|
92
100
|
import { getDeviceId } from "../util/device-id.js";
|
|
93
101
|
import { getLogger, initLogger } from "../util/logger.js";
|
|
94
102
|
import {
|
|
@@ -292,8 +300,8 @@ export async function runDaemon(): Promise<void> {
|
|
|
292
300
|
// Pre-populate the feature flag cache from the gateway so all
|
|
293
301
|
// subsequent sync isAssistantFeatureFlagEnabled() calls have data.
|
|
294
302
|
// Fired non-blocking so a slow or unreachable gateway doesn't delay
|
|
295
|
-
// daemon startup (the
|
|
296
|
-
// 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).
|
|
297
305
|
void initFeatureFlagOverrides().catch((err) =>
|
|
298
306
|
log.warn({ err }, "Background feature flag init failed"),
|
|
299
307
|
);
|
|
@@ -379,6 +387,29 @@ export async function runDaemon(): Promise<void> {
|
|
|
379
387
|
);
|
|
380
388
|
}
|
|
381
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
|
+
|
|
382
413
|
// Backfill injection templates on Slack bot token credentials so the
|
|
383
414
|
// credential proxy can inject Authorization headers. Safe on every startup.
|
|
384
415
|
try {
|
|
@@ -463,10 +494,10 @@ export async function runDaemon(): Promise<void> {
|
|
|
463
494
|
);
|
|
464
495
|
}
|
|
465
496
|
|
|
466
|
-
// Write a dev-only fallback capability token to
|
|
467
|
-
// so developers can manually pair the chrome
|
|
468
|
-
// native messaging helper. Production pairing
|
|
469
|
-
// `POST /v1/browser-extension-pair` via the native helper.
|
|
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.
|
|
470
501
|
try {
|
|
471
502
|
writeDaemonTokenFallback(localGuardianPrincipalId);
|
|
472
503
|
} catch (err) {
|
|
@@ -476,12 +507,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
476
507
|
);
|
|
477
508
|
}
|
|
478
509
|
|
|
479
|
-
try {
|
|
480
|
-
syncUpdateBulletinOnStartup();
|
|
481
|
-
} catch (err) {
|
|
482
|
-
log.warn({ err }, "Bulletin sync failed — continuing startup");
|
|
483
|
-
}
|
|
484
|
-
|
|
485
510
|
// Recover orphaned work items that were left in 'running' state when the
|
|
486
511
|
// daemon previously crashed or was killed mid-task.
|
|
487
512
|
const orphanedRunning = listWorkItems({ status: "running" });
|
|
@@ -518,6 +543,18 @@ export async function runDaemon(): Promise<void> {
|
|
|
518
543
|
log.info("Daemon startup: loading config");
|
|
519
544
|
const config = loadConfig();
|
|
520
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
|
+
|
|
521
558
|
// Seed module-level ingress state from the workspace config so that
|
|
522
559
|
// getIngressPublicBaseUrl() returns the correct value immediately after
|
|
523
560
|
// startup (before any handleIngressConfig("set") call). Without this,
|
|
@@ -591,18 +628,34 @@ export async function runDaemon(): Promise<void> {
|
|
|
591
628
|
// falling back to the encrypted file store.
|
|
592
629
|
if (cesResult.processManager) {
|
|
593
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
|
+
|
|
594
649
|
setCesReconnect(async () => {
|
|
595
650
|
try {
|
|
596
651
|
await pm.stop();
|
|
597
652
|
const transport = await pm.start();
|
|
598
653
|
const newClient = createCesClient(transport);
|
|
599
|
-
const proxyCtx = await resolveManagedProxyContext();
|
|
600
|
-
const assistantId = getPlatformAssistantId();
|
|
601
654
|
const { accepted, reason } = await newClient.handshake({
|
|
602
|
-
...(
|
|
603
|
-
? { assistantApiKey:
|
|
655
|
+
...(startupProxyCtx.assistantApiKey
|
|
656
|
+
? { assistantApiKey: startupProxyCtx.assistantApiKey }
|
|
604
657
|
: {}),
|
|
605
|
-
...(
|
|
658
|
+
...(startupAssistantId ? { assistantId: startupAssistantId } : {}),
|
|
606
659
|
});
|
|
607
660
|
if (accepted) {
|
|
608
661
|
log.info("CES reconnection handshake accepted");
|
|
@@ -637,12 +690,13 @@ export async function runDaemon(): Promise<void> {
|
|
|
637
690
|
await server.start();
|
|
638
691
|
log.info("Daemon startup: DaemonServer started");
|
|
639
692
|
|
|
640
|
-
// Mutable refs for Qdrant and
|
|
641
|
-
// 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.
|
|
642
695
|
const bgRefs: {
|
|
643
696
|
qdrantManager: QdrantManager | null;
|
|
644
697
|
memoryWorker: { stop(): void } | null;
|
|
645
|
-
|
|
698
|
+
backupWorker: BackupWorkerHandle | null;
|
|
699
|
+
} = { qdrantManager: null, memoryWorker: null, backupWorker: null };
|
|
646
700
|
|
|
647
701
|
// Initialize Qdrant vector store and memory worker in the background so the
|
|
648
702
|
// RuntimeHttpServer can start accepting requests without waiting for Qdrant.
|
|
@@ -725,6 +779,16 @@ export async function runDaemon(): Promise<void> {
|
|
|
725
779
|
log.info("Daemon startup: starting memory worker");
|
|
726
780
|
bgRefs.memoryWorker = startMemoryJobsWorker();
|
|
727
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
|
+
|
|
728
792
|
// Seed capability graph nodes (new memory graph system)
|
|
729
793
|
try {
|
|
730
794
|
const {
|
|
@@ -760,11 +824,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
760
824
|
}
|
|
761
825
|
}
|
|
762
826
|
|
|
763
|
-
// Fire-and-forget: Qdrant init runs concurrently with the rest of startup
|
|
764
|
-
void initializeQdrantAndMemory().catch((err) =>
|
|
765
|
-
log.warn({ err }, "Background Qdrant init failed"),
|
|
766
|
-
);
|
|
767
|
-
|
|
768
827
|
registerWatcherProviders();
|
|
769
828
|
registerMessagingProviders();
|
|
770
829
|
|
|
@@ -889,6 +948,19 @@ export async function runDaemon(): Promise<void> {
|
|
|
889
948
|
},
|
|
890
949
|
);
|
|
891
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
|
+
|
|
892
964
|
// Start the runtime HTTP server. Required for iOS pairing (gateway proxies
|
|
893
965
|
// to it) and optional REST API access. Defaults to port 7821.
|
|
894
966
|
let runtimeHttp: RuntimeHttpServer | null = null;
|
|
@@ -1027,8 +1099,19 @@ export async function runDaemon(): Promise<void> {
|
|
|
1027
1099
|
onProviderCredentialsChanged: () =>
|
|
1028
1100
|
server.refreshConversationsForProviderChange(),
|
|
1029
1101
|
getHeartbeatService: () => server.getHeartbeatService(),
|
|
1102
|
+
getFilingService: () => server.getFilingService(),
|
|
1030
1103
|
});
|
|
1031
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
|
+
|
|
1032
1115
|
// Inject voice bridge deps BEFORE attempting to start the HTTP server.
|
|
1033
1116
|
// The bridge must be available even when the HTTP server fails to bind.
|
|
1034
1117
|
setVoiceBridgeDeps({
|
|
@@ -1208,6 +1291,17 @@ export async function runDaemon(): Promise<void> {
|
|
|
1208
1291
|
runtimeHttp = null;
|
|
1209
1292
|
}
|
|
1210
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
|
+
|
|
1211
1305
|
// Initialize providers and tools after the HTTP server is listening so
|
|
1212
1306
|
// health-check and pairing requests can be served immediately. Wrapped in
|
|
1213
1307
|
// its own try/catch so a failure here doesn't tear down the running HTTP
|
|
@@ -1333,6 +1427,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
1333
1427
|
}),
|
|
1334
1428
|
});
|
|
1335
1429
|
filing.start();
|
|
1430
|
+
server.setFilingService(filing);
|
|
1336
1431
|
log.info(
|
|
1337
1432
|
{
|
|
1338
1433
|
enabled: filingConfig.enabled,
|
|
@@ -1356,7 +1451,9 @@ export async function runDaemon(): Promise<void> {
|
|
|
1356
1451
|
hookManager,
|
|
1357
1452
|
runtimeHttp,
|
|
1358
1453
|
scheduler,
|
|
1454
|
+
feedScheduler,
|
|
1359
1455
|
getMemoryWorker: () => bgRefs.memoryWorker,
|
|
1456
|
+
getBackupWorker: () => bgRefs.backupWorker,
|
|
1360
1457
|
getQdrantManager: () => bgRefs.qdrantManager,
|
|
1361
1458
|
mcpManager,
|
|
1362
1459
|
telemetryReporter,
|
|
@@ -22,12 +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";
|
|
26
27
|
export * from "./message-types/host-browser.js";
|
|
27
28
|
export * from "./message-types/host-cu.js";
|
|
28
29
|
export * from "./message-types/host-file.js";
|
|
29
30
|
export * from "./message-types/inbox.js";
|
|
30
31
|
export * from "./message-types/integrations.js";
|
|
32
|
+
export * from "./message-types/meet.js";
|
|
31
33
|
export * from "./message-types/memory.js";
|
|
32
34
|
export * from "./message-types/messages.js";
|
|
33
35
|
export * from "./message-types/notifications.js";
|
|
@@ -77,6 +79,7 @@ import type {
|
|
|
77
79
|
_GuardianActionsClientMessages,
|
|
78
80
|
_GuardianActionsServerMessages,
|
|
79
81
|
} from "./message-types/guardian-actions.js";
|
|
82
|
+
import type { _HomeServerMessages } from "./message-types/home.js";
|
|
80
83
|
import type { _HostBashServerMessages } from "./message-types/host-bash.js";
|
|
81
84
|
import type {
|
|
82
85
|
_HostBrowserClientMessages,
|
|
@@ -92,6 +95,7 @@ import type {
|
|
|
92
95
|
_IntegrationsClientMessages,
|
|
93
96
|
_IntegrationsServerMessages,
|
|
94
97
|
} from "./message-types/integrations.js";
|
|
98
|
+
import type { _MeetServerMessages } from "./message-types/meet.js";
|
|
95
99
|
import type { _MemoryServerMessages } from "./message-types/memory.js";
|
|
96
100
|
import type {
|
|
97
101
|
_MessagesClientMessages,
|
|
@@ -191,10 +195,12 @@ export type ServerMessage =
|
|
|
191
195
|
| _SubagentsServerMessages
|
|
192
196
|
| _DocumentsServerMessages
|
|
193
197
|
| _GuardianActionsServerMessages
|
|
198
|
+
| _HomeServerMessages
|
|
194
199
|
| _HostBashServerMessages
|
|
195
200
|
| _HostBrowserServerMessages
|
|
196
201
|
| _HostCuServerMessages
|
|
197
202
|
| _HostFileServerMessages
|
|
203
|
+
| _MeetServerMessages
|
|
198
204
|
| _MemoryServerMessages
|
|
199
205
|
| _WorkspaceServerMessages
|
|
200
206
|
| _SchedulesServerMessages
|
|
@@ -461,6 +461,20 @@ export interface ConversationErrorMessage {
|
|
|
461
461
|
errorCategory?: string;
|
|
462
462
|
}
|
|
463
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
|
+
|
|
464
478
|
/** Server push — broadcast when a schedule creates a conversation. */
|
|
465
479
|
export interface ScheduleConversationCreated {
|
|
466
480
|
type: "schedule_conversation_created";
|
|
@@ -469,6 +483,23 @@ export interface ScheduleConversationCreated {
|
|
|
469
483
|
title: string;
|
|
470
484
|
}
|
|
471
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
|
+
|
|
472
503
|
// --- Domain-level union aliases (consumed by the barrel file) ---
|
|
473
504
|
|
|
474
505
|
export type _ConversationsClientMessages =
|
|
@@ -507,4 +538,6 @@ export type _ConversationsServerMessages =
|
|
|
507
538
|
| ConversationsClearResponse
|
|
508
539
|
| ConversationSearchResponse
|
|
509
540
|
| MessageContentResponse
|
|
510
|
-
|
|
|
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;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Meet — server → client push messages for live meeting state.
|
|
3
|
+
*
|
|
4
|
+
* Emitted by the assistant daemon as the Meet-bot progresses through its
|
|
5
|
+
* lifecycle (joining → joined → left) and as in-meeting state changes
|
|
6
|
+
* (participants, active speaker, transcript chunks).
|
|
7
|
+
*
|
|
8
|
+
* Keep payloads small and client-actionable: these events power the
|
|
9
|
+
* macOS "In meeting" status panel and the conversation bridge's live
|
|
10
|
+
* transcript feed. A client that missed an event can always refetch
|
|
11
|
+
* authoritative state from the daemon's HTTP routes.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** A single participant in a meeting. Shape mirrors the wire-level type. */
|
|
15
|
+
export interface MeetParticipant {
|
|
16
|
+
/** Stable participant identifier (provider-specific). */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Display name of the participant. */
|
|
19
|
+
name: string;
|
|
20
|
+
/** Whether the participant is the meeting host. */
|
|
21
|
+
isHost?: boolean;
|
|
22
|
+
/** Whether the participant is the bot itself. */
|
|
23
|
+
isSelf?: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** The bot has started attempting to join a meeting. */
|
|
27
|
+
export interface MeetJoining {
|
|
28
|
+
type: "meet.joining";
|
|
29
|
+
meetingId: string;
|
|
30
|
+
/** The Meet URL the bot was asked to join. */
|
|
31
|
+
url: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** The bot has successfully joined and is live in the meeting. */
|
|
35
|
+
export interface MeetJoined {
|
|
36
|
+
type: "meet.joined";
|
|
37
|
+
meetingId: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Participants joined and/or left the meeting since the last snapshot. */
|
|
41
|
+
export interface MeetParticipantChanged {
|
|
42
|
+
type: "meet.participant_changed";
|
|
43
|
+
meetingId: string;
|
|
44
|
+
/** Participants who joined since the last snapshot. */
|
|
45
|
+
joined: MeetParticipant[];
|
|
46
|
+
/** Participants who left since the last snapshot. */
|
|
47
|
+
left: MeetParticipant[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** The active speaker in the meeting changed. */
|
|
51
|
+
export interface MeetSpeakerChanged {
|
|
52
|
+
type: "meet.speaker_changed";
|
|
53
|
+
meetingId: string;
|
|
54
|
+
/** Stable speaker identifier for the new active speaker. */
|
|
55
|
+
speakerId: string;
|
|
56
|
+
/** Display name of the new active speaker. */
|
|
57
|
+
speakerName: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* A finalized chunk of transcribed speech. Interim chunks are filtered
|
|
62
|
+
* out before publication so clients only render stable text.
|
|
63
|
+
*/
|
|
64
|
+
export interface MeetTranscriptChunk {
|
|
65
|
+
type: "meet.transcript_chunk";
|
|
66
|
+
meetingId: string;
|
|
67
|
+
/** The transcribed text. */
|
|
68
|
+
text: string;
|
|
69
|
+
/** Human-readable speaker label, if the ASR provided one. */
|
|
70
|
+
speakerLabel?: string;
|
|
71
|
+
/** Stable speaker identifier across the meeting, if available. */
|
|
72
|
+
speakerId?: string;
|
|
73
|
+
/** ASR confidence in [0, 1], if available. */
|
|
74
|
+
confidence?: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The bot has left the meeting. */
|
|
78
|
+
export interface MeetLeft {
|
|
79
|
+
type: "meet.left";
|
|
80
|
+
meetingId: string;
|
|
81
|
+
/** Free-form reason passed to `leave()` (e.g. "user-requested", "timeout"). */
|
|
82
|
+
reason: string;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The assistant successfully posted a chat message into the meeting via
|
|
87
|
+
* the bot's `/send_chat` endpoint. Emitted once per successful send so
|
|
88
|
+
* SSE-subscribed clients can render the outbound chat without waiting for
|
|
89
|
+
* the bot to echo it back through the transcript/chat stream.
|
|
90
|
+
*/
|
|
91
|
+
export interface MeetChatSent {
|
|
92
|
+
type: "meet.chat_sent";
|
|
93
|
+
meetingId: string;
|
|
94
|
+
/** The text that was posted into the meeting's chat. */
|
|
95
|
+
text: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** The bot hit a non-recoverable error (container crash, join failure, etc.). */
|
|
99
|
+
export interface MeetError {
|
|
100
|
+
type: "meet.error";
|
|
101
|
+
meetingId: string;
|
|
102
|
+
/** Human-readable error detail. */
|
|
103
|
+
detail: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* The assistant has begun speaking into the meeting via the TTS bridge. Fired
|
|
108
|
+
* once per {@link MeetSessionManager.speak} invocation immediately before the
|
|
109
|
+
* synthesis stream starts flowing to the bot's `/play_audio` endpoint. Useful
|
|
110
|
+
* for clients that want to render a "speaking …" indicator.
|
|
111
|
+
*/
|
|
112
|
+
export interface MeetSpeakingStarted {
|
|
113
|
+
type: "meet.speaking_started";
|
|
114
|
+
meetingId: string;
|
|
115
|
+
/** Opaque stream identifier — matches `meet.speaking_ended.streamId`. */
|
|
116
|
+
streamId: string;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* The assistant has finished (or cancelled) a TTS playback stream. Fired
|
|
121
|
+
* after the bot-side playback request settles — whether normally, via an
|
|
122
|
+
* explicit cancel, or due to an upstream error.
|
|
123
|
+
*/
|
|
124
|
+
export interface MeetSpeakingEnded {
|
|
125
|
+
type: "meet.speaking_ended";
|
|
126
|
+
meetingId: string;
|
|
127
|
+
/** Opaque stream identifier — matches `meet.speaking_started.streamId`. */
|
|
128
|
+
streamId: string;
|
|
129
|
+
/** Why the stream ended: natural completion, caller-initiated cancel, or an upstream error. */
|
|
130
|
+
reason: "completed" | "cancelled" | "error";
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export type _MeetServerMessages =
|
|
134
|
+
| MeetJoining
|
|
135
|
+
| MeetJoined
|
|
136
|
+
| MeetParticipantChanged
|
|
137
|
+
| MeetSpeakerChanged
|
|
138
|
+
| MeetTranscriptChunk
|
|
139
|
+
| MeetLeft
|
|
140
|
+
| MeetChatSent
|
|
141
|
+
| MeetError
|
|
142
|
+
| MeetSpeakingStarted
|
|
143
|
+
| MeetSpeakingEnded;
|
|
@@ -60,6 +60,13 @@ export interface UserMessageEcho {
|
|
|
60
60
|
type: "user_message_echo";
|
|
61
61
|
text: string;
|
|
62
62
|
conversationId?: string;
|
|
63
|
+
/** Database ID of the persisted user message, used by the originating
|
|
64
|
+
* client to dedupe its optimistic row. Absent for synthetic echoes
|
|
65
|
+
* (e.g. surface-action prompts) where no distinct user row is persisted. */
|
|
66
|
+
messageId?: string;
|
|
67
|
+
/** Server-generated request ID for the send. Allows correlation with
|
|
68
|
+
* `message_queued` / `message_dequeued` events for the same turn. */
|
|
69
|
+
requestId?: string;
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
export interface AssistantTextDelta {
|
|
@@ -194,6 +201,13 @@ export interface MessageComplete {
|
|
|
194
201
|
attachmentWarnings?: string[];
|
|
195
202
|
/** Database ID of the persisted assistant message, if any. */
|
|
196
203
|
messageId?: string;
|
|
204
|
+
/**
|
|
205
|
+
* Distinguishes a real main-turn completion from auxiliary events such as
|
|
206
|
+
* call transcripts, call summaries, and watch notifier outputs. Clients
|
|
207
|
+
* gate turn-completion side effects (e.g. the task_complete sound) on
|
|
208
|
+
* `source !== "aux"`. Absent is treated as main for backwards compatibility.
|
|
209
|
+
*/
|
|
210
|
+
source?: "main" | "aux";
|
|
197
211
|
}
|
|
198
212
|
|
|
199
213
|
export interface ErrorMessage {
|
|
@@ -54,6 +54,15 @@ export interface HeartbeatChecklistWrite {
|
|
|
54
54
|
content: string;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
export interface FilingConfig {
|
|
58
|
+
type: "filing_config";
|
|
59
|
+
action: "get";
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface FilingRunNow {
|
|
63
|
+
type: "filing_run_now";
|
|
64
|
+
}
|
|
65
|
+
|
|
57
66
|
// === Server → Client ===
|
|
58
67
|
|
|
59
68
|
export interface SchedulesListResponse {
|
|
@@ -133,6 +142,25 @@ export interface HeartbeatChecklistWriteResponse {
|
|
|
133
142
|
error?: string;
|
|
134
143
|
}
|
|
135
144
|
|
|
145
|
+
export interface FilingConfigResponse {
|
|
146
|
+
type: "filing_config_response";
|
|
147
|
+
enabled: boolean;
|
|
148
|
+
intervalMs: number;
|
|
149
|
+
activeHoursStart: number | null;
|
|
150
|
+
activeHoursEnd: number | null;
|
|
151
|
+
nextRunAt: number | null;
|
|
152
|
+
lastRunAt: number | null;
|
|
153
|
+
success: boolean;
|
|
154
|
+
error?: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface FilingRunNowResponse {
|
|
158
|
+
type: "filing_run_now_response";
|
|
159
|
+
success: boolean;
|
|
160
|
+
ran: boolean;
|
|
161
|
+
error?: string;
|
|
162
|
+
}
|
|
163
|
+
|
|
136
164
|
// --- Domain-level union aliases (consumed by the barrel file) ---
|
|
137
165
|
|
|
138
166
|
export type _SchedulesClientMessages =
|
|
@@ -145,7 +173,9 @@ export type _SchedulesClientMessages =
|
|
|
145
173
|
| HeartbeatRunsList
|
|
146
174
|
| HeartbeatRunNow
|
|
147
175
|
| HeartbeatChecklistRead
|
|
148
|
-
| HeartbeatChecklistWrite
|
|
176
|
+
| HeartbeatChecklistWrite
|
|
177
|
+
| FilingConfig
|
|
178
|
+
| FilingRunNow;
|
|
149
179
|
|
|
150
180
|
export type _SchedulesServerMessages =
|
|
151
181
|
| SchedulesListResponse
|
|
@@ -155,4 +185,6 @@ export type _SchedulesServerMessages =
|
|
|
155
185
|
| HeartbeatRunsListResponse
|
|
156
186
|
| HeartbeatRunNowResponse
|
|
157
187
|
| HeartbeatChecklistResponse
|
|
158
|
-
| HeartbeatChecklistWriteResponse
|
|
188
|
+
| HeartbeatChecklistWriteResponse
|
|
189
|
+
| FilingConfigResponse
|
|
190
|
+
| FilingRunNowResponse;
|