@vellumai/assistant 0.8.8 → 0.8.9-dev.202606091853.fbaa2ae

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 (475) hide show
  1. package/ARCHITECTURE.md +6 -6
  2. package/bun.lock +2 -2
  3. package/docs/activation-funnel-telemetry.md +310 -0
  4. package/examples/plugins/echo/README.md +61 -60
  5. package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
  6. package/examples/plugins/echo/hooks/stop.ts +16 -0
  7. package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
  8. package/examples/plugins/echo/package.json +1 -2
  9. package/examples/plugins/echo/src/emit.ts +19 -0
  10. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
  11. package/openapi.yaml +263 -121
  12. package/package.json +2 -2
  13. package/src/__tests__/activation-early-marking.test.ts +120 -0
  14. package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
  15. package/src/__tests__/agent-loop-exit-reason.test.ts +204 -144
  16. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
  17. package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
  18. package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
  19. package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
  20. package/src/__tests__/agent-loop-thinking.test.ts +36 -20
  21. package/src/__tests__/agent-loop.test.ts +441 -96
  22. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
  23. package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
  24. package/src/__tests__/anthropic-provider.test.ts +23 -8
  25. package/src/__tests__/app-builder-tool-scripts.test.ts +21 -0
  26. package/src/__tests__/app-control-flow.test.ts +1 -1
  27. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  28. package/src/__tests__/app-executors.test.ts +132 -0
  29. package/src/__tests__/approval-cascade.test.ts +6 -5
  30. package/src/__tests__/approval-routes-http.test.ts +4 -1
  31. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
  32. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  33. package/src/__tests__/channel-approvals.test.ts +1 -1
  34. package/src/__tests__/compaction-circuit.test.ts +258 -0
  35. package/src/__tests__/compaction-direct.test.ts +146 -0
  36. package/src/__tests__/compaction-events.test.ts +7 -7
  37. package/src/__tests__/compaction.benchmark.test.ts +1 -1
  38. package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
  39. package/src/__tests__/context-overflow-reducer.test.ts +265 -125
  40. package/src/__tests__/context-window-manager-compact-retry.test.ts +121 -15
  41. package/src/__tests__/conversation-abort-tool-results.test.ts +7 -5
  42. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
  43. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +78 -119
  44. package/src/__tests__/conversation-agent-loop-overflow.test.ts +158 -234
  45. package/src/__tests__/conversation-agent-loop.test.ts +342 -623
  46. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  47. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -5
  48. package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
  49. package/src/__tests__/conversation-error.test.ts +15 -1
  50. package/src/__tests__/conversation-history-web-search.test.ts +6 -1
  51. package/src/__tests__/conversation-media-retry.test.ts +1 -1
  52. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +44 -4
  53. package/src/__tests__/conversation-process-callsite.test.ts +15 -15
  54. package/src/__tests__/conversation-provider-retry-repair.test.ts +66 -65
  55. package/src/__tests__/conversation-queue.test.ts +10 -10
  56. package/src/__tests__/conversation-runtime-assembly.test.ts +1059 -231
  57. package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
  58. package/src/__tests__/conversation-slash-queue.test.ts +7 -5
  59. package/src/__tests__/conversation-slash-unknown.test.ts +7 -5
  60. package/src/__tests__/conversation-speed-override.test.ts +11 -10
  61. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  62. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +395 -0
  63. package/src/__tests__/conversation-surfaces-app-control.test.ts +48 -1
  64. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +73 -4
  65. package/src/__tests__/conversation-undo.test.ts +2 -2
  66. package/src/__tests__/conversation-workspace-cache-state.test.ts +24 -21
  67. package/src/__tests__/conversation-workspace-injection.test.ts +69 -7
  68. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +15 -12
  69. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  70. package/src/__tests__/corrected-target.test.ts +93 -0
  71. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  72. package/src/__tests__/cu-unified-flow.test.ts +36 -0
  73. package/src/__tests__/db-acp-history.test.ts +101 -0
  74. package/src/__tests__/dynamic-page-surface.test.ts +31 -0
  75. package/src/__tests__/empty-response-hook.test.ts +1 -1
  76. package/src/__tests__/file-write-tool.test.ts +63 -0
  77. package/src/__tests__/gateway-only-guard.test.ts +17 -2
  78. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  79. package/src/__tests__/guardian-routing-invariants.test.ts +93 -4
  80. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  81. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  82. package/src/__tests__/heartbeat-service.test.ts +1 -0
  83. package/src/__tests__/history-repair-hook.test.ts +5 -1
  84. package/src/__tests__/host-app-control-proxy.test.ts +45 -0
  85. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  86. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  87. package/src/__tests__/inference-profile-reaper.test.ts +62 -0
  88. package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
  89. package/src/__tests__/injector-background-turn.test.ts +13 -23
  90. package/src/__tests__/injector-chain.test.ts +268 -44
  91. package/src/__tests__/injector-disk-pressure.test.ts +210 -52
  92. package/src/__tests__/injector-document-comments.test.ts +97 -114
  93. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  94. package/src/__tests__/injector-v3-suppression.test.ts +4 -4
  95. package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
  96. package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
  97. package/src/__tests__/llm-resolver.test.ts +73 -0
  98. package/src/__tests__/memory-retrieval-hook.test.ts +156 -38
  99. package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
  100. package/src/__tests__/notification-decision-strategy.test.ts +3 -3
  101. package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
  102. package/src/__tests__/persist-unsendable-image-downscale.test.ts +145 -0
  103. package/src/__tests__/persist-unsendable-image.test.ts +97 -1
  104. package/src/__tests__/plugin-api-shim.test.ts +6 -9
  105. package/src/__tests__/plugin-bootstrap.test.ts +91 -81
  106. package/src/__tests__/plugin-registry.test.ts +3 -49
  107. package/src/__tests__/plugin-skill-contribution.test.ts +15 -14
  108. package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
  109. package/src/__tests__/plugin-types.test.ts +0 -70
  110. package/src/__tests__/post-turn-tool-result-truncation.test.ts +69 -0
  111. package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
  112. package/src/__tests__/published-app-updater.test.ts +138 -0
  113. package/src/__tests__/reaction-persistence.test.ts +1 -1
  114. package/src/__tests__/send-endpoint-busy.test.ts +4 -1
  115. package/src/__tests__/skill-feature-flags-integration.test.ts +31 -0
  116. package/src/__tests__/steer-tool-repair.test.ts +1 -1
  117. package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
  118. package/src/__tests__/subagent-detail.test.ts +25 -7
  119. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  120. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  121. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  122. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  123. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  124. package/src/__tests__/title-generate-hook.test.ts +5 -1
  125. package/src/__tests__/tool-error-hook.test.ts +1 -1
  126. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
  127. package/src/__tests__/user-plugin-loader.test.ts +54 -286
  128. package/src/__tests__/web-fetch.test.ts +45 -0
  129. package/src/acp/__tests__/agent-process.test.ts +161 -0
  130. package/src/acp/__tests__/client-handler.test.ts +40 -0
  131. package/src/acp/__tests__/helpers/acp-config-stub.ts +0 -2
  132. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  133. package/src/acp/__tests__/helpers/exec-file-stub.ts +106 -0
  134. package/src/acp/__tests__/prepare-agent-env.test.ts +97 -0
  135. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  136. package/src/acp/__tests__/session-manager-resume.test.ts +888 -0
  137. package/src/acp/agent-process.ts +61 -1
  138. package/src/acp/auto-install.test.ts +280 -0
  139. package/src/acp/auto-install.ts +232 -0
  140. package/src/acp/client-handler.ts +31 -0
  141. package/src/acp/prepare-agent-env.ts +80 -27
  142. package/src/acp/resolve-agent.test.ts +188 -28
  143. package/src/acp/resolve-agent.ts +119 -42
  144. package/src/acp/resume-hint.ts +23 -0
  145. package/src/acp/session-manager.ts +507 -73
  146. package/src/agent/compaction-circuit.ts +60 -102
  147. package/src/agent/loop.ts +403 -251
  148. package/src/api/responses/conversation-message.ts +22 -2
  149. package/src/api/responses/memory-v3-selection-log.ts +19 -10
  150. package/src/approvals/guardian-request-resolvers.ts +27 -1
  151. package/src/background-wake/next-wake.ts +1 -0
  152. package/src/cli/commands/__tests__/memory-v3.test.ts +191 -210
  153. package/src/cli/commands/channel-verification-sessions.ts +6 -6
  154. package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
  155. package/src/cli/commands/memory-v3.ts +57 -199
  156. package/src/cli/commands/plugins.ts +43 -37
  157. package/src/cli/lib/__tests__/install-from-github.test.ts +790 -111
  158. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
  159. package/src/cli/lib/__tests__/plugin-details.test.ts +381 -0
  160. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +270 -0
  161. package/src/cli/lib/__tests__/search-plugins.test.ts +233 -32
  162. package/src/cli/lib/install-from-github.ts +797 -60
  163. package/src/cli/lib/plugin-catalog-cache.ts +84 -0
  164. package/src/cli/lib/plugin-details.ts +416 -0
  165. package/src/cli/lib/plugin-marketplace.ts +215 -0
  166. package/src/cli/lib/search-plugins.ts +201 -29
  167. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  168. package/src/config/acp-defaults.test.ts +10 -0
  169. package/src/config/acp-defaults.ts +9 -3
  170. package/src/config/acp-schema.ts +1 -7
  171. package/src/config/bundled-skills/acp/SKILL.md +80 -41
  172. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  173. package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
  174. package/src/config/bundled-skills/app-builder/TOOLS.json +72 -2
  175. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  176. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  177. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  178. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  179. package/src/config/bundled-skills/app-builder/tools/app-update.ts +18 -0
  180. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  181. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  182. package/src/config/bundled-tool-registry.ts +4 -0
  183. package/src/config/call-site-defaults.ts +0 -3
  184. package/src/config/feature-flag-registry.json +10 -16
  185. package/src/config/llm-resolver.ts +39 -7
  186. package/src/config/schemas/__tests__/memory-v3.test.ts +25 -9
  187. package/src/config/schemas/call-site-catalog.ts +0 -21
  188. package/src/config/schemas/heartbeat.ts +9 -0
  189. package/src/config/schemas/llm.ts +17 -3
  190. package/src/config/schemas/memory-v3.ts +58 -8
  191. package/src/config/seed-inference-profiles.ts +18 -0
  192. package/src/context/compactor.ts +22 -4
  193. package/src/context/post-turn-tool-result-truncation.ts +39 -1
  194. package/src/context/strip-injections.ts +8 -2
  195. package/src/daemon/conversation-agent-loop-handlers.ts +18 -36
  196. package/src/daemon/conversation-agent-loop.ts +308 -1297
  197. package/src/daemon/conversation-error.ts +31 -4
  198. package/src/daemon/conversation-history.ts +1 -1
  199. package/src/daemon/conversation-lifecycle.ts +11 -255
  200. package/src/daemon/conversation-media-retry.ts +19 -6
  201. package/src/daemon/conversation-messaging.ts +17 -0
  202. package/src/daemon/conversation-process.ts +22 -141
  203. package/src/daemon/conversation-queue-manager.ts +8 -0
  204. package/src/daemon/conversation-registry.ts +159 -0
  205. package/src/daemon/conversation-runtime-assembly.ts +361 -393
  206. package/src/daemon/conversation-store.ts +9 -90
  207. package/src/daemon/conversation-surfaces.ts +165 -11
  208. package/src/daemon/conversation-workspace.ts +17 -0
  209. package/src/daemon/conversation.ts +444 -62
  210. package/src/daemon/disk-pressure-policy.ts +0 -1
  211. package/src/daemon/external-plugins-bootstrap.ts +36 -46
  212. package/src/daemon/handlers/config-channels.ts +11 -2
  213. package/src/daemon/handlers/conversations.ts +3 -1
  214. package/src/daemon/handlers/skills.ts +4 -1
  215. package/src/daemon/host-app-control-proxy.ts +72 -57
  216. package/src/daemon/host-proxy-preactivation.ts +1 -3
  217. package/src/daemon/lifecycle.ts +21 -7
  218. package/src/daemon/persist-unsendable-image.ts +62 -25
  219. package/src/daemon/process-message.ts +1 -1
  220. package/src/daemon/server.ts +2 -0
  221. package/src/daemon/tool-side-effects.ts +15 -0
  222. package/src/daemon/wake-conversation-ops.ts +269 -0
  223. package/src/embedded/plugin-api.ts +2 -2
  224. package/src/export/__tests__/transcript-formatter.test.ts +5 -0
  225. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
  226. package/src/heartbeat/heartbeat-run-store.ts +23 -1
  227. package/src/heartbeat/heartbeat-service.ts +26 -0
  228. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  229. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  230. package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
  231. package/src/ipc/skill-routes/memory.ts +4 -2
  232. package/src/memory/__tests__/activation-session-store.test.ts +41 -0
  233. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
  234. package/src/memory/__tests__/onboarding-events-store.test.ts +80 -0
  235. package/src/memory/activation-session-store.ts +43 -0
  236. package/src/memory/conversation-crud.ts +29 -19
  237. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  238. package/src/memory/db-init.ts +6 -0
  239. package/src/memory/job-handlers/conversation-starters.ts +13 -2
  240. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
  241. package/src/memory/jobs-worker.ts +25 -1
  242. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  243. package/src/memory/migrations/273-onboarding-events-funnel-columns.ts +46 -0
  244. package/src/memory/migrations/274-create-activation-sessions.ts +15 -0
  245. package/src/memory/migrations/index.ts +3 -0
  246. package/src/memory/onboarding-events-store.ts +66 -18
  247. package/src/memory/schema/acp.ts +4 -0
  248. package/src/memory/schema/infrastructure.ts +13 -0
  249. package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -97
  250. package/src/memory/v2/__tests__/page-store.test.ts +22 -0
  251. package/src/memory/v2/consolidation-job.ts +2 -63
  252. package/src/memory/v2/types.ts +5 -0
  253. package/src/messaging/providers/telegram-bot/api.ts +14 -5
  254. package/src/notifications/__tests__/copy-composer.test.ts +244 -0
  255. package/src/notifications/access-request-copy.ts +298 -0
  256. package/src/notifications/adapters/slack.ts +3 -3
  257. package/src/notifications/adapters/telegram.ts +9 -2
  258. package/src/notifications/copy-composer.ts +49 -267
  259. package/src/notifications/decision-engine.ts +16 -35
  260. package/src/notifications/home-feed-side-effect.ts +1 -6
  261. package/src/plugin-api/constants.ts +4 -0
  262. package/src/plugin-api/index.ts +40 -11
  263. package/src/plugin-api/types.ts +108 -0
  264. package/src/plugins/defaults/compaction/compact.ts +106 -0
  265. package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +250 -42
  266. package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
  267. package/src/plugins/defaults/compaction/manager-store.ts +57 -0
  268. package/src/plugins/defaults/compaction/package.json +1 -2
  269. package/src/{context → plugins/defaults/compaction}/window-manager.ts +95 -25
  270. package/src/plugins/defaults/empty-response/package.json +0 -1
  271. package/src/plugins/defaults/history-repair/package.json +0 -1
  272. package/src/plugins/defaults/index.ts +156 -26
  273. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
  274. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +285 -0
  275. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
  276. package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
  277. package/src/plugins/defaults/memory-retrieval/package.json +14 -0
  278. package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
  279. package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +71 -0
  280. package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +181 -0
  281. package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +247 -0
  282. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +147 -134
  283. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +456 -0
  284. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +662 -0
  285. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +306 -0
  286. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +91 -0
  287. package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +402 -0
  288. package/src/plugins/defaults/memory-v3-shadow/__tests__/section-needle.test.ts +135 -0
  289. package/src/plugins/defaults/memory-v3-shadow/__tests__/sections.test.ts +125 -0
  290. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +74 -19
  291. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +446 -0
  292. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +592 -0
  293. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -24
  294. package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +91 -0
  295. package/src/plugins/defaults/memory-v3-shadow/dense.ts +97 -0
  296. package/src/plugins/defaults/memory-v3-shadow/edge.ts +252 -0
  297. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  298. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  299. package/src/plugins/defaults/memory-v3-shadow/injector.ts +76 -0
  300. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +555 -0
  301. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +266 -0
  302. package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
  303. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +71 -0
  304. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +204 -0
  305. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +16 -8
  306. package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +236 -0
  307. package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +200 -0
  308. package/src/plugins/defaults/memory-v3-shadow/sections.ts +115 -0
  309. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +156 -0
  310. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +382 -0
  311. package/src/plugins/defaults/memory-v3-shadow/types.ts +92 -0
  312. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +4 -1
  313. package/src/plugins/defaults/title-generate/package.json +0 -1
  314. package/src/plugins/defaults/tool-error/package.json +0 -1
  315. package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
  316. package/src/plugins/external-api.ts +12 -2
  317. package/src/plugins/pipeline.ts +6 -293
  318. package/src/plugins/registry.ts +9 -37
  319. package/src/plugins/types.ts +76 -381
  320. package/src/plugins/user-loader.ts +30 -127
  321. package/src/prompts/__tests__/system-prompt.test.ts +6 -0
  322. package/src/prompts/system-prompt.ts +61 -10
  323. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +71 -4
  324. package/src/providers/anthropic/client.ts +9 -10
  325. package/src/providers/inference/kimi-cjk-token-ids.ts +493 -0
  326. package/src/providers/inference/logit-bias.ts +55 -0
  327. package/src/providers/model-catalog.ts +34 -0
  328. package/src/providers/openai/__tests__/vision-not-supported.test.ts +75 -0
  329. package/src/providers/openai/chat-completions-provider.ts +44 -1
  330. package/src/providers/retry.ts +22 -0
  331. package/src/providers/types.ts +6 -0
  332. package/src/runtime/__tests__/agent-wake.test.ts +555 -691
  333. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  334. package/src/runtime/agent-wake.ts +108 -209
  335. package/src/runtime/assistant-event-hub.ts +1 -1
  336. package/src/runtime/channel-approvals.ts +1 -1
  337. package/src/runtime/interactive-ui.ts +1 -1
  338. package/src/runtime/routes/__tests__/acp-routes.test.ts +466 -55
  339. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  340. package/src/runtime/routes/__tests__/plugins-routes.test.ts +423 -73
  341. package/src/runtime/routes/__tests__/stt-routes.test.ts +112 -0
  342. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  343. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  344. package/src/runtime/routes/acp-routes.test.ts +185 -32
  345. package/src/runtime/routes/acp-routes.ts +328 -30
  346. package/src/runtime/routes/app-management-routes.ts +3 -0
  347. package/src/runtime/routes/approval-routes.ts +1 -1
  348. package/src/runtime/routes/browser-routes.ts +1 -1
  349. package/src/runtime/routes/browser-tabs-routes.ts +6 -10
  350. package/src/runtime/routes/channel-verification-routes.ts +14 -5
  351. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  352. package/src/runtime/routes/conversation-list-routes.ts +1 -1
  353. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  354. package/src/runtime/routes/conversation-routes.ts +30 -2
  355. package/src/runtime/routes/conversation-starter-routes.ts +13 -7
  356. package/src/runtime/routes/conversations-import-routes.ts +24 -7
  357. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  358. package/src/runtime/routes/host-cu-routes.ts +1 -1
  359. package/src/runtime/routes/identity-routes.ts +18 -3
  360. package/src/runtime/routes/inbound-message-handler.ts +1 -1
  361. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
  362. package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
  363. package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
  364. package/src/runtime/routes/memory-v3-routes.ts +65 -305
  365. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +1 -1
  366. package/src/runtime/routes/playground/helpers.ts +1 -1
  367. package/src/runtime/routes/plugins-routes.ts +337 -35
  368. package/src/runtime/routes/stt-routes.ts +45 -12
  369. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  370. package/src/runtime/routes/work-items-routes.ts +2 -4
  371. package/src/runtime/routes/workspace-routes.ts +50 -15
  372. package/src/runtime/services/conversation-serializer.ts +1 -1
  373. package/src/runtime/verification-outbound-actions.ts +147 -2
  374. package/src/runtime/verification-templates.ts +29 -3
  375. package/src/services/published-app-updater.ts +30 -8
  376. package/src/signals/cancel.ts +2 -4
  377. package/src/subagent/manager.ts +21 -5
  378. package/src/telemetry/__tests__/activation-funnel.test.ts +95 -0
  379. package/src/telemetry/activation-funnel.ts +167 -0
  380. package/src/telemetry/types.ts +13 -0
  381. package/src/telemetry/usage-telemetry-reporter.test.ts +154 -0
  382. package/src/telemetry/usage-telemetry-reporter.ts +26 -1
  383. package/src/tools/acp/context.ts +20 -0
  384. package/src/tools/acp/list-agents.test.ts +9 -19
  385. package/src/tools/acp/list-agents.ts +3 -15
  386. package/src/tools/acp/spawn.test.ts +173 -202
  387. package/src/tools/acp/spawn.ts +37 -172
  388. package/src/tools/acp/steer.test.ts +105 -8
  389. package/src/tools/acp/steer.ts +48 -17
  390. package/src/tools/apps/executors.ts +166 -50
  391. package/src/tools/browser/browser-execution.ts +12 -2
  392. package/src/tools/filesystem/write.ts +34 -0
  393. package/src/tools/network/web-fetch.ts +65 -24
  394. package/src/tools/skills/load.ts +1 -1
  395. package/src/tools/subagent/spawn.ts +2 -4
  396. package/src/tools/ui-surface/definitions.ts +32 -5
  397. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  398. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
  399. package/docs/plugins.md +0 -832
  400. package/examples/plugins/echo/register.ts +0 -143
  401. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  402. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  403. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
  404. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
  405. package/src/__tests__/pipeline-runner.test.ts +0 -554
  406. package/src/daemon/wake-target-adapter.ts +0 -253
  407. package/src/memory/v3/__tests__/assign.test.ts +0 -242
  408. package/src/memory/v3/__tests__/capabilities.test.ts +0 -118
  409. package/src/memory/v3/__tests__/core.test.ts +0 -39
  410. package/src/memory/v3/__tests__/health.test.ts +0 -219
  411. package/src/memory/v3/__tests__/maintain-job.test.ts +0 -288
  412. package/src/memory/v3/__tests__/needle.test.ts +0 -107
  413. package/src/memory/v3/__tests__/orchestrate.test.ts +0 -436
  414. package/src/memory/v3/__tests__/provider-blocks.test.ts +0 -13
  415. package/src/memory/v3/__tests__/reconcile.test.ts +0 -274
  416. package/src/memory/v3/__tests__/render-injection.test.ts +0 -61
  417. package/src/memory/v3/__tests__/router.test.ts +0 -332
  418. package/src/memory/v3/__tests__/selector.test.ts +0 -470
  419. package/src/memory/v3/__tests__/shadow-plugin.test.ts +0 -432
  420. package/src/memory/v3/__tests__/snapshot.test.ts +0 -168
  421. package/src/memory/v3/__tests__/tree.test.ts +0 -192
  422. package/src/memory/v3/assign.ts +0 -268
  423. package/src/memory/v3/capabilities.ts +0 -124
  424. package/src/memory/v3/core.ts +0 -26
  425. package/src/memory/v3/health.ts +0 -0
  426. package/src/memory/v3/maintain-job.ts +0 -314
  427. package/src/memory/v3/needle.ts +0 -115
  428. package/src/memory/v3/orchestrate.ts +0 -126
  429. package/src/memory/v3/page-content.ts +0 -34
  430. package/src/memory/v3/provider-blocks.ts +0 -26
  431. package/src/memory/v3/reconcile.ts +0 -523
  432. package/src/memory/v3/router.ts +0 -190
  433. package/src/memory/v3/selection-log-store.ts +0 -84
  434. package/src/memory/v3/selector.ts +0 -226
  435. package/src/memory/v3/shadow-plugin.ts +0 -411
  436. package/src/memory/v3/snapshot.ts +0 -209
  437. package/src/memory/v3/tree.ts +0 -174
  438. package/src/memory/v3/types.ts +0 -59
  439. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
  440. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
  441. package/src/plugins/defaults/circuit-breaker/package.json +0 -15
  442. package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
  443. package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
  444. package/src/plugins/defaults/compaction/register.ts +0 -35
  445. package/src/plugins/defaults/compaction/terminal.ts +0 -73
  446. package/src/plugins/defaults/empty-response/register.ts +0 -23
  447. package/src/plugins/defaults/history-repair/register.ts +0 -24
  448. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +0 -216
  449. package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
  450. package/src/plugins/defaults/overflow-reduce/package.json +0 -15
  451. package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
  452. package/src/plugins/defaults/title-generate/register.ts +0 -35
  453. package/src/plugins/defaults/tool-error/register.ts +0 -23
  454. package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
  455. package/src/proactive-artifact/aux-message-injector.ts +0 -97
  456. package/src/proactive-artifact/decision.test.ts +0 -226
  457. package/src/proactive-artifact/decision.ts +0 -165
  458. package/src/proactive-artifact/index.ts +0 -7
  459. package/src/proactive-artifact/job.test.ts +0 -962
  460. package/src/proactive-artifact/job.ts +0 -372
  461. package/src/proactive-artifact/message-copy.ts +0 -58
  462. package/src/proactive-artifact/trigger-state.test.ts +0 -286
  463. package/src/proactive-artifact/trigger-state.ts +0 -123
  464. package/src/util/map-limit.ts +0 -27
  465. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
  466. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
  467. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
  468. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
  469. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
  470. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
  471. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
  472. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
  473. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
  474. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
  475. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
