@vellumai/assistant 0.10.9 → 0.10.10-dev.202607162206.d08e98e

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 (456) hide show
  1. package/ARCHITECTURE.md +1 -1
  2. package/Dockerfile +8 -0
  3. package/docs/activation-funnel-telemetry.md +13 -7
  4. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  5. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  6. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  7. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  8. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  9. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  10. package/node_modules/@vellumai/service-contracts/package.json +1 -0
  11. package/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  12. package/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  13. package/openapi.yaml +530 -107
  14. package/package.json +1 -1
  15. package/scripts/generate-openapi.ts +8 -0
  16. package/src/__tests__/activation-early-marking.test.ts +6 -5
  17. package/src/__tests__/agent-loop-override-profile.test.ts +22 -25
  18. package/src/__tests__/agent-wake-override-profile.test.ts +21 -48
  19. package/src/__tests__/app-builder-tool-scripts.test.ts +0 -1
  20. package/src/__tests__/app-bundler.test.ts +4 -12
  21. package/src/__tests__/app-executors.test.ts +2 -49
  22. package/src/__tests__/app-routes-csp.test.ts +114 -146
  23. package/src/__tests__/auth-fallback-events-store.test.ts +8 -1
  24. package/src/__tests__/build-persisted-content.test.ts +96 -0
  25. package/src/__tests__/bundle-scanner.test.ts +27 -1
  26. package/src/__tests__/call-controller.test.ts +291 -0
  27. package/src/__tests__/call-site-routing-connection-auto-resolve.test.ts +165 -0
  28. package/src/__tests__/chat-credential-redaction.test.ts +1395 -0
  29. package/src/__tests__/chat-reveal-guard-priming.test.ts +791 -0
  30. package/src/__tests__/compaction.benchmark.test.ts +2 -1
  31. package/src/__tests__/compactor-image-manifest-trust.test.ts +50 -0
  32. package/src/__tests__/config-loader-backfill.test.ts +9 -4
  33. package/src/__tests__/config-schema-cmd.test.ts +10 -11
  34. package/src/__tests__/config-schema.test.ts +190 -257
  35. package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +208 -0
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +5 -19
  37. package/src/__tests__/conversation-agent-loop.test.ts +22 -9
  38. package/src/__tests__/conversation-error.test.ts +31 -0
  39. package/src/__tests__/conversation-load-history-repair.test.ts +110 -0
  40. package/src/__tests__/conversation-process-callsite.test.ts +12 -19
  41. package/src/__tests__/conversation-routes-slash-commands.test.ts +7 -21
  42. package/src/__tests__/conversation-summarize-route.test.ts +36 -44
  43. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
  44. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +7 -7
  45. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -1
  46. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -1
  47. package/src/__tests__/conversation-usage.test.ts +4 -12
  48. package/src/__tests__/credential-routes.test.ts +250 -0
  49. package/src/__tests__/credential-security-invariants.test.ts +3 -0
  50. package/src/__tests__/db-migration-rollback.test.ts +22 -0
  51. package/src/__tests__/empty-response-hook.test.ts +186 -1
  52. package/src/__tests__/external-plugin-loader.test.ts +11 -5
  53. package/src/__tests__/heartbeat-service.test.ts +0 -28
  54. package/src/__tests__/host-shell-tool.test.ts +2 -0
  55. package/src/__tests__/inactive-tool-error-messages.test.ts +2 -2
  56. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +52 -8
  57. package/src/__tests__/internal-telemetry-routes.test.ts +23 -4
  58. package/src/__tests__/invite-routes-http.test.ts +12 -16
  59. package/src/__tests__/list-all-apps.test.ts +0 -4
  60. package/src/__tests__/llm-context-resolution.test.ts +32 -56
  61. package/src/__tests__/llm-request-log-turn-query.test.ts +109 -0
  62. package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -52
  63. package/src/__tests__/llm-resolver.test.ts +342 -602
  64. package/src/__tests__/llm-schema.test.ts +79 -37
  65. package/src/__tests__/max-tokens-continue-hook.test.ts +19 -0
  66. package/src/__tests__/media-stream-output.test.ts +259 -3
  67. package/src/__tests__/media-stream-server-integration.test.ts +22 -1
  68. package/src/__tests__/media-stream-stt-session.test.ts +47 -0
  69. package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +33 -0
  70. package/src/__tests__/memory-recall-log-store.test.ts +47 -13
  71. package/src/__tests__/mock-gateway-ipc.ts +46 -1
  72. package/src/__tests__/mtime-cache.test.ts +61 -0
  73. package/src/__tests__/navigate-settings-tab.test.ts +2 -0
  74. package/src/__tests__/normalize-onboarding.test.ts +33 -0
  75. package/src/__tests__/onboarding-persona-write.test.ts +26 -0
  76. package/src/__tests__/plugin-api-resolve-credential.test.ts +140 -0
  77. package/src/__tests__/plugin-app-serve-routes.test.ts +166 -14
  78. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +2 -0
  79. package/src/__tests__/post-turn-tool-result-truncation.test.ts +38 -0
  80. package/src/__tests__/provider-commit-message-generator.test.ts +27 -20
  81. package/src/__tests__/provider-connections-backfill.test.ts +138 -0
  82. package/src/__tests__/provider-platform-proxy-integration.test.ts +10 -31
  83. package/src/__tests__/provider-registry-ollama.test.ts +8 -18
  84. package/src/__tests__/provider-send-message-override-profile.test.ts +23 -23
  85. package/src/__tests__/provider-usage-tracking.test.ts +9 -19
  86. package/src/__tests__/prune-old-conversations-job.test.ts +12 -0
  87. package/src/__tests__/published-app-updater.test.ts +22 -16
  88. package/src/__tests__/registry.test.ts +5 -16
  89. package/src/__tests__/retry-openrouter-only-normalization.test.ts +22 -23
  90. package/src/__tests__/retry-thinking-adaptive-only.test.ts +43 -48
  91. package/src/__tests__/retry-thinking-tool-choice.test.ts +57 -66
  92. package/src/__tests__/retry-verbosity-normalization.test.ts +24 -23
  93. package/src/__tests__/reveal-success-registry.test.ts +123 -0
  94. package/src/__tests__/run-conversation-turn-persistence.test.ts +130 -0
  95. package/src/__tests__/secret-fixtures.ts +9 -0
  96. package/src/__tests__/server-history-render.test.ts +28 -0
  97. package/src/__tests__/skills.test.ts +9 -4
  98. package/src/__tests__/slack-share-routes.test.ts +0 -1
  99. package/src/__tests__/stt-stream-session.test.ts +6 -5
  100. package/src/__tests__/subagent-call-site-routing.test.ts +69 -95
  101. package/src/__tests__/subagent-disposal.test.ts +2 -0
  102. package/src/__tests__/subagent-fork-notifications.test.ts +2 -0
  103. package/src/__tests__/subagent-fork-spawn.test.ts +2 -0
  104. package/src/__tests__/subagent-manager-notify.test.ts +2 -0
  105. package/src/__tests__/subagent-role-registry.test.ts +37 -0
  106. package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
  107. package/src/__tests__/subagent-terminal-message.test.ts +50 -0
  108. package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -5
  109. package/src/__tests__/surface-completion-nudge-hook.test.ts +19 -0
  110. package/src/__tests__/telemetry-routes.test.ts +99 -19
  111. package/src/__tests__/tool-audit.test.ts +34 -4
  112. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  113. package/src/__tests__/tool-profiler.test.ts +72 -1
  114. package/src/__tests__/tool-result-spool.test.ts +49 -4
  115. package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -1
  116. package/src/__tests__/ui-channel-variants.test.ts +108 -0
  117. package/src/__tests__/ui-shape-teaching.test.ts +255 -0
  118. package/src/__tests__/usage-attribution.test.ts +18 -41
  119. package/src/__tests__/user-plugin-loader.test.ts +4 -4
  120. package/src/__tests__/voice-config-update.test.ts +46 -0
  121. package/src/__tests__/voice-session-bridge.test.ts +216 -84
  122. package/src/__tests__/workspace-migration-131-drop-web-fetch-mode.test.ts +120 -0
  123. package/src/agent/loop.ts +4 -3
  124. package/src/api/events/open-conversation.test.ts +64 -0
  125. package/src/api/events/open-conversation.ts +33 -0
  126. package/src/api/index.ts +6 -0
  127. package/src/api/responses/conversation-message.ts +5 -0
  128. package/src/apps/app-store.ts +25 -35
  129. package/src/bundler/app-bundler.ts +34 -48
  130. package/src/bundler/app-compiler.ts +39 -4
  131. package/src/bundler/bundle-scanner.ts +13 -0
  132. package/src/bundler/manifest.ts +1 -1
  133. package/src/calls/__tests__/voice-session-bridge.test.ts +47 -0
  134. package/src/calls/call-constants.ts +5 -0
  135. package/src/calls/call-controller.ts +100 -32
  136. package/src/calls/call-transport.ts +9 -0
  137. package/src/calls/media-stream-output.ts +107 -4
  138. package/src/calls/media-stream-server.ts +29 -9
  139. package/src/calls/media-stream-stt-session.ts +7 -1
  140. package/src/calls/media-turn-detector.ts +11 -1
  141. package/src/calls/voice-session-bridge.ts +84 -63
  142. package/src/cli/commands/__tests__/inference-providers.test.ts +270 -33
  143. package/src/cli/commands/__tests__/notifications.test.ts +24 -3
  144. package/src/cli/commands/config.help.ts +6 -6
  145. package/src/cli/commands/credentials.help.ts +13 -0
  146. package/src/cli/commands/credentials.ts +6 -1
  147. package/src/cli/commands/email.help.ts +7 -0
  148. package/src/cli/commands/email.ts +35 -1
  149. package/src/cli/commands/inference-providers.ts +168 -107
  150. package/src/cli/commands/inference.help.ts +118 -46
  151. package/src/cli/commands/memory/index.help.ts +23 -0
  152. package/src/cli/commands/memory/nodes.ts +146 -0
  153. package/src/cli/commands/notifications.help.ts +10 -10
  154. package/src/cli/commands/oauth/connect-surface-guidance.test.ts +40 -0
  155. package/src/cli/commands/oauth/connect-surface-guidance.ts +54 -0
  156. package/src/cli/commands/oauth/connect.test.ts +126 -0
  157. package/src/cli/commands/oauth/connect.ts +29 -6
  158. package/src/cli/commands/oauth/index.help.ts +7 -1
  159. package/src/cli/commands/oauth/status.test.ts +69 -3
  160. package/src/cli/commands/oauth/status.ts +50 -12
  161. package/src/cli/commands/plugins.help.ts +13 -2
  162. package/src/cli/commands/plugins.ts +61 -7
  163. package/src/cli/commands/telemetry.help.ts +13 -0
  164. package/src/cli/commands/telemetry.ts +45 -5
  165. package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +8 -2
  166. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +213 -9
  167. package/src/cli/lib/bundled-marketplace.json +93 -36
  168. package/src/cli/lib/inspect-plugin.ts +5 -1
  169. package/src/cli/lib/install-from-github.ts +68 -4
  170. package/src/cli/lib/plugin-catalog-local.ts +6 -2
  171. package/src/cli/lib/plugin-fingerprint.ts +3 -3
  172. package/src/cli/lib/upgrade-plugin.ts +236 -35
  173. package/src/config/__tests__/default-profile-catalog.test.ts +8 -12
  174. package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +137 -0
  175. package/src/config/__tests__/profile-materialization.test.ts +1 -88
  176. package/src/config/bundled-skills/AGENTS.md +3 -30
  177. package/src/config/bundled-skills/app-builder/SKILL.md +5 -3
  178. package/src/config/bundled-skills/app-builder/TOOLS.json +23 -0
  179. package/src/config/bundled-skills/app-builder/tools/app-open.ts +32 -0
  180. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
  181. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +7 -7
  182. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  183. package/src/config/bundled-skills/schedule/TOOLS.json +1 -1
  184. package/src/config/bundled-skills/settings/TOOLS.json +3 -1
  185. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +2 -0
  186. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +18 -10
  187. package/src/config/bundled-skills/subagent/SKILL.md +2 -0
  188. package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
  189. package/src/config/call-site-defaults.ts +3 -3
  190. package/src/config/feature-flag-registry.json +24 -39
  191. package/src/config/llm-resolver.ts +88 -475
  192. package/src/config/profile-materialization.ts +11 -11
  193. package/src/config/schema.ts +93 -127
  194. package/src/config/schemas/__tests__/live-voice.test.ts +24 -6
  195. package/src/config/schemas/__tests__/stt.test.ts +31 -3
  196. package/src/config/schemas/live-voice.ts +10 -4
  197. package/src/config/schemas/llm.ts +52 -15
  198. package/src/config/schemas/memory-lifecycle.ts +1 -1
  199. package/src/config/schemas/memory-retrospective.ts +8 -0
  200. package/src/config/schemas/memory-v2.ts +2 -2
  201. package/src/config/schemas/memory-v3.ts +1 -1
  202. package/src/config/schemas/services.ts +6 -3
  203. package/src/config/schemas/stt.ts +38 -21
  204. package/src/config/schemas/tts.ts +13 -18
  205. package/src/config/skills.ts +31 -21
  206. package/src/context/compactor.ts +44 -7
  207. package/src/context/post-turn-tool-result-truncation.ts +4 -2
  208. package/src/context/tool-result-spool.ts +26 -5
  209. package/src/conversations/__tests__/message-consolidation.test.ts +48 -0
  210. package/src/conversations/message-consolidation.ts +22 -2
  211. package/src/daemon/__tests__/conversation-tool-setup.test.ts +5 -12
  212. package/src/daemon/app-source-watcher.ts +17 -23
  213. package/src/daemon/chat-credential-redaction.ts +1365 -0
  214. package/src/daemon/conversation-agent-loop-handlers.ts +627 -34
  215. package/src/daemon/conversation-agent-loop.ts +71 -31
  216. package/src/daemon/conversation-error.ts +36 -14
  217. package/src/daemon/conversation-process.ts +22 -0
  218. package/src/daemon/conversation-store.ts +35 -0
  219. package/src/daemon/conversation-surfaces.ts +25 -25
  220. package/src/daemon/conversation-tool-setup.ts +33 -7
  221. package/src/daemon/conversation.ts +55 -5
  222. package/src/daemon/handlers/shared.ts +33 -2
  223. package/src/daemon/lifecycle.ts +4 -4
  224. package/src/daemon/message-types/conversations.ts +6 -17
  225. package/src/daemon/providers-setup.ts +8 -0
  226. package/src/daemon/tool-setup-types.ts +7 -1
  227. package/src/daemon/wake-conversation-ops.ts +10 -1
  228. package/src/hooks/types.ts +9 -0
  229. package/src/ipc/__tests__/email-ipc.test.ts +90 -0
  230. package/src/ipc/gateway-client.test.ts +59 -0
  231. package/src/ipc/gateway-client.ts +70 -27
  232. package/src/live-voice/__tests__/live-voice-events.test.ts +14 -2
  233. package/src/live-voice/__tests__/live-voice-integration.test.ts +116 -2
  234. package/src/live-voice/__tests__/live-voice-vad.test.ts +804 -13
  235. package/src/live-voice/__tests__/protocol.test.ts +122 -0
  236. package/src/live-voice/live-voice-session.ts +443 -40
  237. package/src/live-voice/protocol.ts +143 -1
  238. package/src/monitoring/__tests__/plugin-source-watch.test.ts +3 -1
  239. package/src/monitoring/plugin-source-watch.ts +3 -62
  240. package/src/notifications/README.md +1 -1
  241. package/src/permissions/checker.ts +8 -4
  242. package/src/persistence/__tests__/db-init-migrations-ok.test.ts +26 -0
  243. package/src/persistence/conversation-crud.ts +104 -2
  244. package/src/persistence/db-init.ts +14 -3
  245. package/src/persistence/job-handlers/cleanup.ts +15 -7
  246. package/src/persistence/llm-request-log-store.ts +88 -52
  247. package/src/persistence/migrations/298-move-memory-jobs-to-memory-db.ts +7 -31
  248. package/src/persistence/migrations/305-drop-contact-acl-columns.ts +3 -2
  249. package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +8 -34
  250. package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +90 -0
  251. package/src/persistence/migrations/337-move-memory-recall-logs-to-memory-db.ts +114 -0
  252. package/src/persistence/migrations/338-move-memory-v3-selections-to-memory-db.ts +84 -0
  253. package/src/persistence/migrations/339-move-activation-sessions-to-memory-db.ts +52 -0
  254. package/src/persistence/migrations/__tests__/run-migrations.test.ts +155 -0
  255. package/src/persistence/migrations/helpers/relocation.ts +44 -1
  256. package/src/persistence/migrations/run-migrations.ts +25 -1
  257. package/src/persistence/schema/infrastructure.ts +9 -0
  258. package/src/persistence/schema/memory-core.ts +3 -0
  259. package/src/persistence/schema/memory-injection.ts +2 -0
  260. package/src/persistence/steps.ts +36 -0
  261. package/src/platform/client.test.ts +1 -44
  262. package/src/platform/client.ts +10 -20
  263. package/src/platform/consent-cache.test.ts +89 -23
  264. package/src/platform/consent-cache.ts +71 -33
  265. package/src/plugin-api/constants.ts +12 -0
  266. package/src/plugin-api/conversation-turn.ts +37 -14
  267. package/src/plugin-api/index.ts +11 -1
  268. package/src/plugin-api/resolve-credential.ts +75 -0
  269. package/src/plugin-api/vision-support.test.ts +8 -19
  270. package/src/plugin-api/vision-support.ts +26 -17
  271. package/src/plugins/collect-source-versions.ts +77 -0
  272. package/src/plugins/defaults/compaction/compact.ts +6 -0
  273. package/src/plugins/defaults/compaction/window-manager.ts +9 -0
  274. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +18 -24
  275. package/src/plugins/defaults/empty-response/hooks/user-prompt-submit.ts +38 -0
  276. package/src/plugins/defaults/empty-response/refusal-quarantine.ts +99 -0
  277. package/src/plugins/defaults/image-fallback/__tests__/caption-cache-persistence.test.ts +7 -3
  278. package/src/plugins/defaults/index.ts +8 -1
  279. package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +4 -1
  280. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +48 -6
  281. package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +28 -22
  282. package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +148 -0
  283. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +80 -8
  284. package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +202 -0
  285. package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +64 -25
  286. package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +24 -11
  287. package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +70 -6
  288. package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +278 -0
  289. package/src/plugins/defaults/memory/activation-session-store.ts +27 -20
  290. package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -9
  291. package/src/plugins/defaults/memory/context-search/sources/workspace.ts +1 -8
  292. package/src/plugins/defaults/memory/graph/retriever.test.ts +6 -6
  293. package/src/plugins/defaults/memory/graph/store.ts +114 -0
  294. package/src/plugins/defaults/memory/graph/tool-handlers.ts +36 -1
  295. package/src/plugins/defaults/memory/graph/tools.ts +47 -13
  296. package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +16 -35
  297. package/src/plugins/defaults/memory/jobs-worker.ts +10 -1
  298. package/src/plugins/defaults/memory/memory-db.ts +3 -2
  299. package/src/plugins/defaults/memory/memory-recall-log-store.ts +129 -66
  300. package/src/plugins/defaults/memory/memory-retrospective-constants.ts +8 -0
  301. package/src/plugins/defaults/memory/memory-retrospective-job.ts +11 -122
  302. package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +216 -0
  303. package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +84 -46
  304. package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +42 -32
  305. package/src/plugins/defaults/memory/path-containment.ts +21 -0
  306. package/src/plugins/defaults/memory/prompt-override.ts +51 -13
  307. package/src/plugins/defaults/memory/tools.test.ts +34 -0
  308. package/src/plugins/defaults/memory/tools.ts +12 -2
  309. package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +19 -15
  310. package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +24 -19
  311. package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +19 -15
  312. package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +22 -2
  313. package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +5 -3
  314. package/src/plugins/defaults/memory/v2/harness/oracle.ts +59 -41
  315. package/src/plugins/defaults/memory/v2/harness/replay-input.ts +29 -25
  316. package/src/plugins/defaults/memory/v2/migration.ts +46 -16
  317. package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +4 -0
  318. package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +17 -15
  319. package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +24 -22
  320. package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +9 -5
  321. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +277 -10
  322. package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +57 -5
  323. package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +9 -7
  324. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +38 -7
  325. package/src/plugins/defaults/memory/v3/hot-set.test.ts +36 -18
  326. package/src/plugins/defaults/memory/v3/hot-set.ts +12 -14
  327. package/src/plugins/defaults/memory/v3/learned-edges.test.ts +47 -27
  328. package/src/plugins/defaults/memory/v3/learned-edges.ts +12 -14
  329. package/src/plugins/defaults/memory/v3/orchestrate.ts +139 -22
  330. package/src/plugins/defaults/memory/v3/prune.test.ts +10 -3
  331. package/src/plugins/defaults/memory/v3/prune.ts +17 -11
  332. package/src/plugins/defaults/memory/v3/selection-log-store.ts +23 -11
  333. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +70 -53
  334. package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +9 -6
  335. package/src/plugins/external-plugin-loader.ts +15 -15
  336. package/src/plugins/mtime-cache.ts +47 -0
  337. package/src/plugins/pipeline.ts +9 -1
  338. package/src/plugins/plugin-execution-context.ts +44 -0
  339. package/src/plugins/plugin-tree-walk.ts +31 -24
  340. package/src/plugins/source-fingerprint.ts +3 -4
  341. package/src/prompts/normalize-onboarding.ts +12 -0
  342. package/src/prompts/persona-resolver.ts +8 -0
  343. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +1 -1
  344. package/src/providers/__tests__/dispatch-connection-routing.test.ts +6 -9
  345. package/src/providers/__tests__/registry-native-web-search.test.ts +4 -10
  346. package/src/providers/__tests__/retry-callsite.test.ts +235 -215
  347. package/src/providers/__tests__/satellite-connection-routing.test.ts +8 -16
  348. package/src/providers/atlascloud/client.ts +10 -49
  349. package/src/providers/baseten/client.ts +43 -0
  350. package/src/providers/call-site-routing.ts +26 -13
  351. package/src/providers/connection-resolution.ts +9 -11
  352. package/src/providers/fetch-provider-catalog.ts +4 -2
  353. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +29 -4
  354. package/src/providers/inference/__tests__/connection-availability-keyless.test.ts +78 -0
  355. package/src/providers/inference/adapter-factory.ts +27 -6
  356. package/src/providers/inference/auth.ts +29 -1
  357. package/src/providers/inference/backfill.ts +61 -10
  358. package/src/providers/inference/connection-availability.ts +3 -2
  359. package/src/providers/inference/resolve-auth.ts +9 -1
  360. package/src/providers/model-catalog.ts +37 -0
  361. package/src/providers/openai/__tests__/api-error-normalization.test.ts +24 -2
  362. package/src/providers/openai/api-key-validation.ts +70 -0
  363. package/src/providers/retry.ts +2 -0
  364. package/src/providers/types.ts +11 -4
  365. package/src/providers/vellum-model-routing.test.ts +26 -0
  366. package/src/providers/vellum-model-routing.ts +30 -0
  367. package/src/providers/voice-error-copy.ts +47 -0
  368. package/src/runtime/agent-wake.ts +40 -24
  369. package/src/runtime/for-chat-mint-registry.ts +118 -0
  370. package/src/runtime/reveal-nonce.ts +49 -0
  371. package/src/runtime/reveal-success-registry.ts +306 -0
  372. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +88 -3
  373. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +161 -30
  374. package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +7 -0
  375. package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +15 -0
  376. package/src/runtime/routes/app-management-routes.ts +152 -45
  377. package/src/runtime/routes/app-routes.ts +16 -77
  378. package/src/runtime/routes/canned-message-complete.ts +16 -16
  379. package/src/runtime/routes/conversation-management-routes.ts +17 -14
  380. package/src/runtime/routes/conversation-query-routes.ts +54 -6
  381. package/src/runtime/routes/conversation-routes.ts +48 -2
  382. package/src/runtime/routes/credential-routes.ts +116 -3
  383. package/src/runtime/routes/email-routes.ts +17 -1
  384. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +33 -5
  385. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +6 -5
  386. package/src/runtime/routes/inference-provider-connection-routes.ts +77 -28
  387. package/src/runtime/routes/inference-send-routes.ts +1 -1
  388. package/src/runtime/routes/internal-telemetry-routes.ts +7 -6
  389. package/src/runtime/routes/plugins-routes.ts +37 -6
  390. package/src/runtime/routes/publish-routes.ts +15 -18
  391. package/src/runtime/routes/schedule-worker-routes.ts +9 -0
  392. package/src/runtime/routes/secret-routes.ts +10 -0
  393. package/src/runtime/routes/telemetry-routes.ts +149 -45
  394. package/src/schedule/__tests__/schedule-timezone.test.ts +101 -0
  395. package/src/schedule/__tests__/worker-watchdog.test.ts +209 -0
  396. package/src/schedule/schedule-store.ts +12 -1
  397. package/src/schedule/schedule-timezone.ts +63 -0
  398. package/src/schedule/scheduler.ts +100 -6
  399. package/src/schedule/worker-control.ts +19 -0
  400. package/src/security/auth-fallback-events-store.ts +7 -6
  401. package/src/security/secret-scanner.ts +26 -1
  402. package/src/services/published-app-updater.ts +6 -11
  403. package/src/stt/stt-stream-session.ts +36 -16
  404. package/src/subagent/manager.ts +34 -8
  405. package/src/telemetry/AGENTS.md +30 -1
  406. package/src/telemetry/__tests__/config-setting-snapshot.test.ts +18 -0
  407. package/src/telemetry/__tests__/outbox-test-harness.ts +5 -3
  408. package/src/telemetry/config-setting-snapshot.ts +44 -10
  409. package/src/telemetry/telemetry-event-sources.test.ts +124 -30
  410. package/src/telemetry/telemetry-event-sources.ts +137 -83
  411. package/src/telemetry/telemetry-events-outbox.test.ts +46 -1
  412. package/src/telemetry/telemetry-events-outbox.ts +60 -9
  413. package/src/telemetry/telemetry-wire-source.json +1 -1
  414. package/src/telemetry/telemetry-wire-validation.ts +39 -2
  415. package/src/telemetry/telemetry-wire.generated.ts +8 -0
  416. package/src/telemetry/tool-audit.ts +15 -9
  417. package/src/telemetry/tool-executed-events-store.test.ts +1 -1
  418. package/src/telemetry/turn-events-store.ts +20 -0
  419. package/src/telemetry/types.ts +45 -12
  420. package/src/telemetry/usage-telemetry-reporter.test.ts +294 -25
  421. package/src/telemetry/usage-telemetry-reporter.ts +117 -18
  422. package/src/telemetry/watchdog-direct-emit.test.ts +11 -3
  423. package/src/telemetry/watchdog-direct-emit.ts +11 -6
  424. package/src/tools/apps/executors.ts +11 -36
  425. package/src/tools/executor.ts +14 -1
  426. package/src/tools/host-terminal/host-shell.ts +6 -2
  427. package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +1 -1
  428. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +25 -0
  429. package/src/tools/network/web-fetch.ts +6 -2
  430. package/src/tools/skills/sandbox-runner.ts +5 -2
  431. package/src/tools/subagent/spawn.ts +7 -11
  432. package/src/tools/terminal/shell.ts +5 -2
  433. package/src/tools/tool-manifest.ts +0 -2
  434. package/src/tools/tool-profiler.ts +37 -6
  435. package/src/tools/ui-surface/channel-variants.ts +101 -0
  436. package/src/tools/ui-surface/definitions.ts +23 -67
  437. package/src/tools/ui-surface/surface-shape-docs.ts +229 -0
  438. package/src/tts/__tests__/provider-adapters.test.ts +18 -0
  439. package/src/tts/provider-catalog.ts +2 -4
  440. package/src/tts/providers/deepgram-provider.ts +10 -1
  441. package/src/types/onboarding-context.ts +8 -0
  442. package/src/usage/attribution.ts +18 -112
  443. package/src/{config/bundled-skills/messaging/tools/gmail-mime-helpers.ts → util/mime-type.ts} +4 -1
  444. package/src/util/provider-error-patterns.ts +7 -1
  445. package/src/util/worker-process.ts +105 -0
  446. package/src/watcher/__tests__/telemetry.test.ts +17 -4
  447. package/src/watcher/telemetry.ts +5 -5
  448. package/src/workspace/migrations/131-drop-web-fetch-mode.ts +61 -0
  449. package/src/workspace/migrations/registry.ts +2 -0
  450. package/src/workspace/provider-commit-message-generator.ts +6 -4
  451. package/src/__tests__/app-open-proxy.test.ts +0 -67
  452. package/src/onboarding/onboarding-research-events-store.test.ts +0 -230
  453. package/src/onboarding/onboarding-research-events-store.ts +0 -104
  454. package/src/runtime/routes/assets/vellum-design-system.css +0 -2236
  455. package/src/tools/apps/definitions.ts +0 -73
  456. package/src/tools/apps/open-proxy.ts +0 -43
