@vellumai/assistant 0.8.8 → 0.8.9-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 (340) hide show
  1. package/bun.lock +2 -2
  2. package/examples/plugins/echo/README.md +61 -60
  3. package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
  4. package/examples/plugins/echo/hooks/stop.ts +16 -0
  5. package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
  6. package/examples/plugins/echo/package.json +1 -2
  7. package/examples/plugins/echo/src/emit.ts +19 -0
  8. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
  9. package/openapi.yaml +236 -6
  10. package/package.json +2 -2
  11. package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
  12. package/src/__tests__/agent-loop-exit-reason.test.ts +185 -140
  13. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
  14. package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
  15. package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
  16. package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
  17. package/src/__tests__/agent-loop-thinking.test.ts +36 -20
  18. package/src/__tests__/agent-loop.test.ts +441 -96
  19. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
  20. package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
  21. package/src/__tests__/anthropic-provider.test.ts +1 -1
  22. package/src/__tests__/app-control-flow.test.ts +1 -1
  23. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  24. package/src/__tests__/approval-cascade.test.ts +5 -4
  25. package/src/__tests__/approval-routes-http.test.ts +4 -1
  26. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
  27. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  28. package/src/__tests__/channel-approvals.test.ts +1 -1
  29. package/src/__tests__/compaction-circuit.test.ts +258 -0
  30. package/src/__tests__/compaction-direct.test.ts +132 -0
  31. package/src/__tests__/compaction-events.test.ts +5 -5
  32. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -4
  33. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
  34. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +59 -103
  35. package/src/__tests__/conversation-agent-loop-overflow.test.ts +94 -189
  36. package/src/__tests__/conversation-agent-loop.test.ts +249 -490
  37. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  38. package/src/__tests__/conversation-confirmation-signals.test.ts +5 -4
  39. package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
  40. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -4
  41. package/src/__tests__/conversation-process-callsite.test.ts +14 -14
  42. package/src/__tests__/conversation-provider-retry-repair.test.ts +18 -16
  43. package/src/__tests__/conversation-queue.test.ts +9 -9
  44. package/src/__tests__/conversation-runtime-assembly.test.ts +923 -231
  45. package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
  46. package/src/__tests__/conversation-slash-queue.test.ts +6 -4
  47. package/src/__tests__/conversation-slash-unknown.test.ts +6 -4
  48. package/src/__tests__/conversation-speed-override.test.ts +10 -9
  49. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  50. package/src/__tests__/conversation-workspace-cache-state.test.ts +23 -20
  51. package/src/__tests__/conversation-workspace-injection.test.ts +68 -6
  52. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +14 -11
  53. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  54. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  55. package/src/__tests__/db-acp-history.test.ts +101 -0
  56. package/src/__tests__/dynamic-page-surface.test.ts +31 -0
  57. package/src/__tests__/empty-response-hook.test.ts +1 -1
  58. package/src/__tests__/file-write-tool.test.ts +63 -0
  59. package/src/__tests__/gateway-only-guard.test.ts +12 -2
  60. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  61. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  62. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  63. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  64. package/src/__tests__/heartbeat-service.test.ts +1 -0
  65. package/src/__tests__/history-repair-hook.test.ts +1 -1
  66. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  67. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  68. package/src/__tests__/inference-profile-reaper.test.ts +62 -0
  69. package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
  70. package/src/__tests__/injector-background-turn.test.ts +13 -23
  71. package/src/__tests__/injector-chain.test.ts +268 -44
  72. package/src/__tests__/injector-disk-pressure.test.ts +210 -52
  73. package/src/__tests__/injector-document-comments.test.ts +97 -114
  74. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  75. package/src/__tests__/injector-v3-suppression.test.ts +4 -4
  76. package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
  77. package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
  78. package/src/__tests__/memory-retrieval-hook.test.ts +73 -6
  79. package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
  80. package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
  81. package/src/__tests__/plugin-api-shim.test.ts +6 -9
  82. package/src/__tests__/plugin-bootstrap.test.ts +12 -23
  83. package/src/__tests__/plugin-registry.test.ts +3 -49
  84. package/src/__tests__/plugin-types.test.ts +0 -70
  85. package/src/__tests__/reaction-persistence.test.ts +1 -1
  86. package/src/__tests__/send-endpoint-busy.test.ts +4 -1
  87. package/src/__tests__/skill-feature-flags-integration.test.ts +33 -0
  88. package/src/__tests__/steer-tool-repair.test.ts +1 -1
  89. package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
  90. package/src/__tests__/subagent-detail.test.ts +25 -7
  91. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  92. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  93. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  94. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  95. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  96. package/src/__tests__/title-generate-hook.test.ts +1 -1
  97. package/src/__tests__/tool-error-hook.test.ts +1 -1
  98. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
  99. package/src/__tests__/user-plugin-loader.test.ts +54 -286
  100. package/src/acp/__tests__/agent-process.test.ts +161 -0
  101. package/src/acp/__tests__/client-handler.test.ts +40 -0
  102. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  103. package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
  104. package/src/acp/__tests__/prepare-agent-env.test.ts +137 -0
  105. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  106. package/src/acp/__tests__/session-manager-resume.test.ts +736 -0
  107. package/src/acp/agent-process.ts +61 -1
  108. package/src/acp/auto-install.test.ts +196 -0
  109. package/src/acp/auto-install.ts +177 -0
  110. package/src/acp/client-handler.ts +31 -0
  111. package/src/acp/feature-gate.test.ts +48 -0
  112. package/src/acp/feature-gate.ts +34 -0
  113. package/src/acp/prepare-agent-env.ts +83 -29
  114. package/src/acp/resolve-agent.test.ts +320 -7
  115. package/src/acp/resolve-agent.ts +182 -18
  116. package/src/acp/resume-hint.ts +25 -0
  117. package/src/acp/session-manager.ts +495 -73
  118. package/src/acp/types.ts +8 -0
  119. package/src/agent/compaction-circuit.ts +60 -102
  120. package/src/agent/loop.ts +390 -240
  121. package/src/api/responses/conversation-message.ts +14 -1
  122. package/src/approvals/guardian-request-resolvers.ts +1 -1
  123. package/src/background-wake/next-wake.ts +1 -0
  124. package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
  125. package/src/cli/commands/plugins.ts +43 -37
  126. package/src/cli/lib/__tests__/install-from-github.test.ts +429 -111
  127. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
  128. package/src/cli/lib/__tests__/plugin-details.test.ts +372 -0
  129. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +220 -0
  130. package/src/cli/lib/__tests__/search-plugins.test.ts +226 -32
  131. package/src/cli/lib/install-from-github.ts +464 -55
  132. package/src/cli/lib/plugin-catalog-cache.ts +84 -0
  133. package/src/cli/lib/plugin-details.ts +409 -0
  134. package/src/cli/lib/plugin-marketplace.ts +197 -0
  135. package/src/cli/lib/search-plugins.ts +195 -29
  136. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  137. package/src/config/acp-defaults.test.ts +10 -0
  138. package/src/config/acp-defaults.ts +6 -0
  139. package/src/config/bundled-skills/acp/SKILL.md +83 -31
  140. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  141. package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
  142. package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
  143. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  144. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  145. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  146. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  147. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  148. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  149. package/src/config/bundled-tool-registry.ts +2 -0
  150. package/src/config/feature-flag-registry.json +14 -5
  151. package/src/config/schemas/heartbeat.ts +9 -0
  152. package/src/context/strip-injections.ts +8 -2
  153. package/src/context/window-manager.ts +27 -13
  154. package/src/daemon/conversation-agent-loop-handlers.ts +10 -35
  155. package/src/daemon/conversation-agent-loop.ts +167 -1005
  156. package/src/daemon/conversation-lifecycle.ts +11 -255
  157. package/src/daemon/conversation-process.ts +8 -136
  158. package/src/daemon/conversation-registry.ts +159 -0
  159. package/src/daemon/conversation-runtime-assembly.ts +293 -392
  160. package/src/daemon/conversation-store.ts +9 -90
  161. package/src/daemon/conversation-surfaces.ts +24 -8
  162. package/src/daemon/conversation-workspace.ts +17 -0
  163. package/src/daemon/conversation.ts +383 -56
  164. package/src/daemon/external-plugins-bootstrap.ts +14 -19
  165. package/src/daemon/handlers/conversations.ts +3 -1
  166. package/src/daemon/handlers/skills.ts +4 -1
  167. package/src/daemon/host-proxy-preactivation.ts +1 -3
  168. package/src/daemon/lifecycle.ts +21 -0
  169. package/src/daemon/server.ts +2 -0
  170. package/src/daemon/wake-conversation-ops.ts +269 -0
  171. package/src/embedded/plugin-api.ts +2 -2
  172. package/src/export/__tests__/transcript-formatter.test.ts +5 -0
  173. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
  174. package/src/heartbeat/heartbeat-run-store.ts +23 -1
  175. package/src/heartbeat/heartbeat-service.ts +26 -0
  176. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  177. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  178. package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
  179. package/src/ipc/skill-routes/memory.ts +4 -2
  180. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
  181. package/src/memory/conversation-crud.ts +29 -19
  182. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  183. package/src/memory/db-init.ts +2 -0
  184. package/src/memory/job-handlers/conversation-starters.ts +13 -2
  185. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
  186. package/src/memory/jobs-worker.ts +25 -1
  187. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  188. package/src/memory/migrations/index.ts +1 -0
  189. package/src/memory/schema/acp.ts +4 -0
  190. package/src/memory/v2/__tests__/consolidation-job.test.ts +3 -3
  191. package/src/memory/v2/consolidation-job.ts +13 -4
  192. package/src/plugin-api/constants.ts +4 -0
  193. package/src/plugin-api/index.ts +6 -5
  194. package/src/plugin-api/types.ts +75 -0
  195. package/src/plugins/defaults/compaction/compact.ts +59 -0
  196. package/src/plugins/defaults/compaction/manager-store.ts +44 -0
  197. package/src/plugins/defaults/compaction/package.json +1 -2
  198. package/src/plugins/defaults/empty-response/package.json +0 -1
  199. package/src/plugins/defaults/history-repair/package.json +0 -1
  200. package/src/plugins/defaults/index.ts +135 -26
  201. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +103 -38
  202. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +167 -56
  203. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
  204. package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
  205. package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
  206. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/assign.test.ts +4 -4
  207. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +9 -6
  208. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/maintain-job.test.ts +5 -5
  209. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/orchestrate.test.ts +8 -5
  210. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/reconcile.test.ts +2 -2
  211. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/render-injection.test.ts +1 -1
  212. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/router.test.ts +10 -5
  213. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +8 -8
  214. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selector.test.ts +5 -5
  215. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/shadow-plugin.test.ts +16 -17
  216. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -2
  217. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/assign.ts +9 -5
  218. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/capabilities.ts +5 -2
  219. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  220. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  221. package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
  222. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/maintain-job.ts +15 -8
  223. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/orchestrate.ts +2 -2
  224. package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
  225. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/page-content.ts +2 -2
  226. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/provider-blocks.ts +1 -1
  227. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/reconcile.ts +7 -3
  228. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +1 -1
  229. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/router.ts +5 -5
  230. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selection-log-store.ts +4 -4
  231. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selector.ts +7 -7
  232. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/shadow-plugin.ts +32 -94
  233. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/tree.ts +1 -1
  234. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/types.ts +1 -1
  235. package/src/plugins/defaults/title-generate/package.json +0 -1
  236. package/src/plugins/defaults/tool-error/package.json +0 -1
  237. package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
  238. package/src/plugins/pipeline.ts +6 -293
  239. package/src/plugins/registry.ts +9 -37
  240. package/src/plugins/types.ts +76 -381
  241. package/src/plugins/user-loader.ts +30 -127
  242. package/src/proactive-artifact/aux-message-injector.ts +1 -1
  243. package/src/proactive-artifact/job.test.ts +1 -1
  244. package/src/prompts/__tests__/system-prompt.test.ts +6 -0
  245. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +35 -3
  246. package/src/runtime/__tests__/agent-wake.test.ts +555 -691
  247. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  248. package/src/runtime/agent-wake.ts +108 -209
  249. package/src/runtime/assistant-event-hub.ts +1 -1
  250. package/src/runtime/channel-approvals.ts +1 -1
  251. package/src/runtime/interactive-ui.ts +1 -1
  252. package/src/runtime/routes/__tests__/acp-routes.test.ts +283 -55
  253. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  254. package/src/runtime/routes/__tests__/plugins-routes.test.ts +398 -73
  255. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  256. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  257. package/src/runtime/routes/acp-routes.test.ts +89 -25
  258. package/src/runtime/routes/acp-routes.ts +81 -29
  259. package/src/runtime/routes/approval-routes.ts +1 -1
  260. package/src/runtime/routes/browser-routes.ts +1 -1
  261. package/src/runtime/routes/browser-tabs-routes.ts +6 -10
  262. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  263. package/src/runtime/routes/conversation-list-routes.ts +1 -1
  264. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  265. package/src/runtime/routes/conversation-routes.ts +28 -2
  266. package/src/runtime/routes/conversation-starter-routes.ts +13 -7
  267. package/src/runtime/routes/conversations-import-routes.ts +24 -7
  268. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  269. package/src/runtime/routes/host-cu-routes.ts +1 -1
  270. package/src/runtime/routes/identity-routes.ts +18 -3
  271. package/src/runtime/routes/inbound-message-handler.ts +1 -1
  272. package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
  273. package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
  274. package/src/runtime/routes/memory-v3-routes.ts +16 -6
  275. package/src/runtime/routes/playground/helpers.ts +1 -1
  276. package/src/runtime/routes/plugins-routes.ts +336 -35
  277. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  278. package/src/runtime/routes/work-items-routes.ts +2 -4
  279. package/src/runtime/services/conversation-serializer.ts +1 -1
  280. package/src/signals/cancel.ts +2 -4
  281. package/src/subagent/manager.ts +21 -5
  282. package/src/tools/acp/context.ts +20 -0
  283. package/src/tools/acp/list-agents.test.ts +7 -1
  284. package/src/tools/acp/spawn.test.ts +158 -55
  285. package/src/tools/acp/spawn.ts +47 -72
  286. package/src/tools/acp/steer.test.ts +105 -8
  287. package/src/tools/acp/steer.ts +48 -17
  288. package/src/tools/apps/executors.ts +13 -8
  289. package/src/tools/filesystem/write.ts +34 -0
  290. package/src/tools/subagent/spawn.ts +2 -4
  291. package/src/tools/ui-surface/definitions.ts +25 -5
  292. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  293. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
  294. package/docs/plugins.md +0 -832
  295. package/examples/plugins/echo/register.ts +0 -143
  296. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  297. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  298. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
  299. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
  300. package/src/__tests__/pipeline-runner.test.ts +0 -554
  301. package/src/__tests__/plugin-external-api.test.ts +0 -68
  302. package/src/daemon/wake-target-adapter.ts +0 -253
  303. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
  304. package/src/plugins/defaults/circuit-breaker/package.json +0 -15
  305. package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
  306. package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
  307. package/src/plugins/defaults/compaction/register.ts +0 -35
  308. package/src/plugins/defaults/compaction/terminal.ts +0 -73
  309. package/src/plugins/defaults/empty-response/register.ts +0 -23
  310. package/src/plugins/defaults/history-repair/register.ts +0 -24
  311. package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
  312. package/src/plugins/defaults/overflow-reduce/package.json +0 -15
  313. package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
  314. package/src/plugins/defaults/title-generate/register.ts +0 -35
  315. package/src/plugins/defaults/tool-error/register.ts +0 -23
  316. package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
  317. package/src/plugins/external-api.ts +0 -104
  318. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/capabilities.test.ts +0 -0
  319. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/core.test.ts +0 -0
  320. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
  321. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
  322. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/health.test.ts +0 -0
  323. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/needle.test.ts +0 -0
  324. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/provider-blocks.test.ts +0 -0
  325. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/snapshot.test.ts +0 -0
  326. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/tree.test.ts +0 -0
  327. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
  328. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
  329. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/core.ts +0 -0
  330. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
  331. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
  332. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
  333. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
  334. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
  335. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
  336. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/health.ts +0 -0
  337. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
  338. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/needle.ts +0 -0
  339. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/snapshot.ts +0 -0
  340. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +0 -0
