@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
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * Shared resolver for ACP agent ids → agent config + binary preflight.
3
3
  *
4
- * `resolveAcpAgent(id)` layers user-provided `config.acp.agents[id]` over the
5
- * bundled `DEFAULT_ACP_AGENT_PROFILES` so common agents like `claude` and
6
- * `codex` Just Work with no per-user config required; `mergeWithProfile` says
7
- * what an entry inherits. Natural names ("claude code", "OpenAI Codex")
8
- * resolve via `AGENT_ID_ALIASES` when the raw id misses both maps. The result
9
- * is a discriminated union covering every reason a spawn might fail before we
10
- * even start the agent process: unknown agent id, or binary missing from
11
- * PATH. Callers (acp_spawn, acp_list_agents, and the `/v1/acp/spawn` HTTP
12
- * route) get a single source of truth and matching actionable hints.
4
+ * `resolveAcpAgent(id)` merges user-provided `config.acp.agents[id]` (wins on
5
+ * overlap) with the bundled `DEFAULT_ACP_AGENT_PROFILES` so common agents like
6
+ * `claude` and `codex` Just Work with no per-user config required. Natural
7
+ * names ("claude code", "OpenAI Codex") resolve via `AGENT_ID_ALIASES` when the
8
+ * raw id misses both maps. The result is a discriminated union covering every
9
+ * reason a spawn might fail before we even start the agent process: unknown
10
+ * agent id, or binary missing from PATH. Callers (acp_spawn, acp_list_agents,
11
+ * and the `/v1/acp/spawn` HTTP route) get a single source of truth and
12
+ * matching actionable hints.
13
13
  *
14
14
  * The resolver NEVER fetches or runs packages in the (untrusted) task cwd.
15
15
  * When the adapter binary is missing, resolution simply fails with
@@ -25,16 +25,12 @@
25
25
  * `available` / `setupHint` derived from the same binary resolution.
26
26
  */
27
27
 
28
- import { basename } from "node:path";
29
-
30
28
  import {
31
- type AcpAgentProfile,
32
29
  DEFAULT_ACP_AGENT_PROFILES,
33
30
  DEFAULT_AGENT_NPM_PACKAGES,
34
31
  } from "../config/acp-defaults.js";
35
- import type { AcpAgentConfig as ConfiguredAcpAgent } from "../config/acp-schema.js";
32
+ import type { AcpAgentConfig } from "../config/acp-schema.js";
36
33
  import { getConfig } from "../config/loader.js";
37
- import type { AcpAgentConfig } from "./types.js";
38
34
 
