@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
@@ -15,20 +15,22 @@
15
15
  "description": "Proactive chief-of-staff: a morning digest, propose-then-confirm inbox triage, calendar prep, and a weekly competitor brief.",
16
16
  "category": "productivity",
17
17
  "homepage": "https://github.com/vellum-ai/admin-copilot",
18
- "license": "MIT"
18
+ "license": "MIT",
19
+ "icon": "🧑‍💼"
19
20
  },
20
21
  {
21
22
  "name": "agent-wrapped",
22
23
  "source": {
23
24
  "source": "github",
24
25
  "repo": "vellum-ai/agent-wrapped",
25
- "ref": "1bfa2b9c0735662e4c493955a414b6b62136a380"
26
+ "ref": "7e5e7971a38a90120cee9b1e393b733622e24d17"
26
27
  },
27
- "description": "Your agent's year in review: conversations, days together, memories formed, swear count, top topics, and the receipt (total tokens + LLM calls). Works with Vellum agents and Claude Code. Ships a stats collector tool, a CLI, a Claude Code plugin, and a skill for the shareable cards experience.",
28
+ "description": "Your agent's year in review: conversations, days together, memories formed, swear count, top topics, and the receipt (total tokens + LLM calls). Works with Vellum agents and Claude Code. Presents the stats as data in chat and publishes a shareable page at agent-wrapped.com.",
28
29
  "category": "creative",
29
30
  "license": "MIT",
30
31
  "submittedBy": "marina",
31
- "homepage": "https://agent-wrapped.com"
32
+ "homepage": "https://agent-wrapped.com",
33
+ "icon": "🎁"
32
34
  },
33
35
  {
34
36
  "name": "ai-hero-engineer-kit",
@@ -37,10 +39,11 @@
37
39
  "repo": "marinatrajk/ai-hero-engineer-kit",
38
40
  "ref": "18d33c62b15a3e2cc22dc070723fe3077749dcec"
39
41
  },
40
- "description": "Five engineering skills adapted from Matt Pocock's '5 Agent Skills I Use Every Day' \u2014 plans, PRDs, vertical-slice issues, TDD loop, and codebase deepening in one install.",
42
+ "description": "Five engineering skills adapted from Matt Pocock's '5 Agent Skills I Use Every Day' plans, PRDs, vertical-slice issues, TDD loop, and codebase deepening in one install.",
41
43
  "category": "developer",
42
44
  "homepage": "https://github.com/marinatrajk/ai-hero-engineer-kit",
43
- "license": "MIT"
45
+ "license": "MIT",
46
+ "icon": "🧰"
44
47
  },
45
48
  {
46
49
  "name": "amex-perk-reminder",
@@ -52,7 +55,8 @@
52
55
  "description": "Track every credit on the Amex cards you hold (Platinum, Gold, Business Platinum, Delta Gold/Platinum/Reserve) with status-aware reminders before any window closes.",
53
56
  "category": "lifestyle",
54
57
  "homepage": "https://github.com/AnitaKirkovska/amex-perk-reminder",
55
- "license": "MIT"
58
+ "license": "MIT",
59
+ "icon": "💳"
56
60
  },
57
61
  {
58
62
  "name": "astrology-horoscope",
@@ -64,7 +68,8 @@
64
68
  "description": "Western tropical natal chart and transit computation. Local ephemeris (astronomy-engine, no API keys) for planet positions, ascendant/midheaven, whole-sign houses, and aspects, plus a natal-reading skill that interprets the raw chart into a readable report.",
65
69
  "category": "hobby",
66
70
  "homepage": "https://github.com/vellum-ai/astrology-horoscope",
67
- "license": "MIT"
71
+ "license": "MIT",
72
+ "icon": "🔮"
68
73
  },
