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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (439) hide show
  1. package/AGENTS.md +0 -4
  2. package/ARCHITECTURE.md +12 -11
  3. package/docs/architecture/turn-actor.md +8 -15
  4. package/docs/guardian-request-flow.md +0 -16
  5. package/openapi.yaml +49 -291
  6. package/package.json +1 -1
  7. package/src/__tests__/always-loaded-tools-guard.test.ts +10 -18
  8. package/src/__tests__/app-compiler.test.ts +0 -6
  9. package/src/__tests__/app-control-tool-schemas.test.ts +2 -5
  10. package/src/__tests__/app-dir-path-guard.test.ts +3 -1
  11. package/src/__tests__/app-source-watcher.test.ts +218 -0
  12. package/src/{calls/__tests__ → __tests__}/call-controller.test.ts +82 -503
  13. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +2 -5
  14. package/src/__tests__/computer-use-tools.test.ts +5 -17
  15. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  16. package/src/__tests__/config-schema.test.ts +29 -28
  17. package/src/__tests__/config-watcher-skill-reseed.test.ts +359 -0
  18. package/src/__tests__/config-watcher.test.ts +8 -23
  19. package/src/__tests__/connection-model-compat.test.ts +2 -2
  20. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  21. package/src/__tests__/conversation-pairing.test.ts +0 -26
  22. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -4
  23. package/src/__tests__/conversation-queue.test.ts +207 -48
  24. package/src/__tests__/conversation-retry-discard.test.ts +1 -54
  25. package/src/__tests__/conversation-skill-tools.test.ts +0 -27
  26. package/src/__tests__/conversation-surfaces-app-control.test.ts +3 -8
  27. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -67
  28. package/src/__tests__/conversation-title-service.test.ts +10 -14
  29. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +5 -3
  30. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -51
  31. package/src/__tests__/credential-record-retire.test.ts +1 -171
  32. package/src/__tests__/credential-routes.test.ts +3 -212
  33. package/src/__tests__/credential-security-invariants.test.ts +2 -4
  34. package/src/__tests__/cu-unified-flow.test.ts +2 -8
  35. package/src/__tests__/document-sync-tags.test.ts +0 -25
  36. package/src/__tests__/drain-kick-guard.test.ts +2 -0
  37. package/src/__tests__/drain-requeue-on-contention.test.ts +6 -0
  38. package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
  39. package/src/__tests__/host-bash-proxy.test.ts +45 -26
  40. package/src/__tests__/host-browser-proxy.test.ts +17 -6
  41. package/src/__tests__/host-file-proxy-targeted.test.ts +0 -23
  42. package/src/__tests__/host-file-proxy.test.ts +23 -11
  43. package/src/__tests__/host-transfer-proxy-targeted.test.ts +9 -30
  44. package/src/__tests__/llm-catalog-parity.test.ts +0 -25
  45. package/src/__tests__/mcp-auth-routes.test.ts +9 -6
  46. package/src/__tests__/mcp-config-secret-boundary.test.ts +136 -78
  47. package/src/__tests__/mcp-health-check.test.ts +11 -8
  48. package/src/__tests__/mcp-list-plugin-servers.test.ts +10 -8
  49. package/src/{calls/__tests__ → __tests__}/media-stream-audio-transcode.test.ts +1 -1
  50. package/src/{calls/__tests__ → __tests__}/media-stream-output.test.ts +8 -37
  51. package/src/{calls/__tests__ → __tests__}/media-stream-parser.test.ts +1 -1
  52. package/src/{calls/__tests__ → __tests__}/media-stream-server-integration.test.ts +57 -150
  53. package/src/{calls/__tests__ → __tests__}/media-stream-stt-session.test.ts +5 -5
  54. package/src/{calls/__tests__ → __tests__}/media-turn-detector.test.ts +1 -1
  55. package/src/__tests__/messages-after-tiebreaker.test.ts +0 -91
  56. package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
  57. package/src/__tests__/messaging-send-tool.test.ts +548 -355
  58. package/src/__tests__/model-intents.test.ts +0 -3
  59. package/src/__tests__/notification-vellum-adapter.test.ts +2 -85
  60. package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
  61. package/src/__tests__/platform-callback-registration.test.ts +16 -8
  62. package/src/__tests__/platform-client-verify-credential.test.ts +0 -2
  63. package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -13
  64. package/src/__tests__/script-proxy-certs.test.ts +0 -35
  65. package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
  66. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  67. package/src/__tests__/speaker-identification.test.ts +56 -0
  68. package/src/__tests__/subagent-tool-gate-mode.test.ts +3 -19
  69. package/src/__tests__/subagent-tools.test.ts +2 -3
  70. package/src/__tests__/telephony-tts-guard.test.ts +3 -38
  71. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -4
  72. package/src/{calls/__tests__/voice-session-bridge-turn-flow.test.ts → __tests__/voice-session-bridge.test.ts} +12 -20
  73. package/src/__tests__/watch-retro-tool-availability.test.ts +17 -8
  74. package/src/__tests__/workspace-git-service.test.ts +0 -26
  75. package/src/acp/__tests__/agent-process.test.ts +4 -258
  76. package/src/acp/__tests__/auth-required.test.ts +0 -96
  77. package/src/acp/__tests__/client-handler.test.ts +2 -90
  78. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -5
  79. package/src/acp/__tests__/session-manager-resume.test.ts +6 -270
  80. package/src/acp/__tests__/session-manager-usage.test.ts +2 -4
  81. package/src/acp/__tests__/session-manager.test.ts +4 -895
  82. package/src/acp/agent-process.test.ts +1 -4
  83. package/src/acp/agent-process.ts +9 -94
  84. package/src/acp/auth-required.ts +1 -50
  85. package/src/acp/auto-install.test.ts +7 -9
  86. package/src/acp/client-handler.ts +3 -16
  87. package/src/acp/resolve-agent.test.ts +6 -220
  88. package/src/acp/resolve-agent.ts +23 -88
  89. package/src/acp/session-manager.test.ts +3 -196
  90. package/src/acp/session-manager.ts +18 -441
  91. package/src/acp/types.ts +5 -50
  92. package/src/api/events/app-files-changed.ts +3 -4
  93. package/src/api/events/notification-intent.ts +0 -2
  94. package/src/api/index.ts +0 -6
  95. package/src/apps/app-store.ts +1 -1
  96. package/src/bundler/app-compiler.ts +0 -15
  97. package/src/calls/__tests__/voice-control-protocol.test.ts +25 -58
  98. package/src/calls/__tests__/voice-session-bridge.test.ts +1 -37
  99. package/src/calls/__tests__/voice-triage-escalate.test.ts +0 -105
  100. package/src/calls/call-constants.ts +4 -24
  101. package/src/calls/call-controller.ts +199 -499
  102. package/src/calls/call-transport.ts +0 -16
  103. package/src/calls/media-stream-output.ts +0 -32
  104. package/src/calls/media-stream-server.ts +30 -82
  105. package/src/calls/media-stream-stt-session.ts +0 -15
  106. package/src/calls/resolve-call-tts-provider.ts +2 -33
  107. package/src/calls/speaker-identification.ts +233 -0
  108. package/src/calls/tts-call-strategy.ts +5 -9
  109. package/src/calls/types.ts +0 -2
  110. package/src/calls/voice-control-protocol.ts +21 -53
  111. package/src/calls/voice-session-bridge.ts +46 -59
  112. package/src/calls/voice-triage-escalate.ts +56 -175
  113. package/src/cli/commands/apps.help.ts +13 -67
  114. package/src/cli/commands/apps.ts +0 -183
  115. package/src/cli/commands/bash.help.ts +13 -8
  116. package/src/cli/commands/bash.ts +25 -7
  117. package/src/cli/commands/channels/index.help.ts +2 -70
  118. package/src/cli/commands/channels/index.ts +3 -16
  119. package/src/cli/commands/credentials.help.ts +2 -6
  120. package/src/cli/commands/credentials.ts +2 -2
  121. package/src/cli/commands/mcp.help.ts +8 -8
  122. package/src/cli/commands/mcp.ts +1 -1
  123. package/src/cli/commands/roadmap.help.ts +1 -5
  124. package/src/cli/commands/roadmap.ts +1 -1
  125. package/src/cli/lib/bundled-marketplace.json +90 -103
  126. package/src/config/__tests__/default-profile-catalog.test.ts +0 -22
  127. package/src/config/__tests__/memory-retrospective-schema.test.ts +1 -15
  128. package/src/config/__tests__/platform-rehydration.test.ts +9 -99
  129. package/src/config/acp-defaults.test.ts +3 -13
  130. package/src/config/acp-defaults.ts +6 -23
  131. package/src/config/acp-schema.ts +2 -30
  132. package/src/config/bundled-skills/acp/SKILL.md +14 -22
  133. package/src/config/bundled-skills/acp/TOOLS.json +1 -5
  134. package/src/config/bundled-skills/app-builder/SKILL.md +9 -12
  135. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
  136. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  137. package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
  138. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +139 -67
  139. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
  140. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  141. package/src/config/bundled-skills/screen-annotation/SKILL.md +1 -8
  142. package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +1 -4
  143. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  144. package/src/config/default-profile-catalog.ts +1 -1
  145. package/src/config/env.ts +2 -2
  146. package/src/config/feature-flag-registry.json +12 -24
  147. package/src/config/loader.ts +0 -1
  148. package/src/config/memory-v3-gate.test.ts +0 -31
  149. package/src/config/memory-v3-gate.ts +16 -20
  150. package/src/config/platform-rehydration.ts +27 -11
  151. package/src/config/schema.ts +2 -2
  152. package/src/config/schemas/__tests__/live-voice.test.ts +158 -8
  153. package/src/config/schemas/calls.ts +28 -1
  154. package/src/config/schemas/live-voice.ts +173 -1
  155. package/src/config/schemas/mcp.ts +1 -1
  156. package/src/config/schemas/memory-retrospective.ts +0 -10
  157. package/src/config/schemas/services.ts +0 -8
  158. package/src/config/schemas/skills.ts +14 -0
  159. package/src/credential-execution/process-manager.test.ts +19 -18
  160. package/src/daemon/__tests__/conversation-tool-setup.test.ts +121 -66
  161. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +1 -4
  162. package/src/daemon/app-source-watcher.ts +218 -0
  163. package/src/daemon/config-watcher.ts +194 -13
  164. package/src/daemon/conversation-process.ts +64 -35
  165. package/src/daemon/conversation-skill-tools.ts +31 -13
  166. package/src/daemon/conversation-store.ts +1 -1
  167. package/src/daemon/conversation-surfaces.ts +8 -10
  168. package/src/daemon/conversation-tool-setup.ts +43 -37
  169. package/src/daemon/conversation.ts +3 -0
  170. package/src/daemon/host-bash-proxy.ts +12 -8
  171. package/src/daemon/host-browser-proxy.ts +1 -15
  172. package/src/daemon/host-file-proxy.ts +10 -8
  173. package/src/daemon/host-transfer-proxy.ts +18 -14
  174. package/src/daemon/lifecycle.ts +5 -0
  175. package/src/daemon/mcp-reload-service.ts +5 -5
  176. package/src/daemon/message-types/sync.ts +0 -1
  177. package/src/daemon/orphan-reaper.ts +1 -1
  178. package/src/daemon/providers-setup.ts +1 -1
  179. package/src/daemon/shutdown-handlers.ts +9 -1
  180. package/src/daemon/skill-memory-refresh.ts +0 -64
  181. package/src/daemon/tool-side-effects.ts +18 -7
  182. package/src/home/__tests__/feed-writer.test.ts +0 -22
  183. package/src/home/feed-writer.ts +2 -11
  184. package/src/hooks/types.ts +0 -33
  185. package/src/inbound/platform-callback-registration.ts +5 -4
  186. package/src/live-voice/__tests__/live-voice-metrics.test.ts +3 -0
  187. package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
  188. package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
  189. package/src/{calls → live-voice}/__tests__/progress-narration.test.ts +4 -4
  190. package/src/{calls → live-voice}/__tests__/progress-phrases.test.ts +1 -1
  191. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +69 -13
  192. package/src/live-voice/live-voice-session.ts +693 -213
  193. package/src/{calls → live-voice}/progress-narration.ts +2 -2
  194. package/src/live-voice/protocol.ts +2 -0
  195. package/src/mcp/__tests__/effective-config.test.ts +2 -2
  196. package/src/mcp/effective-config.ts +3 -3
  197. package/src/mcp/mcp-header-store.ts +45 -29
  198. package/src/mcp/startup.ts +4 -8
  199. package/src/messaging/provider.ts +3 -10
  200. package/src/messaging/providers/callback-routing.ts +0 -18
  201. package/src/messaging/providers/channel-transport.ts +0 -56
  202. package/src/messaging/providers/discord/transport.ts +0 -17
  203. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +17 -6
  204. package/src/messaging/providers/slack/adapter.ts +44 -7
  205. package/src/messaging/providers/slack/transport.ts +0 -16
  206. package/src/messaging/providers/telegram-bot/adapter.ts +48 -1
  207. package/src/messaging/providers/telegram-bot/client.ts +26 -0
  208. package/src/messaging/providers/telegram-bot/transport.ts +0 -20
  209. package/src/messaging/providers/whatsapp/adapter.ts +48 -1
  210. package/src/messaging/providers/whatsapp/client.ts +29 -0
  211. package/src/messaging/providers/whatsapp/transport.ts +0 -18
  212. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +0 -8
  213. package/src/notifications/__tests__/assistant-reply-producer.test.ts +0 -55
  214. package/src/notifications/__tests__/guardian-feed-projection.test.ts +2 -158
  215. package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
  216. package/src/notifications/__tests__/schedule-result-producer.test.ts +3 -99
  217. package/src/notifications/adapters/macos.ts +0 -3
  218. package/src/notifications/assistant-reply-producer.ts +3 -8
  219. package/src/notifications/conversation-pairing.ts +16 -36
  220. package/src/notifications/delivered-post-record.ts +1 -11
  221. package/src/notifications/guardian-feed-projection.ts +5 -125
  222. package/src/notifications/home-feed-side-effect.ts +7 -55
  223. package/src/notifications/schedule-result-producer.ts +22 -66
  224. package/src/oauth/__tests__/seed-providers-managed.test.ts +0 -54
  225. package/src/oauth/byo-connection.test.ts +0 -45
  226. package/src/oauth/byo-connection.ts +6 -36
  227. package/src/oauth/connection-resolver.test.ts +0 -73
  228. package/src/oauth/connection-resolver.ts +2 -95
  229. package/src/oauth/seed-providers.ts +0 -165
  230. package/src/outbound-proxy/certs.ts +5 -3
  231. package/src/permissions/checker.test.ts +6 -11
  232. package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
  233. package/src/persistence/conversation-crud.ts +63 -71
  234. package/src/persistence/conversation-lineage.ts +4 -12
  235. package/src/persistence/conversation-title-service.ts +26 -9
  236. package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
  237. package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
  238. package/src/persistence/message-reads.ts +0 -30
  239. package/src/persistence/migrations/157-invite-contact-id.ts +6 -18
  240. package/src/persistence/schema/memory-core.ts +0 -5
  241. package/src/platform/client.test.ts +2 -4
  242. package/src/platform/client.ts +10 -2
  243. package/src/plugin-api/constants.ts +0 -2
  244. package/src/plugin-api/index.ts +0 -1
  245. package/src/plugin-api/types.ts +0 -2
  246. package/src/plugins/defaults/index.ts +0 -2
  247. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +0 -46
  248. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +5 -9
  249. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +10 -20
  250. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -219
  251. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +0 -31
  252. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -63
  253. package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +0 -4
  254. package/src/plugins/defaults/memory/graph/capability-seed.ts +6 -4
  255. package/src/plugins/defaults/memory/hooks/init.ts +0 -10
  256. package/src/plugins/defaults/memory/hooks/shutdown.ts +0 -2
  257. package/src/plugins/defaults/memory/jobs-worker.ts +0 -13
  258. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +60 -34
  259. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -3
  260. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -12
  261. package/src/plugins/defaults/memory/memory-retrospective-state.ts +71 -312
  262. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +1 -2
  263. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +3 -5
  264. package/src/plugins/defaults/memory/startup.ts +1 -6
  265. package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +9 -7
  266. package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
  267. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +0 -89
  268. package/src/plugins/defaults/memory/worker.ts +0 -6
  269. package/src/plugins/mcp-servers.ts +75 -15
  270. package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
  271. package/src/providers/gemini/client.ts +23 -9
  272. package/src/providers/inference/auth.ts +3 -2
  273. package/src/providers/inference/connection-availability.ts +8 -27
  274. package/src/providers/inference/resolve-auth.ts +4 -22
  275. package/src/providers/model-catalog.ts +0 -34
  276. package/src/providers/model-intents.ts +5 -10
  277. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +18 -146
  278. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +1 -83
  279. package/src/providers/openai/chat-completions-provider.ts +78 -192
  280. package/src/providers/openai/codex-models.ts +4 -0
  281. package/src/runtime/AGENTS.md +0 -2
  282. package/src/runtime/auth/same-actor.ts +3 -38
  283. package/src/runtime/http-server.ts +151 -160
  284. package/src/runtime/routes/__tests__/acp-routes.test.ts +4 -159
  285. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -108
  286. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +2 -2
  287. package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +12 -16
  288. package/src/runtime/routes/acp-routes.test.ts +0 -15
  289. package/src/runtime/routes/acp-routes.ts +9 -72
  290. package/src/runtime/routes/app-management-routes.ts +0 -73
  291. package/src/runtime/routes/app-routes.ts +1 -1
  292. package/src/runtime/routes/conversation-list-routes.ts +3 -14
  293. package/src/runtime/routes/conversation-query-routes.ts +0 -40
  294. package/src/runtime/routes/credential-routes.ts +10 -19
  295. package/src/runtime/routes/debug-bash-routes.ts +173 -0
  296. package/src/runtime/routes/diagnostics-routes.ts +3 -55
  297. package/src/runtime/routes/index.ts +2 -4
  298. package/src/runtime/routes/log-export-routes.ts +0 -2
  299. package/src/runtime/routes/mcp-auth-routes.ts +47 -39
  300. package/src/runtime/routes/migration-routes.ts +20 -6
  301. package/src/runtime/routes/platform-routes.ts +15 -18
  302. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -28
  303. package/src/runtime/services/conversation-serializer.ts +3 -16
  304. package/src/runtime/sync/resource-sync-events.ts +1 -2
  305. package/src/schedule/worker.ts +1 -1
  306. package/src/security/ces-rpc-record-backend.ts +0 -7
  307. package/src/subagent/consult-context.ts +25 -12
  308. package/src/tools/acp/list-agents.test.ts +1 -3
  309. package/src/tools/acp/spawn.test.ts +11 -146
  310. package/src/tools/acp/spawn.ts +3 -21
  311. package/src/tools/acp/status.ts +3 -40
  312. package/src/tools/app-control/skill-proxy-bridge.ts +1 -2
  313. package/src/tools/capability-offer.test.ts +2 -22
  314. package/src/tools/capability-offer.ts +1 -16
  315. package/src/tools/computer-use/definitions.ts +2 -4
  316. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -2
  317. package/src/tools/credentials/metadata-store.ts +0 -100
  318. package/src/tools/host-filesystem/edit.test.ts +1 -2
  319. package/src/tools/host-filesystem/edit.ts +2 -2
  320. package/src/tools/host-filesystem/read.test.ts +1 -2
  321. package/src/tools/host-filesystem/read.ts +2 -2
  322. package/src/tools/host-filesystem/transfer.test.ts +1 -2
  323. package/src/tools/host-filesystem/transfer.ts +2 -2
  324. package/src/tools/host-filesystem/write.test.ts +1 -2
  325. package/src/tools/host-filesystem/write.ts +2 -2
  326. package/src/tools/host-terminal/host-shell.test.ts +0 -16
  327. package/src/tools/host-terminal/host-shell.ts +20 -4
  328. package/src/tools/policy-context.ts +7 -6
  329. package/src/tools/subagent/spawn.ts +8 -5
  330. package/src/tools/watch/watch-retro-report.ts +8 -0
  331. package/src/util/__tests__/language-subtag.test.ts +1 -23
  332. package/src/util/fs-watcher-error.ts +36 -0
  333. package/src/util/language-subtag.ts +0 -16
  334. package/src/util/platform.ts +0 -8
  335. package/src/workspace/git-service.ts +54 -5
  336. package/src/workspace/migrations/registry.ts +0 -6
  337. package/scripts/smoke-desktop-window-theme.ts +0 -186
  338. package/src/__tests__/git-porcelain.test.ts +0 -47
  339. package/src/__tests__/helpers/set-workspace-mcp.ts +0 -11
  340. package/src/__tests__/message-deleted-hook-dispatch.test.ts +0 -119
  341. package/src/__tests__/resolve-app.test.ts +0 -135
  342. package/src/__tests__/service-account-token.test.ts +0 -247
  343. package/src/__tests__/source-fingerprint.test.ts +0 -184
  344. package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +0 -336
  345. package/src/acp/__tests__/helpers/acp-model-option.ts +0 -51
  346. package/src/acp/model-config.test.ts +0 -166
  347. package/src/acp/model-config.ts +0 -138
  348. package/src/api/events/acp-session-model-update.test.ts +0 -88
  349. package/src/api/events/acp-session-model-update.ts +0 -46
  350. package/src/apps/resolve-app.ts +0 -81
  351. package/src/apps/source-fingerprint.ts +0 -266
  352. package/src/calls/__tests__/barge-in-guard.test.ts +0 -81
  353. package/src/calls/__tests__/voice-leg-coordinator.test.ts +0 -229
  354. package/src/calls/__tests__/voice-progress-cadence.test.ts +0 -274
  355. package/src/calls/barge-in-guard.ts +0 -118
  356. package/src/calls/voice-leg-coordinator.ts +0 -189
  357. package/src/calls/voice-progress-cadence.ts +0 -423
  358. package/src/cli/commands/__tests__/apps.test.ts +0 -245
  359. package/src/cli/commands/__tests__/bash.test.ts +0 -53
  360. package/src/cli/commands/__tests__/roadmap.help.test.ts +0 -19
  361. package/src/cli/commands/channels/__tests__/send.test.ts +0 -218
  362. package/src/cli/commands/channels/send.ts +0 -128
  363. package/src/config/__tests__/platform-identity.test.ts +0 -255
  364. package/src/config/acp-agent-write.ts +0 -43
  365. package/src/config/acp-schema.test.ts +0 -81
  366. package/src/config/platform-identity.ts +0 -201
  367. package/src/config/schemas/__tests__/voice.test.ts +0 -148
  368. package/src/config/schemas/voice.ts +0 -150
  369. package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +0 -133
  370. package/src/daemon/app-change-notify.ts +0 -45
  371. package/src/desktop/__tests__/fake-desktop.ts +0 -119
  372. package/src/desktop/desktop-chrome-policy.test.ts +0 -71
  373. package/src/desktop/desktop-chrome-policy.ts +0 -42
  374. package/src/desktop/desktop-dependencies.test.ts +0 -102
  375. package/src/desktop/desktop-dependencies.ts +0 -306
  376. package/src/desktop/desktop-feature.test.ts +0 -18
  377. package/src/desktop/desktop-feature.ts +0 -19
  378. package/src/desktop/desktop-panel-config.test.ts +0 -135
  379. package/src/desktop/desktop-panel-config.ts +0 -149
  380. package/src/desktop/desktop-session-manager.test.ts +0 -627
  381. package/src/desktop/desktop-session-manager.ts +0 -814
  382. package/src/desktop/desktop-stream-bridge.test.ts +0 -395
  383. package/src/desktop/desktop-stream-bridge.ts +0 -214
  384. package/src/desktop/desktop-wallpaper.test.ts +0 -191
  385. package/src/desktop/desktop-wallpaper.ts +0 -113
  386. package/src/desktop/desktop-window-theme.ts +0 -170
  387. package/src/i18n/AGENTS.md +0 -22
  388. package/src/i18n/__tests__/i18n.test.ts +0 -108
  389. package/src/i18n/index.ts +0 -16
  390. package/src/i18n/locales.ts +0 -93
  391. package/src/i18n/messages.ts +0 -61
  392. package/src/i18n/title.ts +0 -25
  393. package/src/mcp/__tests__/workspace-mcp-config.test.ts +0 -135
  394. package/src/mcp/spec-schema.ts +0 -111
  395. package/src/mcp/workspace-mcp-config.ts +0 -188
  396. package/src/messaging/providers/__tests__/proactive-address.test.ts +0 -95
  397. package/src/persistence/conversation-title-placeholders.ts +0 -23
  398. package/src/persistence/message-cursor.ts +0 -78
  399. package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +0 -149
  400. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +0 -118
  401. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +0 -83
  402. package/src/plugins/defaults/memory/hooks/message-deleted.ts +0 -21
  403. package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +0 -126
  404. package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +0 -79
  405. package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +0 -28
  406. package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +0 -9
  407. package/src/providers/gemini-thought-signature.test.ts +0 -63
  408. package/src/providers/gemini-thought-signature.ts +0 -44
  409. package/src/providers/inference/service-account-token.ts +0 -248
  410. package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +0 -613
  411. package/src/providers/openai/__tests__/google-thought-signature.test.ts +0 -235
  412. package/src/providers/openai/google-thought-signature.ts +0 -320
  413. package/src/runtime/__tests__/channel-send.test.ts +0 -443
  414. package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +0 -89
  415. package/src/runtime/__tests__/live-voice-upgrade.test.ts +0 -58
  416. package/src/runtime/__tests__/runtime-ws-test-utils.ts +0 -72
  417. package/src/runtime/__tests__/watch-stream-upgrade.test.ts +0 -59
  418. package/src/runtime/channel-send.ts +0 -316
  419. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +0 -205
  420. package/src/runtime/routes/__tests__/channel-send-routes.test.ts +0 -127
  421. package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +0 -107
  422. package/src/runtime/routes/channel-send-routes.ts +0 -85
  423. package/src/runtime/routes/desktop-setup-routes.test.ts +0 -74
  424. package/src/runtime/routes/desktop-setup-routes.ts +0 -35
  425. package/src/security/__tests__/ces-http-record-backend.test.ts +0 -137
  426. package/src/security/ces-http-record-backend.ts +0 -120
  427. package/src/skills/__tests__/workspace-skill-md-signature.test.ts +0 -60
  428. package/src/skills/workspace-skill-md-signature.ts +0 -50
  429. package/src/tools/acp/status.test.ts +0 -94
  430. package/src/tools/terminal/__tests__/sanitized-bash.test.ts +0 -57
  431. package/src/tools/terminal/sanitized-bash.ts +0 -105
  432. package/src/util/ca-bundle.ts +0 -13
  433. package/src/workspace/git-porcelain.ts +0 -66
  434. package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +0 -258
  435. package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +0 -78
  436. package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +0 -214
  437. package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +0 -102
  438. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +0 -199
  439. /package/src/{calls → live-voice}/progress-phrases.ts +0 -0
