@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
package/openapi.yaml CHANGED
@@ -3,7 +3,7 @@
3
3
  openapi: 3.0.0
4
4
  info:
5
5
  title: Vellum Assistant API
6
- version: 0.8.1
6
+ version: 0.8.2
7
7
  description: Auto-generated OpenAPI specification for the Vellum Assistant runtime HTTP server.
8
8
  servers:
9
9
  - url: http://127.0.0.1:7821
@@ -3075,6 +3075,70 @@ paths:
3075
3075
  schema:
3076
3076
  type: string
3077
3077
  description: Optional channel ID filter
3078
+ /v1/channels/available:
3079
+ get:
3080
+ operationId: channels_available_get
3081
+ summary: Get available channels
3082
+ description:
3083
+ Return the channels this assistant can surface to clients, with display metadata (label, icon, verification
3084
+ capability, setup copy). Today this is a fixed base list plus `email` when an inbox is registered; will become
3085
+ plugin/skill-driven in future.
3086
+ tags:
3087
+ - channels
3088
+ responses:
3089
+ "200":
3090
+ description: Successful response
3091
+ content:
3092
+ application/json:
3093
+ schema:
3094
+ type: object
3095
+ properties:
3096
+ channels:
3097
+ type: array
3098
+ items:
3099
+ type: object
3100
+ properties:
3101
+ id:
3102
+ type: string
3103
+ enum:
3104
+ - telegram
3105
+ - phone
3106
+ - vellum
3107
+ - whatsapp
3108
+ - slack
3109
+ - email
3110
+ - platform
3111
+ label:
3112
+ type: string
3113
+ subtitle:
3114
+ type: string
3115
+ icon:
3116
+ type: string
3117
+ supportsVerification:
3118
+ type: boolean
3119
+ setupMessages:
3120
+ type: object
3121
+ properties:
3122
+ guardian:
3123
+ type: string
3124
+ contact:
3125
+ type: string
3126
+ required:
3127
+ - guardian
3128
+ - contact
3129
+ additionalProperties: false
3130
+ required:
3131
+ - id
3132
+ - label
3133
+ - subtitle
3134
+ - icon
3135
+ - supportsVerification
3136
+ - setupMessages
3137
+ additionalProperties: false
3138
+ description: Available channels in display order
3139
+ required:
3140
+ - channels
3141
+ additionalProperties: false
3078
3142
  /v1/channels/conversation:
3079
3143
  delete:
3080
3144
  operationId: channels_conversation_delete
@@ -4696,7 +4760,7 @@ paths:
4696
4760
  post:
4697
4761
  operationId: conversations_cli_create_post
4698
4762
  summary: Create a conversation (CLI)
4699
- description: Create a new conversation with an optional title.
4763
+ description: Create a new conversation with an optional title and seeded messages.
4700
4764
  tags:
4701
4765
  - conversations
4702
4766
  responses:
@@ -4711,9 +4775,17 @@ paths:
4711
4775
  type: string
4712
4776
  title:
4713
4777
  type: string
4778
+ conversationKey:
4779
+ type: string
4780
+ messagesInserted:
4781
+ type: integer
4782
+ minimum: 0
4783
+ maximum: 9007199254740991
4714
4784
  required:
4715
4785
  - id
4716
4786
  - title
4787
+ - conversationKey
4788
+ - messagesInserted
4717
4789
  additionalProperties: false
4718
4790
  requestBody:
4719
4791
  required: true
@@ -4724,6 +4796,22 @@ paths:
4724
4796
  properties:
4725
4797
  title:
4726
4798
  type: string
4799
+ messages:
4800
+ type: array
4801
+ items:
4802
+ type: object
4803
+ properties:
4804
+ role:
4805
+ type: string
4806
+ enum:
4807
+ - user
4808
+ - assistant
4809
+ content:
4810
+ type: string
4811
+ required:
4812
+ - role
4813
+ - content
4814
+ additionalProperties: false
4727
4815
  additionalProperties: false
4728
4816
  /v1/conversations/cli/export:
4729
4817
  post:
@@ -7773,6 +7861,19 @@ paths:
7773
7861
  required:
7774
7862
  - kind
7775
7863
  additionalProperties: false