package/openapi.yaml CHANGED
@@ -3,7 +3,7 @@
3
3
  openapi: 3.1.0
4
4
  info:
5
5
  title: Vellum Assistant API
6
- version: 0.8.8
6
+ version: 0.8.9
7
7
  description: Auto-generated OpenAPI specification for the Vellum Assistant runtime HTTP server.
8
8
  servers:
9
9
  - url: http://127.0.0.1:7821
@@ -95,7 +95,12 @@ 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
100
+ daemon restart) are transparently resumed from persisted history first, when the agent supports ACP session
101
+ loading. Resuming a terminal session re-spawns the host agent, so it requires guardian approval: the route acks
102
+ immediately with approvalPending=true and performs the resume in the background once approved, streaming results
103
+ over SSE."
99
104
  tags:
100
105
  - acp
101
106
  responses:
@@ -110,6 +115,14 @@ paths:
110
115
  type: string
111
116
  steered:
112
117
  type: boolean
118
+ resumed:
119
+ description: True when the session was resumed from persisted history before steering.
120
+ type: boolean
121
+ approvalPending:
122
+ description:
123
+ True when the steer triggered a guardian-approval-gated resume that will run asynchronously; watch SSE for
124
+ the outcome.
125
+ type: boolean
113
126
  required:
114
127
  - acpSessionId
