@vellumai/assistant 0.12.1-staging.1 → 0.12.1

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 (404) 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/openapi.yaml +1 -291
  5. package/package.json +1 -1
  6. package/src/__tests__/always-loaded-tools-guard.test.ts +10 -18
  7. package/src/__tests__/app-compiler.test.ts +0 -6
  8. package/src/__tests__/app-control-tool-schemas.test.ts +2 -5
  9. package/src/__tests__/app-dir-path-guard.test.ts +3 -1
  10. package/src/__tests__/app-source-watcher.test.ts +218 -0
  11. package/src/{calls/__tests__ → __tests__}/call-controller.test.ts +82 -503
  12. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +2 -5
  13. package/src/__tests__/computer-use-tools.test.ts +5 -17
  14. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  15. package/src/__tests__/config-schema.test.ts +29 -28
  16. package/src/__tests__/config-watcher-skill-reseed.test.ts +359 -0
  17. package/src/__tests__/config-watcher.test.ts +8 -23
  18. package/src/__tests__/connection-model-compat.test.ts +2 -2
  19. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  20. package/src/__tests__/conversation-pairing.test.ts +0 -26
  21. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -4
  22. package/src/__tests__/conversation-queue.test.ts +207 -48
  23. package/src/__tests__/conversation-retry-discard.test.ts +1 -54
  24. package/src/__tests__/conversation-skill-tools.test.ts +0 -27
  25. package/src/__tests__/conversation-surfaces-app-control.test.ts +3 -8
  26. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -67
  27. package/src/__tests__/conversation-title-service.test.ts +10 -14
  28. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +5 -3
  29. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -51
  30. package/src/__tests__/credential-record-retire.test.ts +1 -171
  31. package/src/__tests__/credential-routes.test.ts +3 -212
  32. package/src/__tests__/credential-security-invariants.test.ts +1 -2
  33. package/src/__tests__/cu-unified-flow.test.ts +2 -8
  34. package/src/__tests__/drain-kick-guard.test.ts +2 -0
  35. package/src/__tests__/drain-requeue-on-contention.test.ts +6 -0
  36. package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
  37. package/src/__tests__/host-bash-proxy.test.ts +45 -26
  38. package/src/__tests__/host-browser-proxy.test.ts +17 -6
  39. package/src/__tests__/host-file-proxy-targeted.test.ts +0 -23
  40. package/src/__tests__/host-file-proxy.test.ts +23 -11
  41. package/src/__tests__/host-transfer-proxy-targeted.test.ts +9 -30
  42. package/src/__tests__/llm-catalog-parity.test.ts +0 -25
  43. package/src/__tests__/mcp-auth-routes.test.ts +9 -6
  44. package/src/__tests__/mcp-config-secret-boundary.test.ts +136 -78
  45. package/src/__tests__/mcp-health-check.test.ts +11 -8
  46. package/src/__tests__/mcp-list-plugin-servers.test.ts +10 -8
  47. package/src/{calls/__tests__ → __tests__}/media-stream-audio-transcode.test.ts +1 -1
  48. package/src/{calls/__tests__ → __tests__}/media-stream-output.test.ts +8 -37
  49. package/src/{calls/__tests__ → __tests__}/media-stream-parser.test.ts +1 -1
  50. package/src/{calls/__tests__ → __tests__}/media-stream-server-integration.test.ts +57 -150
  51. package/src/{calls/__tests__ → __tests__}/media-stream-stt-session.test.ts +5 -5
  52. package/src/{calls/__tests__ → __tests__}/media-turn-detector.test.ts +1 -1
  53. package/src/__tests__/messages-after-tiebreaker.test.ts +0 -91
  54. package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
  55. package/src/__tests__/messaging-send-tool.test.ts +548 -355
  56. package/src/__tests__/model-intents.test.ts +0 -3
  57. package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
  58. package/src/__tests__/platform-client-verify-credential.test.ts +0 -2
  59. package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -13
  60. package/src/__tests__/script-proxy-certs.test.ts +0 -35
  61. package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
  62. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  63. package/src/__tests__/speaker-identification.test.ts +56 -0
  64. package/src/__tests__/subagent-tool-gate-mode.test.ts +3 -19
  65. package/src/__tests__/subagent-tools.test.ts +2 -3
  66. package/src/__tests__/telephony-tts-guard.test.ts +3 -38
  67. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -4
  68. package/src/{calls/__tests__/voice-session-bridge-turn-flow.test.ts → __tests__/voice-session-bridge.test.ts} +12 -20
  69. package/src/__tests__/watch-retro-tool-availability.test.ts +17 -8
  70. package/src/__tests__/workspace-git-service.test.ts +0 -26
  71. package/src/acp/__tests__/agent-process.test.ts +4 -258
  72. package/src/acp/__tests__/auth-required.test.ts +0 -96
  73. package/src/acp/__tests__/client-handler.test.ts +2 -90
  74. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -5
  75. package/src/acp/__tests__/session-manager-resume.test.ts +6 -270
  76. package/src/acp/__tests__/session-manager-usage.test.ts +2 -4
  77. package/src/acp/__tests__/session-manager.test.ts +4 -895
  78. package/src/acp/agent-process.test.ts +1 -4
  79. package/src/acp/agent-process.ts +9 -94
  80. package/src/acp/auth-required.ts +1 -50
  81. package/src/acp/auto-install.test.ts +7 -9
  82. package/src/acp/client-handler.ts +3 -16
  83. package/src/acp/resolve-agent.test.ts +6 -220
  84. package/src/acp/resolve-agent.ts +23 -88
  85. package/src/acp/session-manager.test.ts +3 -196
  86. package/src/acp/session-manager.ts +18 -441
  87. package/src/acp/types.ts +5 -50
  88. package/src/api/events/app-files-changed.ts +3 -4
  89. package/src/api/index.ts +0 -6
  90. package/src/apps/app-store.ts +1 -1
  91. package/src/bundler/app-compiler.ts +0 -15
  92. package/src/calls/__tests__/voice-control-protocol.test.ts +25 -58
  93. package/src/calls/__tests__/voice-session-bridge.test.ts +1 -37
  94. package/src/calls/__tests__/voice-triage-escalate.test.ts +0 -105
  95. package/src/calls/call-constants.ts +4 -24
  96. package/src/calls/call-controller.ts +199 -499
  97. package/src/calls/call-transport.ts +0 -16
  98. package/src/calls/media-stream-output.ts +0 -32
  99. package/src/calls/media-stream-server.ts +30 -82
  100. package/src/calls/media-stream-stt-session.ts +0 -15
  101. package/src/calls/resolve-call-tts-provider.ts +2 -33
  102. package/src/calls/speaker-identification.ts +233 -0
  103. package/src/calls/tts-call-strategy.ts +5 -9
  104. package/src/calls/types.ts +0 -2
  105. package/src/calls/voice-control-protocol.ts +21 -53
  106. package/src/calls/voice-session-bridge.ts +46 -59
  107. package/src/calls/voice-triage-escalate.ts +56 -175
  108. package/src/cli/commands/apps.help.ts +13 -67
  109. package/src/cli/commands/apps.ts +0 -183
  110. package/src/cli/commands/channels/index.help.ts +2 -70
  111. package/src/cli/commands/channels/index.ts +3 -16
  112. package/src/cli/commands/credentials.help.ts +2 -6
  113. package/src/cli/commands/credentials.ts +2 -2
  114. package/src/cli/commands/mcp.help.ts +8 -8
  115. package/src/cli/commands/mcp.ts +1 -1
  116. package/src/cli/commands/roadmap.help.ts +1 -5
  117. package/src/cli/commands/roadmap.ts +1 -1
  118. package/src/cli/lib/bundled-marketplace.json +90 -103
  119. package/src/config/__tests__/default-profile-catalog.test.ts +0 -22
  120. package/src/config/__tests__/memory-retrospective-schema.test.ts +1 -15
  121. package/src/config/__tests__/platform-rehydration.test.ts +0 -93
  122. package/src/config/acp-defaults.test.ts +3 -13
  123. package/src/config/acp-defaults.ts +6 -23
  124. package/src/config/acp-schema.ts +2 -30
  125. package/src/config/bundled-skills/acp/SKILL.md +14 -22
  126. package/src/config/bundled-skills/acp/TOOLS.json +1 -5
  127. package/src/config/bundled-skills/app-builder/SKILL.md +9 -12
  128. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
  129. package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
  130. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +139 -67
  131. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
  132. package/src/config/bundled-skills/screen-annotation/SKILL.md +1 -8
  133. package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +1 -4
  134. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  135. package/src/config/default-profile-catalog.ts +1 -1
  136. package/src/config/env.ts +2 -2
  137. package/src/config/feature-flag-registry.json +12 -8
  138. package/src/config/memory-v3-gate.test.ts +0 -31
  139. package/src/config/memory-v3-gate.ts +16 -20
  140. package/src/config/platform-rehydration.ts +21 -75
  141. package/src/config/schema.ts +2 -2
  142. package/src/config/schemas/__tests__/live-voice.test.ts +158 -8
  143. package/src/config/schemas/calls.ts +28 -1
  144. package/src/config/schemas/live-voice.ts +173 -1
  145. package/src/config/schemas/mcp.ts +1 -1
  146. package/src/config/schemas/memory-retrospective.ts +0 -10
  147. package/src/config/schemas/skills.ts +14 -0
  148. package/src/credential-execution/process-manager.test.ts +19 -18
  149. package/src/daemon/__tests__/conversation-tool-setup.test.ts +121 -66
  150. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +1 -4
  151. package/src/daemon/app-source-watcher.ts +218 -0
  152. package/src/daemon/config-watcher.ts +194 -13
  153. package/src/daemon/conversation-process.ts +64 -35
  154. package/src/daemon/conversation-skill-tools.ts +31 -13
  155. package/src/daemon/conversation-store.ts +1 -1
  156. package/src/daemon/conversation-surfaces.ts +8 -10
  157. package/src/daemon/conversation-tool-setup.ts +43 -37
  158. package/src/daemon/conversation.ts +3 -0
  159. package/src/daemon/host-bash-proxy.ts +12 -8
  160. package/src/daemon/host-browser-proxy.ts +1 -15
  161. package/src/daemon/host-file-proxy.ts +10 -8
  162. package/src/daemon/host-transfer-proxy.ts +18 -14
  163. package/src/daemon/lifecycle.ts +5 -0
  164. package/src/daemon/mcp-reload-service.ts +5 -5
  165. package/src/daemon/message-types/sync.ts +0 -1
  166. package/src/daemon/providers-setup.ts +1 -1
  167. package/src/daemon/shutdown-handlers.ts +9 -1
  168. package/src/daemon/skill-memory-refresh.ts +0 -64
  169. package/src/daemon/tool-side-effects.ts +18 -7
  170. package/src/hooks/types.ts +0 -33
  171. package/src/inbound/platform-callback-registration.ts +5 -4
  172. package/src/live-voice/__tests__/live-voice-metrics.test.ts +3 -0
  173. package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
  174. package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
  175. package/src/{calls → live-voice}/__tests__/progress-narration.test.ts +4 -4
  176. package/src/{calls → live-voice}/__tests__/progress-phrases.test.ts +1 -1
  177. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +69 -13
  178. package/src/live-voice/live-voice-session.ts +693 -213
  179. package/src/{calls → live-voice}/progress-narration.ts +2 -2
  180. package/src/live-voice/protocol.ts +2 -0
  181. package/src/mcp/__tests__/effective-config.test.ts +2 -2
  182. package/src/mcp/effective-config.ts +3 -3
  183. package/src/mcp/mcp-header-store.ts +45 -29
  184. package/src/mcp/startup.ts +4 -8
  185. package/src/messaging/provider.ts +3 -10
  186. package/src/messaging/providers/callback-routing.ts +0 -18
  187. package/src/messaging/providers/channel-transport.ts +0 -56
  188. package/src/messaging/providers/discord/transport.ts +0 -17
  189. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +17 -6
  190. package/src/messaging/providers/slack/adapter.ts +44 -7
  191. package/src/messaging/providers/slack/transport.ts +0 -16
  192. package/src/messaging/providers/telegram-bot/adapter.ts +48 -1
  193. package/src/messaging/providers/telegram-bot/client.ts +26 -0
  194. package/src/messaging/providers/telegram-bot/transport.ts +0 -20
  195. package/src/messaging/providers/whatsapp/adapter.ts +48 -1
  196. package/src/messaging/providers/whatsapp/client.ts +29 -0
  197. package/src/messaging/providers/whatsapp/transport.ts +0 -18
  198. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +0 -8
  199. package/src/notifications/__tests__/assistant-reply-producer.test.ts +0 -55
  200. package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
  201. package/src/notifications/assistant-reply-producer.ts +3 -8
  202. package/src/notifications/conversation-pairing.ts +16 -36
  203. package/src/notifications/delivered-post-record.ts +1 -11
  204. package/src/notifications/home-feed-side-effect.ts +7 -55
  205. package/src/outbound-proxy/certs.ts +5 -3
  206. package/src/permissions/checker.test.ts +6 -11
  207. package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
  208. package/src/persistence/conversation-crud.ts +63 -71
  209. package/src/persistence/conversation-lineage.ts +4 -12
  210. package/src/persistence/conversation-title-service.ts +26 -9
  211. package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
  212. package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
  213. package/src/persistence/message-reads.ts +0 -30
  214. package/src/persistence/migrations/157-invite-contact-id.ts +6 -18
  215. package/src/persistence/schema/memory-core.ts +0 -5
  216. package/src/platform/client.test.ts +0 -2
  217. package/src/platform/client.ts +10 -2
  218. package/src/plugin-api/constants.ts +0 -2
  219. package/src/plugin-api/index.ts +0 -1
  220. package/src/plugin-api/types.ts +0 -2
  221. package/src/plugins/defaults/index.ts +0 -2
  222. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +0 -46
  223. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +5 -9
  224. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +10 -20
  225. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -219
  226. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +0 -31
  227. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -63
  228. package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +0 -4
  229. package/src/plugins/defaults/memory/graph/capability-seed.ts +6 -4
  230. package/src/plugins/defaults/memory/hooks/init.ts +0 -10
  231. package/src/plugins/defaults/memory/hooks/shutdown.ts +0 -2
  232. package/src/plugins/defaults/memory/jobs-worker.ts +0 -13
  233. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +60 -34
  234. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -3
  235. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -12
  236. package/src/plugins/defaults/memory/memory-retrospective-state.ts +71 -312
  237. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +1 -2
  238. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +3 -5
  239. package/src/plugins/defaults/memory/startup.ts +1 -6
  240. package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +9 -7
  241. package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
  242. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +0 -89
  243. package/src/plugins/defaults/memory/worker.ts +0 -6
  244. package/src/plugins/mcp-servers.ts +75 -15
  245. package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
  246. package/src/providers/gemini/client.ts +23 -9
  247. package/src/providers/model-catalog.ts +0 -34
  248. package/src/providers/model-intents.ts +5 -10
  249. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +18 -146
  250. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +1 -83
  251. package/src/providers/openai/chat-completions-provider.ts +78 -192
  252. package/src/providers/openai/codex-models.ts +4 -0
  253. package/src/runtime/AGENTS.md +0 -2
  254. package/src/runtime/auth/same-actor.ts +3 -38
  255. package/src/runtime/http-server.ts +151 -160
  256. package/src/runtime/routes/__tests__/acp-routes.test.ts +4 -159
  257. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -108
  258. package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +12 -16
  259. package/src/runtime/routes/acp-routes.test.ts +0 -15
  260. package/src/runtime/routes/acp-routes.ts +9 -72
  261. package/src/runtime/routes/app-management-routes.ts +0 -73
  262. package/src/runtime/routes/app-routes.ts +1 -1
  263. package/src/runtime/routes/conversation-list-routes.ts +3 -14
  264. package/src/runtime/routes/conversation-query-routes.ts +0 -40
  265. package/src/runtime/routes/credential-routes.ts +10 -19
  266. package/src/runtime/routes/diagnostics-routes.ts +3 -55
  267. package/src/runtime/routes/index.ts +0 -4
  268. package/src/runtime/routes/log-export-routes.ts +0 -2
  269. package/src/runtime/routes/mcp-auth-routes.ts +47 -39
  270. package/src/runtime/routes/migration-routes.ts +21 -8
  271. package/src/runtime/routes/platform-routes.ts +15 -18
  272. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -28
  273. package/src/runtime/services/conversation-serializer.ts +3 -16
  274. package/src/runtime/sync/resource-sync-events.ts +1 -2
  275. package/src/schedule/worker.ts +1 -1
  276. package/src/security/ces-rpc-record-backend.ts +0 -7
  277. package/src/subagent/consult-context.ts +25 -12
  278. package/src/tools/acp/list-agents.test.ts +1 -3
  279. package/src/tools/acp/spawn.test.ts +11 -146
  280. package/src/tools/acp/spawn.ts +3 -21
  281. package/src/tools/acp/status.ts +3 -40
  282. package/src/tools/app-control/skill-proxy-bridge.ts +1 -2
  283. package/src/tools/capability-offer.test.ts +2 -22
  284. package/src/tools/capability-offer.ts +1 -16
  285. package/src/tools/computer-use/definitions.ts +2 -4
  286. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -2
  287. package/src/tools/credentials/metadata-store.ts +0 -100
  288. package/src/tools/host-filesystem/edit.test.ts +1 -2
  289. package/src/tools/host-filesystem/edit.ts +2 -2
  290. package/src/tools/host-filesystem/read.test.ts +1 -2
  291. package/src/tools/host-filesystem/read.ts +2 -2
  292. package/src/tools/host-filesystem/transfer.test.ts +1 -2
  293. package/src/tools/host-filesystem/transfer.ts +2 -2
  294. package/src/tools/host-filesystem/write.test.ts +1 -2
  295. package/src/tools/host-filesystem/write.ts +2 -2
  296. package/src/tools/host-terminal/host-shell.test.ts +0 -16
  297. package/src/tools/host-terminal/host-shell.ts +20 -4
  298. package/src/tools/policy-context.ts +7 -6
  299. package/src/tools/subagent/spawn.ts +8 -5
  300. package/src/tools/watch/watch-retro-report.ts +8 -0
  301. package/src/util/__tests__/language-subtag.test.ts +1 -23
  302. package/src/util/fs-watcher-error.ts +36 -0
  303. package/src/util/language-subtag.ts +0 -16
  304. package/src/util/platform.ts +0 -8
  305. package/src/workspace/git-service.ts +54 -5
  306. package/src/workspace/migrations/registry.ts +0 -6
  307. package/scripts/smoke-desktop-window-theme.ts +0 -186
  308. package/src/__tests__/git-porcelain.test.ts +0 -47
  309. package/src/__tests__/helpers/set-workspace-mcp.ts +0 -11
  310. package/src/__tests__/message-deleted-hook-dispatch.test.ts +0 -119
  311. package/src/__tests__/resolve-app.test.ts +0 -135
  312. package/src/__tests__/source-fingerprint.test.ts +0 -184
  313. package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +0 -336
  314. package/src/acp/__tests__/helpers/acp-model-option.ts +0 -51
  315. package/src/acp/model-config.test.ts +0 -166
  316. package/src/acp/model-config.ts +0 -138
  317. package/src/api/events/acp-session-model-update.test.ts +0 -88
  318. package/src/api/events/acp-session-model-update.ts +0 -46
  319. package/src/apps/resolve-app.ts +0 -81
  320. package/src/apps/source-fingerprint.ts +0 -266
  321. package/src/calls/__tests__/barge-in-guard.test.ts +0 -81
  322. package/src/calls/__tests__/voice-leg-coordinator.test.ts +0 -229
  323. package/src/calls/__tests__/voice-progress-cadence.test.ts +0 -274
  324. package/src/calls/barge-in-guard.ts +0 -118
  325. package/src/calls/voice-leg-coordinator.ts +0 -189
  326. package/src/calls/voice-progress-cadence.ts +0 -423
  327. package/src/cli/commands/__tests__/apps.test.ts +0 -245
  328. package/src/cli/commands/__tests__/roadmap.help.test.ts +0 -19
  329. package/src/cli/commands/channels/__tests__/send.test.ts +0 -218
  330. package/src/cli/commands/channels/send.ts +0 -128
  331. package/src/config/__tests__/platform-identity.test.ts +0 -117
  332. package/src/config/acp-agent-write.ts +0 -43
  333. package/src/config/acp-schema.test.ts +0 -81
  334. package/src/config/platform-identity.ts +0 -144
  335. package/src/config/schemas/__tests__/voice.test.ts +0 -148
  336. package/src/config/schemas/voice.ts +0 -150
  337. package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +0 -133
  338. package/src/daemon/app-change-notify.ts +0 -45
  339. package/src/desktop/__tests__/fake-desktop.ts +0 -119
  340. package/src/desktop/desktop-chrome-policy.test.ts +0 -71
  341. package/src/desktop/desktop-chrome-policy.ts +0 -42
  342. package/src/desktop/desktop-dependencies.test.ts +0 -102
  343. package/src/desktop/desktop-dependencies.ts +0 -306
  344. package/src/desktop/desktop-feature.test.ts +0 -18
  345. package/src/desktop/desktop-feature.ts +0 -19
  346. package/src/desktop/desktop-panel-config.test.ts +0 -135
  347. package/src/desktop/desktop-panel-config.ts +0 -149
  348. package/src/desktop/desktop-session-manager.test.ts +0 -627
  349. package/src/desktop/desktop-session-manager.ts +0 -814
  350. package/src/desktop/desktop-stream-bridge.test.ts +0 -395
  351. package/src/desktop/desktop-stream-bridge.ts +0 -214
  352. package/src/desktop/desktop-wallpaper.test.ts +0 -191
  353. package/src/desktop/desktop-wallpaper.ts +0 -113
  354. package/src/desktop/desktop-window-theme.ts +0 -170
  355. package/src/i18n/AGENTS.md +0 -22
  356. package/src/i18n/__tests__/i18n.test.ts +0 -108
  357. package/src/i18n/index.ts +0 -16
  358. package/src/i18n/locales.ts +0 -93
  359. package/src/i18n/messages.ts +0 -61
  360. package/src/i18n/title.ts +0 -25
  361. package/src/mcp/__tests__/workspace-mcp-config.test.ts +0 -135
  362. package/src/mcp/spec-schema.ts +0 -111
  363. package/src/mcp/workspace-mcp-config.ts +0 -188
  364. package/src/messaging/providers/__tests__/proactive-address.test.ts +0 -95
  365. package/src/persistence/conversation-title-placeholders.ts +0 -23
  366. package/src/persistence/message-cursor.ts +0 -78
  367. package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +0 -149
  368. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +0 -118
  369. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +0 -83
  370. package/src/plugins/defaults/memory/hooks/message-deleted.ts +0 -21
  371. package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +0 -126
  372. package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +0 -79
  373. package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +0 -28
  374. package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +0 -9
  375. package/src/providers/gemini-thought-signature.test.ts +0 -63
  376. package/src/providers/gemini-thought-signature.ts +0 -44
  377. package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +0 -613
  378. package/src/providers/openai/__tests__/google-thought-signature.test.ts +0 -235
  379. package/src/providers/openai/google-thought-signature.ts +0 -320
  380. package/src/runtime/__tests__/channel-send.test.ts +0 -443
  381. package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +0 -89
  382. package/src/runtime/__tests__/live-voice-upgrade.test.ts +0 -58
  383. package/src/runtime/__tests__/runtime-ws-test-utils.ts +0 -72
  384. package/src/runtime/__tests__/watch-stream-upgrade.test.ts +0 -59
  385. package/src/runtime/channel-send.ts +0 -316
  386. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +0 -205
  387. package/src/runtime/routes/__tests__/channel-send-routes.test.ts +0 -127
  388. package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +0 -107
  389. package/src/runtime/routes/channel-send-routes.ts +0 -85
  390. package/src/runtime/routes/desktop-setup-routes.test.ts +0 -74
  391. package/src/runtime/routes/desktop-setup-routes.ts +0 -35
  392. package/src/security/__tests__/ces-http-record-backend.test.ts +0 -137
  393. package/src/security/ces-http-record-backend.ts +0 -120
  394. package/src/skills/__tests__/workspace-skill-md-signature.test.ts +0 -60
  395. package/src/skills/workspace-skill-md-signature.ts +0 -50
  396. package/src/tools/acp/status.test.ts +0 -94
  397. package/src/util/ca-bundle.ts +0 -13
  398. package/src/workspace/git-porcelain.ts +0 -66
  399. package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +0 -258
  400. package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +0 -78
  401. package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +0 -214
  402. package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +0 -102
  403. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +0 -199
  404. /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