39
35
  /**
40
36
  * Whether this agent's entry came from user config (wins over default) or
@@ -138,19 +134,6 @@ const AGENT_ID_ALIASES: Record<string, string> = {
138
134
  openaicodex: "codex",
139
135
  };
140
136
 
141
- /**
142
- * Ids that read back as inherited `Object.prototype` members instead of
143
- * configured agents. `directLookup` and `mergedAgentIds` refuse them so an id
144
- * from a tool call or an HTTP body can resolve to nothing but a real entry:
145
- * resolving one would report a configured agent that does not exist, and a
146
- * spawn would then start a process for a config nobody wrote.
147
- */
148
- const PROTOTYPE_SENSITIVE_AGENT_IDS: ReadonlySet<string> = new Set([
149
- "__proto__",
150
- "constructor",
151
- "prototype",
152
- ]);
153
-
154
137
  /**
155
138
  * Normalize a raw agent id for alias matching: lowercase and strip spaces,
156
139
  * underscores, and hyphens so "Claude Code", "claude-code", and
@@ -183,92 +166,45 @@ export function lookupAcpAgentConfig(id: string): AcpAgentConfig | undefined {
183
166
  }
184
167
 
185
168
  function lookupAgent(
186
- userAgents: Record<string, ConfiguredAcpAgent>,
169
+ userAgents: Record<string, AcpAgentConfig>,
187
170
  id: string,
188
- ): { agent: AcpAgentConfig; source: AcpAgentSource; id: string } | undefined {
171
+ ): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
189
172
  const direct = directLookup(userAgents, id);
190
173
  if (direct) {
191
- return { ...direct, id };
174
+ return direct;
192
175
  }
193
- const normalized = normalizeAgentId(id);
194
- const canonicalId = Object.hasOwn(AGENT_ID_ALIASES, normalized)
195
- ? AGENT_ID_ALIASES[normalized]
176
+ const canonicalId = AGENT_ID_ALIASES[normalizeAgentId(id)];
177
+ return canonicalId !== undefined
178
+ ? directLookup(userAgents, canonicalId)
196
179
  : undefined;
197
- if (canonicalId === undefined) {
198
- return undefined;
199
- }
200
- const aliased = directLookup(userAgents, canonicalId);
201
- return aliased ? { ...aliased, id: canonicalId } : undefined;
202
180
  }
203
181
 
204
182
  function directLookup(
205
- userAgents: Record<string, ConfiguredAcpAgent>,
183
+ userAgents: Record<string, AcpAgentConfig>,
206
184
  id: string,
207
185
  ): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
208
- if (PROTOTYPE_SENSITIVE_AGENT_IDS.has(id)) {
209
- return undefined;
210
- }
211
- const userAgent = Object.hasOwn(userAgents, id) ? userAgents[id] : undefined;
212
- const defaultAgent = Object.hasOwn(DEFAULT_ACP_AGENT_PROFILES, id)
213
- ? DEFAULT_ACP_AGENT_PROFILES[id]
214
- : undefined;
186
+ const userAgent = userAgents[id];
215
187
  if (userAgent) {
216
- const agent = mergeWithProfile(userAgent, defaultAgent);
217
- return agent ? { agent, source: "config" } : undefined;
188
+ return { agent: userAgent, source: "config" };
218
189
  }
190
+ const defaultAgent = DEFAULT_ACP_AGENT_PROFILES[id];
219
191
  if (defaultAgent) {
220
192
  return { agent: defaultAgent, source: "default" };
221
193
  }
222
194
  return undefined;
223
195
  }
224
196
 
225
- /**
226
- * Fill a user config entry from the bundled profile for the same id. An entry
227
- * that runs the profile's adapter (it omits `command`, or names the same
228
- * binary, by full path or not) inherits the leaves it leaves out: `command`
229
- * itself, the description, and the `model` a session starts on. `args` is the
230
- * exception, because the schema defaults it to `[]`: a parsed entry always
231
- * carries its own, so the profile's never reaches it. An entry that points
232
- * the id at a different adapter stands alone, like any user-only entry,
233
- * so a config that reuses the `claude` id for something else never carries
234
- * Claude's description or has Claude's `opus` sent to it. Zod omits absent
235
- * optional keys, so an omission never spreads as an undefined override.
236
- *
237
- * `undefined` only for an entry with neither a command nor a profile to take
238
- * one from, a shape the config schema rejects before it gets here.
239
- */
240
- function mergeWithProfile(
241
- userAgent: ConfiguredAcpAgent,
242
- profile: AcpAgentProfile | undefined,
243
- ): AcpAgentConfig | undefined {
244
- const command = userAgent.command;
245
- if (!profile) {
246
- return command === undefined ? undefined : { ...userAgent, command };
247
- }
248
- // A full path to the bundled binary is still the bundled adapter; the
249
- // basename is the adapter's identity everywhere else in this module.
250
- if (
251
- command !== undefined &&
252
- basename(command) !== basename(profile.command)
253
- ) {
254
- return { ...userAgent, command };
255
- }
256
- return { ...profile, ...userAgent, command: command ?? profile.command };
257
- }
258
-
259
197
  /**
260
198
  * Defaults first (declaration order), then user-only ids. Deduplicated so a
261
199
  * user config that overrides a default doesn't list the id twice.
262
200
  */
263
- function mergedAgentIds(
264
- userAgents: Record<string, ConfiguredAcpAgent>,
265
- ): string[] {
201
+ function mergedAgentIds(userAgents: Record<string, AcpAgentConfig>): string[] {
266
202
  return Array.from(
267
203
  new Set([
268
204
  ...Object.keys(DEFAULT_ACP_AGENT_PROFILES),
269
205
  ...Object.keys(userAgents),
270
206
  ]),
271
- ).filter((id) => !PROTOTYPE_SENSITIVE_AGENT_IDS.has(id));
207
+ );
272
208
  }
273
209
 
274
210
  /**
@@ -320,8 +256,7 @@ export function listAcpAgents(): {
320
256
  const config = getConfig();
321
257
  const userAgents = config.acp.agents;
322
258
  const agents: AcpAgentEntry[] = mergedAgentIds(userAgents).map((id) => {
323
- // Non-null: ids come from `mergedAgentIds`, and the schema admits a
324
- // command-less entry only for a bundled id, so the lookup always resolves.
259
+ // Non-null: ids come from `mergedAgentIds` so the lookup always resolves.
325
260
  const { agent, source } = lookupAgent(userAgents, id)!;
326
261
  // Same binary preflight as `resolveAcpAgent`: available iff the command
327
262
  // is on PATH. A missing binary is auto-installed at spawn time, but the
@@ -1,7 +1,5 @@
1
1
  import { afterEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
- import { RequestError } from "@agentclientprotocol/sdk";
4
-
5
3
  import type { Conversation } from "../daemon/conversation.js";
6
4
  import {
7
5
  deleteConversation,
@@ -41,7 +39,6 @@ mock.module("./prepare-agent-env.js", () => ({
41
39
  }));
42
40
 
43
41
  import { createAbortReason } from "../util/abort-reasons.js";
44
- import { modelOption } from "./__tests__/helpers/acp-model-option.js";
45
42
  import { VellumAcpClientHandler } from "./client-handler.js";
46
43
  import { AcpSessionManager } from "./session-manager.js";
47
44
 
@@ -93,10 +90,10 @@ function mockConversation(opts?: { enqueueQueued?: boolean }) {
93
90
  }
94
91
 
95
92
  /** Fake AcpAgentProcess covering only the calls firePromptInBackground makes. */