7864
+ category:
7865
+ type: string
7866
+ enum:
7867
+ - security
7868
+ - scheduling
7869
+ - background
7870
+ - email
7871
+ - system
7872
+ metadata:
7873
+ type: object
7874
+ propertyNames:
7875
+ type: string
7876
+ additionalProperties: {}
7776
7877
  createdAt:
7777
7878
  type: string
7778
7879
  required:
@@ -7922,6 +8023,19 @@ paths:
7922
8023
  required:
7923
8024
  - kind
7924
8025
  additionalProperties: false
8026
+ category:
8027
+ type: string
8028
+ enum:
8029
+ - security
8030
+ - scheduling
8031
+ - background
8032
+ - email
8033
+ - system
8034
+ metadata:
8035
+ type: object
8036
+ propertyNames:
8037
+ type: string
8038
+ additionalProperties: {}
7925
8039
  createdAt:
7926
8040
  type: string
7927
8041
  required:
@@ -8628,6 +8742,9 @@ paths:
8628
8742
  - ollama
8629
8743
  - fireworks
8630
8744
  - openrouter
8745
+ - zai
8746
+ - deepseek
8747
+ - minimax
8631
8748
  auth:
8632
8749
  oneOf:
8633
8750
  - type: object
@@ -8721,7 +8838,9 @@ paths:
8721
8838
  required: false
8722
8839
  schema:
8723
8840
  type: string
8724
- description: "Filter by provider. One of: anthropic, openai, gemini, ollama, fireworks, openrouter"
8841
+ description:
8842
+ "Filter by provider. One of: anthropic, openai, gemini, ollama, fireworks, openrouter, zai, deepseek,
8843
+ minimax"
8725
8844
  post:
8726
8845
  operationId: inference_providerconnections_post
8727
8846
  summary: Create a provider connection
@@ -8748,6 +8867,9 @@ paths:
8748
8867
  - ollama
8749
8868
  - fireworks
8750
8869
  - openrouter
8870
+ - zai
8871
+ - deepseek
8872
+ - minimax
8751
8873
  auth:
8752
8874
  oneOf:
8753
8875
  - type: object
@@ -8855,6 +8977,9 @@ paths:
8855
8977
  - ollama
8856
8978
  - fireworks
8857
8979
  - openrouter
8980
+ - zai
8981
+ - deepseek
8982
+ - minimax
8858
8983
  auth:
8859
8984
  oneOf:
8860
8985
  - type: object
@@ -8984,6 +9109,9 @@ paths:
8984
9109
  - ollama
8985
9110
  - fireworks
8986
9111
  - openrouter
9112
+ - zai
9113
+ - deepseek
9114
+ - minimax
8987
9115
  auth:
8988
9116
  oneOf:
8989
9117
  - type: object
@@ -9105,6 +9233,9 @@ paths:
9105
9233
  - ollama
9106
9234
  - fireworks
9107
9235
  - openrouter
9236
+ - zai
9237
+ - deepseek
9238
+ - minimax
9108
9239
  auth:
9109
9240
  oneOf:
9110
9241
  - type: object
@@ -10920,6 +11051,7 @@ paths:
10920
11051
  - low
10921
11052
  - medium
10922
11053
  - high
11054
+ - critical
10923
11055
  deadlineAt:
10924
11056
  type: number
10925
11057
  isAsyncBackground:
@@ -11128,6 +11260,26 @@ paths:
11128
11260
  responses:
11129
11261
  "200":
11130
11262
  description: Successful response
11263
+ /v1/oauth/connection-changed:
11264
+ post:
11265
+ operationId: oauth_connectionchanged_post
11266
+ summary: Notify the assistant that an OAuth connection changed
11267
+ description: Invalidates the config cache so the assistant picks up mode and credential changes immediately.
11268
+ tags:
11269
+ - oauth
11270
+ responses:
11271
+ "200":
11272
+ description: Successful response
11273
+ content:
11274
+ application/json:
11275
+ schema:
11276
+ type: object
11277
+ properties:
11278
+ refreshed:
11279
+ type: boolean
11280
+ required:
11281
+ - refreshed
11282
+ additionalProperties: false
11131
11283
  /v1/oauth/connections/{id}:
11132
11284
  delete:
11133
11285
  operationId: oauth_connections_by_id_delete
@@ -11761,6 +11913,129 @@ paths:
11761
11913
  - name
11762
11914
  - status
