@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
@@ -39,7 +39,6 @@ import type {
39
39
  SendMessageOptions,
40
40
  } from "@vellumai/plugin-api";
41
41
 
42
- import { OpenRouterProvider } from "../../../../../providers/openrouter/client.js";
43
42
  import { ProviderError } from "../../../../../util/errors.js";
44
43
  import { sectionHeadLine } from "../sections.js";
45
44
  import type { MemoryRoutingTurn, Section } from "../types.js";
@@ -844,91 +843,3 @@ describe("selectPool: sections and keyword-in-context snippets", () => {
844
843
  );
845
844
  });
846
845
  });
847
-
848
- // ---------------------------------------------------------------------------
849
- // selectPool: cataloged thinking and forced-tool compatibility.
850
- // ---------------------------------------------------------------------------
851
-
852
- describe("selectPool: cataloged thinking and forced-tool compatibility", () => {
853
- test("OpenRouter Kimi K2.6 omits the forced choice and yields a structured selection", async () => {
854
- // A real OpenAI chat-completions provider stands in for the cataloged
855
- // OpenRouter Kimi profile. The request succeeds without a reactive retry
856
- // because the forced select_pages choice is omitted before dispatch.
857
- const wireRequests: unknown[] = [];
858
- const kimi = new OpenRouterProvider(
859
- "test-key",
860
- "moonshotai/kimi-k2.6-20260420",
861
- );
862
- (kimi as unknown as { client: unknown }).client = {
863
- chat: {
864
- completions: {
865
- create: async (params: unknown) => {
866
- wireRequests.push(JSON.parse(JSON.stringify(params)));
867
- return {
868
- async *[Symbol.asyncIterator]() {
869
- yield {
870
- choices: [
871
- {
872
- delta: {
873
- tool_calls: [
874
- {
875
- index: 0,
876
- id: "call-1",
877
- function: {
878
- name: "select_pages",
879
- arguments: '{"ids":[3]}',
880
- },
881
- },
882
- ],
883
- },
884
- finish_reason: "tool_calls",
885
- },
886
- ],
887
- usage: { prompt_tokens: 10, completion_tokens: 2 },
888
- };
889
- },
890
- };
891
- },
892
- },
893
- },
894
- };
895
-
896
- // The profile layer injects the thinking effort onto the call config in
897
- // production; emulate that here so the forced tool_choice rides alongside
898
- // reasoning on the wire.
899
- providerStub = {
900
- name: "kimi-openai-compat",
901
- sendMessage: (messages: Message[], options?: SendMessageOptions) =>
902
- kimi.sendMessage(messages, {
903
- ...options,
904
- config: {
905
- ...options?.config,
906
- effort: "high",
907
- thinking: { enabled: true },
908
- },
909
- }),
910
- };
911
-
912
- const selection = await selectPool(makePool(), makeTurn("rollout?"));
913
-
914
- // The preflight path avoids an incompatible first request, and the
915
- // pool-level re-prompt loop never engages.
916
- expect(wireRequests).toHaveLength(1);
917
- const first = wireRequests[0] as {
918
- tool_choice?: unknown;
919
- reasoning?: { effort?: string; summary?: string };
920
- };
921
- expect(first.tool_choice).toBeUndefined();
922
- expect(first.reasoning).toMatchObject({
923
- effort: "high",
924
- summary: "detailed",
925
- });
926
- expect(
927
- warnPayloads().filter((p) => p.reason === "provider_error"),
928
- ).toEqual([]);
929
-
930
- // Structured selection survived: ids [3] is the topic-x finder line.
931
- expect(selection.keptAll).toBe(false);
932
- expect(selection.pages).toEqual([{ slug: "topic-x", sections: [] }]);
933
- });
934
- });
@@ -16,10 +16,6 @@ import { getConfig } from "../../../config/loader.js";
16
16
  import { isMemoryEnabled } from "../../../config/memory-v3-gate.js";
17
17
  import { rehydratePlatformCredentials } from "../../../config/platform-rehydration.js";
18
18
  import { startConversationEvictor } from "../../../daemon/conversation-evictor.js";
19
- import {
20
- startWorkspaceSkillMdMtimePoll,
21
- stopWorkspaceSkillMdMtimePoll,
22
- } from "../../../daemon/skill-memory-refresh.js";
23
19
  import { resetDb } from "../../../persistence/db-connection.js";
