@vellumai/assistant 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (895) hide show
  1. package/ARCHITECTURE.md +273 -10
  2. package/Dockerfile +2 -3
  3. package/bun.lock +41 -49
  4. package/bunfig.toml +3 -0
  5. package/docs/architecture/memory.md +1 -1
  6. package/docs/backup-troubleshooting.md +52 -0
  7. package/docs/browser-use-architecture-phase2.md +174 -0
  8. package/docs/stt-provider-onboarding.md +120 -0
  9. package/knip.json +12 -2
  10. package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
  11. package/node_modules/@vellumai/ces-contracts/package.json +3 -3
  12. package/node_modules/@vellumai/ces-contracts/src/rpc.ts +42 -0
  13. package/openapi.yaml +1111 -86
  14. package/package.json +40 -42
  15. package/scripts/generate-openapi.ts +0 -2
  16. package/scripts/test.sh +73 -18
  17. package/src/__tests__/acp-session.test.ts +43 -0
  18. package/src/__tests__/agent-image-optimize.test.ts +28 -0
  19. package/src/__tests__/agent-loop.test.ts +123 -0
  20. package/src/__tests__/anthropic-provider.test.ts +263 -10
  21. package/src/__tests__/app-builder-tool-scripts.test.ts +1 -0
  22. package/src/__tests__/app-executors.test.ts +1 -0
  23. package/src/__tests__/app-source-watcher.test.ts +37 -11
  24. package/src/__tests__/approval-routes-http.test.ts +178 -1
  25. package/src/__tests__/auto-analysis-end-to-end.test.ts +550 -0
  26. package/src/__tests__/auto-analysis-prompt.test.ts +50 -0
  27. package/src/__tests__/browser-fill-credential.test.ts +240 -94
  28. package/src/__tests__/browser-manager.test.ts +40 -27
  29. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
  30. package/src/__tests__/browser-skill-endstate.test.ts +31 -7
  31. package/src/__tests__/btw-routes.test.ts +7 -0
  32. package/src/__tests__/call-controller.test.ts +581 -20
  33. package/src/__tests__/catalog-files.test.ts +1000 -0
  34. package/src/__tests__/channel-approvals.test.ts +53 -0
  35. package/src/__tests__/channel-invite-transport.test.ts +2 -2
  36. package/src/__tests__/channel-readiness-routes.test.ts +16 -20
  37. package/src/__tests__/channel-readiness-service.test.ts +12 -7
  38. package/src/__tests__/checker.test.ts +157 -10
  39. package/src/__tests__/clawhub-files.test.ts +347 -0
  40. package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
  41. package/src/__tests__/config-analysis.test.ts +100 -0
  42. package/src/__tests__/config-managed-gemini-defaults.test.ts +326 -0
  43. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  44. package/src/__tests__/config-schema.test.ts +1248 -224
  45. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
  46. package/src/__tests__/config-watcher.test.ts +43 -8
  47. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +23 -0
  48. package/src/__tests__/contact-store-user-file.test.ts +512 -0
  49. package/src/__tests__/contacts-write.test.ts +197 -0
  50. package/src/__tests__/context-overflow-approval.test.ts +16 -1
  51. package/src/__tests__/context-window-manager.test.ts +88 -0
  52. package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
  53. package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
  54. package/src/__tests__/conversation-agent-loop.test.ts +99 -3
  55. package/src/__tests__/conversation-analysis-routes.test.ts +2 -2
  56. package/src/__tests__/conversation-attachments.test.ts +80 -4
  57. package/src/__tests__/conversation-confirmation-signals.test.ts +290 -0
  58. package/src/__tests__/conversation-error.test.ts +70 -0
  59. package/src/__tests__/conversation-fork-crud.test.ts +17 -0
  60. package/src/__tests__/conversation-history-web-search.test.ts +12 -4
  61. package/src/__tests__/conversation-host-access-routes.test.ts +229 -0
  62. package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
  63. package/src/__tests__/conversation-inject-context.test.ts +103 -0
  64. package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
  65. package/src/__tests__/conversation-list-source.test.ts +145 -0
  66. package/src/__tests__/conversation-pre-run-repair.test.ts +2 -0
  67. package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
  68. package/src/__tests__/conversation-queue.test.ts +946 -62
  69. package/src/__tests__/conversation-routes-disk-view.test.ts +275 -0
  70. package/src/__tests__/conversation-routes-guardian-reply.test.ts +16 -0
  71. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  72. package/src/__tests__/conversation-runtime-assembly.test.ts +324 -46
  73. package/src/__tests__/conversation-skill-tools.test.ts +7 -4
  74. package/src/__tests__/conversation-slash-commands.test.ts +33 -0
  75. package/src/__tests__/conversation-slash-queue.test.ts +89 -18
  76. package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
  77. package/src/__tests__/conversation-starter-routes.test.ts +126 -0
  78. package/src/__tests__/conversation-starters-cadence.test.ts +161 -0
  79. package/src/__tests__/conversation-store.test.ts +195 -0
  80. package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
  81. package/src/__tests__/conversation-workspace-cache-state.test.ts +193 -0
  82. package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
  83. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
  84. package/src/__tests__/credential-execution-approval-bridge.test.ts +32 -1
  85. package/src/__tests__/credential-health-service.test.ts +352 -0
  86. package/src/__tests__/credential-security-invariants.test.ts +6 -3
  87. package/src/__tests__/credential-vault-unit.test.ts +383 -7
  88. package/src/__tests__/credential-vault.test.ts +152 -13
  89. package/src/__tests__/credentials-cli.test.ts +42 -18
  90. package/src/__tests__/cross-provider-web-search.test.ts +146 -35
  91. package/src/__tests__/date-context.test.ts +4 -4
  92. package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
  93. package/src/__tests__/device-id.test.ts +112 -0
  94. package/src/__tests__/docker-signing-key-bootstrap.test.ts +167 -4
  95. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +1 -3
  96. package/src/__tests__/email-html-renderer.test.ts +71 -0
  97. package/src/__tests__/email-invite-adapter.test.ts +36 -32
  98. package/src/__tests__/embedding-managed-proxy-selection.test.ts +256 -0
  99. package/src/__tests__/emit-event-signal.test.ts +71 -0
  100. package/src/__tests__/extension-id-sync-guard.test.ts +222 -0
  101. package/src/__tests__/fixtures/mock-chrome-extension.ts +386 -0
  102. package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
  103. package/src/__tests__/gateway-only-guard.test.ts +2 -0
  104. package/src/__tests__/gemini-provider.test.ts +66 -2
  105. package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
  106. package/src/__tests__/gmail-archive-fallback.test.ts +193 -0
  107. package/src/__tests__/gmail-archive-gate.test.ts +246 -0
  108. package/src/__tests__/gmail-preferences.test.ts +117 -0
  109. package/src/__tests__/guardian-routing-invariants.test.ts +70 -2
  110. package/src/__tests__/headless-browser-interactions.test.ts +738 -359
  111. package/src/__tests__/headless-browser-mode.test.ts +614 -0
  112. package/src/__tests__/headless-browser-navigate.test.ts +528 -49
  113. package/src/__tests__/headless-browser-read-tools.test.ts +274 -100
  114. package/src/__tests__/headless-browser-snapshot.test.ts +250 -77
  115. package/src/__tests__/heartbeat-service.test.ts +70 -17
  116. package/src/__tests__/home-state-routes.test.ts +162 -0
  117. package/src/__tests__/host-bash-proxy.test.ts +145 -1
  118. package/src/__tests__/host-browser-e2e-cloud.test.ts +596 -0
  119. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +286 -0
  120. package/src/__tests__/host-browser-e2e-self-hosted.test.ts +374 -0
  121. package/src/__tests__/host-browser-event-routes.test.ts +350 -0
  122. package/src/__tests__/host-browser-proxy.test.ts +444 -0
  123. package/src/__tests__/host-browser-routes.test.ts +198 -0
  124. package/src/__tests__/host-browser-ws-events-e2e.test.ts +423 -0
  125. package/src/__tests__/host-cu-proxy.test.ts +166 -1
  126. package/src/__tests__/host-file-proxy.test.ts +185 -1
  127. package/src/__tests__/host-file-read-tool.test.ts +52 -0
  128. package/src/__tests__/host-proxy-interface.test.ts +165 -0
  129. package/src/__tests__/host-shell-tool.test.ts +1 -11
  130. package/src/__tests__/http-user-message-parity.test.ts +1 -0
  131. package/src/__tests__/identity-intro-cache.test.ts +40 -10
  132. package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
  133. package/src/__tests__/integration-status.test.ts +6 -7
  134. package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
  135. package/src/__tests__/list-messages-tool-merge.test.ts +37 -12
  136. package/src/__tests__/llm-context-normalization.test.ts +488 -0
  137. package/src/__tests__/llm-context-route-provider.test.ts +86 -5
  138. package/src/__tests__/llm-usage-store.test.ts +363 -0
  139. package/src/__tests__/mcp-client-auth.test.ts +40 -4
  140. package/src/__tests__/mcp-health-check.test.ts +10 -3
  141. package/src/__tests__/media-stream-output.test.ts +555 -0
  142. package/src/__tests__/media-stream-parser.test.ts +374 -0
  143. package/src/__tests__/media-stream-server-integration.test.ts +1234 -0
  144. package/src/__tests__/media-stream-stt-session.test.ts +588 -0
  145. package/src/__tests__/media-turn-detector.test.ts +440 -0
  146. package/src/__tests__/message-queue.test.ts +125 -0
  147. package/src/__tests__/migration-cross-version-compatibility.test.ts +3 -1
  148. package/src/__tests__/migration-export-http.test.ts +67 -8
  149. package/src/__tests__/migration-export-streaming.test.ts +66 -0
  150. package/src/__tests__/migration-import-commit-http.test.ts +109 -7
  151. package/src/__tests__/migration-import-preflight-http.test.ts +6 -5
  152. package/src/__tests__/migration-validate-http.test.ts +3 -3
  153. package/src/__tests__/mock-gateway-ipc.ts +151 -0
  154. package/src/__tests__/model-intents.test.ts +2 -2
  155. package/src/__tests__/native-host-marker-sync-guard.test.ts +157 -0
  156. package/src/__tests__/oauth-apps-routes.test.ts +18 -12
  157. package/src/__tests__/oauth-cli.test.ts +709 -60
  158. package/src/__tests__/oauth-connect-orchestrator.test.ts +118 -24
  159. package/src/__tests__/oauth-provider-seed-logos.test.ts +23 -0
  160. package/src/__tests__/oauth-provider-serializer.test.ts +147 -10
  161. package/src/__tests__/oauth-provider-visibility.test.ts +19 -21
  162. package/src/__tests__/oauth-providers-routes.test.ts +52 -14
  163. package/src/__tests__/oauth-store.test.ts +1465 -176
  164. package/src/__tests__/oauth2-gateway-transport.test.ts +460 -26
  165. package/src/__tests__/onboarding-template-contract.test.ts +81 -70
  166. package/src/__tests__/openai-provider.test.ts +178 -2
  167. package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
  168. package/src/__tests__/openai-responses-provider.test.ts +1105 -0
  169. package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
  170. package/src/__tests__/outlook-categories.test.ts +1 -1
  171. package/src/__tests__/outlook-client-automation.test.ts +1 -1
  172. package/src/__tests__/outlook-compose-tools.test.ts +1 -1
  173. package/src/__tests__/outlook-email-watcher.test.ts +1 -1
  174. package/src/__tests__/outlook-follow-up.test.ts +1 -1
  175. package/src/__tests__/outlook-messaging-provider.test.ts +2 -2
  176. package/src/__tests__/outlook-trash.test.ts +1 -1
  177. package/src/__tests__/outlook-unsubscribe.test.ts +32 -3
  178. package/src/__tests__/permission-checker-host-gate.test.ts +74 -14
  179. package/src/__tests__/permission-mode.test.ts +28 -56
  180. package/src/__tests__/persona-resolver.test.ts +251 -0
  181. package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
  182. package/src/__tests__/platform-callback-registration.test.ts +19 -0
  183. package/src/__tests__/platform.test.ts +92 -1
  184. package/src/__tests__/post-turn-tool-result-truncation.test.ts +343 -0
  185. package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
  186. package/src/__tests__/pricing.test.ts +174 -0
  187. package/src/__tests__/proxy-approval-callback.test.ts +18 -0
  188. package/src/__tests__/qdrant-manager.test.ts +29 -8
  189. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +194 -0
  190. package/src/__tests__/relationship-state-contract.test.ts +175 -0
  191. package/src/__tests__/relay-server.test.ts +423 -5
  192. package/src/__tests__/require-fresh-approval.test.ts +40 -1
  193. package/src/__tests__/sanitize-config-for-transfer.test.ts +132 -0
  194. package/src/__tests__/schedule-routes.test.ts +162 -0
  195. package/src/__tests__/search-skills-unified.test.ts +118 -0
  196. package/src/__tests__/secret-detection-handler.test.ts +84 -0
  197. package/src/__tests__/secret-ingress-http.test.ts +1 -0
  198. package/src/__tests__/secret-scanner-executor.test.ts +4 -0
  199. package/src/__tests__/secure-keys.test.ts +107 -0
  200. package/src/__tests__/send-endpoint-busy.test.ts +8 -1
  201. package/src/__tests__/sequence-store.test.ts +1 -1
  202. package/src/__tests__/server-history-render.test.ts +49 -0
  203. package/src/__tests__/set-permission-mode.test.ts +13 -250
  204. package/src/__tests__/settings-routes.test.ts +201 -0
  205. package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
  206. package/src/__tests__/skills-file-content-endpoint.test.ts +801 -0
  207. package/src/__tests__/skills-files-catalog-fallback.test.ts +738 -0
  208. package/src/__tests__/skills.test.ts +5 -2
  209. package/src/__tests__/skillssh-files.test.ts +446 -0
  210. package/src/__tests__/slack-block-formatting.test.ts +110 -0
  211. package/src/__tests__/slack-channel-config.test.ts +576 -16
  212. package/src/__tests__/stt-catalog-parity.test.ts +282 -0
  213. package/src/__tests__/stt-stream-session.test.ts +535 -0
  214. package/src/__tests__/subagent-detail.test.ts +44 -2
  215. package/src/__tests__/subagent-disposal.test.ts +1 -0
  216. package/src/__tests__/subagent-fork-notifications.test.ts +291 -0
  217. package/src/__tests__/subagent-fork-spawn.test.ts +384 -0
  218. package/src/__tests__/subagent-manager-notify.test.ts +1 -0
  219. package/src/__tests__/subagent-notify-parent.test.ts +1 -0
  220. package/src/__tests__/subagent-spawn-tool-fork.test.ts +411 -0
  221. package/src/__tests__/subagent-tools.test.ts +1 -0
  222. package/src/__tests__/subagent-types.test.ts +1 -0
  223. package/src/__tests__/system-prompt-ask-mode.test.ts +27 -71
  224. package/src/__tests__/system-prompt.test.ts +184 -27
  225. package/src/__tests__/task-scheduler.test.ts +32 -6
  226. package/src/__tests__/telegram-config.test.ts +10 -13
  227. package/src/__tests__/telephony-stt-routing.test.ts +329 -0
  228. package/src/__tests__/terminal-tools.test.ts +25 -5
  229. package/src/__tests__/test-preload.ts +18 -0
  230. package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
  231. package/src/__tests__/tool-approval-handler.test.ts +73 -0
  232. package/src/__tests__/tool-executor-lifecycle-events.test.ts +9 -5
  233. package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
  234. package/src/__tests__/tool-executor.test.ts +33 -24
  235. package/src/__tests__/tool-result-truncation.test.ts +36 -0
  236. package/src/__tests__/tool-side-effects-slack-dm.test.ts +22 -0
  237. package/src/__tests__/top-level-renderer.test.ts +73 -1
  238. package/src/__tests__/transport-hints-queue.test.ts +14 -29
  239. package/src/__tests__/trust-store.test.ts +7 -1
  240. package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
  241. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +109 -0
  242. package/src/__tests__/tts-catalog-parity.test.ts +345 -0
  243. package/src/__tests__/twilio-routes-twiml.test.ts +512 -114
  244. package/src/__tests__/twilio-routes.test.ts +376 -0
  245. package/src/__tests__/unicode.test.ts +293 -0
  246. package/src/__tests__/update-bulletin-format.test.ts +59 -0
  247. package/src/__tests__/update-bulletin.test.ts +206 -5
  248. package/src/__tests__/usage-routes.test.ts +25 -4
  249. package/src/__tests__/user-reference.test.ts +46 -61
  250. package/src/__tests__/v2-consent-policy.test.ts +103 -0
  251. package/src/__tests__/verification-control-plane-policy.test.ts +4 -0
  252. package/src/__tests__/voice-config-update.test.ts +403 -0
  253. package/src/__tests__/voice-quality.test.ts +434 -19
  254. package/src/__tests__/workspace-heartbeat-service.test.ts +7 -0
  255. package/src/__tests__/workspace-migration-033-stt-service-explicit-config.test.ts +547 -0
  256. package/src/__tests__/workspace-migration-034-remove-calls-voice-transcription-provider.test.ts +596 -0
  257. package/src/__tests__/workspace-migration-drop-user-md.test.ts +368 -0
  258. package/src/__tests__/workspace-migration-meets.test.ts +244 -0
  259. package/src/__tests__/workspace-migration-seed-device-id.test.ts +14 -20
  260. package/src/__tests__/workspace-policy.test.ts +2 -0
  261. package/src/acp/client-handler.ts +30 -4
  262. package/src/agent/image-optimize.ts +24 -12
  263. package/src/agent/loop.ts +55 -9
  264. package/src/approvals/guardian-request-resolvers.ts +21 -15
  265. package/src/backup/__tests__/backup-key.test.ts +152 -0
  266. package/src/backup/__tests__/backup-worker.test.ts +767 -0
  267. package/src/backup/__tests__/list-snapshots.test.ts +87 -0
  268. package/src/backup/__tests__/local-writer.test.ts +218 -0
  269. package/src/backup/__tests__/offsite-writer.test.ts +641 -0
  270. package/src/backup/__tests__/paths.test.ts +300 -0
  271. package/src/backup/__tests__/restore.test.ts +498 -0
  272. package/src/backup/__tests__/snapshot-lock.test.ts +352 -0
  273. package/src/backup/__tests__/stream-crypt.test.ts +228 -0
  274. package/src/backup/backup-key.ts +137 -0
  275. package/src/backup/backup-worker.ts +459 -0
  276. package/src/backup/list-snapshots.ts +147 -0
  277. package/src/backup/local-writer.ts +133 -0
  278. package/src/backup/offsite-writer.ts +222 -0
  279. package/src/backup/paths.ts +226 -0
  280. package/src/backup/restore.ts +322 -0
  281. package/src/backup/snapshot-lock.ts +431 -0
  282. package/src/backup/stream-crypt.ts +263 -0
  283. package/src/browser-session/__tests__/manager.test.ts +297 -0
  284. package/src/browser-session/backends/cdp-inspect.ts +30 -0
  285. package/src/browser-session/backends/extension.ts +26 -0
  286. package/src/browser-session/backends/local.ts +24 -0
  287. package/src/browser-session/events.ts +164 -0
  288. package/src/browser-session/index.ts +27 -0
  289. package/src/browser-session/manager.ts +159 -0
  290. package/src/browser-session/types.ts +28 -0
  291. package/src/bundler/package-resolver.ts +4 -0
  292. package/src/calls/audio-store.ts +11 -5
  293. package/src/calls/call-controller.ts +226 -71
  294. package/src/calls/call-domain.ts +9 -0
  295. package/src/calls/call-speech-output.ts +190 -0
  296. package/src/calls/call-transport.ts +77 -0
  297. package/src/calls/media-stream-audio-transcode.ts +173 -0
  298. package/src/calls/media-stream-output.ts +660 -0
  299. package/src/calls/media-stream-parser.ts +300 -0
  300. package/src/calls/media-stream-protocol.ts +166 -0
  301. package/src/calls/media-stream-server.ts +592 -0
  302. package/src/calls/media-stream-stt-session.ts +460 -0
  303. package/src/calls/media-turn-detector.ts +230 -0
  304. package/src/calls/relay-server.ts +90 -75
  305. package/src/calls/resolve-call-tts-provider.ts +136 -0
  306. package/src/calls/telephony-stt-routing.ts +145 -0
  307. package/src/calls/tts-call-strategy.ts +161 -0
  308. package/src/calls/tts-text-sanitizer.ts +32 -16
  309. package/src/calls/twilio-routes.ts +281 -17
  310. package/src/calls/voice-quality.ts +78 -35
  311. package/src/calls/voice-session-bridge.ts +8 -1
  312. package/src/channels/__tests__/types.test.ts +134 -0
  313. package/src/channels/types.ts +69 -3
  314. package/src/cli/__tests__/run-assistant-command.ts +11 -1
  315. package/src/cli/commands/__tests__/backup.test.ts +1165 -0
  316. package/src/cli/commands/__tests__/domain-register.test.ts +234 -0
  317. package/src/cli/commands/__tests__/domain-status.test.ts +132 -0
  318. package/src/cli/commands/__tests__/email-attachment.test.ts +422 -0
  319. package/src/cli/commands/__tests__/email-download.test.ts +16 -1
  320. package/src/cli/commands/__tests__/email-list.test.ts +22 -4
  321. package/src/cli/commands/__tests__/email-register.test.ts +4 -4
  322. package/src/cli/commands/__tests__/email-send.test.ts +37 -4
  323. package/src/cli/commands/__tests__/email-status.test.ts +5 -1
  324. package/src/cli/commands/__tests__/email-unregister.test.ts +34 -5
  325. package/src/cli/commands/backup.ts +993 -0
  326. package/src/cli/commands/conversations.ts +77 -0
  327. package/src/cli/commands/credentials.ts +3 -4
  328. package/src/cli/commands/domain.ts +210 -0
  329. package/src/cli/commands/email.ts +273 -16
  330. package/src/cli/commands/mcp.ts +16 -4
  331. package/src/cli/commands/oauth/__tests__/connect.test.ts +56 -44
  332. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +21 -21
  333. package/src/cli/commands/oauth/__tests__/mode.test.ts +17 -17
  334. package/src/cli/commands/oauth/__tests__/ping.test.ts +16 -16
  335. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +32 -33
  336. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +330 -0
  337. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +117 -12
  338. package/src/cli/commands/oauth/__tests__/status.test.ts +10 -10
  339. package/src/cli/commands/oauth/__tests__/token.test.ts +7 -7
  340. package/src/cli/commands/oauth/apps.ts +7 -4
  341. package/src/cli/commands/oauth/connect.ts +6 -3
  342. package/src/cli/commands/oauth/disconnect.ts +1 -1
  343. package/src/cli/commands/oauth/mode.ts +12 -3
  344. package/src/cli/commands/oauth/providers.ts +215 -36
  345. package/src/cli/commands/oauth/shared.ts +7 -6
  346. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +254 -0
  347. package/src/cli/commands/platform/__tests__/connect.test.ts +6 -0
  348. package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
  349. package/src/cli/commands/platform/__tests__/status.test.ts +6 -0
  350. package/src/cli/commands/platform/index.ts +107 -10
  351. package/src/cli/commands/usage.ts +10 -9
  352. package/src/cli/lib/daemon-credential-client.ts +4 -0
  353. package/src/cli/program.ts +30 -4
  354. package/src/config/__tests__/backup-schema.test.ts +134 -0
  355. package/src/config/assistant-feature-flags.ts +61 -62
  356. package/src/config/bundled-skills/app-builder/SKILL.md +26 -249
  357. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +141 -0
  358. package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +56 -0
  359. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +125 -0
  360. package/src/config/bundled-skills/browser/SKILL.md +30 -5
  361. package/src/config/bundled-skills/browser/TOOLS.json +123 -0
  362. package/src/config/bundled-skills/browser/tools/browser-attach.ts +12 -0
  363. package/src/config/bundled-skills/browser/tools/browser-detach.ts +12 -0
  364. package/src/config/bundled-skills/browser/tools/browser-status.ts +12 -0
  365. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +17 -0
  366. package/src/config/bundled-skills/contacts/SKILL.md +5 -2
  367. package/src/config/bundled-skills/document/SKILL.md +4 -0
  368. package/src/config/bundled-skills/gmail/SKILL.md +54 -8
  369. package/src/config/bundled-skills/gmail/TOOLS.json +33 -3
  370. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +116 -9
  371. package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +138 -11
  372. package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +59 -0
  373. package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +82 -0
  374. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +113 -17
  375. package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -2
  376. package/src/config/bundled-skills/media-processing/SKILL.md +3 -9
  377. package/src/config/bundled-skills/media-processing/TOOLS.json +1 -6
  378. package/src/config/bundled-skills/media-processing/__tests__/audio-transcribe.test.ts +125 -0
  379. package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +181 -0
  380. package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +141 -0
  381. package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +32 -87
  382. package/src/config/bundled-skills/media-processing/services/preprocess.ts +8 -4
  383. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +0 -10
  384. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  385. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
  386. package/src/config/bundled-skills/outlook/SKILL.md +9 -2
  387. package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +2 -2
  388. package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
  389. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +27 -18
  390. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
  391. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  392. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +26 -22
  393. package/src/config/bundled-skills/slack/SKILL.md +1 -0
  394. package/src/config/bundled-skills/subagent/SKILL.md +21 -0
  395. package/src/config/bundled-skills/subagent/TOOLS.json +8 -4
  396. package/src/config/bundled-skills/tasks/SKILL.md +5 -0
  397. package/src/config/bundled-skills/transcribe/SKILL.md +9 -14
  398. package/src/config/bundled-skills/transcribe/TOOLS.json +2 -7
  399. package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +256 -0
  400. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +38 -188
  401. package/src/config/bundled-tool-registry.ts +8 -0
  402. package/src/config/env-registry.ts +38 -0
  403. package/src/config/env.ts +49 -4
  404. package/src/config/feature-flag-registry.json +85 -14
  405. package/src/config/loader.ts +82 -13
  406. package/src/config/sanitize-for-transfer.ts +47 -0
  407. package/src/config/schema.ts +81 -15
  408. package/src/config/schemas/__tests__/stt.test.ts +43 -0
  409. package/src/config/schemas/analysis.ts +51 -0
  410. package/src/config/schemas/backup.ts +72 -0
  411. package/src/config/schemas/calls.ts +1 -26
  412. package/src/config/schemas/elevenlabs.ts +0 -59
  413. package/src/config/schemas/filing.ts +47 -7
  414. package/src/config/schemas/heartbeat.ts +27 -5
  415. package/src/config/schemas/host-browser.ts +112 -0
  416. package/src/config/schemas/inference.ts +1 -1
  417. package/src/config/schemas/memory-lifecycle.ts +14 -2
  418. package/src/config/schemas/memory-retrieval.ts +103 -0
  419. package/src/config/schemas/security.ts +0 -6
  420. package/src/config/schemas/services.ts +52 -0
  421. package/src/config/schemas/stt.ts +59 -0
  422. package/src/config/schemas/tts.ts +230 -0
  423. package/src/config/schemas/updates.ts +14 -0
  424. package/src/config/skills.ts +4 -0
  425. package/src/config/types.ts +4 -1
  426. package/src/contacts/contact-store.ts +56 -11
  427. package/src/contacts/contacts-write.ts +38 -1
  428. package/src/context/post-turn-tool-result-truncation.ts +177 -0
  429. package/src/context/tool-result-truncation.ts +2 -1
  430. package/src/context/window-manager.ts +61 -10
  431. package/src/credential-execution/approval-bridge.ts +49 -15
  432. package/src/credential-execution/executable-discovery.ts +12 -2
  433. package/src/credential-execution/process-manager.ts +33 -2
  434. package/src/credential-health/credential-health-service.ts +366 -0
  435. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +324 -0
  436. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +497 -0
  437. package/src/daemon/__tests__/conversation-tool-setup.test.ts +195 -0
  438. package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
  439. package/src/daemon/app-source-watcher.ts +35 -0
  440. package/src/daemon/config-watcher.ts +99 -5
  441. package/src/daemon/context-overflow-approval.ts +5 -0
  442. package/src/daemon/conversation-agent-loop-handlers.ts +23 -2
  443. package/src/daemon/conversation-agent-loop.ts +153 -42
  444. package/src/daemon/conversation-attachments.ts +40 -0
  445. package/src/daemon/conversation-error.ts +11 -0
  446. package/src/daemon/conversation-history.ts +40 -6
  447. package/src/daemon/conversation-launch.ts +220 -0
  448. package/src/daemon/conversation-lifecycle.ts +59 -9
  449. package/src/daemon/conversation-messaging.ts +37 -3
  450. package/src/daemon/conversation-notifiers.ts +5 -0
  451. package/src/daemon/conversation-process.ts +622 -13
  452. package/src/daemon/conversation-queue-manager.ts +24 -0
  453. package/src/daemon/conversation-runtime-assembly.ts +128 -36
  454. package/src/daemon/conversation-slash.ts +36 -0
  455. package/src/daemon/conversation-surfaces.ts +131 -40
  456. package/src/daemon/conversation-tool-setup.ts +99 -8
  457. package/src/daemon/conversation-usage.ts +7 -4
  458. package/src/daemon/conversation-workspace.ts +12 -0
  459. package/src/daemon/conversation.ts +292 -16
  460. package/src/daemon/date-context.ts +10 -10
  461. package/src/daemon/first-greeting.ts +3 -2
  462. package/src/daemon/handlers/config-slack-channel.ts +269 -94
  463. package/src/daemon/handlers/conversations.ts +13 -141
  464. package/src/daemon/handlers/shared.ts +80 -0
  465. package/src/daemon/handlers/skills.ts +483 -44
  466. package/src/daemon/host-bash-proxy.ts +48 -13
  467. package/src/daemon/host-browser-proxy.ts +192 -0
  468. package/src/daemon/host-cu-proxy.ts +36 -11
  469. package/src/daemon/host-file-proxy.ts +57 -9
  470. package/src/daemon/lifecycle.ts +179 -28
  471. package/src/daemon/message-protocol.ts +13 -0
  472. package/src/daemon/message-types/conversations.ts +89 -14
  473. package/src/daemon/message-types/home.ts +40 -0
  474. package/src/daemon/message-types/host-browser.ts +100 -0
  475. package/src/daemon/message-types/meet.ts +143 -0
  476. package/src/daemon/message-types/messages.ts +19 -5
  477. package/src/daemon/message-types/schedules.ts +34 -2
  478. package/src/daemon/message-types/skills.ts +26 -0
  479. package/src/daemon/message-types/subagents.ts +2 -0
  480. package/src/daemon/message-types/surfaces.ts +2 -0
  481. package/src/daemon/server.ts +439 -14
  482. package/src/daemon/shutdown-handlers.ts +32 -4
  483. package/src/daemon/shutdown-registry.ts +40 -0
  484. package/src/daemon/tool-side-effects.ts +15 -0
  485. package/src/daemon/transport-hints.ts +5 -24
  486. package/src/email/html-renderer.ts +76 -0
  487. package/src/heartbeat/heartbeat-service.ts +93 -7
  488. package/src/home/__tests__/assistant-feed-authoring.test.ts +156 -0
  489. package/src/home/__tests__/emit-feed-event.test.ts +169 -0
  490. package/src/home/__tests__/feed-scheduler.test.ts +194 -0
  491. package/src/home/__tests__/feed-types.test.ts +275 -0
  492. package/src/home/__tests__/feed-writer.test.ts +688 -0
  493. package/src/home/__tests__/phase5-exit-criteria.test.ts +212 -0
  494. package/src/home/__tests__/platform-gmail-digest.test.ts +222 -0
  495. package/src/home/__tests__/progress-formula.test.ts +213 -0
  496. package/src/home/__tests__/relationship-state-writer.test.ts +740 -0
  497. package/src/home/__tests__/rollup-producer.test.ts +398 -0
  498. package/src/home/assistant-feed-authoring.ts +124 -0
  499. package/src/home/emit-feed-event.ts +158 -0
  500. package/src/home/feed-scheduler.ts +247 -0
  501. package/src/home/feed-types.ts +181 -0
  502. package/src/home/feed-writer.ts +469 -0
  503. package/src/home/platform-gmail-digest.ts +163 -0
  504. package/src/home/progress-formula.ts +86 -0
  505. package/src/home/relationship-state-writer.ts +824 -0
  506. package/src/home/relationship-state.ts +143 -0
  507. package/src/home/rollup-producer.ts +384 -0
  508. package/src/hooks/runner.ts +7 -0
  509. package/src/inbound/platform-callback-registration.ts +30 -20
  510. package/src/inbound/public-ingress-urls.ts +12 -0
  511. package/src/instrument.ts +1 -1
  512. package/src/ipc/__tests__/cli-ipc.test.ts +200 -0
  513. package/src/ipc/cli-client.ts +151 -0
  514. package/src/ipc/cli-server.ts +234 -0
  515. package/src/ipc/gateway-client.ts +180 -0
  516. package/src/ipc/routes/index.ts +5 -0
  517. package/src/ipc/routes/wake-conversation.ts +19 -0
  518. package/src/mcp/client.ts +59 -24
  519. package/src/memory/__tests__/auto-analysis-enqueue.test.ts +356 -0
  520. package/src/memory/__tests__/auto-analysis-guard.test.ts +57 -0
  521. package/src/memory/__tests__/conversation-analyze-job.test.ts +232 -0
  522. package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
  523. package/src/memory/app-store.ts +31 -1
  524. package/src/memory/attachments-store.ts +70 -0
  525. package/src/memory/auto-analysis-enqueue.ts +127 -0
  526. package/src/memory/auto-analysis-guard.ts +27 -0
  527. package/src/memory/cleanup-schedule-state.ts +37 -0
  528. package/src/memory/conversation-analyze-job.ts +73 -0
  529. package/src/memory/conversation-crud.ts +122 -0
  530. package/src/memory/conversation-disk-view.ts +7 -0
  531. package/src/memory/conversation-group-migration.ts +34 -2
  532. package/src/memory/conversation-queries.ts +6 -5
  533. package/src/memory/conversation-starters-cadence.ts +76 -0
  534. package/src/memory/conversation-title-service.ts +5 -2
  535. package/src/memory/db-init.ts +18 -0
  536. package/src/memory/db-maintenance.ts +108 -0
  537. package/src/memory/db.ts +1 -0
  538. package/src/memory/embedding-backend.test.ts +75 -0
  539. package/src/memory/embedding-backend.ts +131 -5
  540. package/src/memory/embedding-gemini.test.ts +54 -0
  541. package/src/memory/embedding-gemini.ts +20 -9
  542. package/src/memory/embedding-local.ts +176 -17
  543. package/src/memory/graph/consolidation.ts +10 -23
  544. package/src/memory/graph/conversation-graph-memory.ts +15 -0
  545. package/src/memory/graph/extraction-job.ts +15 -0
  546. package/src/memory/graph/extraction.test.ts +23 -0
  547. package/src/memory/graph/extraction.ts +8 -0
  548. package/src/memory/graph/retriever.ts +67 -40
  549. package/src/memory/graph/scoring.test.ts +186 -0
  550. package/src/memory/graph/scoring.ts +31 -1
  551. package/src/memory/graph/store.test.ts +7 -3
  552. package/src/memory/graph/store.ts +47 -12
  553. package/src/memory/graph/tools.ts +1 -1
  554. package/src/memory/group-crud.ts +6 -1
  555. package/src/memory/indexer.ts +95 -16
  556. package/src/memory/job-handlers/cleanup.ts +11 -8
  557. package/src/memory/job-handlers/conversation-starters.ts +16 -10
  558. package/src/memory/jobs-store.ts +64 -4
  559. package/src/memory/jobs-worker.ts +22 -9
  560. package/src/memory/llm-usage-store.ts +137 -60
  561. package/src/memory/migrations/213-oauth-providers-scope-separator.ts +13 -0
  562. package/src/memory/migrations/214-oauth-providers-refresh-url.ts +11 -0
  563. package/src/memory/migrations/215-oauth-providers-revoke.ts +14 -0
  564. package/src/memory/migrations/216-oauth-providers-token-auth-method.ts +30 -0
  565. package/src/memory/migrations/217-conversation-host-access.ts +40 -0
  566. package/src/memory/migrations/218-oauth-providers-logo-url.ts +11 -0
  567. package/src/memory/migrations/219-oauth-providers-token-exchange-body-format.ts +15 -0
  568. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +190 -0
  569. package/src/memory/migrations/221-conversations-archived-at.ts +16 -0
  570. package/src/memory/migrations/index.ts +12 -0
  571. package/src/memory/migrations/registry.ts +16 -0
  572. package/src/memory/qdrant-manager.ts +43 -16
  573. package/src/memory/schema/conversations.ts +3 -0
  574. package/src/memory/schema/oauth.ts +21 -13
  575. package/src/memory/usage-buckets.ts +396 -0
  576. package/src/messaging/providers/gmail/client.ts +57 -6
  577. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
  578. package/src/messaging/providers/slack/adapter.ts +143 -38
  579. package/src/messaging/providers/slack/client.ts +16 -0
  580. package/src/messaging/providers/slack/types.ts +4 -0
  581. package/src/notifications/decision-engine.ts +3 -3
  582. package/src/notifications/signal.ts +5 -0
  583. package/src/oauth/AGENTS.md +76 -0
  584. package/src/oauth/__tests__/identity-verifier.test.ts +25 -19
  585. package/src/oauth/__tests__/seed-providers-managed.test.ts +32 -0
  586. package/src/oauth/byo-connection.test.ts +26 -9
  587. package/src/oauth/byo-connection.ts +10 -8
  588. package/src/oauth/connect-orchestrator.ts +25 -21
  589. package/src/oauth/connect-types.ts +3 -3
  590. package/src/oauth/connection-resolver.test.ts +17 -4
  591. package/src/oauth/connection-resolver.ts +22 -18
  592. package/src/oauth/connection.ts +3 -1
  593. package/src/oauth/manual-token-connection.ts +13 -13
  594. package/src/oauth/oauth-store.ts +223 -100
  595. package/src/oauth/platform-connection.test.ts +101 -3
  596. package/src/oauth/platform-connection.ts +56 -35
  597. package/src/oauth/provider-serializer.ts +31 -5
  598. package/src/oauth/revoke.ts +76 -0
  599. package/src/oauth/seed-providers.ts +133 -87
  600. package/src/oauth/token-persistence.ts +1 -1
  601. package/src/permissions/checker.ts +16 -6
  602. package/src/permissions/defaults.ts +49 -1
  603. package/src/permissions/permission-mode.ts +4 -11
  604. package/src/permissions/prompter.ts +13 -1
  605. package/src/permissions/trust-store.ts +3 -3
  606. package/src/permissions/v2-consent-policy.ts +87 -0
  607. package/src/permissions/workspace-policy.ts +3 -0
  608. package/src/platform/client.test.ts +10 -0
  609. package/src/platform/sync-identity.ts +129 -0
  610. package/src/prompts/persona-resolver.ts +126 -2
  611. package/src/prompts/system-prompt.ts +76 -38
  612. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +3 -65
  613. package/src/prompts/templates/BOOTSTRAP.md +59 -105
  614. package/src/prompts/templates/SOUL.md +3 -1
  615. package/src/prompts/templates/UPDATES.md +12 -0
  616. package/src/prompts/templates/channels/slack.md +20 -0
  617. package/src/prompts/update-bulletin-format.ts +26 -9
  618. package/src/prompts/update-bulletin.ts +34 -23
  619. package/src/prompts/user-reference.ts +20 -17
  620. package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
  621. package/src/providers/anthropic/client.ts +157 -60
  622. package/src/providers/fireworks/client.ts +2 -2
  623. package/src/providers/gemini/client.ts +9 -1
  624. package/src/providers/model-catalog.ts +6 -0
  625. package/src/providers/model-intents.ts +4 -4
  626. package/src/providers/ollama/client.ts +2 -2
  627. package/src/providers/openai/chat-completions-provider.ts +474 -0
  628. package/src/providers/openai/client.ts +25 -440
  629. package/src/providers/openai/responses-provider.ts +502 -0
  630. package/src/providers/openrouter/client.ts +101 -4
  631. package/src/providers/provider-secret-catalog.ts +139 -0
  632. package/src/providers/registry.ts +2 -2
  633. package/src/providers/retry.ts +14 -3
  634. package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
  635. package/src/providers/speech-to-text/__tests__/resolve.test.ts +828 -0
  636. package/src/providers/speech-to-text/deepgram-realtime.test.ts +980 -0
  637. package/src/providers/speech-to-text/deepgram-realtime.ts +767 -0
  638. package/src/providers/speech-to-text/deepgram.test.ts +332 -0
  639. package/src/providers/speech-to-text/deepgram.ts +115 -0
  640. package/src/providers/speech-to-text/google-gemini-live-stream.test.ts +743 -0
  641. package/src/providers/speech-to-text/google-gemini-live-stream.ts +625 -0
  642. package/src/providers/speech-to-text/google-gemini.test.ts +226 -0
  643. package/src/providers/speech-to-text/google-gemini.ts +101 -0
  644. package/src/providers/speech-to-text/openai-whisper-stream.test.ts +564 -0
  645. package/src/providers/speech-to-text/openai-whisper-stream.ts +381 -0
  646. package/src/providers/speech-to-text/openai-whisper.test.ts +1 -37
  647. package/src/providers/speech-to-text/openai-whisper.ts +63 -33
  648. package/src/providers/speech-to-text/provider-catalog.ts +306 -0
  649. package/src/providers/speech-to-text/resolve.ts +386 -6
  650. package/src/providers/types.ts +10 -1
  651. package/src/runtime/AGENTS.md +65 -0
  652. package/src/runtime/__tests__/agent-wake.test.ts +831 -0
  653. package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +715 -0
  654. package/src/runtime/__tests__/capability-tokens.test.ts +258 -0
  655. package/src/runtime/__tests__/chrome-extension-registry.test.ts +518 -0
  656. package/src/runtime/__tests__/runtime-mode.test.ts +62 -0
  657. package/src/runtime/__tests__/slack-block-formatting.test.ts +481 -0
  658. package/src/runtime/agent-wake.ts +512 -0
  659. package/src/runtime/assistant-event-hub.ts +2 -2
  660. package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
  661. package/src/runtime/auth/__tests__/middleware.test.ts +116 -1
  662. package/src/runtime/auth/__tests__/route-policy.test.ts +48 -0
  663. package/src/runtime/auth/middleware.ts +98 -0
  664. package/src/runtime/auth/route-policy.ts +33 -9
  665. package/src/runtime/auth/token-service.ts +56 -1
  666. package/src/runtime/btw-sidechain.ts +2 -0
  667. package/src/runtime/capability-tokens.ts +414 -0
  668. package/src/runtime/channel-approvals.ts +18 -5
  669. package/src/runtime/channel-invite-transport.ts +1 -1
  670. package/src/runtime/channel-invite-transports/email.ts +14 -6
  671. package/src/runtime/channel-readiness-service.ts +12 -22
  672. package/src/runtime/chrome-extension-registry.ts +368 -0
  673. package/src/runtime/confirmation-request-guardian-bridge.ts +6 -0
  674. package/src/runtime/guardian-decision-types.ts +7 -0
  675. package/src/runtime/http-server.ts +815 -75
  676. package/src/runtime/http-types.ts +6 -2
  677. package/src/runtime/migrations/__tests__/rebind-secrets-credentials.test.ts +172 -0
  678. package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +276 -0
  679. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +198 -0
  680. package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
  681. package/src/runtime/migrations/migration-transport.ts +7 -0
  682. package/src/runtime/migrations/migration-wizard.ts +23 -2
  683. package/src/runtime/migrations/rebind-secrets-screen.ts +76 -15
  684. package/src/runtime/migrations/vbundle-builder.ts +145 -38
  685. package/src/runtime/migrations/vbundle-import-analyzer.ts +96 -1
  686. package/src/runtime/migrations/vbundle-importer.ts +89 -5
  687. package/src/runtime/pending-interactions.ts +18 -13
  688. package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
  689. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +507 -0
  690. package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +208 -0
  691. package/src/runtime/routes/__tests__/stt-routes.test.ts +406 -0
  692. package/src/runtime/routes/__tests__/tts-routes.test.ts +474 -0
  693. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +148 -17
  694. package/src/runtime/routes/app-management-routes.ts +12 -18
  695. package/src/runtime/routes/approval-routes.ts +90 -16
  696. package/src/runtime/routes/attachment-routes.test.ts +9 -3
  697. package/src/runtime/routes/attachment-routes.ts +216 -17
  698. package/src/runtime/routes/backup-routes.ts +519 -0
  699. package/src/runtime/routes/browser-extension-pair-routes.ts +556 -0
  700. package/src/runtime/routes/btw-routes.ts +8 -6
  701. package/src/runtime/routes/contact-routes.test.ts +298 -0
  702. package/src/runtime/routes/contact-routes.ts +132 -5
  703. package/src/runtime/routes/conversation-analysis-routes.ts +22 -141
  704. package/src/runtime/routes/conversation-management-routes.ts +223 -0
  705. package/src/runtime/routes/conversation-routes.ts +598 -103
  706. package/src/runtime/routes/conversation-starter-routes.ts +78 -16
  707. package/src/runtime/routes/filing-routes.ts +93 -0
  708. package/src/runtime/routes/guardian-action-routes.ts +24 -13
  709. package/src/runtime/routes/home-feed-routes.ts +334 -0
  710. package/src/runtime/routes/home-state-routes.ts +138 -0
  711. package/src/runtime/routes/host-browser-routes.ts +268 -0
  712. package/src/runtime/routes/host-file-routes.ts +9 -1
  713. package/src/runtime/routes/identity-intro-cache.ts +7 -3
  714. package/src/runtime/routes/identity-routes.ts +262 -33
  715. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +46 -39
  716. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +15 -15
  717. package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +137 -0
  718. package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +179 -0
  719. package/src/runtime/routes/integrations/slack/channel.ts +11 -3
  720. package/src/runtime/routes/integrations/slack/share.ts +45 -7
  721. package/src/runtime/routes/llm-context-normalization.ts +303 -0
  722. package/src/runtime/routes/log-export-routes.ts +42 -22
  723. package/src/runtime/routes/memory-item-routes.test.ts +3 -2
  724. package/src/runtime/routes/memory-item-routes.ts +1 -7
  725. package/src/runtime/routes/migration-routes.ts +122 -2
  726. package/src/runtime/routes/oauth-apps.ts +15 -17
  727. package/src/runtime/routes/oauth-providers.ts +4 -0
  728. package/src/runtime/routes/schedule-routes.ts +24 -11
  729. package/src/runtime/routes/settings-routes.ts +31 -102
  730. package/src/runtime/routes/skills-routes.ts +128 -9
  731. package/src/runtime/routes/stt-routes.ts +233 -0
  732. package/src/runtime/routes/subagents-routes.ts +14 -10
  733. package/src/runtime/routes/surface-action-routes.ts +41 -2
  734. package/src/runtime/routes/tts-routes.ts +108 -24
  735. package/src/runtime/routes/usage-routes.ts +38 -9
  736. package/src/runtime/routes/user-route-dispatcher.ts +50 -5
  737. package/src/runtime/routes/user-routes.ts +13 -1
  738. package/src/runtime/routes/work-items-routes.ts +8 -1
  739. package/src/runtime/routes/workspace-routes.test.ts +22 -0
  740. package/src/runtime/routes/workspace-routes.ts +8 -1
  741. package/src/runtime/routes/workspace-utils.ts +2 -0
  742. package/src/runtime/runtime-mode.ts +33 -0
  743. package/src/runtime/services/__tests__/analyze-conversation.test.ts +444 -0
  744. package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +67 -0
  745. package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +53 -0
  746. package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +41 -0
  747. package/src/runtime/services/analyze-conversation.ts +344 -0
  748. package/src/runtime/services/analyze-deps-singleton.ts +32 -0
  749. package/src/runtime/services/auto-analysis-prompt.ts +55 -0
  750. package/src/runtime/skill-route-registry.ts +49 -0
  751. package/src/runtime/slack-block-formatting.ts +437 -10
  752. package/src/schedule/scheduler.ts +57 -5
  753. package/src/security/ces-credential-client.ts +20 -0
  754. package/src/security/ces-rpc-credential-backend.ts +17 -0
  755. package/src/security/credential-backend.ts +5 -0
  756. package/src/security/oauth2.ts +68 -29
  757. package/src/security/secure-keys.ts +143 -27
  758. package/src/security/token-manager.ts +31 -10
  759. package/src/sequence/engine.ts +23 -0
  760. package/src/sequence/types.ts +1 -1
  761. package/src/skills/catalog-files.ts +554 -0
  762. package/src/skills/category-inference.ts +122 -0
  763. package/src/skills/clawhub-files.ts +213 -0
  764. package/src/skills/clawhub.ts +84 -23
  765. package/src/skills/skill-file-provider.ts +40 -0
  766. package/src/skills/skillssh-files.ts +395 -0
  767. package/src/skills/skillssh-registry.ts +4 -4
  768. package/src/stt/__tests__/daemon-batch-transcriber.test.ts +392 -0
  769. package/src/stt/__tests__/types.test.ts +89 -0
  770. package/src/stt/daemon-batch-transcriber.ts +195 -0
  771. package/src/stt/stt-stream-session.ts +499 -0
  772. package/src/stt/types.ts +330 -0
  773. package/src/stt/wav-encoder.test.ts +373 -0
  774. package/src/stt/wav-encoder.ts +175 -0
  775. package/src/subagent/manager.ts +169 -40
  776. package/src/subagent/types.ts +19 -0
  777. package/src/tools/apps/executors.ts +11 -2
  778. package/src/tools/browser/__tests__/auth-detector.test.ts +202 -108
  779. package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
  780. package/src/tools/browser/__tests__/browser-status.test.ts +123 -0
  781. package/src/tools/browser/auth-detector.ts +43 -12
  782. package/src/tools/browser/browser-execution.ts +1787 -342
  783. package/src/tools/browser/browser-manager.ts +81 -12
  784. package/src/tools/browser/browser-mode-constants.ts +12 -0
  785. package/src/tools/browser/browser-mode.ts +92 -0
  786. package/src/tools/browser/browser-status-constants.ts +33 -0
  787. package/src/tools/browser/cdp-client/__tests__/accessibility-snapshot.test.ts +318 -0
  788. package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +1175 -0
  789. package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1263 -0
  790. package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +359 -0
  791. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1993 -0
  792. package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-nested-frames.json +64 -0
  793. package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-simple.json +69 -0
  794. package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +310 -0
  795. package/src/tools/browser/cdp-client/__tests__/types.test.ts +96 -0
  796. package/src/tools/browser/cdp-client/accessibility-snapshot.ts +387 -0
  797. package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +695 -0
  798. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +1007 -0
  799. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +580 -0
  800. package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +744 -0
  801. package/src/tools/browser/cdp-client/cdp-inspect/ws-transport.ts +579 -0
  802. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +868 -0
  803. package/src/tools/browser/cdp-client/errors.ts +49 -0
  804. package/src/tools/browser/cdp-client/extension-cdp-client.ts +148 -0
  805. package/src/tools/browser/cdp-client/factory.ts +914 -0
  806. package/src/tools/browser/cdp-client/index.ts +28 -0
  807. package/src/tools/browser/cdp-client/local-cdp-client.ts +187 -0
  808. package/src/tools/browser/cdp-client/types.ts +120 -0
  809. package/src/tools/credentials/vault.ts +35 -6
  810. package/src/tools/filesystem/edit.ts +1 -1
  811. package/src/tools/filesystem/list.ts +1 -1
  812. package/src/tools/filesystem/read.ts +1 -1
  813. package/src/tools/filesystem/write.ts +2 -1
  814. package/src/tools/host-filesystem/edit.ts +1 -1
  815. package/src/tools/host-filesystem/read.ts +12 -15
  816. package/src/tools/host-filesystem/write.ts +1 -1
  817. package/src/tools/host-terminal/host-shell.ts +21 -16
  818. package/src/tools/network/web-fetch.ts +5 -2
  819. package/src/tools/network/web-search.ts +5 -2
  820. package/src/tools/permission-checker.ts +77 -82
  821. package/src/tools/registry.ts +0 -2
  822. package/src/tools/secret-detection-handler.ts +34 -0
  823. package/src/tools/shared/filesystem/image-read.ts +61 -40
  824. package/src/tools/shared/shell-output.ts +3 -1
  825. package/src/tools/side-effects.ts +2 -0
  826. package/src/tools/skills/sandbox-runner.ts +3 -2
  827. package/src/tools/subagent/spawn.ts +47 -3
  828. package/src/tools/subagent/status.ts +2 -0
  829. package/src/tools/system/register.ts +2 -16
  830. package/src/tools/terminal/safe-env.ts +15 -0
  831. package/src/tools/terminal/shell.ts +36 -20
  832. package/src/tools/tool-approval-handler.ts +48 -2
  833. package/src/tools/tool-manifest.ts +21 -0
  834. package/src/tools/types.ts +19 -0
  835. package/src/tools/ui-surface/definitions.ts +6 -1
  836. package/src/tts/__tests__/provider-adapters.test.ts +834 -0
  837. package/src/tts/__tests__/provider-catalog-consistency.test.ts +196 -0
  838. package/src/tts/__tests__/provider-catalog.test.ts +183 -0
  839. package/src/tts/__tests__/provider-registry.test.ts +90 -0
  840. package/src/tts/provider-catalog.ts +201 -0
  841. package/src/tts/provider-registry.ts +73 -0
  842. package/src/tts/providers/deepgram-provider.ts +219 -0
  843. package/src/tts/providers/elevenlabs-provider.ts +211 -0
  844. package/src/tts/providers/fish-audio-provider.ts +183 -0
  845. package/src/tts/providers/index.ts +42 -0
  846. package/src/tts/providers/register-builtins.ts +130 -0
  847. package/src/tts/synthesize-text.ts +110 -0
  848. package/src/tts/tts-config-resolver.ts +78 -0
  849. package/src/tts/types.ts +153 -0
  850. package/src/types/onboarding-context.ts +7 -0
  851. package/src/util/abort-reasons.ts +58 -0
  852. package/src/util/device-id.ts +32 -16
  853. package/src/util/errors.ts +9 -1
  854. package/src/util/platform.ts +63 -24
  855. package/src/util/pricing.ts +66 -3
  856. package/src/util/spawn.ts +1 -1
  857. package/src/util/truncate.ts +4 -2
  858. package/src/util/unicode.ts +201 -0
  859. package/src/version.ts +19 -24
  860. package/src/watcher/engine.ts +23 -0
  861. package/src/watcher/watcher-store.ts +31 -0
  862. package/src/workspace/migrations/003-seed-device-id.ts +9 -3
  863. package/src/workspace/migrations/017-seed-persona-dirs.ts +68 -4
  864. package/src/workspace/migrations/029-seed-pkb.ts +1 -1
  865. package/src/workspace/migrations/031-drop-user-md.ts +317 -0
  866. package/src/workspace/migrations/031-llm-log-retention-zero-to-null.ts +73 -0
  867. package/src/workspace/migrations/032-tts-provider-unification.ts +227 -0
  868. package/src/workspace/migrations/033-stt-service-explicit-config.ts +122 -0
  869. package/src/workspace/migrations/034-remove-calls-voice-transcription-provider.ts +215 -0
  870. package/src/workspace/migrations/035-seed-slack-channel-persona.ts +50 -0
  871. package/src/workspace/migrations/036-update-pkb-index-bar.ts +37 -0
  872. package/src/workspace/migrations/037-create-meets-dir.ts +61 -0
  873. package/src/workspace/migrations/registry.ts +16 -0
  874. package/src/workspace/top-level-renderer.ts +31 -1
  875. package/src/workspace/turn-commit.ts +31 -0
  876. package/src/__tests__/chrome-cdp.test.ts +0 -419
  877. package/src/__tests__/email-cli.test.ts +0 -297
  878. package/src/__tests__/email-service-config-fallback.test.ts +0 -102
  879. package/src/__tests__/permission-mode-sse.test.ts +0 -418
  880. package/src/__tests__/permission-mode-store.test.ts +0 -277
  881. package/src/browser-extension-relay/protocol.ts +0 -63
  882. package/src/browser-extension-relay/server.ts +0 -203
  883. package/src/cli/commands/browser-relay.ts +0 -536
  884. package/src/config/schemas/sandbox.ts +0 -14
  885. package/src/email/guardrails.ts +0 -221
  886. package/src/email/provider.ts +0 -117
  887. package/src/email/providers/agentmail.ts +0 -361
  888. package/src/email/providers/index.ts +0 -65
  889. package/src/email/service.ts +0 -384
  890. package/src/email/types.ts +0 -126
  891. package/src/permissions/permission-mode-store.ts +0 -180
  892. package/src/prompts/templates/USER.md +0 -13
  893. package/src/providers/speech-to-text/types.ts +0 -17
  894. package/src/tools/browser/chrome-cdp.ts +0 -239
  895. package/src/tools/system/set-permission-mode.ts +0 -103
