@vellumai/assistant 0.12.1-dev.202609141913.5e16607 → 0.12.1-staging.2

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 (439) hide show
  1. package/AGENTS.md +0 -4
  2. package/ARCHITECTURE.md +12 -11
  3. package/docs/architecture/turn-actor.md +8 -15
  4. package/docs/guardian-request-flow.md +0 -16
  5. package/openapi.yaml +49 -291
  6. package/package.json +1 -1
  7. package/src/__tests__/always-loaded-tools-guard.test.ts +10 -18
  8. package/src/__tests__/app-compiler.test.ts +0 -6
  9. package/src/__tests__/app-control-tool-schemas.test.ts +2 -5
  10. package/src/__tests__/app-dir-path-guard.test.ts +3 -1
  11. package/src/__tests__/app-source-watcher.test.ts +218 -0
  12. package/src/{calls/__tests__ → __tests__}/call-controller.test.ts +82 -503
  13. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +2 -5
  14. package/src/__tests__/computer-use-tools.test.ts +5 -17
  15. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  16. package/src/__tests__/config-schema.test.ts +29 -28
  17. package/src/__tests__/config-watcher-skill-reseed.test.ts +359 -0
  18. package/src/__tests__/config-watcher.test.ts +8 -23
  19. package/src/__tests__/connection-model-compat.test.ts +2 -2
  20. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  21. package/src/__tests__/conversation-pairing.test.ts +0 -26
  22. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -4
  23. package/src/__tests__/conversation-queue.test.ts +207 -48
  24. package/src/__tests__/conversation-retry-discard.test.ts +1 -54
  25. package/src/__tests__/conversation-skill-tools.test.ts +0 -27
  26. package/src/__tests__/conversation-surfaces-app-control.test.ts +3 -8
  27. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -67
  28. package/src/__tests__/conversation-title-service.test.ts +10 -14
  29. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +5 -3
  30. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -51
  31. package/src/__tests__/credential-record-retire.test.ts +1 -171
  32. package/src/__tests__/credential-routes.test.ts +3 -212
  33. package/src/__tests__/credential-security-invariants.test.ts +2 -4
  34. package/src/__tests__/cu-unified-flow.test.ts +2 -8
  35. package/src/__tests__/document-sync-tags.test.ts +0 -25
  36. package/src/__tests__/drain-kick-guard.test.ts +2 -0
  37. package/src/__tests__/drain-requeue-on-contention.test.ts +6 -0
  38. package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
  39. package/src/__tests__/host-bash-proxy.test.ts +45 -26
  40. package/src/__tests__/host-browser-proxy.test.ts +17 -6
  41. package/src/__tests__/host-file-proxy-targeted.test.ts +0 -23
  42. package/src/__tests__/host-file-proxy.test.ts +23 -11
  43. package/src/__tests__/host-transfer-proxy-targeted.test.ts +9 -30
  44. package/src/__tests__/llm-catalog-parity.test.ts +0 -25
  45. package/src/__tests__/mcp-auth-routes.test.ts +9 -6
  46. package/src/__tests__/mcp-config-secret-boundary.test.ts +136 -78
  47. package/src/__tests__/mcp-health-check.test.ts +11 -8
  48. package/src/__tests__/mcp-list-plugin-servers.test.ts +10 -8
  49. package/src/{calls/__tests__ → __tests__}/media-stream-audio-transcode.test.ts +1 -1
  50. package/src/{calls/__tests__ → __tests__}/media-stream-output.test.ts +8 -37
  51. package/src/{calls/__tests__ → __tests__}/media-stream-parser.test.ts +1 -1
  52. package/src/{calls/__tests__ → __tests__}/media-stream-server-integration.test.ts +57 -150
  53. package/src/{calls/__tests__ → __tests__}/media-stream-stt-session.test.ts +5 -5
  54. package/src/{calls/__tests__ → __tests__}/media-turn-detector.test.ts +1 -1
  55. package/src/__tests__/messages-after-tiebreaker.test.ts +0 -91
  56. package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
  57. package/src/__tests__/messaging-send-tool.test.ts +548 -355
  58. package/src/__tests__/model-intents.test.ts +0 -3
  59. package/src/__tests__/notification-vellum-adapter.test.ts +2 -85
  60. package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
  61. package/src/__tests__/platform-callback-registration.test.ts +16 -8
  62. package/src/__tests__/platform-client-verify-credential.test.ts +0 -2
  63. package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -13
  64. package/src/__tests__/script-proxy-certs.test.ts +0 -35
  65. package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
  66. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  67. package/src/__tests__/speaker-identification.test.ts +56 -0
  68. package/src/__tests__/subagent-tool-gate-mode.test.ts +3 -19
  69. package/src/__tests__/subagent-tools.test.ts +2 -3
  70. package/src/__tests__/telephony-tts-guard.test.ts +3 -38
  71. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -4
  72. package/src/{calls/__tests__/voice-session-bridge-turn-flow.test.ts → __tests__/voice-session-bridge.test.ts} +12 -20
  73. package/src/__tests__/watch-retro-tool-availability.test.ts +17 -8
  74. package/src/__tests__/workspace-git-service.test.ts +0 -26
  75. package/src/acp/__tests__/agent-process.test.ts +4 -258
  76. package/src/acp/__tests__/auth-required.test.ts +0 -96
  77. package/src/acp/__tests__/client-handler.test.ts +2 -90
  78. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -5
  79. package/src/acp/__tests__/session-manager-resume.test.ts +6 -270
  80. package/src/acp/__tests__/session-manager-usage.test.ts +2 -4
  81. package/src/acp/__tests__/session-manager.test.ts +4 -895
  82. package/src/acp/agent-process.test.ts +1 -4
  83. package/src/acp/agent-process.ts +9 -94
  84. package/src/acp/auth-required.ts +1 -50
  85. package/src/acp/auto-install.test.ts +7 -9
  86. package/src/acp/client-handler.ts +3 -16
  87. package/src/acp/resolve-agent.test.ts +6 -220
  88. package/src/acp/resolve-agent.ts +23 -88
  89. package/src/acp/session-manager.test.ts +3 -196
  90. package/src/acp/session-manager.ts +18 -441
  91. package/src/acp/types.ts +5 -50
  92. package/src/api/events/app-files-changed.ts +3 -4
  93. package/src/api/events/notification-intent.ts +0 -2
  94. package/src/api/index.ts +0 -6
  95. package/src/apps/app-store.ts +1 -1
  96. package/src/bundler/app-compiler.ts +0 -15
  97. package/src/calls/__tests__/voice-control-protocol.test.ts +25 -58
  98. package/src/calls/__tests__/voice-session-bridge.test.ts +1 -37
  99. package/src/calls/__tests__/voice-triage-escalate.test.ts +0 -105
  100. package/src/calls/call-constants.ts +4 -24
  101. package/src/calls/call-controller.ts +199 -499
  102. package/src/calls/call-transport.ts +0 -16
  103. package/src/calls/media-stream-output.ts +0 -32
  104. package/src/calls/media-stream-server.ts +30 -82
  105. package/src/calls/media-stream-stt-session.ts +0 -15
  106. package/src/calls/resolve-call-tts-provider.ts +2 -33
  107. package/src/calls/speaker-identification.ts +233 -0
  108. package/src/calls/tts-call-strategy.ts +5 -9
  109. package/src/calls/types.ts +0 -2
  110. package/src/calls/voice-control-protocol.ts +21 -53
  111. package/src/calls/voice-session-bridge.ts +46 -59
  112. package/src/calls/voice-triage-escalate.ts +56 -175
  113. package/src/cli/commands/apps.help.ts +13 -67
  114. package/src/cli/commands/apps.ts +0 -183
  115. package/src/cli/commands/bash.help.ts +13 -8
  116. package/src/cli/commands/bash.ts +25 -7
  117. package/src/cli/commands/channels/index.help.ts +2 -70
  118. package/src/cli/commands/channels/index.ts +3 -16
  119. package/src/cli/commands/credentials.help.ts +2 -6
  120. package/src/cli/commands/credentials.ts +2 -2
  121. package/src/cli/commands/mcp.help.ts +8 -8
  122. package/src/cli/commands/mcp.ts +1 -1
  123. package/src/cli/commands/roadmap.help.ts +1 -5
  124. package/src/cli/commands/roadmap.ts +1 -1
  125. package/src/cli/lib/bundled-marketplace.json +90 -103
  126. package/src/config/__tests__/default-profile-catalog.test.ts +0 -22
  127. package/src/config/__tests__/memory-retrospective-schema.test.ts +1 -15
  128. package/src/config/__tests__/platform-rehydration.test.ts +9 -99
  129. package/src/config/acp-defaults.test.ts +3 -13
  130. package/src/config/acp-defaults.ts +6 -23
  131. package/src/config/acp-schema.ts +2 -30
  132. package/src/config/bundled-skills/acp/SKILL.md +14 -22
  133. package/src/config/bundled-skills/acp/TOOLS.json +1 -5
  134. package/src/config/bundled-skills/app-builder/SKILL.md +9 -12
  135. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
  136. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  137. package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
  138. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +139 -67
  139. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
  140. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  141. package/src/config/bundled-skills/screen-annotation/SKILL.md +1 -8
  142. package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +1 -4
  143. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  144. package/src/config/default-profile-catalog.ts +1 -1
  145. package/src/config/env.ts +2 -2
  146. package/src/config/feature-flag-registry.json +12 -24
  147. package/src/config/loader.ts +0 -1
  148. package/src/config/memory-v3-gate.test.ts +0 -31
  149. package/src/config/memory-v3-gate.ts +16 -20
  150. package/src/config/platform-rehydration.ts +27 -11
  151. package/src/config/schema.ts +2 -2
  152. package/src/config/schemas/__tests__/live-voice.test.ts +158 -8
  153. package/src/config/schemas/calls.ts +28 -1
  154. package/src/config/schemas/live-voice.ts +173 -1
  155. package/src/config/schemas/mcp.ts +1 -1
  156. package/src/config/schemas/memory-retrospective.ts +0 -10
  157. package/src/config/schemas/services.ts +0 -8
  158. package/src/config/schemas/skills.ts +14 -0
  159. package/src/credential-execution/process-manager.test.ts +19 -18
  160. package/src/daemon/__tests__/conversation-tool-setup.test.ts +121 -66
  161. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +1 -4
  162. package/src/daemon/app-source-watcher.ts +218 -0
  163. package/src/daemon/config-watcher.ts +194 -13
  164. package/src/daemon/conversation-process.ts +64 -35
  165. package/src/daemon/conversation-skill-tools.ts +31 -13
  166. package/src/daemon/conversation-store.ts +1 -1
  167. package/src/daemon/conversation-surfaces.ts +8 -10
  168. package/src/daemon/conversation-tool-setup.ts +43 -37
  169. package/src/daemon/conversation.ts +3 -0
  170. package/src/daemon/host-bash-proxy.ts +12 -8
  171. package/src/daemon/host-browser-proxy.ts +1 -15
  172. package/src/daemon/host-file-proxy.ts +10 -8
  173. package/src/daemon/host-transfer-proxy.ts +18 -14
  174. package/src/daemon/lifecycle.ts +5 -0
  175. package/src/daemon/mcp-reload-service.ts +5 -5
  176. package/src/daemon/message-types/sync.ts +0 -1
  177. package/src/daemon/orphan-reaper.ts +1 -1
  178. package/src/daemon/providers-setup.ts +1 -1
  179. package/src/daemon/shutdown-handlers.ts +9 -1
  180. package/src/daemon/skill-memory-refresh.ts +0 -64
  181. package/src/daemon/tool-side-effects.ts +18 -7
  182. package/src/home/__tests__/feed-writer.test.ts +0 -22
  183. package/src/home/feed-writer.ts +2 -11
  184. package/src/hooks/types.ts +0 -33
  185. package/src/inbound/platform-callback-registration.ts +5 -4
  186. package/src/live-voice/__tests__/live-voice-metrics.test.ts +3 -0
  187. package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
  188. package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
  189. package/src/{calls → live-voice}/__tests__/progress-narration.test.ts +4 -4
  190. package/src/{calls → live-voice}/__tests__/progress-phrases.test.ts +1 -1
  191. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +69 -13
  192. package/src/live-voice/live-voice-session.ts +693 -213
  193. package/src/{calls → live-voice}/progress-narration.ts +2 -2
  194. package/src/live-voice/protocol.ts +2 -0
  195. package/src/mcp/__tests__/effective-config.test.ts +2 -2
  196. package/src/mcp/effective-config.ts +3 -3
  197. package/src/mcp/mcp-header-store.ts +45 -29
  198. package/src/mcp/startup.ts +4 -8
  199. package/src/messaging/provider.ts +3 -10
  200. package/src/messaging/providers/callback-routing.ts +0 -18
  201. package/src/messaging/providers/channel-transport.ts +0 -56
  202. package/src/messaging/providers/discord/transport.ts +0 -17
  203. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +17 -6
  204. package/src/messaging/providers/slack/adapter.ts +44 -7
  205. package/src/messaging/providers/slack/transport.ts +0 -16
  206. package/src/messaging/providers/telegram-bot/adapter.ts +48 -1
  207. package/src/messaging/providers/telegram-bot/client.ts +26 -0
  208. package/src/messaging/providers/telegram-bot/transport.ts +0 -20
  209. package/src/messaging/providers/whatsapp/adapter.ts +48 -1
  210. package/src/messaging/providers/whatsapp/client.ts +29 -0
  211. package/src/messaging/providers/whatsapp/transport.ts +0 -18
  212. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +0 -8
  213. package/src/notifications/__tests__/assistant-reply-producer.test.ts +0 -55
  214. package/src/notifications/__tests__/guardian-feed-projection.test.ts +2 -158
  215. package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
  216. package/src/notifications/__tests__/schedule-result-producer.test.ts +3 -99
  217. package/src/notifications/adapters/macos.ts +0 -3
  218. package/src/notifications/assistant-reply-producer.ts +3 -8
  219. package/src/notifications/conversation-pairing.ts +16 -36
  220. package/src/notifications/delivered-post-record.ts +1 -11
  221. package/src/notifications/guardian-feed-projection.ts +5 -125
  222. package/src/notifications/home-feed-side-effect.ts +7 -55
  223. package/src/notifications/schedule-result-producer.ts +22 -66
  224. package/src/oauth/__tests__/seed-providers-managed.test.ts +0 -54
  225. package/src/oauth/byo-connection.test.ts +0 -45
  226. package/src/oauth/byo-connection.ts +6 -36
  227. package/src/oauth/connection-resolver.test.ts +0 -73
  228. package/src/oauth/connection-resolver.ts +2 -95
  229. package/src/oauth/seed-providers.ts +0 -165
  230. package/src/outbound-proxy/certs.ts +5 -3
  231. package/src/permissions/checker.test.ts +6 -11
  232. package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
  233. package/src/persistence/conversation-crud.ts +63 -71
  234. package/src/persistence/conversation-lineage.ts +4 -12
  235. package/src/persistence/conversation-title-service.ts +26 -9
  236. package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
  237. package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
  238. package/src/persistence/message-reads.ts +0 -30
  239. package/src/persistence/migrations/157-invite-contact-id.ts +6 -18
  240. package/src/persistence/schema/memory-core.ts +0 -5
  241. package/src/platform/client.test.ts +2 -4
  242. package/src/platform/client.ts +10 -2
  243. package/src/plugin-api/constants.ts +0 -2
  244. package/src/plugin-api/index.ts +0 -1
  245. package/src/plugin-api/types.ts +0 -2
  246. package/src/plugins/defaults/index.ts +0 -2
  247. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +0 -46
  248. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +5 -9
  249. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +10 -20
  250. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -219
  251. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +0 -31
  252. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -63
  253. package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +0 -4
  254. package/src/plugins/defaults/memory/graph/capability-seed.ts +6 -4
  255. package/src/plugins/defaults/memory/hooks/init.ts +0 -10
  256. package/src/plugins/defaults/memory/hooks/shutdown.ts +0 -2
  257. package/src/plugins/defaults/memory/jobs-worker.ts +0 -13
  258. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +60 -34
  259. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -3
  260. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -12
  261. package/src/plugins/defaults/memory/memory-retrospective-state.ts +71 -312
  262. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +1 -2
  263. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +3 -5
  264. package/src/plugins/defaults/memory/startup.ts +1 -6
  265. package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +9 -7
  266. package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
  267. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +0 -89
  268. package/src/plugins/defaults/memory/worker.ts +0 -6
  269. package/src/plugins/mcp-servers.ts +75 -15
  270. package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
  271. package/src/providers/gemini/client.ts +23 -9
  272. package/src/providers/inference/auth.ts +3 -2
  273. package/src/providers/inference/connection-availability.ts +8 -27
  274. package/src/providers/inference/resolve-auth.ts +4 -22
  275. package/src/providers/model-catalog.ts +0 -34
  276. package/src/providers/model-intents.ts +5 -10
  277. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +18 -146
  278. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +1 -83
  279. package/src/providers/openai/chat-completions-provider.ts +78 -192
  280. package/src/providers/openai/codex-models.ts +4 -0
  281. package/src/runtime/AGENTS.md +0 -2
  282. package/src/runtime/auth/same-actor.ts +3 -38
  283. package/src/runtime/http-server.ts +151 -160
  284. package/src/runtime/routes/__tests__/acp-routes.test.ts +4 -159
  285. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -108
  286. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +2 -2
  287. package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +12 -16
  288. package/src/runtime/routes/acp-routes.test.ts +0 -15
  289. package/src/runtime/routes/acp-routes.ts +9 -72
  290. package/src/runtime/routes/app-management-routes.ts +0 -73
  291. package/src/runtime/routes/app-routes.ts +1 -1
  292. package/src/runtime/routes/conversation-list-routes.ts +3 -14
  293. package/src/runtime/routes/conversation-query-routes.ts +0 -40
  294. package/src/runtime/routes/credential-routes.ts +10 -19
  295. package/src/runtime/routes/debug-bash-routes.ts +173 -0
  296. package/src/runtime/routes/diagnostics-routes.ts +3 -55
  297. package/src/runtime/routes/index.ts +2 -4
  298. package/src/runtime/routes/log-export-routes.ts +0 -2
  299. package/src/runtime/routes/mcp-auth-routes.ts +47 -39
  300. package/src/runtime/routes/migration-routes.ts +20 -6
  301. package/src/runtime/routes/platform-routes.ts +15 -18
  302. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -28
  303. package/src/runtime/services/conversation-serializer.ts +3 -16
  304. package/src/runtime/sync/resource-sync-events.ts +1 -2
  305. package/src/schedule/worker.ts +1 -1
  306. package/src/security/ces-rpc-record-backend.ts +0 -7
  307. package/src/subagent/consult-context.ts +25 -12
  308. package/src/tools/acp/list-agents.test.ts +1 -3
  309. package/src/tools/acp/spawn.test.ts +11 -146
  310. package/src/tools/acp/spawn.ts +3 -21
  311. package/src/tools/acp/status.ts +3 -40
  312. package/src/tools/app-control/skill-proxy-bridge.ts +1 -2
  313. package/src/tools/capability-offer.test.ts +2 -22
  314. package/src/tools/capability-offer.ts +1 -16
  315. package/src/tools/computer-use/definitions.ts +2 -4
  316. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -2
  317. package/src/tools/credentials/metadata-store.ts +0 -100
  318. package/src/tools/host-filesystem/edit.test.ts +1 -2
  319. package/src/tools/host-filesystem/edit.ts +2 -2
  320. package/src/tools/host-filesystem/read.test.ts +1 -2
  321. package/src/tools/host-filesystem/read.ts +2 -2
  322. package/src/tools/host-filesystem/transfer.test.ts +1 -2
  323. package/src/tools/host-filesystem/transfer.ts +2 -2
  324. package/src/tools/host-filesystem/write.test.ts +1 -2
  325. package/src/tools/host-filesystem/write.ts +2 -2
  326. package/src/tools/host-terminal/host-shell.test.ts +0 -16
  327. package/src/tools/host-terminal/host-shell.ts +20 -4
  328. package/src/tools/policy-context.ts +7 -6
  329. package/src/tools/subagent/spawn.ts +8 -5
  330. package/src/tools/watch/watch-retro-report.ts +8 -0
  331. package/src/util/__tests__/language-subtag.test.ts +1 -23
  332. package/src/util/fs-watcher-error.ts +36 -0
  333. package/src/util/language-subtag.ts +0 -16
  334. package/src/util/platform.ts +0 -8
  335. package/src/workspace/git-service.ts +54 -5
  336. package/src/workspace/migrations/registry.ts +0 -6
  337. package/scripts/smoke-desktop-window-theme.ts +0 -186
  338. package/src/__tests__/git-porcelain.test.ts +0 -47
  339. package/src/__tests__/helpers/set-workspace-mcp.ts +0 -11
  340. package/src/__tests__/message-deleted-hook-dispatch.test.ts +0 -119
  341. package/src/__tests__/resolve-app.test.ts +0 -135
  342. package/src/__tests__/service-account-token.test.ts +0 -247
  343. package/src/__tests__/source-fingerprint.test.ts +0 -184
  344. package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +0 -336
  345. package/src/acp/__tests__/helpers/acp-model-option.ts +0 -51
  346. package/src/acp/model-config.test.ts +0 -166
  347. package/src/acp/model-config.ts +0 -138
  348. package/src/api/events/acp-session-model-update.test.ts +0 -88
  349. package/src/api/events/acp-session-model-update.ts +0 -46
  350. package/src/apps/resolve-app.ts +0 -81
  351. package/src/apps/source-fingerprint.ts +0 -266
  352. package/src/calls/__tests__/barge-in-guard.test.ts +0 -81
  353. package/src/calls/__tests__/voice-leg-coordinator.test.ts +0 -229
  354. package/src/calls/__tests__/voice-progress-cadence.test.ts +0 -274
  355. package/src/calls/barge-in-guard.ts +0 -118
  356. package/src/calls/voice-leg-coordinator.ts +0 -189
  357. package/src/calls/voice-progress-cadence.ts +0 -423
  358. package/src/cli/commands/__tests__/apps.test.ts +0 -245
  359. package/src/cli/commands/__tests__/bash.test.ts +0 -53
  360. package/src/cli/commands/__tests__/roadmap.help.test.ts +0 -19
  361. package/src/cli/commands/channels/__tests__/send.test.ts +0 -218
  362. package/src/cli/commands/channels/send.ts +0 -128
  363. package/src/config/__tests__/platform-identity.test.ts +0 -255
  364. package/src/config/acp-agent-write.ts +0 -43
  365. package/src/config/acp-schema.test.ts +0 -81
  366. package/src/config/platform-identity.ts +0 -201
  367. package/src/config/schemas/__tests__/voice.test.ts +0 -148
  368. package/src/config/schemas/voice.ts +0 -150
  369. package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +0 -133
  370. package/src/daemon/app-change-notify.ts +0 -45
  371. package/src/desktop/__tests__/fake-desktop.ts +0 -119
  372. package/src/desktop/desktop-chrome-policy.test.ts +0 -71
  373. package/src/desktop/desktop-chrome-policy.ts +0 -42
  374. package/src/desktop/desktop-dependencies.test.ts +0 -102
  375. package/src/desktop/desktop-dependencies.ts +0 -306
  376. package/src/desktop/desktop-feature.test.ts +0 -18
  377. package/src/desktop/desktop-feature.ts +0 -19
  378. package/src/desktop/desktop-panel-config.test.ts +0 -135
  379. package/src/desktop/desktop-panel-config.ts +0 -149
  380. package/src/desktop/desktop-session-manager.test.ts +0 -627
  381. package/src/desktop/desktop-session-manager.ts +0 -814
  382. package/src/desktop/desktop-stream-bridge.test.ts +0 -395
  383. package/src/desktop/desktop-stream-bridge.ts +0 -214
  384. package/src/desktop/desktop-wallpaper.test.ts +0 -191
  385. package/src/desktop/desktop-wallpaper.ts +0 -113
  386. package/src/desktop/desktop-window-theme.ts +0 -170
  387. package/src/i18n/AGENTS.md +0 -22
  388. package/src/i18n/__tests__/i18n.test.ts +0 -108
  389. package/src/i18n/index.ts +0 -16
  390. package/src/i18n/locales.ts +0 -93
  391. package/src/i18n/messages.ts +0 -61
  392. package/src/i18n/title.ts +0 -25
  393. package/src/mcp/__tests__/workspace-mcp-config.test.ts +0 -135
  394. package/src/mcp/spec-schema.ts +0 -111
  395. package/src/mcp/workspace-mcp-config.ts +0 -188
  396. package/src/messaging/providers/__tests__/proactive-address.test.ts +0 -95
  397. package/src/persistence/conversation-title-placeholders.ts +0 -23
  398. package/src/persistence/message-cursor.ts +0 -78
  399. package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +0 -149
  400. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +0 -118
  401. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +0 -83
  402. package/src/plugins/defaults/memory/hooks/message-deleted.ts +0 -21
  403. package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +0 -126
  404. package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +0 -79
  405. package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +0 -28
  406. package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +0 -9
  407. package/src/providers/gemini-thought-signature.test.ts +0 -63
  408. package/src/providers/gemini-thought-signature.ts +0 -44
  409. package/src/providers/inference/service-account-token.ts +0 -248
  410. package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +0 -613
  411. package/src/providers/openai/__tests__/google-thought-signature.test.ts +0 -235
  412. package/src/providers/openai/google-thought-signature.ts +0 -320
  413. package/src/runtime/__tests__/channel-send.test.ts +0 -443
  414. package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +0 -89
  415. package/src/runtime/__tests__/live-voice-upgrade.test.ts +0 -58
  416. package/src/runtime/__tests__/runtime-ws-test-utils.ts +0 -72
  417. package/src/runtime/__tests__/watch-stream-upgrade.test.ts +0 -59
  418. package/src/runtime/channel-send.ts +0 -316
  419. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +0 -205
  420. package/src/runtime/routes/__tests__/channel-send-routes.test.ts +0 -127
  421. package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +0 -107
  422. package/src/runtime/routes/channel-send-routes.ts +0 -85
  423. package/src/runtime/routes/desktop-setup-routes.test.ts +0 -74
  424. package/src/runtime/routes/desktop-setup-routes.ts +0 -35
  425. package/src/security/__tests__/ces-http-record-backend.test.ts +0 -137
  426. package/src/security/ces-http-record-backend.ts +0 -120
  427. package/src/skills/__tests__/workspace-skill-md-signature.test.ts +0 -60
  428. package/src/skills/workspace-skill-md-signature.ts +0 -50
  429. package/src/tools/acp/status.test.ts +0 -94
  430. package/src/tools/terminal/__tests__/sanitized-bash.test.ts +0 -57
  431. package/src/tools/terminal/sanitized-bash.ts +0 -105
  432. package/src/util/ca-bundle.ts +0 -13
  433. package/src/workspace/git-porcelain.ts +0 -66
  434. package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +0 -258
  435. package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +0 -78
  436. package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +0 -214
  437. package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +0 -102
  438. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +0 -199
  439. /package/src/{calls → live-voice}/progress-phrases.ts +0 -0