- });
@@ -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
@@ -43,7 +43,7 @@ import {
43
43
  deleteCredentialMetadata,
44
44
  getCredentialMetadata,
45
45
  getCredentialMetadataById,
46
- listCredentialRecordsLive,
46
+ listCredentialMetadata,
47
47
  } from "../../tools/credentials/metadata-store.js";
48
48
  import type { CredentialInjectionTemplate } from "../../tools/credentials/policy-types.js";
49
49
  import {
@@ -228,9 +228,6 @@ function assertNotPlatformManaged(
228
228
  }
229
229
  }
230
230
 
231
- const CREDENTIAL_STORE_UNREACHABLE =
232
- "Credential store is unreachable. Retry in a moment, or check that the credential vault is running.";
233
-
234
231
  // ---------------------------------------------------------------------------
235
232
  // Handlers
236
233
  // ---------------------------------------------------------------------------
@@ -238,14 +235,9 @@ const CREDENTIAL_STORE_UNREACHABLE =
238
235
  async function handleCredentialsList({ body }: RouteHandlerArgs) {
239
236
  const search = (body as { search?: string } | undefined)?.search;
240
237
 
241
- const live = await listCredentialRecordsLive();
242
- if (live.unreachable) {
243
- throw new InternalError(CREDENTIAL_STORE_UNREACHABLE);
244
- }
245
-
246
238
  // Platform-provisioned credentials are not the user's to act on, so they
247
239
  // never become a Settings row (and never a click-to-reveal).
248
- let allMetadata = live.records.filter(
240
+ let allMetadata = listCredentialMetadata().filter(
249
241
  (m) => !isPlatformManagedCredential(m.service, m.field),
250
242
  );
251
243
 
@@ -280,12 +272,7 @@ async function handleCredentialsList({ body }: RouteHandlerArgs) {
280
272
 
281
273
  const credentials = await Promise.all(
282
274
  allMetadata.map(async (m) => {
283
- const { value: secret, unreachable } = await getSecureKeyResultAsync(
284
- credentialKey(m.service, m.field),
285
- );
286
- if (unreachable) {
287
- throw new InternalError(CREDENTIAL_STORE_UNREACHABLE);
288
- }
275
+ const secret = await getSecureKeyAsync(credentialKey(m.service, m.field));
289
276
  const connection = connectionsByProvider.get(m.service);
290
277
  return buildCredentialOutput(m, secret, connection);
291
278
  }),
@@ -323,7 +310,9 @@ async function handleCredentialsInspect({ body }: RouteHandlerArgs) {
323
310
 
324
311
  if (!lookup.metadata && (secret == null || secret.length === 0)) {
325
312
  if (unreachable) {
326
- throw new InternalError(CREDENTIAL_STORE_UNREACHABLE);
313
+ throw new InternalError(
314
+ "Credential store is unreachable — ensure the assistant is running",
315
+ );
327
316
  }
328
317
  throw new BadRequestError("Credential not found");
329
318
  }
@@ -385,7 +374,9 @@ async function handleCredentialsReveal({ body, headers }: RouteHandlerArgs) {
385
374
 
386
375
  if (secret == null || secret.length === 0) {
387
376
  if (unreachable) {
388
- throw new InternalError(CREDENTIAL_STORE_UNREACHABLE);
377
+ throw new InternalError(
378
+ "Credential store is unreachable — ensure the assistant is running",
379
+ );
389
380
  }
390
381
  throw new BadRequestError("Credential not found");
391
382
  }
@@ -629,7 +620,7 @@ export const ROUTES: RouteDefinition[] = [
629
620
  },
630
621
  summary: "List all credentials with metadata",
631
622
  description:
632
- "Return credentials from the live credential vault, with OAuth connection info and platform-managed credentials. Fails if the vault is unreachable.",
623
+ "Return all stored credentials with metadata, OAuth connection info, and platform-managed credentials.",
633
624
  tags: ["credentials"],
634
625
  requestBody: z.object({
635
626
  search: z.string().optional().describe("Filter by substring match"),