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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/AGENTS.md +0 -4
  2. package/ARCHITECTURE.md +12 -11
  3. package/docs/architecture/turn-actor.md +8 -15
  4. package/docs/guardian-request-flow.md +0 -16
  5. package/openapi.yaml +49 -291
  6. package/package.json +1 -1
  7. package/src/__tests__/always-loaded-tools-guard.test.ts +10 -18
  8. package/src/__tests__/app-compiler.test.ts +0 -6
  9. package/src/__tests__/app-control-tool-schemas.test.ts +2 -5
  10. package/src/__tests__/app-dir-path-guard.test.ts +3 -1
  11. package/src/__tests__/app-source-watcher.test.ts +218 -0
  12. package/src/{calls/__tests__ → __tests__}/call-controller.test.ts +82 -503
  13. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +2 -5
  14. package/src/__tests__/computer-use-tools.test.ts +5 -17
  15. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  16. package/src/__tests__/config-schema.test.ts +29 -28
  17. package/src/__tests__/config-watcher-skill-reseed.test.ts +359 -0
  18. package/src/__tests__/config-watcher.test.ts +8 -23
  19. package/src/__tests__/connection-model-compat.test.ts +2 -2
  20. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  21. package/src/__tests__/conversation-pairing.test.ts +0 -26
  22. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -4
  23. package/src/__tests__/conversation-queue.test.ts +207 -48
  24. package/src/__tests__/conversation-retry-discard.test.ts +1 -54
  25. package/src/__tests__/conversation-skill-tools.test.ts +0 -27
  26. package/src/__tests__/conversation-surfaces-app-control.test.ts +3 -8
  27. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -67
  28. package/src/__tests__/conversation-title-service.test.ts +10 -14
  29. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +5 -3
  30. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -51
  31. package/src/__tests__/credential-record-retire.test.ts +1 -171
  32. package/src/__tests__/credential-routes.test.ts +3 -212
  33. package/src/__tests__/credential-security-invariants.test.ts +2 -4
  34. package/src/__tests__/cu-unified-flow.test.ts +2 -8
  35. package/src/__tests__/document-sync-tags.test.ts +0 -25
  36. package/src/__tests__/drain-kick-guard.test.ts +2 -0
  37. package/src/__tests__/drain-requeue-on-contention.test.ts +6 -0
  38. package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
  39. package/src/__tests__/host-bash-proxy.test.ts +45 -26
  40. package/src/__tests__/host-browser-proxy.test.ts +17 -6
  41. package/src/__tests__/host-file-proxy-targeted.test.ts +0 -23
  42. package/src/__tests__/host-file-proxy.test.ts +23 -11
  43. package/src/__tests__/host-transfer-proxy-targeted.test.ts +9 -30
  44. package/src/__tests__/llm-catalog-parity.test.ts +0 -25
  45. package/src/__tests__/mcp-auth-routes.test.ts +9 -6
  46. package/src/__tests__/mcp-config-secret-boundary.test.ts +136 -78
  47. package/src/__tests__/mcp-health-check.test.ts +11 -8
  48. package/src/__tests__/mcp-list-plugin-servers.test.ts +10 -8
  49. package/src/{calls/__tests__ → __tests__}/media-stream-audio-transcode.test.ts +1 -1
  50. package/src/{calls/__tests__ → __tests__}/media-stream-output.test.ts +8 -37
  51. package/src/{calls/__tests__ → __tests__}/media-stream-parser.test.ts +1 -1
  52. package/src/{calls/__tests__ → __tests__}/media-stream-server-integration.test.ts +57 -150
  53. package/src/{calls/__tests__ → __tests__}/media-stream-stt-session.test.ts +5 -5
  54. package/src/{calls/__tests__ → __tests__}/media-turn-detector.test.ts +1 -1
  55. package/src/__tests__/messages-after-tiebreaker.test.ts +0 -91
  56. package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
  57. package/src/__tests__/messaging-send-tool.test.ts +548 -355
  58. package/src/__tests__/model-intents.test.ts +0 -3
  59. package/src/__tests__/notification-vellum-adapter.test.ts +2 -85
  60. package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
  61. package/src/__tests__/platform-callback-registration.test.ts +16 -8
  62. package/src/__tests__/platform-client-verify-credential.test.ts +0 -2
  63. package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -13
  64. package/src/__tests__/script-proxy-certs.test.ts +0 -35
  65. package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
  66. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  67. package/src/__tests__/speaker-identification.test.ts +56 -0
  68. package/src/__tests__/subagent-tool-gate-mode.test.ts +3 -19
  69. package/src/__tests__/subagent-tools.test.ts +2 -3
  70. package/src/__tests__/telephony-tts-guard.test.ts +3 -38
  71. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -4
  72. package/src/{calls/__tests__/voice-session-bridge-turn-flow.test.ts → __tests__/voice-session-bridge.test.ts} +12 -20
  73. package/src/__tests__/watch-retro-tool-availability.test.ts +17 -8
  74. package/src/__tests__/workspace-git-service.test.ts +0 -26
  75. package/src/acp/__tests__/agent-process.test.ts +4 -258
  76. package/src/acp/__tests__/auth-required.test.ts +0 -96
  77. package/src/acp/__tests__/client-handler.test.ts +2 -90
  78. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -5
  79. package/src/acp/__tests__/session-manager-resume.test.ts +6 -270
  80. package/src/acp/__tests__/session-manager-usage.test.ts +2 -4
  81. package/src/acp/__tests__/session-manager.test.ts +4 -895
  82. package/src/acp/agent-process.test.ts +1 -4
  83. package/src/acp/agent-process.ts +9 -94
  84. package/src/acp/auth-required.ts +1 -50
  85. package/src/acp/auto-install.test.ts +7 -9
  86. package/src/acp/client-handler.ts +3 -16
  87. package/src/acp/resolve-agent.test.ts +6 -220
  88. package/src/acp/resolve-agent.ts +23 -88
  89. package/src/acp/session-manager.test.ts +3 -196
  90. package/src/acp/session-manager.ts +18 -441
  91. package/src/acp/types.ts +5 -50
  92. package/src/api/events/app-files-changed.ts +3 -4
  93. package/src/api/events/notification-intent.ts +0 -2
  94. package/src/api/index.ts +0 -6
  95. package/src/apps/app-store.ts +1 -1
  96. package/src/bundler/app-compiler.ts +0 -15
  97. package/src/calls/__tests__/voice-control-protocol.test.ts +25 -58
  98. package/src/calls/__tests__/voice-session-bridge.test.ts +1 -37
  99. package/src/calls/__tests__/voice-triage-escalate.test.ts +0 -105
  100. package/src/calls/call-constants.ts +4 -24
  101. package/src/calls/call-controller.ts +199 -499
  102. package/src/calls/call-transport.ts +0 -16
  103. package/src/calls/media-stream-output.ts +0 -32
  104. package/src/calls/media-stream-server.ts +30 -82
  105. package/src/calls/media-stream-stt-session.ts +0 -15
  106. package/src/calls/resolve-call-tts-provider.ts +2 -33
  107. package/src/calls/speaker-identification.ts +233 -0
  108. package/src/calls/tts-call-strategy.ts +5 -9
  109. package/src/calls/types.ts +0 -2
  110. package/src/calls/voice-control-protocol.ts +21 -53
  111. package/src/calls/voice-session-bridge.ts +46 -59
  112. package/src/calls/voice-triage-escalate.ts +56 -175
  113. package/src/cli/commands/apps.help.ts +13 -67
  114. package/src/cli/commands/apps.ts +0 -183
  115. package/src/cli/commands/bash.help.ts +13 -8
  116. package/src/cli/commands/bash.ts +25 -7
  117. package/src/cli/commands/channels/index.help.ts +2 -70
  118. package/src/cli/commands/channels/index.ts +3 -16
  119. package/src/cli/commands/credentials.help.ts +2 -6
  120. package/src/cli/commands/credentials.ts +2 -2
  121. package/src/cli/commands/mcp.help.ts +8 -8
  122. package/src/cli/commands/mcp.ts +1 -1
  123. package/src/cli/commands/roadmap.help.ts +1 -5
  124. package/src/cli/commands/roadmap.ts +1 -1
  125. package/src/cli/lib/bundled-marketplace.json +90 -103
  126. package/src/config/__tests__/default-profile-catalog.test.ts +0 -22
  127. package/src/config/__tests__/memory-retrospective-schema.test.ts +1 -15
  128. package/src/config/__tests__/platform-rehydration.test.ts +9 -99
  129. package/src/config/acp-defaults.test.ts +3 -13
  130. package/src/config/acp-defaults.ts +6 -23
  131. package/src/config/acp-schema.ts +2 -30
  132. package/src/config/bundled-skills/acp/SKILL.md +14 -22
  133. package/src/config/bundled-skills/acp/TOOLS.json +1 -5
  134. package/src/config/bundled-skills/app-builder/SKILL.md +9 -12
  135. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
  136. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  137. package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
  138. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +139 -67
  139. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
  140. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  141. package/src/config/bundled-skills/screen-annotation/SKILL.md +1 -8
  142. package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +1 -4
  143. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  144. package/src/config/default-profile-catalog.ts +1 -1
  145. package/src/config/env.ts +2 -2
  146. package/src/config/feature-flag-registry.json +12 -24
  147. package/src/config/loader.ts +0 -1
  148. package/src/config/memory-v3-gate.test.ts +0 -31
  149. package/src/config/memory-v3-gate.ts +16 -20
  150. package/src/config/platform-rehydration.ts +27 -11
  151. package/src/config/schema.ts +2 -2
  152. package/src/config/schemas/__tests__/live-voice.test.ts +158 -8
  153. package/src/config/schemas/calls.ts +28 -1
  154. package/src/config/schemas/live-voice.ts +173 -1
  155. package/src/config/schemas/mcp.ts +1 -1
  156. package/src/config/schemas/memory-retrospective.ts +0 -10
  157. package/src/config/schemas/services.ts +0 -8
  158. package/src/config/schemas/skills.ts +14 -0
  159. package/src/credential-execution/process-manager.test.ts +19 -18
  160. package/src/daemon/__tests__/conversation-tool-setup.test.ts +121 -66
  161. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +1 -4
  162. package/src/daemon/app-source-watcher.ts +218 -0
  163. package/src/daemon/config-watcher.ts +194 -13
  164. package/src/daemon/conversation-process.ts +64 -35
  165. package/src/daemon/conversation-skill-tools.ts +31 -13
  166. package/src/daemon/conversation-store.ts +1 -1
  167. package/src/daemon/conversation-surfaces.ts +8 -10
  168. package/src/daemon/conversation-tool-setup.ts +43 -37
  169. package/src/daemon/conversation.ts +3 -0
  170. package/src/daemon/host-bash-proxy.ts +12 -8
  171. package/src/daemon/host-browser-proxy.ts +1 -15
  172. package/src/daemon/host-file-proxy.ts +10 -8
  173. package/src/daemon/host-transfer-proxy.ts +18 -14
  174. package/src/daemon/lifecycle.ts +5 -0
  175. package/src/daemon/mcp-reload-service.ts +5 -5
  176. package/src/daemon/message-types/sync.ts +0 -1
  177. package/src/daemon/orphan-reaper.ts +1 -1
  178. package/src/daemon/providers-setup.ts +1 -1
  179. package/src/daemon/shutdown-handlers.ts +9 -1
  180. package/src/daemon/skill-memory-refresh.ts +0 -64
  181. package/src/daemon/tool-side-effects.ts +18 -7
  182. package/src/home/__tests__/feed-writer.test.ts +0 -22
  183. package/src/home/feed-writer.ts +2 -11
  184. package/src/hooks/types.ts +0 -33
  185. package/src/inbound/platform-callback-registration.ts +5 -4
  186. package/src/live-voice/__tests__/live-voice-metrics.test.ts +3 -0
  187. package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
  188. package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
  189. package/src/{calls → live-voice}/__tests__/progress-narration.test.ts +4 -4
  190. package/src/{calls → live-voice}/__tests__/progress-phrases.test.ts +1 -1
  191. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +69 -13
  192. package/src/live-voice/live-voice-session.ts +693 -213
  193. package/src/{calls → live-voice}/progress-narration.ts +2 -2
  194. package/src/live-voice/protocol.ts +2 -0
  195. package/src/mcp/__tests__/effective-config.test.ts +2 -2
  196. package/src/mcp/effective-config.ts +3 -3
  197. package/src/mcp/mcp-header-store.ts +45 -29
  198. package/src/mcp/startup.ts +4 -8
  199. package/src/messaging/provider.ts +3 -10
  200. package/src/messaging/providers/callback-routing.ts +0 -18
  201. package/src/messaging/providers/channel-transport.ts +0 -56
  202. package/src/messaging/providers/discord/transport.ts +0 -17
  203. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +17 -6
  204. package/src/messaging/providers/slack/adapter.ts +44 -7
  205. package/src/messaging/providers/slack/transport.ts +0 -16
  206. package/src/messaging/providers/telegram-bot/adapter.ts +48 -1
  207. package/src/messaging/providers/telegram-bot/client.ts +26 -0
  208. package/src/messaging/providers/telegram-bot/transport.ts +0 -20
  209. package/src/messaging/providers/whatsapp/adapter.ts +48 -1
  210. package/src/messaging/providers/whatsapp/client.ts +29 -0
  211. package/src/messaging/providers/whatsapp/transport.ts +0 -18
  212. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +0 -8
  213. package/src/notifications/__tests__/assistant-reply-producer.test.ts +0 -55
  214. package/src/notifications/__tests__/guardian-feed-projection.test.ts +2 -158
  215. package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
  216. package/src/notifications/__tests__/schedule-result-producer.test.ts +3 -99
  217. package/src/notifications/adapters/macos.ts +0 -3
  218. package/src/notifications/assistant-reply-producer.ts +3 -8
  219. package/src/notifications/conversation-pairing.ts +16 -36
  220. package/src/notifications/delivered-post-record.ts +1 -11
  221. package/src/notifications/guardian-feed-projection.ts +5 -125
  222. package/src/notifications/home-feed-side-effect.ts +7 -55
  223. package/src/notifications/schedule-result-producer.ts +22 -66
  224. package/src/oauth/__tests__/seed-providers-managed.test.ts +0 -54
  225. package/src/oauth/byo-connection.test.ts +0 -45
  226. package/src/oauth/byo-connection.ts +6 -36
  227. package/src/oauth/connection-resolver.test.ts +0 -73
  228. package/src/oauth/connection-resolver.ts +2 -95
  229. package/src/oauth/seed-providers.ts +0 -165
  230. package/src/outbound-proxy/certs.ts +5 -3
  231. package/src/permissions/checker.test.ts +6 -11
  232. package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
  233. package/src/persistence/conversation-crud.ts +63 -71
  234. package/src/persistence/conversation-lineage.ts +4 -12
  235. package/src/persistence/conversation-title-service.ts +26 -9
  236. package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
  237. package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
  238. package/src/persistence/message-reads.ts +0 -30
  239. package/src/persistence/migrations/157-invite-contact-id.ts +6 -18
  240. package/src/persistence/schema/memory-core.ts +0 -5
  241. package/src/platform/client.test.ts +2 -4
  242. package/src/platform/client.ts +10 -2
  243. package/src/plugin-api/constants.ts +0 -2
  244. package/src/plugin-api/index.ts +0 -1
  245. package/src/plugin-api/types.ts +0 -2
  246. package/src/plugins/defaults/index.ts +0 -2
  247. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +0 -46
  248. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +5 -9
  249. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +10 -20
  250. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -219
  251. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +0 -31
  252. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -63
  253. package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +0 -4
  254. package/src/plugins/defaults/memory/graph/capability-seed.ts +6 -4
  255. package/src/plugins/defaults/memory/hooks/init.ts +0 -10
  256. package/src/plugins/defaults/memory/hooks/shutdown.ts +0 -2
  257. package/src/plugins/defaults/memory/jobs-worker.ts +0 -13
  258. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +60 -34
  259. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -3
  260. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -12
  261. package/src/plugins/defaults/memory/memory-retrospective-state.ts +71 -312
  262. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +1 -2
  263. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +3 -5
  264. package/src/plugins/defaults/memory/startup.ts +1 -6
  265. package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +9 -7
  266. package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
  267. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +0 -89
  268. package/src/plugins/defaults/memory/worker.ts +0 -6
  269. package/src/plugins/mcp-servers.ts +75 -15
  270. package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
  271. package/src/providers/gemini/client.ts +23 -9
  272. package/src/providers/inference/auth.ts +3 -2
  273. package/src/providers/inference/connection-availability.ts +8 -27
  274. package/src/providers/inference/resolve-auth.ts +4 -22
  275. package/src/providers/model-catalog.ts +0 -34
  276. package/src/providers/model-intents.ts +5 -10
  277. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +18 -146
  278. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +1 -83
  279. package/src/providers/openai/chat-completions-provider.ts +78 -192
  280. package/src/providers/openai/codex-models.ts +4 -0
  281. package/src/runtime/AGENTS.md +0 -2
  282. package/src/runtime/auth/same-actor.ts +3 -38
  283. package/src/runtime/http-server.ts +151 -160
  284. package/src/runtime/routes/__tests__/acp-routes.test.ts +4 -159
  285. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -108
  286. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +2 -2
  287. package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +12 -16
  288. package/src/runtime/routes/acp-routes.test.ts +0 -15
  289. package/src/runtime/routes/acp-routes.ts +9 -72
  290. package/src/runtime/routes/app-management-routes.ts +0 -73
  291. package/src/runtime/routes/app-routes.ts +1 -1
  292. package/src/runtime/routes/conversation-list-routes.ts +3 -14
  293. package/src/runtime/routes/conversation-query-routes.ts +0 -40
  294. package/src/runtime/routes/credential-routes.ts +10 -19
  295. package/src/runtime/routes/debug-bash-routes.ts +173 -0
  296. package/src/runtime/routes/diagnostics-routes.ts +3 -55
  297. package/src/runtime/routes/index.ts +2 -4
  298. package/src/runtime/routes/log-export-routes.ts +0 -2
  299. package/src/runtime/routes/mcp-auth-routes.ts +47 -39
  300. package/src/runtime/routes/migration-routes.ts +20 -6
  301. package/src/runtime/routes/platform-routes.ts +15 -18
  302. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -28
  303. package/src/runtime/services/conversation-serializer.ts +3 -16
  304. package/src/runtime/sync/resource-sync-events.ts +1 -2
  305. package/src/schedule/worker.ts +1 -1
  306. package/src/security/ces-rpc-record-backend.ts +0 -7
  307. package/src/subagent/consult-context.ts +25 -12
  308. package/src/tools/acp/list-agents.test.ts +1 -3
  309. package/src/tools/acp/spawn.test.ts +11 -146
  310. package/src/tools/acp/spawn.ts +3 -21
  311. package/src/tools/acp/status.ts +3 -40
  312. package/src/tools/app-control/skill-proxy-bridge.ts +1 -2
  313. package/src/tools/capability-offer.test.ts +2 -22
  314. package/src/tools/capability-offer.ts +1 -16
  315. package/src/tools/computer-use/definitions.ts +2 -4
  316. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -2
  317. package/src/tools/credentials/metadata-store.ts +0 -100
  318. package/src/tools/host-filesystem/edit.test.ts +1 -2
  319. package/src/tools/host-filesystem/edit.ts +2 -2
  320. package/src/tools/host-filesystem/read.test.ts +1 -2
  321. package/src/tools/host-filesystem/read.ts +2 -2
  322. package/src/tools/host-filesystem/transfer.test.ts +1 -2
  323. package/src/tools/host-filesystem/transfer.ts +2 -2
  324. package/src/tools/host-filesystem/write.test.ts +1 -2
  325. package/src/tools/host-filesystem/write.ts +2 -2
  326. package/src/tools/host-terminal/host-shell.test.ts +0 -16
  327. package/src/tools/host-terminal/host-shell.ts +20 -4
  328. package/src/tools/policy-context.ts +7 -6
  329. package/src/tools/subagent/spawn.ts +8 -5
  330. package/src/tools/watch/watch-retro-report.ts +8 -0
  331. package/src/util/__tests__/language-subtag.test.ts +1 -23
  332. package/src/util/fs-watcher-error.ts +36 -0
  333. package/src/util/language-subtag.ts +0 -16
  334. package/src/util/platform.ts +0 -8
  335. package/src/workspace/git-service.ts +54 -5
  336. package/src/workspace/migrations/registry.ts +0 -6
  337. package/scripts/smoke-desktop-window-theme.ts +0 -186
  338. package/src/__tests__/git-porcelain.test.ts +0 -47
  339. package/src/__tests__/helpers/set-workspace-mcp.ts +0 -11
  340. package/src/__tests__/message-deleted-hook-dispatch.test.ts +0 -119
  341. package/src/__tests__/resolve-app.test.ts +0 -135
  342. package/src/__tests__/service-account-token.test.ts +0 -247
  343. package/src/__tests__/source-fingerprint.test.ts +0 -184
  344. package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +0 -336
  345. package/src/acp/__tests__/helpers/acp-model-option.ts +0 -51
  346. package/src/acp/model-config.test.ts +0 -166
  347. package/src/acp/model-config.ts +0 -138
  348. package/src/api/events/acp-session-model-update.test.ts +0 -88
  349. package/src/api/events/acp-session-model-update.ts +0 -46
  350. package/src/apps/resolve-app.ts +0 -81
  351. package/src/apps/source-fingerprint.ts +0 -266
  352. package/src/calls/__tests__/barge-in-guard.test.ts +0 -81
  353. package/src/calls/__tests__/voice-leg-coordinator.test.ts +0 -229
  354. package/src/calls/__tests__/voice-progress-cadence.test.ts +0 -274
  355. package/src/calls/barge-in-guard.ts +0 -118
  356. package/src/calls/voice-leg-coordinator.ts +0 -189
  357. package/src/calls/voice-progress-cadence.ts +0 -423
  358. package/src/cli/commands/__tests__/apps.test.ts +0 -245
  359. package/src/cli/commands/__tests__/bash.test.ts +0 -53
  360. package/src/cli/commands/__tests__/roadmap.help.test.ts +0 -19
  361. package/src/cli/commands/channels/__tests__/send.test.ts +0 -218
  362. package/src/cli/commands/channels/send.ts +0 -128
  363. package/src/config/__tests__/platform-identity.test.ts +0 -255
  364. package/src/config/acp-agent-write.ts +0 -43
  365. package/src/config/acp-schema.test.ts +0 -81
  366. package/src/config/platform-identity.ts +0 -201
  367. package/src/config/schemas/__tests__/voice.test.ts +0 -148
  368. package/src/config/schemas/voice.ts +0 -150
  369. package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +0 -133
  370. package/src/daemon/app-change-notify.ts +0 -45
  371. package/src/desktop/__tests__/fake-desktop.ts +0 -119
  372. package/src/desktop/desktop-chrome-policy.test.ts +0 -71
  373. package/src/desktop/desktop-chrome-policy.ts +0 -42
  374. package/src/desktop/desktop-dependencies.test.ts +0 -102
  375. package/src/desktop/desktop-dependencies.ts +0 -306
  376. package/src/desktop/desktop-feature.test.ts +0 -18
  377. package/src/desktop/desktop-feature.ts +0 -19
  378. package/src/desktop/desktop-panel-config.test.ts +0 -135
  379. package/src/desktop/desktop-panel-config.ts +0 -149
  380. package/src/desktop/desktop-session-manager.test.ts +0 -627
  381. package/src/desktop/desktop-session-manager.ts +0 -814
  382. package/src/desktop/desktop-stream-bridge.test.ts +0 -395
  383. package/src/desktop/desktop-stream-bridge.ts +0 -214
  384. package/src/desktop/desktop-wallpaper.test.ts +0 -191
  385. package/src/desktop/desktop-wallpaper.ts +0 -113
  386. package/src/desktop/desktop-window-theme.ts +0 -170
  387. package/src/i18n/AGENTS.md +0 -22
  388. package/src/i18n/__tests__/i18n.test.ts +0 -108
  389. package/src/i18n/index.ts +0 -16
  390. package/src/i18n/locales.ts +0 -93
  391. package/src/i18n/messages.ts +0 -61
  392. package/src/i18n/title.ts +0 -25
  393. package/src/mcp/__tests__/workspace-mcp-config.test.ts +0 -135
  394. package/src/mcp/spec-schema.ts +0 -111
  395. package/src/mcp/workspace-mcp-config.ts +0 -188
  396. package/src/messaging/providers/__tests__/proactive-address.test.ts +0 -95
  397. package/src/persistence/conversation-title-placeholders.ts +0 -23
  398. package/src/persistence/message-cursor.ts +0 -78
  399. package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +0 -149
  400. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +0 -118
  401. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +0 -83
  402. package/src/plugins/defaults/memory/hooks/message-deleted.ts +0 -21
  403. package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +0 -126
  404. package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +0 -79
  405. package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +0 -28
  406. package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +0 -9
  407. package/src/providers/gemini-thought-signature.test.ts +0 -63
  408. package/src/providers/gemini-thought-signature.ts +0 -44
  409. package/src/providers/inference/service-account-token.ts +0 -248
  410. package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +0 -613
  411. package/src/providers/openai/__tests__/google-thought-signature.test.ts +0 -235
  412. package/src/providers/openai/google-thought-signature.ts +0 -320
  413. package/src/runtime/__tests__/channel-send.test.ts +0 -443
  414. package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +0 -89
  415. package/src/runtime/__tests__/live-voice-upgrade.test.ts +0 -58
  416. package/src/runtime/__tests__/runtime-ws-test-utils.ts +0 -72
  417. package/src/runtime/__tests__/watch-stream-upgrade.test.ts +0 -59
  418. package/src/runtime/channel-send.ts +0 -316
  419. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +0 -205
  420. package/src/runtime/routes/__tests__/channel-send-routes.test.ts +0 -127
  421. package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +0 -107
  422. package/src/runtime/routes/channel-send-routes.ts +0 -85
  423. package/src/runtime/routes/desktop-setup-routes.test.ts +0 -74
  424. package/src/runtime/routes/desktop-setup-routes.ts +0 -35
  425. package/src/security/__tests__/ces-http-record-backend.test.ts +0 -137
  426. package/src/security/ces-http-record-backend.ts +0 -120
  427. package/src/skills/__tests__/workspace-skill-md-signature.test.ts +0 -60
  428. package/src/skills/workspace-skill-md-signature.ts +0 -50
  429. package/src/tools/acp/status.test.ts +0 -94
  430. package/src/tools/terminal/__tests__/sanitized-bash.test.ts +0 -57
  431. package/src/tools/terminal/sanitized-bash.ts +0 -105
  432. package/src/util/ca-bundle.ts +0 -13
  433. package/src/workspace/git-porcelain.ts +0 -66
  434. package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +0 -258
  435. package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +0 -78
  436. package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +0 -214
  437. package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +0 -102
  438. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +0 -199
  439. /package/src/{calls → live-voice}/progress-phrases.ts +0 -0
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * Shared resolver for ACP agent ids → agent config + binary preflight.
3
3
  *