@@ -1,4 +1,4 @@
1
- import { mkdirSync, readFileSync, rmSync, utimesSync, writeFileSync } from "node:fs";
1
+ import { readFileSync, utimesSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
  import { beforeEach, describe, expect, mock, test } from "bun:test";
4
4
 
@@ -14,6 +14,14 @@ mock.module("../util/logger.js", () => ({
14
14
  truncateForLog: (value: string, maxLen = 500) => value.slice(0, maxLen),
15
15
  }));
16
16
 
17
+ // The config routes under test read and write the workspace config.json via
18
+ // the real loader (`loadRawConfig`/`saveRawConfig`). Tests seed the raw file
19
+ // directly (the fixtures are raw-file shapes, including deliberately
20
+ // malformed trees, so the whole file is replaced rather than composed via
21
+ // `setConfig`) and detect commits by comparing the on-disk text against the
22
+ // seeded snapshot — `saveRawConfig` pretty-prints, so any commit changes the
23
+ // text.
24
+ let rawConfig: Record<string, unknown> = {};
17
25
  let seededRawText = "";
18
26
  let mtimeSeq = 0;
19
27
 
@@ -21,23 +29,19 @@ function configJsonPath(): string {
21
29
  return join(process.env.VELLUM_WORKSPACE_DIR!, "config.json");
22
30
  }
23
31
 
24
- function mcpJsonPath(): string {
25
- return join(process.env.VELLUM_WORKSPACE_DIR!, "mcp.json");
26
- }
27
-
32
+ /** Write `raw` to the workspace config.json as the seeded pre-test state. */
28
33
  function seedRawConfig(raw: Record<string, unknown>): void {
34
+ rawConfig = raw;
29
35
  seededRawText = JSON.stringify(raw);
30
- mkdirSync(process.env.VELLUM_WORKSPACE_DIR!, { recursive: true });
31
36
  writeFileSync(configJsonPath(), seededRawText);
37
+ // Distinct mtime per write so the loader's file-signature cache can never
38
+ // read two consecutive seeds as identical.
32
39
  mtimeSeq += 1;
33
40
  const stamp = new Date(Date.now() + mtimeSeq);
34
41
  utimesSync(configJsonPath(), stamp, stamp);
35
42
  }
36
43
 
37
- function seedWorkspaceMcp(document: unknown): void {
38
- writeFileSync(mcpJsonPath(), JSON.stringify(document, null, 2) + "\n");
39
- }
40
-
44
+ /** The raw config a route commit persisted, or null when nothing was saved. */
41
45
  function committedRaw(): Record<string, unknown> | null {
42
46
  const text = readFileSync(configJsonPath(), "utf8");
43
47
  if (text === seededRawText) {
@@ -115,6 +119,11 @@ const configGetRoute = findRoute("config_get");
115
119
  const configPatchRoute = findRoute("config_patch");
116
120
  const configSetRoute = findRoute("config_set");
117
121
 
122
+ /**
123
+ * Config responses inject the code-catalog default profiles into
124
+ * `llm.profiles` (the effective wire view). These tests pin the MCP secret
125
+ * boundary, so drop the injected block before whole-response comparisons.
126
+ */
118
127
  function withoutWireProfiles(
119
128
  result: Record<string, unknown>,
120
129
  ): Record<string, unknown> {
@@ -125,18 +134,21 @@ function withoutWireProfiles(
125
134
  describe("MCP config secret boundary", () => {
126
135
  beforeEach(() => {
127
136
  seedRawConfig({});
128
- rmSync(mcpJsonPath(), { force: true });
129
137
  });
130
138
 
131
- test("config_get omits MCP headers from the mcp.json overlay", () => {
132
- seedWorkspaceMcp({
133
- mcpServers: {
134
- remote: {
135
- type: "streamable-http",
136
- url: "https://mcp.example.com",
137
- headers: {
138
- Authorization: "Bearer mcp-secret",
139
- "X-API-Key": "mcp-api-secret",
139
+ test("config_get omits legacy MCP transport headers from settings-read responses", () => {
140
+ seedRawConfig({
141
+ mcp: {
142
+ servers: {
143
+ remote: {
144
+ transport: {
145
+ type: "streamable-http",
146
+ url: "https://mcp.example.com",
147
+ headers: {
148
+ Authorization: "Bearer mcp-secret",
149
+ "X-API-Key": "mcp-api-secret",
150
+ },
151
+ },
140
152
  },
141
153
  },
142
154
  },
@@ -155,61 +167,64 @@ describe("MCP config secret boundary", () => {
155
167
  });
156
168
  });
157
169
 
158
- test("config_get ignores leftover config.json mcp so its headers cannot leak", () => {
170
+ test("config_get omits headers inside malformed MCP server trees", () => {
159
171
  seedRawConfig({
160
172
  mcp: {
161
- servers: {
162
- remote: {
173
+ servers: [
174
+ {
163
175
  transport: {
164
- type: "streamable-http",
165
- url: "https://mcp.example.com",
166
- headers: { Authorization: "Bearer leftover-secret" },
176
+ headers: { Authorization: "Bearer malformed-secret" },
167
177
  },
168
178
  },
169
- },
179
+ ],
170
180
  },
171
181
  });
172
182
 
173
183
  const result = configGetRoute.handler({}) as Record<string, unknown>;
174
184
 
175
- expect(JSON.stringify(result)).not.toContain("leftover-secret");
176
- expect(
177
- (result.mcp as { servers: Record<string, unknown> }).servers,
178
- ).toEqual({});
185
+ expect(JSON.stringify(result)).not.toContain("malformed-secret");
186
+ expect(withoutWireProfiles(result)).toEqual({
187
+ mcp: {
188
+ servers: [
189
+ {
190
+ transport: {},
191
+ },
192
+ ],
193
+ },
194
+ });
179
195
  });
180
196
 
181
197
  test("config_get preserves an MCP server named headers", () => {
182
- seedWorkspaceMcp({
183
- mcpServers: {
184
- headers: {
185
- type: "streamable-http",
186
- url: "https://mcp.example.com",
198
+ seedRawConfig({
199
+ mcp: {
200
+ servers: {
201
+ headers: {
202
+ transport: {
203
+ type: "streamable-http",
204
+ url: "https://mcp.example.com",
205
+ },
206
+ },
187
207
  },
188
208
  },
189
209
  });
190
210
 
191
211
  const result = configGetRoute.handler({}) as Record<string, unknown>;
192
212
 
193
- expect(withoutWireProfiles(result).mcp).toEqual({
194
- servers: {
195
- headers: {
196
- transport: {
197
- type: "streamable-http",
198
- url: "https://mcp.example.com",
199
- },
200
- },
201
- },
202
- });
213
+ expect(withoutWireProfiles(result)).toEqual(rawConfig);
203
214
  });
204
215
 
205
216
  test("config_get preserves non-credential headers env vars", () => {
206
- seedWorkspaceMcp({
207
- mcpServers: {
208
- local: {
209
- type: "stdio",
210
- command: "npx",
211
- env: {
212
- headers: "not-a-transport-header",
217
+ seedRawConfig({
218
+ mcp: {
219
+ servers: {
220
+ local: {
221
+ transport: {
222
+ type: "stdio",
223
+ command: "npx",
224
+ env: {
225
+ headers: "not-a-transport-header",
226
+ },
227
+ },
213
228
  },
214
229
  },
215
230
  },
@@ -217,20 +232,7 @@ describe("MCP config secret boundary", () => {
217
232
 
218
233
  const result = configGetRoute.handler({}) as Record<string, unknown>;
219
234
 
220
- expect(withoutWireProfiles(result).mcp).toEqual({
221
- servers: {
222
- local: {
223
- transport: {
224
- type: "stdio",
225
- command: "npx",
226
- args: [],
227
- env: {
228
- headers: "not-a-transport-header",
229
- },
230
- },
231
- },
232
- },
233
- });
235
+ expect(withoutWireProfiles(result)).toEqual(rawConfig);
234
236
  });
235
237
 
236
238
  test("config_patch rejects MCP transport headers so generic writes cannot reintroduce plaintext credentials", async () => {
@@ -254,7 +256,7 @@ describe("MCP config secret boundary", () => {
254
256
  expect(committedRaw()).toBeNull();
255
257
  });
256
258
 
257
- test("config_patch strips mcp so a full-config round trip cannot write it back", async () => {
259
+ test("config_patch allows an MCP server named headers when its value has no header credentials", async () => {
258
260
  const result = await configPatchRoute.handler({
259
261
  body: {
260
262
  mcp: {
@@ -270,25 +272,68 @@ describe("MCP config secret boundary", () => {
270
272
  },
271
273
  });
272
274
 
273
- expect(committedRaw()?.mcp).toBeUndefined();
274
- expect(
275
- (result as { mcp: { servers: Record<string, unknown> } }).mcp.servers,
276
- ).toEqual({});
275
+ expect(withoutWireProfiles(result as Record<string, unknown>)).toEqual({
276
+ mcp: {
277
+ servers: {
278
+ headers: {
279
+ transport: {
280
+ type: "streamable-http",
281
+ url: "https://mcp.example.com",
282
+ },
283
+ },
284
+ },
285
+ },
286
+ });
287
+ });
288
+
289
+ test("config_patch allows non-credential headers env vars", async () => {
290
+ const result = await configPatchRoute.handler({
291
+ body: {
292
+ mcp: {
293
+ servers: {
294
+ local: {
295
+ transport: {
296
+ type: "stdio",
297
+ command: "npx",
298
+ env: {
299
+ headers: "not-a-transport-header",
300
+ },
301
+ },
302
+ },
303
+ },
304
+ },
305
+ },
306
+ });
307
+
308
+ expect(withoutWireProfiles(result as Record<string, unknown>)).toEqual({
309
+ mcp: {
310
+ servers: {
311
+ local: {
312
+ transport: {
313
+ type: "stdio",
314
+ command: "npx",
315
+ env: {
316
+ headers: "not-a-transport-header",
317
+ },
318
+ },
319
+ },
320
+ },
321
+ },
322
+ });
277
323
  });
278
324
 
279
- test("config_set rejects MCP server writes", async () => {
325
+ test("config_set rejects malformed MCP server trees containing headers", async () => {
280
326
  await expect(
281
327
  configSetRoute.handler({
282
328
  body: {
283
329
  path: "mcp.servers",
284
- value: {
285
- remote: {
330
+ value: [
331
+ {
286
332
  transport: {
287
- type: "streamable-http",
288
- url: "https://mcp.example.com",
333
+ headers: { Authorization: "Bearer malformed-secret" },
289
334
  },
290
335
  },
291
- },
336
+ ],
292
337
  },
293
338
  }),
294
339
  ).rejects.toThrow(BadRequestError);
@@ -296,6 +341,19 @@ describe("MCP config secret boundary", () => {
296
341
  });
297
342
 
298
343
  test("config_set rejects direct MCP transport header paths", async () => {
344
+ seedRawConfig({
345
+ mcp: {
346
+ servers: {
347
+ remote: {
348
+ transport: {
349
+ type: "streamable-http",
350
+ url: "https://mcp.example.com",
351
+ },
352
+ },
353
+ },
354
+ },
355
+ });
356
+
299
357
  await expect(
300
358
  configSetRoute.handler({
301
359
  body: {
@@ -18,14 +18,17 @@ mock.module("../mcp/client.js", () => ({
18
18
  },
19
19
  }));
20
20
 
21
- import { setWorkspaceMcp } from "./helpers/set-workspace-mcp.js";
22
-
23
- // Seed the MCP server the list route reads from workspace mcp.json.
24
- setWorkspaceMcp({
25
- test: {
26
- transport: {
27
- type: "streamable-http",
28
- url: "https://example.com/mcp",
21
+ import { setConfig } from "./helpers/set-config.js";
22
+
23
+ // Seed the MCP server the list route reads via `loadRawConfig()` into the
24
+ // workspace config for real.
25
+ setConfig("mcp", {
26
+ servers: {
27
+ test: {
28
+ transport: {
29
+ type: "streamable-http",
30
+ url: "https://example.com/mcp",
31
+ },
29
32
  },
30
33
  },
31
34
  });
@@ -68,15 +68,17 @@ mock.module("../daemon/mcp-reload-service.js", () => ({
68
68
  reloadMcpServers: async () => {},
69
69
  }));
70
70
 
71
- import { setWorkspaceMcp } from "./helpers/set-workspace-mcp.js";
71
+ import { setConfig } from "./helpers/set-config.js";
72
72
 
73
- setWorkspaceMcp({
74
- "from-workspace": {
75
- transport: { type: "streamable-http", url: "https://config.example/mcp" },
76
- },
77
- // Deliberately shares an id with the `shadowed` plugin below.
78
- shadowed: {
79
- transport: { type: "streamable-http", url: "https://wins.example/mcp" },
73
+ setConfig("mcp", {
74
+ servers: {
75
+ "from-workspace": {
76
+ transport: { type: "streamable-http", url: "https://config.example/mcp" },
77
+ },
78
+ // Deliberately shares an id with the `shadowed` plugin below.
79
+ shadowed: {
80
+ transport: { type: "streamable-http", url: "https://wins.example/mcp" },
81
+ },
80
82
  },
81
83
  });
82
84
 
@@ -4,7 +4,7 @@ import {
4
4
  mulawToPcm16,
5
5
  pcm16ToMulaw,
6
6
  resamplePcm16,
7
- } from "../media-stream-audio-transcode.js";
7
+ } from "../calls/media-stream-audio-transcode.js";
8
8
 
9
9
  // ---------------------------------------------------------------------------
10
10
  // Helpers
@@ -12,7 +12,7 @@ const mockProvider = {
12
12
  synthesize: mockSynthesize,
13
13
  };
14
14
 
15
- mock.module("../resolve-call-tts-provider.js", () => ({
15
+ mock.module("../calls/resolve-call-tts-provider.js", () => ({
16
16
  resolveCallTtsProvider: jest.fn(() => ({
17
17
  provider: mockProvider,
18
18
  useSynthesizedPath: false,
@@ -20,10 +20,13 @@ mock.module("../resolve-call-tts-provider.js", () => ({
20
20
  })),
21
21
  }));
22
22
 
23
- import { setConfig } from "../../__tests__/helpers/set-config.js";
24
- import { mulawToPcm16, pcm16ToMulaw } from "../media-stream-audio-transcode.js";
25
- import { MediaStreamOutput } from "../media-stream-output.js";
26
- import { resolveCallTtsProvider } from "../resolve-call-tts-provider.js";
23
+ import {
24
+ mulawToPcm16,
25
+ pcm16ToMulaw,
26
+ } from "../calls/media-stream-audio-transcode.js";
27
+ import { MediaStreamOutput } from "../calls/media-stream-output.js";
28
+ import { resolveCallTtsProvider } from "../calls/resolve-call-tts-provider.js";
29
+ import { setConfig } from "./helpers/set-config.js";
27
30
 
28
31
  const mockResolveCallTtsProvider = resolveCallTtsProvider as ReturnType<
29
32
  typeof jest.fn
@@ -854,38 +857,6 @@ describe("MediaStreamOutput", () => {
854
857
  // Initially empty
855
858
  expect(output.getPlaybackQueueLength()).toBe(0);
856
859
  });
857
-
858
- test("isPlaybackIdle tracks buffered text, the queue, and the sent-audio tail", async () => {
859
- const samples = Array.from({ length: 4000 }, (_, i) =>
860
- Math.round(Math.sin(i * 0.1) * 10000),
861
- );
862
- mockSynthesize.mockResolvedValue({
863
- audio: makeWavBuffer(samples),
864
- contentType: "audio/wav",
865
- });
866
-
867
- const { ws, sent } = createMockWs();
868
- const output = makeOutput(ws, "stream-1");
869
- expect(output.isPlaybackIdle()).toBe(true);
870
- expect(output.playbackTailUntilMs()).toBe(0);
871
-
872
- // Text buffered toward a sentence boundary is pending speech.
873
- output.sendTextToken("Still thinking", false);
874
- expect(output.isPlaybackIdle()).toBe(false);
875
-
876
- output.sendTextToken(" about it.", true);
877
- await drain(() => countEvents(sent, "mark") > 0);
878
-
879
- // Frames left faster than real time: the tail estimate still covers
880
- // the audio Twilio is playing out.
881
- expect(output.playbackTailUntilMs()).toBeGreaterThan(Date.now());
882
- expect(output.isPlaybackIdle()).toBe(false);
883
-
884
- // A barge-in clear drops Twilio's buffer, so nothing is audible.
885
- output.clearAudio();
886
- expect(output.playbackTailUntilMs()).toBe(0);
887
- expect(output.isPlaybackIdle()).toBe(true);
888
- });
889
860
  });
890
861
 
891
862
  // ---------------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, test } from "bun:test";
2
2
 
3
- import { parseMediaStreamFrame } from "../media-stream-parser.js";
3
+ import { parseMediaStreamFrame } from "../calls/media-stream-parser.js";
4
4
 
5
5
  // ---------------------------------------------------------------------------
6
6
  // Fixture factories