69
74
  {
70
75
  "name": "caveman",
@@ -77,7 +82,7 @@
77
82
  "category": "productivity",
78
83
  "homepage": "https://github.com/JuliusBrussee/caveman",
79
84
  "license": "MIT",
80
- "icon": "\ud83e\uddb4"
85
+ "icon": "🦴"
81
86
  },
82
87
  {
83
88
  "name": "coffee-aficionado",
@@ -89,8 +94,7 @@
89
94
  "description": "Find great coffee beans and machines matched to your taste profile, budget, and kitchen. Persistent memory learns your preferences over time.",
90
95
  "category": "lifestyle",
91
96
  "homepage": "https://github.com/vellum-ai/coffee-aficionado",
92
- "license": "MIT",
93
- "icon": "\u2615"
97
+ "license": "MIT"
94
98
  },
95
99
  {
96
100
  "name": "cofounder",
@@ -102,7 +106,8 @@
102
106
  "description": "AI co-founder that remembers your company context, challenges your thinking, and tracks your decisions.",
103
107
  "category": "productivity",
104
108
  "homepage": "https://github.com/vellum-ai/cofounder",
105
- "license": "MIT"
109
+ "license": "MIT",
110
+ "icon": "🤝"
106
111
  },
107
112
  {
108
113
  "name": "cognee",
@@ -114,7 +119,22 @@
114
119
  },
115
120
  "description": "Cognee knowledge graph memory for Vellum Assistant: session-aware storage, auto-routing recall, and persistent learning across sessions. Supports local mode and Cognee Cloud.",
116
121
  "category": "memory",
117
- "homepage": "https://github.com/topoteretes/cognee-integrations/tree/main/integrations/vellum-assistant"
122
+ "homepage": "https://github.com/topoteretes/cognee-integrations/tree/main/integrations/vellum-assistant",
123
+ "icon": "🕸️"
124
+ },
125
+ {
126
+ "name": "creatorland",
127
+ "source": {
128
+ "source": "github",
129
+ "repo": "creatorland/creatorland-mcp-skills",
130
+ "path": "plugins/creatorland-data",
131
+ "ref": "9cdbb1553645bbb746918f43d60e0df17ae91fa0"
132
+ },
133
+ "description": "Creatorland Data MCP and companion skill catalog: brief-to-shortlist, transcript-to-shortlist, brief builder, fair-price negotiation, one-number rate cards, and a guided onboarding tour for creator marketing workflows.",
134
+ "category": "marketing",
135
+ "homepage": "https://github.com/creatorland/creatorland-mcp-skills/tree/main/plugins/creatorland-data",
136
+ "license": "MIT",
137
+ "icon": "🎨"
118
138
  },
119
139
  {
120
140
  "name": "dynamic-notch",
@@ -126,7 +146,8 @@
126
146
  "description": "Put your Vellum assistant inside your MacBook's notch: click to chat, hold Ctrl+Option to talk, and get a floating task bulb while it works, with live-streamed replies and per-sentence voice.",
127
147
  "category": "interface",
128
148
  "homepage": "https://github.com/AnitaKirkovska/dynamic-notch",
129
- "license": "MIT"
149
+ "license": "MIT",
150
+ "icon": "💻"
130
151
  },
131
152
  {
132
153
  "name": "family-briefing",
@@ -138,7 +159,8 @@
138
159
  "description": "Daily morning briefing for parents: merges family calendars, triages school emails, and detects scheduling conflicts.",
139
160
  "category": "productivity",
140
161
  "homepage": "https://github.com/AnitaKirkovska/family-briefing",
141
- "license": "MIT"
162
+ "license": "MIT",
163
+ "icon": "👨‍👩‍👧‍👦"
142
164
  },
143
165
  {
144
166
  "name": "fitness-companion",
@@ -150,7 +172,8 @@
150
172
  "description": "Fitness and nutrition companion. Logs meals, workouts, and weight; looks up nutrition data from OpenFoodFacts; calculates macro targets; and injects daily fitness context into every conversation.",
151
173
  "category": "health",
152
174
  "homepage": "https://github.com/vellum-ai/fitness-companion",
153
- "license": "MIT"
175
+ "license": "MIT",
176
+ "icon": "💪"
154
177
  },