24
20
  import {
25
21
  EMBEDDING_SHUTDOWN_BUDGET_MS,
@@ -112,7 +108,6 @@ async function main(): Promise<void> {
112
108
  shuttingDown = true;
113
109
  log.info({ signal }, "Memory worker process shutting down");
114
110
  worker?.stop();
115
- stopWorkspaceSkillMdMtimePoll();
116
111
  if (keepAlive != null) {
117
112
  clearInterval(keepAlive);
118
113
  }
@@ -166,7 +161,6 @@ async function main(): Promise<void> {
166
161
  }
167
162
 
168
163
  worker = startMemoryJobsWorkerLoop();
169
- startWorkspaceSkillMdMtimePoll();
170
164
 
171
165
  // Keep-alive: the worker's setTimeout timers are unref'd, so without
172
166
  // this interval the process would exit immediately.
@@ -14,7 +14,7 @@
14
14
  * This module reads those files and projects each entry onto the
15
15
  * assistant's own `McpServerConfig` shape, so a plugin-declared server can
16
16
  * flow through the same surfaces as one configured in the workspace
17
- * `mcp.json`.
17
+ * `config.json`.
18
18
  *
19
19
  * Failure isolation follows the spec: an invalid top-level `mcp.json`
20
20
  * disables MCP for that plugin only, and an invalid individual server
@@ -39,17 +39,17 @@
39
39
  import { existsSync, readFileSync } from "node:fs";
40
40
  import { join } from "node:path";
41
41
 
42
+ import { z } from "zod";
43
+
42
44
  import {
43
45
  type AllPluginInfo,
44
46
  listAllPlugins,
45
47
  type ListInstalledPluginsOptions,
46
48
  } from "../cli/lib/list-installed-plugins.js";
47
- import type { ResolvedMcpServerConfig } from "../config/schemas/mcp.js";
48
- import {
49
- projectSpecServerToTransport,
50
- SpecMcpDocumentSchema,
51
- SpecMcpServerSchema,
52
- } from "../mcp/spec-schema.js";
49
+ import type {
50
+ McpTransport,
51
+ ResolvedMcpServerConfig,
52
+ } from "../config/schemas/mcp.js";
53
53
  import { getLogger } from "../util/logger.js";
54
54
 
55
55
  const log = getLogger("plugin-mcp-servers");
@@ -77,6 +77,45 @@ export const PLUGIN_MCP_MANIFEST = "mcp.json";
77
77
  * origin risk.
78
78
  */
79
79
 
80
+ // ---------------------------------------------------------------------------
81
+ // Wire schema (Agent Plugins 1.0.0)
82
+ // ---------------------------------------------------------------------------
83
+
84
+ const PluginStdioServerSchema = z.object({
85
+ type: z.literal("stdio"),
86
+ command: z.string().min(1),
87
+ args: z.array(z.string()).optional(),
88
+ env: z.record(z.string(), z.string()).optional(),
89
+ cwd: z.string().optional(),
90
+ });
91
+
92
+ /**
93
+ * Remote MCP entry. Agent Plugins 1.0.0 requires `type` and names no
94
+ * default. MCP's current remote transport is Streamable HTTP, so this
95
+ * host fills omitted `type` and the Claude-style `http` alias as
96
+ * `streamable-http`. `sse` stays explicit.
97
+ */
98
+ const PluginHttpServerSchema = z.object({
99
+ type: z
100
+ .union([
101
+ z.literal("streamable-http"),
102
+ z.literal("sse"),
103
+ z.literal("http").transform(() => "streamable-http" as const),
104
+ ])
105
+ .default("streamable-http"),
106
+ url: z.string().min(1),
107
+ headers: z.record(z.string(), z.string()).optional(),
108
+ });
109
+
110
+ const PluginMcpServerSchema = z.union([
111
+ PluginStdioServerSchema,
112
+ PluginHttpServerSchema,
113
+ ]);
114
+
115
+ const PluginMcpManifestSchema = z.object({
116
+ mcpServers: z.record(z.string(), z.unknown()),
117
+ });
118
+
80
119
  // ---------------------------------------------------------------------------
81
120
  // Public shape
82
121
  // ---------------------------------------------------------------------------
@@ -212,7 +251,7 @@ export function readPluginMcpServers(
212
251
  continue;
213
252
  }
214
253
 
215
- const entry = SpecMcpServerSchema.safeParse(raw);
254
+ const entry = PluginMcpServerSchema.safeParse(raw);
216
255
  if (!entry.success) {
217
256
  issues.push({
218
257
  pluginName: plugin.name,
@@ -286,7 +325,7 @@ function parseManifest(
286
325
  };
287
326
  }
288
327
 
289
- const manifest = SpecMcpDocumentSchema.safeParse(json);
328
+ const manifest = PluginMcpManifestSchema.safeParse(json);
290
329
  if (!manifest.success) {
291
330
  return {
292
331
  error: `${PLUGIN_MCP_MANIFEST} is missing a valid "mcpServers" object`,
@@ -295,12 +334,33 @@ function parseManifest(
295
334
  return { mcpServers: manifest.data.mcpServers };
296
335
  }
297
336
 
337
+ /**
338
+ * Project one spec-shaped entry onto the assistant's transport union. The
339
+ * two vocabularies already agree on type names and required fields, so this
340
+ * is a field copy plus path interpolation for the stdio case.
341
+ */
298
342
  function projectTransport(
299
- entry: Parameters<typeof projectSpecServerToTransport>[0],
343
+ entry: z.infer<typeof PluginMcpServerSchema>,
300
344
  pluginRoot: string,
301
- ) {
302
- const pluginData = join(pluginRoot, "data");
303
- return projectSpecServerToTransport(entry, (value) =>
304
- interpolatePluginPaths(value, pluginRoot, pluginData),
305
- );
345
+ ): McpTransport {
346
+ if (entry.type === "stdio") {
347
+ const pluginData = join(pluginRoot, "data");
348
+ const expand = (v: string): string =>
349
+ interpolatePluginPaths(v, pluginRoot, pluginData);
350
+ return {
351
+ type: "stdio",
352
+ command: entry.command,
353
+ args: (entry.args ?? []).map(expand),
354
+ ...(entry.env && {
355
+ env: Object.fromEntries(
356
+ Object.entries(entry.env).map(([k, v]) => [k, expand(v)]),
357
+ ),
358
+ }),
359
+ };
360
+ }
361
+ return {
362
+ type: entry.type,
363
+ url: entry.url,
364
+ ...(entry.headers && { headers: entry.headers }),
365
+ };
306
366
  }
@@ -50,8 +50,6 @@ describe("isConnectionCompatibleWithModel", () => {
50
50
  expect(isConnectionCompatibleWithModel(conn, "gpt-5.4-nano")).toBe(false);
51
51
  expect(isConnectionCompatibleWithModel(conn, "gpt-5.5-pro")).toBe(false);
52
52
  expect(isConnectionCompatibleWithModel(conn, "gpt-5.3-codex")).toBe(false);
53
- expect(isConnectionCompatibleWithModel(conn, "gpt-5.4")).toBe(false);
54
- expect(isConnectionCompatibleWithModel(conn, "gpt-5.4-mini")).toBe(false);
55
53
  });
56
54
 
57
55
  test("oauth_subscription connection is compatible with a Codex model", () => {
@@ -61,6 +59,8 @@ describe("isConnectionCompatibleWithModel", () => {
61
59
  expect(isConnectionCompatibleWithModel(conn, "gpt-5.6-terra")).toBe(true);
62
60
  expect(isConnectionCompatibleWithModel(conn, "gpt-5.6-luna")).toBe(true);
63
61
  expect(isConnectionCompatibleWithModel(conn, "gpt-5.5")).toBe(true);
62
+ expect(isConnectionCompatibleWithModel(conn, "gpt-5.4")).toBe(true);
63
+ expect(isConnectionCompatibleWithModel(conn, "gpt-5.4-mini")).toBe(true);
64
64
  });
65
65
 
66
66
  test("undefined model applies no gating (compatible)", () => {
@@ -165,7 +165,7 @@ describe("auto-resolution skips oauth_subscription connections for non-Codex mod
165
165
 
166
166
  test("Codex model can select the oauth_subscription connection", async () => {
167
167
  registerConnections([OPENAI_CODEX, OPENAI_KEY]);
168
- setOpenAiProfile("gpt-5.5");
168
+ setOpenAiProfile("gpt-5.4");
169
169
 
170
170
  const result = await getConfiguredProvider("mainAgent", {
171
171
  overrideProfile: "openai-any",
@@ -15,7 +15,6 @@ import {
15
15
  keepFileAsWorkspaceRef,
16
16
  } from "../content-block-size.js";
17
17
  import { fileBlockToProviderText } from "../file-block-text.js";
18
- import { unsignedThoughtSignatureFallback } from "../gemini-thought-signature.js";
19
18
  import { base64Source, resolveMediaReferences } from "../media-resolve.js";
20
19
  import { PROVIDER_CATALOG } from "../model-catalog.js";
21
20
  import { recordProviderRequestDiagnostics } from "../request-diagnostics.js";
@@ -46,6 +45,13 @@ import {
46
45
  const GEMINI_CONTEXT_OVERFLOW_TOKEN_PATTERNS =
47
46
  /token.?count.*exceeds|exceeds.*maximum.*tokens|prompt.?is.?too.?long|too.?many.?(?:input.?)?tokens|input.?too.?long|context.?length.?exceeded/i;
48
47
 
48
+ const GEMINI_3_UNSIGNED_TOOL_CALL_THOUGHT_SIGNATURE =
49
+ "context_engineering_is_the_way_to_go";
50
+
51
+ function isGemini3Model(model: string): boolean {
52
+ return model.startsWith("gemini-3") || model.startsWith("models/gemini-3");
53
+ }
54
+
49
55
  const THINKING_LEVEL_BY_NAME: Record<ThinkingLevelName, ThinkingLevel> = {
50
56
  minimal: ThinkingLevel.MINIMAL,
51
57
  low: ThinkingLevel.LOW,
@@ -429,8 +435,7 @@ export class GeminiProvider implements Provider {
429
435
  const maxTokens = configObj?.max_tokens as number | undefined;
430
436
  const modelOverride = configObj?.model as string | undefined;
431
437
  const usageAttributionHeaders = configObj?.usageAttributionHeaders as
432
- | Record<string, string>
433
- | undefined;
438
+ Record<string, string> | undefined;
434
439
  const activeModel = modelOverride ?? this.model;
435
440
  const thinkingConfig = geminiModelSupportsThinking(activeModel)
436
441
  ? buildThinkingConfig(
@@ -897,19 +902,28 @@ export class GeminiProvider implements Provider {
897
902
  parts: genai.Part[],
898
903
  model: string,
899
904
  ): void {
905
+ if (!isGemini3Model(model)) {
906
+ return;
907
+ }
908
+
900
909
  const functionCallParts = parts.filter((part) => part.functionCall);
901
- const fallback = unsignedThoughtSignatureFallback(
902
- functionCallParts.map((part) => part.thoughtSignature),
903
- { model },
910
+ if (functionCallParts.length === 0) {
911
+ return;
912
+ }
913
+
914
+ const hasRealThoughtSignature = functionCallParts.some((part) =>
915
+ Boolean(part.thoughtSignature),
904
916
  );
905
- if (!fallback) {
917
+ if (hasRealThoughtSignature) {
906
918
  return;
907
919
  }
908
- const firstFunctionCallPart = functionCallParts[fallback.index];
920
+
921
+ const firstFunctionCallPart = functionCallParts[0];
909
922
  if (!firstFunctionCallPart) {
910
923
  return;
911
924
  }
912
- firstFunctionCallPart.thoughtSignature = fallback.signature;
925
+ firstFunctionCallPart.thoughtSignature =
926
+ GEMINI_3_UNSIGNED_TOOL_CALL_THOUGHT_SIGNATURE;
913
927
  }
914
928
 
915
929
  private supportsGeminiInlineFile(mimeType: string): boolean {
@@ -15,8 +15,9 @@ import { VELLUM_MANAGED_PROVIDER } from "../vellum-model-routing.js";
15
15
  * - platform: route via Vellum managed proxy; no client-side credential.
16
16
  * - none: no auth (e.g. Ollama running locally).
17
17
  * - oauth_subscription: OAuth-based subscription auth (e.g. ChatGPT Codex).
18
- * - service_account: Google service-account JSON key (Vertex AI); signs a
19
- * JWT and exchanges it for a bearer token at the embedded token_uri.
18
+ *
19
+ * Schema-accepted variants (runtime rejects with a clear "not yet shipped" error):
20
+ * - service_account: service-account credentials (Vertex AI, Bedrock).
20
21
  */
21
22
  export const AuthSchema = z
22
23
  .discriminatedUnion("type", [
@@ -178,33 +178,14 @@ export async function computeConnectionAvailability(
178
178
  }
179
179
 
180
180
  switch (connection.auth.type) {
181
- case "service_account": {
182
- const result = await getSecureKeyResultAsync(connection.auth.credential);
183
- if (result.unreachable) {
184
- return {
185
- status: "unknown",
186
- message: `The credential store is unreachable, so the credential for connection "${resolvedConnectionName}" could not be verified. Try again shortly.`,
187
- };
188
- }
189
- if (result.value == null) {
190
- return {
191
- status: "missing_credential",
192
- message: `Connection "${resolvedConnectionName}" has no service-account credential stored. Add one ${SETTINGS_HINT}.`,
193
- };
194
- }
195
- // Validate the JSON payload before reporting ok: a stored value that is
196
- // not a well-formed service-account object will be rejected by dispatch,
197
- // so surface the problem here rather than letting a turn fail silently.
198
- const { parseServiceAccountKey } =
199
- await import("./service-account-token.js");
200
- if (!parseServiceAccountKey(result.value)) {
201
- return {
202
- status: "missing_credential",
203
- message: `Connection "${resolvedConnectionName}" has an invalid service-account credential (expected JSON with client_email, private_key, and token_uri). Update it ${SETTINGS_HINT}.`,
204
- };
205
- }
206
- return { status: "ok" };
207
- }
181
+ // Schema-accepted but not dispatchable: `resolveAuth` returns
182
+ // not_implemented for service_account, so a stored credential still
183
+ // cannot serve inference.
184
+ case "service_account":
185
+ return {
186
+ status: "unsupported_auth",
187
+ message: `Connection "${resolvedConnectionName}" uses service-account auth, which inference does not support yet. Pick a connection with a different auth type.`,
188
+ };
208
189
  case "api_key":
209
190
  case "oauth_subscription": {
210
191
  const result = await getSecureKeyResultAsync(connection.auth.credential);
@@ -6,7 +6,7 @@
6
6
  * - platform → build managed proxy URL and fetch the platform API key
7
7
  * - none → pass through with no auth headers
8
8
  * - oauth_subscription → fetch OAuth token from vault (with auto-refresh) → inject as bearer header
9
- * - service_account → sign JWT and exchange for bearer token at token_uri (Google Vertex AI)
9
+ * - service_account → reject (v2 not yet shipped)
10
10
  */
11
11
 
12
12
  import { getSecureKeyAsync } from "../../security/secure-keys.js";
@@ -119,28 +119,10 @@ export async function resolveAuth(
119
119
  };
120
120
  }
121
121
 
122
- case "service_account": {
123
- const { getValidServiceAccountToken } =
124
- await import("./service-account-token.js");
125
- const result = await getValidServiceAccountToken(auth.credential);
126
- if (!result.ok) {
127
- if (result.reason === "exchange_failed") {
128
- return { ok: false, error: { code: "platform_unavailable" } };
129
- }
130
- // not_found or invalid_config: the credential needs to be supplied or fixed.
131
- return {
132
- ok: false,
133
- error: { code: "credential_not_found", credential: auth.credential },
134
- };
135
- }
122
+ case "service_account":
136
123
  return {
137
- ok: true,
138
- resolved: {
139
- kind: "header",
140
- headers: { Authorization: `Bearer ${result.token}` },
141
- ...(safeBaseUrl ? { baseUrl: safeBaseUrl } : {}),
142
- },
124
+ ok: false,
125
+ error: { code: "not_implemented", authType: auth.type },
143
126
  };
144
- }
145
127
  }
146
128
  }
@@ -76,13 +76,6 @@ export interface CatalogModel {
76
76
  supportsAudioInput?: boolean;
77
77
  supportsToolUse?: boolean;
78
78
  supportsEffort?: boolean;
79
- /**
80
- * Whether this provider/model serving surface accepts a forced OpenAI
81
- * chat-completions tool choice while thinking is enabled. Omit unless the
82
- * combination is known incompatible. Daemon-only: not projected into the
83
- * client catalog (see scripts/sync-llm-catalog.ts).
84
- */
85
- supportsForcedToolChoiceWithThinking?: boolean;
86
79
  pricing?: CatalogModelPricing;
87
80
  /**
88
81
  * Upper bound for `reasoning_effort` accepted by this model's upstream API.
@@ -863,9 +856,6 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
863
856
  cacheReadPer1mTokens: 0.03,
864
857
  },
865
858
  },
866
- // Limited to grandfathered accounts: other API keys get HTTP 404 "no
867
- // longer available to new users", so this model is user-selectable
868
- // only and no intent column may resolve to it.
869
859
  {
870
860
  id: "gemini-2.5-flash-lite",
871
861
  displayName: "Gemini 2.5 Flash Lite",
@@ -1826,7 +1816,6 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
1826
1816
  supportsCaching: true,
1827
1817
  supportsVision: true,
1828
1818
  supportsToolUse: true,
1829
- supportsForcedToolChoiceWithThinking: false,
1830
1819
  pricing: {
1831
1820
  inputPer1mTokens: 0.95,
1832
1821
  outputPer1mTokens: 4.0,
@@ -2639,29 +2628,6 @@ export function modelSupportedEfforts(
2639
2628
  );
2640
2629
  }
2641
2630
 
2642
- /**
2643
- * Whether a provider/model serving surface accepts a forced OpenAI
2644
- * chat-completions tool choice while thinking is enabled. Unknown providers
2645
- * and models fail open so custom routes retain their existing request shape
2646
- * and can rely on the bounded provider-error retry if needed.
2647
- */
2648
- export function supportsForcedToolChoiceWithThinking(
2649
- providerId: string,
2650
- modelId: string,
2651
- ): boolean {
2652
- const provider = PROVIDER_CATALOG.find((entry) => entry.id === providerId);
2653
- if (!provider) {
2654
- return true;
2655
- }
2656
- const stripDateSuffix = (id: string): string => id.replace(/-\d{8}$/, "");
2657
- const normalizedModelId = stripDateSuffix(modelId);
2658
- return !provider.models.some(
2659
- (model) =>
2660
- model.supportsForcedToolChoiceWithThinking === false &&
2661
- (model.id === modelId || stripDateSuffix(model.id) === normalizedModelId),
2662
- );
2663
- }
2664
-
2665
2631
  /**
2666
2632
  * Return the catalog provider that owns a model ID, if known. When multiple
2667
2633
  * providers list the same ID (e.g. OpenRouter and the Vercel AI Gateway share
@@ -11,15 +11,10 @@ const PROVIDER_DEFAULT_MODELS: Record<string, string> = Object.fromEntries(
11
11
  );
12
12
 
13
13
  // `cost-optimized` is the cheapest model a provider serves, `latency-optimized`
14
- // the fastest to first token. On anthropic, ollama, fireworks, openai and
15
- // gemini the same model is both, so those columns repeat by construction
16
- // rather than by oversight (openai's balanced repeats it too: the
17
- // default-profile templates split those tiers by reasoning effort, not model).
18
- //
19
- // "Serves" means serves to every API key: Google's `gemini-2.5-flash-lite`
20
- // undercuts every 3.x Flash-Lite but is limited to grandfathered accounts
21
- // (other keys get HTTP 404 "no longer available to new users"), so the
22
- // gemini column skips it.
14
+ // the fastest to first token. On anthropic, ollama, fireworks and openai the
15
+ // same model is both, so those columns repeat by construction rather than by
16
+ // oversight (openai's balanced repeats it too: the default-profile templates
17
+ // split those tiers by reasoning effort, not model).
23
18
  const PROVIDER_MODEL_INTENTS: Record<string, Record<ModelIntent, string>> = {
24
19
  anthropic: {
25
20
  balanced: "claude-sonnet-4-6",
@@ -37,7 +32,7 @@ const PROVIDER_MODEL_INTENTS: Record<string, Record<ModelIntent, string>> = {
37
32
  },
38
33
  gemini: {
39
34
  balanced: "gemini-3-flash-preview",
40
- "cost-optimized": "gemini-3.1-flash-lite",
35
+ "cost-optimized": "gemini-2.5-flash-lite",
41
36
  "latency-optimized": "gemini-3.1-flash-lite",
42
37
  "quality-optimized": "gemini-3.1-pro-preview",
43
38
  "vision-optimized": "gemini-3-flash-preview",