@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,10 +1,13 @@
1
1
  /**
2
2
  * The gate that decides whether a watch retrospective can report at all.
3
3
  *
4
- * A retrospective runs as a `clientless` wake, but its report continues to
5
- * use the post-turn renderer so the report lands after its tool call has been
6
- * persisted. The core UI tools remain available on that turn for other
7
- * background work, so this file pins both contracts against the real registry.
4
+ * A retrospective runs as a `clientless` wake, which pins the turn
5
+ * non-interactive. `conversation-tool-setup` gates the whole `ui_surface`
6
+ * family on a client being present, so in that turn `ui_show` is not denied,
7
+ * it is absent: a retrospective told to call it can only tell the user it
8
+ * cannot. Nothing about the card's schema, its renderer, or the prompt's
9
+ * wording reveals that, which is why it is asserted here against the real
10
+ * registry rather than assumed anywhere else.
8
11
  */
9
12
 
10
13
  import { afterAll, describe, expect, test } from "bun:test";
@@ -51,14 +54,20 @@ describe("watch retrospective tool availability", () => {
51
54
  ).toBe(true);
52
55
  });
53
56
 
54
- test("core UI tools stay available on a clientless turn", async () => {
57
+ test("ui_show is absent from a clientless turn", async () => {
55
58
  await initializeTools();
56
59
  const ctx = clientlessContext();
57
60
 
58
- for (const name of ["ui_show", "ui_update", "ui_dismiss"]) {
59
- expect(isToolActiveForContext(name, ctx)).toBe(true);
60
- }
61
+ // The reason the report does not go through `ui_show`. If this ever flips
62
+ // to true, the extra tool above can be reconsidered; while it is false,
63
+ // routing the retrospective's card through `ui_show` produces a turn that
64
+ // cannot report at all.
65
+ expect(isToolActiveForContext("ui_show", ctx)).toBe(false);
66
+ expect(isToolActiveForContext("ui_update", ctx)).toBe(false);
67
+ expect(isToolActiveForContext("ui_dismiss", ctx)).toBe(false);
61
68
 
69
+ // And the gate really is about the client, not about the tools being
70
+ // unregistered: with one attached, the same names are active.
62
71
  const withClient = clientfulContext();
63
72
  expect(isToolActiveForContext("ui_show", withClient)).toBe(true);
64
73
  });
@@ -4,7 +4,6 @@ import {
4
4
  existsSync,
5
5
  mkdirSync,
6
6
  readFileSync,
7
- renameSync,
8
7
  rmSync,
9
8
  statSync,
10
9
  symlinkSync,
@@ -524,31 +523,6 @@ describe("WorkspaceGitService", () => {
524
523
  expect(trackedFiles()).not.toContain("gone-b.txt");
525
524
  expect(trackedFiles()).not.toContain("gone-c.txt");
526
525
  });
527
-
528
- test("batched rename stages origin and destination even when they split", async () => {
529
- const service = new WorkspaceGitService(testDir);
530
- await service.ensureInitialized();
531
-
532
- writeFileSync(join(testDir, "old-name.txt"), "moved");
533
- await service.commitChanges("Seed rename source");
534
-
535
- renameSync(join(testDir, "old-name.txt"), join(testDir, "new-name.txt"));
536
- for (const name of ["x0.txt", "x1.txt", "x2.txt", "x3.txt"]) {
537
- writeFileSync(join(testDir, name), name);
538
- }
539
-
540
- await withStageBatchSize(2, async () => {
541
- await service.commitChanges("Rename across batches");
542
- });
543
-
544
- expect(trackedFiles()).toContain("new-name.txt");
545
- expect(trackedFiles()).not.toContain("old-name.txt");
546
- const status = execFileSync("git", ["status", "--porcelain"], {
547
- cwd: testDir,
548
- encoding: "utf-8",
549
- }).trim();
550
- expect(status).toBe("");
551
- });
552
526
  });
553
527
 
554
528
  describe("getStatus", () => {
@@ -8,16 +8,9 @@
8
8
 
9
9
  import { describe, expect, mock, test } from "bun:test";
10
10
 
11
- import type {
12
- AuthMethod,
13
- InitializeResponse,
14
- SessionConfigOption,
15
- } from "@agentclientprotocol/sdk";
16
- import * as acp from "@agentclientprotocol/sdk";
11
+ import type { AuthMethod, InitializeResponse } from "@agentclientprotocol/sdk";
17
12
 
18
13
  import { AcpAgentProcess } from "../agent-process.js";
19
- import { AcpConfigOptionRefusedError } from "../types.js";
20
- import { modelOption } from "./helpers/acp-model-option.js";
21
14
 
22
15
  function makeProcess(): AcpAgentProcess {
23
16
  return new AcpAgentProcess(
@@ -167,139 +160,6 @@ describe("AcpAgentProcess loadSession/resumeSession", () => {
167
160
  });
168
161
  });
169
162
 
170
- describe("AcpAgentProcess config options", () => {
171
- /** Injects a connection whose session calls report `configOptions`. */
172
- function stubSessionResponses(
173
- proc: AcpAgentProcess,
174
- configOptions: SessionConfigOption[] | null | undefined,
175
- ): void {
176
- (proc as unknown as { connection: unknown }).connection = {
177
- newSession: () =>
178
- Promise.resolve({ sessionId: "session-1", configOptions }),
179
- loadSession: () => Promise.resolve({ configOptions }),
180
- resumeSession: () => Promise.resolve({ configOptions }),
181
- };
182
- }
183
-
184
- test("createSession returns the reported options", async () => {
185
- const proc = makeProcess();
186
- const options = [modelOption("sonnet")];
187
- stubSessionResponses(proc, options);
188
-
189
- await expect(proc.createSession("/tmp/project")).resolves.toEqual({
190
- sessionId: "session-1",
191
- configOptions: options,
192
- });
193
- });
194
-
195
- test("loadSession returns the reported options", async () => {
196
- const proc = makeProcess();
197
- const options = [modelOption("sonnet")];
198
- stubSessionResponses(proc, options);
199
-
200
- await expect(
201
- proc.loadSession("session-1", "/tmp/project"),
202
- ).resolves.toEqual({ configOptions: options });
203
- });
204
-
205
- test("resumeSession returns the reported options", async () => {
206
- const proc = makeProcess();
207
- const options = [modelOption("opus")];
208
- stubSessionResponses(proc, options);
209
-
210
- await expect(
211
- proc.resumeSession("session-1", "/tmp/project"),
212
- ).resolves.toEqual({ configOptions: options });
213
- });
214
-
215
- test("a null or absent configOptions normalizes to an empty array", async () => {
216
- const created = makeProcess();
217
- stubSessionResponses(created, null);
218
- await expect(created.createSession("/tmp/project")).resolves.toEqual({
219
- sessionId: "session-1",
220
- configOptions: [],
221
- });
222
-
223
- const loaded = makeProcess();
224
- stubSessionResponses(loaded, null);
225
- await expect(
226
- loaded.loadSession("session-1", "/tmp/project"),
227
- ).resolves.toEqual({ configOptions: [] });
228
-
229
- const resumed = makeProcess();
230
- stubSessionResponses(resumed, undefined);
231
- await expect(
232
- resumed.resumeSession("session-1", "/tmp/project"),
233
- ).resolves.toEqual({ configOptions: [] });
234
- });
235
-
236
- test("setConfigOption forwards the value and returns the refreshed set", async () => {
237
- const proc = makeProcess();
238
- const calls: unknown[] = [];
239
- const refreshed = [modelOption("opus")];
240
- (proc as unknown as { connection: unknown }).connection = {
241
- setSessionConfigOption: (params: unknown) => {
242
- calls.push(params);
243
- return Promise.resolve({ configOptions: refreshed });
244
- },
245
- };
246
-
247
- await expect(
248
- proc.setConfigOption("session-1", "model", "opus"),
249
- ).resolves.toEqual(refreshed);
250
-
251
- expect(calls).toEqual([
252
- { sessionId: "session-1", configId: "model", value: "opus" },
253
- ]);
254
- });
255
-
256
- test("setConfigOption sends the boolean request variant", async () => {
257
- const proc = makeProcess();
258
- const calls: unknown[] = [];
259
- const refreshed = [modelOption("opus")];
260
- (proc as unknown as { connection: unknown }).connection = {
261
- setSessionConfigOption: (params: unknown) => {
262
- calls.push(params);
263
- return Promise.resolve({ configOptions: refreshed });
264
- },
265
- };
266
-
267
- await proc.setConfigOption("session-1", "thinking", true);
268
-
269
- expect(calls).toEqual([
270
- {
271
- sessionId: "session-1",
272
- configId: "thinking",
273
- type: "boolean",
274
- value: true,
275
- },
276
- ]);
277
- });
278
-
279
- test("setConfigOption omits the discriminator for string values", async () => {
280
- const proc = makeProcess();
281
- const calls: unknown[] = [];
282
- (proc as unknown as { connection: unknown }).connection = {
283
- setSessionConfigOption: (params: unknown) => {
284
- calls.push(params);
285
- return Promise.resolve({ configOptions: [modelOption("opus")] });
286
- },
287
- };
288
-
289
- await proc.setConfigOption("session-1", "model", "opus");
290
-
291
- expect(calls[0]).not.toHaveProperty("type");
292
- });
293
-
294
- test("setConfigOption throws when the process is not spawned", async () => {
295
- const proc = makeProcess();
296
-
297
- await expect(
298
- proc.setConfigOption("session-1", "model", "opus"),
299
- ).rejects.toThrow('ACP agent "test-agent" is not spawned');
300
- });
301
- });
302
-
303
163
  describe("AcpAgentProcess auth_required retry", () => {
304
164
  // spawnedEnv is injected the way spawn() builds it ({ ...process.env,
305
165
  // ...config.env }), so the advertised var names use a VELLUM_TEST_ prefix
@@ -336,19 +196,17 @@ describe("AcpAgentProcess auth_required retry", () => {
336
196
  * initialize() so the advertised authMethods are captured.
337
197
  */
338
198
  async function setupAuthProcess(options: {
339
- command?: string;
340
199
  env?: Record<string, string>;
341
200
  authMethods?: AuthMethod[];
342
201
  /** Rejections to throw from successive newSession calls before succeeding. */
343
202
  newSessionRejections?: unknown[];
344
203
  loadSessionRejections?: unknown[];
345
204
  resumeSessionRejections?: unknown[];
346
- setConfigOptionRejections?: unknown[];
347
205
  promptRejections?: unknown[];
348
206
  }) {
349
207
  const proc = new AcpAgentProcess(
350
208
  "codex",
351
- { command: options.command ?? "echo", args: [], env: options.env },
209
+ { command: "echo", args: [], env: options.env },
352
210
  () => {
353
211
  throw new Error("client factory should not be called in this test");
354
212
  },
@@ -376,10 +234,6 @@ describe("AcpAgentProcess auth_required retry", () => {
376
234
  options.resumeSessionRejections ?? [],
377
235
  {},
378
236
  );
379
- const setSessionConfigOption = failThenSucceed(
380
- options.setConfigOptionRejections ?? [],
381
- { configOptions: [] },
382
- );
383
237
  const prompt = failThenSucceed(options.promptRejections ?? [], {
384
238
  stopReason: "end_turn",
385
239
  });
@@ -398,7 +252,6 @@ describe("AcpAgentProcess auth_required retry", () => {
398
252
  newSession,
399
253
  loadSession,
400
254
  resumeSession,
401
- setSessionConfigOption,
402
255
  prompt,
403
256
  authenticate,
404
257
  };
@@ -411,112 +264,18 @@ describe("AcpAgentProcess auth_required retry", () => {
411
264
  newSession,
412
265
  loadSession,
413
266
  resumeSession,
414
- setSessionConfigOption,
415
267
  prompt,
416
268
  authenticate,
417
269
  internals,
418
270
  };
419
271
  }
420
272
 
421
- // An adapter that throws a plain Error reaches the client as a generic
422
- // "Internal error" carrying the real sentence in `data.details`, which is
423
- // the shape these fixtures reproduce.
424
- test("setConfigOption surfaces the adapter's error answer as a refusal", async () => {
425
- const { proc } = await setupAuthProcess({
426
- setConfigOptionRejections: [
427
- new acp.RequestError(-32603, "Internal error", {
428
- details: "Invalid value for config option model: nope",
429
- }),
430
- ],
431
- });
432
-
433
- const refusal = await proc
434
- .setConfigOption("session-1", "model", "nope")
435
- .catch((err: unknown) => err);
436
-
437
- expect(refusal).toBeInstanceOf(AcpConfigOptionRefusedError);
438
- // The adapter's sentence, not the message the SDK framed it in.
439
- expect((refusal as Error).message).toBe(
440
- "Invalid value for config option model: nope",
441
- );
442
- });
443
-
444
- test("setConfigOption serializes a payload that names no reason", async () => {
445
- const { proc } = await setupAuthProcess({
446
- setConfigOptionRejections: [
447
- new acp.RequestError(-32603, "Internal error", { code: 7 }),
448
- ],
449
- });
450
-
451
- await expect(
452
- proc.setConfigOption("session-1", "model", "nope"),
453
- ).rejects.toThrow('{"code":7}');
454
- });
455
-
456
- test("setConfigOption falls back to the message when there is no payload", async () => {
457
- const { proc } = await setupAuthProcess({
458
- setConfigOptionRejections: [
459
- new acp.RequestError(-32603, "Session not found"),
460
- ],
461
- });
462
-
463
- await expect(
464
- proc.setConfigOption("session-1", "model", "nope"),
465
- ).rejects.toThrow("Session not found");
466
- });
467
-
468
- test.each(["claude-agent-acp", "/usr/local/bin/claude-agent-acp"])(
469
- "setConfigOption leaves Claude's message-shaped auth failure untyped (%s)",
470
- async (command) => {
471
- const expired = new acp.RequestError(-32603, "Internal error", {
472
- details: "Not logged in",
473
- });
474
- const { proc } = await setupAuthProcess({
475
- command,
476
- setConfigOptionRejections: [expired],
477
- });
478
-
479
- await expect(
480
- proc.setConfigOption("session-1", "model", "opus"),
481
- ).rejects.toBe(expired);
482
- },
483
- );
484
-
485
- test("setConfigOption reads Claude's login wording from another adapter as a refusal", async () => {
486
- const { proc } = await setupAuthProcess({
487
- command: "codex-acp",
488
- setConfigOptionRejections: [
489
- new acp.RequestError(-32603, "Internal error", {
490
- details: "Not logged in",
491
- }),
492
- ],
493
- });
494
-
495
- const refusal = await proc
496
- .setConfigOption("session-1", "model", "gpt-5")
497
- .catch((err: unknown) => err);
498
-
499
- expect(refusal).toBeInstanceOf(AcpConfigOptionRefusedError);
500
- expect((refusal as Error).message).toBe("Not logged in");
501
- });
502
-
503
- test("setConfigOption leaves a transport failure untyped", async () => {
504
- const closed = new Error("ACP connection closed");
505
- const { proc } = await setupAuthProcess({
506
- setConfigOptionRejections: [closed],
507
- });
508
-
509
- await expect(
510
- proc.setConfigOption("session-1", "model", "opus"),
511
- ).rejects.toBe(closed);
512
- });
513
-
514
273
  test("createSession does not authenticate when newSession succeeds", async () => {
515
274
  const { proc, newSession, authenticate } = await setupAuthProcess({
516
275
  env: { [OPENAI_VAR]: "sk-test" },
517
276
  });
518
277
 
519
- const { sessionId } = await proc.createSession("/tmp/project");
278
+ const sessionId = await proc.createSession("/tmp/project");
520
279
 
521
280
  expect(sessionId).toBe("session-1");
522
281
  expect(newSession).toHaveBeenCalledTimes(1);
@@ -529,7 +288,7 @@ describe("AcpAgentProcess auth_required retry", () => {
529
288
  newSessionRejections: [authRequiredError],
530
289
  });
531
290
 
532
- const { sessionId } = await proc.createSession("/tmp/project");
291
+ const sessionId = await proc.createSession("/tmp/project");
533
292
 
534
293
  expect(sessionId).toBe("session-1");
535
294
  expect(authenticate).toHaveBeenCalledTimes(1);
@@ -628,19 +387,6 @@ describe("AcpAgentProcess auth_required retry", () => {
628
387
  expect(resumeSession).toHaveBeenCalledTimes(2);
629
388
  });
630
389
 
631
- test("setConfigOption authenticates and retries on auth_required", async () => {
632
- const { proc, setSessionConfigOption, authenticate } =
633
- await setupAuthProcess({
634
- env: { [OPENAI_VAR]: "sk-test" },
635
- setConfigOptionRejections: [authRequiredError],
636
- });
637
-
638
- await proc.setConfigOption("session-1", "model", "opus");
639
-
640
- expect(authenticate).toHaveBeenCalledWith({ methodId: "openai-api-key" });
641
- expect(setSessionConfigOption).toHaveBeenCalledTimes(2);
642
- });
643
-
644
390
  test("prompt authenticates and retries on auth_required, returning the response", async () => {
645
391
  const { proc, prompt, authenticate } = await setupAuthProcess({
646
392
  env: { [OPENAI_VAR]: "sk-test" },
@@ -6,8 +6,6 @@
6
6
 
7
7
  import { describe, expect, test } from "bun:test";
8
8
 
9
- import { RequestError } from "@agentclientprotocol/sdk";
10
-
11
9
  import { AcpAuthRequiredEventSchema } from "../../api/events/acp-auth-required.js";
12
10
  import { AcpSessionErrorEventSchema } from "../../api/events/acp-session-error.js";
13
11
  import {
@@ -17,7 +15,6 @@ import {
17
15
  CLAUDE_ACP_COMMAND,
18
16
  isAcpAuthRequired,
19
17
  isClaudeAuthFailureMessage,
20
- requestErrorReason,
21
18
  } from "../auth-required.js";
22
19
 
23
20
  describe("isAcpAuthRequired", () => {
@@ -92,99 +89,6 @@ describe("isClaudeAuthFailureMessage", () => {
92
89
  });
93
90
  });
94
91
 
95
- describe("requestErrorReason", () => {
96
- test("decodes the sentence the SDK moved into the payload", () => {
97
- const rejection = new RequestError(-32603, "Internal error", {
98
- details: "Failed to authenticate. Please run /login",
99
- });
100
-
101
- expect(requestErrorReason(rejection)).toBe(
102
- "Failed to authenticate. Please run /login",
103
- );
104
- // The point of decoding: the generic message never matches.
105
- expect(isClaudeAuthFailureMessage(rejection.message)).toBe(false);
106
- expect(isClaudeAuthFailureMessage(requestErrorReason(rejection))).toBe(
107
- true,
108
- );
109
- });
110
-
111
- test("reads the message off a rejection that carries no payload", () => {
112
- // Straight off the wire: a plain object, not an instance of any class we
113
- // control, and with the auth text where the SDK leaves a framed one.
114
- const rejection = {
115
- code: -32603,
116
- message: "Failed to authenticate. Please run /login",
117
- };
118
-
119
- expect(requestErrorReason(rejection)).toBe(
120
- "Failed to authenticate. Please run /login",
121
- );
122
- expect(isClaudeAuthFailureMessage(requestErrorReason(rejection))).toBe(
123
- true,
124
- );
125
- });
126
-
127
- test("keeps the rejection's own message when the payload names no reason", () => {
128
- expect(requestErrorReason(new RequestError(-32603, "boom", { c: 7 }))).toBe(
129
- "boom",
130
- );
131
- expect(
132
- requestErrorReason(
133
- RequestError.methodNotFound("session/set_config_option"),
134
- ),
135
- ).toBe('"Method not found": session/set_config_option');
136
- expect(requestErrorReason(new Error("Not logged in"))).toBe(
137
- "Not logged in",
138
- );
139
- });
140
-
141
- test("keeps a specific rejection message ahead of supplemental details", () => {
142
- expect(
143
- requestErrorReason(
144
- new RequestError(-32603, "Model unavailable", {
145
- details: "The selected deployment is temporarily unavailable",
146
- }),
147
- ),
148
- ).toBe("Model unavailable");
149
- });
150
-
151
- test("serializes the payload behind a bare Internal error that names no reason", () => {
152
- expect(
153
- requestErrorReason(new RequestError(-32603, "Internal error", { c: 7 })),
154
- ).toBe('{"c":7}');
155
- });
156
-
157
- test("serializes the payload behind a generic Invalid params", () => {
158
- // How the agent-side SDK answers a request its schema rejects.
159
- expect(
160
- requestErrorReason(
161
- RequestError.invalidParams({ _errors: ["model: Invalid option"] }),
162
- ),
163
- ).toBe('{"_errors":["model: Invalid option"]}');
164
- });
165
-
166
- test("decodes claude-agent-acp's prompt-time 401 from its message", () => {
167
- // RequestError.internalError({ errorKind }, cliText) as the adapter raises
168
- // it: the CLI's text rides the message and the payload only names a kind.
169
- const rejection = new RequestError(
170
- -32603,
171
- "Internal error: Failed to authenticate. API Error: 401 OAuth access token has expired.",
172
- { errorKind: "authentication_failed" },
173
- );
174
-
175
- expect(requestErrorReason(rejection)).toBe(rejection.message);
176
- expect(isClaudeAuthFailureMessage(requestErrorReason(rejection))).toBe(
177
- true,
178
- );
179
- });
180
-
181
- test("stringifies a rejection that is not an object at all", () => {
182
- expect(requestErrorReason("plain string")).toBe("plain string");
183
- expect(requestErrorReason(-32603)).toBe("-32603");
184
- expect(requestErrorReason(null)).toBe("null");
185
- });
186
- });
187
-
188
92
  describe("AcpAuthRequiredError", () => {
189
93
  test("is an Error that carries the agent id and its message", () => {
190
94
  const err = new AcpAuthRequiredError("claude", "needs a reconnect");
@@ -1,13 +1,9 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
 
3
- import type {
4
- SessionConfigOption,
5
- SessionNotification,
6
- } from "@agentclientprotocol/sdk";
3
+ import type { SessionNotification } from "@agentclientprotocol/sdk";
7
4
 
8
5
  import type { AssistantEvent } from "../../api/index.js";
9
6
  import { VellumAcpClientHandler } from "../client-handler.js";
10
- import { modelOption } from "./helpers/acp-model-option.js";
11
7
 
12
8
  const ACP_SESSION_ID = "acp-session-abc";
13
9
  const PARENT_CONVERSATION_ID = "conv-xyz";
@@ -15,21 +11,16 @@ const PARENT_CONVERSATION_ID = "conv-xyz";
15
11
  function makeHandler(): {
16
12
  handler: VellumAcpClientHandler;
17
13
  sent: AssistantEvent[];
18
- configOptionUpdates: SessionConfigOption[][];
19
14
  } {
20
15
  const sent: AssistantEvent[] = [];
21
- const configOptionUpdates: SessionConfigOption[][] = [];
22
16
  const handler = new VellumAcpClientHandler(
23
17
  ACP_SESSION_ID,
24
18
  (msg) => {
25
19
  sent.push(msg);
26
20
  },
27
21
  PARENT_CONVERSATION_ID,
28
- (configOptions) => {
29
- configOptionUpdates.push(configOptions);
30
- },
31
22
  );
32
- return { handler, sent, configOptionUpdates };
23
+ return { handler, sent };
33
24
  }
34
25
 
35
26
  describe("VellumAcpClientHandler.sessionUpdate", () => {
@@ -791,82 +782,3 @@ describe("VellumAcpClientHandler seq + enriched fields", () => {
791
782
  expect(msg.toolTitle).toContain("<redacted");
792
783
  });
793
784
  });
794
-
795
- describe("VellumAcpClientHandler config_option_update", () => {
796
- const MODEL_OPTION = modelOption("sonnet");
797
-
798
- const THOUGHT_OPTION: SessionConfigOption = {
799
- type: "boolean",
800
- id: "thinking",
801
- name: "Extended thinking",
802
- currentValue: true,
803
- };
804
-
805
- function configOptionUpdate(
806
- configOptions: SessionConfigOption[],
807
- ): SessionNotification {
808
- return {
809
- sessionId: ACP_SESSION_ID,
810
- update: { sessionUpdate: "config_option_update", configOptions },
811
- };
812
- }
813
-
814
- test("invokes the callback with the full option array", async () => {
815
- const { handler, sent, configOptionUpdates } = makeHandler();
816
-
817
- await handler.sessionUpdate(
818
- configOptionUpdate([MODEL_OPTION, THOUGHT_OPTION]),
819
- );
820
-
821
- expect(configOptionUpdates).toEqual([[MODEL_OPTION, THOUGHT_OPTION]]);
822
- expect(sent).toHaveLength(0);
823
- });
824
-
825
- test("callback fires during replay suppression", async () => {
826
- const { handler, sent, configOptionUpdates } = makeHandler();
827
-
828
- handler.beginReplaySuppression();
829
- await handler.sessionUpdate(configOptionUpdate([MODEL_OPTION]));
830
-
831
- expect(configOptionUpdates).toEqual([[MODEL_OPTION]]);
832
- expect(sent).toHaveLength(0);
833
- });
834
-
835
- test("a handler without the callback tolerates the update", async () => {
836
- const sent: AssistantEvent[] = [];
837
- const handler = new VellumAcpClientHandler(
838
- ACP_SESSION_ID,
839
- (msg) => {
840
- sent.push(msg);
841
- },
842
- PARENT_CONVERSATION_ID,
843
- );
844
-
845
- await handler.sessionUpdate(configOptionUpdate([MODEL_OPTION]));
846
-
847
- expect(sent).toHaveLength(0);
848
- });
849
-
850
- test("the remaining unhandled update types stay unforwarded", async () => {
851
- const { handler, sent, configOptionUpdates } = makeHandler();
852
-
853
- await handler.sessionUpdate({
854
- sessionId: ACP_SESSION_ID,
855
- update: {
856
- sessionUpdate: "available_commands_update",
857
- availableCommands: [{ name: "create_plan", description: "Plan work" }],
858
- },
859
- });
860
- await handler.sessionUpdate({
861
- sessionId: ACP_SESSION_ID,
862
- update: { sessionUpdate: "current_mode_update", currentModeId: "ask" },
863
- });
864
- await handler.sessionUpdate({
865
- sessionId: ACP_SESSION_ID,
866
- update: { sessionUpdate: "session_info_update", title: "Refactor" },
867
- });
868
-
869
- expect(sent).toHaveLength(0);
870
- expect(configOptionUpdates).toHaveLength(0);
871
- });
872
- });
@@ -66,11 +66,7 @@ function buildSessionWithFakeProcess(opts: {
66
66
  kill: () => {},
67
67
  spawn: () => {},
68
68
  initialize: () => Promise.resolve(),
69
- createSession: () =>
70
- Promise.resolve({
71
- sessionId: opts.protocolSessionId,
72
- configOptions: [],
73
- }),
69
+ createSession: () => Promise.resolve(opts.protocolSessionId),
74
70
  cancel: () => Promise.resolve(),
75
71
  markStderr: () => 0,
76
72
  stderrSince: () => "",