155
178
  {
156
179
  "name": "git-workflow",
@@ -162,7 +185,8 @@
162
185
  "description": "Git workflow tools and multi-perspective code review: branch management, push, stash, PR creation/review/merge/checkout, diffs, logs, changelog generation, and parallel subagent code review with confidence scoring.",
163
186
  "category": "developer",
164
187
  "homepage": "https://github.com/vellum-ai/git-workflow",
165
- "license": "MIT"
188
+ "license": "MIT",
189
+ "icon": "🔀"
166
190
  },
167
191
  {
168
192
  "name": "google-drive-search",
@@ -174,7 +198,8 @@
174
198
  "description": "Local full-text search across your Google Drive. Indexes file metadata and document content into SQLite FTS5 for instant, private search.",
175
199
  "category": "productivity",
176
200
  "homepage": "https://github.com/ZeebBoyBlue/google-drive-search",
177
- "license": "Apache-2.0"
201
+ "license": "Apache-2.0",
202
+ "icon": "🔍"
178
203
  },
179
204
  {
180
205
  "name": "influencer-marketing",
@@ -186,7 +211,8 @@
186
211
  "description": "Find and research influencers on Instagram, TikTok, and X/Twitter. Includes a strategy builder that walks from campaign brief to research criteria, a research skill that discovers real profiles via browser automation, scores candidates, and exports ranked shortlists, and a dashboard skill that turns the shortlist into an interactive outreach tracker.",
187
212
  "category": "marketing",
188
213
  "homepage": "https://github.com/ZeebBoyBlue/influencer",
189
- "license": "MIT"
214
+ "license": "MIT",
215
+ "icon": "📣"
190
216
  },
191
217
  {
192
218
  "name": "kitchen-companion",
@@ -198,7 +224,8 @@
198
224
  "description": "Full kitchen companion. Scan your fridge with a photo to stock a pantry inventory and get 3 makeable-now recipes, get alerts before food expires, clip recipes from any URL into a clean format, and generate meal plans with grocery lists from what you actually have.",
199
225
  "category": "lifestyle",
200
226
  "homepage": "https://github.com/vellum-ai/kitchen-companion",
201
- "license": "MIT"
227
+ "license": "MIT",
228
+ "icon": "🍳"
202
229
  },
203
230
  {
204
231
  "name": "level-up",
@@ -210,7 +237,8 @@
210
237
  "description": "Surfaces a first-class \"Level Up\" diff card whenever the assistant edits its own skills or plugins, so you can see how it improved itself after the fact.",
211
238
  "category": "developer",
212
239
  "homepage": "https://github.com/vellum-ai/level-up",
213
- "license": "MIT"
240
+ "license": "MIT",
241
+ "icon": "🆙"
214
242
  },
215
243
  {
216
244
  "name": "marketing-expert",
@@ -222,7 +250,8 @@
222
250
  "description": "Acts as a full-stack marketing expert for any business (B2B or B2C): an on-demand persona plus playbook skills (positioning, demand planning, launches, content & copywriting, brand voice, email sequences, SEO & GEO, competitive teardown, board reporting) and deterministic funnel/positioning/GTM/competitive tools.",
223
251
  "category": "marketing",
224
252
  "homepage": "https://github.com/vellum-ai/marketing-expert",
225
- "license": "MIT"
253
+ "license": "MIT",
254
+ "icon": "📈"
226
255
  },
227
256
  {
228
257
  "name": "model-router",
@@ -234,7 +263,8 @@
234
263
  "description": "Routes each user-facing message to one of your workspace's inference profiles, so model selection can vary per call instead of staying pinned to a single profile.",
235
264
  "category": "productivity",
236
265
  "homepage": "https://github.com/AnitaKirkovska/model-router",
237
- "license": "MIT"
266
+ "license": "MIT",
267
+ "icon": "🚦"
238
268
  },