4
- * `resolveAcpAgent(id)` layers user-provided `config.acp.agents[id]` over the
5
- * bundled `DEFAULT_ACP_AGENT_PROFILES` so common agents like `claude` and
6
- * `codex` Just Work with no per-user config required; `mergeWithProfile` says
7
- * what an entry inherits. Natural names ("claude code", "OpenAI Codex")
8
- * resolve via `AGENT_ID_ALIASES` when the raw id misses both maps. The result
9
- * is a discriminated union covering every reason a spawn might fail before we
10
- * even start the agent process: unknown agent id, or binary missing from
11
- * PATH. Callers (acp_spawn, acp_list_agents, and the `/v1/acp/spawn` HTTP
12
- * route) get a single source of truth and matching actionable hints.
4
+ * `resolveAcpAgent(id)` merges user-provided `config.acp.agents[id]` (wins on
5
+ * overlap) with the bundled `DEFAULT_ACP_AGENT_PROFILES` so common agents like
6
+ * `claude` and `codex` Just Work with no per-user config required. Natural
7
+ * names ("claude code", "OpenAI Codex") resolve via `AGENT_ID_ALIASES` when the
8
+ * raw id misses both maps. The result is a discriminated union covering every
9
+ * reason a spawn might fail before we even start the agent process: unknown
10
+ * agent id, or binary missing from PATH. Callers (acp_spawn, acp_list_agents,
11
+ * and the `/v1/acp/spawn` HTTP route) get a single source of truth and
12
+ * matching actionable hints.
13
13
  *