11763
11915
  additionalProperties: false
11916
+ /v1/question-response:
11917
+ post:
11918
+ operationId: questionresponse_post
11919
+ summary: Resolve a pending ask-question prompt
11920
+ description:
11921
+ Submit the user's batched response (or close the card) for a pending question prompt by requestId. Legacy
11922
+ single-question payloads remain accepted as syntactic sugar for a one-element batch.
11923
+ tags:
11924
+ - approvals
11925
+ responses:
11926
+ "200":
11927
+ description: Successful response
11928
+ content:
11929
+ application/json:
11930
+ schema:
11931
+ type: object
11932
+ properties:
11933
+ success:
11934
+ type: boolean
11935
+ required:
11936
+ - success
11937
+ additionalProperties: false
11938
+ requestBody:
11939
+ required: true
11940
+ content:
11941
+ application/json:
11942
+ schema:
11943
+ oneOf:
11944
+ - type: object
11945
+ properties:
11946
+ requestId:
11947
+ type: string
11948
+ kind:
11949
+ type: string
11950
+ const: submit
11951
+ responses:
11952
+ minItems: 1
11953
+ type: array
11954
+ items:
11955
+ oneOf:
11956
+ - type: object
11957
+ properties:
11958
+ questionId:
11959
+ type: string
11960
+ kind:
11961
+ type: string
11962
+ const: option
11963
+ optionId:
11964
+ type: string
11965
+ required:
11966
+ - questionId
11967
+ - kind
11968
+ - optionId
11969
+ additionalProperties: false
11970
+ - type: object
11971
+ properties:
11972
+ questionId:
11973
+ type: string
11974
+ kind:
11975
+ type: string
11976
+ const: free_text
11977
+ text:
11978
+ type: string
11979
+ required:
11980
+ - questionId
11981
+ - kind
11982
+ - text
11983
+ additionalProperties: false
11984
+ - type: object
11985
+ properties:
11986
+ questionId:
11987
+ type: string
11988
+ kind:
11989
+ type: string
11990
+ const: skip
11991
+ required:
11992
+ - questionId
11993
+ - kind
11994
+ additionalProperties: false
11995
+ required:
11996
+ - requestId
11997
+ - kind
11998
+ - responses
11999
+ additionalProperties: false
12000
+ - type: object
12001
+ properties:
12002
+ requestId:
12003
+ type: string
12004
+ kind:
12005
+ type: string
12006
+ const: close
12007
+ required:
12008
+ - requestId
12009
+ - kind
12010
+ additionalProperties: false
12011
+ - type: object
12012
+ properties:
12013
+ requestId:
12014
+ type: string
12015
+ kind:
12016
+ type: string
12017
+ const: option
12018
+ optionId:
12019
+ type: string
12020
+ required:
12021
+ - requestId
12022
+ - kind
12023
+ - optionId
12024
+ additionalProperties: false
12025
+ - type: object
12026
+ properties:
12027
+ requestId:
12028
+ type: string
12029
+ kind:
12030
+ type: string
12031
+ const: free_text
12032
+ text:
12033
+ type: string
12034
+ required:
12035
+ - requestId
12036
+ - kind
12037
+ - text
12038
+ additionalProperties: false
11764
12039
  /v1/recordings/pause:
11765
12040
  post:
11766
12041
  operationId: recordings_pause_post
@@ -14117,6 +14392,20 @@ paths:
14117
14392
  type: string
14118
14393
  objective:
14119
14394
  type: string
14395
+ usage:
14396
+ type: object
14397
+ properties:
14398
+ inputTokens:
14399
+ type: number
14400
+ outputTokens:
14401
+ type: number
14402
+ estimatedCost:
14403
+ type: number
14404
+ required:
14405
+ - inputTokens
14406
+ - outputTokens
14407
+ - estimatedCost
14408
+ additionalProperties: false
14120
14409
  events:
14121
14410
  type: array
14122
14411
  items: {}
@@ -14752,6 +15041,39 @@ paths:
14752
15041
  type: string
14753
15042
  minLength: 1
14754
15043
  additionalProperties: false
