@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
@@ -51,12 +51,7 @@ mock.module("../../../persistence/embeddings/embedding-backend.js", () => ({
51
51
  }));
52
52
 
53
53
  import { BACKUP_PROFILE_KEYS } from "../../../config/default-profile-names.js";
54
- import {
55
- getConfig,
56
- loadConfig,
57
- loadRawConfig,
58
- } from "../../../config/loader.js";
59
- import { AssistantConfigSchema } from "../../../config/schema.js";
54
+ import { getConfig, loadRawConfig } from "../../../config/loader.js";
60
55
  import { LLMConfigBase } from "../../../config/schemas/llm.js";
61
56
  import type { ConversationCreateType } from "../../../persistence/conversation-types.js";
62
57
  import {
@@ -1945,105 +1940,3 @@ describe("ingress URL writes through the generic config routes", () => {
1945
1940
  expect(ingress.lastTunnel).toEqual(LAST_TUNNEL);
1946
1941
  });
1947
1942
  });
1948
-
1949
- describe("config writes to a per-agent acp entry", () => {
1950
- const patchRoute = ROUTES.find((r) => r.operationId === "config_patch")!;
1951
- const setRoute = ROUTES.find((r) => r.operationId === "config_set")!;
1952
-
1953
- beforeEach(() => {
1954
- rawConfigFixture = {
1955
- acp: {
1956
- agents: {
1957
- claude: { command: "claude-agent-acp", args: [], model: "opus" },
1958
- },
1959
- },
1960
- };
1961
- seedRawConfig();
1962
- });
1963
-
1964
- function agentEntry(
1965
- raw: Record<string, unknown>,
1966
- id = "claude",
1967
- ): Record<string, unknown> {
1968
- const acp = raw.acp as Record<string, unknown>;
1969
- const agents = acp.agents as Record<string, Record<string, unknown>>;
1970
- return agents[id]!;
1971
- }
1972
-
1973
- test("a nulled per-agent model is dropped on both write paths", async () => {
1974
- await patchRoute.handler({
1975
- body: { acp: { agents: { claude: { model: null } } } },
1976
- });
1977
-
1978
- const patched = agentEntry(loadRawConfig());
1979
- expect("model" in patched).toBe(false);
1980
- expect(patched.command).toBe("claude-agent-acp");
1981
- expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
1982
-
1983
- seedRawConfig();
1984
- await setRoute.handler({
1985
- body: { path: "acp.agents.claude.model", value: null },
1986
- });
1987
-
1988
- expect("model" in agentEntry(loadRawConfig())).toBe(false);
1989
- expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
1990
- expect(loadConfig().acp.agents.claude?.model).toBeUndefined();
1991
- });
1992
-
1993
- test("a nulled per-agent command is dropped on both write paths", async () => {
1994
- await setRoute.handler({
1995
- body: { path: "acp.agents.claude.command", value: null },
1996
- });
1997
-
1998
- expect("command" in agentEntry(loadRawConfig())).toBe(false);
1999
- expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
2000
- expect(loadConfig().acp.agents.claude?.command).toBeUndefined();
2001
-
2002
- seedRawConfig();
2003
- await patchRoute.handler({
2004
- body: { acp: { agents: { claude: { command: null } } } },
2005
- });
2006
-
2007
- const patched = agentEntry(loadRawConfig());
2008
- expect("command" in patched).toBe(false);
2009
- expect(patched.model).toBe("opus");
2010
- expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
2011
- expect(loadConfig().acp.agents.claude?.command).toBeUndefined();
2012
- });
2013
-
2014
- test("a nulled command on an id with no bundled profile is dropped too", async () => {
2015
- rawConfigFixture = {
2016
- acp: { agents: { mine: { command: "my-acp", args: [] } } },
2017
- };
2018
- seedRawConfig();
2019
-
2020
- await setRoute.handler({
2021
- body: { path: "acp.agents.mine.command", value: null },
2022
- });
2023
-
2024
- expect("command" in agentEntry(loadRawConfig(), "mine")).toBe(false);
2025
- const result = AssistantConfigSchema.safeParse(loadRawConfig());
2026
- expect(result.success).toBe(false);
2027
- if (result.success) {
2028
- return;
2029
- }
2030
- expect(result.error.issues.map((issue) => issue.path)).toEqual([
2031
- ["acp", "agents", "mine", "command"],
2032
- ]);
2033
- expect(result.error.issues[0]?.message).toContain("acp.agents.mine");
2034
- });
2035
-
2036
- test("a model set on a bare bundled entry survives the next load", async () => {
2037
- rawConfigFixture = {};
2038
- seedRawConfig();
2039
-
2040
- await setRoute.handler({
2041
- body: { path: "acp.agents.claude.model", value: "sonnet" },
2042
- });
2043
-
2044
- const entry = agentEntry(loadRawConfig());
2045
- expect("command" in entry).toBe(false);
2046
- expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
2047
- expect(loadConfig().acp.agents.claude?.model).toBe("sonnet");
2048
- });
2049
- });
@@ -377,7 +377,7 @@ describe("GET config/llm/default-provider", () => {
377
377
  expect(availability(result).message).toContain("Vellum-managed");
378
378
  });
