@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,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