239
269
  {
240
270
  "name": "motion-design",
@@ -246,7 +276,8 @@
246
276
  "description": "Teaches the assistant to build polished UI animations with Motion (motion.dev) for React: animated product mockups, chat replays, typing effects, and staggered reveals, with a complete animated chat example included.",
247
277
  "category": "creative",
248
278
  "homepage": "https://github.com/vellum-ai/motion-design",
249
- "license": "MIT"
279
+ "license": "MIT",
280
+ "icon": "🎬"
250
281
  },
251
282
  {
252
283
  "name": "originkit",
@@ -258,7 +289,8 @@
258
289
  "description": "Browse and import animated UI components from Originkit, a free library of 50 animated components. Browse by category or search term without an API key; fetch component source code (React, Next.js, Vite, Framer) with a free key from originkit.dev.",
259
290
  "category": "productivity",
260
291
  "homepage": "https://github.com/vellum-ai/originkit",
261
- "license": "MIT"
292
+ "license": "MIT",
293
+ "icon": "🧱"
262
294
  },
263
295
  {
264
296
  "name": "personal-finance",
@@ -270,7 +302,8 @@
270
302
  "description": "Track expenses, income, recurring bills, and savings funds from your assistant. Multi-currency, receipt OCR, Plaid bank sync, and financial summaries. All data stored locally in SQLite.",
271
303
  "category": "productivity",
272
304
  "homepage": "https://github.com/AnitaKirkovska/personal-finance",
273
- "license": "MIT"
305
+ "license": "MIT",
306
+ "icon": "💰"
274
307
  },
275
308
  {
276
309
  "name": "plant-doctor",
@@ -282,7 +315,8 @@
282
315
  "description": "Diagnose plants from photos. Identifies the species, assesses health with visible evidence, and returns a care plan. Named plants get a persistent checkup history so you can track whether they are improving.",
283
316
  "category": "lifestyle",
284
317
  "homepage": "https://github.com/vellum-ai/plant-doctor",
285
- "license": "MIT"
318
+ "license": "MIT",
319
+ "icon": "🪴"
286
320
  },
287
321
  {
288
322
  "name": "polyglot",
@@ -294,7 +328,8 @@
294
328
  "description": "Ambient language acquisition through your assistant. Three graduated modes (practice, ambient, immersive) weave a target language into your real conversations, with SM-2 spaced repetition, error-pattern tracking, and CEFR level history.",
295
329
  "category": "education",
296
330
  "homepage": "https://github.com/vellum-ai/polyglot",
297
- "license": "MIT"
331
+ "license": "MIT",
332
+ "icon": "🗣️"
298
333
  },
299
334
  {
300
335
  "name": "proactive-slacks",
@@ -306,7 +341,8 @@
306
341
  "description": "Let your assistant reach you on Slack on purpose. Route notifications by topic to the right channel at the right volume, with heartbeat-based change detection so it only pings when something actually changed.",
307
342
  "category": "productivity",
308
343
  "homepage": "https://github.com/AnitaKirkovska/proactive-slacks",
309
- "license": "MIT"
344
+ "license": "MIT",
345
+ "icon": "💬"
310
346
  },
311
347
  {
312
348
  "name": "reading-pal",
@@ -318,7 +354,8 @@
318
354
  "description": "Your reading life in one plugin. Track your TBR pile, get guilt-tripped about your backlog, find your next read, and sync from Goodreads.",
319
355
  "category": "hobby",
320
356
  "homepage": "https://github.com/vellum-ai/reading-pal",
321
- "license": "MIT"
357
+ "license": "MIT",
358
+ "icon": "📚"
322
359
  },