15044
+ /v1/telemetry/flush:
15045
+ post:
15046
+ operationId: telemetry_flush_post
15047
+ summary: Flush pending telemetry events
15048
+ description: Force-flush all pending usage, turn, and lifecycle telemetry events to the platform.
15049
+ tags:
15050
+ - telemetry
15051
+ responses:
15052
+ "200":
15053
+ description: Successful response
15054
+ content:
15055
+ application/json:
15056
+ schema:
15057
+ anyOf:
15058
+ - type: object
15059
+ properties:
15060
+ flushed:
15061
+ type: boolean
15062
+ const: true
15063
+ required:
15064
+ - flushed
15065
+ additionalProperties: false
15066
+ - type: object
15067
+ properties:
15068
+ flushed:
15069
+ type: boolean
15070
+ const: false
15071
+ reason:
15072
+ type: string
15073
+ required:
15074
+ - flushed
15075
+ - reason
15076
+ additionalProperties: false
14755
15077
  /v1/telemetry/lifecycle:
14756
15078
  post:
14757
15079
  operationId: telemetry_lifecycle_post
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/assistant",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -62,6 +62,7 @@
62
62
  "openai": "6.29.0",
63
63
  "pino": "9.14.0",
64
64
  "pino-pretty": "13.1.3",
65
+ "semver": "7.8.0",
65
66
  "playwright": "1.58.2",
66
67
  "postgres": "3.4.8",
67
68
  "rrule": "2.8.1",
@@ -94,6 +95,7 @@
94
95
  "@types/archiver": "7.0.0",
95
96
  "@types/bun": "1.3.10",
96
97
  "@types/node": "25.5.0",
98
+ "@types/semver": "7.5.8",
97
99
  "@types/uuid": "10.0.0",
98
100
  "drizzle-kit": "0.30.6",
99
101
  "eslint": "10.0.3",