@@ -1,14 +1,17 @@
1
1
  /**
2
2
  * `assistant inference providers` CLI namespace.
3
3
  *
4
- * Provider-scoped admin commands. Currently exposes one subcommand:
4
+ * Provider-scoped admin commands:
5
5
  *
6
- * `assistant inference providers connections <verb>`
7
- * list — list all connections (optionally filtered by provider)
8
- * get — show a single connection
9
- * create — create a new connection
10
- * update — update a connection's auth
11
- * delete — delete a connection (rejects if profiles reference it)
6
+ * `assistant inference providers <verb>`
7
+ * list — list configured providers (optionally filtered by provider)
8
+ * get — show a single provider entry
9
+ * create — add a provider (auth derived from the provider type)
10
+ * update — update a provider entry
11
+ * delete — remove a provider (rejects if profiles reference it)
12
+ *
13
+ * `assistant inference providers connections <verb>` is a deprecated alias
14
+ * of the same verbs, kept for one release.
12
15
  *
13
16
  * All subcommands delegate to the daemon via IPC using the
14
17
  * `inference_provider_connections_*` routes.
@@ -60,12 +63,97 @@ function formatAuth(auth: AuthInfo): string {
60
63
  }
61
64
  }
62
65
 
66
+ // ---------------------------------------------------------------------------
67
+ // Auth derivation
68
+ // ---------------------------------------------------------------------------
69
+
70
+ /**
71
+ * Derive the auth object a provider implies via the daemon's shared
72
+ * `deriveAuthForProvider` (one source of truth for the keyless / vellum /
73
+ * openai-compatible rules), mapping its credential-required null to a
74
+ * CLI-flavored error message string.
75
+ */
76
+ async function deriveAuthInput(
77
+ provider: string,
78
+ credential?: string,
79
+ ): Promise<Record<string, unknown> | string> {
80
+ // Deferred: pure module, imported lazily per cli/no-daemon-internals.
81
+ const { deriveAuthForProvider } =
82
+ await import("../../providers/inference/auth.js");
83
+ const derived = deriveAuthForProvider(provider, credential);
84
+ if (!derived) {
85
+ return `Provider "${provider}" authenticates by API key — pass --credential <vault-key> (or an explicit --auth override)`;
86
+ }
87
+ return derived as unknown as Record<string, unknown>;
88
+ }
89
+
90
+ /**
91
+ * Build and validate an explicit `--auth` override from CLI flags. Returns
92
+ * the auth object on success, or an error message string on validation
93
+ * failure.
94
+ */
95
+ function buildAuthInput(
96
+ authType: string,
97
+ credential?: string,
98
+ ): Record<string, unknown> | string {
99
+ if (authType === "api_key") {
100
+ if (!credential) {
101
+ return "--credential is required when --auth api_key";
102
+ }
103
+ return { type: "api_key", credential };
104
+ }
105
+ if (authType === "platform") {
106
+ if (credential) {
107
+ return "--credential is not accepted with --auth platform";
108
+ }
109
+ return { type: "platform" };
110
+ }
111
+ if (authType === "none") {
112
+ if (credential) {
113
+ return "--credential is not accepted with --auth none";
114
+ }
115
+ return { type: "none" };
116
+ }
117
+ if (authType === "oauth_subscription") {
118
+ if (!credential) {
119
+ return "--credential is required when --auth oauth_subscription";
120
+ }
121
+ return { type: "oauth_subscription", credential };
122
+ }
123
+ return `Unknown auth type "${authType}". Use: api_key, platform, none, oauth_subscription`;
124
+ }
125
+
126
+ /** Commander collector for a repeatable option (e.g. `--model` multiple times). */
127
+ function collectRepeatable(value: string, previous: string[]): string[] {
128
+ return [...previous, value];
129
+ }
130
+
131
+ /**
132
+ * Build the openai-compatible custom-provider fields (`base_url`, `models`)
133
+ * from CLI flags, forwarded to the connection route under its exact field
134
+ * names. The daemon stays authoritative on whether they are required/allowed;
135
+ * the CLI only shape-forwards what the user passed.
136
+ */
137
+ function buildCustomProviderFields(opts: {
138
+ baseUrl?: string;
139
+ model?: string[];
140
+ }): Record<string, unknown> {
141
+ const fields: Record<string, unknown> = {};
142
+ if (opts.baseUrl !== undefined) {
143
+ fields.base_url = opts.baseUrl;
144
+ }
145
+ if (opts.model !== undefined && opts.model.length > 0) {
146
+ fields.models = opts.model.map((id) => ({ id }));
147
+ }
148
+ return fields;
149
+ }
150
+
63
151
  // ---------------------------------------------------------------------------
