@vellumai/assistant 0.4.56 → 0.5.0

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 (457) hide show
  1. package/ARCHITECTURE.md +10 -10
  2. package/Dockerfile +3 -0
  3. package/README.md +11 -11
  4. package/docs/architecture/integrations.md +2 -2
  5. package/docs/architecture/memory.md +3 -4
  6. package/docs/credential-execution-service.md +13 -20
  7. package/node_modules/@vellumai/ces-contracts/src/error.ts +5 -4
  8. package/package.json +1 -1
  9. package/src/__tests__/actor-token-service.test.ts +7 -7
  10. package/src/__tests__/anthropic-provider.test.ts +172 -0
  11. package/src/__tests__/app-builder-tool-scripts.test.ts +15 -1
  12. package/src/__tests__/approval-cascade.test.ts +2 -2
  13. package/src/__tests__/approval-routes-http.test.ts +3 -4
  14. package/src/__tests__/asset-materialize-tool.test.ts +5 -5
  15. package/src/__tests__/asset-search-tool.test.ts +1 -1
  16. package/src/__tests__/assistant-attachments.test.ts +5 -5
  17. package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
  18. package/src/__tests__/assistant-feature-flags-integration.test.ts +50 -38
  19. package/src/__tests__/attachments-store.test.ts +2 -2
  20. package/src/__tests__/avatar-e2e.test.ts +5 -3
  21. package/src/__tests__/browser-skill-endstate.test.ts +0 -1
  22. package/src/__tests__/call-routes-http.test.ts +2 -2
  23. package/src/__tests__/callback-handoff-copy.test.ts +1 -1
  24. package/src/__tests__/cancel-resolves-conversation-key.test.ts +158 -0
  25. package/src/__tests__/channel-readiness-routes.test.ts +0 -1
  26. package/src/__tests__/channel-readiness-service.test.ts +0 -1
  27. package/src/__tests__/checker.test.ts +31 -32
  28. package/src/__tests__/chrome-cdp.test.ts +47 -18
  29. package/src/__tests__/claude-code-skill-regression.test.ts +2 -2
  30. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  31. package/src/__tests__/config-schema.test.ts +9 -18
  32. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -1
  33. package/src/__tests__/conversation-abort-tool-results.test.ts +4 -4
  34. package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -2
  35. package/src/__tests__/conversation-agent-loop.test.ts +11 -4
  36. package/src/__tests__/conversation-attachments.test.ts +1 -1
  37. package/src/__tests__/conversation-confirmation-signals.test.ts +2 -2
  38. package/src/__tests__/conversation-error.test.ts +33 -0
  39. package/src/__tests__/conversation-init.benchmark.test.ts +0 -1
  40. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  41. package/src/__tests__/conversation-pairing.test.ts +1 -1
  42. package/src/__tests__/conversation-pre-run-repair.test.ts +4 -4
  43. package/src/__tests__/conversation-provider-retry-repair.test.ts +4 -4
  44. package/src/__tests__/conversation-queue.test.ts +23 -14
  45. package/src/__tests__/conversation-routes-slash-commands.test.ts +3 -3
  46. package/src/__tests__/conversation-runtime-assembly.test.ts +204 -185
  47. package/src/__tests__/conversation-seed-composer.test.ts +1 -1
  48. package/src/__tests__/conversation-slash-queue.test.ts +4 -4
  49. package/src/__tests__/conversation-slash-unknown.test.ts +4 -4
  50. package/src/__tests__/conversation-starter-routes.test.ts +291 -0
  51. package/src/__tests__/conversation-wipe.test.ts +438 -0
  52. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -3
  53. package/src/__tests__/conversation-workspace-injection.test.ts +4 -5
  54. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -5
  55. package/src/__tests__/credential-security-e2e.test.ts +20 -0
  56. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  57. package/src/__tests__/credential-vault-unit.test.ts +227 -0
  58. package/src/__tests__/credentials-cli.test.ts +3 -0
  59. package/src/__tests__/date-context.test.ts +59 -377
  60. package/src/__tests__/drop-capability-card-state-migration.test.ts +169 -0
  61. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +11 -45
  62. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  63. package/src/__tests__/encrypted-store.test.ts +249 -15
  64. package/src/__tests__/ephemeral-permissions.test.ts +4 -5
  65. package/src/__tests__/event-bus.test.ts +3 -3
  66. package/src/__tests__/file-read-tool.test.ts +40 -0
  67. package/src/__tests__/gateway-only-enforcement.test.ts +2 -2
  68. package/src/__tests__/gateway-only-guard.test.ts +1 -0
  69. package/src/__tests__/gemini-image-service.test.ts +4 -4
  70. package/src/__tests__/gemini-provider.test.ts +6 -9
  71. package/src/__tests__/guardian-binding-drift-heal.test.ts +128 -0
  72. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  73. package/src/__tests__/host-file-read-tool.test.ts +87 -0
  74. package/src/__tests__/host-shell-tool.test.ts +6 -6
  75. package/src/__tests__/http-user-message-parity.test.ts +2 -2
  76. package/src/__tests__/identity-intro-cache.test.ts +209 -0
  77. package/src/__tests__/intent-routing.test.ts +51 -99
  78. package/src/__tests__/invite-routes-http.test.ts +5 -0
  79. package/src/__tests__/list-messages-attachments.test.ts +1 -1
  80. package/src/__tests__/managed-proxy-context.test.ts +2 -5
  81. package/src/__tests__/managed-skill-lifecycle.test.ts +8 -8
  82. package/src/__tests__/media-generate-image.test.ts +32 -15
  83. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -1
  84. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +1 -1
  85. package/src/__tests__/memory-lifecycle-e2e.test.ts +24 -18
  86. package/src/__tests__/memory-recall-quality.test.ts +4 -3
  87. package/src/__tests__/memory-regressions.test.ts +86 -90
  88. package/src/__tests__/migration-cross-version-compatibility.test.ts +32 -32
  89. package/src/__tests__/migration-export-http.test.ts +26 -27
  90. package/src/__tests__/migration-import-commit-http.test.ts +165 -37
  91. package/src/__tests__/migration-import-preflight-http.test.ts +81 -20
  92. package/src/__tests__/migration-validate-http.test.ts +16 -16
  93. package/src/__tests__/model-intents.test.ts +2 -2
  94. package/src/__tests__/no-domain-routing-in-prompt-guard.test.ts +1 -1
  95. package/src/__tests__/non-member-access-request.test.ts +3 -3
  96. package/src/__tests__/notification-broadcaster.test.ts +1 -1
  97. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  98. package/src/__tests__/notification-decision-identity.test.ts +8 -9
  99. package/src/__tests__/notification-decision-strategy.test.ts +1 -1
  100. package/src/__tests__/notification-deep-link.test.ts +1 -1
  101. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  102. package/src/__tests__/notification-schedule-dedup.test.ts +7 -7
  103. package/src/__tests__/oauth-store.test.ts +1 -3
  104. package/src/__tests__/oauth2-gateway-transport.test.ts +6 -1
  105. package/src/__tests__/onboarding-template-contract.test.ts +23 -59
  106. package/src/__tests__/provider-error-scenarios.test.ts +154 -0
  107. package/src/__tests__/provider-fail-open-selection.test.ts +2 -2
  108. package/src/__tests__/provider-managed-proxy-integration.test.ts +8 -9
  109. package/src/__tests__/provider-registry-ollama.test.ts +5 -2
  110. package/src/__tests__/qdrant-manager.test.ts +7 -7
  111. package/src/__tests__/ratelimit.test.ts +0 -74
  112. package/src/__tests__/recording-handler.test.ts +0 -1
  113. package/src/__tests__/require-fresh-approval.test.ts +1 -1
  114. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
  115. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  116. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  117. package/src/__tests__/scheduler-recurrence.test.ts +46 -2
  118. package/src/__tests__/schema-transforms.test.ts +114 -54
  119. package/src/__tests__/secret-onetime-send.test.ts +20 -0
  120. package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -2
  121. package/src/__tests__/secret-scanner-executor.test.ts +1 -2
  122. package/src/__tests__/send-endpoint-busy.test.ts +63 -4
  123. package/src/__tests__/send-notification-tool.test.ts +2 -2
  124. package/src/__tests__/shell-credential-ref.test.ts +0 -1
  125. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -2
  126. package/src/__tests__/skill-memory.test.ts +549 -0
  127. package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -2
  128. package/src/__tests__/slack-app-setup-skill-regression.test.ts +37 -0
  129. package/src/__tests__/slack-channel-config.test.ts +109 -94
  130. package/src/__tests__/swarm-conversation-integration.test.ts +2 -2
  131. package/src/__tests__/swarm-recursion.test.ts +2 -2
  132. package/src/__tests__/swarm-tool.test.ts +2 -2
  133. package/src/__tests__/system-prompt.test.ts +19 -66
  134. package/src/__tests__/telegram-config.test.ts +121 -0
  135. package/src/__tests__/terminal-tools.test.ts +1 -1
  136. package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -2
  137. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  138. package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
  139. package/src/__tests__/tool-executor.test.ts +1 -1
  140. package/src/__tests__/trace-emitter.test.ts +8 -1
  141. package/src/__tests__/trust-store.test.ts +7 -8
  142. package/src/__tests__/twilio-routes.test.ts +1 -18
  143. package/src/__tests__/user-reference.test.ts +82 -2
  144. package/src/__tests__/vbundle-pax-and-symlink.test.ts +196 -0
  145. package/src/__tests__/verification-control-plane-policy.test.ts +1 -1
  146. package/src/approvals/guardian-request-resolvers.ts +3 -3
  147. package/src/avatar/ascii-renderer.ts +2 -2
  148. package/src/avatar/png-renderer.ts +2 -2
  149. package/src/avatar/resvg-lazy.ts +21 -0
  150. package/src/calls/guardian-dispatch.ts +1 -1
  151. package/src/calls/relay-access-wait.ts +2 -2
  152. package/src/calls/twilio-rest.ts +0 -248
  153. package/src/cli/AGENTS.md +5 -8
  154. package/src/cli/__tests__/notifications.test.ts +5 -5
  155. package/src/cli/commands/avatar.ts +64 -2
  156. package/src/cli/commands/conversations.ts +131 -1
  157. package/src/cli/commands/credentials.ts +2 -0
  158. package/src/cli/commands/notifications.ts +3 -3
  159. package/src/cli.ts +10 -0
  160. package/src/config/bundled-skills/acp/SKILL.md +5 -5
  161. package/src/config/bundled-skills/acp/TOOLS.json +6 -6
  162. package/src/config/bundled-skills/app-builder/SKILL.md +42 -42
  163. package/src/config/bundled-skills/app-builder/TOOLS.json +10 -10
  164. package/src/config/bundled-skills/browser/SKILL.md +15 -15
  165. package/src/config/bundled-skills/browser/TOOLS.json +14 -14
  166. package/src/config/bundled-skills/chatgpt-import/SKILL.md +2 -2
  167. package/src/config/bundled-skills/chatgpt-import/TOOLS.json +1 -1
  168. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  169. package/src/config/bundled-skills/claude-code/SKILL.md +5 -5
  170. package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
  171. package/src/config/bundled-skills/computer-use/TOOLS.json +15 -15
  172. package/src/config/bundled-skills/contacts/SKILL.md +3 -3
  173. package/src/config/bundled-skills/contacts/TOOLS.json +4 -4
  174. package/src/config/bundled-skills/document/SKILL.md +4 -4
  175. package/src/config/bundled-skills/document/TOOLS.json +2 -2
  176. package/src/config/bundled-skills/followups/TOOLS.json +3 -3
  177. package/src/config/bundled-skills/gmail/SKILL.md +32 -32
  178. package/src/config/bundled-skills/gmail/TOOLS.json +16 -16
  179. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +1 -1
  180. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +1 -1
  181. package/src/config/bundled-skills/google-calendar/SKILL.md +1 -1
  182. package/src/config/bundled-skills/google-calendar/TOOLS.json +5 -5
  183. package/src/config/bundled-skills/google-calendar/types.ts +1 -1
  184. package/src/config/bundled-skills/heartbeat/SKILL.md +43 -0
  185. package/src/config/bundled-skills/image-studio/SKILL.md +3 -3
  186. package/src/config/bundled-skills/image-studio/TOOLS.json +2 -3
  187. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +16 -12
  188. package/src/config/bundled-skills/media-processing/SKILL.md +40 -40
  189. package/src/config/bundled-skills/media-processing/TOOLS.json +8 -8
  190. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +2 -2
  191. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +1 -1
  192. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +5 -5
  193. package/src/config/bundled-skills/media-processing/services/gemini-video.ts +2 -2
  194. package/src/config/bundled-skills/media-processing/services/preprocess.ts +2 -2
  195. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +2 -2
  196. package/src/config/bundled-skills/media-processing/services/reduce.ts +3 -3
  197. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
  198. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +1 -1
  199. package/src/config/bundled-skills/messaging/SKILL.md +29 -25
  200. package/src/config/bundled-skills/messaging/TOOLS.json +11 -11
  201. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
  202. package/src/config/bundled-skills/messaging/tools/shared.ts +1 -1
  203. package/src/config/bundled-skills/notifications/SKILL.md +3 -3
  204. package/src/config/bundled-skills/notifications/TOOLS.json +2 -2
  205. package/src/config/bundled-skills/notifications/tools/send-notification.ts +3 -3
  206. package/src/config/bundled-skills/orchestration/SKILL.md +1 -1
  207. package/src/config/bundled-skills/orchestration/TOOLS.json +1 -1
  208. package/src/config/bundled-skills/phone-calls/SKILL.md +18 -14
  209. package/src/config/bundled-skills/phone-calls/TOOLS.json +3 -3
  210. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +2 -2
  211. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +2 -2
  212. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +1 -1
  213. package/src/config/bundled-skills/playbooks/TOOLS.json +4 -4
  214. package/src/config/bundled-skills/schedule/SKILL.md +26 -26
  215. package/src/config/bundled-skills/schedule/TOOLS.json +5 -5
  216. package/src/config/bundled-skills/screen-watch/SKILL.md +3 -3
  217. package/src/config/bundled-skills/screen-watch/TOOLS.json +1 -1
  218. package/src/config/bundled-skills/sequences/SKILL.md +2 -2
  219. package/src/config/bundled-skills/sequences/TOOLS.json +10 -10
  220. package/src/config/bundled-skills/sequences/tools/sequence-analytics.ts +2 -2
  221. package/src/config/bundled-skills/sequences/tools/sequence-enroll.ts +2 -2
  222. package/src/config/bundled-skills/sequences/tools/sequence-enrollment-list.ts +1 -1
  223. package/src/config/bundled-skills/sequences/tools/sequence-get.ts +1 -1
  224. package/src/config/bundled-skills/sequences/tools/sequence-import.ts +3 -3
  225. package/src/config/bundled-skills/sequences/tools/sequence-list.ts +1 -1
  226. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +1 -1
  227. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  228. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
  229. package/src/config/bundled-skills/skill-management/TOOLS.json +5 -5
  230. package/src/config/bundled-skills/skills-catalog/SKILL.md +84 -0
  231. package/src/config/bundled-skills/slack/SKILL.md +2 -2
  232. package/src/config/bundled-skills/slack/TOOLS.json +8 -8
  233. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +3 -3
  234. package/src/config/bundled-skills/subagent/TOOLS.json +5 -5
  235. package/src/config/bundled-skills/tasks/SKILL.md +1 -1
  236. package/src/config/bundled-skills/tasks/TOOLS.json +9 -9
  237. package/src/config/bundled-skills/transcribe/SKILL.md +5 -5
  238. package/src/config/bundled-skills/transcribe/TOOLS.json +1 -1
  239. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +10 -10
  240. package/src/config/bundled-skills/watcher/SKILL.md +4 -4
  241. package/src/config/bundled-skills/watcher/TOOLS.json +5 -5
  242. package/src/config/feature-flag-registry.json +33 -17
  243. package/src/config/schemas/sandbox.ts +1 -1
  244. package/src/config/schemas/services.ts +13 -3
  245. package/src/config/schemas/timeouts.ts +0 -10
  246. package/src/contacts/contact-store.ts +63 -0
  247. package/src/contacts/contacts-write.ts +1 -1
  248. package/src/daemon/assistant-attachments.ts +2 -2
  249. package/src/daemon/conversation-agent-loop-handlers.ts +2 -2
  250. package/src/daemon/conversation-agent-loop.ts +7 -30
  251. package/src/daemon/conversation-error.ts +24 -0
  252. package/src/daemon/conversation-memory.ts +8 -7
  253. package/src/daemon/conversation-runtime-assembly.ts +141 -275
  254. package/src/daemon/conversation-slash.ts +7 -26
  255. package/src/daemon/conversation-surfaces.ts +14 -0
  256. package/src/daemon/conversation-tool-setup.ts +9 -8
  257. package/src/daemon/conversation.ts +2 -0
  258. package/src/daemon/daemon-control.ts +1 -1
  259. package/src/daemon/date-context.ts +10 -83
  260. package/src/daemon/handlers/config-channels.ts +12 -2
  261. package/src/daemon/handlers/config-slack-channel.ts +7 -1
  262. package/src/daemon/handlers/config-telegram.ts +6 -1
  263. package/src/daemon/handlers/conversations.ts +2 -2
  264. package/src/daemon/handlers/skills.ts +4 -0
  265. package/src/daemon/lifecycle.ts +28 -4
  266. package/src/daemon/providers-setup.ts +1 -1
  267. package/src/daemon/server.ts +1 -5
  268. package/src/daemon/shutdown-handlers.ts +9 -3
  269. package/src/daemon/tool-side-effects.ts +40 -0
  270. package/src/daemon/trace-emitter.ts +26 -2
  271. package/src/events/domain-events.ts +1 -1
  272. package/src/events/tool-permission-telemetry-listener.ts +46 -0
  273. package/src/inbound/platform-callback-registration.ts +0 -18
  274. package/src/media/app-icon-generator.ts +15 -8
  275. package/src/media/avatar-router.ts +15 -8
  276. package/src/media/gemini-image-service.ts +125 -21
  277. package/src/memory/attachments-store.ts +3 -3
  278. package/src/memory/channel-verification-sessions.ts +6 -6
  279. package/src/memory/conversation-crud.ts +196 -1
  280. package/src/memory/{thread-starters-cadence.ts → conversation-starters-cadence.ts} +9 -42
  281. package/src/memory/conversation-title-service.ts +2 -3
  282. package/src/memory/db-init.ts +25 -1
  283. package/src/memory/invite-store.ts +4 -4
  284. package/src/memory/items-extractor.ts +4 -4
  285. package/src/memory/job-handlers/{thread-starters.ts → conversation-starters.ts} +123 -38
  286. package/src/memory/jobs-store.ts +3 -2
  287. package/src/memory/jobs-worker.ts +7 -5
  288. package/src/memory/lifecycle-events-store.ts +63 -0
  289. package/src/memory/migrations/172-rename-created-by-session-id.ts +27 -0
  290. package/src/memory/migrations/173-rename-source-session-id.ts +16 -0
  291. package/src/memory/migrations/174-rename-thread-starters-table.ts +52 -0
  292. package/src/memory/migrations/175-create-lifecycle-events.ts +15 -0
  293. package/src/memory/migrations/176-drop-capability-card-state.ts +36 -0
  294. package/src/memory/migrations/177-create-trace-events-table.ts +40 -0
  295. package/src/memory/migrations/index.ts +6 -0
  296. package/src/memory/migrations/registry.ts +13 -0
  297. package/src/memory/retriever.test.ts +223 -96
  298. package/src/memory/retriever.ts +115 -138
  299. package/src/memory/schema/calls.ts +1 -1
  300. package/src/memory/schema/contacts.ts +1 -1
  301. package/src/memory/schema/infrastructure.ts +29 -0
  302. package/src/memory/schema/memory-core.ts +7 -17
  303. package/src/memory/schema/notifications.ts +1 -1
  304. package/src/memory/search/formatting.ts +23 -6
  305. package/src/memory/search/lexical.ts +2 -0
  306. package/src/memory/search/semantic.ts +2 -0
  307. package/src/memory/search/staleness.ts +5 -1
  308. package/src/memory/search/types.ts +4 -0
  309. package/src/memory/task-memory-cleanup.ts +96 -6
  310. package/src/memory/trace-event-store.ts +148 -0
  311. package/src/notifications/README.md +1 -1
  312. package/src/notifications/decision-engine.ts +45 -4
  313. package/src/notifications/emit-signal.ts +5 -4
  314. package/src/notifications/events-store.ts +4 -4
  315. package/src/notifications/signal.ts +1 -1
  316. package/src/oauth/manual-token-connection.ts +49 -25
  317. package/src/permissions/checker.ts +6 -5
  318. package/src/permissions/defaults.ts +4 -4
  319. package/src/prompts/__tests__/build-cli-reference-section.test.ts +9 -90
  320. package/src/prompts/cache-boundary.ts +8 -0
  321. package/src/prompts/system-prompt.ts +105 -634
  322. package/src/prompts/templates/BOOTSTRAP.md +172 -33
  323. package/src/prompts/templates/IDENTITY.md +8 -24
  324. package/src/prompts/templates/SOUL.md +20 -41
  325. package/src/prompts/templates/USER.md +3 -19
  326. package/src/prompts/user-reference.ts +14 -16
  327. package/src/providers/anthropic/client.ts +51 -19
  328. package/src/providers/gemini/client.ts +6 -9
  329. package/src/providers/managed-proxy/constants.ts +1 -7
  330. package/src/providers/managed-proxy/context.ts +0 -1
  331. package/src/providers/model-intents.ts +5 -5
  332. package/src/providers/openai/client.ts +10 -1
  333. package/src/providers/openrouter/client.ts +1 -0
  334. package/src/providers/ratelimit.ts +0 -35
  335. package/src/providers/registry.ts +3 -5
  336. package/src/providers/retry.ts +18 -1
  337. package/src/runtime/access-request-helper.ts +16 -2
  338. package/src/runtime/auth/route-policy.ts +7 -0
  339. package/src/runtime/channel-verification-service.ts +1 -1
  340. package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
  341. package/src/runtime/guardian-vellum-migration.ts +61 -1
  342. package/src/runtime/http-server.ts +8 -4
  343. package/src/runtime/migrations/vbundle-builder.ts +212 -32
  344. package/src/runtime/migrations/vbundle-import-analyzer.ts +74 -8
  345. package/src/runtime/migrations/vbundle-importer.ts +66 -1
  346. package/src/runtime/migrations/vbundle-validator.ts +17 -3
  347. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +4 -4
  348. package/src/runtime/routes/attachment-routes.ts +2 -2
  349. package/src/runtime/routes/btw-routes.ts +93 -0
  350. package/src/runtime/routes/channel-verification-routes.ts +19 -2
  351. package/src/runtime/routes/conversation-management-routes.ts +55 -1
  352. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  353. package/src/runtime/routes/conversation-routes.ts +49 -5
  354. package/src/runtime/routes/conversation-starter-routes.ts +207 -0
  355. package/src/runtime/routes/guardian-bootstrap-routes.ts +13 -9
  356. package/src/runtime/routes/identity-intro-cache.ts +105 -0
  357. package/src/runtime/routes/identity-routes.ts +51 -0
  358. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -1
  359. package/src/runtime/routes/inbound-stages/verification-intercept.ts +1 -1
  360. package/src/runtime/routes/migration-routes.ts +25 -13
  361. package/src/runtime/routes/secret-routes.ts +18 -0
  362. package/src/runtime/routes/settings-routes.ts +9 -9
  363. package/src/runtime/routes/telemetry-routes.ts +53 -0
  364. package/src/runtime/routes/trace-event-routes.ts +62 -0
  365. package/src/runtime/tool-grant-request-helper.ts +1 -1
  366. package/src/runtime/verification-outbound-actions.ts +47 -31
  367. package/src/security/encrypted-store.ts +262 -78
  368. package/src/skills/catalog-install.ts +10 -0
  369. package/src/skills/managed-store.ts +2 -0
  370. package/src/skills/skill-memory.ts +222 -0
  371. package/src/subagent/manager.ts +1 -4
  372. package/src/telemetry/types.ts +10 -1
  373. package/src/telemetry/usage-telemetry-reporter.test.ts +7 -2
  374. package/src/telemetry/usage-telemetry-reporter.ts +53 -4
  375. package/src/tools/AGENTS.md +11 -11
  376. package/src/tools/acp/spawn.ts +1 -1
  377. package/src/tools/apps/executors.ts +8 -8
  378. package/src/tools/apps/registry.ts +1 -1
  379. package/src/tools/assets/materialize.ts +6 -6
  380. package/src/tools/assets/search.ts +10 -10
  381. package/src/tools/browser/__tests__/auth-cache.test.ts +2 -2
  382. package/src/tools/browser/__tests__/auth-detector.test.ts +4 -4
  383. package/src/tools/browser/auth-detector.ts +6 -6
  384. package/src/tools/browser/browser-execution.ts +13 -13
  385. package/src/tools/browser/browser-manager.ts +3 -3
  386. package/src/tools/browser/chrome-cdp.ts +5 -5
  387. package/src/tools/browser/jit-auth.ts +2 -2
  388. package/src/tools/browser/network-recorder.test.ts +2 -2
  389. package/src/tools/browser/network-recorder.ts +3 -3
  390. package/src/tools/browser/runtime-check.ts +3 -3
  391. package/src/tools/claude-code/claude-code.ts +2 -2
  392. package/src/tools/computer-use/definitions.ts +18 -18
  393. package/src/tools/credential-execution/make-authenticated-request.ts +4 -4
  394. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -3
  395. package/src/tools/credential-execution/run-authenticated-command.ts +4 -4
  396. package/src/tools/credentials/broker-types.ts +5 -5
  397. package/src/tools/credentials/broker.ts +15 -15
  398. package/src/tools/credentials/metadata-store.ts +2 -2
  399. package/src/tools/credentials/resolve.ts +1 -1
  400. package/src/tools/credentials/selection.ts +1 -1
  401. package/src/tools/credentials/tool-policy.ts +1 -1
  402. package/src/tools/credentials/vault.ts +115 -25
  403. package/src/tools/execution-target.ts +2 -2
  404. package/src/tools/executor.ts +7 -7
  405. package/src/tools/filesystem/edit.ts +2 -2
  406. package/src/tools/filesystem/read.ts +15 -4
  407. package/src/tools/filesystem/write.ts +1 -1
  408. package/src/tools/host-filesystem/edit.ts +2 -1
  409. package/src/tools/host-filesystem/read.ts +18 -1
  410. package/src/tools/host-filesystem/write.ts +1 -1
  411. package/src/tools/host-terminal/host-shell.ts +9 -8
  412. package/src/tools/mcp/mcp-tool-factory.ts +7 -6
  413. package/src/tools/memory/definitions.ts +6 -5
  414. package/src/tools/memory/handlers.test.ts +1 -1
  415. package/src/tools/network/__tests__/web-search.test.ts +3 -3
  416. package/src/tools/network/domain-normalize.ts +2 -2
  417. package/src/tools/network/script-proxy/session-manager.ts +10 -10
  418. package/src/tools/network/web-fetch.ts +1 -1
  419. package/src/tools/network/web-search.ts +3 -3
  420. package/src/tools/permission-checker.ts +8 -8
  421. package/src/tools/registry.ts +7 -7
  422. package/src/tools/schedule/list.ts +2 -2
  423. package/src/tools/schema-transforms.ts +31 -21
  424. package/src/tools/secret-detection-handler.ts +1 -1
  425. package/src/tools/sensitive-output-placeholders.ts +1 -1
  426. package/src/tools/shared/filesystem/edit-engine.ts +1 -1
  427. package/src/tools/shared/filesystem/file-ops-service.ts +3 -3
  428. package/src/tools/shared/filesystem/image-read.ts +25 -5
  429. package/src/tools/shared/filesystem/path-policy.ts +2 -2
  430. package/src/tools/shared/shell-output.ts +1 -1
  431. package/src/tools/side-effects.ts +1 -1
  432. package/src/tools/skills/execute.ts +1 -1
  433. package/src/tools/skills/load.ts +3 -3
  434. package/src/tools/skills/sandbox-runner.ts +3 -3
  435. package/src/tools/subagent/read.ts +1 -1
  436. package/src/tools/subagent/spawn.ts +2 -2
  437. package/src/tools/swarm/delegate.ts +3 -3
  438. package/src/tools/system/request-permission.ts +5 -4
  439. package/src/tools/terminal/backends/native.ts +4 -4
  440. package/src/tools/terminal/parser.ts +6 -6
  441. package/src/tools/terminal/sandbox-diagnostics.ts +1 -1
  442. package/src/tools/terminal/shell.ts +16 -16
  443. package/src/tools/tool-approval-handler.ts +21 -12
  444. package/src/tools/tool-manifest.ts +4 -4
  445. package/src/tools/types.ts +3 -3
  446. package/src/tools/ui-surface/definitions.ts +9 -37
  447. package/src/tools/watcher/list.ts +1 -1
  448. package/src/util/logger.ts +7 -2
  449. package/src/util/pricing.ts +4 -0
  450. package/src/util/retry.ts +29 -1
  451. package/src/workspace/migrations/007-web-search-provider-rename.ts +37 -0
  452. package/src/workspace/migrations/registry.ts +2 -0
  453. package/src/__tests__/cli-help-reference-sync.test.ts +0 -26
  454. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -190
  455. package/src/cli/reference.ts +0 -38
  456. package/src/memory/job-handlers/capability-cards.ts +0 -420
  457. package/src/runtime/routes/thread-starter-routes.ts +0 -294
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: schedule
3
- description: Recurring and one-shot scheduling cron, RRULE, or single fire-at time
3
+ description: Recurring and one-shot scheduling - cron, RRULE, or single fire-at time
4
4
  compatibility: "Designed for Vellum personal assistants"
