@vellumai/assistant 0.8.8 → 0.8.9-staging.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/ARCHITECTURE.md +6 -6
  2. package/bun.lock +2 -2
  3. package/examples/plugins/echo/README.md +61 -60
  4. package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
  5. package/examples/plugins/echo/hooks/stop.ts +16 -0
  6. package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
  7. package/examples/plugins/echo/package.json +1 -2
  8. package/examples/plugins/echo/src/emit.ts +19 -0
  9. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
  10. package/openapi.yaml +235 -6
  11. package/package.json +2 -2
  12. package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
  13. package/src/__tests__/agent-loop-exit-reason.test.ts +204 -144
  14. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
  15. package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
  16. package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
  17. package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
  18. package/src/__tests__/agent-loop-thinking.test.ts +36 -20
  19. package/src/__tests__/agent-loop.test.ts +441 -96
  20. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
  21. package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
  22. package/src/__tests__/anthropic-provider.test.ts +1 -1
  23. package/src/__tests__/app-builder-tool-scripts.test.ts +21 -0
  24. package/src/__tests__/app-control-flow.test.ts +1 -1
  25. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  26. package/src/__tests__/app-executors.test.ts +132 -0
  27. package/src/__tests__/approval-cascade.test.ts +5 -4
  28. package/src/__tests__/approval-routes-http.test.ts +4 -1
  29. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
  30. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  31. package/src/__tests__/channel-approvals.test.ts +1 -1
  32. package/src/__tests__/compaction-circuit.test.ts +258 -0
  33. package/src/__tests__/compaction-direct.test.ts +132 -0
  34. package/src/__tests__/compaction-events.test.ts +5 -5
  35. package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
  36. package/src/__tests__/context-overflow-reducer.test.ts +1 -1
  37. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -4
  38. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
  39. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +78 -119
  40. package/src/__tests__/conversation-agent-loop-overflow.test.ts +142 -218
  41. package/src/__tests__/conversation-agent-loop.test.ts +297 -586
  42. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  43. package/src/__tests__/conversation-confirmation-signals.test.ts +5 -4
  44. package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
  45. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  46. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -4
  47. package/src/__tests__/conversation-process-callsite.test.ts +14 -14
  48. package/src/__tests__/conversation-provider-retry-repair.test.ts +70 -65
  49. package/src/__tests__/conversation-queue.test.ts +9 -9
  50. package/src/__tests__/conversation-runtime-assembly.test.ts +923 -231
  51. package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
  52. package/src/__tests__/conversation-slash-queue.test.ts +6 -4
  53. package/src/__tests__/conversation-slash-unknown.test.ts +6 -4
  54. package/src/__tests__/conversation-speed-override.test.ts +10 -9
  55. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  56. package/src/__tests__/conversation-workspace-cache-state.test.ts +23 -20
  57. package/src/__tests__/conversation-workspace-injection.test.ts +68 -6
  58. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +14 -11
  59. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  60. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  61. package/src/__tests__/db-acp-history.test.ts +101 -0
  62. package/src/__tests__/dynamic-page-surface.test.ts +31 -0
  63. package/src/__tests__/empty-response-hook.test.ts +1 -1
  64. package/src/__tests__/file-write-tool.test.ts +63 -0
  65. package/src/__tests__/gateway-only-guard.test.ts +12 -2
  66. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  67. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  68. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  69. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  70. package/src/__tests__/heartbeat-service.test.ts +1 -0
  71. package/src/__tests__/history-repair-hook.test.ts +1 -1
  72. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  73. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  74. package/src/__tests__/inference-profile-reaper.test.ts +62 -0
  75. package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
  76. package/src/__tests__/injector-background-turn.test.ts +13 -23
  77. package/src/__tests__/injector-chain.test.ts +268 -44
  78. package/src/__tests__/injector-disk-pressure.test.ts +210 -52
  79. package/src/__tests__/injector-document-comments.test.ts +97 -114
  80. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  81. package/src/__tests__/injector-v3-suppression.test.ts +4 -4
  82. package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
  83. package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
  84. package/src/__tests__/memory-retrieval-hook.test.ts +131 -26
  85. package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
  86. package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
  87. package/src/__tests__/plugin-api-shim.test.ts +6 -9
  88. package/src/__tests__/plugin-bootstrap.test.ts +12 -23
  89. package/src/__tests__/plugin-registry.test.ts +3 -49
  90. package/src/__tests__/plugin-types.test.ts +0 -70
  91. package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
  92. package/src/__tests__/reaction-persistence.test.ts +1 -1
  93. package/src/__tests__/send-endpoint-busy.test.ts +4 -1
  94. package/src/__tests__/skill-feature-flags-integration.test.ts +33 -0
  95. package/src/__tests__/steer-tool-repair.test.ts +1 -1
  96. package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
  97. package/src/__tests__/subagent-detail.test.ts +25 -7
  98. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  99. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  100. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  101. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  102. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  103. package/src/__tests__/title-generate-hook.test.ts +1 -1
  104. package/src/__tests__/tool-error-hook.test.ts +1 -1
  105. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
  106. package/src/__tests__/user-plugin-loader.test.ts +54 -286
  107. package/src/acp/__tests__/agent-process.test.ts +161 -0
  108. package/src/acp/__tests__/client-handler.test.ts +40 -0
  109. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  110. package/src/acp/__tests__/helpers/exec-file-stub.ts +106 -0
  111. package/src/acp/__tests__/prepare-agent-env.test.ts +97 -0
  112. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  113. package/src/acp/__tests__/session-manager-resume.test.ts +888 -0
  114. package/src/acp/agent-process.ts +61 -1
  115. package/src/acp/auto-install.test.ts +280 -0
  116. package/src/acp/auto-install.ts +232 -0
  117. package/src/acp/client-handler.ts +31 -0
  118. package/src/acp/feature-gate.test.ts +48 -0
  119. package/src/acp/feature-gate.ts +34 -0
  120. package/src/acp/prepare-agent-env.ts +80 -27
  121. package/src/acp/resolve-agent.test.ts +225 -9
  122. package/src/acp/resolve-agent.ts +122 -17
  123. package/src/acp/resume-hint.ts +23 -0
  124. package/src/acp/session-manager.ts +507 -73
  125. package/src/agent/compaction-circuit.ts +60 -102
  126. package/src/agent/loop.ts +414 -248
  127. package/src/api/responses/conversation-message.ts +14 -1
  128. package/src/approvals/guardian-request-resolvers.ts +1 -1
  129. package/src/background-wake/next-wake.ts +1 -0
  130. package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
  131. package/src/cli/commands/plugins.ts +43 -37
  132. package/src/cli/lib/__tests__/install-from-github.test.ts +429 -111
  133. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
  134. package/src/cli/lib/__tests__/plugin-details.test.ts +372 -0
  135. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +220 -0
  136. package/src/cli/lib/__tests__/search-plugins.test.ts +226 -32
  137. package/src/cli/lib/install-from-github.ts +464 -55
  138. package/src/cli/lib/plugin-catalog-cache.ts +84 -0
  139. package/src/cli/lib/plugin-details.ts +409 -0
  140. package/src/cli/lib/plugin-marketplace.ts +197 -0
  141. package/src/cli/lib/search-plugins.ts +195 -29
  142. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  143. package/src/config/acp-defaults.test.ts +10 -0
  144. package/src/config/acp-defaults.ts +6 -0
  145. package/src/config/bundled-skills/acp/SKILL.md +85 -33
  146. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  147. package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
  148. package/src/config/bundled-skills/app-builder/TOOLS.json +72 -2
  149. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  150. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  151. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  152. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  153. package/src/config/bundled-skills/app-builder/tools/app-update.ts +18 -0
  154. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  155. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  156. package/src/config/bundled-tool-registry.ts +4 -0
  157. package/src/config/call-site-defaults.ts +0 -2
  158. package/src/config/feature-flag-registry.json +15 -6
  159. package/src/config/schemas/call-site-catalog.ts +0 -14
  160. package/src/config/schemas/heartbeat.ts +9 -0
  161. package/src/config/schemas/llm.ts +0 -2
  162. package/src/context/compactor.ts +22 -4
  163. package/src/context/strip-injections.ts +8 -2
  164. package/src/context/window-manager.ts +27 -13
  165. package/src/daemon/conversation-agent-loop-handlers.ts +10 -35
  166. package/src/daemon/conversation-agent-loop.ts +175 -1055
  167. package/src/daemon/conversation-lifecycle.ts +11 -255
  168. package/src/daemon/conversation-process.ts +8 -136
  169. package/src/daemon/conversation-registry.ts +159 -0
  170. package/src/daemon/conversation-runtime-assembly.ts +293 -392
  171. package/src/daemon/conversation-store.ts +9 -90
  172. package/src/daemon/conversation-surfaces.ts +24 -8
  173. package/src/daemon/conversation-workspace.ts +17 -0
  174. package/src/daemon/conversation.ts +404 -57
  175. package/src/daemon/disk-pressure-policy.ts +0 -1
  176. package/src/daemon/external-plugins-bootstrap.ts +14 -19
  177. package/src/daemon/handlers/conversations.ts +3 -1
  178. package/src/daemon/handlers/skills.ts +4 -1
  179. package/src/daemon/host-proxy-preactivation.ts +1 -3
  180. package/src/daemon/lifecycle.ts +21 -7
  181. package/src/daemon/server.ts +2 -0
  182. package/src/daemon/wake-conversation-ops.ts +269 -0
  183. package/src/embedded/plugin-api.ts +2 -2
  184. package/src/export/__tests__/transcript-formatter.test.ts +5 -0
  185. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
  186. package/src/heartbeat/heartbeat-run-store.ts +23 -1
  187. package/src/heartbeat/heartbeat-service.ts +26 -0
  188. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  189. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  190. package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
  191. package/src/ipc/skill-routes/memory.ts +4 -2
  192. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
  193. package/src/memory/conversation-crud.ts +29 -19
  194. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  195. package/src/memory/db-init.ts +2 -0
  196. package/src/memory/job-handlers/conversation-starters.ts +13 -2
  197. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
  198. package/src/memory/jobs-worker.ts +25 -1
  199. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  200. package/src/memory/migrations/index.ts +1 -0
  201. package/src/memory/schema/acp.ts +4 -0
  202. package/src/memory/v2/__tests__/consolidation-job.test.ts +3 -3
  203. package/src/memory/v2/consolidation-job.ts +13 -4
  204. package/src/plugin-api/constants.ts +4 -0
  205. package/src/plugin-api/index.ts +6 -5
  206. package/src/plugin-api/types.ts +75 -0
  207. package/src/plugins/defaults/compaction/compact.ts +59 -0
  208. package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +7 -7
  209. package/src/plugins/defaults/compaction/manager-store.ts +57 -0
  210. package/src/plugins/defaults/compaction/package.json +1 -2
  211. package/src/plugins/defaults/empty-response/package.json +0 -1
  212. package/src/plugins/defaults/history-repair/package.json +0 -1
  213. package/src/plugins/defaults/index.ts +135 -26
  214. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
  215. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +184 -74
  216. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
  217. package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
  218. package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
  219. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/assign.test.ts +4 -4
  220. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +9 -6
  221. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/maintain-job.test.ts +5 -5
  222. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/orchestrate.test.ts +8 -5
  223. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/reconcile.test.ts +2 -2
  224. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/render-injection.test.ts +1 -1
  225. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/router.test.ts +10 -5
  226. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +8 -8
  227. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selector.test.ts +5 -5
  228. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/shadow-plugin.test.ts +16 -17
  229. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -2
  230. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/assign.ts +9 -5
  231. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/capabilities.ts +5 -2
  232. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  233. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  234. package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
  235. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/maintain-job.ts +15 -8
  236. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/orchestrate.ts +2 -2
  237. package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
  238. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/page-content.ts +2 -2
  239. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/provider-blocks.ts +1 -1
  240. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/reconcile.ts +7 -3
  241. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +1 -1
  242. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/router.ts +5 -5
  243. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selection-log-store.ts +4 -4
  244. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selector.ts +7 -7
  245. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/shadow-plugin.ts +32 -94
  246. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/tree.ts +1 -1
  247. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/types.ts +1 -1
  248. package/src/plugins/defaults/title-generate/package.json +0 -1
  249. package/src/plugins/defaults/tool-error/package.json +0 -1
  250. package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
  251. package/src/plugins/pipeline.ts +6 -293
  252. package/src/plugins/registry.ts +9 -37
  253. package/src/plugins/types.ts +76 -381
  254. package/src/plugins/user-loader.ts +30 -127
  255. package/src/prompts/__tests__/system-prompt.test.ts +6 -0
  256. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +35 -3
  257. package/src/runtime/__tests__/agent-wake.test.ts +555 -691
  258. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  259. package/src/runtime/agent-wake.ts +108 -209
  260. package/src/runtime/assistant-event-hub.ts +1 -1
  261. package/src/runtime/channel-approvals.ts +1 -1
  262. package/src/runtime/interactive-ui.ts +1 -1
  263. package/src/runtime/routes/__tests__/acp-routes.test.ts +315 -55
  264. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  265. package/src/runtime/routes/__tests__/plugins-routes.test.ts +423 -73
  266. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  267. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  268. package/src/runtime/routes/acp-routes.test.ts +89 -25
  269. package/src/runtime/routes/acp-routes.ts +81 -29
  270. package/src/runtime/routes/approval-routes.ts +1 -1
  271. package/src/runtime/routes/browser-routes.ts +1 -1
  272. package/src/runtime/routes/browser-tabs-routes.ts +6 -10
  273. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  274. package/src/runtime/routes/conversation-list-routes.ts +1 -1
  275. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  276. package/src/runtime/routes/conversation-routes.ts +28 -2
  277. package/src/runtime/routes/conversation-starter-routes.ts +13 -7
  278. package/src/runtime/routes/conversations-import-routes.ts +24 -7
  279. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  280. package/src/runtime/routes/host-cu-routes.ts +1 -1
  281. package/src/runtime/routes/identity-routes.ts +18 -3
  282. package/src/runtime/routes/inbound-message-handler.ts +1 -1
  283. package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
  284. package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
  285. package/src/runtime/routes/memory-v3-routes.ts +16 -6
  286. package/src/runtime/routes/playground/helpers.ts +1 -1
  287. package/src/runtime/routes/plugins-routes.ts +337 -35
  288. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  289. package/src/runtime/routes/work-items-routes.ts +2 -4
  290. package/src/runtime/services/conversation-serializer.ts +1 -1
  291. package/src/signals/cancel.ts +2 -4
  292. package/src/subagent/manager.ts +21 -5
  293. package/src/tools/acp/context.ts +20 -0
  294. package/src/tools/acp/list-agents.test.ts +8 -2
  295. package/src/tools/acp/spawn.test.ts +176 -195
  296. package/src/tools/acp/spawn.ts +37 -172
  297. package/src/tools/acp/steer.test.ts +105 -8
  298. package/src/tools/acp/steer.ts +48 -17
  299. package/src/tools/apps/executors.ts +166 -50
  300. package/src/tools/filesystem/write.ts +34 -0
  301. package/src/tools/subagent/spawn.ts +2 -4
  302. package/src/tools/ui-surface/definitions.ts +25 -5
  303. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  304. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
  305. package/docs/plugins.md +0 -832
  306. package/examples/plugins/echo/register.ts +0 -143
  307. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  308. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  309. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
  310. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
  311. package/src/__tests__/pipeline-runner.test.ts +0 -554
  312. package/src/__tests__/plugin-external-api.test.ts +0 -68
  313. package/src/daemon/wake-target-adapter.ts +0 -253
  314. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
  315. package/src/plugins/defaults/circuit-breaker/package.json +0 -15
  316. package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
  317. package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
  318. package/src/plugins/defaults/compaction/register.ts +0 -35
  319. package/src/plugins/defaults/compaction/terminal.ts +0 -73
  320. package/src/plugins/defaults/empty-response/register.ts +0 -23
  321. package/src/plugins/defaults/history-repair/register.ts +0 -24
  322. package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
  323. package/src/plugins/defaults/overflow-reduce/package.json +0 -15
  324. package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
  325. package/src/plugins/defaults/title-generate/register.ts +0 -35
  326. package/src/plugins/defaults/tool-error/register.ts +0 -23
  327. package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
  328. package/src/plugins/external-api.ts +0 -104
  329. package/src/proactive-artifact/aux-message-injector.ts +0 -97
  330. package/src/proactive-artifact/decision.test.ts +0 -226
  331. package/src/proactive-artifact/decision.ts +0 -165
  332. package/src/proactive-artifact/index.ts +0 -7
  333. package/src/proactive-artifact/job.test.ts +0 -962
  334. package/src/proactive-artifact/job.ts +0 -372
  335. package/src/proactive-artifact/message-copy.ts +0 -58
  336. package/src/proactive-artifact/trigger-state.test.ts +0 -286
  337. package/src/proactive-artifact/trigger-state.ts +0 -123
  338. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/capabilities.test.ts +0 -0
  339. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/core.test.ts +0 -0
  340. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
  341. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
  342. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/health.test.ts +0 -0
  343. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/needle.test.ts +0 -0
  344. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/provider-blocks.test.ts +0 -0
  345. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/snapshot.test.ts +0 -0
  346. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/tree.test.ts +0 -0
  347. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
  348. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
  349. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/core.ts +0 -0
  350. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
  351. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
  352. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
  353. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
  354. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
  355. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
  356. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/health.ts +0 -0
  357. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
  358. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/needle.ts +0 -0
  359. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/snapshot.ts +0 -0
  360. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +0 -0