14
14
  * The resolver NEVER fetches or runs packages in the (untrusted) task cwd.
15
15
  * When the adapter binary is missing, resolution simply fails with
@@ -25,16 +25,12 @@
25
25
  * `available` / `setupHint` derived from the same binary resolution.
26
26
  */
27
27
 
28
- import { basename } from "node:path";
29
-
30
28
  import {
31
- type AcpAgentProfile,
32
29
  DEFAULT_ACP_AGENT_PROFILES,
33
30
  DEFAULT_AGENT_NPM_PACKAGES,
34
31
  } from "../config/acp-defaults.js";
35
- import type { AcpAgentConfig as ConfiguredAcpAgent } from "../config/acp-schema.js";
32
+ import type { AcpAgentConfig } from "../config/acp-schema.js";
36
33
  import { getConfig } from "../config/loader.js";
37
- import type { AcpAgentConfig } from "./types.js";
38
34
 
39
35
  /**
40
36
  * Whether this agent's entry came from user config (wins over default) or
@@ -138,19 +134,6 @@ const AGENT_ID_ALIASES: Record<string, string> = {
138
134
  openaicodex: "codex",
139
135
  };
140
136
 
141
- /**
142
- * Ids that read back as inherited `Object.prototype` members instead of
143
- * configured agents. `directLookup` and `mergedAgentIds` refuse them so an id
144
- * from a tool call or an HTTP body can resolve to nothing but a real entry:
145
- * resolving one would report a configured agent that does not exist, and a
146
- * spawn would then start a process for a config nobody wrote.
147
- */
148
- const PROTOTYPE_SENSITIVE_AGENT_IDS: ReadonlySet<string> = new Set([
149
- "__proto__",
150
- "constructor",
151
- "prototype",
152
- ]);
153
-
154
137
  /**
155
138
  * Normalize a raw agent id for alias matching: lowercase and strip spaces,
156
139
  * underscores, and hyphens so "Claude Code", "claude-code", and
@@ -183,92 +166,45 @@ export function lookupAcpAgentConfig(id: string): AcpAgentConfig | undefined {
183
166
  }
184
167
 
185
168
  function lookupAgent(
186
- userAgents: Record<string, ConfiguredAcpAgent>,
169
+ userAgents: Record<string, AcpAgentConfig>,
187
170
  id: string,
188
- ): { agent: AcpAgentConfig; source: AcpAgentSource; id: string } | undefined {
171
+ ): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
189
172
  const direct = directLookup(userAgents, id);
190
173
  if (direct) {
191
- return { ...direct, id };
174
+ return direct;
192
175
  }
193
- const normalized = normalizeAgentId(id);
194
- const canonicalId = Object.hasOwn(AGENT_ID_ALIASES, normalized)
195
- ? AGENT_ID_ALIASES[normalized]
176
+ const canonicalId = AGENT_ID_ALIASES[normalizeAgentId(id)];
177
+ return canonicalId !== undefined
178
+ ? directLookup(userAgents, canonicalId)
196
179
  : undefined;
197
- if (canonicalId === undefined) {
198
- return undefined;
199
- }
200
- const aliased = directLookup(userAgents, canonicalId);
201
- return aliased ? { ...aliased, id: canonicalId } : undefined;
202
180
  }
203
181
 
204
182
  function directLookup(
205
- userAgents: Record<string, ConfiguredAcpAgent>,
183
+ userAgents: Record<string, AcpAgentConfig>,
206
184
  id: string,
207
185
  ): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
208
- if (PROTOTYPE_SENSITIVE_AGENT_IDS.has(id)) {
209
- return undefined;
210
- }
211
- const userAgent = Object.hasOwn(userAgents, id) ? userAgents[id] : undefined;
212
- const defaultAgent = Object.hasOwn(DEFAULT_ACP_AGENT_PROFILES, id)
213
- ? DEFAULT_ACP_AGENT_PROFILES[id]
214
- : undefined;
186
+ const userAgent = userAgents[id];
215
187
  if (userAgent) {
216
- const agent = mergeWithProfile(userAgent, defaultAgent);
217
- return agent ? { agent, source: "config" } : undefined;
188
+ return { agent: userAgent, source: "config" };
218
189
  }
190
+ const defaultAgent = DEFAULT_ACP_AGENT_PROFILES[id];
219
191
  if (defaultAgent) {
220
192
  return { agent: defaultAgent, source: "default" };
221
193
  }
222
194
  return undefined;
223
195
  }
224
196
 
225
- /**
226
- * Fill a user config entry from the bundled profile for the same id. An entry
227
- * that runs the profile's adapter (it omits `command`, or names the same
228
- * binary, by full path or not) inherits the leaves it leaves out: `command`
229
- * itself, the description, and the `model` a session starts on. `args` is the
230
- * exception, because the schema defaults it to `[]`: a parsed entry always
231
- * carries its own, so the profile's never reaches it. An entry that points
232
- * the id at a different adapter stands alone, like any user-only entry,
233
- * so a config that reuses the `claude` id for something else never carries
234
- * Claude's description or has Claude's `opus` sent to it. Zod omits absent
235
- * optional keys, so an omission never spreads as an undefined override.
236
- *
237
- * `undefined` only for an entry with neither a command nor a profile to take
238
- * one from, a shape the config schema rejects before it gets here.
239
- */
240
- function mergeWithProfile(
241
- userAgent: ConfiguredAcpAgent,
242
- profile: AcpAgentProfile | undefined,
243
- ): AcpAgentConfig | undefined {
244
- const command = userAgent.command;
245
- if (!profile) {
246
- return command === undefined ? undefined : { ...userAgent, command };
247
- }
248
- // A full path to the bundled binary is still the bundled adapter; the
249
- // basename is the adapter's identity everywhere else in this module.
250
- if (
251
- command !== undefined &&
252
- basename(command) !== basename(profile.command)
253
- ) {
254
- return { ...userAgent, command };
255
- }
256
- return { ...profile, ...userAgent, command: command ?? profile.command };
257
- }
258
-
259
197
  /**
260
198
  * Defaults first (declaration order), then user-only ids. Deduplicated so a
261
199
  * user config that overrides a default doesn't list the id twice.
262
200
  */