379
379
 
380
- test("service_account connection with invalid credential → missing_credential", async () => {
380
+ test("service_account connection → unsupported_auth even with a stored credential", async () => {
381
381
  seedConnection({
382
382
  name: "gemini-personal",
383
383
  provider: "gemini",
@@ -390,7 +390,7 @@ describe("GET config/llm/default-provider", () => {
390
390
  setConfig("llm", { defaultProvider: { provider: "gemini" } });
391
391
 
392
392
  const result = await get();
393
- expect(availability(result).status).toBe("missing_credential");
393
+ expect(availability(result).status).toBe("unsupported_auth");
394
394
  expect(availability(result).message).toContain("service-account");
395
395
  });
396
396
 
@@ -1,24 +1,19 @@
1
1
  /**
2
- * `internal_mcp_add` writes only the transport into workspace mcp.json.
3
- * Policy fields (enabled, risk, tool caps, allow/block lists) are not
4
- * persisted.
2
+ * `internal_mcp_add` writes only the transport. Policy fields (enabled,
3
+ * risk, tool caps, allow/block lists) are not persisted.
5
4
  */
6
5
 
7
6
  import { beforeEach, describe, expect, mock, test } from "bun:test";
8
7
 
9
- let stored: { servers: Record<string, { transport: Record<string, unknown> }> } =
10
- { servers: {} };
11
- let saved:
12
- | { servers: Record<string, { transport: Record<string, unknown> }> }
13
- | undefined;
8
+ let raw: Record<string, unknown> = {};
9
+ let saved: Record<string, unknown> | undefined;
14
10
 
15
- mock.module("../../../mcp/workspace-mcp-config.js", () => ({
16
- loadWorkspaceMcpConfig: () => stored,
17
- saveWorkspaceMcpConfig: (next: {
18
- servers: Record<string, { transport: Record<string, unknown> }>;
19
- }) => {
11
+ const actualLoader = await import("../../../config/loader.js");
12
+ mock.module("../../../config/loader.js", () => ({
13
+ ...actualLoader,
14
+ loadRawConfig: () => raw,
15
+ saveRawConfig: (next: Record<string, unknown>) => {
20
16
  saved = next;
21
- stored = next;
22
17
  },
23
18
  }));
24
19
 
@@ -31,12 +26,13 @@ const { ROUTES } = await import("../mcp-auth-routes.js");
31
26
  const addRoute = ROUTES.find((r) => r.operationId === "internal_mcp_add")!;
32
27
 
33
28
  function addedEntry(): Record<string, unknown> {
34
- return saved!.servers["srv"] as Record<string, unknown>;
29
+ const mcp = saved?.mcp as { servers: Record<string, unknown> };
30
+ return mcp.servers["srv"] as Record<string, unknown>;
35
31
  }
36
32
 
37
33
  describe("internal_mcp_add persisted shape", () => {
38
34
  beforeEach(() => {
39
- stored = { servers: {} };
35
+ raw = {};
40
36
  saved = undefined;
41
37
  });
42
38
 
@@ -262,21 +262,6 @@ describe("POST /v1/acp/spawn", () => {
262
262
  // Guard runs before the approval gate — no prompt is surfaced.
263
263
  expect(confirmationRequests).toHaveLength(0);
264
264
  });
265
-
266
- test("rejects a non-string model before the approval gate", async () => {
267
- const handler = getSpawnHandler();
268
- await expect(
269
- handler({
270
- body: {
271
- agent: "claude",
272
- task: "do a thing",
273
- conversationId: "conv-1",
274
- model: 42,
275
- },
276
- }),
277
- ).rejects.toThrow("model must be a string when provided");
278
- expect(confirmationRequests).toHaveLength(0);
279
- });
280
265
  });
281
266
 
282
267
  // ---------------------------------------------------------------------------
@@ -24,11 +24,8 @@ import {
24
24
  AcpResumeError,
25
25
  AcpSessionNotFoundError,
26
26
  } from "../../acp/session-manager.js";
27
- import { type AcpSessionState, isLiveAcpStatus } from "../../acp/types.js";
28
- import {
29
- AcpSessionModelUpdateEventSchema,
30
- type AssistantEvent,
31
- } from "../../api/index.js";
27
+ import type { AcpSessionState } from "../../acp/types.js";
28
+ import type { AssistantEvent } from "../../api/index.js";
32
29
  import { getConfig } from "../../config/loader.js";
33
30
  import { createGuardianRequestForConfirmation } from "../../permissions/confirmation-guardian-request.js";
34
31
  import type { UserDecision } from "../../permissions/types.js";
@@ -56,10 +53,6 @@ const log = getLogger("acp-routes");
56
53
  const DEFAULT_SESSION_LIMIT = 50;
57
54
  const MAX_SESSION_LIMIT = 500;
58
55
 
59
- /** The option shape the `acp_session_model_update` event already publishes. */
60
- const acpModelOptionsSchema =
61
- AcpSessionModelUpdateEventSchema.shape.availableModels;
62
-
63
56
  const sessionEntrySchema = z.object({
64
57
  id: z.string(),
65
58
  agentId: z.string(),
@@ -75,15 +68,6 @@ const sessionEntrySchema = z.object({
75
68
  /** Credential failure that ended the run, when one did. Drives the inline
76
69
  * Connect card on reopen; cleared when a replacement token is stored. */
77
70
  authErrorCode: z.string().optional(),
78
- /** Model a live session is running on. Absent for history rows, which have
79
- * no live process to ask. */
80
- model: z.string().optional(),
81
- /** Models a live session could run on. Absent for history rows. */
82
- availableModels: acpModelOptionsSchema.optional(),
83
- /** Scopes live model revisions to one assistant process. */
84
- modelRevisionEpoch: z.string().uuid().optional(),
85
- /** Orders live model state within `modelRevisionEpoch`. */
86
- modelRevision: z.number().int().nonnegative().optional(),
87
71
  usedTokens: z.number().optional(),
88
72
  contextSize: z.number().optional(),
89
73
  costAmount: z.number().optional(),
@@ -230,26 +214,17 @@ async function spawnSession({ body, abortSignal }: RouteHandlerArgs) {
230
214
  const task = body?.task as string | undefined;
231
215
  const conversationId = body?.conversationId as string | undefined;
232
216
  const cwd = (body?.cwd as string | undefined) ?? process.cwd();
233
- const model = body?.model ?? undefined;
234
217
 
235
218
  if (!agent || !task || !conversationId) {
236
219
  throw new BadRequestError("agent, task, and conversationId are required");
237
220
  }
238
- if (model !== undefined && typeof model !== "string") {
239
- throw new BadRequestError("model must be a string when provided");
240
- }
241
221
 
242
222
  // High-risk approval gate. Block BEFORE any side effects — resolution can
243
223
  // trigger a `bun` global install (auto-install.ts) and `manager.spawn`
244
224
  // launches the host subprocess — so an unapproved request mutates nothing.
245
225
  const decision = await awaitRouteApproval({
246
226
  toolName: "acp_spawn",
247
- input: {
248
- agent,
249
- task,
250
- cwd,
251
- ...(model !== undefined ? { model } : {}),
252
- },
227
+ input: { agent, task, cwd },
253
228
  conversationId,
254
229
  signal: abortSignal,
255
230
  });
@@ -287,33 +262,17 @@ async function spawnSession({ body, abortSignal }: RouteHandlerArgs) {
287
262
  );
288
263
 
289
264
  const manager = getAcpSessionManager();
290
- const {
291
- acpSessionId,
292
- protocolSessionId,
293
- requestedModel,
294
- effectiveModel,
295
- modelWarning,
296
- } = await manager.spawn(
265
+ const { acpSessionId, protocolSessionId } = await manager.spawn(
297
266
  agent,
298
267
  agentConfig,
299
268
  task,
300
269
  cwd,
301
270
  conversationId,
302
271
  broadcastMessage,
303
- { model },
304
272
  );
305
273
 
306
274
  log.info({ acpSessionId, protocolSessionId, agent }, "ACP spawn succeeded");
307
- // A refused model is a warning, not a failed spawn: the session is live on
308
- // the agent's own model.
309
- return {
310
- acpSessionId,
311
- protocolSessionId,
312
- agent,
313
- requestedModel: requestedModel ?? null,
314
- effectiveModel: effectiveModel ?? null,
315
- ...(modelWarning ? { modelWarning } : {}),
316
- };
275
+ return { acpSessionId, protocolSessionId, agent };
317
276
  }
318
277
 
319
278
  async function steerSession({ pathParams, body }: RouteHandlerArgs) {
@@ -629,7 +588,10 @@ function deleteSession({ pathParams }: RouteHandlerArgs) {
629
588
 
630
589
  try {
631
590
  const state = manager.getStatus(id);
632
- if (!Array.isArray(state) && isLiveAcpStatus(state.status)) {
591
+ if (
592
+ !Array.isArray(state) &&
593
+ (state.status === "running" || state.status === "initializing")
594
+ ) {
633
595
  throw new ConflictError(
634
596
  `ACP session "${id}" is still ${state.status}. Cancel or close it before deleting.`,
635
597
  );
@@ -678,32 +640,11 @@ export const ROUTES: RouteDefinition[] = [
678
640
  task: z.string().describe("Task description"),
679
641
  conversationId: z.string(),
680
642
  cwd: z.string().describe("Working directory").optional(),
681
- model: z
682
- .string()
683
- .optional()
684
- .describe("Optional model id or alias to request for the session."),
685
643
  }),
686
644
  responseBody: z.object({
687
645
  acpSessionId: z.string(),
688
646
  protocolSessionId: z.string(),
689
647
  agent: z.string(),
690
- requestedModel: z
691
- .string()
692
- .nullable()
693
- .describe("The model explicitly requested for this spawn, if any."),
694
- effectiveModel: z
695
- .string()
696
- .nullable()
697
- .describe(
698
- "The top-level session model reported by the ACP adapter, if any.",
699
- ),
700
- modelWarning: z
701
- .string()
702
- .optional()
703
- .describe(
704
- "Why the requested model was not applied. The session is running " +
705
- "on the agent's own model.",
706
- ),
707
648
  }),
708
649
  },
709
650
  {
@@ -911,10 +852,6 @@ function listMergedSessions(opts: { limit: number; conversationId?: string }): {
911
852
  parentToolUseId: s.parentToolUseId,
912
853
  authErrorCode: s.authErrorCode,
913
854
  authErrorCredential: s.authErrorCredential,
914
- model: s.model,
915
- availableModels: s.availableModels,
916
- modelRevisionEpoch: s.modelRevisionEpoch,
917
- modelRevision: s.modelRevision,
918
855
  usedTokens: s.latestUsage?.usedTokens,
919
856
  contextSize: s.latestUsage?.contextSize,
920
857
  costAmount: s.latestUsage?.costAmount,
@@ -51,7 +51,6 @@ import { compileApp, runCompile } from "../../bundler/app-compiler.js";
51
51
  import { scanBundle } from "../../bundler/bundle-scanner.js";
52
52
  import type { SignatureJson } from "../../bundler/bundle-signer.js";
53
53
  import { verifyBundleSignature } from "../../bundler/signature-verifier.js";
54
- import { notifyAppSurfacesChanged } from "../../daemon/app-change-notify.js";
55
54
  import { compareSemver } from "../../daemon/handlers/shared.js";
56
55
  import { computeContentId } from "../../util/content-id.js";
57
56
  import { getLogger } from "../../util/logger.js";
@@ -129,17 +128,6 @@ const appListItemSchema = z.object({
129
128
 
130
129
  type AppListItem = z.infer<typeof appListItemSchema>;
131
130
 
132
- const compileDiagnosticSchema = z.object({
133
- text: z.string(),
134
- location: z
135
- .object({
136
- file: z.string(),
137
- line: z.number(),
138
- column: z.number(),
139
- })
140
- .optional(),
141
- });
142
-
143
131
  /**
144
132
  * The pin route's body. `RouteDefinition.requestBody` is a codegen signal and
145
133
  * does not validate, so the handler parses against this too; declaring it once
@@ -908,44 +896,6 @@ async function handleOpenApp({ pathParams }: RouteHandlerArgs) {
908
896
  return { ...result, html };
909
897
  }
910
898
 
911
- /**
912
- * Compile an app's source into dist/ and refresh open surfaces.
913
- * Runs in the assistant process so open surfaces, client broadcasts, and
914
- * published-app redeploy see the new build. Workspace and plugin apps both
915
- * compile in place so local plugin edits can be rebuilt without waiting for
916
- * the plugin source watcher.
917
- */
918
- async function handleRefreshApp({ pathParams }: RouteHandlerArgs) {
919
- const appId = pathParams?.id;
920
- if (!appId) {
921
- throw new BadRequestError("App id is required.");
922
- }
923
-
924
- const source = resolveAppSource(appId);
925
- if (!source) {
926
- throw new NotFoundError(
927
- `App "${appId}" not found. Run 'assistant apps list' to see available apps.`,
928
- );
929
- }
930
-
931
- const compileResult = await compileApp(source.sourceDir);
932
- notifyAppSurfacesChanged(source.id, { fileChange: true });
933
-
934
- return {
935
- ok: true as const,
936
- appId: source.id,
937
- name: source.name,
938
- compiled: compileResult.ok,
939
- compile_duration_ms: compileResult.durationMs,
940
- ...(compileResult.ok
941
- ? {}
942
- : {
943
- compile_errors: compileResult.errors,
944
- compile_warnings: compileResult.warnings,
945
- }),
946
- };
947
- }
948
-
949
899
  /**
950
900
  * Reject a mutation targeting a plugin-bundled app. Plugin apps are owned by
951
901
  * their plugin and are read-only over this surface — their source is not
@@ -1303,29 +1253,6 @@ export const ROUTES: RouteDefinition[] = [
1303
1253
  origin: z.string(),
1304
1254
  }),
1305
1255
  },
1306
- {
1307
- operationId: "apps_refresh",
1308
- endpoint: "apps/:id/refresh",
1309
- method: "POST",
1310
- policy: {
1311
- requiredScopes: ["settings.write"],
1312
- allowedPrincipalTypes: ACTOR_PRINCIPALS,
1313
- },
1314
- handler: handleRefreshApp,
1315
- summary: "Compile an app",
1316
- description:
1317
- "Compile workspace or plugin app source into dist/ and refresh open surfaces.",
1318
- tags: ["apps"],
1319
- responseBody: z.object({
1320
- ok: z.literal(true),
1321
- appId: z.string(),
1322
- name: z.string(),
1323
- compiled: z.boolean(),
1324
- compile_duration_ms: z.number(),
1325
- compile_errors: z.array(compileDiagnosticSchema).optional(),
1326
- compile_warnings: z.array(compileDiagnosticSchema).optional(),
1327
- }),
1328
- },
1329
1256
  {
1330
1257
  operationId: "apps_delete",
1331
1258
  endpoint: "apps/:id/delete",
@@ -92,7 +92,7 @@ function serveCompiledApp(
92
92
  );
93
93
  const body = isLegacySingleFileDir(appDir)
94
94
  ? UNSUPPORTED_LEGACY_APP_HTML
95
- : `<p>App has not been compiled yet. Run <code>assistant apps refresh</code> to build.</p>`;
95
+ : `<p>App has not been compiled yet. Edit a source file to trigger a build.</p>`;
96
96
  return (
97
97
  `<!DOCTYPE html><html><head><title>${escapedName}</title></head>` +
98
98
  `<body>${body}</body></html>`
@@ -14,7 +14,6 @@ import { z } from "zod";
14
14
 
15
15
  import { CHANNEL_IDS } from "../../channels/types.js";
16
16
  import { isAssistantInitiatedThreadsEnabled } from "../../config/assistant-initiated-threads-gate.js";
17
- import { localeFromAcceptLanguage } from "../../i18n/index.js";
18
17
  import { channelBindingSchema } from "../../messaging/channel-binding-schema.js";
19
18
  import {
20
19
  type Confidence,
@@ -245,10 +244,7 @@ function parseEnumQueryParam<const T extends readonly string[]>(
245
244
  );
246
245
  }
247
246
 
248
- function handleListConversations({
249
- queryParams = {},
250
- headers,
251
- }: RouteHandlerArgs) {
247
+ function handleListConversations({ queryParams = {} }: RouteHandlerArgs) {
252
248
  const limit = Number(queryParams.limit ?? 50);
253
249
  const offset = Number(queryParams.offset ?? 0);
254
250
  // "background" is the back-compat umbrella (background + scheduled); newer
@@ -369,7 +365,6 @@ function handleListConversations({
369
365
  // Checks in-memory flag first (hot path), falls back to the
370
366
  // persisted `processing_started_at` column for cold conversations.
371
367
  isProcessing: isConversationProcessing(conversation.id),
372
- locale: localeFromAcceptLanguage(headers?.["accept-language"]),
373
368
  }),
374
369
  ),
375
370
  nextOffset,
@@ -584,14 +579,8 @@ function handleMarkUnread({ body = {}, headers }: RouteHandlerArgs) {
584
579
  }
585
580
  }
586
581
 
587
- function handleGetConversation({
588
- pathParams = {},
589
- headers,
590
- }: RouteHandlerArgs) {
591
- const detail = buildConversationDetailResponse(
592
- pathParams.id!,
593
- localeFromAcceptLanguage(headers?.["accept-language"]),
594
- );
582
+ function handleGetConversation({ pathParams = {} }: RouteHandlerArgs) {
583
+ const detail = buildConversationDetailResponse(pathParams.id!);
595
584
  if (!detail) {
596
585
  throw new NotFoundError(`Conversation ${pathParams.id} not found`);
597
586
  }
@@ -29,7 +29,6 @@ import {
29
29
  LatencyBreakdownSchema,
30
30
  LLMRequestLogEntrySchema,
31
31
  } from "../../api/responses/llm-request-log-entry.js";
32
- import { scrubNulledAcpAgentLeaves } from "../../config/acp-agent-write.js";
33
32
  import {
34
33
  catalogEntryFor,
35
34
  type InputModalities,
@@ -93,7 +92,6 @@ import {
93
92
  log,
94
93
  } from "../../daemon/handlers/shared.js";
95
94
  import { rescheduleHeartbeatIfTimezoneChanged } from "../../heartbeat/heartbeat-service.js";
96
- import { overlayWorkspaceMcpForConfigRead } from "../../mcp/workspace-mcp-config.js";
97
95
  import {
98
96
  getAssistantMessageIdsInTurn,
99
97
  getConversation,
@@ -689,38 +687,6 @@ function rejectMcpTransportHeaderWrite(patch: unknown): void {
689
687
  );
690
688
  }
691
689
 
692
- const MCP_CONFIG_WRITE_MESSAGE =
693
- "MCP servers are stored in mcp.json. Use assistant mcp add or assistant mcp remove.";
694
-
695
- function stripMcpFromConfigWrite(patch: Record<string, unknown>): void {
696
- if (Object.hasOwn(patch, "mcp")) {
697
- delete patch.mcp;
698
- }
699
- }
700
-
701
- function rejectMcpConfigSetPath(path: string, value: unknown): void {
702
- if (path !== "mcp" && !path.startsWith("mcp.")) {
703
- return;
704
- }
705
- const relative =
706
- path === "mcp" ? value : nestPath(path.slice("mcp.".length), value);
707
- if (patchContainsMcpTransportHeaders({ mcp: relative })) {
708
- throw new BadRequestError(
709
- "MCP authentication headers must be managed through MCP server add/update APIs, not generic config writes.",
710
- );
711
- }
712
- throw new BadRequestError(MCP_CONFIG_WRITE_MESSAGE);
713
- }
714
-
715
- function nestPath(path: string, value: unknown): unknown {
716
- const segments = path.split(".");
717
- let current: unknown = value;
718
- for (let i = segments.length - 1; i >= 0; i--) {
719
- current = { [segments[i]!]: current };
720
- }
721
- return current;
722
- }
723
-
724
690
  const WireProfileEntry = ProfileEntry.extend({
725
691
  supportsVision: z.boolean().optional(),
726
692
  invariant: z.boolean().optional(),
@@ -927,7 +893,6 @@ const ConfigPatchRequestSchema = z
927
893
  function handleGetConfig() {
928
894
  try {
929
895
  const config = applyContextDefaultsToRawConfig(loadRawConfig());
930
- overlayWorkspaceMcpForConfigRead(config);
931
896
  sanitizeMcpTransportHeadersForSettingsRead(config);
932
897
  overlayEffectiveProfilesForWire(config);
933
898
  enrichProfilesForWire(config);
@@ -1629,7 +1594,6 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
1629
1594
  normalizeManagedProfileWrites(body);
1630
1595
  rejectManagedProfileDeletion(body as Record<string, unknown>);
1631
1596
  rejectMcpTransportHeaderWrite(body);
1632
- stripMcpFromConfigWrite(body as Record<string, unknown>);
1633
1597
 
1634
1598
  const raw = loadRawConfig();
1635
1599
  const patch = body as Record<string, unknown>;
@@ -1639,13 +1603,11 @@ async function handlePatchConfig({ body }: RouteHandlerArgs) {
1639
1603
  }
1640
1604
  deepMergeOverwrite(raw, patch);
1641
1605
  scrubRemovedServiceModes(raw);
1642
- scrubNulledAcpAgentLeaves(raw);
1643
1606
  seedSttProviderForSparseBlock(raw);
1644
1607
 
1645
1608
  await commitConfigWrite(raw, "patch");
1646
1609
 
1647
1610
  const merged = applyContextDefaultsToRawConfig(loadRawConfig());
1648
- overlayWorkspaceMcpForConfigRead(merged);
1649
1611
  sanitizeMcpTransportHeadersForSettingsRead(merged);
1650
1612
  overlayEffectiveProfilesForWire(merged);
1651
1613
  enrichProfilesForWire(merged);
@@ -1708,7 +1670,6 @@ async function handleSetConfig({ body }: RouteHandlerArgs) {
1708
1670
  stripWireOnlyProfileKeys(patchShape);
1709
1671
  normalizeManagedProfileWrites(patchShape);
1710
1672
  rejectManagedProfileDeletion(patchShape);
1711
- rejectMcpConfigSetPath(path, value);
1712
1673
  rejectMcpTransportHeaderWrite(patchShape);
1713
1674
 
1714
1675
  const raw = loadRawConfig();
@@ -1747,7 +1708,6 @@ async function handleSetConfig({ body }: RouteHandlerArgs) {
1747
1708
  written.source = "managed";
1748
1709
  }
1749
1710
  }
1750
- scrubNulledAcpAgentLeaves(raw);
1751
1711
  // A SET can create `services.stt` with a leaf like `language` and no
1752
1712
  // `provider`, which SttServiceSchema requires whenever the block exists;
1753
1713
  // the same seeding that guards PATCH keeps this write's persisted block