323
360
  {
324
361
  "name": "simple-memory",
@@ -330,7 +367,8 @@
330
367
  "description": "Reference memory plugin that exercises the full plugin API with low-cost variants of Vellum's memory defaults.",
331
368
  "category": "memory",
332
369
  "homepage": "https://github.com/vellum-ai/simple-memory",
333
- "license": "MIT"
370
+ "license": "MIT",
371
+ "icon": "🧠"
334
372
  },
335
373
  {
336
374
  "name": "smb-inbox-brief",
@@ -342,7 +380,8 @@
342
380
  "description": "Find urgent replies, overdue invoices, quotes, and customer follow-ups before they slip. Scans email, logs business items, delivers urgency-ranked daily briefs.",
343
381
  "category": "productivity",
344
382
  "homepage": "https://github.com/AnitaKirkovska/smb-inbox-brief",
345
- "license": "MIT"
383
+ "license": "MIT",
384
+ "icon": "📧"
346
385
  },
347
386
  {
348
387
  "name": "tennis-companion",
@@ -354,7 +393,8 @@
354
393
  "description": "Tennis journal, drill sessions, court finder, and progress tracking. Log matches with opponent tendencies, generate 30-minute practice sessions with progressions, find nearby courts via OpenStreetMap, and track win rate by surface and conditions.",
355
394
  "category": "health",
356
395
  "homepage": "https://github.com/vellum-ai/tennis-companion",
357
- "license": "MIT"
396
+ "license": "MIT",
397
+ "icon": "🎾"
358
398
  },
359
399
  {
360
400
  "name": "travel-planner",
@@ -366,7 +406,8 @@
366
406
  "description": "A travel EA for your assistant. Remembers how you travel (carrier, miles, hotel budget, card benefits), keeps per-trip records, watches Gmail for booking changes, syncs your calendar, and emails an EA-style trip brief 48 hours before departure.",
367
407
  "category": "lifestyle",
368
408
  "homepage": "https://github.com/AnitaKirkovska/travel-planner",
369
- "license": "MIT"
409
+ "license": "MIT",
410
+ "icon": "✈️"
370
411
  },
371
412
  {
372
413
  "name": "vellum-client-qa",
@@ -378,7 +419,22 @@
378
419
  "description": "Cross-platform QA rig for vellum-assistant clients: mock the platform backend, boot the real chat UI, and verify feature branches in headless Chromium (web), an iOS simulator, or Electron with screenshot and video proof.",
379
420
  "category": "developer",
380
421
  "homepage": "https://github.com/vellum-ai/vellum-client-qa",
381
- "license": "MIT"
422
+ "license": "MIT",
423
+ "icon": "🧪"
424
+ },
425
+ {
426
+ "name": "virlo",
427
+ "source": {
428
+ "source": "github",
429
+ "repo": "Virlo-AI/virlo-integrations",
430
+ "path": "integrations/vellum",
431
+ "ref": "e398cfd8a48316b9378e08efe4b42ad3dc42197e"
432
+ },
433
+ "description": "Real-time short-form video intelligence across TikTok, YouTube Shorts, and Instagram Reels, powered by Virlo Content Research Agents.",
434
+ "category": "marketing",
435
+ "homepage": "https://github.com/Virlo-AI/virlo-integrations/tree/main/integrations/vellum",
436
+ "license": "MIT",
437
+ "icon": "📱"
382
438
  },
383
439
  {
384
440
  "name": "writing-coach",
@@ -390,7 +446,8 @@
390
446
  "description": "A writing coach in your pocket. Daily prompts that escalate with your streak, savage-but-constructive draft roasts, query letter critiques, and a word count enforcer that guilt-trips you when you skip.",
391
447
  "category": "hobby",
392
448
  "homepage": "https://github.com/vellum-ai/writing-coach",
393
- "license": "MIT"
449
+ "license": "MIT",
450
+ "icon": "✍️"
394
451
  }