package/AGENTS.md CHANGED
@@ -87,10 +87,6 @@ The module-level dependency-injection pattern (`registerFooDeps()`) used by some
87
87
 
88
88
  Telemetry event types are defined by a platform-generated wire contract (`src/telemetry/telemetry-wire.generated.ts`) that `src/telemetry/types.ts` layers over, with pre-flush validation against it. Adding a new event type starts platform-side, not here. The mechanics, the drift guards, and the cross-repo ordering are documented next to the code they govern: see [`src/telemetry/AGENTS.md`](src/telemetry/AGENTS.md).
89
89
 
90
- ## Daemon i18n
91
-
92
- User-facing copy the daemon generates as a hardcoded constant goes through `src/i18n/`. Persist the message key. Resolve with `t(key, locale)` at the HTTP/CLI/channel edge. Never persist a translated string, and never match stored display strings back to keys. See [`src/i18n/AGENTS.md`](src/i18n/AGENTS.md).
93
-
94
90
  ## Code comments
95
91
 
96
92
  When writing or updating comments, **do not reference code that has been removed.** Comments should describe the current state of the codebase, not narrate its history. Avoid phrases like "no longer does X", "previously used Y", or "was removed in PR Z" — future readers should not need to understand past implementations to understand the current code.
package/ARCHITECTURE.md CHANGED
@@ -609,11 +609,9 @@ Every phone call connects over Twilio Media Streams: the voice webhook emits `<C
609
609
 
610
610
  Transcription mode is selected once per session in `media-stream-stt-session.ts`:
611
611
 
612
- - **Streaming** (default): when `calls.voice.telephonyStreaming` is enabled and the `telephony` role resolves a streaming transcriber (`resolveStreamingTranscriber({ role: "telephony" })`), inbound audio is decoded (mu-law → PCM16, resampled 8 kHz → 16 kHz) and fed to the provider's realtime adapter. Replies trigger only on utterance-boundary finals (for Deepgram, `speech_final`/`UtteranceEnd`, never mid-sentence `is_final` segments), and barge-in fires from local energy VAD, never from transcriber partials. While something is interruptible (an assistant turn in flight, thinking or speaking, or a completed turn's tail still playing from Twilio's buffer), caller speech arms the shared sustained-speech barge-in guard (`src/calls/barge-in-guard.ts`, the same accounting live voice uses: speech accumulates toward 250 ms, short gaps are tolerated, a run that is mostly silence resets) and every inbound frame feeds it; outside that window the guard is dropped, so the caller's own utterance never carries into a turn that starts before the local VAD ends it. Only a fired guard reaches `CallController.handleBargeIn`, which interrupts a turn in either phase and ignores an idle controller (the playing tail is cleared instead).
612
+ - **Streaming** (default): when `calls.voice.telephonyStreaming` is enabled and the `telephony` role resolves a streaming transcriber (`resolveStreamingTranscriber({ role: "telephony" })`), inbound audio is decoded (mu-law → PCM16, resampled 8 kHz → 16 kHz) and fed to the provider's realtime adapter. Replies trigger only on utterance-boundary finals (for Deepgram, `speech_final`/`UtteranceEnd`, never mid-sentence `is_final` segments), and barge-in fires from local energy VAD, never from transcriber partials.
613
613
  - **Batch fallback**: otherwise the session segments turns with the energy-based `MediaTurnDetector` and transcribes each completed turn via the same role's batch API. Both halves of a call read the `telephony` role, which is why a role names its consumer rather than a boundary.
614
614
 
615
- Every phone turn runs the same two-leg triage as live voice through `startVoiceTurn` (`src/calls/voice-session-bridge.ts`): `call-controller.ts` opens on a toolless front-door leg (`routingLeg: "front-door"`, the `voiceFrontDoor` call site) and drives it through the shared `createFrontDoorLegCoordinator` (`src/calls/voice-leg-coordinator.ts`), which reads the stream through the verdict machine and sequences the hand-off (pause narration, abort the leg, resolve and speak the bridge, mark it as the floor holder, start the escalated leg pinned to the conversation's own model, re-arm narration); each driver supplies only a host for how text and the bridge are spoken, how a leg is started or aborted, and (live voice only) the speculative hold and commit. Phone has no partial transcripts, so the hold verdict is never taught and routing is escalate-only. The controller also passes the bridge's turn callbacks (tool activity is recorded as `tool_use_started` / `tool_use_completed` call events, persisted row ids ride the `assistant_spoke` event), `launchedAtMs` for dispatch timing, and a `voiceTelemetry` bag keyed by the call session with a `phone_inbound` / `phone_outbound` entry. Both drivers share the spoken progress narration cadence (`src/calls/voice-progress-cadence.ts`, tuned by `voice.frontModel.progress`): the cadence owns the tool-activity log, the triggers (an ops burst, a long operation completing, a full interval of audible silence with news, the `maxSilenceMs` heartbeat) and the generated or static phrase, while each driver supplies its own view of audible silence (live voice from its TTS queue and playback-tail estimate; the media-stream transport from `isPlaybackIdle()` and a running sum of sent frame durations) and how to speak a phrase.
616
-
617
615
  A credential preflight (`resolveTelephonyCredentialReadiness()` in `src/calls/telephony-credential-preflight.ts`) gates every call: it requires a credentialed, telephony-capable STT provider **and** a media-stream-playable TTS provider (the configured one or a credentialed playable fallback). Inbound calls that fail the preflight receive `<Say>` setup-required copy plus `<Hangup/>` instead of a doomed stream; outbound placement fails before dialing via `preflightVoiceIngress()` with the same user-facing message.
618
616
 
619
617
  Key modules:
@@ -731,9 +729,9 @@ The assistant-side live voice module is intentionally bounded under `src/live-vo
731
729
  | `live-voice-archive.ts` | Audio artifact creation/linking for user utterance and assistant response message IDs |
