@vellumai/assistant 0.12.2 → 0.12.3-dev.202609220419.f870d95

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 (821) hide show
  1. package/.env.example +2 -0
  2. package/AGENTS.md +1 -1
  3. package/ARCHITECTURE.md +43 -29
  4. package/Dockerfile +70 -0
  5. package/README.md +12 -12
  6. package/docker/mousepad/90-vellum.gschema.override +4 -0
  7. package/docs/architecture/integrations.md +7 -0
  8. package/docs/architecture/memory.md +17 -2
  9. package/docs/architecture/security.md +10 -5
  10. package/docs/architecture/turn-actor.md +2 -0
  11. package/docs/credential-execution-service.md +1 -1
  12. package/docs/desktop-browser-cli.md +50 -5
  13. package/docs/live-voice-task-outcomes.md +100 -0
  14. package/docs/mode-sessions.md +183 -0
  15. package/docs/voice-input-diagnostics.md +58 -0
  16. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +2 -1
  17. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
  18. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  19. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
  20. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
  21. package/node_modules/@vellumai/environments/src/shell.test.ts +21 -0
  22. package/node_modules/@vellumai/environments/src/shell.ts +24 -0
  23. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +2 -1
  24. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
  25. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  26. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
  27. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
  28. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +20 -0
  29. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -2
  30. package/node_modules/@vellumai/gateway-client/src/index.ts +4 -1
  31. package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +38 -7
  32. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +5 -6
  33. package/node_modules/@vellumai/service-contracts/package.json +2 -1
  34. package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +1 -0
  35. package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  36. package/node_modules/@vellumai/service-contracts/src/integration-categories.ts +36 -0
  37. package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +4 -1
  38. package/node_modules/@vellumai/slack-text/src/index.ts +4 -8
  39. package/openapi.yaml +721 -17
  40. package/package.json +1 -1
  41. package/scripts/smoke-desktop-browser-cli.ts +11 -26
  42. package/scripts/smoke-desktop-window-theme.ts +2 -3
  43. package/scripts/sync-llm-catalog.ts +3 -0
  44. package/scripts/voice-ttft-spike.ts +2 -2
  45. package/src/__tests__/agent-loop-output-hooks.test.ts +150 -1
  46. package/src/__tests__/agent-loop-provider-error-recording.test.ts +87 -19
  47. package/src/__tests__/agent-loop.test.ts +259 -0
  48. package/src/__tests__/agent-wake-delegation-prompt.test.ts +64 -2
  49. package/src/__tests__/annotate-activity-metadata.test.ts +3 -1
  50. package/src/__tests__/annotate-risk-options.test.ts +2 -0
  51. package/src/__tests__/answered-question-persistence.test.ts +2 -0
  52. package/src/__tests__/anthropic-gateway-shared.test.ts +22 -0
  53. package/src/__tests__/anthropic-provider.test.ts +55 -0
  54. package/src/__tests__/approval-interception-trust-gates.test.ts +40 -0
  55. package/src/__tests__/approval-message-composer.test.ts +1 -118
  56. package/src/__tests__/approval-routes-http.test.ts +7 -2
  57. package/src/__tests__/assistant-event-hub-connection-history.test.ts +111 -0
  58. package/src/__tests__/assistant-event-hub-targeted.test.ts +50 -0
  59. package/src/__tests__/assistant-event-targeting.test.ts +186 -0
  60. package/src/__tests__/assistant-stream-state.test.ts +29 -9
  61. package/src/__tests__/attachments-store.test.ts +22 -3
  62. package/src/__tests__/browser-fill-credential.test.ts +11 -22
  63. package/src/__tests__/btw-routes.test.ts +4 -1
  64. package/src/__tests__/build-persisted-content.test.ts +1 -1
  65. package/src/__tests__/call-conversation-messages.test.ts +5 -0
  66. package/src/__tests__/call-recovery.test.ts +7 -2
  67. package/src/__tests__/call-routes-http.test.ts +16 -2
  68. package/src/__tests__/call-store.test.ts +7 -2
  69. package/src/__tests__/channel-approval.test.ts +9 -14
  70. package/src/__tests__/channel-reply-delivery.test.ts +56 -0
  71. package/src/__tests__/channel-retry-sweep.test.ts +9 -0
  72. package/src/__tests__/chat-credential-redaction.test.ts +23 -0
  73. package/src/__tests__/chat-reveal-guard-priming.test.ts +2 -0
  74. package/src/__tests__/checker.test.ts +11 -3
  75. package/src/__tests__/client-os-metadata-persistence.test.ts +35 -1
  76. package/src/__tests__/computer-use-screenshot-attachments.test.ts +411 -0
  77. package/src/__tests__/computer-use-screenshot-selection.test.ts +50 -0
  78. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +0 -25
  79. package/src/__tests__/computer-use-tools.test.ts +1 -233
  80. package/src/__tests__/config-model-image-provider.test.ts +39 -0
  81. package/src/__tests__/config-schema.test.ts +16 -0
  82. package/src/__tests__/config-watcher.test.ts +24 -0
  83. package/src/__tests__/context-search-agent-runner.test.ts +260 -1
  84. package/src/__tests__/context-search-fanout.test.ts +1 -1
  85. package/src/__tests__/context-search-types.test.ts +7 -7
  86. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +8 -2
  87. package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +2 -0
  88. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
  89. package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -0
  90. package/src/__tests__/conversation-agent-loop.test.ts +797 -16
  91. package/src/__tests__/conversation-app-control-lifecycle.test.ts +53 -1
  92. package/src/__tests__/conversation-attachments.test.ts +106 -0
  93. package/src/__tests__/conversation-evictor.test.ts +62 -37
  94. package/src/__tests__/conversation-fork-crud.test.ts +191 -0
  95. package/src/__tests__/conversation-history-boundary-repair-failure.test.ts +174 -0
  96. package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +2 -0
  97. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +2 -0
  98. package/src/__tests__/conversation-rendered-delegation-state.test.ts +276 -0
  99. package/src/__tests__/conversation-resurface-done.test.ts +289 -0
  100. package/src/__tests__/conversation-retry-route.test.ts +22 -0
  101. package/src/__tests__/conversation-routes-disk-view.test.ts +2 -0
  102. package/src/__tests__/conversation-routes-enabled-plugins.test.ts +2 -0
  103. package/src/__tests__/conversation-routes-guardian-reply.test.ts +10 -0
  104. package/src/__tests__/conversation-routes-hidden-queue.test.ts +2 -0
  105. package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -0
  106. package/src/__tests__/conversation-runtime-assembly.test.ts +29 -0
  107. package/src/__tests__/conversation-surface-snapshots.test.ts +543 -0
  108. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +151 -0
  109. package/src/__tests__/conversation-surfaces-point-at-budget.test.ts +63 -1
  110. package/src/__tests__/conversation-tool-setup-attribution.test.ts +23 -0
  111. package/src/__tests__/conversation-undo.test.ts +61 -0
  112. package/src/__tests__/credential-execution-client.test.ts +72 -55
  113. package/src/__tests__/credential-prompt-route.test.ts +35 -3
  114. package/src/__tests__/cu-unified-flow.test.ts +82 -1
  115. package/src/__tests__/db-conversation-tool-surface.test.ts +221 -0
  116. package/src/__tests__/db-mode-sessions-migration.test.ts +175 -0
  117. package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -0
  118. package/src/__tests__/dm-backfill.test.ts +91 -1
  119. package/src/__tests__/document-create-route.test.ts +88 -0
  120. package/src/__tests__/document-sync-tags.test.ts +27 -0
  121. package/src/__tests__/emit-signal-routing-intent.test.ts +142 -2
  122. package/src/__tests__/events-tail-route.test.ts +58 -0
  123. package/src/__tests__/evict-conversations-for-reload.test.ts +57 -8
  124. package/src/__tests__/gemini-provider.test.ts +31 -0
  125. package/src/__tests__/guardian-action-sweep.test.ts +16 -0
  126. package/src/__tests__/guardian-dispatch.test.ts +13 -0
  127. package/src/__tests__/headless-browser-interactions.test.ts +64 -20
  128. package/src/__tests__/heartbeat-service.test.ts +2 -59
  129. package/src/__tests__/helpers/mock-conversation.ts +21 -0
  130. package/src/__tests__/helpers/native-web-search-harness.ts +2 -0
  131. package/src/__tests__/helpers/verification-sessions-ipc-sim.ts +5 -0
  132. package/src/__tests__/history-repair.test.ts +53 -0
  133. package/src/__tests__/host-cu-proxy.test.ts +46 -2
  134. package/src/__tests__/http-user-message-parity.test.ts +2 -0
  135. package/src/__tests__/image-credentials.test.ts +49 -0
  136. package/src/__tests__/image-service-dispatcher.test.ts +45 -0
  137. package/src/__tests__/inference-profile-session-handler.test.ts +26 -0
  138. package/src/__tests__/interrupt-on-send.test.ts +57 -43
  139. package/src/__tests__/interrupt-turn-note.test.ts +5 -6
  140. package/src/__tests__/list-messages-tool-merge.test.ts +85 -1
  141. package/src/__tests__/llm-catalog-parity.test.ts +27 -4
  142. package/src/__tests__/media-generate-image.test.ts +49 -1
  143. package/src/__tests__/message-provenance-contact-id.test.ts +69 -0
  144. package/src/__tests__/migration-export-to-gcs.test.ts +142 -0
  145. package/src/__tests__/mode-session-history.test.ts +245 -0
  146. package/src/__tests__/mode-session-recovery.test.ts +222 -0
  147. package/src/__tests__/mode-session-wire.test.ts +141 -0
  148. package/src/__tests__/notification-guardian-path.test.ts +7 -0
  149. package/src/__tests__/notification-telegram-adapter.test.ts +2 -2
  150. package/src/__tests__/notification-vellum-adapter.test.ts +34 -0
  151. package/src/__tests__/oauth-apps-routes.test.ts +1 -0
  152. package/src/__tests__/oauth-commands-routes.test.ts +114 -101
  153. package/src/__tests__/oauth-connect-orchestrator.test.ts +2 -0
  154. package/src/__tests__/oauth-provider-serializer.test.ts +13 -0
  155. package/src/__tests__/oauth-providers-routes.test.ts +3 -0
  156. package/src/__tests__/outbound-slack-persistence.test.ts +2 -0
  157. package/src/__tests__/persist-media-references.test.ts +50 -0
  158. package/src/__tests__/persistence-secret-redaction.test.ts +2 -0
  159. package/src/__tests__/plugin-api-provider.test.ts +5 -0
  160. package/src/__tests__/plugin-api-resolve-credential.test.ts +97 -0
  161. package/src/__tests__/plugin-import-boundary-guard.test.ts +9 -1
  162. package/src/__tests__/process-message-display-content.test.ts +56 -0
  163. package/src/__tests__/provider-error-scenarios.test.ts +46 -0
  164. package/src/__tests__/provider-platform-proxy-integration.test.ts +45 -15
  165. package/src/__tests__/reaction-persistence.test.ts +5 -0
  166. package/src/__tests__/request-secret-standalone-channel-gate.test.ts +25 -9
  167. package/src/__tests__/retry-fallback-escalation.test.ts +22 -0
  168. package/src/__tests__/run-conversation-turn-persistence.test.ts +138 -1
  169. package/src/__tests__/runtime-attachment-metadata.test.ts +4 -2
  170. package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
  171. package/src/__tests__/schedule-routes.test.ts +20 -0
  172. package/src/__tests__/scheduler-result-notification.test.ts +23 -4
  173. package/src/__tests__/script-proxy-certs.test.ts +1 -1
  174. package/src/__tests__/scripted-turn-metadata-persistence.test.ts +73 -0
  175. package/src/__tests__/secret-ingress-http.test.ts +2 -0
  176. package/src/__tests__/secret-routes-platform-proxy.test.ts +87 -31
  177. package/src/__tests__/secret-routes-scrub.test.ts +22 -27
  178. package/src/__tests__/secret-scanner.test.ts +20 -0
  179. package/src/__tests__/secure-keys-managed-failover.test.ts +8 -0
  180. package/src/__tests__/secure-keys.test.ts +50 -4
  181. package/src/__tests__/send-endpoint-busy.test.ts +167 -3
  182. package/src/__tests__/server-history-render.test.ts +91 -1
  183. package/src/__tests__/server-tool-pairing.test.ts +107 -0
  184. package/src/__tests__/settings-routes.test.ts +50 -1
  185. package/src/__tests__/skill-script-runner-sandbox.test.ts +32 -0
  186. package/src/__tests__/skills.test.ts +5 -4
  187. package/src/__tests__/steer-on-enqueue-question.test.ts +265 -34
  188. package/src/__tests__/subagent-fork-notifications.test.ts +1 -2
  189. package/src/__tests__/subagent-manager-notify.test.ts +1 -2
  190. package/src/__tests__/subagent-notify-parent.test.ts +146 -39
  191. package/src/__tests__/subagent-notify-stale-rebuild.test.ts +2 -4
  192. package/src/__tests__/subagent-tool-gate-mode.test.ts +226 -0
  193. package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +2 -0
  194. package/src/__tests__/terminal-tools.test.ts +8 -0
  195. package/src/__tests__/thread-backfill.test.ts +53 -0
  196. package/src/__tests__/tool-preview-lifecycle.test.ts +2 -0
  197. package/src/__tests__/tool-result-follow-up.test.ts +99 -0
  198. package/src/__tests__/tool-result-metadata-plumbing.test.ts +66 -1
  199. package/src/__tests__/tool-start-timestamp.test.ts +2 -0
  200. package/src/__tests__/twilio-routes.test.ts +1 -0
  201. package/src/__tests__/unicode.test.ts +36 -0
  202. package/src/__tests__/web-search-backend-failure.test.ts +1 -1
  203. package/src/activation/progress-store.test.ts +12 -7
  204. package/src/agent/loop.ts +136 -53
  205. package/src/agent/tool-result-follow-up.ts +70 -0
  206. package/src/api/attachment-provenance.test.ts +68 -0
  207. package/src/api/computer-use-tool.test.ts +55 -0
  208. package/src/api/computer-use-tool.ts +27 -0
  209. package/src/api/events/assistant-outbound-attachment.ts +3 -0
  210. package/src/api/events/assistant-turn-start.ts +3 -0
  211. package/src/api/events/desktop-activity-changed.ts +10 -0
  212. package/src/api/events/generation-handoff.ts +2 -0
  213. package/src/api/events/message-complete.ts +2 -0
  214. package/src/api/events/notification-conversation-created.ts +14 -16
  215. package/src/api/events/notification-intent.ts +4 -2
  216. package/src/api/events/question-request.ts +1 -0
  217. package/src/api/events/tool-result.ts +85 -0
  218. package/src/api/events/tool-use-start.ts +3 -0
  219. package/src/api/events/user-message-echo.ts +3 -0
  220. package/src/api/index.ts +42 -6
  221. package/src/api/mode-session.test.ts +131 -0
  222. package/src/api/mode-session.ts +148 -0
  223. package/src/api/remember-tool.ts +15 -0
  224. package/src/api/responses/conversation-message.ts +9 -0
  225. package/src/approvals/AGENTS.md +4 -2
  226. package/src/approvals/approval-primitive.ts +5 -2
  227. package/src/approvals/scoped-approval-grants.ts +6 -2
  228. package/src/browser/__tests__/operations.test.ts +29 -0
  229. package/src/browser/operation-meta.ts +2 -1
  230. package/src/browser/operations.ts +29 -0
  231. package/src/browser/virtual-desktop-target.ts +2 -9
  232. package/src/bundler/bundle-signer.ts +1 -3
  233. package/src/calls/__tests__/barge-in-guard.test.ts +3 -0
  234. package/src/calls/__tests__/call-controller.test.ts +94 -0
  235. package/src/calls/__tests__/call-funnel-telemetry.test.ts +204 -0
  236. package/src/calls/__tests__/voice-control-protocol.test.ts +15 -0
  237. package/src/calls/__tests__/voice-escalation-judge.test.ts +209 -0
  238. package/src/calls/__tests__/voice-leg-coordinator.test.ts +168 -0
  239. package/src/{live-voice/__tests__/live-voice-metrics.test.ts → calls/__tests__/voice-metrics.test.ts} +32 -38
  240. package/src/calls/__tests__/voice-session-bridge.test.ts +576 -122
  241. package/src/calls/barge-in-guard.ts +5 -0
  242. package/src/calls/call-controller.ts +196 -1
  243. package/src/calls/call-domain.ts +4 -0
  244. package/src/calls/call-store.ts +87 -2
  245. package/src/calls/guardian-action-sweep.ts +22 -8
  246. package/src/calls/media-stream-audio-transcode.ts +1 -3
  247. package/src/calls/typesafe-noul.ts +156 -0
  248. package/src/calls/voice-control-protocol.ts +6 -0
  249. package/src/calls/voice-escalation-judge.ts +145 -0
  250. package/src/calls/voice-escalation-target.ts +10 -0
  251. package/src/calls/voice-leg-coordinator.ts +121 -3
  252. package/src/{live-voice/live-voice-metrics.ts → calls/voice-metrics.ts} +94 -87
  253. package/src/calls/voice-session-bridge.ts +256 -112
  254. package/src/calls/voice-triage-escalate.ts +7 -0
  255. package/src/cli/__tests__/roadmap-cli.test.ts +4 -41
  256. package/src/cli/commands/__tests__/cli-test-harness.ts +21 -3
  257. package/src/cli/commands/__tests__/notifications.test.ts +35 -10
  258. package/src/cli/commands/__tests__/plugins.test.ts +20 -1
  259. package/src/cli/commands/__tests__/schedules.test.ts +14 -0
  260. package/src/cli/commands/bash.help.ts +4 -3
  261. package/src/cli/commands/browser.help.ts +9 -6
  262. package/src/cli/commands/browser.ts +0 -1
  263. package/src/cli/commands/channel-verification-sessions.help.ts +12 -2
  264. package/src/cli/commands/clients.help.ts +46 -0
  265. package/src/cli/commands/clients.ts +116 -0
  266. package/src/cli/commands/credentials.help.ts +9 -4
  267. package/src/cli/commands/notifications.help.ts +16 -2
  268. package/src/cli/commands/notifications.ts +30 -8
  269. package/src/cli/commands/oauth/index.help.ts +10 -0
  270. package/src/cli/commands/oauth/providers.ts +12 -0
  271. package/src/cli/commands/oauth/request.test.ts +179 -2
  272. package/src/cli/commands/oauth/request.ts +41 -10
  273. package/src/cli/commands/plugins.ts +12 -5
  274. package/src/cli/commands/roadmap.help.ts +18 -21
  275. package/src/cli/commands/roadmap.ts +4 -21
  276. package/src/cli/commands/schedules.ts +2 -0
  277. package/src/cli/lib/__tests__/inspect-plugin.test.ts +54 -0
  278. package/src/cli/lib/__tests__/install-from-github.test.ts +41 -0
  279. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +5 -2
  280. package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +133 -51
  281. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +8 -2
  282. package/src/cli/lib/bundled-marketplace.json +906 -1
  283. package/src/cli/lib/bundled-plugin-packages.json +783 -1
  284. package/src/cli/lib/inspect-plugin.ts +11 -4
  285. package/src/cli/lib/plugin-marketplace.ts +8 -0
  286. package/src/cli/lib/publish-plugin.ts +1 -2
  287. package/src/cli/lib/upgrade-plugin.ts +19 -11
  288. package/src/cli/output.ts +18 -4
  289. package/src/config/__tests__/default-provider.test.ts +6 -0
  290. package/src/config/__tests__/memory-retrospective-schema.test.ts +14 -1
  291. package/src/config/bundled-skills/computer-use/SKILL.md +1 -1
  292. package/src/config/bundled-skills/computer-use/TOOLS.json +89 -1
  293. package/src/config/bundled-skills/image-studio/SKILL.md +17 -2
  294. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +7 -11
  295. package/src/config/bundled-skills/schedule/SKILL.md +6 -6
  296. package/src/config/bundled-skills/sequences/TOOLS.json +1 -5
  297. package/src/config/call-site-defaults.ts +9 -0
  298. package/src/config/feature-flag-registry.json +24 -8
  299. package/src/config/loader.ts +9 -17
  300. package/src/config/platform-identity.ts +8 -8
  301. package/src/config/profile-text-generation.test.ts +51 -0
  302. package/src/config/profile-text-generation.ts +51 -0
  303. package/src/config/schemas/__tests__/memory-v3.test.ts +12 -0
  304. package/src/config/schemas/__tests__/tools.test.ts +31 -0
  305. package/src/config/schemas/call-site-catalog.ts +14 -0
  306. package/src/config/schemas/channels.ts +0 -18
  307. package/src/config/schemas/llm.ts +9 -2
  308. package/src/config/schemas/mcp.ts +6 -1
  309. package/src/config/schemas/memory-retrospective.ts +11 -2
  310. package/src/config/schemas/memory-v3.ts +12 -0
  311. package/src/config/schemas/services.ts +15 -6
  312. package/src/config/schemas/tools.ts +10 -0
  313. package/src/config/session-groups-gate.ts +21 -0
  314. package/src/config/sidebar-done-gate.ts +27 -0
  315. package/src/config/skills.ts +2 -6
  316. package/src/conversations/__tests__/message-consolidation.test.ts +149 -0
  317. package/src/conversations/message-consolidation.ts +102 -5
  318. package/src/credential-execution/ces-connect.test.ts +69 -0
  319. package/src/credential-execution/ces-connect.ts +115 -0
  320. package/src/credential-execution/ces-runtime.ts +55 -93
  321. package/src/credential-execution/executable-discovery.ts +34 -142
  322. package/src/credential-execution/process-manager.test.ts +20 -24
  323. package/src/credential-execution/process-manager.ts +24 -19
  324. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +10 -1
  325. package/src/daemon/__tests__/conversation-tool-setup.test.ts +43 -0
  326. package/src/daemon/__tests__/inference-profile-notification.test.ts +2 -0
  327. package/src/daemon/__tests__/turn-tail-deleted-conversation.test.ts +36 -0
  328. package/src/daemon/assistant-attachments.ts +20 -12
  329. package/src/daemon/browser-mode-session.test.ts +402 -0
  330. package/src/daemon/browser-mode-session.ts +186 -0
  331. package/src/daemon/chat-credential-redaction.ts +16 -1
  332. package/src/daemon/computer-use-mode-session.test.ts +210 -0
  333. package/src/daemon/computer-use-mode-session.ts +105 -0
  334. package/src/daemon/config-watcher.ts +10 -0
  335. package/src/daemon/conversation-agent-loop-handlers.ts +132 -13
  336. package/src/daemon/conversation-agent-loop.ts +231 -25
  337. package/src/daemon/conversation-attachments.ts +93 -12
  338. package/src/daemon/conversation-evictor.ts +5 -24
  339. package/src/daemon/conversation-history.ts +10 -0
  340. package/src/daemon/conversation-interrupt-repair.ts +4 -43
  341. package/src/daemon/conversation-interrupt.ts +7 -11
  342. package/src/daemon/conversation-messaging.ts +58 -5
  343. package/src/daemon/conversation-mode-session.test.ts +1667 -0
  344. package/src/daemon/conversation-mode-session.ts +1008 -0
  345. package/src/daemon/conversation-process.ts +5 -0
  346. package/src/daemon/conversation-runtime-assembly.ts +10 -20
  347. package/src/daemon/conversation-skill-tools.ts +1 -0
  348. package/src/daemon/conversation-store.ts +4 -4
  349. package/src/daemon/conversation-surface-snapshots.ts +135 -0
  350. package/src/daemon/conversation-surfaces.ts +113 -5
  351. package/src/daemon/conversation-tool-setup.ts +79 -6
  352. package/src/daemon/conversation-turn-finalize.ts +38 -13
  353. package/src/daemon/conversation.ts +215 -58
  354. package/src/daemon/daemon-control.ts +3 -7
  355. package/src/daemon/handlers/__tests__/conversation-history-search.test.ts +61 -0
  356. package/src/daemon/handlers/config-channels.ts +3 -1
  357. package/src/daemon/handlers/config-model.ts +7 -5
  358. package/src/daemon/handlers/conversation-history.ts +11 -1
  359. package/src/daemon/handlers/conversations.ts +118 -10
  360. package/src/daemon/handlers/shared.ts +55 -16
  361. package/src/daemon/host-cu-proxy.ts +51 -22
  362. package/src/daemon/lifecycle.ts +30 -13
  363. package/src/daemon/mcp-reload-service.ts +1 -1
  364. package/src/daemon/message-protocol.ts +0 -1
  365. package/src/daemon/message-provenance.ts +28 -4
  366. package/src/daemon/message-types/shared.ts +1 -0
  367. package/src/daemon/mode-session-startup-recovery.ts +23 -0
  368. package/src/daemon/mode-session-tracking.ts +54 -0
  369. package/src/daemon/orphan-reaper.ts +4 -3
  370. package/src/daemon/persist-media-references.ts +20 -3
  371. package/src/daemon/process-message.ts +13 -4
  372. package/src/daemon/tool-setup-types.ts +6 -0
  373. package/src/daemon/virtual-desktop-context.ts +21 -0
  374. package/src/daemon/wake-conversation-ops.ts +50 -15
  375. package/src/desktop/__tests__/fake-desktop.ts +1 -0
  376. package/src/desktop/desktop-accessibility-script.ts +88 -0
  377. package/src/desktop/desktop-accessibility.test.ts +160 -0
  378. package/src/desktop/desktop-accessibility.ts +169 -0
  379. package/src/desktop/desktop-automation-lease.test.ts +302 -64
  380. package/src/desktop/desktop-automation-lease.ts +129 -54
  381. package/src/desktop/desktop-browser-endpoint.ts +5 -0
  382. package/src/desktop/desktop-computer-use-routing.test.ts +330 -0
  383. package/src/desktop/desktop-computer-use.test.ts +449 -0
  384. package/src/desktop/desktop-computer-use.ts +502 -0
  385. package/src/desktop/desktop-dependencies.ts +47 -293
  386. package/src/desktop/desktop-display.ts +2 -2
  387. package/src/desktop/desktop-help.ts +15 -0
  388. package/src/desktop/desktop-panel-config.test.ts +13 -3
  389. package/src/desktop/desktop-panel-config.ts +109 -15
  390. package/src/desktop/desktop-session-manager.test.ts +69 -21
  391. package/src/desktop/desktop-session-manager.ts +76 -22
  392. package/src/desktop/desktop-stream-bridge.test.ts +76 -132
  393. package/src/desktop/desktop-stream-bridge.ts +9 -11
  394. package/src/desktop/desktop-wallpaper-renderer.ts +132 -0
  395. package/src/desktop/desktop-wallpaper-worker.ts +17 -0
  396. package/src/desktop/desktop-wallpaper.test.ts +48 -7
  397. package/src/desktop/desktop-wallpaper.ts +34 -102
  398. package/src/desktop/desktop-window-theme.ts +5 -25
  399. package/src/desktop/virtual-desktop-feature.ts +53 -3
  400. package/src/desktop/virtual-desktop-platform.test.ts +5 -9
  401. package/src/documents/document-store.ts +23 -0
  402. package/src/heartbeat/__tests__/heartbeat-service.test.ts +22 -26
  403. package/src/heartbeat/heartbeat-service.ts +5 -33
  404. package/src/ipc/__tests__/browser-ipc.test.ts +215 -6
  405. package/src/ipc/assistant-server.ts +2 -0
  406. package/src/ipc/routes/__tests__/channel-reply-ipc-routes.test.ts +111 -0
  407. package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +49 -1
  408. package/src/ipc/routes/channel-reply-ipc-routes.ts +73 -0
  409. package/src/ipc/routes/conversation-sync-ipc-routes.ts +38 -2
  410. package/src/live-voice/__tests__/continuation-judge.test.ts +151 -0
  411. package/src/live-voice/__tests__/live-activity-reporter.test.ts +154 -15
  412. package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +743 -31
  413. package/src/live-voice/__tests__/live-voice-look-follow-up.test.ts +191 -10
  414. package/src/live-voice/__tests__/live-voice-session-groups-gate.test.ts +87 -0
  415. package/src/live-voice/__tests__/live-voice-session-manager.test.ts +5 -1
  416. package/src/live-voice/__tests__/live-voice-sight-frame-echo.test.ts +41 -0
  417. package/src/live-voice/__tests__/live-voice-sight-frame.test.ts +1017 -9
  418. package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +224 -1
  419. package/src/live-voice/__tests__/live-voice-tts-session.test.ts +101 -0
  420. package/src/live-voice/__tests__/live-voice-tts.test.ts +44 -0
  421. package/src/live-voice/__tests__/live-voice-vad.test.ts +939 -75
  422. package/src/live-voice/__tests__/microphone-idle-gate.test.ts +87 -0
  423. package/src/live-voice/__tests__/session-controls.test.ts +23 -0
  424. package/src/live-voice/__tests__/task-outcomes.test.ts +117 -0
  425. package/src/live-voice/__tests__/voice-input-diagnostics.test.ts +117 -0
  426. package/src/live-voice/camera-mode-session.test.ts +265 -0
  427. package/src/live-voice/camera-mode-session.ts +277 -0
  428. package/src/live-voice/continuation-judge.ts +123 -0
  429. package/src/live-voice/live-activity-reporter.ts +115 -6
  430. package/src/live-voice/live-voice-manager.ts +36 -1
  431. package/src/live-voice/live-voice-photo.ts +88 -7
  432. package/src/live-voice/live-voice-session-manager.ts +15 -0
  433. package/src/live-voice/live-voice-session.ts +1443 -747
  434. package/src/live-voice/live-voice-tts.ts +22 -4
  435. package/src/live-voice/microphone-idle-gate.ts +56 -0
  436. package/src/live-voice/protocol.ts +171 -4
  437. package/src/live-voice/session-controls.ts +11 -3
  438. package/src/live-voice/task-outcomes.ts +131 -0
  439. package/src/live-voice/voice-input-diagnostics.ts +117 -0
  440. package/src/mcp/__tests__/manager-tool-caps.test.ts +156 -0
  441. package/src/mcp/__tests__/startup.test.ts +30 -7
  442. package/src/mcp/__tests__/tool-caps.test.ts +134 -0
  443. package/src/mcp/manager.ts +171 -101
  444. package/src/mcp/startup.ts +33 -13
  445. package/src/mcp/tool-caps.ts +184 -0
  446. package/src/media/__tests__/image-models.test.ts +58 -0
  447. package/src/media/image-credentials.ts +5 -0
  448. package/src/media/image-models.ts +52 -0
  449. package/src/media/image-service.ts +8 -0
  450. package/src/media/openrouter-image-service.test.ts +133 -0
  451. package/src/media/openrouter-image-service.ts +153 -0
  452. package/src/media/types.ts +1 -1
  453. package/src/messaging/provider-message-metadata.ts +3 -3
  454. package/src/messaging/providers/__tests__/transport-dispatch.test.ts +65 -11
  455. package/src/messaging/providers/discord/send.ts +4 -17
  456. package/src/messaging/providers/discord/transport.ts +2 -2
  457. package/src/messaging/providers/outlook/client.ts +16 -22
  458. package/src/messaging/providers/telegram-bot/send.test.ts +236 -1
  459. package/src/messaging/providers/telegram-bot/send.ts +10 -7
  460. package/src/messaging/providers/telegram-bot/transport.ts +3 -10
  461. package/src/messaging/providers/whatsapp/send.test.ts +169 -4
  462. package/src/monitoring/__tests__/control.test.ts +17 -5
  463. package/src/monitoring/control.ts +15 -5
  464. package/src/notifications/AGENTS.md +1 -1
  465. package/src/notifications/README.md +83 -99
  466. package/src/notifications/__tests__/broadcaster.test.ts +1 -1
  467. package/src/notifications/__tests__/channel-allowlist.test.ts +39 -0
  468. package/src/notifications/__tests__/copy-composer.test.ts +71 -1
  469. package/src/notifications/__tests__/decision-engine.test.ts +79 -2
  470. package/src/notifications/__tests__/deterministic-checks.test.ts +10 -10
  471. package/src/notifications/__tests__/home-feed-side-effect.test.ts +93 -4
  472. package/src/notifications/__tests__/notification-utils.test.ts +18 -0
  473. package/src/notifications/adapters/macos.ts +37 -46
  474. package/src/notifications/broadcaster.ts +5 -6
  475. package/src/notifications/channel-allowlist.ts +44 -0
  476. package/src/notifications/copy-composer.ts +11 -26
  477. package/src/notifications/decision-engine.ts +24 -14
  478. package/src/notifications/deterministic-checks.ts +1 -1
  479. package/src/notifications/emit-signal.ts +123 -37
  480. package/src/notifications/home-feed-side-effect.ts +9 -7
  481. package/src/notifications/notification-utils.ts +19 -0
  482. package/src/notifications/schedule-result-producer.ts +4 -6
  483. package/src/notifications/signal.ts +4 -19
  484. package/src/notifications/types.ts +15 -0
  485. package/src/oauth/AGENTS.md +2 -0
  486. package/src/oauth/__tests__/identity-verifier.test.ts +36 -1
  487. package/src/oauth/connection-resolver.ts +1 -2
  488. package/src/oauth/identity-verifier.ts +24 -0
  489. package/src/oauth/oauth-store.ts +12 -4
  490. package/src/oauth/provider-serializer.ts +8 -0
  491. package/src/oauth/seed-providers.ts +42 -0
  492. package/src/onboarding/onboarding-events-store.ts +99 -12
  493. package/src/permissions/confirmation-guardian-request.test.ts +16 -0
  494. package/src/permissions/confirmation-guardian-request.ts +2 -3
  495. package/src/permissions/question-prompter.test.ts +31 -0
  496. package/src/permissions/question-prompter.ts +16 -4
  497. package/src/persistence/__tests__/client-connection-events-store.test.ts +322 -0
  498. package/src/persistence/attachments-store.ts +84 -44
  499. package/src/persistence/client-connection-events-store.ts +377 -0
  500. package/src/persistence/conversation-crud.ts +280 -29
  501. package/src/persistence/conversation-mode-sessions.test.ts +424 -0
  502. package/src/persistence/conversation-mode-sessions.ts +460 -0
  503. package/src/persistence/conversation-plugin-facade.ts +30 -0
  504. package/src/persistence/conversation-queries.ts +54 -22
  505. package/src/persistence/conversation-tool-surface.ts +135 -0
  506. package/src/persistence/conversation-types.test.ts +32 -0
  507. package/src/persistence/conversation-types.ts +26 -4
  508. package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +157 -32
  509. package/src/persistence/embeddings/embedding-backend-shutdown.test.ts +47 -0
  510. package/src/persistence/embeddings/embedding-backend.ts +23 -41
  511. package/src/persistence/embeddings/embedding-gemini.test.ts +17 -0
  512. package/src/persistence/embeddings/embedding-gemini.ts +3 -1
  513. package/src/persistence/embeddings/embedding-local.ts +72 -17
  514. package/src/persistence/embeddings/embedding-types.ts +0 -19
  515. package/src/persistence/llm-usage-store.ts +3 -9
  516. package/src/persistence/message-metadata.ts +25 -0
  517. package/src/persistence/migrations/378-create-conversation-tool-surfaces.test.ts +78 -0
  518. package/src/persistence/migrations/378-create-conversation-tool-surfaces.ts +29 -0
  519. package/src/persistence/migrations/379-oauth-providers-response-ok-field.test.ts +92 -0
  520. package/src/persistence/migrations/379-oauth-providers-response-ok-field.ts +32 -0
  521. package/src/persistence/migrations/380-conversation-tool-surfaces-delegate-independent-tasks.test.ts +90 -0
  522. package/src/persistence/migrations/380-conversation-tool-surfaces-delegate-independent-tasks.ts +34 -0
  523. package/src/persistence/migrations/381-create-conversation-mode-sessions.ts +41 -0
  524. package/src/persistence/migrations/382-create-client-connection-events.ts +40 -0
  525. package/src/persistence/migrations/__tests__/382-create-client-connection-events.test.ts +56 -0
  526. package/src/persistence/schema/conversation-tool-surfaces.ts +32 -0
  527. package/src/persistence/schema/conversations.ts +67 -0
  528. package/src/persistence/schema/index.ts +1 -0
  529. package/src/persistence/schema/infrastructure.ts +29 -0
  530. package/src/persistence/schema/oauth.ts +1 -0
  531. package/src/persistence/steps.ts +41 -3
  532. package/src/plugin-api/__tests__/plugin-name-env.test.ts +249 -0
  533. package/src/plugin-api/conversation-turn.ts +31 -7
  534. package/src/plugin-api/effective-context-window.ts +33 -0
  535. package/src/plugin-api/index.ts +35 -6
  536. package/src/plugin-api/plugin-channel-turn-trust.test.ts +133 -0
  537. package/src/plugin-api/plugin-channel-turn-trust.ts +71 -0
  538. package/src/plugin-api/plugin-name-env.ts +125 -0
  539. package/src/plugin-api/resolve-credential.ts +79 -20
  540. package/src/plugin-api/vision-support.test.ts +22 -0
  541. package/src/plugin-api/vision-support.ts +17 -5
  542. package/src/plugins/__tests__/active-plugin-env.test.ts +136 -0
  543. package/src/plugins/active-plugin-env.ts +51 -0
  544. package/src/plugins/defaults/index.ts +24 -0
  545. package/src/plugins/defaults/memory/AGENTS.md +39 -5
  546. package/src/plugins/defaults/memory/__tests__/archive-removal-framing.test.ts +64 -0
  547. package/src/plugins/defaults/memory/__tests__/buffer-file.test.ts +365 -0
  548. package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +43 -0
  549. package/src/plugins/defaults/memory/__tests__/conversation-memory-purge.test.ts +1 -0
  550. package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +2 -0
  551. package/src/plugins/defaults/memory/__tests__/fixtures/buffer-appender.ts +17 -0
  552. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +74 -0
  553. package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +2 -0
  554. package/src/plugins/defaults/memory/__tests__/memory-run-evidence.test.ts +161 -0
  555. package/src/plugins/defaults/memory/__tests__/relocated-memory-test-rows.ts +10 -0
  556. package/src/plugins/defaults/memory/__tests__/worker-control.test.ts +19 -6
  557. package/src/plugins/defaults/memory/buffer-file.ts +354 -0
  558. package/src/plugins/defaults/memory/buffer-format.ts +40 -0
  559. package/src/plugins/defaults/memory/context-search/agent-protocol.ts +9 -12
  560. package/src/plugins/defaults/memory/context-search/agent-runner.ts +77 -22
  561. package/src/plugins/defaults/memory/context-search/format.ts +53 -8
  562. package/src/plugins/defaults/memory/context-search/limits.ts +10 -12
  563. package/src/plugins/defaults/memory/context-search/recall-input.ts +38 -0
  564. package/src/plugins/defaults/memory/context-search/search.ts +8 -14
  565. package/src/plugins/defaults/memory/context-search/sources/conversations.ts +1 -0
  566. package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -1
  567. package/src/plugins/defaults/memory/context-search/sources/workspace.ts +2 -1
  568. package/src/plugins/defaults/memory/context-search/types.ts +1 -11
  569. package/src/plugins/defaults/memory/conversation-memory-purge.ts +4 -0
  570. package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +11 -4
  571. package/src/plugins/defaults/memory/graph/capability-seed.ts +1 -2
  572. package/src/plugins/defaults/memory/graph/tool-handlers.ts +13 -63
  573. package/src/plugins/defaults/memory/graph/tools.ts +35 -64
  574. package/src/plugins/defaults/memory/host-utils.ts +0 -10
  575. package/src/plugins/defaults/memory/injectors.ts +4 -3
  576. package/src/plugins/defaults/memory/memory-retrospective-job.ts +72 -183
  577. package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +5 -0
  578. package/src/plugins/defaults/memory/memory-run-evidence.ts +213 -0
  579. package/src/plugins/defaults/memory/src/memory-eval-routes.ts +2 -3
  580. package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +6 -1
  581. package/src/plugins/defaults/memory/src/memory-item-routes.ts +2 -1
  582. package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +407 -99
  583. package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +10 -0
  584. package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +107 -7
  585. package/src/plugins/defaults/memory/substrate/consolidation-job.ts +307 -86
  586. package/src/plugins/defaults/memory/substrate/consolidation-tool-surface.ts +34 -0
  587. package/src/plugins/defaults/memory/substrate/page-index.ts +2 -1
  588. package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +91 -51
  589. package/src/plugins/defaults/memory/substrate/sweep-job.ts +1 -1
  590. package/src/plugins/defaults/memory/tools.test.ts +124 -9
  591. package/src/plugins/defaults/memory/tools.ts +38 -11
  592. package/src/plugins/defaults/memory/v1/graph/consolidation.ts +2 -2
  593. package/src/plugins/defaults/memory/v1/graph/extraction.ts +2 -1
  594. package/src/plugins/defaults/memory/v1/graph/retriever.ts +1 -1
  595. package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +5 -0
  596. package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +5 -2
  597. package/src/plugins/defaults/memory/v2/reranker.ts +2 -1
  598. package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +81 -1
  599. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +87 -0
  600. package/src/plugins/defaults/memory/v3/__tests__/plugin-schema.test.ts +12 -0
  601. package/src/plugins/defaults/memory/v3/__tests__/pool-log-store.test.ts +332 -15
  602. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +626 -27
  603. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +148 -28
  604. package/src/plugins/defaults/memory/v3/card.ts +2 -1
  605. package/src/plugins/defaults/memory/v3/injector.ts +212 -178
  606. package/src/plugins/defaults/memory/v3/orchestrate.ts +159 -32
  607. package/src/plugins/defaults/memory/v3/plugin-schema.ts +54 -4
  608. package/src/plugins/defaults/memory/v3/pool-log-store.ts +275 -37
  609. package/src/plugins/defaults/memory/v3/pool-select.test.ts +47 -5
  610. package/src/plugins/defaults/memory/v3/pool-select.ts +710 -59
  611. package/src/plugins/defaults/memory/v3/sections.ts +2 -1
  612. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +41 -14
  613. package/src/plugins/defaults/memory/worker-control.ts +15 -5
  614. package/src/plugins/defaults/task-progress/__tests__/registration.test.ts +70 -0
  615. package/src/plugins/defaults/task-progress/__tests__/task-progress-context.test.ts +380 -0
  616. package/src/plugins/defaults/task-progress/hooks/post-compact.ts +19 -0
  617. package/src/plugins/defaults/task-progress/hooks/user-prompt-submit.ts +24 -0
  618. package/src/plugins/defaults/task-progress/package.json +14 -0
  619. package/src/plugins/defaults/task-progress/src/apply-task-progress-context.ts +93 -0
  620. package/src/plugins/defaults/task-progress/src/format-task-progress-context.ts +67 -0
  621. package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +4 -1
  622. package/src/plugins/defaults/tool-result-truncate/terminal.ts +1 -46
  623. package/src/prompts/__tests__/parallel-tasks-section.test.ts +25 -0
  624. package/src/prompts/delegation-gate.ts +57 -0
  625. package/src/prompts/system-prompt.ts +14 -32
  626. package/src/providers/__tests__/context-overflow-error.test.ts +10 -0
  627. package/src/providers/__tests__/search-provider-catalog.test.ts +18 -0
  628. package/src/providers/anthropic/client.ts +10 -1
  629. package/src/providers/anthropic-gateway-shared.ts +6 -0
  630. package/src/providers/fetch-provider-catalog.ts +11 -0
  631. package/src/providers/gemini/client.ts +41 -8
  632. package/src/providers/inference/adapter-factory.ts +6 -0
  633. package/src/providers/jev/client.test.ts +270 -0
  634. package/src/providers/jev/client.ts +534 -0
  635. package/src/providers/malformed-tool-call.ts +55 -0
  636. package/src/providers/model-catalog.ts +59 -3
  637. package/src/providers/openai/__tests__/chat-completions-extra-body.test.ts +94 -1
  638. package/src/providers/openai/__tests__/chat-completions-malformed-tool-call.test.ts +105 -0
  639. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +106 -1
  640. package/src/providers/openai/__tests__/chat-template-flatten.test.ts +24 -0
  641. package/src/providers/openai/__tests__/google-thought-signature.test.ts +1 -2
  642. package/src/providers/openai/chat-completions-provider.ts +130 -29
  643. package/src/providers/openai/google-thought-signature.ts +0 -6
  644. package/src/providers/openai/responses-provider.ts +23 -1
  645. package/src/providers/platform-proxy/constants.ts +5 -0
  646. package/src/providers/ratelimit.ts +1 -3
  647. package/src/providers/retry.ts +68 -36
  648. package/src/providers/search-provider-catalog.ts +24 -0
  649. package/src/providers/server-tool-pairing.ts +16 -7
  650. package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +24 -0
  651. package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +7 -1
  652. package/src/providers/speech-to-text/__tests__/vellum-managed-realtime.test.ts +50 -1
  653. package/src/providers/speech-to-text/deepgram-flux-frames.ts +11 -0
  654. package/src/providers/speech-to-text/vellum-managed-flux-realtime.ts +13 -0
  655. package/src/providers/types.ts +5 -0
  656. package/src/providers/vellum-model-routing.test.ts +1 -0
  657. package/src/routes/control.ts +7 -5
  658. package/src/runtime/AGENTS.md +6 -4
  659. package/src/runtime/__tests__/agent-wake-archived-gate.test.ts +90 -0
  660. package/src/runtime/__tests__/agent-wake.test.ts +94 -1
  661. package/src/runtime/__tests__/question-resolution.test.ts +32 -0
  662. package/src/runtime/actor-trust-resolver.ts +3 -3
  663. package/src/runtime/agent-wake.ts +41 -7
  664. package/src/runtime/approval-message-composer.ts +3 -69
  665. package/src/runtime/assistant-event-hub.ts +73 -75
  666. package/src/runtime/assistant-event-publish-options.ts +7 -0
  667. package/src/runtime/assistant-event-targeting.ts +79 -0
  668. package/src/runtime/assistant-stream-state.ts +13 -100
  669. package/src/runtime/auth/__tests__/middleware.test.ts +138 -0
  670. package/src/runtime/auth/middleware.ts +15 -11
  671. package/src/runtime/background-job-runner.ts +5 -5
  672. package/src/runtime/channel-retry-sweep.ts +1 -0
  673. package/src/runtime/guardian-action-message-composer.ts +8 -161
  674. package/src/runtime/guardian-action-service.ts +2 -17
  675. package/src/runtime/guardian-reply-router.ts +29 -40
  676. package/src/runtime/http-server.ts +2 -2
  677. package/src/runtime/http-types.ts +6 -0
  678. package/src/runtime/message-composer-types.ts +3 -61
  679. package/src/runtime/middleware/auth.ts +7 -1
  680. package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +67 -1
  681. package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +89 -0
  682. package/src/runtime/migrations/vbundle-builder.ts +24 -1
  683. package/src/runtime/migrations/vbundle-import-analyzer.ts +13 -4
  684. package/src/runtime/migrations/vbundle-import-policy.ts +43 -11
  685. package/src/runtime/migrations/vbundle-importer.ts +4 -1
  686. package/src/runtime/migrations/vbundle-streaming-importer.ts +4 -1
  687. package/src/runtime/migrations/vbundle-validator.ts +1 -0
  688. package/src/runtime/pending-interactions-mode-session.test.ts +62 -0
  689. package/src/runtime/pending-interactions.ts +37 -8
  690. package/src/runtime/question-resolution.ts +54 -8
  691. package/src/runtime/routes/__tests__/client-history-routes.test.ts +104 -0
  692. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +146 -0
  693. package/src/runtime/routes/__tests__/global-search-routes.test.ts +74 -1
  694. package/src/runtime/routes/__tests__/image-generation-routes.test.ts +97 -0
  695. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +24 -2
  696. package/src/runtime/routes/__tests__/roadmap-routes.test.ts +29 -6
  697. package/src/runtime/routes/browser-context.ts +31 -11
  698. package/src/runtime/routes/browser-routes.ts +43 -4
  699. package/src/runtime/routes/btw-routes.ts +9 -4
  700. package/src/runtime/routes/channel-route-shared.ts +1 -9
  701. package/src/runtime/routes/client-routes.ts +108 -0
  702. package/src/runtime/routes/conversation-list-routes.ts +16 -14
  703. package/src/runtime/routes/conversation-management-routes.ts +4 -1
  704. package/src/runtime/routes/conversation-query-routes.ts +4 -0
  705. package/src/runtime/routes/conversation-routes.ts +125 -14
  706. package/src/runtime/routes/credential-prompt-routes.ts +4 -3
  707. package/src/runtime/routes/credential-routes.ts +1 -2
  708. package/src/runtime/routes/desktop-setup-routes.test.ts +9 -18
  709. package/src/runtime/routes/desktop-setup-routes.ts +8 -7
  710. package/src/runtime/routes/documents-routes.ts +51 -0
  711. package/src/runtime/routes/email-routes.ts +3 -7
  712. package/src/runtime/routes/events-routes.ts +75 -54
  713. package/src/runtime/routes/global-search-routes.ts +22 -7
  714. package/src/runtime/routes/guardian-approval-interception.ts +24 -0
  715. package/src/runtime/routes/identity-routes.ts +1 -5
  716. package/src/runtime/routes/image-generation-routes.ts +8 -14
  717. package/src/runtime/routes/inbound-message-handler.ts +37 -41
  718. package/src/runtime/routes/inbound-stages/backfill-sender-provenance.test.ts +168 -0
  719. package/src/runtime/routes/inbound-stages/backfill-sender-provenance.ts +96 -0
  720. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +39 -10
  721. package/src/runtime/routes/inbound-stages/background-dispatch.ts +9 -9
  722. package/src/runtime/routes/inbound-stages/reaction-intercept.ts +2 -0
  723. package/src/runtime/routes/inference-profile-session-handler.ts +11 -1
  724. package/src/runtime/routes/inference-profiles-routes.ts +9 -0
  725. package/src/runtime/routes/llm-context-normalization.ts +1 -7
  726. package/src/runtime/routes/migration-routes.ts +73 -2
  727. package/src/runtime/routes/notification-routes.ts +10 -0
  728. package/src/runtime/routes/oauth-commands-routes.ts +57 -54
  729. package/src/runtime/routes/oauth-providers.ts +11 -0
  730. package/src/runtime/routes/oauth-request-hints.test.ts +246 -0
  731. package/src/runtime/routes/oauth-request-hints.ts +149 -0
  732. package/src/runtime/routes/plugins-routes.ts +6 -0
  733. package/src/runtime/routes/roadmap-routes.ts +47 -8
  734. package/src/runtime/routes/schedule-routes.ts +2 -0
  735. package/src/runtime/routes/secret-routes.ts +99 -119
  736. package/src/runtime/routes/settings-routes.ts +10 -4
  737. package/src/runtime/routes/watcher-routes.ts +1 -3
  738. package/src/runtime/sync/documents-sidecar-publish.test.ts +50 -4
  739. package/src/runtime/sync/resource-sync-events.ts +11 -0
  740. package/src/runtime/sync/worker-daemon-notify.test.ts +30 -0
  741. package/src/runtime/sync/worker-daemon-notify.ts +44 -0
  742. package/src/runtime/trust-class.test.ts +7 -6
  743. package/src/runtime/trust-class.ts +9 -17
  744. package/src/runtime/verification-outbound-actions.ts +2 -2
  745. package/src/schedule/__tests__/worker-control.test.ts +36 -5
  746. package/src/schedule/__tests__/worker-mcp-bootstrap.test.ts +107 -0
  747. package/src/schedule/__tests__/worker-mcp-readiness.test.ts +173 -0
  748. package/src/schedule/__tests__/worker-mcp-tools.test.ts +13 -47
  749. package/src/schedule/run-script.ts +2 -2
  750. package/src/schedule/scheduler.ts +47 -11
  751. package/src/schedule/tool-surface-readiness.ts +65 -0
  752. package/src/schedule/worker-control.ts +15 -5
  753. package/src/schedule/worker-mcp.ts +85 -0
  754. package/src/schedule/worker.ts +9 -31
  755. package/src/security/secure-keys.ts +74 -112
  756. package/src/skills/clawhub.ts +3 -8
  757. package/src/skills/managed-store.ts +1 -5
  758. package/src/stt/types.ts +4 -0
  759. package/src/subagent/notify.ts +54 -34
  760. package/src/subagent/parent-notification.ts +6 -0
  761. package/src/telemetry/__tests__/phone-call-funnel.test.ts +72 -0
  762. package/src/telemetry/phone-call-funnel.ts +144 -0
  763. package/src/tools/__tests__/tool-schema-root-combinator-guard.test.ts +81 -0
  764. package/src/tools/ask-question/ask-question-tool.test.ts +205 -5
  765. package/src/tools/ask-question/ask-question-tool.ts +131 -22
  766. package/src/tools/browser/browser-execution.ts +29 -60
  767. package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +561 -39
  768. package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +435 -39
  769. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +1 -8
  770. package/src/tools/client-os.ts +15 -0
  771. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -1
  772. package/src/tools/computer-use/target.ts +42 -0
  773. package/src/tools/document/document-tool.ts +13 -18
  774. package/src/tools/execution-target.ts +14 -16
  775. package/src/tools/host-terminal/host-shell.ts +16 -7
  776. package/src/tools/network/__tests__/web-fetch-tinyfish.test.ts +250 -0
  777. package/src/tools/network/__tests__/web-search.test.ts +203 -0
  778. package/src/tools/network/web-fetch.ts +274 -7
  779. package/src/tools/network/web-search.ts +468 -6
  780. package/src/tools/permission-checker.ts +3 -3
  781. package/src/tools/policy-context.ts +3 -1
  782. package/src/tools/shared/filesystem/file-ops-service.ts +1 -31
  783. package/src/tools/shared/shell-output.test.ts +10 -0
  784. package/src/tools/shared/shell-output.ts +14 -2
  785. package/src/tools/skills/load.ts +2 -1
  786. package/src/tools/skills/sandbox-runner.ts +24 -4
  787. package/src/tools/skills/scaffold-managed.ts +2 -1
  788. package/src/tools/skills/skill-script-runner.ts +7 -0
  789. package/src/tools/skills/skill-tool-factory.ts +15 -1
  790. package/src/tools/terminal/__tests__/safe-env.test.ts +44 -4
  791. package/src/tools/terminal/__tests__/sanitized-bash.test.ts +0 -14
  792. package/src/tools/terminal/safe-env.ts +39 -24
  793. package/src/tools/terminal/sanitized-bash.ts +15 -2
  794. package/src/tools/terminal/shell-launch.test.ts +162 -0
  795. package/src/tools/terminal/shell.test.ts +29 -0
  796. package/src/tools/terminal/shell.ts +15 -7
  797. package/src/tools/tool-approval-handler.ts +5 -1
  798. package/src/tools/tool-types.ts +3 -3
  799. package/src/tools/types.ts +8 -2
  800. package/src/util/__tests__/worker-process-command.test.ts +5 -4
  801. package/src/util/abort-reasons.ts +18 -26
  802. package/src/util/browser-human-verification.ts +14 -0
  803. package/src/util/canonicalize-identity.test.ts +21 -0
  804. package/src/util/canonicalize-identity.ts +16 -0
  805. package/src/util/errors.ts +13 -3
  806. package/src/util/host-process.test.ts +17 -1
  807. package/src/util/host-process.ts +24 -0
  808. package/src/util/provider-error-patterns.ts +3 -0
  809. package/src/util/unicode.ts +29 -0
  810. package/src/util/worker-pipe.test.ts +100 -0
  811. package/src/util/worker-pipe.ts +44 -0
  812. package/src/util/worker-process.ts +77 -35
  813. package/src/workspace/migrations/157-add-desktop-files-launcher.ts +94 -0
  814. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +4 -10
  815. package/src/workspace/migrations/__tests__/157-add-desktop-files-launcher.test.ts +113 -0
  816. package/src/workspace/migrations/registry.ts +2 -0
  817. package/src/__tests__/computer-use-window-schema.test.ts +0 -24
  818. package/src/api/events/heartbeat-alert.ts +0 -20
  819. package/src/daemon/message-types/web-activity.ts +0 -65
  820. package/src/desktop/desktop-dependencies.test.ts +0 -131
  821. package/src/tools/computer-use/definitions.ts +0 -607
