@vellumai/assistant 0.8.10 → 0.8.11-staging.1

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 (400) hide show
  1. package/bun.lock +62 -1
  2. package/docs/workspace-tools.md +196 -0
  3. package/examples/plugins/echo/README.md +3 -3
  4. package/knip.json +1 -0
  5. package/openapi.yaml +460 -128
  6. package/package.json +2 -1
  7. package/scripts/build-plugin-api.ts +299 -0
  8. package/src/__tests__/agent-loop-callsite-precedence.test.ts +7 -0
  9. package/src/__tests__/agent-loop-compaction-events.test.ts +197 -0
  10. package/src/__tests__/agent-loop-exit-reason.test.ts +93 -96
  11. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +2 -0
  12. package/src/__tests__/agent-loop-output-hooks.test.ts +274 -1
  13. package/src/__tests__/agent-loop-override-profile.test.ts +3 -0
  14. package/src/__tests__/agent-loop-provider-error-recording.test.ts +4 -0
  15. package/src/__tests__/agent-loop-thinking.test.ts +4 -0
  16. package/src/__tests__/agent-loop.test.ts +578 -5
  17. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -1
  18. package/src/__tests__/approval-cascade.test.ts +1 -0
  19. package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
  20. package/src/__tests__/btw-routes.test.ts +0 -1
  21. package/src/__tests__/build-persisted-content.test.ts +75 -1
  22. package/src/__tests__/catalog-install-normalize.test.ts +141 -0
  23. package/src/__tests__/ces-startup-timeout.test.ts +60 -0
  24. package/src/__tests__/compaction-events.test.ts +1 -0
  25. package/src/__tests__/config-managed-gemini-defaults.test.ts +2 -46
  26. package/src/__tests__/context-overflow-reducer.test.ts +264 -124
  27. package/src/__tests__/context-window-manager-overflow-rung.test.ts +351 -0
  28. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
  29. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -5
  30. package/src/__tests__/conversation-agent-loop-overflow.test.ts +284 -455
  31. package/src/__tests__/conversation-agent-loop.test.ts +131 -551
  32. package/src/__tests__/conversation-app-control-instantiation.test.ts +13 -0
  33. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -0
  34. package/src/__tests__/conversation-fork-crud.test.ts +259 -0
  35. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  36. package/src/__tests__/conversation-lifecycle.test.ts +257 -1
  37. package/src/__tests__/conversation-process-callsite.test.ts +1 -0
  38. package/src/__tests__/conversation-provider-retry-repair.test.ts +38 -377
  39. package/src/__tests__/conversation-queue.test.ts +1 -39
  40. package/src/__tests__/conversation-runtime-assembly.test.ts +119 -8
  41. package/src/__tests__/conversation-skill-tools.test.ts +491 -5
  42. package/src/__tests__/conversation-slash-queue.test.ts +1 -1
  43. package/src/__tests__/conversation-slash-unknown.test.ts +1 -0
  44. package/src/__tests__/conversation-speed-override.test.ts +1 -0
  45. package/src/__tests__/conversation-store.test.ts +74 -0
  46. package/src/__tests__/conversation-surfaces-app-control.test.ts +4 -1
  47. package/src/__tests__/conversation-tool-setup-attribution.test.ts +323 -0
  48. package/src/__tests__/conversation-tool-setup-tools-disabled.test.ts +34 -0
  49. package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
  50. package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
  51. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -0
  52. package/src/__tests__/corrected-target.test.ts +93 -0
  53. package/src/__tests__/credential-execution-feature-gates.test.ts +3 -5
  54. package/src/__tests__/credential-execution-tools.test.ts +23 -11
  55. package/src/__tests__/credential-security-invariants.test.ts +6 -1
  56. package/src/__tests__/db-schedule-syntax-migration.test.ts +80 -0
  57. package/src/__tests__/device-id.test.ts +70 -1
  58. package/src/__tests__/embedding-managed-proxy-selection.test.ts +6 -40
  59. package/src/__tests__/empty-response-hook.test.ts +242 -66
  60. package/src/__tests__/external-plugin-loader.test.ts +0 -31
  61. package/src/__tests__/get-skill-detail-audit.test.ts +43 -1
  62. package/src/__tests__/guardian-routing-invariants.test.ts +91 -0
  63. package/src/__tests__/history-repair-hook.test.ts +228 -3
  64. package/src/__tests__/host-app-control-proxy.test.ts +45 -0
  65. package/src/__tests__/host-browser-proxy.test.ts +254 -9
  66. package/src/__tests__/identity-routes.test.ts +1 -0
  67. package/src/__tests__/image-recovery-hook.test.ts +387 -0
  68. package/src/__tests__/injector-chain.test.ts +5 -4
  69. package/src/__tests__/injector-v3-suppression.test.ts +373 -47
  70. package/src/__tests__/intent-routing.test.ts +7 -0
  71. package/src/__tests__/memory-retrieval-hook.test.ts +117 -15
  72. package/src/__tests__/notification-decision-strategy.test.ts +3 -3
  73. package/src/__tests__/oauth-store.test.ts +0 -85
  74. package/src/__tests__/{context-overflow-policy.test.ts → overflow-policy.test.ts} +1 -1
  75. package/src/__tests__/parallel-tool.benchmark.test.ts +4 -0
  76. package/src/__tests__/persist-unsendable-image-downscale.test.ts +29 -9
  77. package/src/__tests__/persist-unsendable-image.test.ts +4 -4
  78. package/src/__tests__/persistence-secret-redaction.test.ts +78 -0
  79. package/src/__tests__/plugin-bootstrap.test.ts +82 -73
  80. package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
  81. package/src/__tests__/plugin-types.test.ts +0 -8
  82. package/src/__tests__/provider-catalog-visibility.test.ts +1 -9
  83. package/src/__tests__/prune-old-conversations-job.test.ts +99 -0
  84. package/src/__tests__/registry.test.ts +240 -1
  85. package/src/__tests__/require-fresh-approval.test.ts +3 -0
  86. package/src/__tests__/schedule-routes.test.ts +116 -1
  87. package/src/__tests__/schedule-store.test.ts +28 -0
  88. package/src/__tests__/schedule-tools.test.ts +94 -1
  89. package/src/__tests__/server-history-render.test.ts +39 -0
  90. package/src/__tests__/skill-projection-feature-flag.test.ts +13 -0
  91. package/src/__tests__/skill-projection.benchmark.test.ts +25 -7
  92. package/src/__tests__/skills.test.ts +202 -0
  93. package/src/__tests__/slim-skill-category.test.ts +195 -0
  94. package/src/__tests__/strip-memory-injections.test.ts +33 -39
  95. package/src/__tests__/test-support/tool-invocation-seed.ts +79 -0
  96. package/src/__tests__/title-generate-hook.test.ts +9 -7
  97. package/src/__tests__/tool-audit-listener.test.ts +264 -1
  98. package/src/__tests__/tool-error-hook.test.ts +4 -3
  99. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -0
  100. package/src/__tests__/tool-executor-lifecycle-events.test.ts +273 -0
  101. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -0
  102. package/src/__tests__/tool-start-timestamp.test.ts +218 -0
  103. package/src/__tests__/tools-get-route.test.ts +202 -0
  104. package/src/__tests__/workspace-tool-loader.test.ts +319 -0
  105. package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
  106. package/src/agent/loop.ts +569 -319
  107. package/src/api/events/tool-result.ts +9 -0
  108. package/src/api/events/tool-use-start.ts +7 -0
  109. package/src/api/index.ts +10 -0
  110. package/src/api/responses/conversation-message.ts +135 -27
  111. package/src/api/responses/memory-v3-selection-log.ts +4 -4
  112. package/src/approvals/guardian-request-resolvers.ts +26 -0
  113. package/src/browser-session/backends/host-bridge.ts +29 -0
  114. package/src/browser-session/index.ts +1 -0
  115. package/src/browser-session/types.ts +5 -1
  116. package/src/cli/commands/__tests__/schedules.test.ts +62 -4
  117. package/src/cli/commands/__tests__/skills.test.ts +53 -0
  118. package/src/cli/commands/channel-verification-sessions.ts +6 -6
  119. package/src/cli/commands/inference-providers.ts +0 -8
  120. package/src/cli/commands/plugins.ts +2 -2
  121. package/src/cli/commands/schedules.ts +27 -4
  122. package/src/cli/commands/skills.ts +187 -146
  123. package/src/cli/commands/tools.ts +106 -0
  124. package/src/cli/lib/__tests__/install-from-github.test.ts +256 -328
  125. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +6 -2
  126. package/src/cli/lib/__tests__/plugin-details.test.ts +10 -16
  127. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +2 -2
  128. package/src/cli/lib/__tests__/search-plugins.test.ts +145 -240
  129. package/src/cli/lib/install-from-github.ts +187 -117
  130. package/src/cli/lib/plugin-catalog-cache.ts +9 -9
  131. package/src/cli/lib/plugin-details.ts +38 -68
  132. package/src/cli/lib/plugin-marketplace.ts +42 -14
  133. package/src/cli/lib/search-plugins.ts +29 -129
  134. package/src/cli/program.ts +2 -0
  135. package/src/config/bundled-skills/acp/SKILL.md +1 -0
  136. package/src/config/bundled-skills/app-builder/SKILL.md +1 -0
  137. package/src/config/bundled-skills/app-control/SKILL.md +1 -0
  138. package/src/config/bundled-skills/computer-use/SKILL.md +1 -0
  139. package/src/config/bundled-skills/contacts/SKILL.md +1 -0
  140. package/src/config/bundled-skills/document-editor/SKILL.md +1 -0
  141. package/src/config/bundled-skills/followups/SKILL.md +1 -0
  142. package/src/config/bundled-skills/image-studio/SKILL.md +1 -0
  143. package/src/config/bundled-skills/media-processing/SKILL.md +1 -0
  144. package/src/config/bundled-skills/messaging/SKILL.md +1 -0
  145. package/src/config/bundled-skills/phone-calls/SKILL.md +1 -0
  146. package/src/config/bundled-skills/playbooks/SKILL.md +1 -0
  147. package/src/config/bundled-skills/schedule/SKILL.md +1 -0
  148. package/src/config/bundled-skills/schedule/TOOLS.json +11 -3
  149. package/src/config/bundled-skills/sequences/SKILL.md +1 -0
  150. package/src/config/bundled-skills/settings/SKILL.md +1 -0
  151. package/src/config/bundled-skills/skill-management/SKILL.md +101 -1
  152. package/src/config/bundled-skills/subagent/SKILL.md +1 -0
  153. package/src/config/bundled-skills/transcribe/SKILL.md +1 -0
  154. package/src/config/env-registry.ts +23 -0
  155. package/src/config/feature-flag-registry.json +17 -81
  156. package/src/config/loader.ts +5 -22
  157. package/src/config/schema.ts +2 -0
  158. package/src/config/schemas/__tests__/compaction-logs.test.ts +56 -0
  159. package/src/config/schemas/__tests__/memory-v2.test.ts +0 -1
  160. package/src/config/schemas/__tests__/memory-v3.test.ts +61 -1
  161. package/src/config/schemas/compaction-logs.ts +79 -0
  162. package/src/config/schemas/memory-v2.ts +0 -8
  163. package/src/config/schemas/memory-v3.ts +104 -33
  164. package/src/config/seed-inference-profiles.ts +1 -1
  165. package/src/config/skills.ts +117 -47
  166. package/src/context/compactor.ts +11 -0
  167. package/src/context/strip-injections.ts +38 -4
  168. package/src/credential-execution/feature-gates.ts +0 -21
  169. package/src/credential-execution/startup-timeout.ts +32 -4
  170. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +18 -0
  171. package/src/daemon/conversation-agent-loop-handlers.ts +140 -91
  172. package/src/daemon/conversation-agent-loop.ts +123 -658
  173. package/src/daemon/conversation-error.ts +6 -33
  174. package/src/daemon/conversation-lifecycle.ts +1 -1
  175. package/src/daemon/conversation-runtime-assembly.ts +183 -22
  176. package/src/daemon/conversation-skill-tools.ts +137 -8
  177. package/src/daemon/conversation-slash.ts +0 -14
  178. package/src/daemon/conversation-store.ts +2 -19
  179. package/src/daemon/conversation-tool-setup.ts +87 -1
  180. package/src/daemon/conversation.ts +119 -50
  181. package/src/daemon/external-plugins-bootstrap.ts +36 -95
  182. package/src/daemon/handlers/config-channels.ts +11 -2
  183. package/src/daemon/handlers/shared.ts +9 -1
  184. package/src/daemon/handlers/skills.ts +10 -4
  185. package/src/daemon/host-app-control-proxy.ts +72 -57
  186. package/src/daemon/host-browser-proxy.ts +117 -22
  187. package/src/daemon/lifecycle.ts +34 -5
  188. package/src/daemon/message-protocol.ts +0 -7
  189. package/src/daemon/message-types/schedules.ts +1 -0
  190. package/src/daemon/message-types/skills.ts +17 -0
  191. package/src/daemon/providers-setup.ts +3 -0
  192. package/src/daemon/server.ts +3 -3
  193. package/src/daemon/tool-setup-types.ts +9 -3
  194. package/src/daemon/trust-context.ts +23 -0
  195. package/src/daemon/workspace-tools-watcher.ts +324 -0
  196. package/src/events/tool-audit-listener.ts +78 -16
  197. package/src/events/tool-metrics-listener.ts +2 -5
  198. package/src/memory/__tests__/compaction-log-writer-clickhouse.test.ts +227 -0
  199. package/src/memory/__tests__/conversation-queries.test.ts +176 -0
  200. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +20 -32
  201. package/src/memory/compaction-log-writer-clickhouse.ts +418 -0
  202. package/src/memory/conversation-crud.ts +134 -3
  203. package/src/memory/conversation-queries.ts +64 -7
  204. package/src/memory/db-init.ts +14 -0
  205. package/src/memory/embedding-backend.test.ts +130 -1
  206. package/src/memory/embedding-backend.ts +79 -106
  207. package/src/memory/embedding-gemini.ts +5 -0
  208. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +12 -0
  209. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +19 -0
  210. package/src/memory/graph/conversation-graph-memory.ts +36 -25
  211. package/src/memory/graph/tool-handlers.ts +3 -0
  212. package/src/memory/job-handlers/cleanup.ts +3 -1
  213. package/src/memory/jobs-store.ts +0 -28
  214. package/src/memory/jobs-worker.ts +10 -22
  215. package/src/memory/memory-marker.ts +29 -0
  216. package/src/memory/memory-retrospective-startup-cleanup.ts +1 -1
  217. package/src/memory/migrations/268-add-memory-v3-selections.ts +6 -0
  218. package/src/memory/migrations/270-schedule-description.ts +36 -0
  219. package/src/memory/migrations/275-tool-invocations-add-skill-id.test.ts +81 -0
  220. package/src/memory/migrations/275-tool-invocations-add-skill-id.ts +20 -0
  221. package/src/memory/migrations/276-tool-invocations-created-at-id-index.test.ts +68 -0
  222. package/src/memory/migrations/276-tool-invocations-created-at-id-index.ts +20 -0
  223. package/src/memory/migrations/277-add-memory-v3-ever-injected.ts +29 -0
  224. package/src/memory/migrations/278-tool-invocations-telemetry-columns.test.ts +96 -0
  225. package/src/memory/migrations/278-tool-invocations-telemetry-columns.ts +39 -0
  226. package/src/memory/migrations/279-create-skill-loaded-events.test.ts +84 -0
  227. package/src/memory/migrations/279-create-skill-loaded-events.ts +26 -0
  228. package/src/memory/migrations/280-conversations-surfaced-at.test.ts +88 -0
  229. package/src/memory/migrations/280-conversations-surfaced-at.ts +24 -0
  230. package/src/memory/migrations/index.ts +10 -0
  231. package/src/memory/migrations/registry.ts +8 -0
  232. package/src/memory/schema/conversations.ts +16 -0
  233. package/src/memory/schema/infrastructure.ts +26 -0
  234. package/src/memory/skill-loaded-events-store.test.ts +160 -0
  235. package/src/memory/skill-loaded-events-store.ts +95 -0
  236. package/src/memory/tool-executed-events-store.test.ts +219 -0
  237. package/src/memory/tool-executed-events-store.ts +102 -0
  238. package/src/memory/tool-usage-store.ts +15 -3
  239. package/src/memory/v2/__tests__/consolidation-job.test.ts +117 -12
  240. package/src/memory/v2/__tests__/consolidation-prompt-flag-gating-guard.test.ts +189 -0
  241. package/src/memory/v2/__tests__/injected-block-slugs.test.ts +90 -0
  242. package/src/memory/v2/__tests__/page-store.test.ts +33 -0
  243. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +88 -15
  244. package/src/memory/v2/activation-store.ts +50 -1
  245. package/src/memory/v2/consolidation-job.ts +113 -29
  246. package/src/memory/v2/injected-block-slugs.ts +79 -0
  247. package/src/memory/v2/injection.ts +6 -1
  248. package/src/memory/v2/prompts/consolidation.ts +414 -13
  249. package/src/memory/v2/router.ts +2 -28
  250. package/src/memory/v2/static-context.ts +1 -1
  251. package/src/memory/v2/types.ts +16 -0
  252. package/src/notifications/__tests__/copy-composer.test.ts +244 -0
  253. package/src/notifications/access-request-copy.ts +298 -0
  254. package/src/notifications/adapters/slack.ts +3 -3
  255. package/src/notifications/adapters/telegram.ts +2 -1
  256. package/src/notifications/copy-composer.ts +49 -267
  257. package/src/notifications/decision-engine.ts +16 -35
  258. package/src/notifications/home-feed-side-effect.ts +1 -6
  259. package/src/oauth/oauth-store.ts +0 -9
  260. package/src/permissions/checker.test.ts +83 -1
  261. package/src/permissions/checker.ts +25 -2
  262. package/src/permissions/gateway-threshold-reader.test.ts +182 -0
  263. package/src/permissions/gateway-threshold-reader.ts +80 -0
  264. package/src/platform/client.ts +1 -3
  265. package/src/platform/feature-gate.ts +3 -12
  266. package/src/plugin-api/constants.ts +4 -2
  267. package/src/plugin-api/index.ts +63 -11
  268. package/src/plugin-api/types.ts +236 -71
  269. package/src/plugins/defaults/compaction/compact.ts +66 -2
  270. package/src/plugins/defaults/compaction/context-overflow-reducer.ts +240 -32
  271. package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
  272. package/src/{daemon/context-overflow-policy.ts → plugins/defaults/compaction/overflow-policy.ts} +1 -1
  273. package/src/plugins/defaults/compaction/window-manager.ts +303 -1
  274. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +173 -0
  275. package/src/plugins/defaults/empty-response/hooks/stop.ts +11 -115
  276. package/src/plugins/defaults/empty-response/nudge-state-store.ts +46 -0
  277. package/src/plugins/defaults/history-repair/hooks/post-model-call.ts +50 -0
  278. package/src/plugins/defaults/history-repair/hooks/stop.ts +22 -0
  279. package/src/plugins/defaults/history-repair/repair-state-store.ts +51 -0
  280. package/src/plugins/defaults/history-repair/terminal.ts +39 -2
  281. package/src/plugins/defaults/image-recovery/detect.ts +25 -0
  282. package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +73 -0
  283. package/src/plugins/defaults/image-recovery/hooks/stop.ts +22 -0
  284. package/src/plugins/defaults/image-recovery/image-recovery-state-store.ts +48 -0
  285. package/src/plugins/defaults/image-recovery/package.json +14 -0
  286. package/src/{daemon/persist-unsendable-image.ts → plugins/defaults/image-recovery/recover.ts} +67 -14
  287. package/src/plugins/defaults/index.ts +71 -5
  288. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +76 -112
  289. package/src/plugins/defaults/memory-retrieval/hooks/{user-prompt-submit-temp.ts → user-prompt-submit.ts} +83 -74
  290. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +14 -8
  291. package/src/plugins/defaults/memory-retrieval/injectors.ts +2 -18
  292. package/src/plugins/defaults/memory-retrieval/package.json +14 -0
  293. package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1157 -0
  294. package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +683 -0
  295. package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +161 -140
  296. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +160 -0
  297. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +335 -316
  298. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +145 -53
  299. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +38 -1
  300. package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +18 -8
  301. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +112 -71
  302. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +192 -51
  303. package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +4 -16
  304. package/src/plugins/defaults/memory-v3-shadow/card.test.ts +173 -0
  305. package/src/plugins/defaults/memory-v3-shadow/card.ts +116 -0
  306. package/src/plugins/defaults/memory-v3-shadow/core-set.test.ts +104 -0
  307. package/src/plugins/defaults/memory-v3-shadow/core-set.ts +59 -0
  308. package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.test.ts +305 -0
  309. package/src/plugins/defaults/memory-v3-shadow/ever-injected-store.ts +278 -0
  310. package/src/plugins/defaults/memory-v3-shadow/hot-set.test.ts +138 -0
  311. package/src/plugins/defaults/memory-v3-shadow/hot-set.ts +85 -0
  312. package/src/plugins/defaults/memory-v3-shadow/injector.ts +331 -24
  313. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +119 -13
  314. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +169 -114
  315. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +47 -16
  316. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +144 -66
  317. package/src/plugins/defaults/memory-v3-shadow/prune.test.ts +758 -0
  318. package/src/plugins/defaults/memory-v3-shadow/prune.ts +471 -0
  319. package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +68 -16
  320. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +19 -12
  321. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +96 -43
  322. package/src/plugins/defaults/memory-v3-shadow/types.ts +34 -17
  323. package/src/plugins/defaults/title-generate/hooks/stop.ts +9 -11
  324. package/src/plugins/pipeline.ts +8 -5
  325. package/src/plugins/types.ts +5 -51
  326. package/src/providers/cache-control.ts +26 -0
  327. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -2
  328. package/src/providers/model-catalog.ts +13 -1
  329. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +147 -0
  330. package/src/providers/openai/chat-completions-provider.ts +46 -0
  331. package/src/providers/openai/responses-provider.ts +45 -0
  332. package/src/providers/registry.ts +0 -8
  333. package/src/runtime/__tests__/agent-wake.test.ts +0 -1
  334. package/src/runtime/agent-wake.ts +13 -0
  335. package/src/runtime/routes/__tests__/acp-routes.test.ts +151 -0
  336. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +12 -50
  337. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +322 -0
  338. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +0 -62
  339. package/src/runtime/routes/__tests__/plugins-routes.test.ts +31 -11
  340. package/src/runtime/routes/acp-routes.test.ts +106 -0
  341. package/src/runtime/routes/acp-routes.ts +248 -2
  342. package/src/runtime/routes/browser-tabs-routes.ts +1 -1
  343. package/src/runtime/routes/channel-verification-routes.ts +14 -5
  344. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +0 -14
  345. package/src/runtime/routes/consolidation-routes.ts +6 -82
  346. package/src/runtime/routes/conversation-list-routes.ts +6 -0
  347. package/src/runtime/routes/conversation-management-routes.ts +71 -0
  348. package/src/runtime/routes/identity-routes.ts +8 -0
  349. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
  350. package/src/runtime/routes/inference-provider-connection-routes.ts +0 -45
  351. package/src/runtime/routes/plugins-routes.ts +34 -45
  352. package/src/runtime/routes/schedule-routes.ts +43 -5
  353. package/src/runtime/routes/settings-routes.ts +140 -15
  354. package/src/runtime/routes/skills-routes.ts +18 -6
  355. package/src/runtime/services/__tests__/conversation-serializer.test.ts +140 -0
  356. package/src/runtime/services/conversation-serializer.ts +38 -1
  357. package/src/runtime/verification-outbound-actions.ts +147 -2
  358. package/src/runtime/verification-templates.ts +29 -3
  359. package/src/schedule/schedule-store.ts +19 -0
  360. package/src/skills/catalog-install.ts +77 -13
  361. package/src/tasks/task-scheduler.ts +1 -0
  362. package/src/telemetry/types.ts +66 -1
  363. package/src/telemetry/usage-telemetry-reporter.test.ts +542 -13
  364. package/src/telemetry/usage-telemetry-reporter.ts +213 -20
  365. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +49 -2
  366. package/src/tools/browser/__tests__/browser-status.test.ts +29 -5
  367. package/src/tools/browser/browser-execution.ts +27 -9
  368. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +380 -4
  369. package/src/tools/browser/cdp-client/__tests__/host-bridge-cdp-client.test.ts +107 -0
  370. package/src/tools/browser/cdp-client/__tests__/types.test.ts +6 -1
  371. package/src/tools/browser/cdp-client/factory.ts +217 -17
  372. package/src/tools/browser/cdp-client/host-bridge-cdp-client.ts +67 -0
  373. package/src/tools/browser/cdp-client/types.ts +22 -2
  374. package/src/tools/credential-execution/make-authenticated-request.ts +2 -1
  375. package/src/tools/credential-execution/manage-secure-command-tool.ts +169 -164
  376. package/src/tools/credential-execution/run-authenticated-command.ts +2 -1
  377. package/src/tools/executor.ts +39 -7
  378. package/src/tools/registry.ts +387 -5
  379. package/src/tools/schedule/create.ts +16 -0
  380. package/src/tools/schedule/list.ts +12 -4
  381. package/src/tools/schedule/update.ts +12 -0
  382. package/src/tools/skills/load.ts +11 -6
  383. package/src/tools/terminal/safe-env.ts +2 -0
  384. package/src/tools/types.ts +65 -9
  385. package/src/tools/workspace-tools/loader.ts +673 -0
  386. package/src/usage/attribution.ts +28 -0
  387. package/src/util/device-id.ts +17 -3
  388. package/src/util/platform.ts +16 -0
  389. package/tsconfig.plugin-api.json +13 -0
  390. package/src/__tests__/plugin-external-api.test.ts +0 -68
  391. package/src/__tests__/plugin-skill-contribution.test.ts +0 -355
  392. package/src/daemon/message-types/browser.ts +0 -10
  393. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
  394. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +0 -36
  395. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +0 -37
  396. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +0 -106
  397. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +0 -44
  398. package/src/plugins/defaults/memory-v3-shadow/working-set.ts +0 -91
  399. package/src/plugins/external-api.ts +0 -114
  400. package/src/plugins/plugin-skill-contributions.ts +0 -292
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Read the curated plugin marketplace manifest from the canonical repo.
3
3
  *