732
730
  | `live-voice-metrics.ts` | Per-session and per-turn latency snapshots emitted as `metrics` frames |
733
731
 
734
- Live voice STT uses the same `resolveStreamingTranscriber()` path as conversation streaming, dialed with the provider the `liveVoice` STT role resolves to after managed-speech defaulting (`resolveEffectiveSpeechProviders`, see `config/managed-speech-defaults.ts`). For V1 latency-sensitive behavior, that provider must resolve to a `daemon-streaming` transcriber whose catalog entry has `conversationStreamingMode: "realtime-ws"` and usable credentials. Providers that only support batch or incremental-batch transcription remain valid for other voice surfaces, but do not satisfy live voice's streaming STT requirement.
732
+ Live voice STT uses the same `resolveStreamingTranscriber()` path as conversation streaming. For V1 latency-sensitive behavior, the selected `services.stt.provider` must resolve to a `daemon-streaming` transcriber whose catalog entry has `conversationStreamingMode: "realtime-ws"` and usable credentials. Providers that only support batch or incremental-batch transcription remain valid for other voice surfaces, but do not satisfy live voice's streaming STT requirement.
735
733
 
736
- Live voice TTS uses `streamLiveVoiceTtsAudio()` and the TTS provider that `resolveEffectiveSpeechProviders` settles on (the configured `services.tts.provider`, or the managed `vellum` provider when the configured one has no usable credentials). The selected provider must be registered, catalog-compatible, and expose `capabilities.supportsStreaming` plus `synthesizeStream()`. Providers whose catalog entry advertises `supportsStreaming` (currently all five catalog providers: ElevenLabs, Fish Audio, Deepgram, xAI, and the managed Vellum provider) satisfy this requirement; a buffered-only provider would remain available for buffered message playback or other supported surfaces, but live voice reports a TTS error instead of silently falling back to buffered playback.
734
+ Live voice TTS uses `streamLiveVoiceTtsAudio()` and the configured `services.tts.provider`. The selected provider must be registered, catalog-compatible, and expose `capabilities.supportsStreaming` plus `synthesizeStream()`. Providers whose catalog entry advertises `supportsStreaming` (currently all four catalog providers: ElevenLabs, Fish Audio, Deepgram, and xAI) satisfy this requirement; a buffered-only provider would remain available for buffered message playback or other supported surfaces, but live voice reports a TTS error instead of silently falling back to buffered playback.
737
735
 