115
128
  - steered
@@ -136,7 +149,9 @@ paths:
136
149
  delete:
137
150
  operationId: acp_sessions_delete
138
151
  summary: Bulk-clear terminal ACP sessions
139
- description: Remove every terminal-state row (completed/failed/cancelled) from the persisted acp_session_history table.
152
+ description:
153
+ Remove every terminal-state row (completed/failed/cancelled) from the persisted acp_session_history table.
154
+ Rows whose session is currently active in memory (e.g. resumed) or has a resume in flight are excluded.
140
155
  tags:
141
156
  - acp
142
157
  responses:
@@ -238,8 +253,8 @@ paths:
238
253
  operationId: acp_sessions_by_id_delete
239
254
  summary: Delete ACP session from history
240
255
  description:
241
- Remove a persisted ACP session row. Rejects with 409 when the session is still active in memory; idempotent
242
- for unknown ids.
256
+ Remove a persisted ACP session row. Rejects with 409 when the session is still active in memory or has a
257
+ resume in flight; idempotent for unknown ids.
243
258
  tags:
244
259
  - acp
245
260
  responses:
@@ -473,6 +488,8 @@ paths:
473
488
  type: string
474
489
  createdAt:
475
490
  type: number
491
+ updatedAt:
492
+ type: number
476
493
  version:
477
494
  type: string
478
495
  contentId:
@@ -481,6 +498,7 @@ paths:
481
498
  - id
482
499
  - name
483
500
  - createdAt
501
+ - updatedAt
484
502
  - version
485
503
  - contentId
486
504
  additionalProperties: false
@@ -15847,10 +15865,10 @@ paths:
15847
15865
  type: object
15848
15866
  properties: {}
15849
15867
  additionalProperties: false
15850
- /v1/memory/v3/health:
15868
+ /v1/memory/v3/backfill-sections:
15851
15869
  post:
15852
- operationId: memory_v3_health_post
15853
- summary: Print the v3 structural health report (read-only)
15870
+ operationId: memory_v3_backfillsections_post
15871
+ summary: "One-time: embed every page's sections (incl synthetic skill/CLI rows) into the dense store"
15854
15872
  tags:
15855
15873
  - memory
15856
15874
  responses:
@@ -15861,31 +15879,16 @@ paths:
15861
15879
  schema:
15862
15880
  type: object
15863
15881
  properties:
15864
- rendered:
15865
- type: string
15866
- counts:
15867
- type: object
15868
- properties:
15869
- unassigned:
15870
- type: number
15871
- danglingRefs:
15872
- type: number
15873
- novelClusters:
15874
- type: number
15875
- oversizedLeaves:
15876
- type: number
15877
- tinyLeaves:
15878
- type: number
15879
- required:
15880
- - unassigned
15881
- - danglingRefs
15882
- - novelClusters
15883
- - oversizedLeaves
15884
- - tinyLeaves
15885
- additionalProperties: false
15882
+ articles:
15883
+ type: number
15884
+ sections:
15885
+ type: number
15886
+ failures:
15887
+ type: number
15886
15888
  required:
15887
- - rendered
15888
- - counts
15889
+ - articles
15890
+ - sections
15891
+ - failures
15889
15892
  additionalProperties: false
15890
15893
  /v1/memory/v3/rebuild-index:
15891
15894
  post:
@@ -15907,93 +15910,6 @@ paths:
15907
15910
  required:
15908
15911
  - ok
15909
15912
  additionalProperties: false
15910
- /v1/memory/v3/reconcile:
15911
- post:
15912
- operationId: memory_v3_reconcile_post
15913
- summary: v1 convergence/prune pass over page+core refs (no rename detection without a prior snapshot)
15914
- tags:
15915
- - memory
15916
- responses:
15917
- "200":
15918
- description: Successful response
15919
- content:
15920
- application/json:
15921
- schema:
15922
- type: object
15923
- properties:
15924
- renames:
15925
- type: array
15926
- items:
15927
- type: object
15928
- properties:
15929
- id:
15930
- type: string
15931
- oldPath:
15932
- type: string
15933
- newPath:
15934
- type: string
15935
- required:
15936
- - oldPath
15937
- - newPath
15938
- additionalProperties: false
15939
- deleted:
15940
- type: array
15941
- items:
15942
- type: string
15943
- prunedCore:
15944
- type: array
15945
- items:
15946
- type: string
15947
- required:
15948
- - renames
15949
- - deleted
15950
- - prunedCore
15951
- additionalProperties: false
15952
- /v1/memory/v3/set-core:
15953
- post:
15954
- operationId: memory_v3_setcore_post
15955
- summary: Add/remove always-on core leaves (validates + previews cost)
15956
- tags:
15957
- - memory
15958
- responses:
15959
- "200":
15960
- description: Successful response
15961
- content:
15962
- application/json:
15963
- schema:
15964
- type: object
15965
- properties:
15966
- nextCore:
15967
- type: array
15968
- items:
15969
- type: string
15970
- alwaysOnPageCount:
15971
- type: number
15972
- written:
15973
- type: boolean
15974
- required:
15975
- - nextCore
15976
- - alwaysOnPageCount
15977
- - written
15978
- additionalProperties: false
15979
- requestBody:
15980
- required: true
15981
- content:
15982
- application/json:
15983
- schema:
15984
- type: object
15985
- properties:
15986
- add:
15987
- type: array
15988
- items:
15989
- type: string
15990
- remove:
15991
- type: array
15992
- items:
15993
- type: string
15994
- write:
15995
- type: boolean
15996
- additionalProperties: false
15997
15913
  /v1/messages:
15998
15914
  get:
15999
15915
  operationId: messages_get
@@ -16020,8 +15936,13 @@ paths:
16020
15936
  type: array
16021
15937
  items:
16022
15938
  type: string
15939
+ clientMessageId:
15940
+ type: string
16023
15941
  role:
16024
15942
  type: string
15943
+ enum:
15944
+ - user
15945
+ - assistant
16025
15946
  content:
16026
15947
  type: string
16027
15948
  timestamp:
@@ -16413,6 +16334,10 @@ paths:
16413
16334
  const: thinking
16414
16335
  thinking:
16415
16336
  type: string
16337
+ startedAt:
16338
+ type: number
16339
+ completedAt:
16340
+ type: number
16416
16341
  required:
16417
16342
  - type
16418
16343
  - thinking
@@ -16985,6 +16910,12 @@ paths:
16985
16910
  type: string
16986
16911
  clientTimezone:
16987
16912
  type: string
16913
+ clientMessageId:
16914
+ type: string
16915
+ description:
16916
+ Client-generated idempotency nonce. Persisted on the row and echoed back on the message_echo event and the
16917
+ messages snapshot so the client can correlate its optimistic row by identity. Duplicate sends for
16918
+ the same (conversation, clientMessageId) are deduplicated server-side.
16988
16919
  inferenceProfile:
16989
16920
  anyOf:
16990
16921
  - type: string
@@ -19416,6 +19347,181 @@ paths:
19416
19347
  required: true
19417
19348
  schema:
19418
19349
  type: string