263
- function mergedAgentIds(
264
- userAgents: Record<string, ConfiguredAcpAgent>,
265
- ): string[] {
201
+ function mergedAgentIds(userAgents: Record<string, AcpAgentConfig>): string[] {
266
202
  return Array.from(
267
203
  new Set([
268
204
  ...Object.keys(DEFAULT_ACP_AGENT_PROFILES),
269
205
  ...Object.keys(userAgents),
270
206
  ]),
271
- ).filter((id) => !PROTOTYPE_SENSITIVE_AGENT_IDS.has(id));
207
+ );
272
208
  }
273
209
 
274
210
  /**
@@ -320,8 +256,7 @@ export function listAcpAgents(): {
320
256
  const config = getConfig();
321
257
  const userAgents = config.acp.agents;
322
258
  const agents: AcpAgentEntry[] = mergedAgentIds(userAgents).map((id) => {
323
- // Non-null: ids come from `mergedAgentIds`, and the schema admits a
324
- // command-less entry only for a bundled id, so the lookup always resolves.
259
+ // Non-null: ids come from `mergedAgentIds` so the lookup always resolves.
325
260
  const { agent, source } = lookupAgent(userAgents, id)!;
326
261
  // Same binary preflight as `resolveAcpAgent`: available iff the command
327
262
  // is on PATH. A missing binary is auto-installed at spawn time, but the
@@ -1,7 +1,5 @@
1
1
  import { afterEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
- import { RequestError } from "@agentclientprotocol/sdk";
4
-
5
3
  import type { Conversation } from "../daemon/conversation.js";
6
4
  import {
7
5
  deleteConversation,
@@ -41,7 +39,6 @@ mock.module("./prepare-agent-env.js", () => ({
41
39
  }));
42
40
 
43
41
  import { createAbortReason } from "../util/abort-reasons.js";
44
- import { modelOption } from "./__tests__/helpers/acp-model-option.js";
45
42
  import { VellumAcpClientHandler } from "./client-handler.js";
46
43
  import { AcpSessionManager } from "./session-manager.js";
47
44
 
@@ -93,10 +90,10 @@ function mockConversation(opts?: { enqueueQueued?: boolean }) {
93
90
  }
94
91
 
95
92
  /** Fake AcpAgentProcess covering only the calls firePromptInBackground makes. */