package/bun.lock CHANGED
@@ -5,7 +5,7 @@
5
5
  "": {
6
6
  "name": "@vellumai/assistant",
7
7
  "dependencies": {
8
- "@agentclientprotocol/sdk": "0.16.1",
8
+ "@agentclientprotocol/sdk": "0.25.0",
9
9
  "@anthropic-ai/sdk": "0.78.0",
10
10
  "@google/genai": "1.45.0",
11
11
  "@modelcontextprotocol/sdk": "1.27.1",
@@ -71,7 +71,7 @@
71
71
  "path-to-regexp": "8.4.2",
72
72
  },
73
73
  "packages": {
74
- "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.16.1", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-1ad+Sc/0sCtZGHthxxvgEUo5Wsbw16I+aF+YwdiLnPwkZG8KAGUEAPK6LM6Pf69lCyJPt1Aomk1d+8oE3C4ZEw=="],
74
+ "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.25.0", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-wU1VgXNtMvdVotX49txc3WJUDV+/QbLpsgjMvFhlRmp37osdLbI7L7y+iwAlQATwfjLxcv1r1p3ZxZBcXlGhcQ=="],
75
75
 
76
76
  "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.78.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-PzQhR715td/m1UaaN5hHXjYB8Gl2lF9UVhrrGrZeysiF6Rb74Wc9GCB8hzLdzmQtBd1qe89F9OptgB9Za1Ib5w=="],
77
77
 
@@ -1,43 +1,59 @@
1
1
  # Echo plugin
2
2
 
3
- Minimal example plugin. Observes every assistant pipeline and logs one JSON
4
- line per invocation to `stderr`:
3
+ Minimal example plugin. Observes the assistant's turn-lifecycle hooks and logs
4
+ one JSON line per hook invocation to `stderr`:
5
5
 
6
6
  ```json
7
- {"plugin":"echo","pipeline":"compaction","durationMs":1590,"outcome":"success"}
8
- {"plugin":"echo","pipeline":"overflowReduce","durationMs":42,"outcome":"success"}
7
+ {
8
+ "plugin": "echo",
9
+ "hook": "post-tool-use",
10
+ "conversationId": "conv_abc123"
11
+ }
9
12
  ```
10
13
 
11
14
  Use this as a starting point for writing your own plugin, or as a quick way
12
- to eyeball which pipelines fire during a conversation and how long they
13
- take.
15
+ to eyeball which hooks fire during a conversation.
14
16
 
15
- For the full plugin authoring guide, see
16
- [`assistant/docs/plugins.md`](../../../docs/plugins.md).
17
+ For the full plugin authoring guide — manifest shape, every contribution
18
+ surface, hook patterns, and conventions — see
19
+ [`experimental/plugins/README.md`](../../../../experimental/plugins/README.md).
20
+ [`simple-memory`](../../../../experimental/plugins/simple-memory/) is the
21
+ canonical reference implementation that exercises every wired surface.
17
22
 
18
23
  ## What it does
19
24
 
20
- - Registers one observer middleware per slot in
21
- `PipelineMiddlewareMap` — `compaction`, `overflowReduce`, and
22
- `circuitBreaker`.
23
- - Each middleware calls `next(args)` to pass the request through unchanged,
24
- measures wall-clock duration, and emits one line to `stderr` whether the
25
- downstream succeeded or threw.
26
- - Never modifies arguments, never rewrites results, never swallows errors.
27
- It is purely observational — safe to stack alongside any other plugin.
25
+ - Contributes one observer hook per turn-lifecycle event:
26
+ `user-prompt-submit`, `post-tool-use`, and `stop`.
27
+ - Each hook emits one line to `stderr` and returns `void`, so the threaded
28
+ context flows through unchanged.
29
+ - Never modifies the turn's messages, tool results, or stop decision. It is
30
+ purely observational safe to stack alongside any other plugin.
31
+
32
+ ## Directory layout
33
+
34
+ The assistant discovers a plugin by its `package.json` manifest and builds the
35
+ `Plugin` from the interface directories — `hooks/<name>.ts` files whose default
36
+ export is the hook function. Files under `src/` are internal helpers and are
37
+ not walked by the loader.
38
+
39
+ ```
40
+ echo/
41
+ ├── package.json # Manifest (name + @vellumai/plugin-api range)
42
+ ├── README.md
43
+ ├── hooks/
44
+ │ ├── user-prompt-submit.ts # default export = hook function
45
+ │ ├── post-tool-use.ts
46
+ │ └── stop.ts
47
+ └── src/
48
+ └── emit.ts # shared stderr emitter (not a surface)
49
+ ```
28
50
 
29
51
  ## Install locally
30
52
 
31
53
  The assistant scans `<workspaceDir>/plugins/*` (e.g.
32
- `~/.vellum/workspace/plugins/`) for subdirectories containing a
33
- `register.{ts,js}` file and dynamic-imports each one during assistant
34
- startup. Dropping (or symlinking) this directory in place is enough to
35
- enable it.
36
-
37
- The plugin reads `registerPlugin` from `globalThis.__vellumPluginRuntime`,
38
- which the daemon attaches before scanning plugins. This works against both
39
- the `bun --compile`-bundled daemon binary AND a daemon running from
40
- source — no special install procedure required either way.
54
+ `~/.vellum/workspace/plugins/`) for subdirectories containing a `package.json`
55
+ and loads each one during assistant startup. Dropping (or symlinking) this
56
+ directory in place is enough to enable it.
41
57
 
