@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
@@ -194,10 +194,7 @@ describe("AcpAgentProcess.createSession auth_required handling", () => {
194
194
  },
195
195
  });
196
196
 
197
- await expect(proc.createSession("/tmp")).resolves.toEqual({
198
- sessionId: "session-1",
199
- configOptions: [],
200
- });
197
+ await expect(proc.createSession("/tmp")).resolves.toBe("session-1");
201
198
  expect(authenticateCalls()).toBe(1);
202
199
  });
203
200
 
@@ -6,7 +6,6 @@
6
6
  */
7
7
 
8
8
  import { type ChildProcess, spawn } from "node:child_process";
9
- import { basename } from "node:path";
10
9
  import { Readable, Writable } from "node:stream";
11
10
 
12
11
  import type {
@@ -15,24 +14,14 @@ import type {
15
14
  AuthMethodEnvVar,
16
15
  Client,
17
16
  InitializeResponse,
18
- LoadSessionResponse,
19
17
  NewSessionResponse,
20
18
  PromptResponse,
21
- ResumeSessionResponse,
22
- SessionConfigOption,
23
- SetSessionConfigOptionRequest,
24
19
  } from "@agentclientprotocol/sdk";
25
20
  import * as acp from "@agentclientprotocol/sdk";
26
21
 
27
22
  import { getLogger } from "../util/logger.js";
28
- import {
29
- AcpAuthRequiredError,
30
- CLAUDE_ACP_COMMAND,
31
- isAcpAuthRequired,
32
- isClaudeAuthFailureMessage,
33
- requestErrorReason,
34
- } from "./auth-required.js";
35
- import { type AcpAgentConfig, AcpConfigOptionRefusedError } from "./types.js";
23
+ import { AcpAuthRequiredError, isAcpAuthRequired } from "./auth-required.js";
24
+ import type { AcpAgentConfig } from "./types.js";
36
25
 
37
26
  const log = getLogger("acp");
38
27
 
@@ -43,16 +32,6 @@ const log = getLogger("acp");
43
32
  */
44
33
  const STDERR_RETENTION_BYTES = 4096;
45
34
 
46
- /**
47
- * Normalizes the SDK's optional-and-nullable config-option field to an array,
48
- * so every session call hands its caller the same shape.
49
- */
50
- function normalizeConfigOptions(
51
- configOptions: SessionConfigOption[] | null | undefined,
52
- ): SessionConfigOption[] {
53
- return configOptions ?? [];
54
- }
55
-
56
35
  function isEnvVarMethod(
57
36
  method: AuthMethod,
58
37
  ): method is AuthMethodEnvVar & { type: "env_var" } {
@@ -376,21 +355,16 @@ export class AcpAgentProcess {
376
355
 
377
356
  /**
378
357
  * Creates a new ACP session in the specified working directory.
379
- * Returns the session ID and the config options the agent reported.
358
+ * Returns the session ID.
380
359
  */
381
- async createSession(
382
- cwd: string,
383
- ): Promise<{ sessionId: string; configOptions: SessionConfigOption[] }> {
360
+ async createSession(cwd: string): Promise<string> {
384
361
  log.info({ agentId: this.agentId, cwd }, "Creating ACP session");
385
362
 
386
363
  const result: NewSessionResponse = await this.withAuthRetry(() =>
387
364
  this.requireConnection().newSession({ cwd, mcpServers: [] }),
388
365
  );
389
366
 
390
- return {
391
- sessionId: result.sessionId,
392
- configOptions: normalizeConfigOptions(result.configOptions),
393
- };
367
+ return result.sessionId;
394
368
  }
395
369
 
396
370
  /**
@@ -401,17 +375,12 @@ export class AcpAgentProcess {
401
375
  * callers should suppress forwarding of those replayed updates (see
402
376
  * VellumAcpClientHandler.beginReplaySuppression).
403
377
  */
404
- async loadSession(
405
- sessionId: string,
406
- cwd: string,
407
- ): Promise<{ configOptions: SessionConfigOption[] }> {
378
+ async loadSession(sessionId: string, cwd: string): Promise<void> {
408
379
  log.info({ agentId: this.agentId, sessionId, cwd }, "Loading ACP session");
409
380
 
410
- const result: LoadSessionResponse = await this.withAuthRetry(() =>
381
+ await this.withAuthRetry(() =>
411
382
  this.requireConnection().loadSession({ sessionId, cwd, mcpServers: [] }),
412
383
  );
413
-
414
- return { configOptions: normalizeConfigOptions(result.configOptions) };
415
384
  }
416
385
 
417
386
  /**
@@ -421,70 +390,16 @@ export class AcpAgentProcess {
421
390
  * preferred when the agent advertises the capability
422
391
  * (see supportsSessionResume).
423
392
  */
424
- async resumeSession(
425
- sessionId: string,
426
- cwd: string,
427
- ): Promise<{ configOptions: SessionConfigOption[] }> {
393
+ async resumeSession(sessionId: string, cwd: string): Promise<void> {
428
394
  log.info({ agentId: this.agentId, sessionId, cwd }, "Resuming ACP session");
429
395
 
430
- const result: ResumeSessionResponse = await this.withAuthRetry(() =>
396
+ await this.withAuthRetry(() =>
431
397
  this.requireConnection().resumeSession({
432
398
  sessionId,
433
399
  cwd,
434
400
  mcpServers: [],
435
401
  }),
436
402
  );
437
-
438
- return { configOptions: normalizeConfigOptions(result.configOptions) };
439
- }
440
-
441
- /**
442
- * Sets one session config option (e.g. the model selector) via
443
- * `session/set_config_option`. The agent answers with the full refreshed
444
- * option set, which is returned to the caller.
445
- *
446
- * A boolean value sends the `type: "boolean"` request variant; a string
447
- * sends the value-id variant.
448
- */
449
- async setConfigOption(
450
- sessionId: string,
451
- configId: string,
452
- value: string | boolean,
453
- ): Promise<SessionConfigOption[]> {
454
- log.info(
455
- { agentId: this.agentId, sessionId, configId, value },
456
- "Setting ACP session config option",
457
- );
458
-
459
- const request: SetSessionConfigOptionRequest =
460
- typeof value === "boolean"
461
- ? { sessionId, configId, type: "boolean", value }
462
- : { sessionId, configId, value };
463
-
464
- const response = await this.withAuthRetry(async () => {
465
- try {
466
- return await this.requireConnection().setSessionConfigOption(request);
467
- } catch (err) {
468
- // Wrapped here, at the request itself, so `withAuthRetry` still sees
469
- // an auth_required answer and a caller cannot confuse the adapter's
470
- // refusal with a transport or authentication failure. Claude's
471
- // expired-token failure travels as a generic error whose reason is
472
- // the only signal, so under the Claude adapter it is left for the
473
- // caller to classify.
474
- if (err instanceof acp.RequestError && !isAcpAuthRequired(err)) {
475
- const reason = requestErrorReason(err);
476
- const claudeAuthFailure =
477
- basename(this.config.command) === CLAUDE_ACP_COMMAND &&
478
- isClaudeAuthFailureMessage(reason);
479
- if (!claudeAuthFailure) {
480
- throw new AcpConfigOptionRefusedError(reason);
481
- }
482
- }
483
- throw err;
484
- }
485
- });
486
-
487
- return normalizeConfigOptions(response.configOptions);
488
403
  }
489
404
 
490
405
  /**
@@ -8,8 +8,7 @@
8
8
  * 2. Credentials present but rejected (the expired/revoked case): the CLI
9
9
  * surfaces the API 401 as an error message it authors, and the adapter
10
10
  * relays it as a generic -32603 internal error, NOT as `auth_required`.
11
- * {@link isClaudeAuthFailureMessage}, over the text
12
- * {@link requestErrorReason} decodes out of the rejection.
11
+ * {@link isClaudeAuthFailureMessage}.
13
12
  *
14
13
  * A positive detection becomes {@link ACP_CLAUDE_AUTH_REQUIRED_CODE} on the
15
14
  * `acp_auth_required` event, which the client turns into the inline
@@ -82,54 +81,6 @@ export function isClaudeAuthFailureMessage(
82
81
  );
83
82
  }
84
83
 
85
- /** Messages the SDK's `RequestError` factories build when given no text. */
86
- const GENERIC_RPC_MESSAGES: ReadonlySet<string> = new Set([
87
- "Parse error",
88
- "Invalid request",
89
- "Invalid params",
90
- "Internal error",
91
- "Request cancelled",
92
- "Authentication required",
93
- "Resource not found",
94
- ]);
95
-
96
- /**
97
- * The sentence behind a JSON-RPC rejection. An adapter that throws a plain
98
- * Error reaches the client as a bare "Internal error" whose real text the
99
- * agent-side SDK moved into `data.details`. An adapter that raises
100
- * `RequestError.internalError(data, text)` keeps its words in the message and
101
- * only supplemental context in `data`, so a specific message wins. Behind a
102
- * generic message such as "Invalid params", `data.details` or the serialized
103
- * payload supplies the reason instead. Duck-typed like
104
- * {@link isAcpAuthRequired}:
105
- * `message` is read as a property, so a rejection that arrives as a plain
106
- * object off the wire decodes the same as an `Error` instance.
107
- */
108
- export function requestErrorReason(err: unknown): string {
109
- if (typeof err !== "object" || err === null) {
110
- return String(err);
111
- }
112
- const { data, message } = err as { data?: unknown; message?: unknown };
113
- const own = typeof message === "string" ? message : String(err);
114
- if (data == null) {
115
- return own;
116
- }
117
- if (
118
- typeof message === "string" &&
119
- message.length > 0 &&
120
- !GENERIC_RPC_MESSAGES.has(message)
121
- ) {
122
- return message;
123
- }
124
- const details = (data as { details?: unknown }).details;
125
- if (typeof details === "string" && details.length > 0) {
126
- return details;
127
- }
128
- // JSON.stringify answers undefined for a value it cannot represent.
129
- const serialized: string | undefined = JSON.stringify(data);
130
- return serialized ?? own;
131
- }
132
-
133
84
  /** The adapter whose auth failures the Connect Claude flow can repair. */
134
85
  export const CLAUDE_ACP_COMMAND = "claude-agent-acp";
135
86
 
@@ -78,7 +78,7 @@ describe("ensureAdapterInstalled", () => {
78
78
  expect(args).toEqual([
79
79
  "add",
80
80
  "--global",
81
- "@agentclientprotocol/claude-agent-acp@0.75.1",
81
+ "@agentclientprotocol/claude-agent-acp",
82
82
  ]);
83
83
  });
84
84
 
@@ -198,8 +198,8 @@ describe("ensureAdapterInstalled", () => {
198
198
  (call) => (call[1] as string[])[2],
199
199
  );
200
200
  expect(installedPackages.sort()).toEqual([
201
- "@agentclientprotocol/claude-agent-acp@0.75.1",
202
- "@agentclientprotocol/codex-acp@1.10.0",
201
+ "@agentclientprotocol/claude-agent-acp",
202
+ "@agentclientprotocol/codex-acp",
203
203
  ]);
204
204
  });
205
205
  });
@@ -232,7 +232,7 @@ describe("resolveAgentWithAutoInstall - resolution order", () => {
232
232
  // The resolved command is the REAL binary, not a `bun x` wrapper.
233
233
  expect(result.resolved.agent.command).toBe("claude-agent-acp");
234
234
  expect(result.autoInstalledPackage).toBe(
235
- "@agentclientprotocol/claude-agent-acp@0.75.1",
235
+ "@agentclientprotocol/claude-agent-acp",
236
236
  );
237
237
  expect(result.failureMessage).toBeUndefined();
238
238
  expect(execFileMock).toHaveBeenCalledTimes(1);
@@ -264,14 +264,12 @@ describe("resolveAgentWithAutoInstall - resolution order", () => {
264
264
  return;
265
265
  }
266
266
  expect(result.resolved.agent.command).toBe("codex-acp");
267
- expect(result.autoInstalledPackage).toBe(
268
- "@agentclientprotocol/codex-acp@1.10.0",
269
- );
267
+ expect(result.autoInstalledPackage).toBe("@agentclientprotocol/codex-acp");
270
268
  expect(execFileMock).toHaveBeenCalledTimes(1);
271
269
  expect(execFileMock.mock.calls[0][1]).toEqual([
272
270
  "add",
273
271
  "--global",
274
- "@agentclientprotocol/codex-acp@1.10.0",
272
+ "@agentclientprotocol/codex-acp",
275
273
  ]);
276
274
  });
277
275
 
@@ -297,7 +295,7 @@ describe("resolveAgentWithAutoInstall - resolution order", () => {
297
295
  expect(result.resolved.ok).toBe(false);
298
296
  expect(result.failureMessage).toContain("claude-agent-acp is not on PATH");
299
297
  expect(result.failureMessage).toContain(
300
- "bun add -g @agentclientprotocol/claude-agent-acp@0.75.1",
298
+ "bun add -g @agentclientprotocol/claude-agent-acp",
301
299
  );
302
300
  expect(result.failureMessage).toContain("network is down");
303
301
  for (const call of execFileMock.mock.calls) {
@@ -21,7 +21,6 @@ import type {
21
21
  ReleaseTerminalResponse,
22
22
  RequestPermissionRequest,
23
23
  RequestPermissionResponse,
24
- SessionConfigOption,
25
24
  SessionNotification,
26
25
  TerminalOutputRequest,
27
26
  TerminalOutputResponse,
@@ -104,9 +103,6 @@ export class VellumAcpClientHandler implements Client {
104
103
  private readonly acpSessionId: string,
105
104
  private readonly sendToVellum: (msg: AssistantEvent) => void,
106
105
  private readonly parentConversationId: string,
107
- private readonly onConfigOptions?: (
108
- configOptions: SessionConfigOption[],
109
- ) => void,
110
106
  ) {}
111
107
 
112
108
  /** Forwards an update to Vellum, stamping a contiguous per-session `seq`. */
@@ -186,12 +182,7 @@ export class VellumAcpClientHandler implements Client {
186
182
  async sessionUpdate(params: SessionNotification): Promise<void> {
187
183
  const update = params.update;
188
184
 
189
- // Config options are current state rather than transcript history, so they
190
- // are applied even while a replay is being suppressed.
191
- if (
192
- this.suppressForwarding &&
193
- update.sessionUpdate !== "config_option_update"
194
- ) {
185
+ if (this.suppressForwarding) {
195
186
  log.debug(
196
187
  { acpSessionId: this.acpSessionId, updateType: update.sessionUpdate },
197
188
  "Dropping replayed session update during suppression",
@@ -295,14 +286,10 @@ export class VellumAcpClientHandler implements Client {
295
286
  break;
296
287
  }
297
288
 
298
- case "config_option_update": {
299
- this.onConfigOptions?.(update.configOptions);
300
- break;
301
- }
302
-
303
289
  default: {
304
290
  // Other update types (available_commands_update, current_mode_update,
305
- // session_info_update) are not forwarded to Vellum.
291
+ // config_option_update, session_info_update) are not forwarded to
292
+ // Vellum.
306
293
  log.debug(
307
294
  {
308
295
  acpSessionId: this.acpSessionId,
@@ -56,9 +56,7 @@ describe("resolveAcpAgent", () => {
56
56
  return;
57
57
  }
58
58
  expect(result.agent.command).toBe("codex-acp");
59
- expect(result.agent.description).toContain(
60
- "@agentclientprotocol/codex-acp",
61
- );
59
+ expect(result.agent.description).toContain("@agentclientprotocol/codex-acp");
62
60
  });
63
61
 
64
62
  test("falls back to default profile for claude when no user entry", () => {
@@ -193,7 +191,7 @@ describe("resolveAcpAgent", () => {
193
191
  return;
194
192
  }
195
193
  expect(result.hint).toBe(
196
- "bun add -g @agentclientprotocol/claude-agent-acp@0.75.1",
194
+ "bun add -g @agentclientprotocol/claude-agent-acp",
197
195
  );
198
196
  expect(result.command).toBe("claude-agent-acp");
199
197
  });
@@ -242,9 +240,7 @@ describe("resolveAcpAgent", () => {
242
240
  if (result.reason !== "binary_not_found") {
243
241
  return;
244
242
  }
245
- expect(result.hint).toBe(
246
- "bun add -g @agentclientprotocol/codex-acp@1.10.0",
247
- );
243
+ expect(result.hint).toBe("bun add -g @agentclientprotocol/codex-acp");
248
244
  });
249
245
 
250
246
  test("binary preflight honors agent.env.PATH override (matches spawn env)", () => {
@@ -289,178 +285,6 @@ describe("resolveAcpAgent", () => {
289
285
  expect(result.agent.args).toEqual(["--verbose"]);
290
286
  });
291
287
 
292
- test("the bundled claude profile carries its model", () => {
293
- config.setConfig({ agents: {} });
294
-
295
- const result = resolveAcpAgent("claude");
296
-
297
- expect(result.ok).toBe(true);
298
- if (!result.ok) {
299
- return;
300
- }
301
- expect(result.agent.model).toBe("opus");
302
- });
303
-
304
- test("a user entry that names a model overrides the bundled one", () => {
305
- config.setConfig({
306
- agents: {
307
- claude: { command: "claude-agent-acp", args: [], model: "sonnet" },
308
- },
309
- });
310
-
311
- const result = resolveAcpAgent("claude");
312
-
313
- expect(result.ok).toBe(true);
314
- if (!result.ok) {
315
- return;
316
- }
317
- expect(result.agent.model).toBe("sonnet");
318
- });
319
-
320
- test("a user entry keeping the profile command and omitting model inherits it", () => {
321
- config.setConfig({
322
- agents: {
323
- claude: { command: "claude-agent-acp", args: ["--my-flag"] },
324
- },
325
- });
326
-
327
- const result = resolveAcpAgent("claude");
328
-
329
- expect(result.ok).toBe(true);
330
- if (!result.ok) {
331
- return;
332
- }
333
- expect(result.agent.args).toEqual(["--my-flag"]);
334
- expect(result.agent.model).toBe("opus");
335
- });
336
-
337
- test("a user entry that omits command entirely still inherits the model", () => {
338
- // The schema admits a command-less entry for a bundled id; the profile's
339
- // command is inherited with the rest.
340
- config.setConfig({
341
- agents: {
342
- claude: JSON.parse('{"args": ["--my-flag"]}'),
343
- },
344
- });
345
-
346
- const result = resolveAcpAgent("claude");
347
-
348
- expect(result.ok).toBe(true);
349
- if (!result.ok) {
350
- return;
351
- }
352
- expect(result.agent.command).toBe("claude-agent-acp");
353
- expect(result.agent.model).toBe("opus");
354
- });
355
-
356
- test("a user entry running the profile adapter by full path still inherits the model", () => {
357
- config.setConfig({
358
- agents: {
359
- claude: { command: "/opt/bin/claude-agent-acp", args: [] },
360
- },
361
- });
362
-
363
- const result = resolveAcpAgent("claude");
364
-
365
- expect(result.ok).toBe(true);
366
- if (!result.ok) {
367
- return;
368
- }
369
- expect(result.agent.command).toBe("/opt/bin/claude-agent-acp");
370
- expect(result.agent.model).toBe("opus");
371
- });
372
-
373
- test("a user entry pointing the id at another adapter inherits no model", () => {
374
- // The bundled aliases are Claude's own vocabulary, so an unrelated
375
- // adapter under the `claude` id must not be handed `opus`.
376
- config.setConfig({
377
- agents: {
378
- claude: { command: "my-custom-claude", args: ["--my-flag"] },
379
- },
380
- });
381
-
382
- const result = resolveAcpAgent("claude");
383
-
384
- expect(result.ok).toBe(true);
385
- if (!result.ok) {
386
- return;
387
- }
388
- expect(result.agent.command).toBe("my-custom-claude");
389
- expect(result.agent.model).toBeUndefined();
390
- });
391
-
392
- test("a user entry naming its own model keeps it across a replaced command", () => {
393
- config.setConfig({
394
- agents: {
395
- claude: {
396
- command: "my-custom-claude",
397
- args: [],
398
- model: "my-fork-large",
399
- },
400
- },
401
- });
402
-
403
- const result = resolveAcpAgent("claude");
404
-
405
- expect(result.ok).toBe(true);
406
- if (!result.ok) {
407
- return;
408
- }
409
- expect(result.agent.command).toBe("my-custom-claude");
410
- expect(result.agent.model).toBe("my-fork-large");
411
- });
412
-
413
- test("a user entry pointing the id at another adapter inherits no description", () => {
414
- config.setConfig({
415
- agents: {
416
- claude: { command: "my-custom-claude", args: [] },
417
- },
418
- });
419
-
420
- const result = resolveAcpAgent("claude");
421
-
422
- expect(result.ok).toBe(true);
423
- if (!result.ok) {
424
- return;
425
- }
426
- expect(result.agent.description).toBeUndefined();
427
- const listed = listAcpAgents().agents.find(
428
- (entry) => entry.id === "claude",
429
- );
430
- expect(listed?.command).toBe("my-custom-claude");
431
- expect(listed?.description).toBeUndefined();
432
- });
433
-
434
- test("a user entry running the profile adapter by full path inherits its description", () => {
435
- config.setConfig({
436
- agents: {
437
- claude: { command: "/opt/bin/claude-agent-acp", args: [] },
438
- },
439
- });
440
-
441
- const result = resolveAcpAgent("claude");
442
-
443
- expect(result.ok).toBe(true);
444
- if (!result.ok) {
445
- return;
446
- }
447
- expect(result.agent.description).toContain(
448
- "@agentclientprotocol/claude-agent-acp",
449
- );
450
- });
451
-
452
- test("a bundled profile with no model leaves the resolved agent without one", () => {
453
- config.setConfig({ agents: {} });
454
-
455
- const result = resolveAcpAgent("codex");
456
-
457
- expect(result.ok).toBe(true);
458
- if (!result.ok) {
459
- return;
460
- }
461
- expect(result.agent.model).toBeUndefined();
462
- });
463
-
464
288
  test("resolves a full-path command directly without rewriting it", () => {
465
289
  config.setConfig({
466
290
  agents: {
@@ -508,7 +332,7 @@ describe("resolveAcpAgent - missing binary", () => {
508
332
  }
509
333
  expect(result.command).toBe("claude-agent-acp");
510
334
  expect(result.hint).toBe(
511
- "bun add -g @agentclientprotocol/claude-agent-acp@0.75.1",
335
+ "bun add -g @agentclientprotocol/claude-agent-acp",
512
336
  );
513
337
  });
514
338
 
@@ -527,7 +351,7 @@ describe("resolveAcpAgent - missing binary", () => {
527
351
  return;
528
352
  }
529
353
  expect(result.hint).toBe(
530
- "bun add -g @agentclientprotocol/claude-agent-acp@0.75.1",
354
+ "bun add -g @agentclientprotocol/claude-agent-acp",
531
355
  );
532
356
  });
533
357
  });
@@ -606,9 +430,7 @@ describe("listAcpAgents", () => {
606
430
  const codex = result.agents.find((a) => a.id === "codex");
607
431
  expect(codex?.available).toBe(false);
608
432
  expect(codex?.unavailableReason).toBe("'codex-acp' is not on PATH");
609
- expect(codex?.setupHint).toBe(
610
- "bun add -g @agentclientprotocol/codex-acp@1.10.0",
611
- );
433
+ expect(codex?.setupHint).toBe("bun add -g @agentclientprotocol/codex-acp");
612
434
  });
613
435
 
614
436
  test("aliases are resolution sugar, not catalog entries", () => {
@@ -667,39 +489,3 @@ describe("listAcpAgents", () => {
667
489
  );
668
490
  });
669
491
  });
670
-
671
- describe("agent ids that name Object.prototype members", () => {
672
- // An id read off the prototype chain would resolve as a configured agent
673
- // that does not exist, and a spawn would start a process for a config
674
- // nobody wrote.
675
- for (const id of ["__proto__", "constructor", "prototype"]) {
676
- test(`"${id}" resolves to nothing`, () => {
677
- config.setConfig({ agents: {} });
678
-
679
- const resolved = resolveAcpAgent(id);
680
- expect(resolved.ok).toBe(false);
681
- if (resolved.ok) {
682
- return;
683
- }
684
- expect(resolved.reason).toBe("unknown_agent");
685
- if (resolved.reason !== "unknown_agent") {
686
- return;
687
- }
688
- expect(resolved.available).toEqual(["claude", "codex"]);
689
- });
690
- }
691
-
692
- test("the catalog never lists one, even when config carries the key", () => {
693
- config.setConfig({
694
- agents: {
695
- ...JSON.parse('{"__proto__": {"command": "evil", "args": []}}'),
696
- claude: { command: "claude-agent-acp", args: [] },
697
- },
698
- });
699
-
700
- expect(listAcpAgents().agents.map((a) => a.id)).toEqual([
701
- "claude",
702
- "codex",
703
- ]);
704
- });
705
- });