96
- function fakeProcess(prompt: () => Promise<unknown>, stderr = "") {
93
+ function fakeProcess(prompt: () => Promise<unknown>) {
97
94
  return {
98
95
  markStderr: () => 0,
99
- stderrSince: () => stderr,
96
+ stderrSince: () => "",
100
97
  prompt,
101
98
  kill: mock(() => {}),
102
99
  };
@@ -368,8 +365,6 @@ describe("AcpSessionManager auth-required recovery surface", () => {
368
365
  parentToolUseId?: string;
369
366
  cancelled?: boolean;
370
367
  credentialDigest?: string;
371
- failure?: () => Promise<never>;
372
- stderr?: string;
373
368
  }) {
374
369
  const manager = new AcpSessionManager(1);
375
370
  const parentId = `parent-${opts.id}`;
@@ -381,7 +376,7 @@ describe("AcpSessionManager auth-required recovery surface", () => {
381
376
  manager,
382
377
  opts.id,
383
378
  parentId,
384
- fakeProcess(opts.failure ?? authFailure, opts.stderr),
379
+ fakeProcess(authFailure),
385
380
  );
386
381
  entry.command = opts.command;
387
382
  (entry as { parentToolUseId?: string }).parentToolUseId =
@@ -517,62 +512,6 @@ describe("AcpSessionManager auth-required recovery surface", () => {
517
512
  expect(r.persistedContent).toBeUndefined();
518
513
  });
519
514
 
520
- test("claude's prompt-time 401 raises the surface when stderr names another failure", async () => {
521
- // claude-agent-acp raises it as RequestError.internalError({ errorKind },
522
- // cliText), and stderr supplies the failure message, so the auth text
523
- // survives only on the rejection's own message.
524
- refusedDigests.length = 0;
525
- const digest = claudeTokenDigest("sk-ant-oat-prompt-401");
526
- const r = await driveAuthFailure({
527
- id: "sess-auth-prompt-401",
528
- command: "claude-agent-acp",
529
- parentToolUseId: "tool-anchor-prompt-401",
530
- credentialDigest: digest,
531
- failure: () =>
532
- Promise.reject(
533
- new RequestError(
534
- -32603,
535
- "Internal error: Failed to authenticate. API Error: 401 OAuth access token has expired.",
536
- { errorKind: "authentication_failed" },
537
- ),
538
- ),
539
- stderr: '{"error":{"message":"Something else happened"}}',
540
- });
541
-
542
- expect(r.authEvent).toMatchObject({
543
- acpSessionId: "sess-auth-prompt-401",
544
- authCode: "acp_claude_auth_required",
545
- parentToolUseId: "tool-anchor-prompt-401",
546
- });
547
- expect(hasAcpConnectCardRaised(r.parentId)).toBe(true);
548
- expect(refusedDigests).toContain(digest);
549
- });
550
-
551
- test("the rejection's own message is checked when its payload names a different reason", async () => {
552
- refusedDigests.length = 0;
553
- const digest = claudeTokenDigest("sk-ant-oat-own-message");
554
- const r = await driveAuthFailure({
555
- id: "sess-auth-own-message",
556
- command: "claude-agent-acp",
557
- parentToolUseId: "tool-anchor-own-message",
558
- credentialDigest: digest,
559
- failure: () =>
560
- Promise.reject(
561
- new RequestError(
562
- -32603,
563
- "Internal error: Failed to authenticate. API Error: 401",
564
- { details: "Request failed" },
565
- ),
566
- ),
567
- stderr: '{"error":{"message":"Something else happened"}}',
568
- });
569
-
570
- expect(r.authEvent).toMatchObject({
571
- authCode: "acp_claude_auth_required",
572
- });
573
- expect(refusedDigests).toContain(digest);
574
- });
575
-
576
515
  test("a non-claude adapter never raises the surface, even on an auth-shaped failure", async () => {
577
516
  const r = await driveAuthFailure({
578
517
  id: "sess-auth-codex",
@@ -777,136 +716,4 @@ describe("AcpSessionManager.spawn: a stopped turn leaves no agent running", () =
777
716
  expect(proc.kill).toHaveBeenCalled();
778
717
  expect(internals.sessions.size).toBe(0);
779
718
  });
780
-
781
- /**
782
- * The model pin is an await of its own, and it sits after the setup
783
- * recheck. A stop landing inside it gets the same treatment: no spawned
784
- * event, no model event, no prompt, and no session left behind.
785
- */
786
- test("a cancel during the model pin tears the process down and fires nothing", async () => {
787
- const manager = new AcpSessionManager(1);
788
- const controller = new AbortController();
789
- const prompt = mock(() => Promise.resolve({}));
790
- const setConfigOption = mock(async () => {
791
- // The user stops the turn while the pin's round trip is open.
792
- controller.abort(REASON);
793
- return [modelOption("opus")];
794
- });
795
- const proc = {
796
- ...fakeProcess(prompt),
797
- spawn: () => {},
798
- initialize: async () => {},
799
- createSession: async () => ({
800
- sessionId: "proto-1",
801
- configOptions: [modelOption("sonnet")],
802
- }),
803
- setConfigOption,
804
- };
805
- let injected: ReturnType<typeof injectSession> | undefined;
806
- const internals = manager as unknown as {
807
- registerSession: (opts: {
808
- acpSessionId: string;
809
- parentConversationId: string;
810
- }) => unknown;
811
- sessions: Map<string, unknown>;
812
- };
813
- internals.registerSession = (opts) => {
814
- injected = injectSession(
815
- manager,
816
- opts.acpSessionId,
817
- opts.parentConversationId,
818
- proc as unknown as ReturnType<typeof fakeProcess>,
819
- );
820
- return injected;
821
- };
822
-
823
- await expect(
824
- manager.spawn(
825
- "claude",
826
- { command: "noop", args: [] } as never,
827
- "do the task",
828
- "/tmp",
829
- "conv-1",
830
- () => {},
831
- { model: "opus" },
832
- { signal: controller.signal },
833
- ),
834
- ).rejects.toThrow();
835
-
836
- expect(setConfigOption).toHaveBeenCalled();
837
- expect(injected?.sendToVellum).not.toHaveBeenCalled();
838
- expect(prompt).not.toHaveBeenCalled();
839
- expect(proc.kill).toHaveBeenCalled();
840
- expect(internals.sessions.size).toBe(0);
841
- });
842
-
843
- /**
844
- * A cancel that persists a resumable row frees the id, so a resume can
845
- * register a fresh entry under it before the stopped spawn's pin settles.
846
- * The teardown owes that spawn its own process, and owes the replacement
847
- * its map slot.
848
- */
849
- test("a cancel during the model pin leaves a replacement session for the same id alone", async () => {
850
- const manager = new AcpSessionManager(2);
851
- const controller = new AbortController();
852
- const prompt = mock(() => Promise.resolve({}));
853
- let replacement: ReturnType<typeof injectSession> | undefined;
854
- let spawnedId: string | undefined;
855
- const setConfigOption = mock(async () => {
856
- // The turn is stopped and the id is resumed by another request while
857
- // the pin's round trip is still open.
858
- controller.abort(REASON);
859
- replacement = injectSession(
860
- manager,
861
- spawnedId!,
862
- "conv-2",
863
- fakeProcess(mock(() => Promise.resolve({}))),
864
- );
865
- return [modelOption("opus")];
866
- });
867
- const proc = {
868
- ...fakeProcess(prompt),
869
- spawn: () => {},
870
- initialize: async () => {},
871
- createSession: async () => ({
872
- sessionId: "proto-1",
873
- configOptions: [modelOption("sonnet")],
874
- }),
875
- setConfigOption,
876
- };
877
- const internals = manager as unknown as {
878
- registerSession: (opts: {
879
- acpSessionId: string;
880
- parentConversationId: string;
881
- }) => unknown;
882
- sessions: Map<string, unknown>;
883
- };
884
- internals.registerSession = (opts) => {
885
- spawnedId = opts.acpSessionId;
886
- return injectSession(
887
- manager,
888
- opts.acpSessionId,
889
- opts.parentConversationId,
890
- proc as unknown as ReturnType<typeof fakeProcess>,
891
- );
892
- };
893
-
894
- await expect(
895
- manager.spawn(
896
- "claude",
897
- { command: "noop", args: [] } as never,
898
- "do the task",
899
- "/tmp",
900
- "conv-1",
901
- () => {},
902
- { model: "opus" },
903
- { signal: controller.signal },
904
- ),
905
- ).rejects.toThrow();
906
-
907
- expect(prompt).not.toHaveBeenCalled();
908
- expect(proc.kill).toHaveBeenCalled();
909
- expect(replacement?.process.kill).not.toHaveBeenCalled();
910
- expect(internals.sessions.get(spawnedId!)).toBe(replacement);
911
- });
912
719
  });