42
58
  ### Option 1 — symlink from the repo (simplest in-repo dev)
43
59
 
@@ -54,23 +70,10 @@ pick up changes.
54
70
  ### Option 2 — standalone copy
55
71
 
56
72
  A plain `cp -R` of this directory into `~/.vellum/workspace/plugins/echo/`
57
- works for the runtime imports (which go through the global bridge), but
58
- the `import type` lines at the top of `register.ts` still resolve into
59
- the in-repo assistant source tree. If your standalone copy lives outside
60
- a vellum-assistant checkout, rewrite those `import type` paths to point
61
- at an absolute path inside any checkout — they're erased at compile time
62
- and have no module-identity effect at runtime:
63
-
64
- ```ts
65
- // before (repo-local):
66
- import type { VellumPluginRuntime } from "../../../src/plugins/external-api.js";
67
- import type { Plugin } from "../../../src/plugins/types.js";
68
- // after (standalone, edit to your checkout path):
69
- import type { VellumPluginRuntime } from "/path/to/vellum-assistant/assistant/src/plugins/external-api.js";
70
- import type { Plugin } from "/path/to/vellum-assistant/assistant/src/plugins/types.js";
71
- ```
72
-
73
- No runtime-import rewriting is needed — the bridge already handles that.
73
+ works as-is. The hooks import their types from the public `@vellumai/plugin-api`
74
+ specifier, which the daemon materializes as a workspace-level shim before it
75
+ loads any plugin so the copied directory resolves it without any path
76
+ rewriting, in or out of a vellum-assistant checkout.
74
77
 