19350
+ get:
19351
+ operationId: plugins_by_name_get
19352
+ summary: Get a plugin's detail view
19353
+ description:
19354
+ Resolve a single plugin's tracked metadata (description, homepage, license, version, source) plus its
19355
+ README markdown. Unions the locally installed copy, the marketplace manifest, and the plugin's repository at the
19356
+ pinned ref — preferring the installed copy. Names that are neither installed nor present in the catalog return
19357
+ 404. Powers the web plugin detail page; mirrors `GET /v1/skills/:id`.
19358
+ tags:
19359
+ - plugins
19360
+ responses:
19361
+ "200":
19362
+ description: Successful response
19363
+ content:
19364
+ application/json:
19365
+ schema:
19366
+ type: object
19367
+ properties:
19368
+ name:
19369
+ type: string
19370
+ description: Install name. Matches `assistant plugins install <name>`.
19371
+ installed:
19372
+ type: boolean
19373
+ description: Whether a copy is materialized under `<workspaceDir>/plugins/<name>/`.
19374
+ description:
19375
+ anyOf:
19376
+ - type: string
19377
+ - type: "null"
19378
+ description: Short description, best-effort across disk, manifest, and repo.
19379
+ homepage:
19380
+ anyOf:
19381
+ - type: string
19382
+ - type: "null"
19383
+ description: Project homepage URL, when known.
19384
+ license:
19385
+ anyOf:
19386
+ - type: string
19387
+ - type: "null"
19388
+ description: SPDX license expression, when known.
19389
+ version:
19390
+ anyOf:
19391
+ - type: string
19392
+ - type: "null"
19393
+ description: Resolved version (installed copy first, then repo `package.json`).
19394
+ source:
19395
+ oneOf:
19396
+ - type: object
19397
+ properties:
19398
+ kind:
19399
+ type: string
19400
+ const: first-party
19401
+ required:
19402
+ - kind
19403
+ additionalProperties: false
19404
+ - type: object
19405
+ properties:
19406
+ kind:
19407
+ type: string
19408
+ const: github
19409
+ repo:
19410
+ type: string
19411
+ description: "`owner/repo` of the external plugin repository."
19412
+ path:
19413
+ description: Directory within the repo, when the plugin is not at the root.
19414
+ type: string
19415
+ ref:
19416
+ type: string
19417
+ description: Pinned git ref the plugin is fetched from.
19418
+ required:
19419
+ - kind
19420
+ - repo
19421
+ - ref
19422
+ additionalProperties: false
19423
+ description: "Origin of the match: a first-party in-repo plugin or a whitelisted external one."
19424
+ readme:
19425
+ anyOf:
19426
+ - type: string
19427
+ - type: "null"
19428
+ description: README markdown, or null when the plugin ships none.
19429
+ ref:
19430
+ type: string
19431
+ description: Git ref the catalog metadata / README were resolved at.
19432
+ required:
19433
+ - name
19434
+ - installed
19435
+ - description
19436
+ - homepage
19437
+ - license
19438
+ - version
19439
+ - source
19440
+ - readme
19441
+ - ref
19442
+ additionalProperties: false
19443
+ "400":
19444
+ description: The plugin name failed sanitization (e.g. contained slashes, dots, or uppercase letters).
19445
+ "404":
19446
+ description: No installed copy and no catalog entry claims the given name.
19447
+ parameters:
19448
+ - name: name
19449
+ in: path
19450
+ required: true
19451
+ schema:
19452
+ type: string
19453
+ - name: ref
19454
+ in: query
19455
+ required: false
19456
+ schema:
19457
+ type: string
19458
+ description: Optional git ref to read catalog metadata / README at. Defaults to the CLI's `DEFAULT_PLUGIN_REF`.
19459
+ /v1/plugins/install:
19460
+ post:
19461
+ operationId: plugins_install_post
19462
+ summary: Install a plugin
19463
+ description:
19464
+ "Install a plugin by name from the canonical source — a whitelisted `experimental/plugins/marketplace.json`
19465
+ entry, else the first-party `experimental/plugins/<name>/` convention. Always resolves against the curated
19466
+ default git ref (no caller-supplied ref): installing from an unreviewed revision would bypass the
19467
+ marketplace/first-party curation boundary and let attacker-controlled code be loaded. Materializes the plugin
19468
+ under `<workspaceDir>/plugins/<name>/`; the assistant must be restarted to load it. Mirrors the CLI's `assistant
19469
+ plugins install <name>`. An already-installed name without `force` returns 409; a name that resolves to nothing
19470
+ returns 404. Sibling to `POST /v1/skills/install`."
19471
+ tags:
19472
+ - plugins
19473
+ responses:
19474
+ "200":
19475
+ description: Successful response
19476
+ content:
19477
+ application/json:
19478
+ schema:
19479
+ type: object
19480
+ properties:
19481
+ ok:
19482
+ type: boolean
19483
+ const: true
19484
+ name:
19485
+ type: string
19486
+ description: Install name that was materialized.
19487
+ target:
19488
+ type: string
19489
+ description: Absolute path the plugin was materialized into on the host.
19490
+ fileCount:
19491
+ type: number
19492
+ description: Number of files written for the installed plugin.
19493
+ ref:
19494
+ type: string
19495
+ description: Git ref the plugin was fetched from.
19496
+ required:
19497
+ - ok
19498
+ - name
19499
+ - target
19500
+ - fileCount
19501
+ - ref
19502
+ additionalProperties: false
19503
+ "400":
19504
+ description: The request body was missing `name` or the name failed sanitization.
19505
+ "404":
19506
+ description: No plugin resolves to the given name at the requested ref.
19507
+ "409":
19508
+ description: A plugin with the same name is already installed and `force` was not set.
19509
+ requestBody:
19510
+ required: true
19511
+ content:
19512
+ application/json:
19513
+ schema:
19514
+ type: object
19515
+ properties:
19516
+ name:
19517
+ type: string
19518
+ description: Install name to resolve against the catalog (first-party directory or marketplace entry).
19519
+ force:
19520
+ description: Overwrite an existing install in place. Defaults to false.
19521
+ type: boolean
19522
+ required:
19523
+ - name
19524
+ additionalProperties: false
19419
19525
  /v1/plugins/search:
19420
19526
  get:
19421
19527
  operationId: plugins_search_get
@@ -19447,13 +19553,49 @@ paths:
19447
19553
  properties:
19448
19554
  name:
19449
19555
  type: string
19450
- description: Directory name under `experimental/plugins/`. Matches `assistant plugins install <name>`.
19556
+ description: Install name. Matches `assistant plugins install <name>`.
19451
19557
  path:
19452
19558
  type: string
19453
- description: Repo-relative path of the match (e.g. `experimental/plugins/<name>`).
19559
+ description:
19560
+ "Human-readable origin: a repo-relative path (`experimental/plugins/<name>`) for first-party plugins or a
19561
+ `github:owner/repo@ref` locator for external ones."
19562
+ description:
19563
+ description: Short description, when known (external entries only today).
19564
+ type: string
19565
+ source:
19566
+ oneOf:
19567
+ - type: object
19568
+ properties:
19569
+ kind:
19570
+ type: string
19571
+ const: first-party
19572
+ required:
19573
+ - kind
19574
+ additionalProperties: false
19575
+ - type: object
19576
+ properties:
19577
+ kind:
19578
+ type: string
19579
+ const: github
19580
+ repo:
19581
+ type: string
19582
+ description: "`owner/repo` of the external plugin repository."
19583
+ path:
19584
+ description: Directory within the repo, when the plugin is not at the root.
19585
+ type: string
19586
+ ref:
19587
+ type: string
19588
+ description: Pinned git ref the plugin is fetched from.
19589
+ required:
19590
+ - kind
19591
+ - repo
19592
+ - ref
19593
+ additionalProperties: false
19594
+ description: "Origin of the match: a first-party in-repo plugin or a whitelisted external one."
19454
19595
  required:
19455
19596
  - name
19456
19597
  - path
19598
+ - source
19457
19599
  additionalProperties: false
19458
19600
  description: Directory matches, sorted alphabetically by name.
19459
19601
  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-dev.202606091853.fbaa2ae",
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",
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Early activation-session marking.
3
+ *
4
+ * The agent loop resolves TOOLS before the SYSTEM PROMPT, so the activation
5
+ * marker must be written before tool resolution on the first activation-rail
6
+ * turn — otherwise the `activation` skill is not preactivated and the emit
7
+ * handler is gated off for the very turn that emits Moment 1. The marking lives
8
+ * in `applyBootstrapTemplate`, which is called from `setOnboardingContext` (the
9
+ * earliest point the conversation knows its bootstrap selection) as well as
10
+ * from `buildSystemPrompt` as an idempotent backstop.
11
+ *
12
+ * These tests exercise `applyBootstrapTemplate` directly against the real
13
+ * DB-backed `isActivationSession` and a real workspace BOOTSTRAP.md, proving the
14
+ * marker is set INDEPENDENT of any `buildSystemPrompt` render.
15
+ */
16
+
17
+ import { copyFileSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
18
+ import { join } from "node:path";
19
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
20
+
21
+ const TEST_DIR = process.env.VELLUM_WORKSPACE_DIR!;
22
+
23
+ mock.module("../util/logger.js", () => ({
24
+ getLogger: () =>
25
+ new Proxy({} as Record<string, unknown>, {
26
+ get: () => () => {},
27
+ }),
28
+ }));
29
+
30
+ const { applyBootstrapTemplate } = await import("../prompts/system-prompt.js");
31
+ const { isActivationSession } =
32
+ await import("../memory/activation-session-store.js");
33
+ const { ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE } =
34
+ await import("../telemetry/activation-funnel.js");
35
+ const { getDb } = await import("../memory/db-connection.js");
36
+ const { initializeDb } = await import("../memory/db-init.js");
37
+ const { activationSessions } = await import("../memory/schema.js");
38
+
39
+ initializeDb();
40
+
41
+ /** Seed the workspace BOOTSTRAP.md with the unmodified generic template so the
42
+ * one-shot reseed inside `applyBootstrapTemplate` fires. */
43
+ function seedGenericBootstrap(): void {
44
+ mkdirSync(TEST_DIR, { recursive: true });
45
+ const generic = readFileSync(
46
+ join(import.meta.dirname, "..", "prompts", "templates", "BOOTSTRAP.md"),
47
+ "utf-8",
48
+ );
49
+ writeFileSync(join(TEST_DIR, "BOOTSTRAP.md"), generic, "utf-8");
50
+ }
51
+
52
+ describe("applyBootstrapTemplate — early activation marking", () => {
53
+ beforeEach(() => {
54
+ getDb().delete(activationSessions).run();
55
+ });
56
+
57
+ test("marks the conversation when the activation-rail template is applied", () => {
58
+ seedGenericBootstrap();
59
+ expect(isActivationSession("rail-conv")).toBe(false);
60
+
61
+ // No buildSystemPrompt call — marking must happen here.
62
+ applyBootstrapTemplate(ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE, "rail-conv");
63
+
64
+ expect(isActivationSession("rail-conv")).toBe(true);
65
+ });
66
+
67
+ test("does not mark when a non-rail bootstrap template is applied", () => {
68
+ seedGenericBootstrap();
69
+
70
+ applyBootstrapTemplate("BOOTSTRAP-REFERENCE.md", "non-rail-conv");
71
+
72
+ expect(isActivationSession("non-rail-conv")).toBe(false);
73
+ });
74
+
75
+ test("does not mark when no conversation id is supplied", () => {
76
+ seedGenericBootstrap();
77
+
78
+ applyBootstrapTemplate(ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE);
79
+
80
+ // Nothing to assert by id; confirm the table stayed empty.
81
+ const rows = getDb().select().from(activationSessions).all();
82
+ expect(rows.length).toBe(0);
83
+ });
84
+
85
+ test("does not mark when BOOTSTRAP.md is customized to something else", () => {
86
+ mkdirSync(TEST_DIR, { recursive: true });
87
+ // A user-customized BOOTSTRAP.md is neither the generic template (so the
88
+ // reseed no-ops) nor the activation-rail template — the rail is not active.
89
+ writeFileSync(
90
+ join(TEST_DIR, "BOOTSTRAP.md"),
91
+ "# My custom bootstrap\n",
92
+ "utf-8",
93
+ );
94
+
95
+ applyBootstrapTemplate(ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE, "custom-conv");
96
+
97
+ expect(isActivationSession("custom-conv")).toBe(false);
98
+ });
99
+
100
+ test("marks idempotently when BOOTSTRAP.md already holds the rail template", () => {
101
+ mkdirSync(TEST_DIR, { recursive: true });
102
+ // Simulate a later turn: BOOTSTRAP.md already holds the rail template, so
103
+ // the reseed no-ops but marking still fires (idempotent backstop).
104
+ copyFileSync(
105
+ join(
106
+ import.meta.dirname,
107
+ "..",
108
+ "prompts",
109
+ "templates",
110
+ ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE,
111
+ ),
112
+ join(TEST_DIR, "BOOTSTRAP.md"),
113
+ );
114
+
115
+ applyBootstrapTemplate(ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE, "rail-conv-2");
116
+ applyBootstrapTemplate(ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE, "rail-conv-2");
117
+
118
+ expect(isActivationSession("rail-conv-2")).toBe(true);
119
+ });
120
+ });