package/ARCHITECTURE.md CHANGED
@@ -1088,12 +1088,12 @@ All overflow recovery settings live under `contextWindow.overflowRecovery` in th
1088
1088
 
1089
1089
  ### Key Source Files
1090
1090
 
1091
- | File | Purpose |
1092
- | ---------------------------------------- | ----------------------------------------------------------------------------- |
1093
- | `src/daemon/context-overflow-reducer.ts` | Tiered reducer: four-tier pipeline with idempotent steps and cumulative state |
1094
- | `src/daemon/context-overflow-policy.ts` | Overflow policy resolver: maps config + interactivity to concrete action |
1095
- | `src/daemon/conversation-agent-loop.ts` | Integration: preflight budget check, convergence loop, emergency compaction |
1096
- | `src/config/core-schema.ts` | `ContextOverflowRecoveryConfigSchema` with defaults and validation |
1091
+ | File | Purpose |
1092
+ | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
1093
+ | `src/plugins/defaults/compaction/context-overflow-reducer.ts` | Tiered reducer: four-tier pipeline with idempotent steps and cumulative state |
1094
+ | `src/daemon/context-overflow-policy.ts` | Overflow policy resolver: maps config + interactivity to concrete action |
1095
+ | `src/daemon/conversation-agent-loop.ts` | Integration: preflight budget check, convergence loop, emergency compaction |
1096
+ | `src/config/core-schema.ts` | `ContextOverflowRecoveryConfigSchema` with defaults and validation |
1097
1097
 