75
78
  ### Restart the assistant
76
79
 
@@ -84,24 +87,23 @@ vellum restart
84
87
  ## Verify it works
85
88
 
86
89
  With the plugin installed and the assistant restarted, send any message
87
- that exercises a pipeline — a conversation turn, a tool call, a title
88
- generation — and tail the assistant's stderr log:
90
+ that exercises a turn — a conversation reply, a tool call and tail the
91
+ assistant's stderr log:
89
92
 
90
93
  ```bash
91
94
  tail -f ~/.vellum/daemon.log
92
95
  ```
93
96
 
94
- You should see one line per pipeline invocation, similar to:
97
+ You should see one line per hook invocation, similar to:
95
98
 
96
99
  ```json
97
- {"plugin":"echo","pipeline":"compaction","durationMs":1590,"outcome":"success"}
98
- {"plugin":"echo","pipeline":"overflowReduce","durationMs":42,"outcome":"success"}
100
+ {
101
+ "plugin": "echo",
102
+ "hook": "post-tool-use",
103
+ "conversationId": "conv_abc123"
104
+ }
99
105
  ```
100
106
 
101
- If a pipeline throws (for example, a tool that errors out), you'll see a
102
- line with `"outcome":"error"` — the plugin rethrows after logging so the
103
- original error still propagates.
104
-
105
107
  ## Uninstall