738
736
  The `voiceFrontDoor` prompt skips current-turn legacy and v3 memory retrieval, while prior frozen memory cards and static memory context remain available. The front-door rule escalates rather than guessing when required personal context is absent. The escalated leg runs the ordinary memory pipeline against the latest visible caller prompt before the quality model, with low selector effort. This keeps memory work off the front-door TTFT path without cross-leg speculative state.
739
737
 
@@ -1296,8 +1294,9 @@ graph TB
1296
1294
  RM_DIR["rmSync skill directory"]
1297
1295
  end
1298
1296
 
1299
- subgraph "Capability reseed"
1300
- RESEED["SKILL.md mtime poll<br/>reseeds capability cards"]
1297
+ subgraph "File Watcher"
1298
+ WATCHER["Skills directory watcher<br/>detects changes"]
1299
+ EVICT["Session eviction<br/>+ recreation"]
1301
1300
  end
1302
1301
 
1303
1302
  SNIPPET --> EVAL_TOOL
@@ -1310,12 +1309,14 @@ graph TB
1310
1309
  SCAFFOLD --> MANAGED_STORE
1311
1310
  MANAGED_STORE --> SKILL_DIR
1312
1311
 
1313
- SKILL_DIR --> RESEED
1312
+ SKILL_DIR --> WATCHER
1313
+ WATCHER --> EVICT
1314
+
1314
1315
  SKILL_DIR --> SKILL_LOAD