64
152
  // Subcommand: list
65
153
  // ---------------------------------------------------------------------------
66
154
 
67
- function attachListSubcommand(connections: Command): void {
68
- subcommand(connections, "list").action(
155
+ function attachListSubcommand(parent: Command): void {
156
+ subcommand(parent, "list").action(
69
157
  async (opts: { provider?: string; json?: boolean }) => {
70
158
  const ipcResult = await cliIpcCall<{ connections: ProviderConnection[] }>(
71
159
  "inference_provider_connections_list",
@@ -89,14 +177,12 @@ function attachListSubcommand(connections: Command): void {
89
177
  }
90
178
 
91
179
  if (rows.length === 0) {
92
- process.stdout.write("No connections found.\n");
180
+ process.stdout.write("No providers found.\n");
93
181
  return;
94
182
  }
95
183
 
96
184
  for (const conn of rows) {
97
- process.stdout.write(
98
- `${conn.name} provider=${conn.provider} auth=${formatAuth(conn.auth)}\n`,
99
- );
185
+ process.stdout.write(`${conn.name} provider=${conn.provider}\n`);
100
186
  }
101
187
  },
102
188
  );
@@ -106,8 +192,8 @@ function attachListSubcommand(connections: Command): void {
106
192
  // Subcommand: get
107
193
  // ---------------------------------------------------------------------------
108
194
 
109
- function attachGetSubcommand(connections: Command): void {
110
- subcommand(connections, "get").action(
195
+ function attachGetSubcommand(parent: Command): void {
196
+ subcommand(parent, "get").action(
111
197
  async (name: string, opts: { json?: boolean }) => {
112
198
  const ipcResult = await cliIpcCall<ProviderConnection>(
113
199
  "inference_provider_connections_get",
@@ -143,82 +229,18 @@ function attachGetSubcommand(connections: Command): void {
143
229
  );
144
230
  }
145
231
 
146
- // ---------------------------------------------------------------------------
147
- // Auth input builder
148
- // ---------------------------------------------------------------------------
149
-
150
- /**
151
- * Build and validate auth input from CLI flags. Returns the auth object on
152
- * success, or an error message string on validation failure.
153
- */
154
- function buildAuthInput(
155
- authType: string,
156
- credential?: string,
157
- ): Record<string, unknown> | string {
158
- if (authType === "api_key") {
159
- if (!credential) {
160
- return "--credential is required when --auth api_key";
161
- }
162
- return { type: "api_key", credential };
163
- }
164
- if (authType === "platform") {
165
- if (credential) {
166
- return "--credential is not accepted with --auth platform";
167
- }
168
- return { type: "platform" };
169
- }
170
- if (authType === "none") {
171
- if (credential) {
172
- return "--credential is not accepted with --auth none";
173
- }
174
- return { type: "none" };
175
- }
176
- if (authType === "oauth_subscription") {
177
- if (!credential) {
178
- return "--credential is required when --auth oauth_subscription";
179
- }
180
- return { type: "oauth_subscription", credential };
181
- }
182
- return `Unknown auth type "${authType}". Use: api_key, platform, none, oauth_subscription`;
183
- }
184
-
185
- /** Commander collector for a repeatable option (e.g. `--model` multiple times). */
186
- function collectRepeatable(value: string, previous: string[]): string[] {
187
- return [...previous, value];
188
- }
189
-
190
- /**
191
- * Build the openai-compatible custom-provider fields (`base_url`, `models`)
192
- * from CLI flags, forwarded to the connection route under its exact field
193
- * names. The daemon stays authoritative on whether they are required/allowed;
194
- * the CLI only shape-forwards what the user passed.
195
- */
196
- function buildCustomProviderFields(opts: {
197
- baseUrl?: string;
198
- model?: string[];
199
- }): Record<string, unknown> {
200
- const fields: Record<string, unknown> = {};
201
- if (opts.baseUrl !== undefined) {
202
- fields.base_url = opts.baseUrl;
203
- }
204
- if (opts.model !== undefined && opts.model.length > 0) {
205
- fields.models = opts.model.map((id) => ({ id }));
206
- }
207
- return fields;
208
- }
209
-
210
232
  // ---------------------------------------------------------------------------
211
233
  // Subcommand: create
212
234
  // ---------------------------------------------------------------------------
213
235
 
214
- function attachCreateSubcommand(connections: Command): void {
236
+ function attachCreateSubcommand(parent: Command): void {
215
237
  // `--model` uses an array-accumulating collector, which the declarative
216
238
  // help contract cannot express — it is registered imperatively here (with
217
239
  // the trailing `--json` after it, preserving option order).
218
- subcommand(connections, "create")
240
+ subcommand(parent, "create")
219
241
  .option(
220
242
  "--model <id>",
221
- "Model id offered by this connection (repeatable; required for openai-compatible)",
243
+ "Model id offered by this provider (repeatable; required for openai-compatible)",
222
244
  collectRepeatable,
223
245
  [] as string[],
224
246
  )
@@ -228,14 +250,16 @@ function attachCreateSubcommand(connections: Command): void {
228
250
  name: string,
229
251
  opts: {
230
252
  provider: string;
231
- auth: string;
253
+ auth?: string;
232
254
  credential?: string;
233
255
  baseUrl?: string;
234
256
  model?: string[];
235
257
  json?: boolean;
236
258
  },
237
259
  ) => {
238
- const authInput = buildAuthInput(opts.auth, opts.credential);
260
+ const authInput = opts.auth
261
+ ? buildAuthInput(opts.auth, opts.credential)
262
+ : await deriveAuthInput(opts.provider, opts.credential);
239
263
  if (typeof authInput === "string") {
240
264
  writeCliError(authInput, opts.json);
241
265
  return;
@@ -274,8 +298,8 @@ function attachCreateSubcommand(connections: Command): void {
274
298
  );
275
299
  } else {
276
300
  process.stdout.write(
277
- `Created connection "${conn.name}" (provider=${conn.provider}, auth=${formatAuth(conn.auth)})\n` +
278
- `Verify it works: point a profile's provider_connection at "${conn.name}", then run: assistant inference send --profile <profile> "Reply with OK"\n`,
301
+ `Added provider "${conn.name}" (provider=${conn.provider})\n` +
302
+ `Verify it works: point a profile at "${conn.name}", then run: assistant inference send --profile <profile> "Reply with OK"\n`,
279
303
  );
280
304
  }
281
305
  },
@@ -286,12 +310,12 @@ function attachCreateSubcommand(connections: Command): void {
286
310
  // Subcommand: update
287
311
  // ---------------------------------------------------------------------------
288
312
 
289
- function attachUpdateSubcommand(connections: Command): void {
313
+ function attachUpdateSubcommand(parent: Command): void {
290
314
  // `--model` collector registered imperatively — see the note on `create`.
291
- subcommand(connections, "update")
315
+ subcommand(parent, "update")
292
316
  .option(
293
317
  "--model <id>",
294
- "Model id offered by this connection (repeatable; openai-compatible)",
318
+ "Model id offered by this provider (repeatable; openai-compatible)",
295
319
  collectRepeatable,
296
320
  [] as string[],
297
321
  )
@@ -300,14 +324,44 @@ function attachUpdateSubcommand(connections: Command): void {
300
324
  async (
301
325
  name: string,
302
326
  opts: {
303
- auth: string;
327
+ auth?: string;
304
328
  credential?: string;
305
329
  baseUrl?: string;
306
330
  model?: string[];
307
331
  json?: boolean;
308
332
  },
309
333
  ) => {
310
- const authInput = buildAuthInput(opts.auth, opts.credential);
334
+ // Resolve the auth to send: explicit --auth wins; a bare --credential
335
+ // rotates the key via derived api_key auth; with neither, re-send the
336
+ // stored auth verbatim so base-url/model-only updates work.
337
+ let authInput: Record<string, unknown> | string;
338
+ if (opts.auth) {
339
+ authInput = buildAuthInput(opts.auth, opts.credential);
340
+ } else {
341
+ const existing = await cliIpcCall<ProviderConnection>(
342
+ "inference_provider_connections_get",
343
+ { pathParams: { name } },
344
+ );
345
+ if (!existing.ok) {
346
+ writeCliError(existing.error ?? "Unknown error", opts.json);
347
+ return;
348
+ }
349
+ const storedAuth = existing.result!.auth;
350
+ if (opts.credential) {
351
+ // A bare --credential must never silently flip subscription auth
352
+ // to api_key — subscription tokens rotate via login-chatgpt.
353
+ if (storedAuth.type === "oauth_subscription") {
354
+ writeCliError(
355
+ `Provider "${name}" uses subscription auth, which --credential cannot rotate. Re-run: assistant inference providers login-chatgpt (or pass an explicit --auth to switch auth types)`,
356
+ opts.json,
357
+ );
358
+ return;
359
+ }
360
+ authInput = { type: "api_key", credential: opts.credential };
361
+ } else {
362
+ authInput = storedAuth as unknown as Record<string, unknown>;
363
+ }
364
+ }
311
365
  if (typeof authInput === "string") {
312
366
  writeCliError(authInput, opts.json);
313
367
  return;
@@ -334,8 +388,8 @@ function attachUpdateSubcommand(connections: Command): void {
334
388
  );
335
389
  } else {
336
390
  process.stdout.write(
337
- `Updated connection "${name}" auth to ${formatAuth(conn.auth)}\n` +
338
- `Verify it works: assistant inference send --profile <profile-using-this-connection> "Reply with OK"\n`,
391
+ `Updated provider "${name}" (auth=${formatAuth(conn.auth)})\n` +
392
+ `Verify it works: assistant inference send --profile <profile-using-this-provider> "Reply with OK"\n`,
339
393
  );
340
394
  }
341
395
  },
@@ -346,8 +400,8 @@ function attachUpdateSubcommand(connections: Command): void {
346
400
  // Subcommand: delete
347
401
  // ---------------------------------------------------------------------------
348
402
 
349
- function attachDeleteSubcommand(connections: Command): void {
350
- subcommand(connections, "delete").action(
403
+ function attachDeleteSubcommand(parent: Command): void {
404
+ subcommand(parent, "delete").action(
351
405
  async (name: string, opts: { json?: boolean }) => {
352
406
  const ipcResult = await cliIpcCall<{ ok: true }>(
353
407
  "inference_provider_connections_delete",
@@ -364,7 +418,7 @@ function attachDeleteSubcommand(connections: Command): void {
364
418
  if (opts.json) {
365
419
  process.stdout.write(JSON.stringify({ ok: true }) + "\n");
366
420
  } else {
367
- process.stdout.write(`Deleted connection "${name}"\n`);
421
+ process.stdout.write(`Removed provider "${name}"\n`);
368
422
  }
369
423
  },
370
424
  );
@@ -442,14 +496,14 @@ function attachLoginChatgptSubcommand(providers: Command): void {
442
496
  );
443
497
  }
444
498
 
445
- // Step 3: Create (or update) provider connection via IPC
499
+ // Step 3: Create (or update) the provider entry via IPC
446
500
  const connectionName = "chatgpt-subscription";
447
501
  const authInput = {
448
502
  type: "oauth_subscription",
449
503
  credential: "credential/chatgpt/access_token",
450
504
  };
451
505
 
452
- // Try to update first; if the connection doesn't exist, create it.
506
+ // Try to update first; if the entry doesn't exist, create it.
453
507
  const updateResult = await cliIpcCall<ProviderConnection>(
454
508
  "inference_provider_connections_update",
455
509
  {
@@ -459,7 +513,7 @@ function attachLoginChatgptSubcommand(providers: Command): void {
459
513
  );
460
514
 
461
515
  if (!updateResult.ok) {
462
- // Connection doesn't exist yet — create it
516
+ // Entry doesn't exist yet — create it
463
517
  const createResult = await cliIpcCall<ProviderConnection>(
464
518
  "inference_provider_connections_create",
465
519
  {
@@ -473,7 +527,7 @@ function attachLoginChatgptSubcommand(providers: Command): void {
473
527
 
474
528
  if (!createResult.ok) {
475
529
  writeCliError(
476
- createResult.error ?? "Failed to create provider connection",
530
+ createResult.error ?? "Failed to add the ChatGPT provider",
477
531
  opts.json,
478
532
  );
479
533
  return;
@@ -491,7 +545,7 @@ function attachLoginChatgptSubcommand(providers: Command): void {
491
545
  } else {
492
546
  process.stdout.write(
493
547
  `ChatGPT subscription auth configured successfully.\n` +
494
- `Connection "${connectionName}" is ready (provider=openai, auth=oauth_subscription).\n`,
548
+ `Provider "${connectionName}" is ready.\n`,
495
549
  );
496
550
  }
497
551
  } catch (err) {
@@ -506,15 +560,22 @@ function attachLoginChatgptSubcommand(providers: Command): void {
506
560
  // Registration
507
561
  // ---------------------------------------------------------------------------
508
562
 
563
+ /** Attach the five CRUD verbs to a parent (`providers` or its alias). */
564
+ function attachCrudVerbs(parent: Command): void {
565
+ attachListSubcommand(parent);
566
+ attachGetSubcommand(parent);
567
+ attachCreateSubcommand(parent);
568
+ attachUpdateSubcommand(parent);
569
+ attachDeleteSubcommand(parent);
570
+ }
571
+
509
572
  export function attachProvidersSubcommand(inference: Command): void {
510
573
  const providers = subcommand(inference, "providers");
511
- const connections = subcommand(providers, "connections");
574
+ attachCrudVerbs(providers);
512
575
 
513
- attachListSubcommand(connections);
514
- attachGetSubcommand(connections);
515
- attachCreateSubcommand(connections);
516
- attachUpdateSubcommand(connections);
517
- attachDeleteSubcommand(connections);
576
+ // Deprecated alias, kept for one release.
577
+ const connections = subcommand(providers, "connections");
578
+ attachCrudVerbs(connections);
518
579
 
519
580
  attachLoginChatgptSubcommand(providers);
520
581
  attachDefaultProviderSubcommand(providers);
@@ -90,7 +90,7 @@ export const inferenceHelp: CliCommandHelp = {
90
90
  description: "LLM inference operations",
91
91
  helpText: `
92
92
  The inference command group sends requests to your configured LLM provider.
93
- The provider is resolved from your assistant config (llm.default.provider).
93
+ The provider is resolved from your assistant config (llm.defaultProvider).
94
94
 
95
95
  Examples:
96
96
  $ assistant inference send "What is the capital of France?"
@@ -195,39 +195,116 @@ Examples:
195
195
  },
196
196
  {
197
197
  name: "providers",
198
- description: "Inference provider admin commands",
199
- subcommands: [
200
- {
201
- name: "connections",
202
- description:
203
- "Manage provider connections (auth configs for inference)",
204
- helpText: `
205
- Provider connections map a name to a (provider, auth) pair.
206
- Profiles reference connections via the 'provider_connection' field.
198
+ description: "Manage the model providers this assistant can use",
199
+ helpText: `
200
+ A provider entry names a model provider plus how to reach it. Auth is
201
+ derived from the provider: keyless providers (ollama) need none, the
202
+ Vellum entry routes through the platform's managed proxy, and everything
203
+ else uses an API key referenced by --credential.
207
204
 
208
- Canonical connections (seeded on every boot):
209
- anthropic-managed provider=anthropic, auth=platform
210
- openai-managed → provider=openai, auth=platform
211
- gemini-managed → provider=gemini, auth=platform
205
+ Canonical entry (seeded on every boot):
206
+ vellum → the platform-managed provider; cannot be deleted
212
207
 
213
208
  Examples:
214
- $ assistant inference providers connections list
215
- $ assistant inference providers connections get anthropic-managed
216
- $ assistant inference providers connections create anthropic-personal \\
217
- --provider anthropic --auth api_key --credential credential/anthropic/api_key
218
- $ assistant inference providers connections create local-llm \\
219
- --provider openai-compatible --auth none \\
209
+ $ assistant inference providers list
210
+ $ assistant inference providers get vellum
211
+ $ assistant inference providers create anthropic-personal \\
212
+ --provider anthropic --credential credential/anthropic/api_key
213
+ $ assistant inference providers create local-llm \\
214
+ --provider openai-compatible \\
220
215
  --base-url http://localhost:1234/v1 --model my-model
221
- $ assistant inference providers connections update anthropic-personal --auth platform
222
- $ assistant inference providers connections delete anthropic-personal
216
+ $ assistant inference providers update anthropic-personal \\
217
+ --credential credential/anthropic/api_key
218
+ $ assistant inference providers delete anthropic-personal
223
219
 
224
- After creating or updating a connection, validate it with a live call through
220
+ After creating or updating a provider, validate it with a live call through
225
221
  a profile that uses it:
226
222
  $ assistant inference send --profile <profile> "Reply with OK"`,
223
+ subcommands: [
224
+ {
225
+ name: "list",
226
+ description: "List configured providers",
227
+ options: [
228
+ { flags: "--provider <p>", description: "Filter by provider" },
229
+ { flags: "--json", description: "Output as JSON" },
230
+ ],
231
+ },
232
+ {
233
+ name: "get",
234
+ args: "<name>",
235
+ description: "Show a single provider entry",
236
+ options: [{ flags: "--json", description: "Output as JSON" }],
237
+ },
238
+ {
239
+ // NOTE: the repeatable `--model` collector option and the
240
+ // trailing `--json` are registered imperatively in
241
+ // `inference-providers.ts` (array-accumulating parser functions
242
+ // are not expressible as plain help data).
243
+ name: "create",
244
+ args: "<name>",
245
+ description: "Add a provider",
246
+ options: [
247
+ {
248
+ flags: "--provider <p>",
249
+ description: "Provider (anthropic|openai|gemini|ollama|...)",
250
+ required: true,
251
+ },
252
+ {
253
+ flags: "--credential <vault-key>",
254
+ description:
255
+ "Vault credential name (required for API-key providers)",
256
+ },
257
+ {
258
+ flags: "--auth <type>",
259
+ description:
260
+ "Override the derived auth: api_key|platform|none|oauth_subscription",
261
+ },
262
+ {
263
+ flags: "--base-url <url>",
264
+ description:
265
+ "Endpoint base URL (required for --provider openai-compatible)",
266
+ },
267
+ ],
268
+ },
269
+ {
270
+ // NOTE: `--model` + `--json` registered imperatively — see `create`.
271
+ name: "update",
272
+ args: "<name>",
273
+ description: "Update a provider entry",
274
+ options: [
275
+ {
276
+ flags: "--credential <vault-key>",
277
+ description:
278
+ "Rotate the API-key credential (derives api_key auth)",
279
+ },
280
+ {
281
+ flags: "--auth <type>",
282
+ description:
283
+ "Override the auth explicitly: api_key|platform|none|oauth_subscription",
284
+ },
285
+ {
286
+ flags: "--base-url <url>",
287
+ description: "Endpoint base URL (openai-compatible providers)",
288
+ },
289
+ ],
290
+ },
291
+ {
292
+ name: "delete",
293
+ args: "<name>",
294
+ description: "Remove a provider",
295
+ options: [{ flags: "--json", description: "Output as JSON" }],
296
+ },
297
+ {
298
+ name: "connections",
299
+ description:
300
+ "(Deprecated) use `assistant inference providers <verb>` instead",
301
+ helpText: `
302
+ Deprecated alias kept for one release: every verb here is the same as the
303
+ matching \`assistant inference providers <verb>\` command.`,
227
304
  subcommands: [
228
305
  {
229
306
  name: "list",
230
- description: "List all provider connections",
307
+ description: "(Deprecated) use `providers list`",
231
308
  options: [
232
309
  { flags: "--provider <p>", description: "Filter by provider" },
233
310
  { flags: "--json", description: "Output as JSON" },
@@ -236,17 +313,13 @@ a profile that uses it:
236
313
  {
237
314
  name: "get",
238
315
  args: "<name>",
239
- description: "Show a single provider connection",
316
+ description: "(Deprecated) use `providers get`",
240
317
  options: [{ flags: "--json", description: "Output as JSON" }],
241
318
  },
242
319
  {
243
- // NOTE: the repeatable `--model` collector option and the
244
- // trailing `--json` are registered imperatively in
245
- // `inference-providers.ts` (array-accumulating parser functions
246
- // are not expressible as plain help data).
247
320
  name: "create",
248
321
  args: "<name>",
249
- description: "Create a new provider connection",
322
+ description: "(Deprecated) use `providers create`",
250
323
  options: [
251
324
  {
252
325
  flags: "--provider <p>",
@@ -254,14 +327,14 @@ a profile that uses it:
254
327
  required: true,
255
328
  },
256
329
  {
257
- flags: "--auth <type>",
258
- description: "Auth type: api_key|platform|none",
259
- required: true,
330
+ flags: "--credential <vault-key>",
331
+ description:
332
+ "Vault credential name (required for API-key providers)",
260
333
  },
261
334
  {
262
- flags: "--credential <vault-key>",
335
+ flags: "--auth <type>",
263
336
  description:
264
- "Vault credential name (required for --auth api_key)",
337
+ "Override the derived auth: api_key|platform|none|oauth_subscription",
265
338
  },
266
339
  {
267
340
  flags: "--base-url <url>",
@@ -271,32 +344,31 @@ a profile that uses it:
271
344
  ],
272
345
  },
273
346
  {
274
- // NOTE: `--model` + `--json` registered imperatively — see `create`.
275
347
  name: "update",
276
348
  args: "<name>",
277
- description: "Update a connection's auth",
349
+ description: "(Deprecated) use `providers update`",
278
350
  options: [
279
351
  {
280
- flags: "--auth <type>",
281
- description: "Auth type: api_key|platform|none",
282
- required: true,
352
+ flags: "--credential <vault-key>",
353
+ description:
354
+ "Rotate the API-key credential (derives api_key auth)",
283
355
  },
284
356
  {
285
- flags: "--credential <vault-key>",
357
+ flags: "--auth <type>",
286
358
  description:
287
- "Vault credential name (required for --auth api_key)",
359
+ "Override the auth explicitly: api_key|platform|none|oauth_subscription",
288
360
  },
289
361
  {
290
362
  flags: "--base-url <url>",
291
363
  description:
292
- "Endpoint base URL (openai-compatible connections)",
364
+ "Endpoint base URL (openai-compatible providers)",
293
365
  },
294
366
  ],
295
367
  },
296
368
  {
297
369
  name: "delete",
298
370
  args: "<name>",
299
- description: "Delete a provider connection",
371
+ description: "(Deprecated) use `providers delete`",
300
372
  options: [{ flags: "--json", description: "Output as JSON" }],
301
373
  },
302
374
  ],
@@ -313,7 +385,7 @@ a profile that uses it:
313
385
  options: [
314
386
  {
315
387
  flags: "--connection <name>",
316
- description: "Pin a specific connection when setting",
388
+ description: "Pin a specific provider entry when setting",
317
389
  },
318
390
  {
319
391
  flags: "--json",
@@ -473,7 +545,7 @@ export const llmHelp: CliCommandHelp = {
473
545
  helpText: `
474
546
  The llm command group is a shorthand for 'assistant inference send'. It sends
475
547
  requests to your configured LLM provider, resolved from your assistant config
476
- (llm.default.provider). For profile session management, use 'assistant inference session'.
548
+ (llm.defaultProvider). For profile session management, use 'assistant inference session'.
477
549
 
478
550
  Examples:
479
551
  $ assistant llm send "What is the capital of France?"