106
108
 
107
109
  Remove the symlink (or the copied directory) and restart the assistant:
@@ -113,14 +115,13 @@ vellum restart
113
115
 
114
116
  ## Next steps
115
117
 
116
- - Read [`assistant/docs/plugins.md`](../../../docs/plugins.md) for the full
117
- plugin authoring guide: manifest shape, middleware patterns
118
- (observe / transform / short-circuit / veto), strict-fail semantics, the
119
- per-pipeline timeout table, credential and config access, and
120
- troubleshooting.
118
+ - Read [`experimental/plugins/README.md`](../../../../experimental/plugins/README.md)
119
+ for the full plugin authoring guide: manifest shape, every contribution
120
+ surface, hook patterns (observe / transform), tool contributions, and
121
+ conventions.
121
122
  - Look at the first-party default plugins under
122
- `assistant/src/plugins/defaults/` for examples of non-observational
123
- middleware.
123
+ `assistant/src/plugins/defaults/` for examples of hooks that transform a
124
+ turn rather than just observing it.
124
125
  - Build your own plugin by copying this directory, renaming the manifest
125
- `name`, and replacing the observer with a middleware that does whatever
126
- you need.
126
+ `name`, and replacing the observer hooks with ones that do whatever you
127
+ need.
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `post-tool-use` hook for the echo plugin.
3
+ *
4
+ * Purely observational — logs one structured line to stderr and returns
5
+ * `void`, leaving the tool result untouched.
6
+ *
7
+ * Convention: the default export is the function the harness invokes.
8
+ */
9
+
10
+ import type { PostToolUseContext } from "@vellumai/plugin-api";
11
+
12
+ import { emit } from "../src/emit.js";
13
+
14
+ export default async function postToolUse(
15
+ ctx: PostToolUseContext,
16
+ ): Promise<void> {
17
+ emit("post-tool-use", ctx.conversationId);
18
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `stop` hook for the echo plugin.
3
+ *
4
+ * Purely observational — logs one structured line to stderr and returns
5
+ * `void`, leaving the stop decision untouched.
6
+ *
7
+ * Convention: the default export is the function the harness invokes.
8
+ */
9
+
10
+ import type { StopContext } from "@vellumai/plugin-api";
11
+
12
+ import { emit } from "../src/emit.js";
13
+
14
+ export default async function stop(ctx: StopContext): Promise<void> {
15
+ emit("stop", ctx.conversationId);
16
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `user-prompt-submit` hook for the echo plugin.
3
+ *
4
+ * Purely observational — logs one structured line to stderr and returns
5
+ * `void`, leaving the threaded context (message list, injections) untouched.
6
+ *
7
+ * Convention: the default export is the function the harness invokes.
8
+ */
9
+
10
+ import type { UserPromptSubmitContext } from "@vellumai/plugin-api";
11
+
12
+ import { emit } from "../src/emit.js";
13
+
14
+ export default async function userPromptSubmit(
15
+ ctx: UserPromptSubmitContext,
16
+ ): Promise<void> {
17
+ emit("user-prompt-submit", ctx.conversationId);
18
+ }
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "name": "@vellumai/plugin-echo-example",
3
3
  "version": "0.1.0",
4
- "description": "Example plugin that observes every assistant pipeline and logs one structured line per invocation to stderr. Meant as an authoring reference — not shipped with the assistant runtime.",
4
+ "description": "Example plugin that observes every assistant turn-lifecycle hook and logs one structured line per invocation to stderr. Meant as an authoring reference — not shipped with the assistant runtime.",
5
5
  "private": true,
6
6
  "license": "MIT",
7
7
  "type": "module",
8
- "main": "./register.ts",
9
8
  "engines": {
10
9
  "node": ">=20.12.0"
11
10
  },
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Shared stderr emitter for the echo plugin's hooks.
3
+ *
4
+ * Files under `src/` are internal helpers — the external-plugin loader does
5
+ * not walk this directory, so it contributes no surface of its own. The
6
+ * `hooks/` files import from here.
7
+ */
8
+
9
+ export const PLUGIN_NAME = "echo";
10
+
11
+ /**
12
+ * One line written to stderr per hook invocation. Kept intentionally compact —
13
+ * pino-style JSON so operators can pipe the assistant's stderr through `jq`
14
+ * without reshaping.
15
+ */
16
+ export function emit(hook: string, conversationId: string): void {
17
+ const record = { plugin: PLUGIN_NAME, hook, conversationId };
18
+ process.stderr.write(`${JSON.stringify(record)}\n`);
19
+ }
@@ -194,8 +194,12 @@ export interface ProvidersFacet {
194
194
  // Memory
195
195
  // ---------------------------------------------------------------------------
196
196
 
197
- /** Valid message roles for `memory.addMessage`. */
198
- export type MessageRole = "user" | "assistant" | "system";
197
+ /**
198
+ * Valid message roles for `memory.addMessage`. The messages store is
199
+ * UI-facing (`ConversationMessage`), so only renderable turns are accepted —
200
+ * agent-context `system` rows are not persisted via this facet.
201
+ */
202
+ export type MessageRole = "user" | "assistant";
199
203
 
200
204
  /**
201
205
  * Callable signature for `memory.addMessage`. Mirrors the daemon's
@@ -247,10 +251,7 @@ export interface Subscription {
247
251
  export interface EventsFacet {
248
252
  publish(event: AssistantEvent): Promise<void>;
249
253
  subscribe(filter: Filter, cb: AssistantEventCallback): Subscription;
250
- buildEvent(
251
- message: ServerMessage,
252
- conversationId?: string,
253
- ): AssistantEvent;
254
+ buildEvent(message: ServerMessage, conversationId?: string): AssistantEvent;
254
255
  }
255
256
 
256
257
  // ---------------------------------------------------------------------------
package/openapi.yaml CHANGED
@@ -95,7 +95,9 @@ paths:
95
95
  post:
96
96
  operationId: acp_by_id_steer_post
97
97
  summary: Steer ACP session
98
- description: Send a steering instruction to an active ACP session.
98
+ description:
99
+ Send a steering instruction to an ACP session. Sessions no longer in memory (completed, or lost to a daemon
100
+ restart) are transparently resumed from persisted history first, when the agent supports ACP session loading.
99
101
  tags:
100
102
  - acp
101
103
  responses:
@@ -110,6 +112,9 @@ paths:
110
112
  type: string
111
113
  steered:
112
114
  type: boolean
115
+ resumed:
116
+ description: True when the session was resumed from persisted history before steering.
117
+ type: boolean
113
118
  required:
114
119
  - acpSessionId
115
120
  - steered
@@ -136,7 +141,9 @@ paths:
136
141
  delete:
137
142
  operationId: acp_sessions_delete
138
143
  summary: Bulk-clear terminal ACP sessions
139
- description: Remove every terminal-state row (completed/failed/cancelled) from the persisted acp_session_history table.
144
+ description:
145
+ Remove every terminal-state row (completed/failed/cancelled) from the persisted acp_session_history table.
146
+ Rows whose session is currently active in memory (e.g. resumed) or has a resume in flight are excluded.
140
147
  tags:
141
148
  - acp
142
149
  responses:
@@ -238,8 +245,8 @@ paths:
238
245
  operationId: acp_sessions_by_id_delete
239
246
  summary: Delete ACP session from history
240
247
  description:
241
- Remove a persisted ACP session row. Rejects with 409 when the session is still active in memory; idempotent
242
- for unknown ids.
248
+ Remove a persisted ACP session row. Rejects with 409 when the session is still active in memory or has a
249
+ resume in flight; idempotent for unknown ids.
243
250
  tags:
244
251
  - acp
245
252
  responses:
@@ -16020,8 +16027,13 @@ paths:
16020
16027
  type: array
16021
16028
  items:
16022
16029
  type: string
16030
+ clientMessageId:
16031
+ type: string
16023
16032
  role:
16024
16033
  type: string
16034
+ enum:
16035
+ - user
16036
+ - assistant
16025
16037
  content:
16026
16038
  type: string
16027
16039
  timestamp:
@@ -16985,6 +16997,12 @@ paths:
16985
16997
  type: string
16986
16998
  clientTimezone:
16987
16999
  type: string
17000
+ clientMessageId:
17001
+ type: string
17002
+ description:
17003
+ Client-generated idempotency nonce. Persisted on the row and echoed back on the message_echo event and the
17004
+ messages snapshot so the client can correlate its optimistic row by identity. Duplicate sends for
17005
+ the same (conversation, clientMessageId) are deduplicated server-side.
16988
17006
  inferenceProfile:
16989
17007
  anyOf:
16990
17008
  - type: string
@@ -19416,6 +19434,182 @@ paths:
19416
19434
  required: true
19417
19435
  schema:
19418
19436
  type: string
19437
+ get:
19438
+ operationId: plugins_by_name_get
19439
+ summary: Get a plugin's detail view
19440
+ description:
19441
+ Resolve a single plugin's tracked metadata (description, homepage, license, version, source) plus its
19442
+ README markdown. Unions the locally installed copy, the marketplace manifest, and the plugin's repository at the
19443
+ pinned ref — preferring the installed copy. Names that are neither installed nor present in the catalog return
19444
+ 404. Powers the web plugin detail page; mirrors `GET /v1/skills/:id`.
19445
+ tags:
19446
+ - plugins
19447
+ responses:
19448
+ "200":
19449
+ description: Successful response
19450
+ content:
19451
+ application/json:
19452
+ schema:
19453
+ type: object
19454
+ properties:
19455
+ name:
19456
+ type: string
19457
+ description: Install name. Matches `assistant plugins install <name>`.
19458
+ installed:
19459
+ type: boolean
19460
+ description: Whether a copy is materialized under `<workspaceDir>/plugins/<name>/`.
19461
+ description:
19462
+ anyOf:
19463
+ - type: string
19464
+ - type: "null"
19465
+ description: Short description, best-effort across disk, manifest, and repo.
19466
+ homepage:
19467
+ anyOf:
19468
+ - type: string
19469
+ - type: "null"
19470
+ description: Project homepage URL, when known.
19471
+ license:
19472
+ anyOf:
19473
+ - type: string
19474
+ - type: "null"
19475
+ description: SPDX license expression, when known.
19476
+ version:
19477
+ anyOf:
19478
+ - type: string
19479
+ - type: "null"
19480
+ description: Resolved version (installed copy first, then repo `package.json`).
19481
+ source:
19482
+ oneOf:
19483
+ - type: object
19484
+ properties:
19485
+ kind:
19486
+ type: string
19487
+ const: first-party
19488
+ required:
19489
+ - kind
19490
+ additionalProperties: false
19491
+ - type: object
19492
+ properties:
19493
+ kind:
19494
+ type: string
19495
+ const: github
19496
+ repo:
19497
+ type: string
19498
+ description: "`owner/repo` of the external plugin repository."
19499
+ path:
19500
+ description: Directory within the repo, when the plugin is not at the root.
19501
+ type: string
19502
+ ref:
19503
+ type: string
19504
+ description: Pinned git ref the plugin is fetched from.
19505
+ required:
19506
+ - kind
19507
+ - repo
19508
+ - ref
19509
+ additionalProperties: false
19510
+ description: "Origin of the match: a first-party in-repo plugin or a whitelisted external one."
19511
+ readme:
19512
+ anyOf:
19513
+ - type: string
19514
+ - type: "null"
19515
+ description: README markdown, or null when the plugin ships none.
19516
+ ref:
19517
+ type: string
19518
+ description: Git ref the catalog metadata / README were resolved at.
19519
+ required:
19520
+ - name
19521
+ - installed
19522
+ - description
19523
+ - homepage
19524
+ - license
19525
+ - version
19526
+ - source
19527
+ - readme
19528
+ - ref
19529
+ additionalProperties: false
19530
+ "400":
19531
+ description: The plugin name failed sanitization (e.g. contained slashes, dots, or uppercase letters).
19532
+ "404":
19533
+ description: No installed copy and no catalog entry claims the given name.
19534
+ parameters:
19535
+ - name: name
19536
+ in: path
19537
+ required: true
19538
+ schema:
19539
+ type: string
19540
+ - name: ref
19541
+ in: query
19542
+ required: false
19543
+ schema:
19544
+ type: string
19545
+ description: Optional git ref to read catalog metadata / README at. Defaults to the CLI's `DEFAULT_PLUGIN_REF`.
19546
+ /v1/plugins/install:
19547
+ post:
19548
+ operationId: plugins_install_post
19549
+ summary: Install a plugin
19550
+ description:
19551
+ Install a plugin by name from the canonical source — a whitelisted `experimental/plugins/marketplace.json`
19552
+ entry, else the first-party `experimental/plugins/<name>/` convention. Materializes the plugin under
19553
+ `<workspaceDir>/plugins/<name>/`; the assistant must be restarted to load it. Mirrors the CLI's `assistant
19554
+ plugins install <name>`. An already-installed name without `force` returns 409; a name that resolves to nothing
19555
+ at the ref returns 404. Sibling to `POST /v1/skills/install`.
19556
+ tags:
19557
+ - plugins
19558
+ responses:
19559
+ "200":
19560
+ description: Successful response
19561
+ content:
19562
+ application/json:
19563
+ schema:
19564
+ type: object
19565
+ properties:
19566
+ ok:
19567
+ type: boolean
19568
+ const: true
19569
+ name:
19570
+ type: string
19571
+ description: Install name that was materialized.
19572
+ target:
19573
+ type: string
19574
+ description: Absolute path the plugin was materialized into on the host.
19575
+ fileCount:
19576
+ type: number
19577
+ description: Number of files written for the installed plugin.
19578
+ ref:
19579
+ type: string
19580
+ description: Git ref the plugin was fetched from.
19581
+ required:
19582
+ - ok
19583
+ - name
19584
+ - target
19585
+ - fileCount
19586
+ - ref
19587
+ additionalProperties: false
19588
+ "400":
19589
+ description: The request body was missing `name` or the name failed sanitization.
19590
+ "404":
19591
+ description: No plugin resolves to the given name at the requested ref.
19592
+ "409":
19593
+ description: A plugin with the same name is already installed and `force` was not set.
19594
+ requestBody:
19595
+ required: true
19596
+ content:
19597
+ application/json:
19598
+ schema:
19599
+ type: object
19600
+ properties:
19601
+ name:
19602
+ type: string
19603
+ description: Install name to resolve against the catalog (first-party directory or marketplace entry).
19604
+ ref:
19605
+ description: Optional git ref to install from. Defaults to the CLI's `DEFAULT_PLUGIN_REF`.
19606
+ type: string
19607
+ force:
19608
+ description: Overwrite an existing install in place. Defaults to false.
19609
+ type: boolean
19610
+ required:
19611
+ - name
19612
+ additionalProperties: false
19419
19613
  /v1/plugins/search:
19420
19614
  get:
19421
19615
  operationId: plugins_search_get
@@ -19447,13 +19641,49 @@ paths:
19447
19641
  properties:
19448
19642
  name:
19449
19643
  type: string
19450
- description: Directory name under `experimental/plugins/`. Matches `assistant plugins install <name>`.
19644
+ description: Install name. Matches `assistant plugins install <name>`.
19451
19645
  path:
19452
19646
  type: string
19453
- description: Repo-relative path of the match (e.g. `experimental/plugins/<name>`).
19647
+ description:
19648
+ "Human-readable origin: a repo-relative path (`experimental/plugins/<name>`) for first-party plugins or a
19649
+ `github:owner/repo@ref` locator for external ones."
19650
+ description:
19651
+ description: Short description, when known (external entries only today).
19652
+ type: string
19653
+ source:
19654
+ oneOf:
19655
+ - type: object
19656
+ properties:
19657
+ kind:
19658
+ type: string
19659
+ const: first-party
19660
+ required:
19661
+ - kind
19662
+ additionalProperties: false
19663
+ - type: object
19664
+ properties:
19665
+ kind:
19666
+ type: string
19667
+ const: github
19668
+ repo:
19669
+ type: string
19670
+ description: "`owner/repo` of the external plugin repository."
19671
+ path:
19672
+ description: Directory within the repo, when the plugin is not at the root.
19673
+ type: string
19674
+ ref:
19675
+ type: string
19676
+ description: Pinned git ref the plugin is fetched from.
19677
+ required:
19678
+ - kind
19679
+ - repo
19680
+ - ref
19681
+ additionalProperties: false
19682
+ description: "Origin of the match: a first-party in-repo plugin or a whitelisted external one."
19454
19683
  required:
19455
19684
  - name
19456
19685
  - path
19686
+ - source
19457
19687
  additionalProperties: false
19458
19688
  description: Directory matches, sorted alphabetically by name.
19459
19689
  required:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/assistant",
3
- "version": "0.8.8",
3
+ "version": "0.8.9-staging.1",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -33,7 +33,7 @@
33
33
  "prepack": "node ../scripts/prepack-bundled-deps.mjs"
34
34
  },
35
35
  "dependencies": {
36
- "@agentclientprotocol/sdk": "0.16.1",
36
+ "@agentclientprotocol/sdk": "0.25.0",
37
37
  "@anthropic-ai/sdk": "0.78.0",
38
38
  "@google/genai": "1.45.0",
39
39
  "@modelcontextprotocol/sdk": "1.27.1",