1098
1098
  ---
1099
1099
 
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,181 @@ 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. Always resolves against the curated
19553
+ default git ref (no caller-supplied ref): installing from an unreviewed revision would bypass the
19554
+ marketplace/first-party curation boundary and let attacker-controlled code be loaded. Materializes the plugin
19555
+ under `<workspaceDir>/plugins/<name>/`; the assistant must be restarted to load it. Mirrors the CLI's `assistant
19556
+ plugins install <name>`. An already-installed name without `force` returns 409; a name that resolves to nothing
19557
+ returns 404. Sibling to `POST /v1/skills/install`."
19558
+ tags:
19559
+ - plugins
19560
+ responses:
19561
+ "200":
19562
+ description: Successful response
19563
+ content:
19564
+ application/json:
19565
+ schema:
19566
+ type: object
19567
+ properties:
19568
+ ok:
19569
+ type: boolean
19570
+ const: true
19571
+ name:
19572
+ type: string
19573
+ description: Install name that was materialized.
19574
+ target:
19575
+ type: string
19576
+ description: Absolute path the plugin was materialized into on the host.
19577
+ fileCount:
19578
+ type: number
19579
+ description: Number of files written for the installed plugin.
19580
+ ref:
19581
+ type: string
19582
+ description: Git ref the plugin was fetched from.
19583
+ required:
19584
+ - ok
19585
+ - name
19586
+ - target
19587
+ - fileCount
19588
+ - ref
19589
+ additionalProperties: false
19590
+ "400":
19591
+ description: The request body was missing `name` or the name failed sanitization.
19592
+ "404":
19593
+ description: No plugin resolves to the given name at the requested ref.
19594
+ "409":
19595
+ description: A plugin with the same name is already installed and `force` was not set.
19596
+ requestBody:
19597
+ required: true
19598
+ content:
19599
+ application/json:
19600
+ schema:
19601
+ type: object
19602
+ properties:
19603
+ name:
19604
+ type: string
19605
+ description: Install name to resolve against the catalog (first-party directory or marketplace entry).
19606
+ force:
19607
+ description: Overwrite an existing install in place. Defaults to false.
19608
+ type: boolean
19609
+ required:
19610
+ - name
19611
+ additionalProperties: false
19419
19612
  /v1/plugins/search:
19420
19613
  get:
19421
19614
  operationId: plugins_search_get
@@ -19447,13 +19640,49 @@ paths:
19447
19640
  properties:
19448
19641
  name:
19449
19642
  type: string
19450
- description: Directory name under `experimental/plugins/`. Matches `assistant plugins install <name>`.
19643
+ description: Install name. Matches `assistant plugins install <name>`.
19451
19644
  path:
19452
19645
  type: string
19453
- description: Repo-relative path of the match (e.g. `experimental/plugins/<name>`).
19646
+ description:
19647
+ "Human-readable origin: a repo-relative path (`experimental/plugins/<name>`) for first-party plugins or a
19648
+ `github:owner/repo@ref` locator for external ones."
19649
+ description:
19650
+ description: Short description, when known (external entries only today).
19651
+ type: string
19652
+ source:
19653
+ oneOf:
19654
+ - type: object
19655
+ properties:
19656
+ kind:
19657
+ type: string
19658
+ const: first-party
19659
+ required:
19660
+ - kind
19661
+ additionalProperties: false
19662
+ - type: object
19663
+ properties:
19664
+ kind:
19665
+ type: string
19666
+ const: github
19667
+ repo:
19668
+ type: string
19669
+ description: "`owner/repo` of the external plugin repository."
19670
+ path:
19671
+ description: Directory within the repo, when the plugin is not at the root.
19672
+ type: string
19673
+ ref:
19674
+ type: string
19675
+ description: Pinned git ref the plugin is fetched from.
19676
+ required:
19677
+ - kind
19678
+ - repo
19679
+ - ref
19680
+ additionalProperties: false
19681
+ description: "Origin of the match: a first-party in-repo plugin or a whitelisted external one."
19454
19682
  required:
19455
19683
  - name
19456
19684
  - path
19685
+ - source
19457
19686
  additionalProperties: false
19458
19687
  description: Directory matches, sorted alphabetically by name.
19459
19688
  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.2",
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",