4
- * The manifest at `experimental/plugins/marketplace.json` whitelists external
4
+ * The manifest at `plugins/marketplace.json` whitelists external
5
5
  * ecosystem plugins so they appear in `assistant plugins search` / the web
6
6
  * catalog and become installable by name. Its shape is a subset of the
7
7
  * Claude Code marketplace manifest
@@ -9,9 +9,9 @@
9
9
  * a `plugins` array where each entry carries a `name` and a `source`. Only
10
10
  * `github` sources are resolved today.
11
11
  *
12
- * Like the first-party plugin listing, the manifest is fetched from the repo
13
- * at a git ref (via the GitHub Contents API) rather than bundled into the
14
- * assistant build — so the whitelist can grow without shipping a new release.
12
+ * The manifest is fetched from the repo at a git ref (via the GitHub Contents
13
+ * API) rather than bundled into the assistant build — so the whitelist can
14
+ * grow without shipping a new release.
15
15
  * Every external source pins an explicit `ref` that MUST be a full commit SHA:
16
16
  * the fetched code is locked to an immutable revision. Tags and branches are
17
17
  * rejected because they are mutable — an upstream owner could retag/repoint
@@ -33,7 +33,7 @@ import type { FetchLike } from "./install-from-github.js";
33
33
  /** Canonical location of the marketplace manifest. */
