@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.
Files changed (667) hide show
  1. package/ARCHITECTURE.md +273 -10
  2. package/Dockerfile +2 -3
  3. package/bun.lock +5 -13
  4. package/docs/backup-troubleshooting.md +52 -0
  5. package/docs/browser-use-architecture-phase2.md +174 -0
  6. package/docs/stt-provider-onboarding.md +120 -0
  7. package/knip.json +12 -2
  8. package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
  9. package/node_modules/@vellumai/ces-contracts/package.json +3 -3
  10. package/openapi.yaml +982 -72
  11. package/package.json +4 -6
  12. package/scripts/generate-openapi.ts +0 -1
  13. package/scripts/test.sh +73 -18
  14. package/src/__tests__/agent-image-optimize.test.ts +28 -0
  15. package/src/__tests__/agent-loop.test.ts +123 -0
  16. package/src/__tests__/anthropic-provider.test.ts +263 -10
  17. package/src/__tests__/auto-analysis-end-to-end.test.ts +550 -0
  18. package/src/__tests__/auto-analysis-prompt.test.ts +50 -0
  19. package/src/__tests__/browser-fill-credential.test.ts +11 -0
  20. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
  21. package/src/__tests__/browser-skill-endstate.test.ts +31 -7
  22. package/src/__tests__/btw-routes.test.ts +7 -0
  23. package/src/__tests__/call-controller.test.ts +581 -20
  24. package/src/__tests__/catalog-files.test.ts +138 -0
  25. package/src/__tests__/channel-invite-transport.test.ts +2 -2
  26. package/src/__tests__/channel-readiness-routes.test.ts +16 -20
  27. package/src/__tests__/channel-readiness-service.test.ts +12 -7
  28. package/src/__tests__/checker.test.ts +157 -10
  29. package/src/__tests__/clawhub-files.test.ts +347 -0
  30. package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
  31. package/src/__tests__/config-analysis.test.ts +100 -0
  32. package/src/__tests__/config-schema.test.ts +1013 -66
  33. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
  34. package/src/__tests__/config-watcher.test.ts +43 -8
  35. package/src/__tests__/contact-store-user-file.test.ts +512 -0
  36. package/src/__tests__/contacts-write.test.ts +197 -0
  37. package/src/__tests__/context-window-manager.test.ts +88 -0
  38. package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
  39. package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
  40. package/src/__tests__/conversation-agent-loop.test.ts +98 -2
  41. package/src/__tests__/conversation-confirmation-signals.test.ts +135 -0
  42. package/src/__tests__/conversation-error.test.ts +70 -0
  43. package/src/__tests__/conversation-history-web-search.test.ts +11 -4
  44. package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
  45. package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
  46. package/src/__tests__/conversation-list-source.test.ts +145 -0
  47. package/src/__tests__/conversation-pre-run-repair.test.ts +2 -0
  48. package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
  49. package/src/__tests__/conversation-queue.test.ts +901 -60
  50. package/src/__tests__/conversation-routes-disk-view.test.ts +270 -0
  51. package/src/__tests__/conversation-runtime-assembly.test.ts +55 -0
  52. package/src/__tests__/conversation-skill-tools.test.ts +7 -4
  53. package/src/__tests__/conversation-slash-commands.test.ts +33 -0
  54. package/src/__tests__/conversation-slash-queue.test.ts +89 -18
  55. package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
  56. package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
  57. package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
  58. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
  59. package/src/__tests__/credential-health-service.test.ts +352 -0
  60. package/src/__tests__/credential-security-invariants.test.ts +5 -3
  61. package/src/__tests__/credential-vault-unit.test.ts +379 -3
  62. package/src/__tests__/credentials-cli.test.ts +40 -16
  63. package/src/__tests__/cross-provider-web-search.test.ts +146 -35
  64. package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
  65. package/src/__tests__/device-id.test.ts +112 -0
  66. package/src/__tests__/docker-signing-key-bootstrap.test.ts +167 -4
  67. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +1 -3
  68. package/src/__tests__/email-html-renderer.test.ts +71 -0
  69. package/src/__tests__/email-invite-adapter.test.ts +36 -32
  70. package/src/__tests__/emit-event-signal.test.ts +71 -0
  71. package/src/__tests__/extension-id-sync-guard.test.ts +75 -8
  72. package/src/__tests__/fixtures/mock-chrome-extension.ts +11 -0
  73. package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
  74. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  75. package/src/__tests__/gemini-provider.test.ts +64 -0
  76. package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
  77. package/src/__tests__/gmail-archive-fallback.test.ts +193 -0
  78. package/src/__tests__/gmail-archive-gate.test.ts +246 -0
  79. package/src/__tests__/gmail-preferences.test.ts +117 -0
  80. package/src/__tests__/headless-browser-interactions.test.ts +43 -0
  81. package/src/__tests__/headless-browser-mode.test.ts +614 -0
  82. package/src/__tests__/headless-browser-navigate.test.ts +142 -5
  83. package/src/__tests__/headless-browser-read-tools.test.ts +11 -0
  84. package/src/__tests__/headless-browser-snapshot.test.ts +10 -0
  85. package/src/__tests__/heartbeat-service.test.ts +70 -17
  86. package/src/__tests__/home-state-routes.test.ts +162 -0
  87. package/src/__tests__/host-bash-proxy.test.ts +0 -5
  88. package/src/__tests__/host-browser-e2e-cloud.test.ts +138 -4
  89. package/src/__tests__/host-browser-e2e-self-hosted.test.ts +4 -4
  90. package/src/__tests__/host-browser-ws-events-e2e.test.ts +103 -0
  91. package/src/__tests__/host-cu-proxy.test.ts +0 -5
  92. package/src/__tests__/identity-intro-cache.test.ts +40 -10
  93. package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
  94. package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
  95. package/src/__tests__/llm-context-normalization.test.ts +488 -0
  96. package/src/__tests__/llm-context-route-provider.test.ts +86 -5
  97. package/src/__tests__/llm-usage-store.test.ts +363 -0
  98. package/src/__tests__/media-stream-output.test.ts +555 -0
  99. package/src/__tests__/media-stream-parser.test.ts +374 -0
  100. package/src/__tests__/media-stream-server-integration.test.ts +1234 -0
  101. package/src/__tests__/media-stream-stt-session.test.ts +588 -0
  102. package/src/__tests__/media-turn-detector.test.ts +440 -0
  103. package/src/__tests__/message-queue.test.ts +125 -0
  104. package/src/__tests__/migration-export-http.test.ts +6 -6
  105. package/src/__tests__/migration-import-commit-http.test.ts +8 -6
  106. package/src/__tests__/migration-import-preflight-http.test.ts +6 -5
  107. package/src/__tests__/migration-validate-http.test.ts +3 -3
  108. package/src/__tests__/mock-gateway-ipc.ts +151 -0
  109. package/src/__tests__/model-intents.test.ts +2 -2
  110. package/src/__tests__/oauth-apps-routes.test.ts +1 -0
  111. package/src/__tests__/oauth-cli.test.ts +2 -0
  112. package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -0
  113. package/src/__tests__/oauth-provider-serializer.test.ts +1 -0
  114. package/src/__tests__/oauth-providers-routes.test.ts +2 -0
  115. package/src/__tests__/oauth-store.test.ts +85 -0
  116. package/src/__tests__/oauth2-gateway-transport.test.ts +249 -6
  117. package/src/__tests__/onboarding-template-contract.test.ts +6 -13
  118. package/src/__tests__/openai-provider.test.ts +176 -0
  119. package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
  120. package/src/__tests__/openai-responses-provider.test.ts +1105 -0
  121. package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
  122. package/src/__tests__/outlook-unsubscribe.test.ts +31 -2
  123. package/src/__tests__/persona-resolver.test.ts +251 -0
  124. package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
  125. package/src/__tests__/platform.test.ts +92 -1
  126. package/src/__tests__/post-turn-tool-result-truncation.test.ts +47 -0
  127. package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
  128. package/src/__tests__/pricing.test.ts +174 -0
  129. package/src/__tests__/qdrant-manager.test.ts +29 -8
  130. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +194 -0
  131. package/src/__tests__/relationship-state-contract.test.ts +175 -0
  132. package/src/__tests__/relay-server.test.ts +423 -5
  133. package/src/__tests__/search-skills-unified.test.ts +118 -0
  134. package/src/__tests__/secret-scanner-executor.test.ts +4 -0
  135. package/src/__tests__/secure-keys.test.ts +107 -0
  136. package/src/__tests__/send-endpoint-busy.test.ts +5 -1
  137. package/src/__tests__/sequence-store.test.ts +1 -1
  138. package/src/__tests__/server-history-render.test.ts +49 -0
  139. package/src/__tests__/settings-routes.test.ts +201 -0
  140. package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
  141. package/src/__tests__/skills-file-content-endpoint.test.ts +276 -145
  142. package/src/__tests__/skills-files-catalog-fallback.test.ts +381 -93
  143. package/src/__tests__/skills.test.ts +5 -2
  144. package/src/__tests__/skillssh-files.test.ts +446 -0
  145. package/src/__tests__/slack-block-formatting.test.ts +110 -0
  146. package/src/__tests__/slack-channel-config.test.ts +564 -1
  147. package/src/__tests__/stt-catalog-parity.test.ts +282 -0
  148. package/src/__tests__/stt-stream-session.test.ts +535 -0
  149. package/src/__tests__/system-prompt.test.ts +112 -26
  150. package/src/__tests__/telephony-stt-routing.test.ts +329 -0
  151. package/src/__tests__/terminal-tools.test.ts +18 -7
  152. package/src/__tests__/test-preload.ts +18 -0
  153. package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
  154. package/src/__tests__/tool-executor-lifecycle-events.test.ts +9 -5
  155. package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
  156. package/src/__tests__/tool-executor.test.ts +33 -24
  157. package/src/__tests__/tool-result-truncation.test.ts +36 -0
  158. package/src/__tests__/trust-store.test.ts +7 -1
  159. package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
  160. package/src/__tests__/tts-catalog-parity.test.ts +345 -0
  161. package/src/__tests__/twilio-routes-twiml.test.ts +512 -114
  162. package/src/__tests__/twilio-routes.test.ts +376 -0
  163. package/src/__tests__/unicode.test.ts +293 -0
  164. package/src/__tests__/update-bulletin-format.test.ts +59 -0
  165. package/src/__tests__/update-bulletin.test.ts +206 -5
  166. package/src/__tests__/usage-routes.test.ts +25 -4
  167. package/src/__tests__/user-reference.test.ts +46 -61
  168. package/src/__tests__/verification-control-plane-policy.test.ts +4 -0
  169. package/src/__tests__/voice-config-update.test.ts +403 -0
  170. package/src/__tests__/voice-quality.test.ts +434 -19
  171. package/src/__tests__/workspace-heartbeat-service.test.ts +7 -0
  172. package/src/__tests__/workspace-migration-033-stt-service-explicit-config.test.ts +547 -0
  173. package/src/__tests__/workspace-migration-034-remove-calls-voice-transcription-provider.test.ts +596 -0
  174. package/src/__tests__/workspace-migration-drop-user-md.test.ts +368 -0
  175. package/src/__tests__/workspace-migration-meets.test.ts +244 -0
  176. package/src/__tests__/workspace-migration-seed-device-id.test.ts +14 -20
  177. package/src/__tests__/workspace-policy.test.ts +2 -0
  178. package/src/agent/image-optimize.ts +24 -12
  179. package/src/agent/loop.ts +43 -3
  180. package/src/backup/__tests__/backup-key.test.ts +152 -0
  181. package/src/backup/__tests__/backup-worker.test.ts +767 -0
  182. package/src/backup/__tests__/list-snapshots.test.ts +87 -0
  183. package/src/backup/__tests__/local-writer.test.ts +218 -0
  184. package/src/backup/__tests__/offsite-writer.test.ts +641 -0
  185. package/src/backup/__tests__/paths.test.ts +300 -0
  186. package/src/backup/__tests__/restore.test.ts +498 -0
  187. package/src/backup/__tests__/snapshot-lock.test.ts +352 -0
  188. package/src/backup/__tests__/stream-crypt.test.ts +228 -0
  189. package/src/backup/backup-key.ts +137 -0
  190. package/src/backup/backup-worker.ts +459 -0
  191. package/src/backup/list-snapshots.ts +147 -0
  192. package/src/backup/local-writer.ts +133 -0
  193. package/src/backup/offsite-writer.ts +222 -0
  194. package/src/backup/paths.ts +226 -0
  195. package/src/backup/restore.ts +322 -0
  196. package/src/backup/snapshot-lock.ts +431 -0
  197. package/src/backup/stream-crypt.ts +263 -0
  198. package/src/bundler/package-resolver.ts +4 -0
  199. package/src/calls/audio-store.ts +11 -5
  200. package/src/calls/call-controller.ts +226 -71
  201. package/src/calls/call-domain.ts +9 -0
  202. package/src/calls/call-speech-output.ts +190 -0
  203. package/src/calls/call-transport.ts +77 -0
  204. package/src/calls/media-stream-audio-transcode.ts +173 -0
  205. package/src/calls/media-stream-output.ts +660 -0
  206. package/src/calls/media-stream-parser.ts +300 -0
  207. package/src/calls/media-stream-protocol.ts +166 -0
  208. package/src/calls/media-stream-server.ts +592 -0
  209. package/src/calls/media-stream-stt-session.ts +460 -0
  210. package/src/calls/media-turn-detector.ts +230 -0
  211. package/src/calls/relay-server.ts +90 -75
  212. package/src/calls/resolve-call-tts-provider.ts +136 -0
  213. package/src/calls/telephony-stt-routing.ts +145 -0
  214. package/src/calls/tts-call-strategy.ts +161 -0
  215. package/src/calls/tts-text-sanitizer.ts +32 -16
  216. package/src/calls/twilio-routes.ts +281 -17
  217. package/src/calls/voice-quality.ts +78 -35
  218. package/src/calls/voice-session-bridge.ts +8 -1
  219. package/src/channels/types.ts +16 -0
  220. package/src/cli/__tests__/run-assistant-command.ts +11 -1
  221. package/src/cli/commands/__tests__/backup.test.ts +1165 -0
  222. package/src/cli/commands/__tests__/domain-register.test.ts +234 -0
  223. package/src/cli/commands/__tests__/domain-status.test.ts +132 -0
  224. package/src/cli/commands/__tests__/email-attachment.test.ts +422 -0
  225. package/src/cli/commands/__tests__/email-download.test.ts +16 -1
  226. package/src/cli/commands/__tests__/email-list.test.ts +22 -4
  227. package/src/cli/commands/__tests__/email-register.test.ts +4 -4
  228. package/src/cli/commands/__tests__/email-send.test.ts +37 -4
  229. package/src/cli/commands/__tests__/email-status.test.ts +5 -1
  230. package/src/cli/commands/__tests__/email-unregister.test.ts +34 -5
  231. package/src/cli/commands/backup.ts +993 -0
  232. package/src/cli/commands/conversations.ts +77 -0
  233. package/src/cli/commands/credentials.ts +0 -1
  234. package/src/cli/commands/domain.ts +210 -0
  235. package/src/cli/commands/email.ts +255 -3
  236. package/src/cli/commands/oauth/__tests__/connect.test.ts +12 -0
  237. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +1 -0
  238. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +1 -0
  239. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +1 -0
  240. package/src/cli/commands/oauth/mode.ts +12 -3
  241. package/src/cli/commands/oauth/providers.ts +15 -0
  242. package/src/cli/commands/oauth/shared.ts +2 -1
  243. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +4 -9
  244. package/src/cli/commands/platform/__tests__/connect.test.ts +6 -0
  245. package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
  246. package/src/cli/commands/platform/__tests__/status.test.ts +6 -0
  247. package/src/cli/program.ts +30 -4
  248. package/src/config/__tests__/backup-schema.test.ts +134 -0
  249. package/src/config/assistant-feature-flags.ts +61 -62
  250. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +37 -1
  251. package/src/config/bundled-skills/browser/SKILL.md +30 -5
  252. package/src/config/bundled-skills/browser/TOOLS.json +123 -0
  253. package/src/config/bundled-skills/browser/tools/browser-attach.ts +12 -0
  254. package/src/config/bundled-skills/browser/tools/browser-detach.ts +12 -0
  255. package/src/config/bundled-skills/browser/tools/browser-status.ts +12 -0
  256. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +17 -0
  257. package/src/config/bundled-skills/contacts/SKILL.md +2 -2
  258. package/src/config/bundled-skills/gmail/SKILL.md +53 -7
  259. package/src/config/bundled-skills/gmail/TOOLS.json +33 -3
  260. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +116 -9
  261. package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +138 -11
  262. package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +59 -0
  263. package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +82 -0
  264. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +113 -17
  265. package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -2
  266. package/src/config/bundled-skills/media-processing/SKILL.md +3 -9
  267. package/src/config/bundled-skills/media-processing/TOOLS.json +1 -6
  268. package/src/config/bundled-skills/media-processing/__tests__/audio-transcribe.test.ts +125 -0
  269. package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +181 -0
  270. package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +141 -0
  271. package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +32 -87
  272. package/src/config/bundled-skills/media-processing/services/preprocess.ts +8 -4
  273. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +0 -10
  274. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  275. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
  276. package/src/config/bundled-skills/outlook/SKILL.md +2 -2
  277. package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +2 -2
  278. package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
  279. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +27 -18
  280. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
  281. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  282. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +26 -22
  283. package/src/config/bundled-skills/slack/SKILL.md +1 -0
  284. package/src/config/bundled-skills/transcribe/SKILL.md +9 -14
  285. package/src/config/bundled-skills/transcribe/TOOLS.json +2 -7
  286. package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +256 -0
  287. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +38 -188
  288. package/src/config/bundled-tool-registry.ts +8 -0
  289. package/src/config/env-registry.ts +24 -0
  290. package/src/config/env.ts +34 -10
  291. package/src/config/feature-flag-registry.json +46 -14
  292. package/src/config/loader.ts +26 -12
  293. package/src/config/schema.ts +35 -10
  294. package/src/config/schemas/__tests__/stt.test.ts +43 -0
  295. package/src/config/schemas/analysis.ts +51 -0
  296. package/src/config/schemas/backup.ts +72 -0
  297. package/src/config/schemas/calls.ts +1 -26
  298. package/src/config/schemas/elevenlabs.ts +0 -59
  299. package/src/config/schemas/filing.ts +47 -7
  300. package/src/config/schemas/heartbeat.ts +27 -5
  301. package/src/config/schemas/host-browser.ts +47 -1
  302. package/src/config/schemas/inference.ts +1 -1
  303. package/src/config/schemas/memory-lifecycle.ts +14 -2
  304. package/src/config/schemas/services.ts +44 -0
  305. package/src/config/schemas/stt.ts +59 -0
  306. package/src/config/schemas/tts.ts +230 -0
  307. package/src/config/schemas/updates.ts +14 -0
  308. package/src/config/skills.ts +4 -0
  309. package/src/config/types.ts +4 -0
  310. package/src/contacts/contact-store.ts +56 -11
  311. package/src/contacts/contacts-write.ts +38 -1
  312. package/src/context/post-turn-tool-result-truncation.ts +3 -2
  313. package/src/context/tool-result-truncation.ts +2 -1
  314. package/src/context/window-manager.ts +45 -12
  315. package/src/credential-execution/executable-discovery.ts +12 -2
  316. package/src/credential-execution/process-manager.ts +33 -2
  317. package/src/credential-health/credential-health-service.ts +366 -0
  318. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +324 -0
  319. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +497 -0
  320. package/src/daemon/__tests__/conversation-tool-setup.test.ts +17 -8
  321. package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
  322. package/src/daemon/config-watcher.ts +99 -5
  323. package/src/daemon/conversation-agent-loop-handlers.ts +6 -0
  324. package/src/daemon/conversation-agent-loop.ts +101 -24
  325. package/src/daemon/conversation-error.ts +11 -0
  326. package/src/daemon/conversation-history.ts +40 -6
  327. package/src/daemon/conversation-launch.ts +220 -0
  328. package/src/daemon/conversation-lifecycle.ts +59 -9
  329. package/src/daemon/conversation-messaging.ts +37 -3
  330. package/src/daemon/conversation-notifiers.ts +5 -0
  331. package/src/daemon/conversation-process.ts +581 -19
  332. package/src/daemon/conversation-queue-manager.ts +24 -0
  333. package/src/daemon/conversation-runtime-assembly.ts +11 -1
  334. package/src/daemon/conversation-slash.ts +36 -0
  335. package/src/daemon/conversation-surfaces.ts +94 -4
  336. package/src/daemon/conversation-tool-setup.ts +25 -0
  337. package/src/daemon/conversation-usage.ts +7 -4
  338. package/src/daemon/conversation.ts +86 -28
  339. package/src/daemon/handlers/config-slack-channel.ts +269 -94
  340. package/src/daemon/handlers/conversations.ts +4 -1
  341. package/src/daemon/handlers/shared.ts +22 -0
  342. package/src/daemon/handlers/skills.ts +321 -77
  343. package/src/daemon/host-browser-proxy.ts +2 -1
  344. package/src/daemon/lifecycle.ts +122 -25
  345. package/src/daemon/message-protocol.ts +6 -0
  346. package/src/daemon/message-types/conversations.ts +34 -1
  347. package/src/daemon/message-types/home.ts +40 -0
  348. package/src/daemon/message-types/meet.ts +143 -0
  349. package/src/daemon/message-types/messages.ts +14 -0
  350. package/src/daemon/message-types/schedules.ts +34 -2
  351. package/src/daemon/message-types/skills.ts +16 -0
  352. package/src/daemon/message-types/surfaces.ts +2 -0
  353. package/src/daemon/server.ts +347 -2
  354. package/src/daemon/shutdown-handlers.ts +32 -4
  355. package/src/daemon/shutdown-registry.ts +40 -0
  356. package/src/daemon/tool-side-effects.ts +9 -0
  357. package/src/email/html-renderer.ts +76 -0
  358. package/src/heartbeat/heartbeat-service.ts +93 -7
  359. package/src/home/__tests__/assistant-feed-authoring.test.ts +156 -0
  360. package/src/home/__tests__/emit-feed-event.test.ts +169 -0
  361. package/src/home/__tests__/feed-scheduler.test.ts +194 -0
  362. package/src/home/__tests__/feed-types.test.ts +275 -0
  363. package/src/home/__tests__/feed-writer.test.ts +688 -0
  364. package/src/home/__tests__/phase5-exit-criteria.test.ts +212 -0
  365. package/src/home/__tests__/platform-gmail-digest.test.ts +222 -0
  366. package/src/home/__tests__/progress-formula.test.ts +213 -0
  367. package/src/home/__tests__/relationship-state-writer.test.ts +740 -0
  368. package/src/home/__tests__/rollup-producer.test.ts +398 -0
  369. package/src/home/assistant-feed-authoring.ts +124 -0
  370. package/src/home/emit-feed-event.ts +158 -0
  371. package/src/home/feed-scheduler.ts +247 -0
  372. package/src/home/feed-types.ts +181 -0
  373. package/src/home/feed-writer.ts +469 -0
  374. package/src/home/platform-gmail-digest.ts +163 -0
  375. package/src/home/progress-formula.ts +86 -0
  376. package/src/home/relationship-state-writer.ts +824 -0
  377. package/src/home/relationship-state.ts +143 -0
  378. package/src/home/rollup-producer.ts +384 -0
  379. package/src/hooks/runner.ts +7 -0
  380. package/src/inbound/platform-callback-registration.ts +12 -3
  381. package/src/inbound/public-ingress-urls.ts +12 -0
  382. package/src/instrument.ts +1 -1
  383. package/src/ipc/__tests__/cli-ipc.test.ts +200 -0
  384. package/src/ipc/cli-client.ts +151 -0
  385. package/src/ipc/cli-server.ts +234 -0
  386. package/src/ipc/gateway-client.ts +180 -0
  387. package/src/ipc/routes/index.ts +5 -0
  388. package/src/ipc/routes/wake-conversation.ts +19 -0
  389. package/src/memory/__tests__/auto-analysis-enqueue.test.ts +356 -0
  390. package/src/memory/__tests__/auto-analysis-guard.test.ts +57 -0
  391. package/src/memory/__tests__/conversation-analyze-job.test.ts +232 -0
  392. package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
  393. package/src/memory/app-store.ts +1 -1
  394. package/src/memory/attachments-store.ts +70 -0
  395. package/src/memory/auto-analysis-enqueue.ts +127 -0
  396. package/src/memory/auto-analysis-guard.ts +27 -0
  397. package/src/memory/cleanup-schedule-state.ts +37 -0
  398. package/src/memory/conversation-analyze-job.ts +73 -0
  399. package/src/memory/conversation-crud.ts +99 -0
  400. package/src/memory/conversation-disk-view.ts +7 -0
  401. package/src/memory/conversation-group-migration.ts +34 -2
  402. package/src/memory/conversation-queries.ts +6 -5
  403. package/src/memory/db-init.ts +6 -0
  404. package/src/memory/db-maintenance.ts +108 -0
  405. package/src/memory/db.ts +1 -0
  406. package/src/memory/graph/conversation-graph-memory.ts +15 -0
  407. package/src/memory/graph/extraction.test.ts +23 -0
  408. package/src/memory/graph/extraction.ts +8 -0
  409. package/src/memory/graph/retriever.ts +27 -18
  410. package/src/memory/graph/scoring.test.ts +186 -0
  411. package/src/memory/graph/scoring.ts +31 -1
  412. package/src/memory/graph/tools.ts +1 -1
  413. package/src/memory/group-crud.ts +6 -1
  414. package/src/memory/indexer.ts +95 -16
  415. package/src/memory/job-handlers/cleanup.ts +11 -8
  416. package/src/memory/job-handlers/conversation-starters.ts +16 -10
  417. package/src/memory/jobs-store.ts +64 -4
  418. package/src/memory/jobs-worker.ts +22 -9
  419. package/src/memory/llm-usage-store.ts +92 -56
  420. package/src/memory/migrations/219-oauth-providers-token-exchange-body-format.ts +15 -0
  421. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +190 -0
  422. package/src/memory/migrations/221-conversations-archived-at.ts +16 -0
  423. package/src/memory/migrations/index.ts +6 -0
  424. package/src/memory/migrations/registry.ts +8 -0
  425. package/src/memory/qdrant-manager.ts +43 -16
  426. package/src/memory/schema/conversations.ts +2 -0
  427. package/src/memory/schema/oauth.ts +3 -0
  428. package/src/memory/usage-buckets.ts +396 -0
  429. package/src/messaging/providers/gmail/client.ts +57 -6
  430. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
  431. package/src/messaging/providers/slack/adapter.ts +143 -38
  432. package/src/messaging/providers/slack/client.ts +16 -0
  433. package/src/messaging/providers/slack/types.ts +4 -0
  434. package/src/notifications/decision-engine.ts +3 -3
  435. package/src/notifications/signal.ts +5 -0
  436. package/src/oauth/__tests__/identity-verifier.test.ts +1 -0
  437. package/src/oauth/byo-connection.test.ts +18 -1
  438. package/src/oauth/byo-connection.ts +3 -1
  439. package/src/oauth/connect-orchestrator.ts +2 -0
  440. package/src/oauth/connection-resolver.ts +6 -2
  441. package/src/oauth/connection.ts +2 -0
  442. package/src/oauth/oauth-store.ts +9 -0
  443. package/src/oauth/platform-connection.test.ts +98 -0
  444. package/src/oauth/platform-connection.ts +52 -31
  445. package/src/oauth/seed-providers.ts +7 -0
  446. package/src/permissions/checker.ts +16 -6
  447. package/src/permissions/defaults.ts +49 -1
  448. package/src/permissions/trust-store.ts +3 -3
  449. package/src/permissions/workspace-policy.ts +3 -0
  450. package/src/platform/client.test.ts +10 -0
  451. package/src/platform/sync-identity.ts +129 -0
  452. package/src/prompts/persona-resolver.ts +126 -2
  453. package/src/prompts/system-prompt.ts +59 -18
  454. package/src/prompts/templates/BOOTSTRAP.md +5 -5
  455. package/src/prompts/templates/SOUL.md +3 -1
  456. package/src/prompts/templates/UPDATES.md +12 -0
  457. package/src/prompts/templates/channels/slack.md +20 -0
  458. package/src/prompts/update-bulletin-format.ts +26 -9
  459. package/src/prompts/update-bulletin.ts +34 -23
  460. package/src/prompts/user-reference.ts +20 -17
  461. package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
  462. package/src/providers/anthropic/client.ts +157 -61
  463. package/src/providers/fireworks/client.ts +2 -2
  464. package/src/providers/gemini/client.ts +9 -1
  465. package/src/providers/model-catalog.ts +6 -0
  466. package/src/providers/model-intents.ts +4 -4
  467. package/src/providers/ollama/client.ts +2 -2
  468. package/src/providers/openai/chat-completions-provider.ts +474 -0
  469. package/src/providers/openai/client.ts +25 -440
  470. package/src/providers/openai/responses-provider.ts +502 -0
  471. package/src/providers/openrouter/client.ts +101 -4
  472. package/src/providers/provider-secret-catalog.ts +139 -0
  473. package/src/providers/registry.ts +2 -2
  474. package/src/providers/retry.ts +14 -3
  475. package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
  476. package/src/providers/speech-to-text/__tests__/resolve.test.ts +828 -0
  477. package/src/providers/speech-to-text/deepgram-realtime.test.ts +980 -0
  478. package/src/providers/speech-to-text/deepgram-realtime.ts +767 -0
  479. package/src/providers/speech-to-text/deepgram.test.ts +332 -0
  480. package/src/providers/speech-to-text/deepgram.ts +115 -0
  481. package/src/providers/speech-to-text/google-gemini-live-stream.test.ts +743 -0
  482. package/src/providers/speech-to-text/google-gemini-live-stream.ts +625 -0
  483. package/src/providers/speech-to-text/google-gemini.test.ts +226 -0
  484. package/src/providers/speech-to-text/google-gemini.ts +101 -0
  485. package/src/providers/speech-to-text/openai-whisper-stream.test.ts +564 -0
  486. package/src/providers/speech-to-text/openai-whisper-stream.ts +381 -0
  487. package/src/providers/speech-to-text/openai-whisper.test.ts +1 -37
  488. package/src/providers/speech-to-text/openai-whisper.ts +63 -33
  489. package/src/providers/speech-to-text/provider-catalog.ts +306 -0
  490. package/src/providers/speech-to-text/resolve.ts +386 -6
  491. package/src/providers/types.ts +9 -0
  492. package/src/runtime/AGENTS.md +43 -1
  493. package/src/runtime/__tests__/agent-wake.test.ts +831 -0
  494. package/src/runtime/__tests__/runtime-mode.test.ts +62 -0
  495. package/src/runtime/__tests__/slack-block-formatting.test.ts +481 -0
  496. package/src/runtime/agent-wake.ts +512 -0
  497. package/src/runtime/auth/__tests__/route-policy.test.ts +40 -0
  498. package/src/runtime/auth/route-policy.ts +30 -5
  499. package/src/runtime/auth/token-service.ts +56 -1
  500. package/src/runtime/btw-sidechain.ts +2 -0
  501. package/src/runtime/capability-tokens.ts +10 -10
  502. package/src/runtime/channel-invite-transport.ts +1 -1
  503. package/src/runtime/channel-invite-transports/email.ts +14 -6
  504. package/src/runtime/channel-readiness-service.ts +12 -22
  505. package/src/runtime/chrome-extension-registry.ts +38 -2
  506. package/src/runtime/http-server.ts +395 -10
  507. package/src/runtime/http-types.ts +6 -2
  508. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +36 -0
  509. package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
  510. package/src/runtime/migrations/migration-transport.ts +1 -0
  511. package/src/runtime/migrations/migration-wizard.ts +1 -0
  512. package/src/runtime/migrations/vbundle-import-analyzer.ts +77 -1
  513. package/src/runtime/migrations/vbundle-importer.ts +34 -0
  514. package/src/runtime/pending-interactions.ts +0 -11
  515. package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
  516. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +507 -0
  517. package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +208 -0
  518. package/src/runtime/routes/__tests__/stt-routes.test.ts +406 -0
  519. package/src/runtime/routes/__tests__/tts-routes.test.ts +474 -0
  520. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +148 -17
  521. package/src/runtime/routes/app-management-routes.ts +12 -18
  522. package/src/runtime/routes/attachment-routes.test.ts +9 -3
  523. package/src/runtime/routes/attachment-routes.ts +216 -17
  524. package/src/runtime/routes/backup-routes.ts +519 -0
  525. package/src/runtime/routes/browser-extension-pair-routes.ts +82 -23
  526. package/src/runtime/routes/btw-routes.ts +8 -6
  527. package/src/runtime/routes/contact-routes.test.ts +298 -0
  528. package/src/runtime/routes/contact-routes.ts +132 -5
  529. package/src/runtime/routes/conversation-analysis-routes.ts +22 -142
  530. package/src/runtime/routes/conversation-management-routes.ts +115 -0
  531. package/src/runtime/routes/conversation-routes.ts +367 -146
  532. package/src/runtime/routes/filing-routes.ts +93 -0
  533. package/src/runtime/routes/home-feed-routes.ts +334 -0
  534. package/src/runtime/routes/home-state-routes.ts +138 -0
  535. package/src/runtime/routes/host-browser-routes.ts +3 -14
  536. package/src/runtime/routes/identity-intro-cache.ts +7 -3
  537. package/src/runtime/routes/identity-routes.ts +3 -17
  538. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +46 -39
  539. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +15 -15
  540. package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +137 -0
  541. package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +179 -0
  542. package/src/runtime/routes/integrations/slack/channel.ts +11 -3
  543. package/src/runtime/routes/integrations/slack/share.ts +45 -7
  544. package/src/runtime/routes/llm-context-normalization.ts +303 -0
  545. package/src/runtime/routes/memory-item-routes.test.ts +3 -2
  546. package/src/runtime/routes/migration-routes.ts +40 -5
  547. package/src/runtime/routes/settings-routes.ts +22 -5
  548. package/src/runtime/routes/skills-routes.ts +76 -7
  549. package/src/runtime/routes/stt-routes.ts +233 -0
  550. package/src/runtime/routes/surface-action-routes.ts +41 -2
  551. package/src/runtime/routes/tts-routes.ts +108 -24
  552. package/src/runtime/routes/usage-routes.ts +30 -2
  553. package/src/runtime/routes/user-route-dispatcher.ts +50 -5
  554. package/src/runtime/routes/user-routes.ts +13 -1
  555. package/src/runtime/routes/work-items-routes.ts +8 -1
  556. package/src/runtime/runtime-mode.ts +33 -0
  557. package/src/runtime/services/__tests__/analyze-conversation.test.ts +444 -0
  558. package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +67 -0
  559. package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +53 -0
  560. package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +41 -0
  561. package/src/runtime/services/analyze-conversation.ts +344 -0
  562. package/src/runtime/services/analyze-deps-singleton.ts +32 -0
  563. package/src/runtime/services/auto-analysis-prompt.ts +55 -0
  564. package/src/runtime/skill-route-registry.ts +49 -0
  565. package/src/runtime/slack-block-formatting.ts +437 -10
  566. package/src/schedule/scheduler.ts +50 -0
  567. package/src/security/oauth2.ts +26 -4
  568. package/src/security/secure-keys.ts +25 -2
  569. package/src/security/token-manager.ts +8 -0
  570. package/src/sequence/engine.ts +23 -0
  571. package/src/sequence/types.ts +1 -1
  572. package/src/skills/catalog-files.ts +64 -2
  573. package/src/skills/category-inference.ts +122 -0
  574. package/src/skills/clawhub-files.ts +213 -0
  575. package/src/skills/clawhub.ts +84 -23
  576. package/src/skills/skill-file-provider.ts +40 -0
  577. package/src/skills/skillssh-files.ts +395 -0
  578. package/src/skills/skillssh-registry.ts +4 -4
  579. package/src/stt/__tests__/daemon-batch-transcriber.test.ts +392 -0
  580. package/src/stt/__tests__/types.test.ts +89 -0
  581. package/src/stt/daemon-batch-transcriber.ts +195 -0
  582. package/src/stt/stt-stream-session.ts +499 -0
  583. package/src/stt/types.ts +330 -0
  584. package/src/stt/wav-encoder.test.ts +373 -0
  585. package/src/stt/wav-encoder.ts +175 -0
  586. package/src/subagent/manager.ts +38 -14
  587. package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
  588. package/src/tools/browser/__tests__/browser-status.test.ts +123 -0
  589. package/src/tools/browser/browser-execution.ts +1163 -23
  590. package/src/tools/browser/browser-manager.ts +45 -0
  591. package/src/tools/browser/browser-mode-constants.ts +12 -0
  592. package/src/tools/browser/browser-mode.ts +92 -0
  593. package/src/tools/browser/browser-status-constants.ts +33 -0
  594. package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +393 -0
  595. package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +29 -0
  596. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1648 -32
  597. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +264 -0
  598. package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +183 -17
  599. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +254 -21
  600. package/src/tools/browser/cdp-client/errors.ts +15 -0
  601. package/src/tools/browser/cdp-client/extension-cdp-client.ts +39 -16
  602. package/src/tools/browser/cdp-client/factory.ts +797 -87
  603. package/src/tools/browser/cdp-client/index.ts +16 -2
  604. package/src/tools/browser/cdp-client/types.ts +68 -0
  605. package/src/tools/credentials/vault.ts +35 -6
  606. package/src/tools/network/web-fetch.ts +5 -2
  607. package/src/tools/network/web-search.ts +5 -2
  608. package/src/tools/shared/shell-output.ts +3 -1
  609. package/src/tools/side-effects.ts +2 -0
  610. package/src/tools/skills/sandbox-runner.ts +3 -2
  611. package/src/tools/terminal/safe-env.ts +10 -2
  612. package/src/tools/terminal/shell.ts +15 -4
  613. package/src/tools/tool-manifest.ts +21 -0
  614. package/src/tools/types.ts +17 -0
  615. package/src/tools/ui-surface/definitions.ts +6 -1
  616. package/src/tts/__tests__/provider-adapters.test.ts +834 -0
  617. package/src/tts/__tests__/provider-catalog-consistency.test.ts +196 -0
  618. package/src/tts/__tests__/provider-catalog.test.ts +183 -0
  619. package/src/tts/__tests__/provider-registry.test.ts +90 -0
  620. package/src/tts/provider-catalog.ts +201 -0
  621. package/src/tts/provider-registry.ts +73 -0
  622. package/src/tts/providers/deepgram-provider.ts +219 -0
  623. package/src/tts/providers/elevenlabs-provider.ts +211 -0
  624. package/src/tts/providers/fish-audio-provider.ts +183 -0
  625. package/src/tts/providers/index.ts +42 -0
  626. package/src/tts/providers/register-builtins.ts +130 -0
  627. package/src/tts/synthesize-text.ts +110 -0
  628. package/src/tts/tts-config-resolver.ts +78 -0
  629. package/src/tts/types.ts +153 -0
  630. package/src/types/onboarding-context.ts +7 -0
  631. package/src/util/abort-reasons.ts +58 -0
  632. package/src/util/device-id.ts +32 -16
  633. package/src/util/errors.ts +9 -1
  634. package/src/util/platform.ts +54 -10
  635. package/src/util/pricing.ts +66 -3
  636. package/src/util/spawn.ts +1 -1
  637. package/src/util/truncate.ts +4 -2
  638. package/src/util/unicode.ts +201 -0
  639. package/src/version.ts +19 -24
  640. package/src/watcher/engine.ts +23 -0
  641. package/src/watcher/watcher-store.ts +31 -0
  642. package/src/workspace/migrations/003-seed-device-id.ts +9 -3
  643. package/src/workspace/migrations/017-seed-persona-dirs.ts +68 -4
  644. package/src/workspace/migrations/029-seed-pkb.ts +1 -1
  645. package/src/workspace/migrations/031-drop-user-md.ts +317 -0
  646. package/src/workspace/migrations/031-llm-log-retention-zero-to-null.ts +73 -0
  647. package/src/workspace/migrations/032-tts-provider-unification.ts +227 -0
  648. package/src/workspace/migrations/033-stt-service-explicit-config.ts +122 -0
  649. package/src/workspace/migrations/034-remove-calls-voice-transcription-provider.ts +215 -0
  650. package/src/workspace/migrations/035-seed-slack-channel-persona.ts +50 -0
  651. package/src/workspace/migrations/036-update-pkb-index-bar.ts +37 -0
  652. package/src/workspace/migrations/037-create-meets-dir.ts +61 -0
  653. package/src/workspace/migrations/registry.ts +16 -0
  654. package/src/workspace/top-level-renderer.ts +13 -1
  655. package/src/workspace/turn-commit.ts +31 -0
  656. package/src/__tests__/email-cli.test.ts +0 -297
  657. package/src/__tests__/email-service-config-fallback.test.ts +0 -102
  658. package/src/cli/commands/browser-relay.ts +0 -466
  659. package/src/email/guardrails.ts +0 -221
  660. package/src/email/provider.ts +0 -117
  661. package/src/email/providers/agentmail.ts +0 -361
  662. package/src/email/providers/index.ts +0 -65
  663. package/src/email/service.ts +0 -384
  664. package/src/email/types.ts +0 -126
  665. package/src/prompts/templates/USER.md +0 -13
  666. package/src/providers/speech-to-text/types.ts +0 -17
  667. package/src/runtime/routes/browser-cdp-routes.ts +0 -229
@@ -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 fetch has a 10s timeout that would otherwise
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 `~/.vellum/daemon-token`
467
- // so developers can manually pair the chrome extension without the
468
- // native messaging helper. Production pairing goes through
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
- ...(proxyCtx.assistantApiKey
603
- ? { assistantApiKey: proxyCtx.assistantApiKey }
655
+ ...(startupProxyCtx.assistantApiKey
656
+ ? { assistantApiKey: startupProxyCtx.assistantApiKey }
604
657
  : {}),
605
- ...(assistantId ? { assistantId } : {}),
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 memory worker so background init can assign
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
- } = { qdrantManager: null, memoryWorker: null };
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
- | ScheduleConversationCreated;
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;