1315
1316
  SKILL_LOAD --> SESSION
1316
1317
 
1317
1318
  DELETE --> RM_DIR
1318
- RM_DIR --> RESEED
1319
+ RM_DIR --> WATCHER
1319
1320
  ```
1320
1321
 
1321
1322
  **Key design decisions:**
@@ -1323,7 +1324,7 @@ graph TB
1323
1324
  - `evaluate_typescript_code` always forces `sandbox.enabled = true` regardless of global config.
1324
1325
  - Snippet contract: must export `default` or `run` with signature `(input: unknown) => unknown | Promise<unknown>`.
1325
1326
  - Managed-store writes are atomic (tmp file + rename) to prevent partial `SKILL.md` files.
1326
- - After persist or delete, capability cards reseed from the `SKILL.md` set. The next turn continues in the same conversation.
1327
+ - After persist or delete, the file watcher triggers conversation eviction; the next turn runs in a fresh conversation. The model's system prompt instructs it to continue normally.
1327
1328
  - macOS UI shows Inspect and Delete controls for managed skills only (source = "managed").
1328
1329
  - `skill_load` resolves the recursive include graph (via `include-graph.ts`) before emitting output. Missing children are listed as suggested skills without child `<loaded_skill>` markers; cycles still produce `isError: true` with no marker. Valid includes produce an "Included Skills (immediate)" metadata section showing child ID, name, description, and path.
1329
1330
 
@@ -2191,7 +2192,7 @@ The `TtsUseCase` discriminator (`"phone-call"` or `"message-playback"`) lets pro
2191
2192
  - **`native-twilio`** — the text-token path: spoken text is sent via `sendTextToken()`, which the media-stream transport re-synthesizes through daemon TTS. Collapsing this mode into `synthesized-play` is a documented deferred follow-up.
2192
2193
  - **`synthesized-play`** — The assistant synthesises audio via the provider's HTTP API and streams it through the audio store / `sendPlayUrl()` path.
2193
2194
 
2194
- **Phone call integration:** Phone calls run on the media-stream transport, where the daemon synthesises speech via the effective TTS provider (the configured one after managed-speech defaulting, `resolveEffectiveSpeechProviders`, the same substitution live voice makes) and transcodes it to mu-law 8 kHz frames (`media-stream-output.ts`). Each catalog entry declares `mediaStreamPlayback.outputFormat` (`pcm`, `wav`, or `none`); `resolveTelephonyTtsCapability()` (`src/calls/telephony-tts-capability.ts`) combines that field with credential availability into a playable / not-playable verdict, and the call TTS resolver falls back to a credentialed playable provider rather than producing silence.
2195
+ **Phone call integration:** Phone calls run on the media-stream transport, where the daemon synthesises speech via the configured TTS provider and transcodes it to mu-law 8 kHz frames (`media-stream-output.ts`). Each catalog entry declares `mediaStreamPlayback.outputFormat` (`pcm`, `wav`, or `none`); `resolveTelephonyTtsCapability()` (`src/calls/telephony-tts-capability.ts`) combines that field with credential availability into a playable / not-playable verdict, and the call TTS resolver falls back to a credentialed playable provider rather than producing silence.
2195
2196
 
2196
2197
  **Adding a new TTS provider (catalog-first checklist):**
2197
2198
 
@@ -60,21 +60,14 @@ and restore the prior value afterwards, each guarding the restore so a turn that
60
60
  started in between is not clobbered. They are supplying the acting actor for
61
61
  their run, and are covered by this contract.
62
62
 
63
- The queue drains are deliberately not in that set. `drainSingleMessage` and
64
- `drainBatch` carry the queued sender on the per-turn field and into the run,
65
- and leave the resting slot alone: at the point they stamp, the drain has not
66
- yet proved it holds the processing lock. Its `isProcessing()` check is a
67
- time-of-check guard whose documented backstop is the persist that can still
68
- fail busy, and the requeue on that path restores the queue and the steer flag
69
- only. A drain that stamped the slot would therefore leave the conversation
70
- attributed to a sender whose turn never ran.
71
-
72
- The consequence is that a cross-actor drain runs against history scoped for the
73
- previous actor, because `ensureActorScopedHistory` reads the slot. That is a
74
- real defect and it is LUM-3344's, which owns the fix: scope the transcript at
75
- assembly time from the turn's actor, rather than mutating a shared transcript
76
- and tracking who it was scoped for. Do not close it by making the drain stamp
77
- the slot first.
63
+ A queued message commits to a run at its drain, not at its enqueue. The drains
64
+ (`drainSingleMessage` and `drainBatch` in `conversation-process.ts`) stamp the
65
+ queued sender the way `processMessage` stamps its committing actor, and re-scope
66
+ the resident history to them, so a turn drained behind another actor's turn
67
+ runs as its sender everywhere the resting actor is read, not only in the
68
+ per-turn snapshot. A steered drain skips the re-scope: its sender owned the
69
+ turn it cut off, and the resident history may carry the in-memory repair of the
70
+ abandoned `tool_use`.
78
71
 
79
72
  `call-controller` keeps its own `trustContext` on its own object and never reads
80
73
  the conversation's. It is outside this contract.
@@ -72,22 +72,6 @@ it end to end:
72
72
  same way a failed card edit does. The write-vs-resolve race converges
73
73
  from the other side too: the feed writer re-checks canonical status
74
74
  after its append.
75
- - The receipt is the whole retire mechanism, so everything that must
76
- stop happening lives in `writeGuardianFeedReceipt`: the terminal
77
- `guardianRequest.status` withdraws every client affordance, urgency
78
- drops to `medium` to leave the "Needs attention" treatment, and a
79
- still-`new` item is marked `seen` (unread means the user has
80
- something to review, which a resolved request is not). That clear
81
- runs only on the edge into terminal, so re-running the fan-out
82
- neither pulls a cleared receipt back into the bell nor undoes a user
83
- who marked the receipt unread again.
84
- - Terminal receipts that never passed the edge are cleared once for
85
- each assistant by `healLegacyGuardianReceiptUnread`, which the sweep calls
86
- ahead of its gateway read. One-shot rather than recurring: such a row
87
- and a `new` the user set deliberately are indistinguishable, so a
88
- completion sentinel in the daemon checkpoint ledger records the
89
- boundary instead. The transition is re-evaluated inside the writer
90
- queue and moves only `new`, exactly as the edge does.
91
75
  - The feed writer's bulk-dismiss pass skips pending guardian items
92
76
  (`isPendingGuardianFeedItem`), so "Clear all" can never retire an
93
77
  unresolved request; only its receipt is clearable.
package/openapi.yaml CHANGED
@@ -469,33 +469,6 @@ paths:
469
469
  type: string
470
470
  authErrorCode:
471
471
  type: string
472
- model:
473
- type: string
474
- availableModels:
475
- type: array
476
- items:
477
- type: object
478
- properties:
479
- value:
480
- type: string
481
- label:
482
- type: string
483
- description:
484
- type: string
485
- group:
486
- type: string
487
- required:
488
- - value
489
- - label
490
- additionalProperties: false
491
- modelRevisionEpoch:
492
- type: string
493
- format: uuid
494
- pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
495
- modelRevision:
496
- type: integer
497
- minimum: 0
498
- maximum: 9007199254740991
499
472
  usedTokens:
500
473
  type: number
501
474
  contextSize:
@@ -575,9 +548,6 @@ paths:
575
548
  cwd:
576
549
  type: string
577
550
  description: Working directory
578
- model:
579
- description: Optional model id or alias to request for the session.
580
- type: string
581
551
  required:
582
552
  - agent
583
553
  - task
@@ -596,25 +566,10 @@ paths:
596
566
  type: string
597
567
  agent:
598
568
  type: string
599
- requestedModel:
600
- anyOf:
601
- - type: string
602
- - type: "null"
603
- description: The model explicitly requested for this spawn, if any.
604
- effectiveModel:
605
- anyOf:
606
- - type: string
607
- - type: "null"
608
- description: The top-level session model reported by the ACP adapter, if any.
609
- modelWarning:
610
- description: Why the requested model was not applied. The session is running on the agent's own model.
611
- type: string
612
569
  required:
613
570
  - acpSessionId
614
571
  - protocolSessionId
615
572
  - agent
616
- - requestedModel
617
- - effectiveModel
618
573
  additionalProperties: false
619
574
  /v1/activation/dismiss:
620
575
  post:
@@ -1625,93 +1580,6 @@ paths:
1625
1580
  required:
1626
1581
  - published
1627
1582
  additionalProperties: false
1628
- /v1/apps/{id}/refresh:
1629
- post:
1630
- operationId: apps_by_id_refresh_post
1631
- summary: Compile an app
1632
- description: Compile workspace or plugin app source into dist/ and refresh open surfaces.
1633
- tags:
1634
- - apps
1635
- parameters:
1636
- - name: id
1637
- in: path
1638
- required: true
1639
- schema:
1640
- type: string
1641
- responses:
1642
- "200":
1643
- description: Successful response
1644
- content:
1645
- application/json:
1646
- schema:
1647
- type: object
1648
- properties:
1649
- ok:
1650
- type: boolean
1651
- const: true
1652
- appId:
1653
- type: string
1654
- name:
1655
- type: string
1656
- compiled:
1657
- type: boolean
1658
- compile_duration_ms:
1659
- type: number
1660
- compile_errors:
1661
- type: array
1662
- items:
1663
- type: object
1664
- properties:
1665
- text:
1666
- type: string
1667
- location:
1668
- type: object
1669
- properties:
1670
- file:
1671
- type: string
1672
- line:
1673
- type: number
1674
- column:
1675
- type: number
1676
- required:
1677
- - file
1678
- - line
1679
- - column
1680
- additionalProperties: false
1681
- required:
1682
- - text
1683
- additionalProperties: false
1684
- compile_warnings:
1685
- type: array
1686
- items:
1687
- type: object
1688
- properties:
1689
- text:
1690
- type: string
1691
- location:
1692
- type: object
1693
- properties:
1694
- file:
1695
- type: string
1696
- line:
1697
- type: number
1698
- column:
1699
- type: number
1700
- required:
1701
- - file
1702
- - line
1703
- - column
1704
- additionalProperties: false
1705
- required:
1706
- - text
1707
- additionalProperties: false
1708
- required:
1709
- - ok
1710
- - appId
1711
- - name
1712
- - compiled
1713
- - compile_duration_ms
1714
- additionalProperties: false
1715
1583
  /v1/apps/{id}/share-cloud:
1716
1584
  post:
1717
1585
  operationId: apps_by_id_sharecloud_post
@@ -5482,101 +5350,6 @@ paths:
5482
5350
  responses:
5483
5351
  "200":
5484
5352
  description: Successful response
5485
- /v1/channels/send:
5486
- post:
5487
- operationId: channels_send_post
5488
- summary: Send text to a channel chat
5489
- description: Deliver text to a chat on a channel through the channel's transport, recorded after the channel acknowledges it.
5490
- tags:
5491
- - channels
5492
- requestBody:
5493
- required: true
5494
- content:
5495
- application/json:
5496
- schema:
5497
- type: object
5498
- properties:
5499
- channel:
5500
- type: string
5501
- enum:
5502
- - telegram
5503
- - phone
5504
- - vellum
5505
- - whatsapp
5506
- - slack
5507
- - email
5508
- - platform
5509
- - a2a
5510
- - discord
5511
- - plugin
5512
- description: Channel to send on
5513
- target:
5514
- type: object
5515
- properties:
5516
- kind:
5517
- type: string
5518
- const: chat
5519
- chatId:
5520
- type: string
5521
- minLength: 1
5522
- description: Chat id in the channel's own id space
5523
- threadId:
5524
- description: Thread within the chat, in the channel's own id space
5525
- type: string
5526
- minLength: 1
5527
- required:
5528
- - kind
5529
- - chatId
5530
- text:
5531
- type: string
5532
- minLength: 1
5533
- description: Text to send
5534
- renderRichly:
5535
- description: Ask the channel for its rich rendering, where it has one
5536
- type: boolean
5537
- required:
5538
- - channel
5539
- - target
5540
- - text
5541
- responses:
5542
- "200":
5543
- description: Successful response
5544
- content:
5545
- application/json:
5546
- schema:
5547
- type: object
5548
- properties:
5549
- channel:
5550
- type: string
5551
- enum:
5552
- - telegram
5553
- - phone
5554
- - vellum
5555
- - whatsapp
5556
- - slack
5557
- - email
5558
- - platform
5559
- - a2a
5560
- - discord
5561
- - plugin
5562
- chatId:
5563
- type: string
5564
- threadId:
5565
- type: string
5566
- messageIds:
5567
- type: array
5568
- items:
5569
- type: string
5570
- lastMessageId:
5571
- type: string
5572
- recordedIn:
5573
- type: string
5574
- required:
5575
- - channel
5576
- - chatId
5577
- - messageIds
5578
- - lastMessageId
5579
- additionalProperties: false
5580
5353
  /v1/clients:
5581
5354
  get:
5582
5355
  operationId: clients_get
@@ -11373,9 +11146,7 @@ paths:
11373
11146
  post:
11374
11147
  operationId: credentials_list_post
11375
11148
  summary: List all credentials with metadata
11376
- description:
11377
- Return credentials from the live credential vault, with OAuth connection info and platform-managed
11378
- credentials. Fails if the vault is unreachable.
11149
+ description: Return all stored credentials with metadata, OAuth connection info, and platform-managed credentials.
11379
11150
  tags:
11380
11151
  - credentials
11381
11152
  requestBody:
@@ -11710,6 +11481,54 @@ paths:
11710
11481
  - schedules
11711
11482
  - timestamp
11712
11483
  additionalProperties: false
11484
+ /v1/debug/bash:
11485
+ post:
11486
+ operationId: debug_bash_post
11487
+ summary: Execute a shell command in the assistant process
11488
+ description: Developer debugging tool. Requires the assistant to be running with VELLUM_DEBUG=1.
11489
+ tags:
11490
+ - debug
11491
+ requestBody:
11492
+ required: true
11493
+ content:
11494
+ application/json:
11495
+ schema:
11496
+ type: object
11497
+ properties:
11498
+ command:
11499
+ type: string
11500
+ description: Shell command to execute via bash -c
11501
+ timeoutMs:
11502
+ description: "Execution timeout in milliseconds (default: 30000)"
11503
+ type: number
11504
+ required:
11505
+ - command
11506
+ responses:
11507
+ "200":
11508
+ description: Successful response
11509
+ content:
11510
+ application/json:
11511
+ schema:
11512
+ type: object
11513
+ properties:
11514
+ stdout:
11515
+ type: string
11516
+ stderr:
11517
+ type: string
11518
+ exitCode:
11519
+ anyOf:
11520
+ - type: number
11521
+ - type: "null"
11522
+ timedOut:
11523
+ type: boolean
11524
+ error:
11525
+ type: string
11526
+ required:
11527
+ - stdout
11528
+ - stderr
11529
+ - exitCode
11530
+ - timedOut
11531
+ additionalProperties: false
11713
11532
  /v1/debug/database:
11714
11533
  get:
11715
11534
  operationId: debug_database_get
@@ -11913,67 +11732,6 @@ paths:
11913
11732
  required:
11914
11733
  - defers
11915
11734
  additionalProperties: false
11916
- /v1/desktop/setup:
11917
- get:
11918
- operationId: desktop_setup_get
11919
- summary: Get desktop setup status
11920
- tags:
11921
- - desktop
11922
- responses:
11923
- "200":
11924
- description: Successful response
11925
- content:
11926
- application/json:
11927
- schema:
11928
- type: object
11929
- properties:
11930
- state:
11931
- type: string
11932
- enum:
11933
- - required
11934
- - installing
11935
- - ready
11936
- - failed
11937
- - unsupported
11938
- stage:
11939
- type: string
11940
- enum:
11941
- - packages
11942
- - chrome
11943
- - checking
11944
- required:
11945
- - state
11946
- additionalProperties: false
11947
- post:
11948
- operationId: desktop_setup_post
11949
- summary: Install desktop components
11950
- tags:
11951
- - desktop
11952
- responses:
11953
- "200":
11954
- description: Successful response
11955
- content:
11956
- application/json:
11957
- schema:
11958
- type: object
11959
- properties:
11960
- state:
11961
- type: string
11962
- enum:
11963
- - required
11964
- - installing
11965
- - ready
11966
- - failed
11967
- - unsupported
11968
- stage:
11969
- type: string
11970
- enum:
11971
- - packages
11972
- - chrome
11973
- - checking
11974
- required:
11975
- - state
11976
- additionalProperties: false
11977
11735
  /v1/diagnostics/env-vars:
11978
11736
  get:
11979
11737
  operationId: diagnostics_envvars_get
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/assistant",
3
- "version": "0.12.1-dev.202609141913.5e16607",
3
+ "version": "0.12.1-staging.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -26,7 +26,7 @@ afterAll(() => {
26
26
  });
27
27
 
28
28
  describe("always-loaded tool count", () => {
29
- test("should be exactly 19 with recall occupying the existing slot", async () => {
29
+ test("should be exactly 11 with recall occupying the existing slot", async () => {
30
30
  await initializeTools();
31
31
  const allDefs = getAllToolDefinitions();
32
32
 
@@ -44,31 +44,23 @@ describe("always-loaded tool count", () => {
44
44
  );
45
45
  const activeNames = activeTools.map((t) => t.name).sort();
46
46
 
47
- // `watch_retro_report` survives this baseline for the same reason the
48
- // ui_* tools do: a watch retrospective runs clientless, so it can only
49
- // report through a tool that survives this baseline. The ui_* tools are
50
- // here because background UI surfaces persist and return instead of
51
- // awaiting action, so they no longer need a connected client.
52
- // Host tool definitions stay on the wire for background turns: schemas
53
- // are cache-stable, and the shared execution gate rejects host tools on
54
- // explicitly non-interactive turns before any proxy dispatch.
47
+ // Host tools (host_bash, host_file_*) are excluded when no client is
48
+ // connected without a human in the loop, the guardian auto-approve
49
+ // path would allow unchecked host command execution.
50
+ //
51
+ // `watch_retro_report` is here for the same reason the ui_surface tools are
52
+ // NOT: a watch retrospective runs clientless, so it can only report through
53
+ // a tool that survives this baseline. Its description and schema are kept
54
+ // deliberately terse because that is the cost of the slot.
55
55
  const expectedNames = [
56
56
  "bash",
57
57
  "file_edit",
58
58
  "file_read",
59
59
  "file_write",
60
- "host_bash",
61
- "host_file_edit",
62
- "host_file_read",
63
- "host_file_transfer",
64
- "host_file_write",
65
60
  "recall",
66
61
  "remember",
67
62
  "skill_execute",
68
63
  "skill_load",
69
- "ui_dismiss",
70
- "ui_show",
71
- "ui_update",
72
64
  "watch_retro_report",
73
65
  "web_fetch",
74
66
  "web_search",
@@ -76,6 +68,6 @@ describe("always-loaded tool count", () => {
76
68
 
77
69
  expect(activeNames).toEqual(expectedNames);
78
70
  expect(activeNames.filter((name) => name === "recall")).toHaveLength(1);
79
- expect(activeTools.length).toBe(19);
71
+ expect(activeTools.length).toBe(11);
80
72
  });
81
73
  });
@@ -112,12 +112,6 @@ describe("compileApp", () => {
112
112
  const html = await readFile(join(appDir, "dist", "index.html"), "utf-8");
113
113
  expect(html).toContain('src="main.js"');
114
114
  expect(html).toContain('type="module"');
115
-
116
- const fingerprint = JSON.parse(
117
- await readFile(join(appDir, "dist", ".source-fingerprint.json"), "utf-8"),
118
- ) as { algorithm: string; files: Record<string, string> };
119
- expect(fingerprint.algorithm).toBe("sha256");
120
- expect(fingerprint.files["src/main.tsx"]).toMatch(/^[0-9a-f]{64}$/);
121
115
  });
122
116
 
123
117
  test("compiles preact JSX correctly", async () => {
@@ -591,11 +591,8 @@ describe("forwardAppControlProxyTool", () => {
591
591
  ctx,
592
592
  );
593
593
  expect(result.isError).toBe(true);
594
- expect(result.content).toContain(
595
- "The Vellum desktop app is needed to control apps on your computer",
596
- );
597
- expect(result.content).toContain("https://www.vellum.ai/downloads");
598
- expect(result.content).not.toContain("app_control_click");
594
+ expect(result.content).toContain("no proxy resolver available");
595
+ expect(result.content).toContain("app_control_click");
599
596
  });
600
597
 
601
598
  test("delegates to proxy resolver when available", async () => {
@@ -9,13 +9,15 @@ import { describe, expect, test } from "bun:test";
9
9
  * This prevents regressions where new code bypasses the dirName-based path
10
10
  * resolution and constructs UUID-based paths directly.
11
11
  *
12
- * Allowlist: only app-store.ts itself and workspace migrations
12
+ * Allowlist: only app-store.ts itself, app-source-watcher.ts (uses getAppsDir
13
+ * for the fs.watch root, not for per-app paths), and workspace migrations
13
14
  * (self-contained, don't import from app-store).
14
15
  */
15
16
 
16
17
  /** Files that are permitted to import getAppsDir. */
17
18
  const ALLOWLIST = new Set([
18
19
  "assistant/src/apps/app-store.ts", // defines getAppsDir
20
+ "assistant/src/daemon/app-source-watcher.ts", // uses getAppsDir for recursive fs.watch root, not per-app paths
19
21
  "assistant/src/tools/filesystem/write.ts", // uses getAppsDir as an exemption root for the artifact-HTML guard, not per-app paths
20
22
  ]);
21
23