34
34
  const MARKETPLACE_SOURCE_OWNER = "vellum-ai";
35
35
  const MARKETPLACE_SOURCE_REPO = "vellum-assistant";
36
- const MARKETPLACE_FILE_PATH = "experimental/plugins/marketplace.json";
36
+ const MARKETPLACE_FILE_PATH = "plugins/marketplace.json";
37
37
 
38
38
  // ---------------------------------------------------------------------------
39
39
  // Manifest schema (subset of the Claude Code marketplace schema)
@@ -132,23 +132,51 @@ export interface FetchMarketplaceDeps {
132
132
  /**
133
133
  * The manifest could not be read or did not validate. Distinct from "no
134
134
  * manifest at this ref" (a missing file is a normal, empty result) — this
135
- * signals an upstream/parse problem the caller may choose to surface or
136
- * degrade past.
135
+ * signals an upstream/parse problem the caller must surface.
136
+ *
137
+ * `transient` distinguishes a retryable upstream hiccup (GitHub rate-limited
138
+ * us or returned a 5xx) from a hard failure (a malformed or invalid manifest).
139
+ * The catalog is the source of truth for installable plugins, so a transient
140
+ * fetch failure should map to a retryable 503 and serve a stale cache, while a
141
+ * hard failure surfaces as a real error.
137
142
  */
138
143
  export class MarketplaceFetchError extends Error {
139
- constructor(message: string) {
144
+ /** Whether the failure is a retryable upstream hiccup vs a hard error. */
145
+ readonly transient: boolean;
146
+ /** Upstream HTTP status, when the failure originated from a response. */
147
+ readonly status?: number;
148
+ constructor(
149
+ message: string,
150
+ opts?: { transient?: boolean; status?: number },
151
+ ) {
140
152
  super(message);
141
153
  this.name = "MarketplaceFetchError";
154
+ this.transient = opts?.transient ?? false;
155
+ if (opts?.status !== undefined) this.status = opts.status;
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Classify an upstream GitHub status as transient (worth retrying) vs hard.
161
+ * A 429 or 5xx is always transient. A 403 is GitHub's unauthenticated
162
+ * rate-limit signal only when the remaining-quota header is exhausted — a 403
163
+ * without it is a genuine authorization failure and stays hard.
164
+ */
165
+ function isTransientUpstreamStatus(res: Response): boolean {
166
+ if (res.status === 429 || res.status >= 500) return true;
167
+ if (res.status === 403) {
168
+ return res.headers.get("x-ratelimit-remaining") === "0";
142
169
  }
170
+ return false;
143
171
  }
144
172
 
145
173
  /**
146
174
  * Fetch and validate the marketplace manifest, returning its plugin entries.
147
175
  *
148
- * A missing manifest (HTTP 404) is treated as an empty whitelist — the
149
- * marketplace is supplementary to the first-party plugin listing, so its
150
- * absence is not an error. Any other HTTP failure, a non-JSON body, or a
151
- * schema violation throws {@link MarketplaceFetchError}.
176
+ * A missing manifest (HTTP 404) is treated as an empty whitelist — an empty
177
+ * catalog is a valid state, not an error. Any other HTTP failure, a non-JSON
178
+ * body, or a schema violation throws {@link MarketplaceFetchError}; a
179
+ * rate-limit or 5xx is flagged `transient` so the caller can retry.
152
180
  */
153
181
  export async function fetchMarketplaceEntries(
154
182
  deps: FetchMarketplaceDeps,
@@ -172,6 +200,7 @@ export async function fetchMarketplaceEntries(
172
200
  if (!res.ok) {
173
201
  throw new MarketplaceFetchError(
174
202
  `Marketplace manifest fetch failed for ${MARKETPLACE_FILE_PATH} @ ${ref}: HTTP ${res.status}`,
203
+ { transient: isTransientUpstreamStatus(res), status: res.status },
175
204
  );
176
205
  }
177
206
 
@@ -196,8 +225,7 @@ export async function fetchMarketplaceEntries(
196
225
 
197
226
  /**
198
227
  * Resolve a plugin name to concrete GitHub coordinates using the supplied
199
- * marketplace entries. Returns `null` when no entry claims the name (the
200
- * caller then falls back to the first-party source convention).
228
+ * marketplace entries. Returns `null` when no entry claims the name.
201
229
  */
202
230
  export function resolveMarketplaceSource(
203
231
  name: string,
@@ -1,13 +1,9 @@
1
1
  /**
2
2
  * Search the installable plugin catalog in the canonical GitHub source.
3
3
  *
4
- * The catalog is the union of two sources, both fetched from the repo at the
5
- * configured git ref:
6
- * 1. First-party plugins — directories under
7
- * `vellum-ai/vellum-assistant/experimental/plugins/`.
8
- * 2. Whitelisted external ecosystem plugins — entries in the curated
9
- * `experimental/plugins/marketplace.json` manifest (see
10
- * {@link ./plugin-marketplace}).
4
+ * The catalog is the set of whitelisted external ecosystem plugins listed in
5
+ * the curated `plugins/marketplace.json` manifest, fetched from the repo at
6
+ * the configured git ref (see {@link ./plugin-marketplace}).
11
7
  *
12
8
  * Entries are filtered by case-insensitive ECMAScript regex against the
13
9
  * plugin name. A plain query like `"memory"` matches anywhere in the name;
@@ -25,25 +21,13 @@ import { DEFAULT_PLUGIN_REF } from "./install-from-github.js";
25
21
  import {
26
22
  fetchMarketplaceEntries,
27
23
  type MarketplaceEntry,
24
+ MarketplaceFetchError,
28
25
  } from "./plugin-marketplace.js";
29
26
 
30
27
  // Re-export the dep-injection type so callers can grab everything they need
31
28
  // from one module rather than reaching into `install-from-github.js`.
32
29
  export type { FetchLike } from "./install-from-github.js";
33
30
 
34
- const PLUGIN_SOURCE_OWNER = "vellum-ai";
35
- const PLUGIN_SOURCE_REPO = "vellum-assistant";
36
- const PLUGIN_SOURCE_PATH_PREFIX = "experimental/plugins";
37
-
38
- /** Entry shape returned by the GitHub Contents API for a directory listing. */
39
- interface GitHubContentEntry {
40
- readonly name: string;
41
- readonly path: string;
42
- readonly type: "file" | "dir" | "symlink" | "submodule";
43
- readonly size: number;
44
- readonly download_url: string | null;
45
- }
46
-
47
31
  /** Options that control the search. */
48
32
  export interface SearchPluginsOptions {
49
33
  /**
@@ -62,26 +46,23 @@ export interface SearchPluginsDeps {
62
46
  }
63
47
 
64
48
  /** Where a catalog match comes from. */
65
- export type PluginMatchSource =
66
- | { readonly kind: "first-party" }
67
- | {
68
- readonly kind: "github";
69
- /** `owner/repo` of the external plugin repository. */
70
- readonly repo: string;
71
- /** Directory within the repo, when the plugin is not at the root. */
72
- readonly path?: string;
73
- /** Pinned git ref the plugin is fetched from. */
74
- readonly ref: string;
75
- };
49
+ export type PluginMatchSource = {
50
+ readonly kind: "github";
51
+ /** `owner/repo` of the external plugin repository. */
52
+ readonly repo: string;
53
+ /** Directory within the repo, when the plugin is not at the root. */
54
+ readonly path?: string;
55
+ /** Pinned git ref the plugin is fetched from. */
56
+ readonly ref: string;
57
+ };
76
58
 
77
59
  /** One matching catalog entry. */
78
60
  export interface PluginSearchMatch {
79
61
  /** Install name — `assistant plugins install <name>` resolves to it. */
80
62
  readonly name: string;
81
63
  /**
82
- * Human-readable origin of the entry: the repo-relative path for
83
- * first-party plugins (e.g. `experimental/plugins/<name>`) or a
84
- * `github:owner/repo@ref` locator for external ones.
64
+ * Human-readable origin of the entry: a `github:owner/repo[/path]@ref`
65
+ * locator for the external plugin source.
85
66
  */
86
67
  readonly path: string;
87
68
  /** Short description, when known (external entries only today). */
@@ -178,9 +159,8 @@ export interface PluginCatalog {
178
159
  }
179
160
 
180
161
  /**
181
- * Build the full catalog at {@link opts.ref}: every first-party plugin
182
- * directory under `experimental/plugins/` merged with every whitelisted
183
- * external entry in the marketplace manifest.
162
+ * Build the full catalog at {@link opts.ref}: every whitelisted external
163
+ * entry in the marketplace manifest, deduped by name.
184
164
  *
185
165
  * The result is **query-independent** — `searchPlugins` applies the regex
186
166
  * filter in memory afterwards. That separation is what lets a long-lived
@@ -193,37 +173,16 @@ export async function loadPluginCatalog(
193
173
  ): Promise<PluginCatalog> {
194
174
  const ref = opts.ref ?? DEFAULT_PLUGIN_REF;
195
175
 
196
- const [entries, marketplace] = await Promise.all([
197
- listDir(PLUGIN_SOURCE_PATH_PREFIX, ref, deps.fetch),
198
- fetchMarketplaceSafe(deps.fetch, ref),
199
- ]);
176
+ const marketplace = await fetchMarketplaceCatalog(deps.fetch, ref);
200
177
 
201
178
  const matches: PluginSearchMatch[] = [];
202
179
  const seen = new Set<string>();
203
-
204
- // Whitelisted external entries own their name. A same-named
205
- // `experimental/plugins/<name>/` directory is that plugin's curated adapter
206
- // stub (overlaid onto the clone at install time), not a standalone
207
- // first-party plugin — so it must surface once, as the external entry.
208
180
  for (const entry of marketplace) {
209
181
  if (seen.has(entry.name)) continue;
210
182
  matches.push(marketplaceMatch(entry));
211
183
  seen.add(entry.name);
212
184
  }
213
185
 
214
- // First-party plugins are the in-repo directories whose name the marketplace
215
- // does not claim.
216
- for (const entry of entries) {
217
- if (entry.type !== "dir") continue;
218
- if (seen.has(entry.name)) continue;
219
- matches.push({
220
- name: entry.name,
221
- path: entry.path,
222
- source: { kind: "first-party" },
223
- });
224
- seen.add(entry.name);
225
- }
226
-
227
186
  matches.sort((a, b) => a.name.localeCompare(b.name));
228
187
 
229
188
  return { ref, matches };
@@ -245,19 +204,23 @@ function marketplaceMatch(entry: MarketplaceEntry): PluginSearchMatch {
245
204
  }
246
205
 
247
206
  /**
248
- * Fetch the marketplace manifest, degrading to an empty whitelist on any
249
- * failure. The manifest is supplementary to the first-party listing, so a
250
- * missing or malformed manifest must never break the core catalog — mirroring
251
- * the daemon's "never block over a subsystem failure" philosophy.
207
+ * Fetch the marketplace entries, mapping a transient upstream failure to
208
+ * {@link PluginCatalogUnavailableError} so the cache can serve a stale catalog
209
+ * and the route can surface a retryable 503. A missing manifest is a normal
210
+ * empty catalog; a hard failure (malformed or invalid manifest) propagates
211
+ * as-is, since the catalog is the source of truth for installable plugins.
252
212
  */
253
- async function fetchMarketplaceSafe(
213
+ async function fetchMarketplaceCatalog(
254
214
  fetchFn: FetchLike,
255
215
  ref: string,
256
216
  ): Promise<readonly MarketplaceEntry[]> {
257
217
  try {
258
218
  return await fetchMarketplaceEntries({ fetch: fetchFn }, { ref });
259
- } catch {
260
- return [];
219
+ } catch (err) {
220
+ if (err instanceof MarketplaceFetchError && err.transient) {
221
+ throw new PluginCatalogUnavailableError(err.message, err.status ?? 503);
222
+ }
223
+ throw err;
261
224
  }
262
225
  }
263
226
 
@@ -270,66 +233,3 @@ function buildMatcher(query: string): (name: string) => boolean {
270
233
  }
271
234
  return (name) => re.test(name);
272
235
  }
273
-
274
- async function listDir(
275
- apiPath: string,
276
- ref: string,
277
- fetchFn: FetchLike,
278
- ): Promise<readonly GitHubContentEntry[]> {
279
- const url =
280
- `https://api.github.com/repos/${PLUGIN_SOURCE_OWNER}/${PLUGIN_SOURCE_REPO}` +
281
- `/contents/${encodeURIComponent(apiPath).replaceAll("%2F", "/")}` +
282
- `?ref=${encodeURIComponent(ref)}`;
283
-
284
- const res = await githubFetch(url, fetchFn);
285
- if (!res.ok) {
286
- const detail = `GitHub contents listing failed for ${apiPath} @ ${ref}: HTTP ${res.status}`;
287
- // Rate limiting (403 with the budget exhausted, or 429) and upstream
288
- // 5xx are transient — surface them as a retryable "temporarily
289
- // unavailable" so the caller can serve a stale cache and the route can
290
- // map to 503 instead of a misleading 500. A 404 on the plugins prefix
291
- // itself means the canonical source path is gone (a real
292
- // misconfiguration), so it stays a hard error.
293
- if (isTransientUpstreamStatus(res)) {
294
- throw new PluginCatalogUnavailableError(detail, res.status);
295
- }
296
- throw new Error(detail);
297
- }
298
-
299
- const body = (await res.json()) as unknown;
300
- if (!Array.isArray(body)) {
301
- // A non-array body for a /contents/<dir> path means the path is a
302
- // file, not a directory — treat the prefix as empty rather than crash.
303
- return [];
304
- }
305
- return body as readonly GitHubContentEntry[];
306
- }
307
-
308
- /**
309
- * Wraps `fetchFn` with the headers we want to send to GitHub for every
310
- * request. Unauthenticated — the canonical source is a public repo, mirroring
311
- * `installPlugin` which uses the same envelope.
312
- */
313
- /**
314
- * Whether a non-OK GitHub response should be treated as a transient
315
- * "temporarily unavailable" failure rather than a hard error. Covers
316
- * rate limiting (429, or 403 once the rate-limit budget is exhausted) and
317
- * upstream server errors (5xx). A bare 403 without the rate-limit signal
318
- * (e.g. a genuine permissions problem) is not treated as transient.
319
- */
320
- function isTransientUpstreamStatus(res: Response): boolean {
321
- if (res.status === 429 || res.status >= 500) return true;
322
- if (res.status === 403) {
323
- return res.headers.get("x-ratelimit-remaining") === "0";
324
- }
325
- return false;
326
- }
327
-
328
- async function githubFetch(url: string, fetchFn: FetchLike): Promise<Response> {
329
- return fetchFn(url, {
330
- headers: {
331
- Accept: "application/vnd.github+json",
332
- "User-Agent": "vellum-assistant-cli",
333
- },
334
- });
335
- }
@@ -49,6 +49,7 @@ import { registerStatusCommand } from "./commands/status.js";
49
49
  import { registerSttCommand } from "./commands/stt.js";
50
50
  import { registerTaskCommand } from "./commands/task.js";
51
51
  import { registerTelemetryCommand } from "./commands/telemetry.js";
52
+ import { registerToolsCommand } from "./commands/tools.js";
52
53
  import { registerTrustCommand } from "./commands/trust.js";
53
54
  import { registerTtsCommand } from "./commands/tts.js";
54
55
  import { registerUiCommand } from "./commands/ui.js";
@@ -147,6 +148,7 @@ Examples:
147
148
  registerSttCommand(program);
148
149
  registerTaskCommand(program);
149
150
  registerTelemetryCommand(program);
151
+ registerToolsCommand(program);
150
152
  registerTrustCommand(program);
151
153
  registerTtsCommand(program);
152
154
  registerUiCommand(program);
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "🔗"
7
7
  vellum:
8
8
  display-name: "ACP"
9
+ category: "development"
9
10
  activation-hints:
10
11
  - "User asks to use Claude Code, Codex, or Gemini to do something"
11
12
  - "User wants to delegate a coding task to Claude Code, Codex, Gemini, or another ACP agent"
@@ -5,6 +5,7 @@ metadata:
5
5
  emoji: "🛠️"
6
6
  vellum:
7
7
  display-name: "App Builder"
8
+ category: "development"
8
9
  activation-hints:
9
10
  - "User asks to build a dashboard, tracker, calculator, data visualization, chart, simple landing page, or slide deck for their own use"
10
11
  - "User asks to visualize something, make a chart, or build an artifact — build a real persistent app here, never a ui_show dynamic_page"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "🎯"
7
7
  vellum:
8
8
  display-name: "App Control"
9
+ category: "system"
9
10
  feature-flag: "app-control"
10
11
  activation-hints:
11
12
  - "User explicitly directs the assistant to drive a specific named app via raw input (emulator, game, OpenGL canvas, custom-rendered Electron app)"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "🖥️"
7
7
  vellum:
8
8
  display-name: "Computer Use"
9
+ category: "system"
9
10
  activation-hints:
10
11
  - "User asks the assistant to click, type, drag, or interact with the macOS GUI directly"
11
12
  - "User wants control of a desktop app with no CLI or API alternative (games, design tools, visual workflows)"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "👥"
7
7
  vellum:
8
8
  display-name: "Contacts"
9
+ category: "productivity"
9
10
  activation-hints:
10
11
  - "Look up contact info before asking the user for email addresses or phone numbers"
11
12
  - "User wants to manage who can message the assistant, or create/revoke invite links"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "✍️"
7
7
  vellum:
8
8
  display-name: "Document Writer"
9
+ category: "content"
9
10
  activation-hints:
10
11
  - "User asks to write, draft, or compose an article, blog post, essay, report, story, or any long-form content — always create it in the document editor, not as a chat reply"
11
12
  - "User wants written content they will iterate on, review, or export — use the editor instead of inline markdown"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "📨"
7
7
  vellum:
8
8
  display-name: "Followups"
9
+ category: "messaging"
9
10
  ---
10
11
 
11
12
  Track messages sent on external channels (email, Slack, WhatsApp, etc.) that are awaiting a response.
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "🎨"
7
7
  vellum:
8
8
  display-name: "Image Studio"
9
+ category: "content"
9
10
  activation-hints:
10
11
  - "User asks to generate, draw, or create an image from a text prompt"
11
12
  - "User wants to edit an existing image — background removal, in-painting, style change, retouching"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "🎬"
7
7
  vellum:
8
8
  display-name: "Media Processing"
9
+ category: "content"
9
10
  activation-hints:
10
11
  - "User wants to ingest, process, or analyze a local video, audio, or image file"
11
12
  - "User wants to ask natural-language questions about a video's content (e.g. 'what happens at 3:14', 'find all the goals', 'who appears in this footage')"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "\U0001F4AC"
7
7
  vellum:
8
8
  display-name: "Messaging"
9
+ category: "messaging"
9
10
  activation-hints:
10
11
  - "Email, messaging, inbox management, read/send/search on any platform"
11
12
  - "Handles credential flows -- do not improvise setup instructions"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "📞"
7
7
  vellum:
8
8
  display-name: "Phone Calls"
9
+ category: "voice"
9
10
  includes:
10
11
  - "twilio-setup"
11
12
  - "public-ingress"
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "📖"
7
7
  vellum:
8
8
  display-name: "Playbooks"
9
+ category: "productivity"
9
10
  ---
10
11
 
11
12
  Playbooks are trigger-action automation rules that tell the assistant how to handle incoming messages matching a pattern.
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "📅"
7
7
  vellum:
8
8
  display-name: "Schedule"
9
+ category: "productivity"
9
10
  activation-hints:
10
11
  - "User wants to set a reminder for a future time (e.g. 'remind me at 9am tomorrow', 'remind me to take meds at 8pm')"
11
12
  - "User wants to schedule a recurring task or automation (e.g. 'every weekday at 9am', 'every Monday at noon')"
@@ -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. Always provide a concise description of what the schedule does and why. 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": {
@@ -13,6 +13,10 @@
13
13
  "type": "string",
14
14
  "description": "A human-readable name for the scheduled task"
15
15
  },
16
+ "description": {
17
+ "type": "string",
18
+ "description": "Required concise authored description of what it does and why. Keep this distinct from the timing/cadence."
19
+ },
16
20
  "syntax": {
17
21
  "type": "string",
18
22
  "enum": ["cron", "rrule"],
@@ -77,7 +81,7 @@
77
81
  "description": "For script mode: maximum time in milliseconds the shell command may run before it is killed. Defaults to 60000 (60s). Allowed range: 1000 to 1800000."
78
82
  }
79
83
  },
80
- "required": ["name"]
84
+ "required": ["name", "description"]
81
85
  },
82
86
  "executor": "tools/schedule-create.ts",
83
87
  "execution_target": "host"
@@ -106,7 +110,7 @@
106
110
  },
107
111
  {
108
112
  "name": "schedule_update",
109
- "description": "Update an existing scheduled automation (expression, syntax, message, name, enabled state, mode, or routing)",
113
+ "description": "Update an existing scheduled automation (expression, syntax, message, name, description, enabled state, mode, or routing)",
110
114
  "category": "schedule",
111
115
  "risk": "medium",
112
116
  "input_schema": {
@@ -120,6 +124,10 @@
120
124
  "type": "string",
121
125
  "description": "New name for the job"
122
126
  },
127
+ "description": {
128
+ "type": "string",
129
+ "description": "New concise authored description of what the schedule does and why. Keep this distinct from the timing/cadence."
130
+ },
123
131
  "syntax": {
124
132
  "type": "string",
125
133
  "enum": ["cron", "rrule"],
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "📧"
7
7
  vellum:
8
8
  display-name: "Email Sequences"
9
+ category: "email"
9
10
  ---
10
11
 
11
12
  You are an email sequence assistant. Use the sequence tools to help users create and manage automated multi-step email drip campaigns.
@@ -6,6 +6,7 @@ metadata:
6
6
  emoji: "\u2699\uFE0F"
7
7
  vellum:
8
8
  display-name: "Settings"
9
+ category: "system"
9
10
  activation-hints:
10
11
  - "User wants to change the assistant's voice, TTS provider, or speech output"
11
12
  - "User wants to rebind the push-to-talk key or adjust microphone / conversation timeout"