@vellumai/assistant 0.12.1-staging.1 → 0.12.1

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