@@ -219,15 +219,15 @@ describe("roadmap writes", () => {
219
219
  });
220
220
  });
221
221
 
222
- test("update sends only the fields that were passed", async () => {
222
+ test("update forwards only the title and description it was given", async () => {
223
223
  nextResult = ITEM;
224
224
 
225
225
  await runAssistantCommandFull(
226
226
  "roadmap",
227
227
  "update",
228
228
  "dark-mode",
229
- "--status",
230
- "planned",
229
+ "--description",
230
+ "Follow the OS setting",
231
231
  );
232
232
 
233
233
  expect(calls[0]).toEqual({
@@ -236,49 +236,12 @@ describe("roadmap writes", () => {
236
236
  pathParams: { slug: "dark-mode" },
237
237
  body: {
238
238
  title: undefined,
239
- description: undefined,
240
- status: "planned",
241
- tags: undefined,
239
+ description: "Follow the OS setting",
242
240
  },
243
241
  },
244
242
  });
245
243
  });
246
244
 
247
- test("--clear-tags sends the empty set that --tag cannot express", async () => {
248
- nextResult = ITEM;
249
-
250
- await runAssistantCommandFull(
251
- "roadmap",
252
- "update",
253
- "dark-mode",
254
- "--clear-tags",
255
- );
256
-
257
- expect((calls[0].params as { body: { tags: string[] } }).body.tags).toEqual(
258
- [],
259
- );
260
- });
261
-
262
- test("--clear-tags with --tag is refused rather than silently picking one", async () => {
263
- nextResult = ITEM;
264
- process.exitCode = 0;
265
-
266
- // The complaint itself goes straight to stderr, which this harness does
267
- // not capture; what matters is that no update was forwarded.
268
- await runAssistantCommandFull(
269
- "roadmap",
270
- "update",
271
- "dark-mode",
272
- "--clear-tags",
273
- "--tag",
274
- "ui",
275
- );
276
-
277
- expect(calls).toHaveLength(0);
278
- expect(process.exitCode).toBe(1);
279
- process.exitCode = 0;
280
- });
281
-
282
245
  test("delete names the item it removed", async () => {
283
246
  nextResult = { slug: "dark-mode", deleted: true };
284
247
 
@@ -6,7 +6,10 @@
6
6
  * `process.stdout.write`, `process.stderr.write`, `console.log`, and
7
7
  * `console.error` are captured for the duration of the run, so command output
8
8
  * lands in the result regardless of which sink the command writes to;
9
- * `process.exitCode` is reset afterwards.
9
+ * `process.exitCode` is reset afterwards. A write callback is honoured the
10
+ * way the real stream honours it, and `process.exit` records its code as the
11
+ * run's exit code instead of ending the test process, so a command that exits
12
+ * itself once its output has drained is observed rather than fatal.
10
13
  * The caller passes its own (possibly mock-backed) registration function, so
11
14
  * this helper imports nothing from `src/` beyond what any test file may
12
15
  * import itself (see the test-machinery isolation rules in assistant/CLAUDE.md).
@@ -34,18 +37,32 @@ export async function runCliCommand(
34
37
  const stderrChunks: string[] = [];
35
38
  const events: string[] = [];
36
39
 
37
- process.stdout.write = ((chunk: unknown) => {
40
+ const originalExit = process.exit;
41
+ const invokeCallback = (rest: unknown[]): void => {
42
+ const callback = rest.find((arg) => typeof arg === "function");
43
+ if (callback) {
44
+ (callback as () => void)();
45
+ }
46
+ };
47
+ process.stdout.write = ((chunk: unknown, ...rest: unknown[]) => {
38
48
  const text = typeof chunk === "string" ? chunk : String(chunk);
39
49
  stdoutChunks.push(text);
40
50
  events.push(text);
51
+ invokeCallback(rest);
41
52
  return true;
42
53
  }) as typeof process.stdout.write;
43
- process.stderr.write = ((chunk: unknown) => {
54
+ process.stderr.write = ((chunk: unknown, ...rest: unknown[]) => {
44
55
  const text = typeof chunk === "string" ? chunk : String(chunk);
45
56
  stderrChunks.push(text);
46
57
  events.push(text);
58
+ invokeCallback(rest);
47
59
  return true;
48
60
  }) as typeof process.stderr.write;
61
+ process.exit = ((code?: number) => {
62
+ if (code !== undefined) {
63
+ process.exitCode = code;
64
+ }
65
+ }) as typeof process.exit;
49
66
  console.log = (...logArgs: unknown[]) => {
50
67
  const text = logArgs.map(String).join(" ") + "\n";
51
68
  stdoutChunks.push(text);
@@ -75,6 +92,7 @@ export async function runCliCommand(
75
92
  } finally {
76
93
  process.stdout.write = originalStdoutWrite;
77
94
  process.stderr.write = originalStderrWrite;
95
+ process.exit = originalExit;
78
96
  console.log = originalConsoleLog;
79
97
  console.error = originalConsoleError;
80
98
  }
@@ -175,7 +175,7 @@ describe("notifications send", () => {
175
175
  "--source-channel",
176
176
  "assistant_tool",
177
177
  "--source-event-name",
178
- "user.send_notification",
178
+ "schedule.notify",
179
179
  "--message",
180
180
  "Hello",
181
181
  ]);
@@ -186,7 +186,7 @@ describe("notifications send", () => {
186
186
 
187
187
  const body = lastSendBody();
188
188
  expect(body.sourceChannel).toBe("assistant_tool");
189
- expect(body.sourceEventName).toBe("user.send_notification");
189
+ expect(body.sourceEventName).toBe("schedule.notify");
190
190
  const payload = body.contextPayload as Record<string, unknown>;
191
191
  expect(payload.requestedMessage).toBe("Hello");
192
192
  });
@@ -221,7 +221,7 @@ describe("notifications send", () => {
221
221
  "--source-channel",
222
222
  "assistant_tool",
223
223
  "--source-event-name",
224
- "user.send_notification",
224
+ "schedule.notify",
225
225
  "--message",
226
226
  "Hello",
227
227
  "--preferred-channels",
@@ -235,7 +235,7 @@ describe("notifications send", () => {
235
235
  expect(payload.preferredChannels).toEqual(["telegram", "slack"]);
236
236
  });
237
237
 
238
- test("send rejects invalid urgency", async () => {
238
+ test("send passes exclusive channel allowlist", async () => {
239
239
  const { parsed, exitCode } = await runCommand([
240
240
  "send",
241
241
  "--source-channel",
@@ -243,6 +243,31 @@ describe("notifications send", () => {
243
243
  "--source-event-name",
244
244
  "user.send_notification",
245
245
  "--message",
246
+ "Alarm",
247
+ "--channels",
248
+ "telegram",
249
+ "--urgent",
250
+ ]);
251
+
252
+ expect(exitCode).toBe(0);
253
+ expect(parsed.ok).toBe(true);
254
+ expect(parsed.selectedChannels).toEqual([]);
255
+ expect(parsed.deliveryResults).toEqual([]);
256
+ expect(parsed.receiptClass).toBe("unknown");
257
+
258
+ const payload = lastSendBody().contextPayload as Record<string, unknown>;
259
+ expect(payload.channelAllowlist).toEqual(["telegram"]);
260
+ expect(payload.preferredChannels).toBeUndefined();
261
+ });
262
+
263
+ test("send rejects invalid urgency", async () => {
264
+ const { parsed, exitCode } = await runCommand([
265
+ "send",
266
+ "--source-channel",
267
+ "assistant_tool",
268
+ "--source-event-name",
269
+ "schedule.notify",
270
+ "--message",
246
271
  "Hello",
247
272
  "--urgency",
248
273
  "invalid",
@@ -265,7 +290,7 @@ describe("notifications send", () => {
265
290
  "--source-channel",
266
291
  "water_reminder",
267
292
  "--source-event-name",
268
- "user.send_notification",
293
+ "schedule.notify",
269
294
  "--message",
270
295
  "Hello",
271
296
  ]);
@@ -300,7 +325,7 @@ describe("notifications send", () => {
300
325
  "--source-channel",
301
326
  "assistant_tool",
302
327
  "--source-event-name",
303
- "user.send_notification",
328
+ "schedule.notify",
304
329
  "--message",
305
330
  "Hi",
306
331
  "--conversation-id",
@@ -320,7 +345,7 @@ describe("notifications send", () => {
320
345
  "--source-channel",
321
346
  "assistant_tool",
322
347
  "--source-event-name",
323
- "user.send_notification",
348
+ "schedule.notify",
324
349
  "--message",
325
350
  "Hi",
326
351
  ]);
@@ -335,7 +360,7 @@ describe("notifications send", () => {
335
360
  "--source-channel",
336
361
  "assistant_tool",
337
362
  "--source-event-name",
338
- "user.send_notification",
363
+ "schedule.notify",
339
364
  "--message",
340
365
  "Hi",
341
366
  "--conversation-id",
@@ -359,7 +384,7 @@ describe("notifications send", () => {
359
384
  "--source-channel",
360
385
  "assistant_tool",
361
386
  "--source-event-name",
362
- "user.send_notification",
387
+ "schedule.notify",
363
388
  "--message",
364
389
  "Hello",
365
390
  ]);
@@ -384,7 +409,7 @@ describe("notifications send", () => {
384
409
  "--source-channel",
385
410
  "assistant_tool",
386
411
  "--source-event-name",
387
- "user.send_notification",
412
+ "schedule.notify",
388
413
  "--message",
389
414
  "Hello",
390
415
  ]);
@@ -65,6 +65,7 @@ let installPluginCalls: InstallPluginOptions[] = [];
65
65
  let platformInstallCalls: Array<{ name: string; force?: boolean }> = [];
66
66
  let upgradePluginCalls: UpgradePluginOptions[] = [];
67
67
  let catalogMatches: PluginSearchMatch[] = [];
68
+ let catalogError: Error | null = null;
68
69
 
69
70
  /**
70
71
  * Queued daemon IPC responses. The default (empty queue) is a transport
@@ -162,7 +163,12 @@ mock.module("../../lib/install-from-platform.js", () => ({
162
163
  }));
163
164
 
164
165
  mock.module("../../lib/plugin-catalog-cache.js", () => ({
165
- getPluginCatalog: async () => ({ ref: "main", matches: catalogMatches }),
166
+ getPluginCatalog: async () => {
167
+ if (catalogError) {
168
+ throw catalogError;
169
+ }
170
+ return { ref: "main", matches: catalogMatches };
171
+ },
166
172
  }));
167
173
 
168
174
  mock.module("../../lib/inspect-plugin.js", () => ({
@@ -264,6 +270,7 @@ beforeEach(() => {
264
270
  platformInstallCalls = [];
265
271
  upgradePluginCalls = [];
266
272
  catalogMatches = [];
273
+ catalogError = null;
267
274
  ipcResults = [];
268
275
  inspectResult = null;
269
276
  installTarget = null;
@@ -466,6 +473,18 @@ describe("plugins install - declared-schedules consent", () => {
466
473
  });
467
474
  expect(r.exitCode).toBe(0);
468
475
  });
476
+
477
+ test("falls back to the platform installer when catalog discovery fails", async () => {
478
+ catalogError = new Error("catalog unavailable");
479
+
480
+ const r = await runCommand(["plugins", "install", "example"]);
481
+
482
+ expect(installPluginCalls).toHaveLength(0);
483
+ expect(platformInstallCalls).toEqual([
484
+ { name: "example", force: undefined },
485
+ ]);
486
+ expect(r.exitCode).toBe(0);
487
+ });
469
488
  });
470
489
 
471
490
  describe("plugins upgrade - declared-schedules consent (local fallback)", () => {
@@ -380,6 +380,7 @@ describe("schedules get", () => {
380
380
  mode: "execute",
381
381
  status: "active",
382
382
  routingIntent: "all_channels",
383
+ quiet: false,
383
384
  reuseConversation: false,
384
385
  wakeConversationId: null,
385
386
  isOneShot: false,
@@ -436,9 +437,22 @@ describe("schedules get", () => {
436
437
  expect(output).toContain("Every 30 minutes (UTC)");
437
438
  expect(output).toContain("run heartbeat");
438
439
  expect(output).toContain("all_channels");
440
+ expect(output).toMatch(/Quiet:\s+no/);
439
441
  expect(output).toContain("conv-abc");
440
442
  });
441
443
 
444
+ test("prints Quiet: yes when the schedule suppresses completion notifications", async () => {
445
+ mockIpcResult = {
446
+ ok: true,
447
+ result: { schedule: { ...scheduleFixture, quiet: true } },
448
+ };
449
+
450
+ const { exitCode } = await runCommand(["schedules", "get", "schedule-1"]);
451
+
452
+ expect(exitCode).toBe(0);
453
+ expect(logLines.join("\n")).toMatch(/Quiet:\s+yes/);
454
+ });
455
+
442
456
  test("emits JSON result when --json is set", async () => {
443
457
  mockIpcResult = { ok: true, result: { schedule: scheduleFixture } };
444
458
 
@@ -16,9 +16,10 @@ export const bashHelp: CliCommandHelp = {
16
16
  ],
17
17
  helpText: `
18
18
  Spawns the command with the same sanitized environment, working directory,
19
- and platform shell the bash tool uses for tool-call subprocesses. Vault
20
- bearers such as CES_SERVICE_TOKEN are stripped; CES_LOCAL_SOCKET and workspace
21
- paths are forwarded. The command does not go through the assistant HTTP or IPC
19
+ and platform shell the bash tool uses for tool-call subprocesses. CES
20
+ bootstrap and workspace paths are forwarded so children can reach CES over
21
+ IPC. CES HTTP credentials are also forwarded. The command does not go through
22
+ the assistant HTTP or IPC
22
23
  API, and does not require a running assistant process.
23
24
 
24
25
  Arguments:
@@ -17,6 +17,7 @@ import type {
17
17
  BrowserOperationMeta,
18
18
  OperationField,
19
19
  } from "../../browser/types.js";
20
+ import { DESKTOP_HELP_GUIDANCE } from "../../util/browser-human-verification.js";
20
21
  import type {
21
22
  CliCommandHelp,
22
23
  CliOptionHelp,
@@ -137,11 +138,10 @@ Existing sessions and explicit backend/client choices take priority.
137
138
  not the user's Chrome. --desktop remains an alias for --virtual-desktop.
138
139
  Use --virtual-desktop for Chrome in the Desktop panel.
139
140
  Run navigate --url <url> directly to open a page.
140
- The assistant-desktop feature flag and completed installation are required.
141
- The first browser command installs missing components, starts Chrome, and completes
142
- the requested action in one call. Allow up to 600 seconds for this command when
143
- using bash (timeout_seconds: 600). Opening the Desktop panel also starts
144
- the same installation and shows progress. No separate setup command is needed.
141
+ The assistant-desktop feature flag and a desktop-enabled assistant image are required.
142
+ Chrome and desktop components are included in the image. The first browser command
143
+ starts Chrome and completes the requested action without downloading or installing
144
+ anything. Missing components require an assistant image update.
145
145
  Report other availability errors without switching to a personal computer.
146
146
  The assistant manages Chrome startup. Do not launch a separate desktop stack,
147
147
  install desktop packages, or drive webpages with shell-level xdotool.
@@ -158,7 +158,10 @@ or --use-active-tab. Download waiting is unavailable on this target.
158
158
  Users can interact directly with the expanded desktop. If they ask you to pause,
159
159
  stop and wait. Take a fresh snapshot before resuming. Closing the viewer does not
160
160
  end automation. Run assistant browser --virtual-desktop detach when finished or
161
- blocked, including before asking a question. Chrome stays running.
161
+ blocked. Chrome stays running.
162
+ For logins, use saved credentials first. Securely collect missing credentials
163
+ with assistant credentials prompt, then fill the login form yourself.
164
+ ${DESKTOP_HELP_GUIDANCE}
162
165
  Each subcommand maps to a browser operation and communicates
163
166
  with the assistant process.
164
167
 
@@ -168,7 +168,6 @@ function attachOperationAction(
168
168
  }
169
169
  }
170
170
 
171
- // First use can include virtual desktop installation and Chrome startup.
172
171
  const ipcResult = await cliIpcCall<BrowserExecuteResult>(
173
172
  "browser_execute",
174
173
  {
@@ -44,7 +44,11 @@ Examples:
44
44
  description:
45
45
  "Destination address for outbound verification (handle, phone number, user ID, or email address)",
46
46
  },
47
- { flags: "--rebind", description: "Replace existing guardian binding" },
47
+ {
48
+ flags: "--rebind",
49
+ description:
50
+ "Create a code although the channel already has a guardian (see below)",
51
+ },
48
52
  {
49
53
  flags: "--conversation-id <conversationId>",
50
54
  description: "Conversation ID for inbound challenges",
@@ -74,7 +78,13 @@ Routes between three creation modes based on the provided options:
74
78
  2. Outbound: --channel <ch> --destination <dest>
75
79
  Sends a verification code to the given destination. Supports telegram
76
80
  (handle or chat ID), phone (E.164 number), slack and discord (user ID),
77
- and email. Use --rebind to replace an existing guardian binding.
81
+ and email.
82
+
83
+ --rebind creates a code although the channel already has a guardian. On
84
+ telegram, slack, discord and email, only the account already bound can redeem
85
+ that code, which is how the same guardian verifies again. A code never moves
86
+ the guardian to a different account there: run "revoke" first, then create
87
+ without --rebind. On phone, an outbound code replaces the bound number.
78
88
 
79
89
  3. Inbound: --channel <ch> (no --destination)
80
90
  Generates a challenge secret for the guardian to send back on the
@@ -58,6 +58,7 @@ Examples:
58
58
  $ assistant clients list List all connected clients
59
59
  $ assistant clients list --json Machine-readable JSON output
60
60
  $ assistant clients list --capability host_bash Show only clients that can run host commands
61
+ $ assistant clients history Recent connection sessions and flaps
61
62
  $ assistant clients disconnect <clientId> Force-disconnect a client`,
62
63
  subcommands: [
63
64
  {
@@ -87,6 +88,51 @@ Examples:
87
88
  $ assistant clients list
88
89
  $ assistant clients list --capability host_bash
89
90
  $ assistant clients list --json | jq '.clients[0].capabilities'`,
91
+ },
92
+ {
93
+ name: "history",
94
+ description: "Show persisted client connection sessions",
95
+ options: [
96
+ {
97
+ flags: "--json",
98
+ description: "Machine-readable compact JSON output",
99
+ },
100
+ {
101
+ flags: "--client-id <id>",
102
+ description: "Restrict history to one client UUID",
103
+ },
104
+ {
105
+ flags: "--interface-id <id>",
106
+ description:
107
+ "Restrict history to one interface (e.g. chrome-extension)",
108
+ },
109
+ {
110
+ flags: "--since <when>",
111
+ description:
112
+ "ISO-8601 or epoch-ms lower bound. Sessions already open at this time are included.",
113
+ },
114
+ {
115
+ flags: "--limit <n>",
116
+ description: "Max coalesced sessions to return (1-500, default 50)",
117
+ },
118
+ ],
119
+ helpText: `
120
+ Options:
121
+ --json Output as compact JSON instead of a table.
122
+ --client-id <id> Only show history for this client UUID.
123
+ --interface-id <id> Only show history for this interface.
124
+ --since <when> Lower bound as ISO-8601 or epoch milliseconds.
125
+ Sessions already open at this time are included.
126
+ --limit <n> Max sessions after flap coalescing. Default 50.
127
+
128
+ Reconnects shorter than 60 seconds are flaps on the same session, not
129
+ separate outages. History starts when this assistant version first
130
+ records connections. It does not backfill earlier uptime.
131
+
132
+ Examples:
133
+ $ assistant clients history
134
+ $ assistant clients history --interface-id chrome-extension
135
+ $ assistant clients history --client-id client-123 --since 2026-09-01 --json`,
90
136
  },
91
137
  {
92
138
  name: "disconnect",
@@ -26,6 +26,23 @@ interface DisconnectClientResponse {
26
26
  disconnected: number;
27
27
  }
28
28
 
29
+ interface ClientHistorySessionJSON {
30
+ clientId: string;
31
+ interfaceId: string;
32
+ startedAt: string;
33
+ endedAt: string | null;
34
+ durationMs: number | null;
35
+ flapCount: number;
36
+ closeReason: string | null;
37
+ clientVersion: string | null;
38
+ sseWatchdog: boolean | null;
39
+ }
40
+
41
+ interface ListClientHistoryResponse {
42
+ sessions: ClientHistorySessionJSON[];
43
+ events: unknown[];
44
+ }
45
+
29
46
  export function registerClientsCommand(program: Command): void {
30
47
  registerCommand(program, {
31
48
  name: clientsHelp.name,
@@ -108,6 +125,85 @@ export function registerClientsCommand(program: Command): void {
108
125
  },
109
126
  );
110
127
 
128
+ subcommand(clients, "history").action(
129
+ async (
130
+ opts: {
131
+ json?: boolean;
132
+ clientId?: string;
133
+ interfaceId?: string;
134
+ since?: string;
135
+ limit?: string;
136
+ },
137
+ cmd: Command,
138
+ ) => {
139
+ const result = await cliIpcCall<ListClientHistoryResponse>(
140
+ "list_client_history",
141
+ optsToQueryParams(opts),
142
+ );
143
+
144
+ if (!result.ok) {
145
+ log.error(result.error ?? "Failed to load client history");
146
+ process.exitCode = 1;
147
+ return;
148
+ }
149
+
150
+ const response = result.result!;
151
+ if (opts.json) {
152
+ writeOutput(cmd, response);
153
+ return;
154
+ }
155
+
156
+ const sessions = response.sessions;
157
+ if (sessions.length === 0) {
158
+ log.info("No client connection history.");
159
+ return;
160
+ }
161
+
162
+ const header = [
163
+ "CLIENT ID",
164
+ "INTERFACE",
165
+ "STARTED",
166
+ "ENDED",
167
+ "DURATION",
168
+ "FLAPS",
169
+ "CLOSE",
170
+ "VERSION",
171
+ "WATCHDOG",
172
+ ];
173
+ const rows: string[][] = sessions.map((session) => [
174
+ session.clientId,
175
+ session.interfaceId,
176
+ formatRelativeTime(session.startedAt),
177
+ session.endedAt ? formatRelativeTime(session.endedAt) : "connected",
178
+ formatDuration(session.durationMs),
179
+ String(session.flapCount),
180
+ session.closeReason ?? "-",
181
+ session.clientVersion ?? "-",
182
+ session.sseWatchdog == null
183
+ ? "-"
184
+ : session.sseWatchdog
185
+ ? "yes"
186
+ : "no",
187
+ ]);
188
+
189
+ const colWidths = header.map((h: string, i: number) =>
190
+ Math.max(h.length, ...rows.map((r: string[]) => r[i].length)),
191
+ );
192
+ const pad = (s: string, w: number) => s.padEnd(w);
193
+ log.info(
194
+ header.map((h: string, i: number) => pad(h, colWidths[i])).join(" "),
195
+ );
196
+ log.info(colWidths.map((w: number) => "─".repeat(w)).join(" "));
197
+ for (const row of rows) {
198
+ log.info(
199
+ row
200
+ .map((c: string, i: number) => pad(c, colWidths[i]))
201
+ .join(" "),
202
+ );
203
+ }
204
+ },
205
+ );
206
+
111
207
  subcommand(clients, "disconnect").action(
112
208
  async (clientId: string, opts: { json?: boolean }, cmd: Command) => {
113
209
  const result = await cliIpcCall<DisconnectClientResponse>(
@@ -155,3 +251,23 @@ function formatRelativeTime(iso: string): string {
155
251
  const days = Math.floor(hr / 24);
156
252
  return `${days}d ago`;
157
253
  }
254
+
255
+ function formatDuration(ms: number | null): string {
256
+ if (ms == null || ms < 0) {
257
+ return "-";
258
+ }
259
+ const sec = Math.floor(ms / 1000);
260
+ if (sec < 60) {
261
+ return `${sec}s`;
262
+ }
263
+ const min = Math.floor(sec / 60);
264
+ if (min < 60) {
265
+ return `${min}m`;
266
+ }
267
+ const hr = Math.floor(min / 60);
268
+ if (hr < 24) {
269
+ return `${hr}h ${min % 60}m`;
270
+ }
271
+ const days = Math.floor(hr / 24);
272
+ return `${days}d ${hr % 24}h`;
273
+ }
@@ -74,9 +74,9 @@ path or connection details. Run this to diagnose credential lookup mismatches
74
74
  for example, when the CLI and the daemon are reading from different stores.
75
75
 
76
76
  Backend types:
77
- encrypted-store Direct file read from keys.enc (standalone CLI, no daemon)
78
- ces-rpc Delegates to the running CES process via stdio RPC (daemon)
79
- ces-http Delegates to CES sidecar over HTTP (containerized/Docker mode)
77
+ encrypted-store Direct file read from keys.enc (standalone CLI, no assistant)
78
+ ces-rpc Delegates to the running CES process via socket RPC
79
+ ces-http Managed failover when the CES socket is unavailable
80
80
 
81
81
  Also shows the CREDENTIAL_SECURITY_DIR, GATEWAY_SECURITY_DIR, and
82
82
  VELLUM_WORKSPACE_DIR env vars so you can confirm which instance directory this
@@ -294,7 +294,12 @@ web, etc.). The user enters the secret through the UI — it never passes throug
294
294
  the conversation or CLI output. On success the credential is stored in the
295
295
  encrypted vault with the specified metadata.
296
296
 
297
- Requires the assistant to be running with at least one connected client.
297
+ Requires the assistant to be running. The prompt renders in the conversation
298
+ this command runs from (the bash tool sets __CONVERSATION_ID). With no
299
+ conversation attached (a headless shell, Doctor's run_assistant_cli), no client
300
+ can show the card, so the command returns at once with a one-time collection
301
+ link (exit 75) to relay to the user, or an error when no link can be minted.
302
+ Never fall back to asking the user for the value in chat.
298
303
 
299
304
  This command BLOCKS until the user answers the prompt, so it returns only once
300
305
  the prompt has already closed. Tell the user what to paste BEFORE running it.
@@ -127,7 +127,12 @@ Examples:
127
127
  {
128
128
  flags: "--preferred-channels <channels>",
129
129
  description:
130
- "Comma-separated channel hints (e.g. vellum,telegram,slack)",
130
+ "Comma-separated channel hints (e.g. vellum,telegram,slack). Additive: vellum stays selected.",
131
+ },
132
+ {
133
+ flags: "--channels <channels>",
134
+ description:
135
+ "Exclusive channel allowlist (e.g. telegram). Replaces the default set. Urgent delivery does not add vellum or platform. Wins over --preferred-channels.",
131
136
  },
132
137
  {
133
138
  flags: "--session-id <id>",
@@ -162,7 +167,15 @@ Behavioral notes:
162
167
  is treated as critical and requires user action. Explicit --urgency /
163
168
  --requires-action flags still win for back-compat.
164
169
  - Without --urgent, --urgency defaults to low and --requires-action to false.
165
- - --preferred-channels are hints only; the decision engine may override them.
170
+ - --preferred-channels are additive hints; vellum stays in the selected set.
171
+ - --channels is an exclusive allowlist. Only those connected channels are
172
+ selected. Urgent delivery does not force vellum or platform, and Home
173
+ does not mirror unless vellum is in the list. When both flags are set,
174
+ --channels wins.
175
+ - --json includes selectedChannels, deliveryResults, and receiptClass.
176
+ receiptClass is the strongest delivery proof (provider_accepted,
177
+ gateway_accepted, client_os_posted, or unknown), not a promise the
178
+ user saw a banner.
166
179
  - --dedupe-key suppresses duplicate signals with the same key.
167
180
  - --conversation-id pins delivery to an existing vellum conversation
168
181
  deterministically. Other channels (telegram, slack) continue to use
@@ -171,6 +184,7 @@ Behavioral notes:
171
184
  Examples:
172
185
  $ assistant notifications send --message "Task complete"
173
186
  $ assistant notifications send --message "Pager: prod is down" --urgent
187
+ $ assistant notifications send --message "Alarm" --channels telegram --urgent
174
188
  $ assistant notifications send --message "Build green" --conversation-id 649c4645-3a6f-4ded-a713-504f02ca806b`,
175
189
  },
176
190
  {