5
5
  metadata:
6
6
  emoji: "📅"
@@ -26,10 +26,10 @@ Standard 5-field cron syntax: `minute hour day-of-month month day-of-week`
26
26
 
27
27
  Examples:
28
28
 
29
- - `0 9 * * 1-5` weekdays at 9:00 AM
30
- - `30 8 * * *` every day at 8:30 AM
31
- - `0 */2 * * *` every 2 hours
32
- - `0 9 1 * *` first of every month at 9:00 AM
29
+ - `0 9 * * 1-5` - weekdays at 9:00 AM
30
+ - `30 8 * * *` - every day at 8:30 AM
31
+ - `0 */2 * * *` - every 2 hours
32
+ - `0 9 1 * *` - first of every month at 9:00 AM
33
33
 
34
34
  ### RRULE (RFC 5545)
35
35
 
@@ -49,25 +49,25 @@ Exclusions (EXDATE, EXRULE) always take precedence over inclusions (RRULE, RDATE
49
49
 
50
50
  #### Basic examples
51
51
 
52
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=DAILY` every day at 9:00 AM UTC
53
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR` Mon/Wed/Fri at 9:00 AM UTC
54
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=MONTHLY;BYMONTHDAY=1,15` 1st and 15th of each month
52
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=DAILY` - every day at 9:00 AM UTC
53
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR` - Mon/Wed/Fri at 9:00 AM UTC
54
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=MONTHLY;BYMONTHDAY=1,15` - 1st and 15th of each month
55
55
 
56
56
  #### Bounded recurrence
57
57
 
58
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=DAILY;COUNT=30` daily for 30 occurrences then stop
59
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO;UNTIL=20250331T235959Z` every Monday until end of March
58
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=DAILY;COUNT=30` - daily for 30 occurrences then stop
59
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO;UNTIL=20250331T235959Z` - every Monday until end of March
60
60
 
61
61
  #### Set construct examples
62
62
 
63
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR\nEXDATE:20250120T090000Z` Mon/Wed/Fri except Jan 20
64
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=DAILY\nEXRULE:FREQ=WEEKLY;BYDAY=SA,SU` every weekday (daily minus weekends)
65
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=MONTHLY;BYMONTHDAY=1\nRDATE:20250704T090000Z` 1st of each month plus July 4th
66
- - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=TU\nRRULE:FREQ=WEEKLY;BYDAY=TH` union of Tuesdays and Thursdays
63
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR\nEXDATE:20250120T090000Z` - Mon/Wed/Fri except Jan 20
64
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=DAILY\nEXRULE:FREQ=WEEKLY;BYDAY=SA,SU` - every weekday (daily minus weekends)
65
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=MONTHLY;BYMONTHDAY=1\nRDATE:20250704T090000Z` - 1st of each month plus July 4th
66
+ - `DTSTART:20250101T090000Z\nRRULE:FREQ=WEEKLY;BYDAY=TU\nRRULE:FREQ=WEEKLY;BYDAY=TH` - union of Tuesdays and Thursdays
67
67
 
68
68
  ## One-Shot Schedules (Reminders)
69
69
 
70
- To create a one-time schedule that fires once and is done, pass `fire_at` (an ISO 8601 timestamp) instead of an `expression`. This replaces the old reminder concept "remind me at 3pm" becomes a one-shot schedule with `fire_at`.
70
+ To create a one-time schedule that fires once and is done, pass `fire_at` (an ISO 8601 timestamp) instead of an `expression`. This replaces the old reminder concept - "remind me at 3pm" becomes a one-shot schedule with `fire_at`.
71
71
 
72
72
  One-shot schedules:
73
73
  - Fire once at the specified time, then are marked as `fired` and disabled.
@@ -82,8 +82,8 @@ Examples:
82
82
 
83
83
  The `mode` parameter controls what happens when a schedule fires:
84
84
 
85
- - **execute** (default) sends the schedule's message to a background assistant conversation for autonomous handling. The assistant processes the message as if the user sent it.
86
- - **notify** sends a notification to the user via the notification pipeline. No assistant processing occurs.
85
+ - **execute** (default) - sends the schedule's message to a background assistant conversation for autonomous handling. The assistant processes the message as if the user sent it.
86
+ - **notify** - sends a notification to the user via the notification pipeline. No assistant processing occurs.
87
87
 
88
88
  Use `notify` for simple reminders ("remind me to take medicine at 9am") and `execute` for tasks that need assistant action ("check my calendar at 8am and send me a digest").
89
89
 
@@ -91,9 +91,9 @@ Use `notify` for simple reminders ("remind me to take medicine at 9am") and `exe
91
91
 
92
92
  Control how notify-mode schedules are delivered at trigger time with `routing_intent`:
93
93
 
94
- - **single_channel** deliver to one best channel
95
- - **multi_channel** deliver to a subset of channels
96
- - **all_channels** (default) deliver to every available channel
94
+ - **single_channel** - deliver to one best channel
95
+ - **multi_channel** - deliver to a subset of channels
96
+ - **all_channels** (default) - deliver to every available channel
97
97
 
98
98
  Optionally pass `routing_hints` (a JSON object) to influence routing decisions (e.g. preferred channels, exclusions).
99
99
 
@@ -101,7 +101,7 @@ Optionally pass `routing_hints` (a JSON object) to influence routing decisions (
101
101
 
102
102
  - **Default to `all_channels`** for most notifications. Users usually want to be notified wherever they are.
103
103
  - **Use `single_channel`** only when the user explicitly specifies a single channel (e.g. "remind me on Telegram").
104
- - **Check `user_message_channel`** from the turn context. If the user is currently active on a specific channel, include it as a routing hint:
104
+ - **Check `user_message_channel` (or `channel` when all channels are the same)** from the turn context. If the user is currently active on a specific channel, include it as a routing hint:
105
105
  ```
106
106
  routing_hints: { preferred_channels: ["vellum"] }
107
107
  routing_intent: "all_channels"
@@ -129,20 +129,20 @@ Phrases like "at the 45 minute mark", "at the top of the hour", "at noon", or "2
129
129
 
130
130
  **Resolution rules (in priority order):**
131
131
 
132
- 1. **Conversation-anchored expressions** if the user mentioned a start time earlier in conversation ("I got here at 9", "meeting started at 2:10"), interpret offset-style phrases ("the 45 minute mark", "20 minutes in") as `start_time + offset`.
132
+ 1. **Conversation-anchored expressions** - if the user mentioned a start time earlier in conversation ("I got here at 9", "meeting started at 2:10"), interpret offset-style phrases ("the 45 minute mark", "20 minutes in") as `start_time + offset`.
133
133
 
134
- 2. **Clock-position expressions** when no start time is in context, map directly to a wall-clock time:
134
+ 2. **Clock-position expressions** - when no start time is in context, map directly to a wall-clock time:
135
135
  - "top of the hour" → next :00
136
136
  - "the X minute mark" → current hour's :XX; if already past, advance one hour
137
137
  - "noon" / "midnight" → 12:00 PM or 12:00 AM today; if past, tomorrow
138
138
 
139
- 3. **Ask only if truly ambiguous** if neither rule resolves, ask for clarification. Never silently default to "from now."
139
+ 3. **Ask only if truly ambiguous** - if neither rule resolves, ask for clarification. Never silently default to "from now."
140
140
  - Timezones default to the system timezone if omitted. Use IANA timezone identifiers (e.g. "America/Los_Angeles").
141
141
  - Prefer RRULE for complex patterns that cron cannot express (e.g. "every other Tuesday", "last weekday of the month").
142
142
 
143
143
  ## Capability Preflight
144
144
 
145
- Before confirming a schedule to the user, you MUST verify that you have the capabilities needed to execute the scheduled message autonomously. Scheduled messages run without user interaction if a required integration is missing, the schedule will fail silently.
145
+ Before confirming a schedule to the user, you MUST verify that you have the capabilities needed to execute the scheduled message autonomously. Scheduled messages run without user interaction - if a required integration is missing, the schedule will fail silently.
146
146
 
147
147
  When `schedule_create` returns, it includes an integration status summary. Cross-reference the scheduled task's requirements against the available integrations:
148
148
 
@@ -153,7 +153,7 @@ When `schedule_create` returns, it includes an integration status summary. Cross
153
153
 
154
154
  If any required capability is missing:
155
155
 
156
- 1. **Do NOT tell the user the schedule is ready** instead, explain what's missing and why the schedule won't work yet
156
+ 1. **Do NOT tell the user the schedule is ready** - instead, explain what's missing and why the schedule won't work yet
157
157
  2. Offer to help set up the missing integration first
158
158
  3. The schedule is still created (so timing is preserved), but make it clear it won't execute successfully until dependencies are resolved
159
159
 
@@ -3,7 +3,7 @@
3
3
  "tools": [
4
4
  {
5
5
  "name": "schedule_create",
6
- "description": "Create a scheduled automation. For recurring: provide expression (cron/RRULE). For one-time: provide fire_at (ISO 8601 timestamp). ONLY use this when the user explicitly wants something to run on a schedule (e.g. \"every day at 9am\", \"remind me tomorrow at 3pm\", \"weekly on Mondays\"). Do NOT use this for \"add to my tasks\" or \"add to my queue\" use task_list_add for those requests instead.",
6
+ "description": "Create a scheduled automation. For recurring: provide expression (cron/RRULE). For one-time: provide fire_at (ISO 8601 timestamp). ONLY use this when the user explicitly wants something to run on a schedule (e.g. \"every day at 9am\", \"remind me tomorrow at 3pm\", \"weekly on Mondays\"). Do NOT use this for \"add to my tasks\" or \"add to my queue\" - use task_list_add for those requests instead.",
7
7
  "category": "schedule",
8
8
  "risk": "medium",
9
9
  "input_schema": {
@@ -52,7 +52,7 @@
52
52
  "type": "object",
53
53
  "description": "Additional routing metadata (e.g. preferred channel identifiers)"
54
54
  },
55
- "reason": {
55
+ "activity": {
56
56
  "type": "string",
57
57
  "description": "Brief non-technical explanation of why this tool is being called"
58
58
  }
@@ -78,7 +78,7 @@
78
78
  "type": "string",
79
79
  "description": "If provided, show detailed info and recent runs for this specific job."
80
80
  },
81
- "reason": {
81
+ "activity": {
82
82
  "type": "string",
83
83
  "description": "Brief non-technical explanation of why this tool is being called"
84
84
  }
@@ -139,7 +139,7 @@
139
139
  "type": "object",
140
140
  "description": "Additional routing metadata (e.g. preferred channel identifiers)"
141
141
  },
142
- "reason": {
142
+ "activity": {
143
143
  "type": "string",
144
144
  "description": "Brief non-technical explanation of why this tool is being called"
145
145
  }
@@ -161,7 +161,7 @@
161
161
  "type": "string",
162
162
  "description": "The ID of the schedule to delete"
163
163
  },
164
- "reason": {
164
+ "activity": {
165
165
  "type": "string",
166
166
  "description": "Brief non-technical explanation of why this tool is being called"
167
167
  }
@@ -16,9 +16,9 @@ Use `start_screen_watch` when the user wants you to monitor what's happening on
16
16
 
17
17
  ## Parameters
18
18
 
19
- - **focus_area** (required) What to focus on observing
20
- - **duration_minutes** How long to watch in minutes (1-15, default 5)
21
- - **interval_seconds** Seconds between screen captures (5-30, default 10)
19
+ - **focus_area** (required) - What to focus on observing
20
+ - **duration_minutes** - How long to watch in minutes (1-15, default 5)
21
+ - **interval_seconds** - Seconds between screen captures (5-30, default 10)
22
22
 
23
23
  ## Constraints
24
24
 
@@ -21,7 +21,7 @@
21
21
  "type": "string",
22
22
  "description": "What to focus on observing"
23
23
  },
24
- "reason": {
24
+ "activity": {
25
25
  "type": "string",
26
26
  "description": "Brief non-technical explanation of what you are watching and why, shown to the user as a status update. Use simple language a non-technical person would understand."
27
27
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sequences
3
- description: Create and manage automated email drip sequences with enrollment, scheduling, and analytics
3
+ description: Create and manage automated email drip sequences
4
4
  compatibility: "Designed for Vellum personal assistants"
5
5
  metadata:
6
6
  emoji: "📧"
@@ -34,7 +34,7 @@ You are an email sequence assistant. Use the sequence tools to help users create
34
34
 
35
35
  ### Analytics
36
36
 
37
- - **Dashboard**: View aggregate metrics across all sequences total sends, reply rates, completion rates
37
+ - **Dashboard**: View aggregate metrics across all sequences - total sends, reply rates, completion rates
38
38
  - **Step Funnel**: Drill into a specific sequence to see per-step send counts, reach, and drop-off
39
39
 
40
40
  ## Usage Notes
@@ -55,7 +55,7 @@
55
55
  "type": "boolean",
56
56
  "description": "Whether to stop the sequence when the contact replies (default true)"
57
57
  },
58
- "reason": {
58
+ "activity": {
59
59
  "type": "string",
60
60
  "description": "Brief non-technical explanation of why this tool is being called"
61
61
  }
@@ -78,7 +78,7 @@
78
78
  "enum": ["active", "paused", "archived"],
79
79
  "description": "Filter by sequence status"
80
80
  },
81
- "reason": {
81
+ "activity": {
82
82
  "type": "string",
83
83
  "description": "Brief non-technical explanation of why this tool is being called"
84
84
  }
@@ -99,7 +99,7 @@
99
99
  "type": "string",
100
100
  "description": "Sequence ID"
101
101
  },
102
- "reason": {
102
+ "activity": {
103
103
  "type": "string",
104
104
  "description": "Brief non-technical explanation of why this tool is being called"
105
105
  }
@@ -111,7 +111,7 @@
111
111
  },
112
112
  {
113
113
  "name": "sequence_update",
114
- "description": "Update a sequence or manage an enrollment's lifecycle. Two modes: (1) Sequence-level pass `id` to change name, description, status (active/paused/archived), steps, or exit-on-reply. (2) Enrollment-level pass `enrollment_id` + `enrollment_action` to pause, resume, or cancel an enrollment. Exactly one mode must be used per call.",
114
+ "description": "Update a sequence or manage an enrollment's lifecycle. Two modes: (1) Sequence-level - pass `id` to change name, description, status (active/paused/archived), steps, or exit-on-reply. (2) Enrollment-level - pass `enrollment_id` + `enrollment_action` to pause, resume, or cancel an enrollment. Exactly one mode must be used per call.",
115
115
  "category": "sequences",
116
116
  "risk": "medium",
117
117
  "input_schema": {
@@ -177,7 +177,7 @@
177
177
  },
178
178
  "description": "Replacement steps (replaces all existing steps)"
179
179
  },
180
- "reason": {
180
+ "activity": {
181
181
  "type": "string",
182
182
  "description": "Brief non-technical explanation of why this tool is being called"
183
183
  }
@@ -202,7 +202,7 @@
202
202
  "type": "string",
203
203
  "description": "Sequence ID to delete"
204
204
  },
205
- "reason": {
205
+ "activity": {
206
206
  "type": "string",
207
207
  "description": "Brief non-technical explanation of why this tool is being called"
208
208
  }
@@ -242,7 +242,7 @@
242
242
  "type": "object",
243
243
  "description": "Optional context object with personalization variables for the enrolled contacts"
244
244
  },
245
- "reason": {
245
+ "activity": {
246
246
  "type": "string",
247
247
  "description": "Brief non-technical explanation of why this tool is being called"
248
248
  }
@@ -276,7 +276,7 @@
276
276
  ],
277
277
  "description": "Filter by enrollment status"
278
278
  },
279
- "reason": {
279
+ "activity": {
280
280
  "type": "string",
281
281
  "description": "Brief non-technical explanation of why this tool is being called"
282
282
  }
@@ -305,7 +305,7 @@
305
305
  "type": "boolean",
306
306
  "description": "Set to true to enroll contacts (default false = preview mode)"
307
307
  },
308
- "reason": {
308
+ "activity": {
309
309
  "type": "string",
310
310
  "description": "Brief non-technical explanation of why this tool is being called"
311
311
  }
@@ -327,7 +327,7 @@
327
327
  "type": "string",
328
328
  "description": "Optional sequence ID for detailed step funnel view"
329
329
  },
330
- "reason": {
330
+ "activity": {
331
331
  "type": "string",
332
332
  "description": "Brief non-technical explanation of why this tool is being called"
333
333
  }
@@ -72,7 +72,7 @@ export async function run(
72
72
  ),
73
73
  );
74
74
  lines.push(
75
- ` Step ${s.stepIndex + 1}: "${s.subject}" ${s.sends} sends, ${
75
+ ` Step ${s.stepIndex + 1}: "${s.subject}" - ${s.sends} sends, ${
76
76
  s.enrollmentsReached
77
77
  } reached, ${(s.dropOff * 100).toFixed(0)}% drop-off`,
78
78
  );
@@ -89,7 +89,7 @@ export async function run(
89
89
  const time = new Date(e.createdAt).toISOString();
90
90
  const step = e.stepIndex !== undefined ? ` step ${e.stepIndex + 1}` : "";
91
91
  lines.push(
92
- ` [${time}] ${e.eventType}${step} enrollment ${e.enrollmentId.slice(
92
+ ` [${time}] ${e.eventType}${step} - enrollment ${e.enrollmentId.slice(
93
93
  0,
94
94
  8,
95
95
  )}...`,
@@ -39,11 +39,11 @@ export async function run(
39
39
  contactEmail: email,
40
40
  context,
41
41
  });
42
- results.push(` ${email} enrolled (ID: ${enrollment.id})`);
42
+ results.push(` ${email} - enrolled (ID: ${enrollment.id})`);
43
43
  successCount++;
44
44
  } catch (e) {
45
45
  results.push(
46
- ` ${email} failed: ${e instanceof Error ? e.message : String(e)}`,
46
+ ` ${email} - failed: ${e instanceof Error ? e.message : String(e)}`,
47
47
  );
48
48
  }
49
49
  }
@@ -21,7 +21,7 @@ export async function run(
21
21
  const nextAt = e.nextStepAt
22
22
  ? new Date(e.nextStepAt).toISOString()
23
23
  : "n/a";
24
- return `- ${e.contactEmail} (ID: ${e.id}) step ${e.currentStep}, status: ${e.status}, next: ${nextAt}`;
24
+ return `- ${e.contactEmail} (ID: ${e.id}) - step ${e.currentStep}, status: ${e.status}, next: ${nextAt}`;
25
25
  });
26
26
  return ok(`${enrollments.length} enrollment(s):\n${lines.join("\n")}`);
27
27
  } catch (e) {
@@ -41,7 +41,7 @@ export async function run(
41
41
  `Steps (${seq.steps.length}):`,
42
42
  ...seq.steps.map(
43
43
  (s) =>
44
- ` ${s.index + 1}. "${s.subjectTemplate}" delay: ${
44
+ ` ${s.index + 1}. "${s.subjectTemplate}" - delay: ${
45
45
  s.delaySeconds
46
46
  }s${s.requireApproval ? " [approval required]" : ""}`,
47
47
  ),
@@ -31,7 +31,7 @@ export async function run(
31
31
  );
32
32
  }
33
33
 
34
- // Preview mode (default) show what would happen
34
+ // Preview mode (default) - show what would happen
35
35
  if (!autoEnroll) {
36
36
  const lines = [
37
37
  `Parsed ${parsed.contacts.length} valid contact(s) from file.`,
@@ -72,7 +72,7 @@ export async function run(
72
72
  lines.push("");
73
73
  lines.push("Skipped:");
74
74
  for (const s of result.skipped.slice(0, 10)) {
75
- lines.push(` ${s.email} ${s.reason}`);
75
+ lines.push(` ${s.email} - ${s.reason}`);
76
76
  }
77
77
  }
78
78
 
@@ -80,7 +80,7 @@ export async function run(
80
80
  lines.push("");
81
81
  lines.push("Failed:");
82
82
  for (const f of result.failed.slice(0, 10)) {
83
- lines.push(` ${f.email} ${f.reason}`);
83
+ lines.push(` ${f.email} - ${f.reason}`);
84
84
  }
85
85
  }
86
86
 
@@ -21,7 +21,7 @@ export async function run(
21
21
 
22
22
  const lines = seqs.map((s) => {
23
23
  const enrollments = countActiveEnrollments(s.id);
24
- return `- ${s.name} (ID: ${s.id}) ${s.status}, ${s.steps.length} steps, ${enrollments} active enrollments, channel: ${s.channel}`;
24
+ return `- ${s.name} (ID: ${s.id}) - ${s.status}, ${s.steps.length} steps, ${enrollments} active enrollments, channel: ${s.channel}`;
25
25
  });
26
26
  return ok(`${seqs.length} sequence(s):\n${lines.join("\n")}`);
27
27
  } catch (e) {
@@ -58,7 +58,7 @@ export async function run(
58
58
  : null;
59
59
  if (seq && seq.status !== "active")
60
60
  return err(
61
- `Cannot resume enrollment parent sequence "${seq.name}" is ${seq.status}. Resume the sequence first.`,
61
+ `Cannot resume enrollment - parent sequence "${seq.name}" is ${seq.status}. Resume the sequence first.`,
62
62
  );
63
63
  resumeEnrollment(enrollmentId);
64
64
  return ok(`Enrollment ${enrollmentId} resumed.`);
@@ -17,7 +17,7 @@
17
17
  "value": {
18
18
  "description": "The new value for the setting (type depends on setting)"
19
19
  },
20
- "reason": {
20
+ "activity": {
21
21
  "type": "string",
22
22
  "description": "Brief non-technical explanation of what you are changing and why, shown to the user as a status update. Use simple language a non-technical person would understand."
23
23
  }
@@ -39,7 +39,7 @@
39
39
  "enum": ["microphone", "speech_recognition"],
40
40
  "description": "The System Settings pane to open"
41
41
  },
42
- "reason": {
42
+ "activity": {
43
43
  "type": "string",
44
44
  "description": "Brief non-technical explanation of what you are opening and why, shown to the user as a status update. Use simple language a non-technical person would understand."
45
45
  }
@@ -70,7 +70,7 @@
70
70
  ],
71
71
  "description": "The settings tab to navigate to"
72
72
  },
73
- "reason": {
73
+ "activity": {
74
74
  "type": "string",
75
75
  "description": "Brief non-technical explanation of what you are navigating to and why, shown to the user as a status update. Use simple language a non-technical person would understand."
76
76
  }
@@ -36,7 +36,7 @@ export async function run(
36
36
 
37
37
  const meta = PANES[pane as PaneName];
38
38
 
39
- // Send open_url to the client the x-apple.systempreferences: scheme
39
+ // Send open_url to the client - the x-apple.systempreferences: scheme
40
40
  // opens System Settings directly without a browser confirmation dialog.
41
41
  if (context.sendToClient) {
42
42
  context.sendToClient({
@@ -3,7 +3,7 @@
3
3
  "tools": [
4
4
  {
5
5
  "name": "scaffold_managed_skill",
6
- "description": "Create or update a managed skill in ~/.vellum/workspace/skills. The skill becomes available for skill_load immediately.",
6
+ "description": "Create or update a managed skill in ~/.vellum/workspace/skills. The skill becomes available for skill_load immediately. Never persist a skill without explicit user consent. Before persisting, test the snippet: write to a temp file with bash and run with `bun run /tmp/vellum-eval/snippet.ts`. Iterate up to 3 attempts, then ask the user. Clean up temp files after. Do not use file_write for temp files outside the working directory. After a skill is written, the next turn may run in a recreated session due to file-watcher eviction - continue normally.",
7
7
  "category": "skills",
8
8
  "risk": "high",
9
9
  "input_schema": {
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "body_markdown": {
25
25
  "type": "string",
26
- "description": "The full skill body in markdown instructions, prompts, templates, etc."
26
+ "description": "The full skill body in markdown - instructions, prompts, templates, etc."
27
27
  },
28
28
  "emoji": {
29
29
  "type": "string",
@@ -42,7 +42,7 @@
42
42
  "items": { "type": "string" },
43
43
  "description": "Optional list of child skill IDs that this skill includes (metadata only, no auto-activation)."
44
44
  },
45
- "reason": {
45
+ "activity": {
46
46
  "type": "string",
47
47
  "description": "Brief non-technical explanation of what you are creating and why, shown to the user as a status update. Use simple language a non-technical person would understand."
48
48
  }
@@ -54,7 +54,7 @@
54
54
  },
55
55
  {
56
56
  "name": "delete_managed_skill",
57
- "description": "Delete a managed skill from ~/.vellum/workspace/skills and remove it from the SKILLS.md index.",
57
+ "description": "Delete a managed skill from ~/.vellum/workspace/skills and remove it from the SKILLS.md index. Never delete a skill without explicit user confirmation. After deletion, the next turn may run in a recreated session due to file-watcher eviction - continue normally.",
58
58
  "category": "skills",
59
59
  "risk": "high",
60
60
  "input_schema": {
@@ -68,7 +68,7 @@
68
68
  "type": "boolean",
69
69
  "description": "Whether to remove the skill from SKILLS.md index (default: true)."
70
70
  },
71
- "reason": {
71
+ "activity": {
72
72
  "type": "string",
73
73
  "description": "Brief non-technical explanation of what you are deleting and why, shown to the user as a status update. Use simple language a non-technical person would understand."
74
74
  }
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: skills-catalog
3
+ description: Discover bundled skills and search/install community skills from the skills.sh registry
4
+ compatibility: "Designed for Vellum personal assistants"
5
+ metadata:
6
+ emoji: "\U0001F9E9"
7
+ vellum:
8
+ display-name: "Skills Catalog"
9
+ activation-hints:
10
+ - "what can you do"
11
+ - "find a skill"
12
+ - "install a skill"
13
+ - "community skills"
14
+ - "skills.sh"
15
+ - "search for skills"
16
+ avoid-when:
17
+ - "User is asking about a specific bundled skill already visible in the catalog"
18
+ ---
19
+
20
+ You can help the user discover what skills are available and find community skills to extend the assistant's capabilities.
21
+
22
+ ## Bundled skills (first-party)
23
+
24
+ First-party skills are **bundled** with the assistant - they are compiled in and always available. They do not need to be installed or downloaded. To activate a bundled skill, use the `skill_load` tool:
25
+
26
+ ```
27
+ skill_load skill=<skill-id>
28
+ ```
29
+
30
+ The skill catalog shown in the system prompt lists all bundled skills with their IDs. When a user asks about capabilities, refer to this list to find relevant bundled skills and load them as needed.
31
+
32
+ ## Community skills (skills.sh)
33
+
34
+ Community skills are published on the skills.sh registry and can be searched, inspected, and installed on demand using the `assistant skills` CLI.
35
+
36
+ ### Searching for community skills
37
+
38
+ ```bash
39
+ assistant skills search "<query>"
40
+ ```
41
+
42
+ Returns matching skills with their slug, source, install counts, and security audit badges. Use this when the user asks for a capability not covered by bundled skills.
43
+
44
+ ### Installing a community skill
45
+
46
+ **Trust model - check the source owner before installing:**
47
+
48
+ - **Vellum-owned** (`vellum-ai/*`): First-party skills published by the Vellum team. Install these directly without prompting - they are vetted and trusted.
49
+ - **Third-party** (any other owner): Ask the user for permission first. Present the skill name, source, audit results, and install count. Say something like: "I found a community skill that could help, but it's published by a third party - we haven't vetted it. Want to install it anyway?"
50
+
51
+ ```bash
52
+ assistant skills add <owner>/<repo>@<skill-name>
53
+ ```
54
+
55
+ For example:
56
+ ```bash
57
+ assistant skills add vercel-labs/skills@find-skills
58
+ ```
59
+
60
+ Once installed, the skill appears in the workspace skills directory and can be loaded with `skill_load` like any other skill.
61
+
62
+ ## Typical flow
63
+
64
+ 1. **User asks about capabilities** - "Can you order food?" or "What can you do?"
65
+ - Check the bundled skills list in the system prompt
66
+ - Present relevant skills to the user
67
+ - Load any that match with `skill_load`
68
+
69
+ 2. **User wants a capability not covered by bundled skills** - "Can you do X?"
70
+ - Search with `assistant skills search "<query>"`
71
+ - Present matching results with descriptions, install counts, and audit badges
72
+ - Check the source owner to determine trust level (see trust model above)
73
+ - Install with `assistant skills add <owner>/<repo>@<skill-name>`
74
+ - Load it with `skill_load`
75
+
76
+ 3. **Skill has dependencies** - if `includes` lists other skill IDs, load those first with `skill_load`
77
+
78
+ ## Notes
79
+
80
+ - Bundled skills are always available and do not need installation
81
+ - Community skills are installed to the workspace skills directory
82
+ - After installing a community skill, it is auto-enabled and immediately loadable
83
+ - Skills can be enabled or disabled via feature flags without uninstalling them
84
+ - Never install third-party community skills without explicit user confirmation
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: slack
3
- description: Scan channels, summarize threads, and manage Slack with privacy guardrails
3
+ description: Scan channels, summarize threads, and manage Slack
4
4
  compatibility: "Designed for Vellum personal assistants"
5
5
  metadata:
6
6
  emoji: "💬"
@@ -68,7 +68,7 @@ When responding to messages from Slack channels, replies are automatically threa
68
68
  When you need to **send** content to Slack proactively (e.g. a scheduled digest, a scan summary, or a report):
69
69
 
70
70
  - Use `messaging_send` with `platform: "slack"` and the target `conversation_id` (Slack channel or DM ID). This posts directly via `chat.postMessage` and preserves the full message content.
71
- - Do **NOT** use `send_notification` for rich content like digests the notification router's decision engine rewrites content into short alerts, stripping the actual digest.
71
+ - Do **NOT** use `send_notification` for rich content like digests - the notification router's decision engine rewrites content into short alerts, stripping the actual digest.
72
72
  - `send_notification` is appropriate for short alerts and status updates where you want the router to pick the best channel. `messaging_send` is appropriate when you have specific content to deliver to a specific Slack destination.
73
73
  - For scheduled tasks (cron/RRULE), always end with a `messaging_send` call so the results actually reach the user. Without it, the output only lives in the conversation log.
74
74