@vellumai/assistant 0.8.1 → 0.8.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 (506) hide show
  1. package/ARCHITECTURE.md +2 -7
  2. package/Dockerfile +75 -1
  3. package/bun.lock +11 -1
  4. package/docker-entrypoint.sh +5 -0
  5. package/docker-init-apt-root.sh +94 -0
  6. package/docker-kata-apt-env.sh +39 -0
  7. package/docs/plugins.md +88 -47
  8. package/docs/skills.md +9 -7
  9. package/examples/plugins/echo/README.md +27 -27
  10. package/examples/plugins/echo/package.json +3 -0
  11. package/examples/plugins/echo/register.ts +31 -31
  12. package/node_modules/@vellumai/slack-text/src/index.test.ts +114 -14
  13. package/node_modules/@vellumai/slack-text/src/index.ts +82 -18
  14. package/openapi.yaml +325 -3
  15. package/package.json +3 -1
  16. package/scripts/generate-openapi.ts +83 -10
  17. package/scripts/sync-llm-catalog.ts +2 -2
  18. package/scripts/sync-web-search-catalog.ts +47 -25
  19. package/src/__tests__/agent-image-optimize.test.ts +11 -3
  20. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +131 -0
  21. package/src/__tests__/anthropic-provider.test.ts +45 -0
  22. package/src/__tests__/app-builder-tool-scripts.test.ts +9 -3
  23. package/src/__tests__/app-executors.test.ts +220 -4
  24. package/src/__tests__/auto-analysis-end-to-end.test.ts +35 -0
  25. package/src/__tests__/bundled-asset.test.ts +6 -6
  26. package/src/__tests__/channel-availability-routes.test.ts +206 -0
  27. package/src/__tests__/channel-delivery-store.test.ts +289 -1
  28. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -1
  29. package/src/__tests__/clawhub.test.ts +75 -16
  30. package/src/__tests__/compactor-tail-resolution.test.ts +41 -0
  31. package/src/__tests__/config-schema.test.ts +21 -0
  32. package/src/__tests__/config-set-route.test.ts +80 -0
  33. package/src/__tests__/config-sounds-sync.test.ts +97 -0
  34. package/src/__tests__/config-watcher-skill-reseed.test.ts +453 -0
  35. package/src/__tests__/context-search-conversations-source.test.ts +117 -2
  36. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
  37. package/src/__tests__/context-search-workspace-source.test.ts +7 -0
  38. package/src/__tests__/context-token-estimator.test.ts +1 -0
  39. package/src/__tests__/conversation-abort-tool-results.test.ts +4 -1
  40. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -0
  41. package/src/__tests__/conversation-agent-loop-overflow.test.ts +92 -92
  42. package/src/__tests__/conversation-agent-loop.test.ts +2 -0
  43. package/src/__tests__/conversation-error.test.ts +42 -3
  44. package/src/__tests__/conversation-fork-crud.test.ts +82 -0
  45. package/src/__tests__/conversation-inference-profile-route.test.ts +40 -4
  46. package/src/__tests__/conversation-lifecycle.test.ts +173 -0
  47. package/src/__tests__/conversation-message-sync-tags.test.ts +97 -0
  48. package/src/__tests__/conversation-pairing.test.ts +54 -0
  49. package/src/__tests__/conversation-process-callsite.test.ts +4 -1
  50. package/src/__tests__/conversation-provider-retry-repair.test.ts +5 -1
  51. package/src/__tests__/conversation-queue.test.ts +4 -1
  52. package/src/__tests__/conversation-runtime-assembly.test.ts +76 -9
  53. package/src/__tests__/conversation-slash-queue.test.ts +59 -1
  54. package/src/__tests__/conversation-slash-unknown.test.ts +4 -1
  55. package/src/__tests__/conversation-surfaces-table-action.test.ts +360 -0
  56. package/src/__tests__/conversation-sync-tags.test.ts +235 -0
  57. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  58. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  59. package/src/__tests__/credential-security-invariants.test.ts +3 -2
  60. package/src/__tests__/db-slack-external-content-normalization.test.ts +301 -0
  61. package/src/__tests__/delete-managed-skill-tool.test.ts +55 -13
  62. package/src/__tests__/disk-pressure-tools.test.ts +1 -0
  63. package/src/__tests__/dm-backfill.test.ts +121 -10
  64. package/src/__tests__/document-tool-security.test.ts +258 -0
  65. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  66. package/src/__tests__/edit-propagation.test.ts +33 -0
  67. package/src/__tests__/empty-response-pipeline.test.ts +0 -4
  68. package/src/__tests__/external-plugin-loader.test.ts +60 -36
  69. package/src/__tests__/filing-service.test.ts +140 -0
  70. package/src/__tests__/get-skill-detail-audit.test.ts +0 -4
  71. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +43 -62
  72. package/src/__tests__/helpers/tar-fixtures.ts +39 -0
  73. package/src/__tests__/helpers/wait-for.ts +21 -0
  74. package/src/__tests__/history-repair-pipeline.test.ts +0 -3
  75. package/src/__tests__/history-repair.test.ts +73 -0
  76. package/src/__tests__/host-app-control-proxy.test.ts +266 -10
  77. package/src/__tests__/image-credentials.test.ts +1 -1
  78. package/src/__tests__/inbound-slack-persistence.test.ts +2 -0
  79. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +1 -1
  80. package/src/__tests__/inference-profile-reaper.test.ts +4 -2
  81. package/src/__tests__/inference-profile-session-handler.test.ts +18 -6
  82. package/src/__tests__/inference-profile-session-ipc.test.ts +17 -5
  83. package/src/__tests__/injector-chain.test.ts +10 -8
  84. package/src/__tests__/install-skill-routing.test.ts +155 -37
  85. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +92 -3
  86. package/src/__tests__/list-messages-page-latest.test.ts +55 -0
  87. package/src/__tests__/llm-call-pipeline.test.ts +0 -3
  88. package/src/__tests__/llm-catalog-parity.test.ts +55 -13
  89. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +34 -0
  90. package/src/__tests__/llm-request-log-source-factory.test.ts +29 -53
  91. package/src/__tests__/llm-usage-store.test.ts +114 -0
  92. package/src/__tests__/managed-profile-guard.test.ts +31 -29
  93. package/src/__tests__/managed-skill-lifecycle.test.ts +109 -18
  94. package/src/__tests__/managed-store.test.ts +84 -192
  95. package/src/__tests__/media-generate-image.test.ts +1 -1
  96. package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -2
  97. package/src/__tests__/messages-after-tiebreaker.test.ts +122 -0
  98. package/src/__tests__/oauth-commands-routes.test.ts +168 -16
  99. package/src/__tests__/oauth-provider-profiles.test.ts +9 -0
  100. package/src/__tests__/openai-provider.test.ts +24 -0
  101. package/src/__tests__/openai-responses-cutover-guard.test.ts +17 -9
  102. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -2
  103. package/src/__tests__/persistence-pipeline.test.ts +0 -2
  104. package/src/__tests__/{managed-proxy-context.test.ts → platform-proxy-context.test.ts} +1 -1
  105. package/src/__tests__/platform.test.ts +2 -0
  106. package/src/__tests__/plugin-api-shim.test.ts +125 -0
  107. package/src/__tests__/plugin-bootstrap.test.ts +10 -36
  108. package/src/__tests__/plugin-external-api.test.ts +68 -0
  109. package/src/__tests__/plugin-registry.test.ts +0 -77
  110. package/src/__tests__/plugin-route-contribution.test.ts +0 -1
  111. package/src/__tests__/plugin-skill-contribution.test.ts +0 -2
  112. package/src/__tests__/plugin-tool-contribution.test.ts +16 -15
  113. package/src/__tests__/plugin-types.test.ts +3 -13
  114. package/src/__tests__/process-message-background-slack.test.ts +8 -1
  115. package/src/__tests__/process-message-display-content.test.ts +421 -0
  116. package/src/__tests__/provider-catalog-visibility.test.ts +142 -0
  117. package/src/__tests__/provider-error-scenarios.test.ts +111 -0
  118. package/src/__tests__/{provider-managed-proxy-integration.test.ts → provider-platform-proxy-integration.test.ts} +8 -8
  119. package/src/__tests__/scaffold-managed-skill-tool.test.ts +65 -13
  120. package/src/__tests__/schedule-routes.test.ts +50 -3
  121. package/src/__tests__/schedule-store.test.ts +94 -0
  122. package/src/__tests__/scheduler-reuse-conversation.test.ts +54 -7
  123. package/src/__tests__/schema-transforms.test.ts +20 -0
  124. package/src/__tests__/search-skills-unified.test.ts +0 -5
  125. package/src/__tests__/server-history-render.test.ts +43 -0
  126. package/src/__tests__/skill-load-feature-flag.test.ts +0 -12
  127. package/src/__tests__/skill-load-tool.test.ts +27 -89
  128. package/src/__tests__/skill-memory.test.ts +23 -3
  129. package/src/__tests__/skills-file-content-endpoint.test.ts +9 -38
  130. package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -3
  131. package/src/__tests__/skills-install-extract.test.ts +49 -38
  132. package/src/__tests__/skills-install-staging.test.ts +159 -0
  133. package/src/__tests__/skills-uninstall.test.ts +9 -41
  134. package/src/__tests__/skills.test.ts +51 -58
  135. package/src/__tests__/slack-channel-config.test.ts +9 -0
  136. package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
  137. package/src/__tests__/system-prompt.test.ts +737 -63
  138. package/src/__tests__/terminal-tools.test.ts +28 -1
  139. package/src/__tests__/thread-backfill.test.ts +557 -27
  140. package/src/__tests__/title-generate-pipeline.test.ts +0 -13
  141. package/src/__tests__/token-estimate-pipeline.test.ts +0 -3
  142. package/src/__tests__/tool-error-pipeline.test.ts +0 -3
  143. package/src/__tests__/tool-execute-pipeline.test.ts +0 -5
  144. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  145. package/src/__tests__/tool-executor.test.ts +16 -4
  146. package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -12
  147. package/src/__tests__/turn-events-store.test.ts +256 -0
  148. package/src/__tests__/twilio-routes.test.ts +4 -0
  149. package/src/__tests__/user-plugin-loader.test.ts +0 -7
  150. package/src/__tests__/voice-session-bridge.test.ts +198 -0
  151. package/src/__tests__/web-search-catalog-parity.test.ts +32 -10
  152. package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +115 -3
  153. package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +50 -0
  154. package/src/__tests__/workspace-migration-073-repair-recall-callsite-empty-profile.test.ts +153 -0
  155. package/src/__tests__/workspace-migration-085-memory-v2-bm25-b-reembed-disabled-v2-pages.test.ts +220 -0
  156. package/src/__tests__/workspace-migration-086-revert-stale-gemini-mis-rewrites.test.ts +269 -0
  157. package/src/__tests__/workspace-migration-remove-legacy-skills-index.test.ts +309 -0
  158. package/src/__tests__/workspace-migrations-runner.test.ts +111 -3
  159. package/src/acp/resolve-agent.ts +1 -1
  160. package/src/agent/image-optimize.ts +13 -5
  161. package/src/calls/voice-session-bridge.ts +61 -42
  162. package/src/channels/types.ts +108 -0
  163. package/src/cli/__tests__/unknown-command.test.ts +24 -0
  164. package/src/cli/commands/__tests__/changelog.test.ts +304 -319
  165. package/src/cli/commands/__tests__/schedules.test.ts +491 -0
  166. package/src/cli/commands/changelog.ts +106 -42
  167. package/src/cli/commands/conversations.ts +102 -17
  168. package/src/cli/commands/default-action.ts +10 -53
  169. package/src/cli/commands/notifications.ts +329 -317
  170. package/src/cli/commands/plugins.ts +185 -0
  171. package/src/cli/commands/schedules.ts +391 -0
  172. package/src/cli/commands/telemetry.ts +40 -0
  173. package/src/cli/lib/__tests__/cli-colors.test.ts +48 -0
  174. package/src/cli/lib/__tests__/confirm-prompt.test.ts +159 -0
  175. package/src/cli/lib/__tests__/install-from-github.test.ts +355 -0
  176. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +154 -0
  177. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +124 -0
  178. package/src/cli/lib/__tests__/unknown-command.test.ts +106 -0
  179. package/src/cli/lib/cli-colors.ts +12 -0
  180. package/src/cli/lib/confirm-prompt.ts +79 -0
  181. package/src/cli/lib/install-from-github.ts +304 -0
  182. package/src/cli/lib/list-installed-plugins.ts +137 -0
  183. package/src/cli/lib/uninstall-plugin.ts +82 -0
  184. package/src/cli/lib/unknown-command.ts +111 -0
  185. package/src/cli/program.ts +38 -2
  186. package/src/config/bundled-skills/app-builder/SKILL.md +23 -21
  187. package/src/config/bundled-skills/app-builder/TOOLS.json +7 -0
  188. package/src/config/bundled-skills/computer-use/TOOLS.json +15 -52
  189. package/src/config/bundled-skills/document/SKILL.md +23 -3
  190. package/src/config/bundled-skills/document/TOOLS.json +53 -0
  191. package/src/config/bundled-skills/document/tools/document-delete.ts +12 -0
  192. package/src/config/bundled-skills/document/tools/document-list.ts +12 -0
  193. package/src/config/bundled-skills/document/tools/document-read.ts +12 -0
  194. package/src/config/bundled-skills/skill-management/SKILL.md +2 -2
  195. package/src/config/bundled-skills/skill-management/TOOLS.json +7 -7
  196. package/src/config/bundled-tool-registry.ts +6 -0
  197. package/src/config/feature-flag-registry.json +41 -1
  198. package/src/config/loader.ts +64 -38
  199. package/src/config/schema.ts +7 -10
  200. package/src/config/schemas/__tests__/llm-request-logs.test.ts +36 -0
  201. package/src/config/schemas/channels.ts +8 -0
  202. package/src/config/schemas/compaction.ts +28 -0
  203. package/src/config/schemas/heartbeat.ts +9 -0
  204. package/src/config/schemas/llm-request-logs.ts +31 -7
  205. package/src/config/schemas/llm.ts +3 -0
  206. package/src/config/schemas/memory-retrieval.ts +18 -0
  207. package/src/config/schemas/tools.ts +14 -0
  208. package/src/config/skills.ts +3 -96
  209. package/src/context/compactor.ts +1047 -0
  210. package/src/context/token-estimator.ts +2 -2
  211. package/src/context/window-manager.ts +197 -1520
  212. package/src/credential-execution/managed-catalog.ts +37 -0
  213. package/src/credential-health/credential-health-service.ts +280 -19
  214. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +34 -0
  215. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +138 -0
  216. package/src/daemon/__tests__/conversation-tool-setup.test.ts +74 -0
  217. package/src/daemon/approval-generators.ts +8 -6
  218. package/src/daemon/config-watcher.ts +94 -31
  219. package/src/daemon/conversation-agent-loop.ts +169 -9
  220. package/src/daemon/conversation-error.ts +171 -37
  221. package/src/daemon/conversation-lifecycle.ts +53 -40
  222. package/src/daemon/conversation-messaging.ts +25 -6
  223. package/src/daemon/conversation-process.ts +49 -12
  224. package/src/daemon/conversation-runtime-assembly.ts +16 -1
  225. package/src/daemon/conversation-slash.ts +12 -5
  226. package/src/daemon/conversation-store.ts +11 -4
  227. package/src/daemon/conversation-tool-setup.ts +39 -7
  228. package/src/daemon/conversation.ts +33 -1
  229. package/src/daemon/external-plugins-bootstrap.ts +217 -181
  230. package/src/daemon/first-greeting.ts +22 -2
  231. package/src/daemon/handlers/config-model.ts +6 -5
  232. package/src/daemon/handlers/config-slack-channel.ts +15 -3
  233. package/src/daemon/handlers/shared.ts +14 -5
  234. package/src/daemon/handlers/skills.ts +111 -108
  235. package/src/daemon/history-repair.ts +28 -1
  236. package/src/daemon/host-app-control-proxy.ts +98 -23
  237. package/src/daemon/lifecycle.ts +45 -35
  238. package/src/daemon/meet-host-supervisor.ts +5 -4
  239. package/src/daemon/memory-v2-startup.ts +49 -0
  240. package/src/daemon/message-protocol.ts +1 -0
  241. package/src/daemon/message-types/conversations.ts +25 -0
  242. package/src/daemon/message-types/messages.ts +61 -0
  243. package/src/daemon/message-types/subagents.ts +1 -0
  244. package/src/daemon/message-types/sync.ts +1 -0
  245. package/src/daemon/pkb-reminder-builder.test.ts +1 -1
  246. package/src/daemon/pkb-reminder-builder.ts +1 -1
  247. package/src/daemon/plugin-source-watcher.ts +146 -0
  248. package/src/daemon/process-message.ts +21 -3
  249. package/src/daemon/server.ts +11 -2
  250. package/src/daemon/skill-memory-refresh.ts +29 -0
  251. package/src/documents/document-store.ts +221 -3
  252. package/src/embedded/plugin-api.ts +40 -0
  253. package/src/filing/filing-service.ts +39 -0
  254. package/src/heartbeat/__tests__/heartbeat-service.test.ts +91 -6
  255. package/src/heartbeat/heartbeat-run-store.ts +2 -1
  256. package/src/heartbeat/heartbeat-service.ts +41 -0
  257. package/src/home/__tests__/feed-types.test.ts +40 -0
  258. package/src/home/feed-types.ts +22 -0
  259. package/src/home/post-connect-feed.ts +1 -0
  260. package/src/index.ts +18 -1
  261. package/src/live-voice/__tests__/live-voice-stt.test.ts +57 -0
  262. package/src/mcp/client.ts +20 -4
  263. package/src/media/image-credentials.ts +3 -3
  264. package/src/memory/__tests__/bookmark-crud.test.ts +33 -27
  265. package/src/memory/__tests__/conversation-queries.test.ts +263 -0
  266. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +113 -0
  267. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +119 -14
  268. package/src/memory/__tests__/message-content.test.ts +35 -0
  269. package/src/memory/bookmark-crud.ts +42 -10
  270. package/src/memory/context-search/sources/conversations.ts +62 -2
  271. package/src/memory/context-search/sources/workspace.ts +4 -0
  272. package/src/memory/conversation-crud.ts +63 -19
  273. package/src/memory/conversation-queries.ts +110 -10
  274. package/src/memory/db-init.ts +6 -0
  275. package/src/memory/delivery-crud.ts +152 -5
  276. package/src/memory/embedding-backend.ts +4 -4
  277. package/src/memory/external-conversation-store.ts +66 -5
  278. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +66 -9
  279. package/src/memory/graph/conversation-graph-memory.ts +31 -15
  280. package/src/memory/graph/tools.ts +3 -3
  281. package/src/memory/indexer.ts +34 -29
  282. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +73 -0
  283. package/src/memory/jobs/embed-concept-page.ts +20 -11
  284. package/src/memory/jobs-worker.ts +6 -1
  285. package/src/memory/llm-request-log-source-clickhouse.ts +17 -10
  286. package/src/memory/llm-request-log-source.ts +19 -52
  287. package/src/memory/llm-usage-store.ts +125 -5
  288. package/src/memory/memory-retrospective-startup-cleanup.ts +72 -5
  289. package/src/memory/message-content.ts +1 -1
  290. package/src/memory/migrations/109-external-conversation-bindings.ts +15 -4
  291. package/src/memory/migrations/229-delete-private-conversations.test.ts +38 -1
  292. package/src/memory/migrations/229-delete-private-conversations.ts +7 -0
  293. package/src/memory/migrations/247-external-conversation-binding-thread-id.ts +78 -0
  294. package/src/memory/migrations/248-create-onboarding-events.ts +21 -0
  295. package/src/memory/migrations/249-normalize-slack-external-content.ts +240 -0
  296. package/src/memory/migrations/index.ts +6 -0
  297. package/src/memory/migrations/registry.ts +8 -0
  298. package/src/memory/onboarding-events-store.ts +106 -0
  299. package/src/memory/schema/bookmarks.ts +0 -2
  300. package/src/memory/schema/calls.ts +1 -0
  301. package/src/memory/schema/inference.ts +1 -3
  302. package/src/memory/schema/infrastructure.ts +12 -0
  303. package/src/memory/turn-events-store.ts +127 -2
  304. package/src/memory/v2/__tests__/activation.test.ts +0 -8
  305. package/src/memory/v2/__tests__/injection.test.ts +98 -8
  306. package/src/memory/v2/__tests__/migration.test.ts +87 -0
  307. package/src/memory/v2/__tests__/page-index.test.ts +83 -0
  308. package/src/memory/v2/__tests__/prompts-router.test.ts +58 -6
  309. package/src/memory/v2/__tests__/qdrant.test.ts +66 -3
  310. package/src/memory/v2/__tests__/router.test.ts +15 -0
  311. package/src/memory/v2/__tests__/skill-store.test.ts +387 -8
  312. package/src/memory/v2/injection.ts +32 -6
  313. package/src/memory/v2/migration.ts +49 -19
  314. package/src/memory/v2/page-index.ts +35 -5
  315. package/src/memory/v2/prompts/router.ts +11 -8
  316. package/src/memory/v2/prompts/sweep.ts +2 -2
  317. package/src/memory/v2/qdrant.ts +135 -7
  318. package/src/memory/v2/router.ts +9 -8
  319. package/src/memory/v2/skill-store.ts +120 -35
  320. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +45 -5
  321. package/src/messaging/providers/slack/__tests__/download.test.ts +231 -0
  322. package/src/messaging/providers/slack/adapter.ts +43 -5
  323. package/src/messaging/providers/slack/client.ts +27 -0
  324. package/src/messaging/providers/slack/deep-link.ts +65 -0
  325. package/src/messaging/providers/slack/download.ts +104 -0
  326. package/src/messaging/providers/slack/message-metadata.test.ts +32 -0
  327. package/src/messaging/providers/slack/message-metadata.ts +27 -0
  328. package/src/messaging/providers/slack/render-transcript.test.ts +134 -0
  329. package/src/messaging/providers/slack/render-transcript.ts +69 -5
  330. package/src/messaging/providers/slack/types.ts +20 -1
  331. package/src/notifications/conversation-pairing.ts +2 -1
  332. package/src/notifications/decision-engine.ts +2 -1
  333. package/src/notifications/emit-signal.ts +20 -1
  334. package/src/notifications/home-feed-side-effect.ts +54 -0
  335. package/src/notifications/signal.ts +3 -1
  336. package/src/oauth/connection-resolver.ts +8 -4
  337. package/src/oauth/platform-connection.ts +6 -2
  338. package/src/oauth/seed-providers.ts +10 -1
  339. package/src/permissions/checker.ts +2 -0
  340. package/src/permissions/ipc-risk-types.ts +1 -0
  341. package/src/permissions/question-prompter.test.ts +416 -0
  342. package/src/permissions/question-prompter.ts +294 -0
  343. package/src/platform/client.test.ts +1 -1
  344. package/src/platform/client.ts +1 -1
  345. package/src/plugin-api/constants.ts +26 -0
  346. package/src/plugin-api/index.ts +34 -1
  347. package/src/plugin-api/types.ts +104 -22
  348. package/src/plugins/defaults/circuit-breaker.ts +0 -5
  349. package/src/plugins/defaults/compaction.ts +0 -4
  350. package/src/plugins/defaults/empty-response.ts +0 -2
  351. package/src/plugins/defaults/history-repair.ts +0 -2
  352. package/src/plugins/defaults/injectors.ts +36 -3
  353. package/src/plugins/defaults/llm-call.ts +0 -2
  354. package/src/plugins/defaults/memory-retrieval.ts +0 -1
  355. package/src/plugins/defaults/overflow-reduce.ts +0 -1
  356. package/src/plugins/defaults/persistence.ts +0 -2
  357. package/src/plugins/defaults/title-generate.ts +0 -5
  358. package/src/plugins/defaults/token-estimate.ts +0 -2
  359. package/src/plugins/defaults/tool-error.ts +0 -7
  360. package/src/plugins/defaults/tool-execute.ts +0 -2
  361. package/src/plugins/defaults/tool-result-truncate.ts +0 -4
  362. package/src/plugins/ensure-plugin-api-shim.ts +96 -0
  363. package/src/plugins/external-api.ts +104 -0
  364. package/src/plugins/external-plugin-loader.ts +105 -32
  365. package/src/plugins/feature-gate.ts +22 -0
  366. package/src/plugins/pipeline.ts +37 -0
  367. package/src/plugins/registry.ts +48 -80
  368. package/src/plugins/types.ts +31 -26
  369. package/src/plugins/user-loader.ts +21 -2
  370. package/src/proactive-artifact/aux-message-injector.ts +11 -0
  371. package/src/proactive-artifact/job.test.ts +37 -5
  372. package/src/prompts/__tests__/system-prompt.test.ts +12 -0
  373. package/src/prompts/__tests__/task-progress-hint-section.test.ts +99 -0
  374. package/src/prompts/normalize-onboarding.ts +27 -0
  375. package/src/prompts/sections.ts +302 -0
  376. package/src/prompts/system-prompt.ts +63 -166
  377. package/src/prompts/templates/BOOTSTRAP.md +17 -1
  378. package/src/prompts/templates/system-sections.ts +173 -0
  379. package/src/providers/__tests__/inference.test.ts +22 -7
  380. package/src/providers/anthropic/client.ts +28 -28
  381. package/src/providers/connection-resolution.ts +7 -0
  382. package/src/providers/inference/adapter-factory.ts +41 -4
  383. package/src/providers/inference/connections.ts +74 -29
  384. package/src/providers/inference/resolve-auth.ts +12 -4
  385. package/src/providers/model-catalog.ts +294 -12
  386. package/src/providers/openai/chat-completions-provider.ts +10 -2
  387. package/src/providers/openrouter/client.ts +7 -0
  388. package/src/providers/{managed-proxy → platform-proxy}/constants.ts +4 -1
  389. package/src/providers/{managed-proxy → platform-proxy}/context.ts +3 -3
  390. package/src/providers/provider-availability.ts +17 -2
  391. package/src/providers/provider-catalog-visibility.ts +36 -0
  392. package/src/providers/registry.ts +22 -14
  393. package/src/providers/retry.ts +47 -1
  394. package/src/runtime/__tests__/agent-wake.test.ts +152 -0
  395. package/src/runtime/agent-wake.ts +42 -14
  396. package/src/runtime/auth/route-policy.ts +8 -1
  397. package/src/runtime/btw-sidechain.ts +2 -0
  398. package/src/runtime/http-types.ts +19 -0
  399. package/src/runtime/migrations/origin-mode.ts +1 -1
  400. package/src/runtime/pending-interactions.ts +1 -0
  401. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +17 -0
  402. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +5 -1
  403. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +107 -20
  404. package/src/runtime/routes/__tests__/question-routes.test.ts +395 -0
  405. package/src/runtime/routes/__tests__/tts-routes.test.ts +64 -1
  406. package/src/runtime/routes/acp-routes-list.test.ts +143 -0
  407. package/src/runtime/routes/acp-routes.ts +5 -3
  408. package/src/runtime/routes/auth-routes.ts +1 -1
  409. package/src/runtime/routes/bookmark-routes.ts +5 -3
  410. package/src/runtime/routes/btw-routes.ts +5 -1
  411. package/src/runtime/routes/channel-availability-routes.ts +121 -0
  412. package/src/runtime/routes/conversation-cli-routes.ts +44 -3
  413. package/src/runtime/routes/conversation-list-routes.ts +3 -20
  414. package/src/runtime/routes/conversation-management-routes.ts +17 -42
  415. package/src/runtime/routes/conversation-query-routes.ts +40 -35
  416. package/src/runtime/routes/conversation-routes.ts +90 -11
  417. package/src/runtime/routes/documents-routes.ts +25 -86
  418. package/src/runtime/routes/group-routes.ts +5 -0
  419. package/src/runtime/routes/inbound-conversation.ts +28 -8
  420. package/src/runtime/routes/inbound-message-handler.ts +236 -41
  421. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +111 -0
  422. package/src/runtime/routes/inbound-stages/background-dispatch.ts +32 -1
  423. package/src/runtime/routes/inbound-stages/edit-intercept.ts +17 -4
  424. package/src/runtime/routes/index.ts +6 -0
  425. package/src/runtime/routes/inference-profile-session-handler.ts +17 -44
  426. package/src/runtime/routes/inference-profile-session-reaper.ts +7 -21
  427. package/src/runtime/routes/inference-provider-connection-routes.ts +65 -21
  428. package/src/runtime/routes/integrations/slack/share.ts +4 -52
  429. package/src/runtime/routes/integrations/slack/token.ts +43 -0
  430. package/src/runtime/routes/integrations/twilio.ts +6 -13
  431. package/src/runtime/routes/notification-routes.ts +1 -1
  432. package/src/runtime/routes/oauth-commands-routes.ts +105 -15
  433. package/src/runtime/routes/oauth-lifecycle-routes.ts +43 -0
  434. package/src/runtime/routes/question-routes.ts +259 -0
  435. package/src/runtime/routes/rename-conversation-routes.ts +2 -33
  436. package/src/runtime/routes/schedule-routes.ts +4 -7
  437. package/src/runtime/routes/subagents-routes.ts +57 -18
  438. package/src/runtime/routes/telemetry-routes.ts +27 -0
  439. package/src/runtime/routes/tts-routes.ts +27 -2
  440. package/src/runtime/routes/workspace-routes.test.ts +43 -0
  441. package/src/runtime/routes/workspace-routes.ts +28 -0
  442. package/src/runtime/services/conversation-serializer.ts +39 -7
  443. package/src/runtime/sync/resource-sync-events.ts +93 -1
  444. package/src/schedule/schedule-store.ts +27 -2
  445. package/src/schedule/scheduler.ts +9 -1
  446. package/src/security/__tests__/untrusted-content.test.ts +86 -0
  447. package/src/security/untrusted-content.ts +93 -8
  448. package/src/skills/catalog-files.ts +1 -1
  449. package/src/skills/catalog-install.ts +233 -116
  450. package/src/skills/clawhub.ts +70 -13
  451. package/src/skills/managed-store.ts +4 -119
  452. package/src/skills/skillssh-registry.ts +27 -48
  453. package/src/subagent/manager.ts +15 -7
  454. package/src/telemetry/types.ts +113 -1
  455. package/src/telemetry/usage-telemetry-reporter.test.ts +312 -5
  456. package/src/telemetry/usage-telemetry-reporter.ts +113 -7
  457. package/src/tools/apps/executors.ts +58 -7
  458. package/src/tools/ask-question/ask-question-tool.test.ts +509 -0
  459. package/src/tools/ask-question/ask-question-tool.ts +304 -0
  460. package/src/tools/browser/browser-execution.ts +15 -11
  461. package/src/tools/computer-use/definitions.ts +3 -3
  462. package/src/tools/credentials/vault.ts +1 -1
  463. package/src/tools/document/document-tool.ts +124 -1
  464. package/src/tools/filesystem/edit.ts +1 -1
  465. package/src/tools/filesystem/list.ts +1 -1
  466. package/src/tools/filesystem/read.ts +1 -1
  467. package/src/tools/filesystem/write.ts +5 -2
  468. package/src/tools/host-filesystem/transfer.ts +1 -1
  469. package/src/tools/host-terminal/host-shell.ts +1 -1
  470. package/src/tools/permission-checker.ts +1 -1
  471. package/src/tools/registry.ts +17 -7
  472. package/src/tools/schedule/create.ts +2 -2
  473. package/src/tools/schema-transforms.ts +7 -2
  474. package/src/tools/side-effects.ts +1 -0
  475. package/src/tools/skills/delete-managed.ts +4 -4
  476. package/src/tools/skills/execute.ts +1 -1
  477. package/src/tools/skills/scaffold-managed.ts +3 -2
  478. package/src/tools/subagent/notify-parent.ts +1 -1
  479. package/src/tools/system/request-permission.ts +2 -2
  480. package/src/tools/terminal/safe-env.ts +60 -1
  481. package/src/tools/tool-manifest.ts +2 -0
  482. package/src/tools/types.ts +72 -21
  483. package/src/tools/ui-surface/definitions.ts +6 -5
  484. package/src/tts/__tests__/provider-adapters.test.ts +76 -2
  485. package/src/tts/providers/elevenlabs-provider.ts +75 -1
  486. package/src/types/onboarding-context.ts +2 -0
  487. package/src/util/errors.ts +17 -0
  488. package/src/util/platform.ts +10 -0
  489. package/src/watcher/__tests__/engine.test.ts +22 -0
  490. package/src/watcher/engine.ts +6 -2
  491. package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +80 -15
  492. package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +35 -22
  493. package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +3 -1
  494. package/src/workspace/migrations/083-system-prompt-prefix-to-file.ts +191 -0
  495. package/src/workspace/migrations/084-remove-legacy-skills-index.ts +276 -0
  496. package/src/workspace/migrations/085-memory-v2-bm25-b-reembed-disabled-v2-pages.ts +137 -0
  497. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +198 -0
  498. package/src/workspace/migrations/registry.ts +8 -0
  499. package/src/workspace/migrations/runner.ts +39 -9
  500. package/src/workspace/migrations/types.ts +4 -0
  501. package/examples/plugins/echo/bun.lock +0 -25
  502. package/src/__tests__/context-window-manager.test.ts +0 -2481
  503. package/src/context/__tests__/compact-prompt.test.ts +0 -63
  504. package/src/context/prompts/compact.md +0 -26
  505. package/src/prompts/__tests__/build-cli-reference-section.test.ts +0 -37
  506. /package/src/__tests__/{secret-routes-managed-proxy.test.ts → secret-routes-platform-proxy.test.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { MANAGED_PROVIDER_META } from "./managed-proxy/constants.js";
1
+ import { PLATFORM_PROVIDER_META } from "./platform-proxy/constants.js";
2
2
 
3
3
  export type LongContextMode =
4
4
  | "native-model"
@@ -45,6 +45,8 @@ export interface CatalogModel {
45
45
  supportsVision?: boolean;
46
46
  supportsToolUse?: boolean;
47
47
  pricing?: CatalogModelPricing;
48
+ /** When set, this model is only visible when the named feature flag is enabled. */
49
+ featureFlag?: string;
48
50
  }
49
51
 
50
52
  const DEFAULT_CONTEXT_WINDOW_TOKENS = 200000;
@@ -91,12 +93,14 @@ export interface ProviderCatalogEntry {
91
93
  /**
92
94
  * Whether this provider supports the `platform` auth type (Vellum-managed
93
95
  * keys routed through the platform proxy). Derived from
94
- * `MANAGED_PROVIDER_META` at catalog build time so the two stay in lock
96
+ * `PLATFORM_PROVIDER_META` at catalog build time so the two stay in lock
95
97
  * step. Clients use this field to hide the "Platform (managed by Vellum)"
96
98
  * option from the auth-type dropdown for providers like Fireworks or
97
99
  * OpenRouter where managed keys are not available.
98
100
  */
99
- supportsManagedAuth?: boolean;
101
+ supportsPlatformAuth?: boolean;
102
+ /** When set, this provider is only visible when the named feature flag is enabled. */
103
+ featureFlag?: string;
100
104
  }
101
105
 
102
106
  /**
@@ -236,8 +240,7 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
236
240
  cacheReadPer1mTokens: 0.5,
237
241
  tiers: [
238
242
  {
239
- inputTokenThreshold:
240
- OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
243
+ inputTokenThreshold: OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
241
244
  inputPer1mTokens: 10,
242
245
  outputPer1mTokens: 45,
243
246
  cacheReadPer1mTokens: 1,
@@ -261,8 +264,7 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
261
264
  outputPer1mTokens: 180.0,
262
265
  tiers: [
263
266
  {
264
- inputTokenThreshold:
265
- OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
267
+ inputTokenThreshold: OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
266
268
  inputPer1mTokens: 60,
267
269
  outputPer1mTokens: 270,
268
270
  },
@@ -286,8 +288,7 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
286
288
  cacheReadPer1mTokens: 0.25,
287
289
  tiers: [
288
290
  {
289
- inputTokenThreshold:
290
- OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
291
+ inputTokenThreshold: OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
291
292
  inputPer1mTokens: 5,
292
293
  outputPer1mTokens: 22.5,
293
294
  cacheReadPer1mTokens: 0.5,
@@ -696,6 +697,39 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
696
697
  supportsToolUse: true,
697
698
  pricing: { inputPer1mTokens: 0.27, outputPer1mTokens: 1.1 },
698
699
  },
700
+ {
701
+ id: "deepseek/deepseek-v4-pro",
702
+ displayName: "DeepSeek V4 Pro",
703
+ contextWindowTokens: 1048576,
704
+ maxOutputTokens: 384000,
705
+ supportsThinking: true,
706
+ supportsCaching: false,
707
+ supportsVision: false,
708
+ supportsToolUse: true,
709
+ pricing: { inputPer1mTokens: 0.435, outputPer1mTokens: 0.87 },
710
+ },
711
+ {
712
+ id: "deepseek/deepseek-v4-flash",
713
+ displayName: "DeepSeek V4 Flash",
714
+ contextWindowTokens: 1048576,
715
+ maxOutputTokens: 384000,
716
+ supportsThinking: true,
717
+ supportsCaching: false,
718
+ supportsVision: false,
719
+ supportsToolUse: true,
720
+ pricing: { inputPer1mTokens: 0.14, outputPer1mTokens: 0.28 },
721
+ },
722
+ {
723
+ id: "deepseek/deepseek-v3.2-speciale",
724
+ displayName: "DeepSeek V3.2 Speciale",
725
+ contextWindowTokens: 163840,
726
+ maxOutputTokens: 163840,
727
+ supportsThinking: true,
728
+ supportsCaching: false,
729
+ supportsVision: false,
730
+ supportsToolUse: false,
731
+ pricing: { inputPer1mTokens: 0.287, outputPer1mTokens: 0.431 },
732
+ },
699
733
  // Qwen
700
734
  {
701
735
  id: "qwen/qwen3.5-plus-02-15",
@@ -838,17 +872,265 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
838
872
  apiKeyUrl: "https://openrouter.ai/keys",
839
873
  apiKeyPlaceholder: "sk-or-v1-...",
840
874
  },
875
+ {
876
+ id: "zai",
877
+ displayName: "z.ai",
878
+ featureFlag: "provider-zai",
879
+ subtitle: "GLM models from z.ai (Zhipu AI). Requires a z.ai API key.",
880
+ setupMode: "api-key",
881
+ setupHint: "Enter your z.ai API key to enable GLM models.",
882
+ envVar: "ZAI_API_KEY",
883
+ credentialsGuide: {
884
+ description:
885
+ "Sign in to the z.ai open platform, navigate to API Keys, and create a new key.",
886
+ url: "https://open.z.ai/open/api/paas/v4/apiKey",
887
+ linkLabel: "Open z.ai Platform",
888
+ },
889
+ models: [
890
+ {
891
+ id: "glm-5.1",
892
+ displayName: "GLM-5.1",
893
+ contextWindowTokens: 200000,
894
+ maxOutputTokens: 128000,
895
+ supportsThinking: false,
896
+ supportsCaching: false,
897
+ supportsVision: true,
898
+ supportsToolUse: true,
899
+ },
900
+ {
901
+ id: "glm-5",
902
+ displayName: "GLM-5",
903
+ contextWindowTokens: 200000,
904
+ maxOutputTokens: 128000,
905
+ supportsThinking: false,
906
+ supportsCaching: false,
907
+ supportsVision: true,
908
+ supportsToolUse: true,
909
+ },
910
+ {
911
+ id: "glm-5-turbo",
912
+ displayName: "GLM-5 Turbo",
913
+ contextWindowTokens: 200000,
914
+ maxOutputTokens: 128000,
915
+ supportsThinking: false,
916
+ supportsCaching: false,
917
+ supportsVision: true,
918
+ supportsToolUse: true,
919
+ },
920
+ {
921
+ id: "glm-4.7",
922
+ displayName: "GLM-4.7",
923
+ contextWindowTokens: 200000,
924
+ maxOutputTokens: 128000,
925
+ supportsThinking: false,
926
+ supportsCaching: false,
927
+ supportsVision: true,
928
+ supportsToolUse: true,
929
+ },
930
+ {
931
+ id: "glm-4.7-flash",
932
+ displayName: "GLM-4.7 Flash",
933
+ contextWindowTokens: 200000,
934
+ maxOutputTokens: 128000,
935
+ supportsThinking: false,
936
+ supportsCaching: false,
937
+ supportsVision: true,
938
+ supportsToolUse: true,
939
+ },
940
+ ],
941
+ defaultModel: "glm-5.1",
942
+ apiKeyPlaceholder: "your-api-key",
943
+ },
944
+ {
945
+ id: "deepseek",
946
+ displayName: "DeepSeek",
947
+ subtitle:
948
+ "DeepSeek reasoning and chat models. Requires a DeepSeek API key.",
949
+ setupMode: "api-key",
950
+ setupHint: "Enter your DeepSeek API key to enable DeepSeek models.",
951
+ envVar: "DEEPSEEK_API_KEY",
952
+ featureFlag: "provider-deepseek",
953
+ credentialsGuide: {
954
+ description:
955
+ "Sign in to the DeepSeek platform, navigate to API Keys, and create a new key.",
956
+ url: "https://platform.deepseek.com/api_keys",
957
+ linkLabel: "Open DeepSeek Platform",
958
+ },
959
+ models: [
960
+ {
961
+ id: "deepseek-v4-pro",
962
+ displayName: "DeepSeek V4 Pro",
963
+ contextWindowTokens: 1000000,
964
+ maxOutputTokens: 384000,
965
+ supportsThinking: true,
966
+ supportsCaching: false,
967
+ supportsVision: false,
968
+ supportsToolUse: true,
969
+ pricing: {
970
+ inputPer1mTokens: 1.74,
971
+ outputPer1mTokens: 3.48,
972
+ },
973
+ },
974
+ {
975
+ id: "deepseek-v4-flash",
976
+ displayName: "DeepSeek V4 Flash",
977
+ contextWindowTokens: 1000000,
978
+ maxOutputTokens: 384000,
979
+ supportsThinking: true,
980
+ supportsCaching: false,
981
+ supportsVision: false,
982
+ supportsToolUse: true,
983
+ pricing: {
984
+ inputPer1mTokens: 0.14,
985
+ outputPer1mTokens: 0.28,
986
+ },
987
+ },
988
+ ],
989
+ defaultModel: "deepseek-v4-pro",
990
+ apiKeyPlaceholder: "sk-...",
991
+ },
992
+ {
993
+ id: "minimax",
994
+ displayName: "MiniMax",
995
+ subtitle: "MiniMax models. Requires a MiniMax API key.",
996
+ featureFlag: "provider-minimax",
997
+ setupMode: "api-key",
998
+ setupHint: "Enter your MiniMax API key to enable MiniMax models.",
999
+ envVar: "MINIMAX_API_KEY",
1000
+ credentialsGuide: {
1001
+ description:
1002
+ "Sign in to the MiniMax platform, navigate to API Keys, and create a new key.",
1003
+ url: "https://platform.minimax.io/user-center/basic-information/interface-key",
1004
+ linkLabel: "Open MiniMax Platform",
1005
+ },
1006
+ models: [
1007
+ {
1008
+ id: "MiniMax-M2.7",
1009
+ displayName: "MiniMax M2.7",
1010
+ contextWindowTokens: 204800,
1011
+ maxOutputTokens: 131072,
1012
+ supportsThinking: true,
1013
+ supportsCaching: true,
1014
+ supportsVision: false,
1015
+ supportsToolUse: true,
1016
+ pricing: {
1017
+ inputPer1mTokens: 0.3,
1018
+ outputPer1mTokens: 1.2,
1019
+ cacheReadPer1mTokens: 0.06,
1020
+ cacheWritePer1mTokens: 0.375,
1021
+ },
1022
+ },
1023
+ {
1024
+ id: "MiniMax-M2.7-highspeed",
1025
+ displayName: "MiniMax M2.7 Highspeed",
1026
+ contextWindowTokens: 204800,
1027
+ maxOutputTokens: 131072,
1028
+ supportsThinking: true,
1029
+ supportsCaching: true,
1030
+ supportsVision: false,
1031
+ supportsToolUse: true,
1032
+ pricing: {
1033
+ inputPer1mTokens: 0.6,
1034
+ outputPer1mTokens: 2.4,
1035
+ cacheReadPer1mTokens: 0.06,
1036
+ cacheWritePer1mTokens: 0.375,
1037
+ },
1038
+ },
1039
+ {
1040
+ id: "MiniMax-M2.5",
1041
+ displayName: "MiniMax M2.5",
1042
+ contextWindowTokens: 204800,
1043
+ maxOutputTokens: 196608,
1044
+ supportsThinking: true,
1045
+ supportsCaching: true,
1046
+ supportsVision: false,
1047
+ supportsToolUse: true,
1048
+ pricing: {
1049
+ inputPer1mTokens: 0.3,
1050
+ outputPer1mTokens: 1.2,
1051
+ cacheReadPer1mTokens: 0.03,
1052
+ cacheWritePer1mTokens: 0.375,
1053
+ },
1054
+ },
1055
+ {
1056
+ id: "MiniMax-M2.5-highspeed",
1057
+ displayName: "MiniMax M2.5 Highspeed",
1058
+ contextWindowTokens: 204800,
1059
+ maxOutputTokens: 196608,
1060
+ supportsThinking: true,
1061
+ supportsCaching: true,
1062
+ supportsVision: false,
1063
+ supportsToolUse: true,
1064
+ pricing: {
1065
+ inputPer1mTokens: 0.6,
1066
+ outputPer1mTokens: 2.4,
1067
+ cacheReadPer1mTokens: 0.03,
1068
+ cacheWritePer1mTokens: 0.375,
1069
+ },
1070
+ },
1071
+ {
1072
+ id: "MiniMax-M2.1",
1073
+ displayName: "MiniMax M2.1",
1074
+ contextWindowTokens: 204800,
1075
+ maxOutputTokens: 131072,
1076
+ supportsThinking: true,
1077
+ supportsCaching: true,
1078
+ supportsVision: false,
1079
+ supportsToolUse: true,
1080
+ pricing: {
1081
+ inputPer1mTokens: 0.3,
1082
+ outputPer1mTokens: 1.2,
1083
+ cacheReadPer1mTokens: 0.03,
1084
+ cacheWritePer1mTokens: 0.375,
1085
+ },
1086
+ },
1087
+ {
1088
+ id: "MiniMax-M2.1-highspeed",
1089
+ displayName: "MiniMax M2.1 Highspeed",
1090
+ contextWindowTokens: 204800,
1091
+ maxOutputTokens: 131072,
1092
+ supportsThinking: true,
1093
+ supportsCaching: true,
1094
+ supportsVision: false,
1095
+ supportsToolUse: true,
1096
+ pricing: {
1097
+ inputPer1mTokens: 0.6,
1098
+ outputPer1mTokens: 2.4,
1099
+ cacheReadPer1mTokens: 0.03,
1100
+ cacheWritePer1mTokens: 0.375,
1101
+ },
1102
+ },
1103
+ {
1104
+ id: "MiniMax-M2",
1105
+ displayName: "MiniMax M2",
1106
+ contextWindowTokens: 204800,
1107
+ maxOutputTokens: 131072,
1108
+ supportsThinking: true,
1109
+ supportsCaching: true,
1110
+ supportsVision: false,
1111
+ supportsToolUse: true,
1112
+ pricing: {
1113
+ inputPer1mTokens: 0.3,
1114
+ outputPer1mTokens: 1.2,
1115
+ cacheReadPer1mTokens: 0.03,
1116
+ cacheWritePer1mTokens: 0.375,
1117
+ },
1118
+ },
1119
+ ],
1120
+ defaultModel: "MiniMax-M2.7",
1121
+ apiKeyPlaceholder: "eyJ...",
1122
+ },
841
1123
  ];
842
1124
 
843
1125
  export const PROVIDER_CATALOG: ProviderCatalogEntry[] =
844
1126
  RAW_PROVIDER_CATALOG.map((entry) => ({
845
1127
  ...entry,
846
1128
  models: entry.models.map(catalogModel),
847
- // Derive supportsManagedAuth from MANAGED_PROVIDER_META so the catalog
1129
+ // Derive supportsPlatformAuth from PLATFORM_PROVIDER_META so the catalog
848
1130
  // and the proxy routing table can never drift. Adding a provider to
849
- // MANAGED_PROVIDER_META with `managed: true` automatically opts it into
1131
+ // PLATFORM_PROVIDER_META with `managed: true` automatically opts it into
850
1132
  // the Platform auth-type dropdown in the clients.
851
- supportsManagedAuth: MANAGED_PROVIDER_META[entry.id]?.managed === true,
1133
+ supportsPlatformAuth: PLATFORM_PROVIDER_META[entry.id]?.managed === true,
852
1134
  }));
853
1135
 
854
1136
  /** Check if a model ID is in the catalog for a given provider. */
@@ -60,6 +60,8 @@ export interface OpenAIChatCompletionsProviderOptions {
60
60
  providerName?: string;
61
61
  providerLabel?: string;
62
62
  streamTimeoutMs?: number;
63
+ /** Provider-level request headers merged into every API request. */
64
+ requestHeaders?: Record<string, string>;
63
65
  /** Extra params spread into every chat.completions.create call (e.g. reasoning). */
64
66
  extraCreateParams?: Record<string, unknown>;
65
67
  /** Upper bound for `reasoning_effort` sent on the wire. Defaults to "xhigh"
@@ -110,6 +112,7 @@ export class OpenAIChatCompletionsProvider implements Provider {
110
112
  private streamTimeoutMs: number;
111
113
  private extraCreateParams: Record<string, unknown>;
112
114
  private maxReasoningEffort: "high" | "xhigh";
115
+ private requestHeaders: Record<string, string>;
113
116
 
114
117
  constructor(
115
118
  apiKey: string,
@@ -126,6 +129,7 @@ export class OpenAIChatCompletionsProvider implements Provider {
126
129
  this.streamTimeoutMs = options.streamTimeoutMs ?? 1_800_000;
127
130
  this.extraCreateParams = options.extraCreateParams ?? {};
128
131
  this.maxReasoningEffort = options.maxReasoningEffort ?? "xhigh";
132
+ this.requestHeaders = options.requestHeaders ?? {};
129
133
  }
130
134
 
131
135
  async sendMessage(
@@ -197,10 +201,14 @@ export class OpenAIChatCompletionsProvider implements Provider {
197
201
  let cachedPromptTokens = 0;
198
202
 
199
203
  try {
204
+ const requestHeaders = {
205
+ ...this.requestHeaders,
206
+ ...(usageAttributionHeaders ?? {}),
207
+ };
200
208
  const stream = await this.client.chat.completions.create(params, {
201
209
  signal: timeoutSignal,
202
- ...(usageAttributionHeaders
203
- ? { headers: usageAttributionHeaders }
210
+ ...(Object.keys(requestHeaders).length > 0
211
+ ? { headers: requestHeaders }
204
212
  : {}),
205
213
  });
206
214
 
@@ -18,6 +18,11 @@ export interface OpenRouterProviderOptions {
18
18
  }
19
19
 
20
20
  const DEFAULT_OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
21
+ const OPENROUTER_APP_ATTRIBUTION_HEADERS = {
22
+ "HTTP-Referer": "https://www.vellum.ai",
23
+ "X-OpenRouter-Title": "Vellum Assistant",
24
+ "X-OpenRouter-Categories": "personal-agent,cli-agent",
25
+ };
21
26
 
22
27
  // Models on OpenRouter prefixed `anthropic/` are routed through OpenRouter's
23
28
  // Anthropic-compatible Messages API at `<root>/v1/messages` (where `<root>` is
@@ -93,6 +98,7 @@ export class OpenRouterProvider extends OpenAIChatCompletionsProvider {
93
98
  providerName: "openrouter",
94
99
  providerLabel: "OpenRouter",
95
100
  streamTimeoutMs: options.streamTimeoutMs,
101
+ requestHeaders: OPENROUTER_APP_ATTRIBUTION_HEADERS,
96
102
  });
97
103
  this.openRouterApiKey = apiKey;
98
104
  this.defaultModel = model;
@@ -192,6 +198,7 @@ export class OpenRouterProvider extends OpenAIChatCompletionsProvider {
192
198
  streamTimeoutMs: this.providerStreamTimeoutMs,
193
199
  authToken: this.openRouterApiKey,
194
200
  useNativeWebSearch: this.useNativeWebSearch,
201
+ requestHeaders: OPENROUTER_APP_ATTRIBUTION_HEADERS,
195
202
  },
196
203
  );
197
204
  }
@@ -25,7 +25,7 @@ export interface ManagedProviderMeta {
25
25
  * managed credentials are present; that policy lives in the registry/context
26
26
  * fallback allowlists.
27
27
  */
28
- export const MANAGED_PROVIDER_META: Record<string, ManagedProviderMeta> = {
28
+ export const PLATFORM_PROVIDER_META: Record<string, ManagedProviderMeta> = {
29
29
  openai: {
30
30
  name: "openai",
31
31
  managed: true,
@@ -50,4 +50,7 @@ export const MANAGED_PROVIDER_META: Record<string, ManagedProviderMeta> = {
50
50
  managed: false,
51
51
  },
52
52
  ollama: { name: "ollama", managed: false },
53
+ zai: { name: "zai", managed: false },
54
+ deepseek: { name: "deepseek", managed: false },
55
+ minimax: { name: "minimax", managed: false },
53
56
  };
@@ -12,7 +12,7 @@
12
12
  import { getPlatformBaseUrl } from "../../config/env.js";
13
13
  import { credentialKey } from "../../security/credential-key.js";
14
14
  import { getSecureKeyAsync } from "../../security/secure-keys.js";
15
- import { MANAGED_PROVIDER_META } from "./constants.js";
15
+ import { PLATFORM_PROVIDER_META } from "./constants.js";
16
16
 
17
17
  /** Storage key for the assistant API key credential. */
18
18
  const ASSISTANT_API_KEY_STORAGE_KEY = credentialKey(
@@ -70,7 +70,7 @@ export async function hasManagedProxyPrereqs(): Promise<boolean> {
70
70
  export async function buildManagedBaseUrl(
71
71
  provider: string,
72
72
  ): Promise<string | undefined> {
73
- const meta = MANAGED_PROVIDER_META[provider];
73
+ const meta = PLATFORM_PROVIDER_META[provider];
74
74
  if (!meta?.managed || !meta.proxyPath) return undefined;
75
75
 
76
76
  const ctx = await resolveManagedProxyContext();
@@ -88,7 +88,7 @@ export async function buildManagedBaseUrl(
88
88
  export async function managedFallbackEnabledFor(
89
89
  provider: string,
90
90
  ): Promise<boolean> {
91
- const meta = MANAGED_PROVIDER_META[provider];
91
+ const meta = PLATFORM_PROVIDER_META[provider];
92
92
  if (!meta?.managed) return false;
93
93
  return await hasManagedProxyPrereqs();
94
94
  }
@@ -5,9 +5,11 @@
5
5
  * environment variable fallbacks, and managed proxy availability.
6
6
  */
7
7
 
8
- import { API_KEY_PROVIDERS } from "../config/loader.js";
8
+ import { API_KEY_PROVIDERS, getConfig } from "../config/loader.js";
9
9
  import { getProviderKeyAsync } from "../security/secure-keys.js";
10
- import { managedFallbackEnabledFor } from "./managed-proxy/context.js";
10
+ import { PROVIDER_CATALOG } from "./model-catalog.js";
11
+ import { managedFallbackEnabledFor } from "./platform-proxy/context.js";
12
+ import { getVisibleProviderCatalog } from "./provider-catalog-visibility.js";
11
13
 
12
14
  /**
13
15
  * Check whether a single provider is usable — via a user-provided key
@@ -25,11 +27,24 @@ export async function isProviderAvailable(provider: string): Promise<boolean> {
25
27
  /**
26
28
  * Build the list of providers that are usable — via a user-provided key
27
29
  * (secure storage or env var) or via the managed proxy fallback.
30
+ * Feature-flagged LLM providers that are currently disabled are excluded.
28
31
  * Ollama is always included because it does not require an API key.
29
32
  */
30
33
  export async function getConfiguredProviders(): Promise<string[]> {
34
+ // Build the set of LLM providers hidden by feature flags so we can
35
+ // exclude them while leaving non-LLM providers (search, STT, TTS)
36
+ // in API_KEY_PROVIDERS unchanged.
37
+ const allLlmIds = new Set(PROVIDER_CATALOG.map((p) => p.id));
38
+ const visibleLlmIds = new Set(
39
+ getVisibleProviderCatalog(getConfig()).map((p) => p.id),
40
+ );
41
+ const hiddenLlmIds = new Set(
42
+ [...allLlmIds].filter((id) => !visibleLlmIds.has(id)),
43
+ );
44
+
31
45
  const configured: string[] = [];
32
46
  for (const p of API_KEY_PROVIDERS) {
47
+ if (hiddenLlmIds.has(p)) continue;
33
48
  if (await isProviderAvailable(p)) {
34
49
  configured.push(p);
35
50
  }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Feature-flag-aware provider catalog filtering.
3
+ *
4
+ * User-facing catalog consumers (model info, slash commands, provider
5
+ * availability) use `getVisibleProviderCatalog()` to hide providers and
6
+ * models gated behind disabled feature flags. Internal consumers
7
+ * (adapter-factory, pricing, auth) continue using the unfiltered
8
+ * `PROVIDER_CATALOG` directly.
9
+ */
10
+
11
+ import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
12
+ import type { AssistantConfig } from "../config/schema.js";
13
+ import {
14
+ PROVIDER_CATALOG,
15
+ type ProviderCatalogEntry,
16
+ } from "./model-catalog.js";
17
+
18
+ export function getVisibleProviderCatalog(
19
+ config: AssistantConfig,
20
+ ): ProviderCatalogEntry[] {
21
+ return PROVIDER_CATALOG.filter(
22
+ (entry) =>
23
+ !entry.featureFlag ||
24
+ isAssistantFeatureFlagEnabled(entry.featureFlag, config),
25
+ )
26
+ .map((entry) => {
27
+ const visibleModels = entry.models.filter(
28
+ (m) =>
29
+ !m.featureFlag ||
30
+ isAssistantFeatureFlagEnabled(m.featureFlag, config),
31
+ );
32
+ if (visibleModels.length === entry.models.length) return entry;
33
+ return { ...entry, models: visibleModels };
34
+ })
35
+ .filter((entry) => entry.models.length > 0);
36
+ }
@@ -12,12 +12,12 @@ import {
12
12
  // ---------------------------------------------------------------------------
13
13
  import type { ProviderConnection } from "./inference/auth.js";
14
14
  import { resolveAuth } from "./inference/resolve-auth.js";
15
+ import { isModelInCatalog, PROVIDER_CATALOG } from "./model-catalog.js";
16
+ import { getProviderDefaultModel } from "./model-intents.js";
15
17
  import {
16
18
  buildManagedBaseUrl,
17
19
  resolveManagedProxyContext,
18
- } from "./managed-proxy/context.js";
19
- import { isModelInCatalog, PROVIDER_CATALOG } from "./model-catalog.js";
20
- import { getProviderDefaultModel } from "./model-intents.js";
20
+ } from "./platform-proxy/context.js";
21
21
  import { RetryProvider } from "./retry.js";
22
22
  import type { Provider } from "./types.js";
23
23
  import { UsageTrackingProvider } from "./usage-tracking.js";
@@ -92,9 +92,7 @@ function resolveModel(config: ProvidersConfig, providerName: string): string {
92
92
  * The routing decision is now derived from credential availability rather than
93
93
  * the removed `services.inference.mode` config field.
94
94
  */
95
- async function resolveProviderCredentials(
96
- providerName: string,
97
- ): Promise<{
95
+ async function resolveProviderCredentials(providerName: string): Promise<{
98
96
  apiKey: string;
99
97
  baseURL?: string;
100
98
  source: "user-key" | "managed-proxy";
@@ -106,7 +104,11 @@ async function resolveProviderCredentials(
106
104
  const managedBaseUrl = await buildManagedBaseUrl(providerName);
107
105
  if (managedBaseUrl) {
108
106
  const ctx = await resolveManagedProxyContext();
109
- return { apiKey: ctx.assistantApiKey, baseURL: managedBaseUrl, source: "managed-proxy" };
107
+ return {
108
+ apiKey: ctx.assistantApiKey,
109
+ baseURL: managedBaseUrl,
110
+ source: "managed-proxy",
111
+ };
110
112
  }
111
113
  return null;
112
114
  }
@@ -122,8 +124,10 @@ export async function initializeProviders(
122
124
  (config.timeouts?.providerStreamTimeoutSec ?? 1800) * 1000;
123
125
  const useNativeWebSearch =
124
126
  config.services["web-search"].provider === "inference-provider-native";
125
- const mainAgentProvider = resolveCallSiteConfig("mainAgent", config.llm)
126
- .provider;
127
+ const mainAgentProvider = resolveCallSiteConfig(
128
+ "mainAgent",
129
+ config.llm,
130
+ ).provider;
127
131
 
128
132
  for (const entry of PROVIDER_CATALOG) {
129
133
  const isKeyless = entry.setupMode === "keyless";
@@ -230,11 +234,15 @@ export async function resolveProviderFromConnection(
230
234
  config.services["web-search"].provider === "inference-provider-native";
231
235
  const model = resolveModel(config, connection.provider);
232
236
 
233
- const provider = createAdapterFromConnection(connection, authResult.resolved, {
234
- model,
235
- streamTimeoutMs,
236
- useNativeWebSearch,
237
- });
237
+ const provider = createAdapterFromConnection(
238
+ connection,
239
+ authResult.resolved,
240
+ {
241
+ model,
242
+ streamTimeoutMs,
243
+ useNativeWebSearch,
244
+ },
245
+ );
238
246
 
239
247
  if (provider) {
240
248
  connectionProviders.set(connection.name, provider);