96
- function fakeProcess(prompt: () => Promise<unknown>, stderr = "") {
93
+ function fakeProcess(prompt: () => Promise<unknown>) {
97
94
  return {
98
95
  markStderr: () => 0,
99
- stderrSince: () => stderr,
96
+ stderrSince: () => "",
100
97
  prompt,
101
98
  kill: mock(() => {}),
102
99
  };
@@ -368,8 +365,6 @@ describe("AcpSessionManager auth-required recovery surface", () => {
368
365
  parentToolUseId?: string;
369
366
  cancelled?: boolean;
370
367
  credentialDigest?: string;
371
- failure?: () => Promise<never>;
372
- stderr?: string;
373
368
  }) {
374
369
  const manager = new AcpSessionManager(1);
375
370
  const parentId = `parent-${opts.id}`;
@@ -381,7 +376,7 @@ describe("AcpSessionManager auth-required recovery surface", () => {
381
376
  manager,
382
377
  opts.id,
383
378
  parentId,
384
- fakeProcess(opts.failure ?? authFailure, opts.stderr),
379
+ fakeProcess(authFailure),
385
380
  );
386
381
  entry.command = opts.command;
387
382
  (entry as { parentToolUseId?: string }).parentToolUseId =
@@ -517,62 +512,6 @@ describe("AcpSessionManager auth-required recovery surface", () => {
517
512
  expect(r.persistedContent).toBeUndefined();
518
513
  });
519
514
 
520
- test("claude's prompt-time 401 raises the surface when stderr names another failure", async () => {
521
- // claude-agent-acp raises it as RequestError.internalError({ errorKind },
522
- // cliText), and stderr supplies the failure message, so the auth text
523
- // survives only on the rejection's own message.
524
- refusedDigests.length = 0;
525
- const digest = claudeTokenDigest("sk-ant-oat-prompt-401");
526
- const r = await driveAuthFailure({
527
- id: "sess-auth-prompt-401",
528
- command: "claude-agent-acp",
529
- parentToolUseId: "tool-anchor-prompt-401",
530
- credentialDigest: digest,
531
- failure: () =>
532
- Promise.reject(
533
- new RequestError(
534
- -32603,
535
- "Internal error: Failed to authenticate. API Error: 401 OAuth access token has expired.",
536
- { errorKind: "authentication_failed" },
537
- ),
538
- ),
539
- stderr: '{"error":{"message":"Something else happened"}}',
540
- });
541
-
542
- expect(r.authEvent).toMatchObject({
543
- acpSessionId: "sess-auth-prompt-401",
544
- authCode: "acp_claude_auth_required",
545
- parentToolUseId: "tool-anchor-prompt-401",
546
- });
547
- expect(hasAcpConnectCardRaised(r.parentId)).toBe(true);
548
- expect(refusedDigests).toContain(digest);
549
- });
550
-
551
- test("the rejection's own message is checked when its payload names a different reason", async () => {
552
- refusedDigests.length = 0;
553
- const digest = claudeTokenDigest("sk-ant-oat-own-message");
554
- const r = await driveAuthFailure({
555
- id: "sess-auth-own-message",
556
- command: "claude-agent-acp",
557
- parentToolUseId: "tool-anchor-own-message",
558
- credentialDigest: digest,
559
- failure: () =>
560
- Promise.reject(
561
- new RequestError(
562
- -32603,
563
- "Internal error: Failed to authenticate. API Error: 401",
564
- { details: "Request failed" },
565
- ),
566
- ),
567
- stderr: '{"error":{"message":"Something else happened"}}',
568
- });
569
-
570
- expect(r.authEvent).toMatchObject({
571
- authCode: "acp_claude_auth_required",
572
- });
573
- expect(refusedDigests).toContain(digest);
574
- });
575
-
576
515
  test("a non-claude adapter never raises the surface, even on an auth-shaped failure", async () => {
577
516
  const r = await driveAuthFailure({
578
517
  id: "sess-auth-codex",
@@ -777,136 +716,4 @@ describe("AcpSessionManager.spawn: a stopped turn leaves no agent running", () =
777
716
  expect(proc.kill).toHaveBeenCalled();
778
717
  expect(internals.sessions.size).toBe(0);
779
718
  });
780
-
781
- /**
782
- * The model pin is an await of its own, and it sits after the setup
783
- * recheck. A stop landing inside it gets the same treatment: no spawned
784
- * event, no model event, no prompt, and no session left behind.
785
- */
786
- test("a cancel during the model pin tears the process down and fires nothing", async () => {
787
- const manager = new AcpSessionManager(1);
788
- const controller = new AbortController();
789
- const prompt = mock(() => Promise.resolve({}));
790
- const setConfigOption = mock(async () => {
791
- // The user stops the turn while the pin's round trip is open.
792
- controller.abort(REASON);
793
- return [modelOption("opus")];
794
- });
795
- const proc = {
796
- ...fakeProcess(prompt),
797
- spawn: () => {},
798
- initialize: async () => {},
799
- createSession: async () => ({
800
- sessionId: "proto-1",
801
- configOptions: [modelOption("sonnet")],
802
- }),
803
- setConfigOption,
804
- };
805
- let injected: ReturnType<typeof injectSession> | undefined;
806
- const internals = manager as unknown as {
807
- registerSession: (opts: {
808
- acpSessionId: string;
809
- parentConversationId: string;
810
- }) => unknown;
811
- sessions: Map<string, unknown>;
812
- };
813
- internals.registerSession = (opts) => {
814
- injected = injectSession(
815
- manager,
816
- opts.acpSessionId,
817
- opts.parentConversationId,
818
- proc as unknown as ReturnType<typeof fakeProcess>,
819
- );
820
- return injected;
821
- };
822
-
823
- await expect(
824
- manager.spawn(
825
- "claude",
826
- { command: "noop", args: [] } as never,
827
- "do the task",
828
- "/tmp",
829
- "conv-1",
830
- () => {},
831
- { model: "opus" },
832
- { signal: controller.signal },
833
- ),
834
- ).rejects.toThrow();
835
-
836
- expect(setConfigOption).toHaveBeenCalled();
837
- expect(injected?.sendToVellum).not.toHaveBeenCalled();
838
- expect(prompt).not.toHaveBeenCalled();
839
- expect(proc.kill).toHaveBeenCalled();
840
- expect(internals.sessions.size).toBe(0);
841
- });
842
-
843
- /**
844
- * A cancel that persists a resumable row frees the id, so a resume can
845
- * register a fresh entry under it before the stopped spawn's pin settles.
846
- * The teardown owes that spawn its own process, and owes the replacement
847
- * its map slot.
848
- */
849
- test("a cancel during the model pin leaves a replacement session for the same id alone", async () => {
850
- const manager = new AcpSessionManager(2);
851
- const controller = new AbortController();
852
- const prompt = mock(() => Promise.resolve({}));
853
- let replacement: ReturnType<typeof injectSession> | undefined;
854
- let spawnedId: string | undefined;
855
- const setConfigOption = mock(async () => {
856
- // The turn is stopped and the id is resumed by another request while
857
- // the pin's round trip is still open.
858
- controller.abort(REASON);
859
- replacement = injectSession(
860
- manager,
861
- spawnedId!,
862
- "conv-2",
863
- fakeProcess(mock(() => Promise.resolve({}))),
864
- );
865
- return [modelOption("opus")];
866
- });
867
- const proc = {
868
- ...fakeProcess(prompt),
869
- spawn: () => {},
870
- initialize: async () => {},
871
- createSession: async () => ({
872
- sessionId: "proto-1",
873
- configOptions: [modelOption("sonnet")],
874
- }),
875
- setConfigOption,
876
- };
877
- const internals = manager as unknown as {
878
- registerSession: (opts: {
879
- acpSessionId: string;
880
- parentConversationId: string;
881
- }) => unknown;
882
- sessions: Map<string, unknown>;
883
- };
884
- internals.registerSession = (opts) => {
885
- spawnedId = opts.acpSessionId;
886
- return injectSession(
887
- manager,
888
- opts.acpSessionId,
889
- opts.parentConversationId,
890
- proc as unknown as ReturnType<typeof fakeProcess>,
891
- );
892
- };
893
-
894
- await expect(
895
- manager.spawn(
896
- "claude",
897
- { command: "noop", args: [] } as never,
898
- "do the task",
899
- "/tmp",
900
- "conv-1",
901
- () => {},
902
- { model: "opus" },
903
- { signal: controller.signal },
904
- ),
905
- ).rejects.toThrow();
906
-
907
- expect(prompt).not.toHaveBeenCalled();
908
- expect(proc.kill).toHaveBeenCalled();
909
- expect(replacement?.process.kill).not.toHaveBeenCalled();
910
- expect(internals.sessions.get(spawnedId!)).toBe(replacement);
911
- });
912
719
  });