@@ -7,6 +7,7 @@ import {
7
7
  setBroadcastToAllClients,
8
8
  } from "../acp/index.js";
9
9
  import { enrichMessageWithSourcePaths } from "../agent/attachments.js";
10
+ import type { AgentEvent } from "../agent/loop.js";
10
11
  import {
11
12
  createAssistantMessage,
12
13
  createUserMessage,
@@ -23,7 +24,9 @@ import { getConfig } from "../config/loader.js";
23
24
  import { onContactChange } from "../contacts/contact-events.js";
24
25
  import type { CesClient } from "../credential-execution/client.js";
25
26
  import type { CesProcessManager } from "../credential-execution/process-manager.js";
27
+ import type { FilingService } from "../filing/filing-service.js";
26
28
  import type { HeartbeatService } from "../heartbeat/heartbeat-service.js";
29
+ import { CliIpcServer } from "../ipc/cli-server.js";
27
30
  import { getApp, getAppDirPath, isMultifileApp } from "../memory/app-store.js";
28
31
  import * as attachmentsStore from "../memory/attachments-store.js";
29
32
  import {
@@ -39,11 +42,19 @@ import {
39
42
  setConversationOriginChannelIfUnset,
40
43
  setConversationOriginInterfaceIfUnset,
41
44
  } from "../memory/conversation-crud.js";
42
- import { updateMetaFile } from "../memory/conversation-disk-view.js";
45
+ import {
46
+ syncMessageToDisk,
47
+ updateMetaFile,
48
+ } from "../memory/conversation-disk-view.js";
43
49
  import { getOrCreateConversation } from "../memory/conversation-key-store.js";
50
+ import { syncIdentityNameToPlatform } from "../platform/sync-identity.js";
44
51
  import { buildSystemPrompt } from "../prompts/system-prompt.js";
45
52
  import { RateLimitProvider } from "../providers/ratelimit.js";
46
53
  import { getProvider, initializeProviders } from "../providers/registry.js";
54
+ import {
55
+ registerDefaultWakeResolver,
56
+ type WakeTarget,
57
+ } from "../runtime/agent-wake.js";
47
58
  import { buildAssistantEvent } from "../runtime/assistant-event.js";
48
59
  import { assistantEventHub } from "../runtime/assistant-event-hub.js";
49
60
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
@@ -59,6 +70,7 @@ import { appendEventToStream } from "../signals/event-stream.js";
59
70
  import { registerUserMessageCallback } from "../signals/user-message.js";
60
71
  import { getSubagentManager } from "../subagent/index.js";
61
72
  import { summarizeToolInput } from "../tools/tool-input-summary.js";
73
+ import { createAbortReason } from "../util/abort-reasons.js";
62
74
  import { getLogger } from "../util/logger.js";
63
75
  import {
64
76
  getAvatarImagePath,
@@ -66,7 +78,10 @@ import {
66
78
  getWorkspacePromptPath,
67
79
  } from "../util/platform.js";
68
80
  import { registerDaemonCallbacks } from "../work-items/work-item-runner.js";
69
- import { AppSourceWatcher } from "./app-source-watcher.js";
81
+ import {
82
+ AppSourceWatcher,
83
+ setEnsureAppSourceWatcher,
84
+ } from "./app-source-watcher.js";
70
85
  import { ConfigWatcher } from "./config-watcher.js";
71
86
  import {
72
87
  Conversation,
@@ -74,6 +89,7 @@ import {
74
89
  DEFAULT_MEMORY_POLICY,
75
90
  } from "./conversation.js";
76
91
  import { ConversationEvictor } from "./conversation-evictor.js";
92
+ import { registerLaunchConversationDeps } from "./conversation-launch.js";
77
93
  import { formatCompactResult } from "./conversation-process.js";
78
94
  import { resolveChannelCapabilities } from "./conversation-runtime-assembly.js";
79
95
  import { resolveSlash, type SlashContext } from "./conversation-slash.js";
@@ -86,6 +102,7 @@ import type {
86
102
  } from "./handlers/shared.js";
87
103
  import type { SkillOperationContext } from "./handlers/skills.js";
88
104
  import { HostBashProxy } from "./host-bash-proxy.js";
105
+ import { HostBrowserProxy } from "./host-browser-proxy.js";
89
106
  import { HostCuProxy } from "./host-cu-proxy.js";
90
107
  import { HostFileProxy } from "./host-file-proxy.js";
91
108
  import type {
@@ -158,9 +175,10 @@ function resolveCanonicalRequestSourceType(
158
175
 
159
176
  /**
160
177
  * Build an onEvent callback that registers pending interactions when the agent
161
- * loop emits confirmation_request, secret_request, host_bash_request, or
162
- * host_file_request events. This ensures that channel approval interception
163
- * can look up the conversation by requestId.
178
+ * loop emits confirmation_request, secret_request, host_bash_request,
179
+ * host_browser_request, host_file_request, or host_cu_request events. This
180
+ * ensures that channel approval interception can look up the conversation by
181
+ * requestId.
164
182
  */
165
183
  function makePendingInteractionRegistrar(
166
184
  conversation: Conversation,
@@ -249,6 +267,12 @@ function makePendingInteractionRegistrar(
249
267
  conversationId,
250
268
  kind: "host_bash",
251
269
  });
270
+ } else if (msg.type === "host_browser_request") {
271
+ pendingInteractions.register(msg.requestId, {
272
+ conversation,
273
+ conversationId,
274
+ kind: "host_browser",
275
+ });
252
276
  } else if (msg.type === "host_file_request") {
253
277
  pendingInteractions.register(msg.requestId, {
254
278
  conversation,
@@ -277,6 +301,7 @@ export class DaemonServer {
277
301
  // Composed subsystems
278
302
  private configWatcher = new ConfigWatcher();
279
303
  private appSourceWatcher = new AppSourceWatcher();
304
+ private cliIpc = new CliIpcServer();
280
305
 
281
306
  // CES (Credential Execution Service) — process-level singleton.
282
307
  // Lifecycle is managed by startCesProcess() in lifecycle.ts; the server
@@ -353,6 +378,17 @@ export class DaemonServer {
353
378
  return this._heartbeatService;
354
379
  }
355
380
 
381
+ /** Optional filing service reference for "Run Now" from the UI. */
382
+ private _filingService?: FilingService;
383
+
384
+ setFilingService(service: FilingService): void {
385
+ this._filingService = service;
386
+ }
387
+
388
+ getFilingService(): FilingService | undefined {
389
+ return this._filingService;
390
+ }
391
+
356
392
  private deriveMemoryPolicy(conversationId: string): ConversationMemoryPolicy {
357
393
  const conversationType = getConversationType(conversationId);
358
394
  if (conversationType === "private") {
@@ -376,13 +412,23 @@ export class DaemonServer {
376
412
  "Transport metadata received",
377
413
  );
378
414
  conversation.setTransportHints(buildTransportHints(transport));
415
+ // Route client-reported host env through the capability-gated setter on
416
+ // Conversation so both the create/reuse path here and the queue-drain
417
+ // path in conversation-process share one implementation. The method
418
+ // gates on `supportsHostProxy` (not a specific interface name), so any
419
+ // new host-capable client added to `HostProxyInterfaceId` will flow its
420
+ // host env through automatically.
421
+ conversation.applyHostEnvFromTransport(transport);
379
422
  }
380
423
 
381
424
  constructor() {
382
425
  this.evictor = new ConversationEvictor(this.conversations);
383
426
  getSubagentManager().sharedRequestTimestamps = this.sharedRequestTimestamps;
384
427
  getSubagentManager().broadcastToAllClients = (msg) => this.broadcast(msg);
428
+ getSubagentManager().resolveParentConversation = (id) =>
429
+ this.conversations.get(id);
385
430
  setBroadcastToAllClients((msg) => this.broadcast(msg));
431
+ setEnsureAppSourceWatcher(() => this.appSourceWatcher.ensureStarted());
386
432
  this.evictor.onEvict = (conversationId: string) => {
387
433
  getSubagentManager().abortAllForParent(conversationId);
388
434
  };
@@ -524,11 +570,32 @@ export class DaemonServer {
524
570
  emoji: fields.emoji,
525
571
  home: fields.home,
526
572
  });
573
+
574
+ // Best-effort sync of the assistant name to the platform record.
575
+ if (fields.name) {
576
+ syncIdentityNameToPlatform(fields.name);
577
+ }
527
578
  } catch (err) {
528
579
  log.error({ err }, "Failed to broadcast identity change");
529
580
  }
530
581
  }
531
582
 
583
+ /** Best-effort sync of the IDENTITY.md name to the platform record. */
584
+ private syncIdentityToPlatform(): void {
585
+ try {
586
+ const identityPath = getWorkspacePromptPath("IDENTITY.md");
587
+ const content = existsSync(identityPath)
588
+ ? readFileSync(identityPath, "utf-8")
589
+ : "";
590
+ const fields = parseIdentityFields(content);
591
+ if (fields.name) {
592
+ syncIdentityNameToPlatform(fields.name);
593
+ }
594
+ } catch (err) {
595
+ log.error({ err }, "Failed to sync identity to platform at startup");
596
+ }
597
+ }
598
+
532
599
  private broadcastConfigChanged(): void {
533
600
  this.broadcast({ type: "config_changed" });
534
601
  }
@@ -605,7 +672,13 @@ export class DaemonServer {
605
672
  const conversation = this.conversations.get(conversationId);
606
673
  if (!conversation) return false;
607
674
  this.evictor.touch(conversationId);
608
- conversation.abort();
675
+ conversation.abort(
676
+ createAbortReason(
677
+ "signal_cancel",
678
+ "registerCancelCallback",
679
+ conversationId,
680
+ ),
681
+ );
609
682
  getSubagentManager().abortAllForParent(conversationId);
610
683
  return true;
611
684
  });
@@ -732,6 +805,56 @@ export class DaemonServer {
732
805
  return { accepted: true };
733
806
  });
734
807
 
808
+ // Install the default resolver for `wakeAgentForOpportunity()` so
809
+ // internal subsystems (e.g. the Meet chat-opportunity detector wired
810
+ // up in `MeetSessionManager`) can invoke it without having to build
811
+ // a `WakeTarget` adapter themselves. The adapter wraps a live
812
+ // `Conversation` fetched from the in-memory map / hydrated from the
813
+ // DB, exposing only the narrow surface the wake helper needs.
814
+ registerDefaultWakeResolver(async (conversationId) => {
815
+ try {
816
+ const conversation = await this.getOrCreateConversation(conversationId);
817
+ return conversationToWakeTarget(conversation);
818
+ } catch (err) {
819
+ log.warn(
820
+ { err, conversationId },
821
+ "agent-wake default resolver: failed to hydrate conversation",
822
+ );
823
+ return null;
824
+ }
825
+ });
826
+
827
+ // Start the CLI IPC server. Built-in methods (wake_conversation) are
828
+ // registered by the constructor; CLI commands connect to this socket to
829
+ // invoke daemon-side operations that require in-process state.
830
+ this.cliIpc.start();
831
+
832
+ // Wire the launchConversation helper to daemon-side state so
833
+ // handleSurfaceAction can spawn conversations through it.
834
+ registerLaunchConversationDeps({
835
+ getOrCreateConversation: (id, options) =>
836
+ this.getOrCreateConversation(id, options),
837
+ persistAndProcessMessage: (
838
+ conversationId,
839
+ content,
840
+ attachmentIds,
841
+ options,
842
+ sourceChannel,
843
+ sourceInterface,
844
+ ) =>
845
+ this.persistAndProcessMessage(
846
+ conversationId,
847
+ content,
848
+ attachmentIds,
849
+ options,
850
+ sourceChannel,
851
+ sourceInterface,
852
+ ),
853
+ publishAssistantEvent: (msg, conversationId) =>
854
+ this.publishAssistantEvent(msg, conversationId),
855
+ getAssistantId: () => this.assistantId,
856
+ });
857
+
735
858
  this.configWatcher.start(
736
859
  () => this.evictConversationsForReload(),
737
860
  () => this.broadcastIdentityChanged(),
@@ -741,6 +864,8 @@ export class DaemonServer {
741
864
  () => this.broadcastFeatureFlagsChanged(),
742
865
  );
743
866
 
867
+ this.syncIdentityToPlatform();
868
+
744
869
  this.appSourceWatcher.start((appId) => this.handleAppSourceChange(appId));
745
870
 
746
871
  // Broadcast contacts_changed to all clients when any contact mutation occurs.
@@ -757,6 +882,7 @@ export class DaemonServer {
757
882
  this.evictor.stop();
758
883
  this.configWatcher.stop();
759
884
  this.appSourceWatcher.stop();
885
+ this.cliIpc.stop();
760
886
  if (this.unsubscribeContactChange) {
761
887
  this.unsubscribeContactChange();
762
888
  this.unsubscribeContactChange = null;
@@ -880,10 +1006,11 @@ export class DaemonServer {
880
1006
  let conversation = this.conversations.get(conversationId);
881
1007
  const sendToClient = () => {};
882
1008
 
883
- if (options && Object.values(options).some((v) => v !== undefined)) {
1009
+ const { taskRunId: _taskRunId, ...persistentOptions } = options ?? {};
1010
+ if (Object.values(persistentOptions).some((v) => v !== undefined)) {
884
1011
  this.conversationOptions.set(conversationId, {
885
1012
  ...this.conversationOptions.get(conversationId),
886
- ...options,
1013
+ ...persistentOptions,
887
1014
  });
888
1015
  }
889
1016
 
@@ -937,6 +1064,9 @@ export class DaemonServer {
937
1064
  memoryPolicy,
938
1065
  sharedCesClient,
939
1066
  storedOptions?.speed,
1067
+ undefined,
1068
+ storedOptions?.modelIntent,
1069
+ storedOptions?.modelOverride,
940
1070
  );
941
1071
  newConversation.updateClient(sendToClient, true);
942
1072
  await newConversation.loadFromDb();
@@ -975,6 +1105,15 @@ export class DaemonServer {
975
1105
  // overwrite the in-flight conversation's transportHints.
976
1106
  if (!conversation.isProcessing()) {
977
1107
  this.applyTransportMetadata(conversation, options);
1108
+ // trustContext is reapplied here only when the conversation is idle,
1109
+ // so concurrent requests cannot overwrite an in-flight turn's guardian
1110
+ // scope. Direct callers (e.g. schedule-routes run-now) that invoke
1111
+ // processMessage without going through prepareConversationForMessage
1112
+ // rely on this to pick up the trustContext passed in options.
1113
+ // prepareConversationForMessage also reapplies after its own idle check.
1114
+ if (options?.trustContext !== undefined) {
1115
+ conversation.setTrustContext(options.trustContext);
1116
+ }
978
1117
  }
979
1118
  this.evictor.touch(conversationId);
980
1119
  }
@@ -1055,6 +1194,7 @@ export class DaemonServer {
1055
1194
  conversation.setAssistantId(
1056
1195
  options?.assistantId ?? DAEMON_INTERNAL_ASSISTANT_ID,
1057
1196
  );
1197
+ conversation.taskRunId = options?.taskRunId;
1058
1198
  // Only overwrite trust/auth context when explicitly provided. Callers that
1059
1199
  // don't supply a trust context (e.g. signal-injected messages) should
1060
1200
  // inherit whatever the conversation already has from a prior session.
@@ -1082,13 +1222,36 @@ export class DaemonServer {
1082
1222
  options?.transport?.chatType,
1083
1223
  ),
1084
1224
  );
1085
- // Only create the host bash proxy for desktop client interfaces that can
1086
- // execute commands on the user's machine. Non-desktop conversations (CLI,
1087
- // channels, headless) fall back to local execution.
1225
+ // Chrome-extension host_browser wiring is intentionally not supported
1226
+ // through this entry point. `prepareConversationForMessage` constructs
1227
+ // host_browser proxies that capture `conversation.getCurrentSender()`
1228
+ // directly, which would route browser frames through the daemon SSE
1229
+ // channel instead of the `ChromeExtensionRegistry`. Chrome-extension
1230
+ // flows reach host_browser exclusively through the
1231
+ // `/v1/messages` flow in `conversation-routes.ts`, which wires a
1232
+ // registry-aware sender and sets `hostBrowserSenderOverride`.
1233
+ //
1234
+ // Fail loudly rather than silently returning a mis-wired proxy so that
1235
+ // any future caller that tries to route chrome-extension through this
1236
+ // path discovers the gap immediately. When the time comes, factor the
1237
+ // wiring in conversation-routes.ts (registry lookup + override) into a
1238
+ // shared helper and call it from both sites.
1239
+ if (resolvedInterface === "chrome-extension") {
1240
+ throw new Error(
1241
+ "prepareConversationForMessage does not yet support chrome-extension transport — " +
1242
+ "use the conversation-routes.ts /v1/messages flow which routes host_browser through " +
1243
+ "the ChromeExtensionRegistry. If you need chrome-extension here, factor out the " +
1244
+ "wiring in conversation-routes.ts into a shared helper.",
1245
+ );
1246
+ }
1247
+ // Only create each host proxy for interfaces that support the matching
1248
+ // capability. macOS supports all four; the chrome-extension interface only
1249
+ // supports host_browser. Non-desktop conversations (CLI, channels, headless)
1250
+ // fall back to local execution.
1088
1251
  // Guard: don't replace an active proxy during concurrent turn races —
1089
1252
  // another request may have started processing between the isProcessing()
1090
1253
  // check above and the await on ensureActorScopedHistory().
1091
- if (supportsHostProxy(resolvedInterface)) {
1254
+ if (supportsHostProxy(resolvedInterface, "host_bash")) {
1092
1255
  if (!conversation.isProcessing() || !conversation.hostBashProxy) {
1093
1256
  conversation.setHostBashProxy(
1094
1257
  new HostBashProxy(conversation.getCurrentSender(), (requestId) => {
@@ -1096,6 +1259,21 @@ export class DaemonServer {
1096
1259
  }),
1097
1260
  );
1098
1261
  }
1262
+ } else if (!conversation.isProcessing()) {
1263
+ conversation.setHostBashProxy(undefined);
1264
+ }
1265
+ if (supportsHostProxy(resolvedInterface, "host_browser")) {
1266
+ if (!conversation.isProcessing() || !conversation.hostBrowserProxy) {
1267
+ conversation.setHostBrowserProxy(
1268
+ new HostBrowserProxy(conversation.getCurrentSender(), (requestId) => {
1269
+ pendingInteractions.resolve(requestId);
1270
+ }),
1271
+ );
1272
+ }
1273
+ } else if (!conversation.isProcessing()) {
1274
+ conversation.setHostBrowserProxy(undefined);
1275
+ }
1276
+ if (supportsHostProxy(resolvedInterface, "host_file")) {
1099
1277
  if (!conversation.isProcessing() || !conversation.hostFileProxy) {
1100
1278
  conversation.setHostFileProxy(
1101
1279
  new HostFileProxy(conversation.getCurrentSender(), (requestId) => {
@@ -1103,6 +1281,10 @@ export class DaemonServer {
1103
1281
  }),
1104
1282
  );
1105
1283
  }
1284
+ } else if (!conversation.isProcessing()) {
1285
+ conversation.setHostFileProxy(undefined);
1286
+ }
1287
+ if (supportsHostProxy(resolvedInterface, "host_cu")) {
1106
1288
  if (!conversation.isProcessing() || !conversation.hostCuProxy) {
1107
1289
  conversation.setHostCuProxy(
1108
1290
  new HostCuProxy(conversation.getCurrentSender(), (requestId) => {
@@ -1112,8 +1294,6 @@ export class DaemonServer {
1112
1294
  }
1113
1295
  conversation.addPreactivatedSkillId("computer-use");
1114
1296
  } else if (!conversation.isProcessing()) {
1115
- conversation.setHostBashProxy(undefined);
1116
- conversation.setHostFileProxy(undefined);
1117
1297
  conversation.setHostCuProxy(undefined);
1118
1298
  }
1119
1299
  conversation.setCommandIntent(options?.commandIntent ?? null);
@@ -1192,8 +1372,25 @@ export class DaemonServer {
1192
1372
  }
1193
1373
  }
1194
1374
  : registrar;
1375
+ // Non-interactive interfaces that still have a connected client capable
1376
+ // of handling host_browser_request events (e.g. chrome-extension) need
1377
+ // their hostBrowserProxy explicitly marked connected. The proxy
1378
+ // constructor defaults clientConnected = false, so without an explicit
1379
+ // sender update the chrome-extension proxy would be created and
1380
+ // immediately unavailable. We do NOT call updateClient(onEvent, false)
1381
+ // for that case, because flipping hasNoClient false would also enable
1382
+ // host_bash/host_file/host_cu tool gating for an interface that can't
1383
+ // service them. Instead, provision just the browser proxy's sender.
1384
+ const persistInterfaceCtx = conversation.getTurnInterfaceContext();
1385
+ const persistInterface = persistInterfaceCtx?.userMessageInterface;
1195
1386
  if (options?.isInteractive === true) {
1196
1387
  conversation.updateClient(onEvent, false);
1388
+ } else if (
1389
+ persistInterface &&
1390
+ !supportsHostProxy(persistInterface) &&
1391
+ supportsHostProxy(persistInterface, "host_browser")
1392
+ ) {
1393
+ conversation.hostBrowserProxy?.updateSender(onEvent, true);
1197
1394
  }
1198
1395
 
1199
1396
  conversation
@@ -1504,3 +1701,231 @@ function extractConversationId(msg: ServerMessage): string | undefined {
1504
1701
  }
1505
1702
  return undefined;
1506
1703
  }
1704
+
1705
+ /**
1706
+ * Translate a raw {@link AgentEvent} from the agent loop into the
1707
+ * corresponding {@link ServerMessage} wire frame. The normal user-turn
1708
+ * path does this via the full state-aware handler in
1709
+ * `conversation-agent-loop-handlers.ts`; the wake path has no tool
1710
+ * accounting, title generation, or activity-state tracking to worry
1711
+ * about, so we only need the subset that produces client-visible
1712
+ * frames. Events that have no client-visible wire shape (usage, error,
1713
+ * preview/input-json deltas, etc.) are dropped — they produce no UI.
1714
+ *
1715
+ * Keeping this translator co-located with the wake adapter preserves
1716
+ * the runtime/daemon layering: `runtime/agent-wake.ts` never imports
1717
+ * `message-protocol.ts` or wire shapes, and the daemon owns all
1718
+ * translation from agent-loop semantics to client frames.
1719
+ */
1720
+ function translateAgentEventToServerMessage(
1721
+ event: AgentEvent,
1722
+ conversationId: string,
1723
+ ): ServerMessage | null {
1724
+ switch (event.type) {
1725
+ case "text_delta":
1726
+ return {
1727
+ type: "assistant_text_delta",
1728
+ text: event.text,
1729
+ conversationId,
1730
+ };
1731
+ case "thinking_delta":
1732
+ return {
1733
+ type: "assistant_thinking_delta",
1734
+ thinking: event.thinking,
1735
+ conversationId,
1736
+ };
1737
+ case "tool_use":
1738
+ return {
1739
+ type: "tool_use_start",
1740
+ toolName: event.name,
1741
+ input: event.input,
1742
+ conversationId,
1743
+ toolUseId: event.id,
1744
+ };
1745
+ case "tool_use_preview_start":
1746
+ return {
1747
+ type: "tool_use_preview_start",
1748
+ toolUseId: event.toolUseId,
1749
+ toolName: event.toolName,
1750
+ conversationId,
1751
+ };
1752
+ case "tool_output_chunk":
1753
+ return {
1754
+ type: "tool_output_chunk",
1755
+ chunk: event.chunk,
1756
+ conversationId,
1757
+ toolUseId: event.toolUseId,
1758
+ };
1759
+ case "tool_result": {
1760
+ const imageBlocks = event.contentBlocks?.filter(
1761
+ (b): b is Extract<typeof b, { type: "image" }> => b.type === "image",
1762
+ );
1763
+ const imageDataList = imageBlocks?.length
1764
+ ? imageBlocks.map((b) => b.source.data)
1765
+ : undefined;
1766
+ return {
1767
+ type: "tool_result",
1768
+ toolName: "",
1769
+ result: event.content,
1770
+ isError: event.isError,
1771
+ diff: event.diff,
1772
+ status: event.status,
1773
+ conversationId,
1774
+ imageData: imageDataList?.[0],
1775
+ imageDataList,
1776
+ toolUseId: event.toolUseId,
1777
+ };
1778
+ }
1779
+ case "server_tool_start":
1780
+ return {
1781
+ type: "tool_use_start",
1782
+ toolName: event.name,
1783
+ input: event.input,
1784
+ conversationId,
1785
+ toolUseId: event.toolUseId,
1786
+ };
1787
+ case "server_tool_complete": {
1788
+ let resultText = "";
1789
+ if (Array.isArray(event.content) && event.content.length > 0) {
1790
+ resultText = (event.content as unknown[])
1791
+ .filter(
1792
+ (r): r is { type: string; title: string; url: string } =>
1793
+ typeof r === "object" &&
1794
+ r != null &&
1795
+ (r as { type?: string }).type === "web_search_result",
1796
+ )
1797
+ .map((r) => `${r.title}\n${r.url}`)
1798
+ .join("\n\n");
1799
+ }
1800
+ return {
1801
+ type: "tool_result",
1802
+ toolName: "web_search",
1803
+ result: resultText,
1804
+ isError: event.isError,
1805
+ conversationId,
1806
+ toolUseId: event.toolUseId,
1807
+ };
1808
+ }
1809
+ case "message_complete":
1810
+ return {
1811
+ type: "message_complete",
1812
+ conversationId,
1813
+ };
1814
+ // No wire frame for these — usage/error/input_json_delta are either
1815
+ // server-internal (accounting/classification) or app-only debug
1816
+ // streams the client doesn't surface for wake-originated turns.
1817
+ case "input_json_delta":
1818
+ case "usage":
1819
+ case "error":
1820
+ return null;
1821
+ }
1822
+ }
1823
+
1824
+ /**
1825
+ * Adapt a live {@link Conversation} to the narrow {@link WakeTarget}
1826
+ * surface expected by `wakeAgentForOpportunity()`. Kept here so the
1827
+ * runtime-level wake helper stays decoupled from the heavyweight
1828
+ * conversation class (see `registerDefaultWakeResolver` above).
1829
+ *
1830
+ * Routing notes:
1831
+ * - `emitAgentEvent` dispatches via `broadcastToAllClients` rather
1832
+ * than `sendToClient`. Several signal-injected paths reset
1833
+ * `sendToClient` to a no-op in their `finally` blocks (see the
1834
+ * `updateClient(() => {}, true)` calls in `persistAndProcessMessage`
1835
+ * / `processMessage`), so a wake fired on such a conversation would
1836
+ * find a silent sink. `broadcastToAllClients` is wired to
1837
+ * `this.broadcast(msg)` at construction time and always reaches the
1838
+ * hub, regardless of which sender the most-recent user turn left
1839
+ * behind.
1840
+ * - `persistTailMessage` mirrors the canonical user-turn handlers
1841
+ * (`handleMessageComplete` / the tool-result block in
1842
+ * `conversation-agent-loop-handlers.ts`): builds channel/interface
1843
+ * metadata via `provenanceFromTrustContext` plus the live turn
1844
+ * channel/interface contexts, persists with metadata, and syncs the
1845
+ * resulting row to the disk view so wake-produced messages appear
1846
+ * in the on-disk transcript and carry provenance tags.
1847
+ * - `drainQueue` delegates to the conversation so any user messages
1848
+ * queued while the wake was running are processed. The wake helper
1849
+ * calls this in its finally AFTER `markProcessing(false)`; the
1850
+ * order matters because `enqueueMessage` only queues when
1851
+ * `processing === true`.
1852
+ */
1853
+ function conversationToWakeTarget(conversation: Conversation): WakeTarget {
1854
+ return {
1855
+ conversationId: conversation.conversationId,
1856
+ agentLoop: conversation.agentLoop,
1857
+ getMessages: () => conversation.getMessages(),
1858
+ pushMessage: (msg) => {
1859
+ conversation.messages.push(msg);
1860
+ },
1861
+ emitAgentEvent: (event) => {
1862
+ const frame = translateAgentEventToServerMessage(
1863
+ event,
1864
+ conversation.conversationId,
1865
+ );
1866
+ if (!frame) return;
1867
+ // Prefer `broadcastToAllClients` (wired to the hub at construction
1868
+ // time and always live) over `sendToClient` (which several
1869
+ // signal-injected paths reset to `() => {}` in their finally
1870
+ // blocks). Fall back to `sendToClient` when the broadcaster is
1871
+ // missing (e.g. in tests that construct a Conversation directly).
1872
+ if (conversation.broadcastToAllClients) {
1873
+ conversation.broadcastToAllClients(frame);
1874
+ } else {
1875
+ conversation.sendToClient(frame);
1876
+ }
1877
+ },
1878
+ isProcessing: () => conversation.isProcessing(),
1879
+ markProcessing: (on) => {
1880
+ conversation.processing = on;
1881
+ },
1882
+ persistTailMessage: async (message) => {
1883
+ // Build metadata that mirrors the canonical handlers in
1884
+ // `conversation-agent-loop-handlers.ts`. If the live turn channel
1885
+ // / interface contexts are missing (a wake can fire on a
1886
+ // conversation that has never run a user turn), fall back to the
1887
+ // conversation's origin channel/interface defaults (`"vellum"`)
1888
+ // so persisted rows still carry valid channel/interface ids.
1889
+ const turnChannelCtx = conversation.getTurnChannelContext();
1890
+ const turnInterfaceCtx = conversation.getTurnInterfaceContext();
1891
+ const metadata: Record<string, unknown> = {
1892
+ ...provenanceFromTrustContext(conversation.trustContext),
1893
+ userMessageChannel: turnChannelCtx?.userMessageChannel ?? "vellum",
1894
+ assistantMessageChannel:
1895
+ turnChannelCtx?.assistantMessageChannel ?? "vellum",
1896
+ userMessageInterface:
1897
+ turnInterfaceCtx?.userMessageInterface ?? "vellum",
1898
+ assistantMessageInterface:
1899
+ turnInterfaceCtx?.assistantMessageInterface ?? "vellum",
1900
+ };
1901
+ const persisted = await addMessage(
1902
+ conversation.conversationId,
1903
+ message.role,
1904
+ JSON.stringify(message.content),
1905
+ metadata,
1906
+ );
1907
+ // Sync the persisted row to the disk view so wake-produced
1908
+ // messages appear in the on-disk transcript and tools that read
1909
+ // from disk (e.g. `messages.jsonl`-based diagnostics) see them.
1910
+ // Mirrors the `syncMessageToDisk(...)` calls in the canonical
1911
+ // handlers — best-effort because a sync failure must not strand
1912
+ // the in-memory tail.
1913
+ try {
1914
+ const convRow = getConversation(conversation.conversationId);
1915
+ if (convRow) {
1916
+ syncMessageToDisk(
1917
+ conversation.conversationId,
1918
+ persisted.id,
1919
+ convRow.createdAt,
1920
+ );
1921
+ }
1922
+ } catch (err) {
1923
+ log.warn(
1924
+ { err, conversationId: conversation.conversationId },
1925
+ "wake adapter: syncMessageToDisk failed (non-fatal)",
1926
+ );
1927
+ }
1928
+ },
1929
+ drainQueue: () => conversation.drainQueue(),
1930
+ };
1931
+ }