395
452
  ]
396
453
  }
@@ -224,8 +224,12 @@ function readRemote(
224
224
  * Best-effort: any failure (network, rate-limit, unexpected shape) yields
225
225
  * `null` so inspection still reports the remote pin's SHA without its date,
226
226
  * mirroring how the local side degrades to `unknown` when no date was recorded.
227
+ *
228
+ * Exported for reuse by `plugins upgrade`, which resolves the same
229
+ * human-readable "to" timestamp when previewing a directly-installed plugin's
230
+ * upgrade (its target commit has no marketplace entry to read the date from).
227
231
  */
228
- async function fetchCommitDate(
232
+ export async function fetchCommitDate(
229
233
  repo: string,
230
234
  sha: string,
231
235
  fetch: FetchLike,
@@ -36,6 +36,7 @@ import {
36
36
  statSync,
37
37
  writeFileSync,
38
38
  } from "node:fs";
39
+ import { tmpdir } from "node:os";
39
40
  import { dirname, join, resolve, sep } from "node:path";
40
41
  import { promisify } from "node:util";
41
42
 
@@ -1024,10 +1025,7 @@ function normalizeInstalledManifest(
1024
1025
  * data is read — the install name is the only identity we trust for an
1025
1026
  * untrusted direct install.
1026
1027
  */
1027
- function synthesizeMinimalPackageJson(
1028
- name: string,
1029
- stagingDir: string,
1030
- ): void {
1028
+ function synthesizeMinimalPackageJson(name: string, stagingDir: string): void {
1031
1029
  const manifestPath = join(stagingDir, "package.json");
1032
1030
 
1033
1031
  const manifest: PackageManifest = {
@@ -1280,6 +1278,72 @@ function pluginGitEnv(): NodeJS.ProcessEnv {
1280
1278
  return env;
1281
1279
  }
1282
1280
 
1281
+ /**
1282
+ * Resolve the commit SHA a plugin source's recorded ref points at *now*, using
1283
+ * a single `git ls-remote` — no clone. `plugins upgrade` uses this to detect
1284
+ * drift for a directly-installed plugin (one sourced from a GitHub URL rather
1285
+ * than the curated marketplace), whose "latest" is whatever its recorded
1286
+ * branch / tag / `HEAD` currently resolves to.
1287
+ *
1288
+ * A full-SHA ref is immutable, so it resolves to itself with no network call
1289
+ * (ls-remote lists refs, never arbitrary commits). For an annotated tag the
1290
+ * peeled commit (`<ref>^{}`) is preferred — the commit a checkout lands on.
1291
+ * Returns `null` when the ref no longer exists on the remote (a deleted branch /
1292
+ * tag) or the repo is unreachable as a hard failure; throws
1293
+ * {@link PluginSourceUnavailableError} on a transient git / network failure so
1294
+ * the caller can surface a retryable 503.
1295
+ */
1296
+ export async function resolveRefCommit(
1297
+ source: PluginFetchSource,
1298
+ runGit: GitRunner = defaultGitRunner,
1299
+ ): Promise<string | null> {
1300
+ if (isFullCommitSha(source.ref)) {
1301
+ return source.ref;
1302
+ }
1303
+ const repoUrl = `https://github.com/${source.owner}/${source.repo}.git`;
1304
+
1305
+ let stdout: string;
1306
+ try {
1307
+ // ls-remote takes the URL explicitly and never reads a local working tree,
1308
+ // so the OS temp dir is a safe, always-present cwd.
1309
+ ({ stdout } = await runGit(["ls-remote", repoUrl, source.ref], {
1310
+ cwd: tmpdir(),
1311
+ }));
1312
+ } catch (err) {
1313
+ // A missing repo / ref (or a private one we can't reach) is a hard failure
1314
+ // the caller maps to not-found; anything else — network loss, a transient
1315
+ // GitHub outage — is retryable, so surface a 503.
1316
+ if (isGitRefNotFound(err)) {
1317
+ return null;
1318
+ }
1319
+ throw new PluginSourceUnavailableError(
1320
+ `git ls-remote failed for ${source.owner}/${source.repo} @ ${source.ref}: ${subprocessErrorText(err)}`,
1321
+ 503,
1322
+ );
1323
+ }
1324
+
1325
+ // Each line is `<sha>\t<refname>`. Prefer the peeled commit of an annotated
1326
+ // tag (`<ref>^{}`) — the commit a checkout resolves to — over the tag object.
1327
+ let peeled: string | null = null;
1328
+ let direct: string | null = null;
1329
+ for (const line of stdout.split("\n")) {
1330
+ const trimmed = line.trim();
1331
+ if (trimmed === "") {
1332
+ continue;
1333
+ }
1334
+ const [sha, refname] = trimmed.split(/\s+/);
1335
+ if (sha === undefined || refname === undefined || !isFullCommitSha(sha)) {
1336
+ continue;
1337
+ }
1338
+ if (refname.endsWith("^{}")) {
1339
+ peeled = sha;
1340
+ } else {
1341
+ direct ??= sha;
1342
+ }
1343
+ }
1344
+ return peeled ?? direct;
1345
+ }
1346
+
1283
1347
  /** Inputs for {@link writeInstallMeta}, resolved during a fresh install. */
1284
1348
  interface WriteInstallMetaParams {
1285
1349
  readonly name: string;
@@ -1,10 +1,14 @@
1
1
  /**
2
2
  * Offline plugin catalog reader backed by the manifest bundled into the
3
- * package at build time (see meta/sync-bundled-copies.ts).
3
+ * package at build time. `bundled-marketplace.json` is a generated artifact
4
+ * (git-ignored) that meta/sync-bundled-copies.ts copies from the canonical
5
+ * plugins/marketplace.json before every build, test, and install — the same
6
+ * treatment as the feature-flag registry.
4
7
  *
5
8
  * `getPluginCatalog` selects this reader only when platform features are
6
9
  * disabled (air-gapped / self-hosted, `VELLUM_DISABLE_PLATFORM=true`). Importing
7
- * the JSON directly (resolveJsonModule) means no filesystem path resolution, so
10
+ * the JSON directly (resolveJsonModule) inlines it into the bundle, so there is
11
+ * no filesystem path resolution and the manifest is always present at runtime —
8
12
  * it works identically in dev, Docker, and an npm-packed macOS install.
9
13
  */
10
14
 
@@ -19,7 +19,7 @@ import { createHash } from "node:crypto";
19
19
  import { readFileSync } from "node:fs";
20
20
 
21
21
  import {
22
- isGeneratedAppBuildDir,
22
+ GENERATED_APP_BUILD_DIR,
23
23
  walkPluginTree,
24
24
  } from "../../plugins/plugin-tree-walk.js";
25
25
 
@@ -69,7 +69,7 @@ export function computeFingerprint(
69
69
  const files: Record<string, string> = {};
70
70
  walkPluginTree(
71
71
  root,
72
- { excludeRootEntries: exclude, excludeDir: isGeneratedAppBuildDir },
72
+ { excludeRootEntries: [...exclude, GENERATED_APP_BUILD_DIR] },
73
73
  (rel, abs) => {
74
74
  files[rel] = hashFile(abs);
75
75
  },
@@ -187,7 +187,7 @@ export function computeContentHash(
187
187
  const entries: Array<{ rel: string; abs: string }> = [];
188
188
  walkPluginTree(
189
189
  root,
190
- { excludeRootEntries: exclude, excludeDir: isGeneratedAppBuildDir },
190
+ { excludeRootEntries: [...exclude, GENERATED_APP_BUILD_DIR] },
191
191
  (rel, abs) => {
192
192
  entries.push({ rel, abs });
193
193
  },