@@ -183,14 +183,26 @@ function toJSONSchemaObject(
183
183
  async function collectRoutesFromModules(): Promise<RouteEntry[]> {
184
184
  const routes: RouteEntry[] = [];
185
185
 
186
- const files = (await readdir(ROUTES_DIR, { recursive: true })).filter(
187
- (f) =>
188
- typeof f === "string" &&
189
- f.endsWith(".ts") &&
190
- !f.endsWith(".test.ts") &&
191
- !f.endsWith(".benchmark.test.ts") &&
192
- !f.includes("node_modules"),
193
- );
186
+ // Skip the `index.ts` barrel: it re-exports every other route module's
187
+ // ROUTES into a single combined array, so importing it would double-count
188
+ // every entry. The duplicate `method:endpoint` keys are deduped later by
189
+ // first-seen, but the surviving entry's `sourceModule` (used to derive
190
+ // OpenAPI `tags`) depends on `readdir` order — which is filesystem
191
+ // dependent and diverges between local sandbox and the CI runner, making
192
+ // the generator non-reproducible. Sort the file list as well so directory
193
+ // entry order can never affect the output.
194
+ const files = (await readdir(ROUTES_DIR, { recursive: true }))
195
+ .filter(
196
+ (f) =>
197
+ typeof f === "string" &&
198
+ f.endsWith(".ts") &&
199
+ !f.endsWith(".test.ts") &&
200
+ !f.endsWith(".benchmark.test.ts") &&
201
+ !f.includes("node_modules") &&
202
+ f !== "index.ts" &&
203
+ !f.endsWith("/index.ts"),
204
+ )
205
+ .sort();
194
206
 
195
207
  for (const file of files) {
196
208
  const filePath = join(ROUTES_DIR, file);
@@ -204,8 +216,20 @@ async function collectRoutesFromModules(): Promise<RouteEntry[]> {
204
216
  continue;
205
217
  }
206
218
 
207
- if ("ROUTES" in mod && Array.isArray(mod.ROUTES)) {
208
- for (const raw of mod.ROUTES) {
219
+ // Collect every export whose name is `ROUTES` or ends in `_ROUTES`.
220
+ // A handful of route files (e.g. `channel-route-definitions.ts`,
221
+ // `contact-prompt-routes.ts`) export under domain-prefixed names like
222
+ // `CHANNEL_ROUTES` and `CONTACT_PROMPT_ROUTES` rather than the
223
+ // canonical `ROUTES`. Without this fan-out the only way those routes
224
+ // reached the spec was via the `index.ts` barrel — which is excluded
225
+ // above for reproducibility.
226
+ const exportNames = Object.keys(mod)
227
+ .filter((k) => k === "ROUTES" || k.endsWith("_ROUTES"))
228
+ .sort();
229
+ for (const name of exportNames) {
230
+ const arr = mod[name];
231
+ if (!Array.isArray(arr)) continue;
232
+ for (const raw of arr) {
209
233
  const result = RouteEntrySchema.safeParse({
210
234
  ...(typeof raw === "object" && raw !== null ? raw : {}),
211
235
  sourceModule: file,
@@ -545,6 +569,55 @@ async function main() {
545
569
  }
546
570
  if (existing !== yamlOutput) {
547
571
  console.error("openapi.yaml is stale. Run: bun run generate:openapi");
572
+ // Emit the first byte-level divergence and a windowed diff around it
573
+ // so CI logs are actionable without a follow-up local repro.
574
+ const maxLen = Math.max(existing.length, yamlOutput.length);
575
+ let firstDiff = -1;
576
+ for (let i = 0; i < maxLen; i++) {
577
+ if (existing[i] !== yamlOutput[i]) {
578
+ firstDiff = i;
579
+ break;
580
+ }
581
+ }
582
+ if (firstDiff >= 0) {
583
+ const lineNo = (existing.slice(0, firstDiff).match(/\n/g) ?? []).length + 1;
584
+ const winStart = Math.max(0, firstDiff - 120);
585
+ const winEnd = Math.min(maxLen, firstDiff + 120);
586
+ console.error(`First divergence at byte ${firstDiff} (~line ${lineNo}):`);
587
+ console.error(` existing[${winStart}..${winEnd}]:`);
588
+ console.error(` ${JSON.stringify(existing.slice(winStart, winEnd))}`);
589
+ console.error(` generated[${winStart}..${winEnd}]:`);
590
+ console.error(` ${JSON.stringify(yamlOutput.slice(winStart, winEnd))}`);
591
+ }
592
+ // Also flag which path operations are present in one but not the other —
593
+ // the common failure mode is a missing or duplicated route entry, and
594
+ // the path keys are the actionable thing for the human reading the log.
595
+ const pathsRe = /^\s\s(\/\S+):/gm;
596
+ const existingPaths = new Set(
597
+ Array.from(existing.matchAll(pathsRe), (m) => m[1]),
598
+ );
599
+ const generatedPaths = new Set(
600
+ Array.from(yamlOutput.matchAll(pathsRe), (m) => m[1]),
601
+ );
602
+ const inExistingOnly = [...existingPaths].filter(
603
+ (p) => !generatedPaths.has(p),
604
+ );
605
+ const inGeneratedOnly = [...generatedPaths].filter(
606
+ (p) => !existingPaths.has(p),
607
+ );
608
+ if (inExistingOnly.length || inGeneratedOnly.length) {
609
+ console.error(
610
+ `Path set drift: existing has ${existingPaths.size} paths, generated has ${generatedPaths.size}`,
611
+ );
612
+ if (inGeneratedOnly.length) {
613
+ console.error(` Only in generated (missing from committed yaml):`);
614
+ for (const p of inGeneratedOnly.slice(0, 20)) console.error(` + ${p}`);
615
+ }
616
+ if (inExistingOnly.length) {
617
+ console.error(` Only in existing (stale entries in committed yaml):`);
618
+ for (const p of inExistingOnly.slice(0, 20)) console.error(` - ${p}`);
619
+ }
620
+ }
548
621
  process.exit(1);
549
622
  }
550
623
  console.log("openapi.yaml is up to date.");
@@ -97,8 +97,8 @@ function projectProvider(entry: ProviderCatalogEntry): Record<string, unknown> {
97
97
  projected.apiKeyPlaceholder = entry.apiKeyPlaceholder;
98
98
  if (entry.credentialsGuide !== undefined)
99
99
  projected.credentialsGuide = entry.credentialsGuide;
100
- if (entry.supportsManagedAuth !== undefined)
101
- projected.supportsManagedAuth = entry.supportsManagedAuth;
100
+ if (entry.supportsPlatformAuth !== undefined)
101
+ projected.supportsPlatformAuth = entry.supportsPlatformAuth;
102
102
  projected.defaultModel = entry.defaultModel;
103
103
  projected.models = entry.models.map(projectModel);
104
104
  // NOTE: `apiKeyUrl` intentionally omitted — clients use