@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
@@ -224,10 +224,7 @@ describe("surfaceProxyResolver — CU tool routing", () => {
224
224
  );
225
225
 
226
226
  expect(result.isError).toBe(true);
227
- expect(result.content).toContain(
228
- "The Vellum desktop app is needed to view or control your screen",
229
- );
230
- expect(result.content).toContain("https://www.vellum.ai/downloads");
227
+ expect(result.content).toContain("no desktop client connected");
231
228
  });
232
229
 
233
230
  test("returns error when proxy exists but client not connected", async () => {
@@ -240,10 +237,7 @@ describe("surfaceProxyResolver — CU tool routing", () => {
240
237
  });
241
238
 
242
239
  expect(result.isError).toBe(true);
243
- expect(result.content).toContain(
244
- "The Vellum desktop app is needed to view or control your screen",
245
- );
246
- expect(result.content).toContain("https://www.vellum.ai/downloads");
240
+ expect(result.content).toContain("no desktop client connected");
247
241
  proxyObj.dispose();
248
242
  });
249
243
 
@@ -143,31 +143,6 @@ describe("document write routes publish documents:list", () => {
143
143
  expectDocumentsChanged(events);
144
144
  });
145
145
 
146
- test("an existing document with a missing conversation can save before relinking", async () => {
147
- await saveViaRoute();
148
- const db = getDb();
149
- db.run("PRAGMA foreign_keys = OFF");
150
- try {
151
- db.run("DELETE FROM conversations");
152
- } finally {
153
- db.run("PRAGMA foreign_keys = ON");
154
- }
155
-
156
- await expect(
157
- saveViaRoute({ title: "Renamed notes", content: "Edited body" }),
158
- ).resolves.toMatchObject({ success: true, surfaceId: "doc-sync" });
159
- createConversation({ id: OTHER_CONVERSATION_ID });
160
- await expect(
161
- linkViaRoute("doc-sync", OTHER_CONVERSATION_ID),
162
- ).resolves.toMatchObject({ success: true });
163
- await expect(
164
- invoke("getDocument", { pathParams: { id: "doc-sync" } }),
165
- ).resolves.toMatchObject({
166
- title: "Renamed notes",
167
- content: "Edited body",
168
- });
169
- });
170
-
171
146
  test("a content-only save publishes", async () => {
172
147
  // The save moves `updated_at` and the word count, which order and fill the
173
148
  // Library and the assets list on every other client. The saving client
@@ -79,6 +79,8 @@ function makeFakeConversation(
79
79
  getTurnInterfaceContext: () => null,
80
80
  setTurnInterfaceContext: () => {},
81
81
  setTransportHints: () => {},
82
+ setTrustContext: () => {},
83
+ ensureActorScopedHistory: async () => {},
82
84
  emitActivityState: () => {
83
85
  if (activityFailures > 0) {
84
86
  activityFailures -= 1;
@@ -78,6 +78,12 @@ function makeFakeConversation(options: {
78
78
  setTransportHints: () => {
79
79
  mutationCalls.push("setTransportHints");
80
80
  },
81
+ setTrustContext: () => {
82
+ mutationCalls.push("setTrustContext");
83
+ },
84
+ ensureActorScopedHistory: async () => {
85
+ mutationCalls.push("ensureActorScopedHistory");
86
+ },
81
87
  emitActivityState: () => {
82
88
  mutationCalls.push("emitActivityState");
83
89
  },
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * `evictConversationsForReload` drops in-memory conversations after a
3
- * config/prompt reload so the next turn rebuilds them against the new
3
+ * config/prompt/skills reload so the next turn rebuilds them against the new
4
4
  * config. Queued messages live only on the instance being disposed, so the
5
5
  * same "not idle while a queue is pending" rule the periodic evictor applies
6
6
  * has to hold here: `isProcessing()` reads false in the window between a turn
@@ -669,31 +669,23 @@ describe("HostBashProxy", () => {
669
669
  expect(sentMessages).toHaveLength(0);
670
670
  });
671
671
 
672
- test("selects the most recently active same-user client when several are connected", async () => {
672
+ test("rejects ambiguously when multiple same-user capable clients are connected and no targetClientId", async () => {
673
+ // Regression: previously fell through to untargeted broadcast, fanning
674
+ // a single targeted-style request out across every same-user machine.
673
675
  setup();
674
676
  setupMultipleClients(["client-1", "client-2", "client-3"]);
675
677
 
676
- const resultPromise = proxy.request(
678
+ const result = await proxy.request(
677
679
  { command: "echo hello" },
678
680
  "session-1",
679
681
  undefined,
680
682
  "user-A",
681
683
  );
682
684
 
683
- const sent = sentMessages[0] as Record<string, unknown>;
684
- expect(sent.targetClientId).toBe("client-1");
685
- const options = sentMessageOptions[0] as
686
- | Record<string, unknown>
687
- | undefined;
688
- expect(options?.targetClientId).toBe("client-1");
689
-
690
- proxy.resolveResult(sent.requestId as string, {
691
- stdout: "hello\n",
692
- stderr: "",
693
- exitCode: 0,
694
- timedOut: false,
695
- });
696
- expect((await resultPromise).isError).toBe(false);
685
+ expect(result.isError).toBe(true);
686
+ expect(result.content).toContain("target_client_id");
687
+ // No broadcast happened
688
+ expect(sentMessages).toHaveLength(0);
697
689
  });
698
690
 
699
691
  test("falls through to broadcast when zero capable clients (existing timeout path)", async () => {
@@ -840,19 +832,30 @@ describe("HostBashProxy", () => {
840
832
  expect(sentMessages).toHaveLength(0);
841
833
  });
842
834
 
843
- test("rejects when the actor has no capable client", async () => {
835
+ test("untargeted local flow unchanged when no auto-resolve match", async () => {
844
836
  setup();
837
+ // No capable clients connected — untargeted path runs.
845
838
 
846
- const result = await proxy.request(
839
+ const resultPromise = proxy.request(
847
840
  { command: "echo hello" },
848
841
  "session-1",
849
842
  undefined,
850
843
  "user-A",
851
844
  );
852
845
 
853
- expect(result).toMatchObject({ isError: true });
854
- expect(result.content).toContain("belongs to this user");
855
- expect(sentMessages).toHaveLength(0);
846
+ expect(sentMessages).toHaveLength(1);
847
+ const sent = sentMessages[0] as Record<string, unknown>;
848
+ expect(sent.type).toBe("host_bash_request");
849
+ expect(sent.targetClientId).toBeUndefined();
850
+
851
+ const requestId = sent.requestId as string;
852
+ proxy.resolveResult(requestId, {
853
+ stdout: "hello\n",
854
+ stderr: "",
855
+ exitCode: 0,
856
+ timedOut: false,
857
+ });
858
+ await resultPromise;
856
859
  });
857
860
 
858
861
  test("auto-resolve to same-user client succeeds", async () => {
@@ -880,20 +883,36 @@ describe("HostBashProxy", () => {
880
883
  await resultPromise;
881
884
  });
882
885
 
883
- test("rejects when only a different user has a capable client", async () => {
886
+ test("auto-resolve to different-user client falls through to untargeted", async () => {
884
887
  setup();
888
+ // Single capable client owned by user-B; caller is user-A.
885
889
  setupSingleClient("client-abc", "user-B");
886
890
 
887
- const result = await proxy.request(
891
+ const resultPromise = proxy.request(
888
892
  { command: "echo hello" },
889
893
  "session-1",
890
894
  undefined,
891
895
  "user-A",
892
896
  );
893
897
 
894
- expect(result).toMatchObject({ isError: true });
895
- expect(result.content).toContain("belongs to this user");
896
- expect(sentMessages).toHaveLength(0);
898
+ // Auto-resolve must NOT pick the cross-user client; the untargeted
899
+ // broadcast path runs instead.
900
+ expect(sentMessages).toHaveLength(1);
901
+ const sent = sentMessages[0] as Record<string, unknown>;
902
+ expect(sent.type).toBe("host_bash_request");
903
+ expect(sent.targetClientId).toBeUndefined();
904
+
905
+ const opts = sentMessageOptions[0] as Record<string, unknown> | undefined;
906
+ expect(opts?.targetClientId).toBeUndefined();
907
+
908
+ const requestId = sent.requestId as string;
909
+ proxy.resolveResult(requestId, {
910
+ stdout: "hello\n",
911
+ stderr: "",
912
+ exitCode: 0,
913
+ timedOut: false,
914
+ });
915
+ await resultPromise;
897
916
  });
898
917
  });
899
918
  });
@@ -608,17 +608,22 @@ describe("HostBrowserProxy", () => {
608
608
  },
609
609
  ];
610
610
 
611
- const result = await proxy.request(
611
+ const resultPromise = proxy.request(
612
612
  { cdpMethod: "Page.navigate", cdpParams: { url: "https://a.test" } },
613
613
  "session-1",
614
614
  undefined,
615
615
  "user-1",
616
616
  );
617
617
 
618
- expect(result).toMatchObject({ isError: true });
619
- expect(result.content).toContain("belongs to this user");
618
+ // Auto-resolution filters out the cross-user candidate, so the
619
+ // proxy falls into the existing "no active extension connection"
620
+ // rejection — we never broadcast to a different actor's client.
621
+ await expect(resultPromise).rejects.toThrow(
622
+ "no active extension connection",
623
+ );
620
624
  expect(getPublishedMessages()).toHaveLength(0);
621
625
  });
626
+
622
627
  test("prefers the chrome-extension client over a more-recently-active macOS bridge", async () => {
623
628
  // Mock `listClientsByCapability` returns mockClients in array
624
629
  // order, which mirrors production's `lastActiveAt`-desc ordering.
@@ -715,6 +720,11 @@ describe("HostBrowserProxy", () => {
715
720
  });
716
721
 
717
722
  test("rejects when caller has actor but no host_browser-capable client is connected for that actor", async () => {
723
+ // Same-user filter returns empty even though listClientsByCapability
724
+ // would return a non-empty list (because that list is for a
725
+ // different actor). The unfiltered fallback path runs only when
726
+ // the caller has no actor — we don't silently broadcast to anyone
727
+ // when the caller IS authenticated to a specific actor.
718
728
  mockClients = [
719
729
  {
720
730
  clientId: "other-user-ext",
@@ -724,15 +734,16 @@ describe("HostBrowserProxy", () => {
724
734
  },
725
735
  ];
726
736
 
727
- const result = await proxy.request(
737
+ const resultPromise = proxy.request(
728
738
  { cdpMethod: "Page.navigate", cdpParams: { url: "https://a.test" } },
729
739
  "session-1",
730
740
  undefined,
731
741
  "user-1",
732
742
  );
733
743
 
734
- expect(result).toMatchObject({ isError: true });
735
- expect(result.content).toContain("belongs to this user");
744
+ await expect(resultPromise).rejects.toThrow(
745
+ "no active extension connection",
746
+ );
736
747
  expect(getPublishedMessages()).toHaveLength(0);
737
748
  });
738
749
  });
@@ -274,29 +274,6 @@ describe("HostFileProxy — targetClientId (Phase 2)", () => {
274
274
  });
275
275
  });
276
276
 
277
- test("selects the most recently active same-user client when several are connected", async () => {
278
- setup();
279
- setupMultipleClients(["client-1", "client-2"]);
280
-
281
- const resultPromise = proxy.request(
282
- { operation: "read", path: "/tmp/file.txt" },
283
- "session-1",
284
- undefined,
285
- undefined,
286
- TEST_PRINCIPAL,
287
- );
288
-
289
- const sent = sentMessages[0] as Record<string, unknown>;
290
- expect(sent.targetClientId).toBe("client-1");
291
- const options = sentMessageOptions[0] as
292
- | Record<string, unknown>
293
- | undefined;
294
- expect(options?.targetClientId).toBe("client-1");
295
-
296
- proxy.resolve(sent.requestId as string, { content: "ok", isError: false });
297
- expect((await resultPromise).isError).toBe(false);
298
- });
299
-
300
277
  // ── targetClientId in cancel (abort signal) ──────────────────────────
301
278
 
302
279
  describe("targetClientId in cancel — abort signal", () => {
@@ -746,8 +746,9 @@ describe("HostFileProxy", () => {
746
746
  expect(sentMessages).toHaveLength(0);
747
747
  });
748
748
 
749
- test("rejects when the actor has no capable client", async () => {
749
+ test("untargeted request with no auto-resolve match still broadcasts (legacy path unchanged)", async () => {
750
750
  setup();
751
+ // No matching same-user clients available.
751
752
  mockClients = [
752
753
  {
753
754
  clientId: "client-A",
@@ -756,18 +757,23 @@ describe("HostFileProxy", () => {
756
757
  },
757
758
  ];
758
759
 
759
- const result = await proxy.request(
760
+ const resultPromise = proxy.request(
760
761
  { operation: "read", path: "/tmp/test.txt" },
761
762
  "session-1",
762
763
  undefined,
763
764
  undefined,
764
- "user-B",
765
+ "user-B", // No same-user match → no auto-resolve, broadcast untargeted.
765
766
  );
766
767
 
767
- expect(result).toMatchObject({ isError: true });
768
- expect(result.content).toContain("belongs to this user");
769
- expect(sentMessages).toHaveLength(0);
768
+ expect(sentMessages).toHaveLength(1);
769
+ const sent = sentMessages[0] as Record<string, unknown>;
770
+ expect(sent.targetClientId).toBeUndefined();
771
+ const requestId = sent.requestId as string;
772
+
773
+ proxy.resolve(requestId, { content: "ok", isError: false });
774
+ await resultPromise;
770
775
  });
776
+
771
777
  test("auto-resolve picks the same-user client when there's exactly one", async () => {
772
778
  setup();
773
779
  mockClients = [
@@ -801,7 +807,7 @@ describe("HostFileProxy", () => {
801
807
  await resultPromise;
802
808
  });
803
809
 
804
- test("rejects when only a different user has a capable client", async () => {
810
+ test("auto-resolve falls through when no client matches the source user", async () => {
805
811
  setup();
806
812
  mockClients = [
807
813
  {
@@ -811,7 +817,7 @@ describe("HostFileProxy", () => {
811
817
  },
812
818
  ];
813
819
 
814
- const result = await proxy.request(
820
+ const resultPromise = proxy.request(
815
821
  { operation: "read", path: "/tmp/test.txt" },
816
822
  "session-1",
817
823
  undefined,
@@ -819,10 +825,16 @@ describe("HostFileProxy", () => {
819
825
  "user-C",
820
826
  );
821
827
 
822
- expect(result).toMatchObject({ isError: true });
823
- expect(result.content).toContain("belongs to this user");
824
- expect(sentMessages).toHaveLength(0);
828
+ // No same-user client → no auto-resolve, broadcast untargeted.
829
+ expect(sentMessages).toHaveLength(1);
830
+ const sent = sentMessages[0] as Record<string, unknown>;
831
+ expect(sent.targetClientId).toBeUndefined();
832
+ const requestId = sent.requestId as string;
833
+
834
+ proxy.resolve(requestId, { content: "ok", isError: false });
835
+ await resultPromise;
825
836
  });
837
+
826
838
  test("legacy embedded targetClientId in input still goes through the same-user gate", async () => {
827
839
  setup();
828
840
  mockClients = [
@@ -812,7 +812,7 @@ describe("HostTransferProxy — targetClientId", () => {
812
812
  await resultPromise;
813
813
  });
814
814
 
815
- test("requestToHost: rejects when no client matches the source user", async () => {
815
+ test("requestToHost: auto-resolve falls through when no client matches the source user", async () => {
816
816
  setup();
817
817
  mockClientRegistry.set("client-A", {
818
818
  clientId: "client-A",
@@ -824,7 +824,7 @@ describe("HostTransferProxy — targetClientId", () => {
824
824
  const srcPath = `/tmp/htp-auto-no-match-${Date.now()}.txt`;
825
825
  await globalThis.Bun.write(srcPath, "data");
826
826
 
827
- const result = await proxy.requestToHost(
827
+ const resultPromise = proxy.requestToHost(
828
828
  {
829
829
  sourcePath: srcPath,
830
830
  destPath: "/host/dest.txt",
@@ -835,9 +835,13 @@ describe("HostTransferProxy — targetClientId", () => {
835
835
  "user-C",
836
836
  );
837
837
 
838
- expect(result).toMatchObject({ isError: true });
839
- expect(result.content).toContain("belongs to this user");
840
- expect(sentMessages).toHaveLength(0);
838
+ await waitForMessages(sentMessages, 1);
839
+ const sent = sentMessages[0] as Record<string, unknown>;
840
+ expect(sent.targetClientId).toBeUndefined();
841
+
842
+ const requestId = sent.requestId as string;
843
+ proxy.resolveTransferResult(requestId, { isError: false });
844
+ await resultPromise;
841
845
  });
842
846
 
843
847
  test("requestToSandbox: targeted request from a different user is rejected", async () => {
@@ -893,31 +897,6 @@ describe("HostTransferProxy — targetClientId", () => {
893
897
  await resultPromise;
894
898
  });
895
899
 
896
- test("requestToSandbox: rejects when no client matches the source user", async () => {
897
- setup();
898
- const a: MockClient = {
899
- clientId: "client-A",
900
- capabilities: ["host_file"],
901
- actorPrincipalId: "user-A",
902
- };
903
- mockCapableClients = [a];
904
- mockClientRegistry.set("client-A", a);
905
-
906
- const result = await proxy.requestToSandbox(
907
- {
908
- sourcePath: "/host/source.txt",
909
- destPath: "/sandbox/dest.txt",
910
- conversationId: "conv-same-9-no-match",
911
- },
912
- undefined,
913
- "user-C",
914
- );
915
-
916
- expect(result).toMatchObject({ isError: true });
917
- expect(result.content).toContain("belongs to this user");
918
- expect(sentMessages).toHaveLength(0);
919
- });
920
-
921
900
  test("requestToSandbox: auto-resolve picks the same-user client when there's exactly one", async () => {
922
901
  setup();
923
902
  const a: MockClient = {
@@ -6,7 +6,6 @@ import {
6
6
  getCatalogProviderForModel,
7
7
  isModelInCatalog,
8
8
  PROVIDER_CATALOG,
9
- supportsForcedToolChoiceWithThinking,
10
9
  } from "../providers/model-catalog.js";
11
10
  import { PLATFORM_PROVIDER_META } from "../providers/platform-proxy/constants.js";
12
11
  import { resolvePricing, resolvePricingForUsage } from "../util/pricing.js";
@@ -552,30 +551,6 @@ describe("LLM catalog parity: daemon vs client", () => {
552
551
  expect(getCatalogProviderForModel("unknown/model")).toBeUndefined();
553
552
  });
554
553
 
555
- test("forced tool choice with thinking is scoped to OpenRouter Kimi K2.6", () => {
556
- expect(
557
- supportsForcedToolChoiceWithThinking("openrouter", "moonshotai/kimi-k2.6"),
558
- ).toBe(false);
559
- expect(
560
- supportsForcedToolChoiceWithThinking(
561
- "openrouter",
562
- "moonshotai/kimi-k2.6-20260420",
563
- ),
564
- ).toBe(false);
565
- expect(
566
- supportsForcedToolChoiceWithThinking(
567
- "vercel-ai-gateway",
568
- "moonshotai/kimi-k2.6",
569
- ),
570
- ).toBe(true);
571
- expect(
572
- supportsForcedToolChoiceWithThinking("openrouter", "unknown/model"),
573
- ).toBe(true);
574
- expect(
575
- supportsForcedToolChoiceWithThinking("unknown-provider", "unknown/model"),
576
- ).toBe(true);
577
- });
578
-
579
554
  test("Gemini 2.5 Pro catalog context matches provider limits", () => {
580
555
  const gemini = PROVIDER_CATALOG.find((entry) => entry.id === "gemini");
581
556
  expect(
@@ -24,12 +24,15 @@ mock.module("../mcp/mcp-auth-state.js", () => ({
24
24
  getMcpAuthState: mockGetMcpAuthState,
25
25
  }));
26
26
 
27
- import { setWorkspaceMcp } from "./helpers/set-workspace-mcp.js";
28
-
29
- // Seed the MCP server the routes look up via workspace mcp.json.
30
- setWorkspaceMcp({
31
- "my-server": {
32
- transport: { type: "sse", url: "https://mcp.example.com" },
27
+ import { setConfig } from "./helpers/set-config.js";
28
+
29
+ // Seed the MCP server the routes look up via `loadRawConfig()` into the
30
+ // workspace config for real.
31
+ setConfig("mcp", {
32
+ servers: {
33
+ "my-server": {
34
+ transport: { type: "sse", url: "https://mcp.example.com" },
35
+ },
33
36
  },
34
37
  });
35
38