@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
@@ -3,16 +3,28 @@
3
3
  *
4
4
  * `resolveAcpAgent(id)` merges user-provided `config.acp.agents[id]` (wins on
5
5
  * overlap) with the bundled `DEFAULT_ACP_AGENT_PROFILES` so common agents like
6
- * `claude` and `codex` Just Work whenever `acp.enabled: true` — no per-user
7
- * config required. The result is a discriminated union covering every reason
6
+ * `claude` and `codex` Just Work whenever ACP is enabled (the `acp` feature
7
+ * flag or `acp.enabled: true`; see `feature-gate.ts`), with no per-user
8
+ * config required. Natural names ("claude code", "Gemini CLI") resolve via
9
+ * `AGENT_ID_ALIASES` when the raw id misses both maps. The result is a
10
+ * discriminated union covering every reason
8
11
  * a spawn might fail before we even start the agent process: ACP disabled,
9
12
  * unknown agent id, or binary missing from PATH. Callers (acp_spawn,
10
13
  * acp_list_agents, and the `/v1/acp/spawn` HTTP route) get a single source
11
14
  * of truth and matching actionable hints.
12
15
  *
16
+ * The resolver NEVER fetches or runs packages in the (untrusted) task cwd.
17
+ * When the adapter binary is missing, resolution simply fails with
18
+ * `binary_not_found`; the `resolveAgentWithAutoInstall` flow in
19
+ * `auto-install.ts` then performs a one-time sandboxed `bun` global install
20
+ * (clean temp cwd, secrets stripped from the installer env) and re-resolves.
21
+ * The resolved command is therefore ALWAYS the real adapter binary on PATH,
22
+ * so downstream gates (env injection, resume hints) key off the command
23
+ * basename directly.
24
+ *
13
25
  * `listAcpAgents()` exposes the merged catalog with availability info for
14
26
  * the `acp_list_agents` tool — same merge semantics, plus per-entry
15
- * `available` / `setupHint` derived from `Bun.which` + `DEFAULT_AGENT_NPM_PACKAGES`.
27
+ * `available` / `setupHint` derived from the same binary resolution.
16
28
  */
17
29
 
18
30
  import {
@@ -21,6 +33,7 @@ import {
21
33
  } from "../config/acp-defaults.js";
22
34
  import type { AcpAgentConfig } from "../config/acp-schema.js";
23
35
  import { getConfig } from "../config/loader.js";
36
+ import { isAcpEnabled } from "./feature-gate.js";
24
37
 
25
38
  /**
26
39
  * Whether this agent's entry came from user config (wins over default) or
@@ -29,8 +42,11 @@ import { getConfig } from "../config/loader.js";
29
42
  */
30
43
  type AcpAgentSource = "config" | "default";
31
44
 
32
- type ResolveAcpAgentResult =
45
+ export type ResolveAcpAgentResult =
33
46
  | { ok: true; agent: AcpAgentConfig }
47
+ | ResolveAcpAgentFailure;
48
+
49
+ export type ResolveAcpAgentFailure =
34
50
  | { ok: false; reason: "acp_disabled"; hint: string }
35
51
  | { ok: false; reason: "unknown_agent"; available: string[] }
36
52
  | {
@@ -40,6 +56,33 @@ type ResolveAcpAgentResult =
40
56
  command: string;
41
57
  };
42
58
 
59
+ /**
60
+ * Single source of truth for the user-facing message of each resolver
61
+ * failure reason. Every caller that surfaces a resolve failure (acp_spawn
62
+ * tool, /v1/acp/spawn route, AcpSessionManager.resumeFromHistory) renders
63
+ * the same copy through this helper; only the transport wrapping (tool
64
+ * error result vs. HTTP error class vs. thrown Error) differs per caller.
65
+ */
66
+ export function formatResolveFailure(
67
+ agentId: string,
68
+ failure: ResolveAcpAgentFailure,
69
+ ): string {
70
+ switch (failure.reason) {
71
+ case "acp_disabled":
72
+ return failure.hint;
73
+ case "unknown_agent":
74
+ return `Unknown agent "${agentId}". Available: ${failure.available.join(", ")}.`;
75
+ case "binary_not_found":
76
+ return `${failure.command} is not on PATH. ${failure.hint}`;
77
+ default: {
78
+ const _exhaustive: never = failure;
79
+ throw new Error(
80
+ `Unexpected acp resolver reason: ${(_exhaustive as { reason: string }).reason}`,
81
+ );
82
+ }
83
+ }
84
+ }
85
+
43
86
  interface AcpAgentEntry {
44
87
  id: string;
45
88
  command: string;
@@ -56,34 +99,91 @@ interface AcpAgentEntry {
56
99
  * the same string instead of duplicating near-identical copy.
57
100
  */
58
101
  export const ACP_DISABLED_HINT =
59
- "Set 'acp.enabled': true in ~/.vellum/workspace/config.json (or via the runtime config endpoint).";
102
+ "Enable the \"ACP Coding Agents\" feature flag in the client's feature flags UI (or set 'acp.enabled': true in ~/.vellum/workspace/config.json).";
60
103
 
61
104
  function installHintFor(command: string): string {
62
105
  const pkg = DEFAULT_AGENT_NPM_PACKAGES[command];
63
106
  return pkg
64
- ? `npm i -g ${pkg}`
107
+ ? `bun add -g ${pkg}`
65
108
  : `Install '${command}' and ensure it is on PATH.`;
66
109
  }
67
110
 
68
111
  /**
69
- * Resolve the binary using the same PATH the spawn will see. `AcpAgentProcess`
112
+ * Resolve a binary using the same PATH the spawn will see. `AcpAgentProcess`
70
113
  * spawns with `{ ...process.env, ...config.env }`, so a per-agent `env.PATH`
71
- * override wins over the daemon's PATH. Mirror that here so a config that
114
+ * override wins over the assistant's PATH. Mirror that here so a config that
72
115
  * relies on a custom PATH to locate the binary doesn't fail preflight.
73
116
  */
74
- function findAgentBinary(agent: AcpAgentConfig): string | null {
117
+ function whichOnAgentPath(
118
+ agent: AcpAgentConfig,
119
+ command: string,
120
+ ): string | null {
75
121
  const PATH = agent.env?.PATH ?? process.env.PATH;
76
- return Bun.which(agent.command, PATH != null ? { PATH } : undefined);
122
+ return Bun.which(command, PATH != null ? { PATH } : undefined);
123
+ }
124
+
125
+ /**
126
+ * Resolve an agent config to its runnable form, or `null` when its `command`
127
+ * is not on PATH. Resolution is pure preflight: the binary is used directly
128
+ * when present, and otherwise the agent cannot spawn (callers fall back to
129
+ * the sandboxed `bun` global install in `auto-install.ts`, then re-resolve).
130
+ *
131
+ * Crucially, this never fetches or executes anything in the task cwd: a
132
+ * missing binary returns `null` rather than running a package manager from
133
+ * the (untrusted) project directory.
134
+ */
135
+ function resolveRunnableAgent(agent: AcpAgentConfig): AcpAgentConfig | null {
136
+ return whichOnAgentPath(agent, agent.command) ? agent : null;
137
+ }
138
+
139
+ /**
140
+ * Natural-name aliases for the bundled agent ids, keyed by normalized form
141
+ * (see `normalizeAgentId`). Resolution sugar only: aliases are consulted as a
142
+ * last-resort fallback in `lookupAgent` and never appear in the
143
+ * `listAcpAgents` catalog.
144
+ */
145
+ const AGENT_ID_ALIASES: Record<string, string> = {
146
+ claudecode: "claude",
147
+ codexcli: "codex",
148
+ openaicodex: "codex",
149
+ geminicli: "gemini",
150
+ googlegemini: "gemini",
151
+ };
152
+
153
+ /**
154
+ * Normalize a raw agent id for alias matching: lowercase and strip spaces,
155
+ * underscores, and hyphens so "Claude Code", "claude-code", and
156
+ * "claude_code" all hit the same alias entry.
157
+ */
158
+ function normalizeAgentId(id: string): string {
159
+ return id.toLowerCase().replace(/[\s_-]/g, "");
77
160
  }
78
161
 
79
162
  /**
80
163
  * Resolve an id against user config first, then bundled defaults. Returns the
81
164
  * resolved entry plus a `source` label so callers can surface "user override
82
165
  * vs bundled default" without re-deriving it.
166
+ *
167
+ * When the raw id misses both maps, fall back to `AGENT_ID_ALIASES` so
168
+ * natural names like "claude code" or "Gemini CLI" resolve to the canonical
169
+ * id. The alias is consulted ONLY after both direct lookups miss, so a user
170
+ * config entry literally keyed "claude code" always wins over the alias.
83
171
  */
84
172
  function lookupAgent(
85
173
  userAgents: Record<string, AcpAgentConfig>,
86
174
  id: string,
175
+ ): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
176
+ const direct = directLookup(userAgents, id);
177
+ if (direct) return direct;
178
+ const canonicalId = AGENT_ID_ALIASES[normalizeAgentId(id)];
179
+ return canonicalId !== undefined
180
+ ? directLookup(userAgents, canonicalId)
181
+ : undefined;
182
+ }
183
+
184
+ function directLookup(
185
+ userAgents: Record<string, AcpAgentConfig>,
186
+ id: string,
87
187
  ): { agent: AcpAgentConfig; source: AcpAgentSource } | undefined {
88
188
  const userAgent = userAgents[id];
89
189
  if (userAgent) return { agent: userAgent, source: "config" };
@@ -109,16 +209,17 @@ function mergedAgentIds(userAgents: Record<string, AcpAgentConfig>): string[] {
109
209
  * Resolve an ACP agent id to its config + binary preflight result.
110
210
  *
111
211
  * Order of checks:
112
- * 1. ACP must be enabled in config.
212
+ * 1. ACP must be enabled (feature flag or config; see `isAcpEnabled`).
113
213
  * 2. The id must resolve to an agent (user config wins; falls back to defaults).
114
- * 3. The agent's `command` must be discoverable via `Bun.which` (PATH lookup).
214
+ * 3. The agent must be runnable: its `command` on PATH (see
215
+ * `resolveRunnableAgent`).
115
216
  *
116
217
  * Each failure mode carries an actionable hint so callers can surface a
117
218
  * single user-facing message without re-deriving the remediation.
118
219
  */
119
220
  export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
120
221
  const config = getConfig();
121
- if (!config.acp.enabled) {
222
+ if (!isAcpEnabled(config)) {
122
223
  return { ok: false, reason: "acp_disabled", hint: ACP_DISABLED_HINT };
123
224
  }
124
225
 
@@ -133,7 +234,8 @@ export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
133
234
  }
134
235
 
135
236
  const { agent } = found;
136
- if (!findAgentBinary(agent)) {
237
+ const runnable = resolveRunnableAgent(agent);
238
+ if (!runnable) {
137
239
  return {
138
240
  ok: false,
139
241
  reason: "binary_not_found",
@@ -142,7 +244,7 @@ export function resolveAcpAgent(id: string): ResolveAcpAgentResult {
142
244
  };
143
245
  }
144
246
 
145
- return { ok: true, agent };
247
+ return { ok: true, agent: runnable };
146
248
  }
147
249
 
148
250
  /**
@@ -160,7 +262,7 @@ export function listAcpAgents(): {
160
262
  agents: AcpAgentEntry[];
161
263
  } {
162
264
  const config = getConfig();
163
- if (!config.acp.enabled) {
265
+ if (!isAcpEnabled(config)) {
164
266
  return { enabled: false, agents: [] };
165
267
  }
166
268
 
@@ -168,7 +270,10 @@ export function listAcpAgents(): {
168
270
  const agents: AcpAgentEntry[] = mergedAgentIds(userAgents).map((id) => {
169
271
  // Non-null: ids come from `mergedAgentIds` so the lookup always resolves.
170
272
  const { agent, source } = lookupAgent(userAgents, id)!;
171
- const available = findAgentBinary(agent) !== null;
273
+ // Same binary preflight as `resolveAcpAgent`: available iff the command
274
+ // is on PATH. A missing binary is auto-installed at spawn time, but the
275
+ // catalog reflects what is runnable right now.
276
+ const available = resolveRunnableAgent(agent) !== null;
172
277
  const entry: AcpAgentEntry = {
173
278
  id,
174
279
  command: agent.command,
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared `claude --resume` hint for ACP sessions.
3
+ *
4
+ * `claude --resume <id>` is Claude Code-specific (the claude-agent-acp
5
+ * adapter binary). Other adapters resume differently or not at all, so the
6
+ * hint is gated by the resolved adapter, not the agent id - this stays
7
+ * correct when a user aliases an id to a different binary. Callers pass the
8
+ * resolved command basename, which is always the real adapter binary.
9
+ *
10
+ * Used by the `acp_spawn` tool's success payload and the session manager's
11
+ * completion notification so both surfaces render identical copy. Returns
12
+ * an empty string for non-claude adapters; callers add their own
13
+ * surrounding separators.
14
+ */
15
+ export function claudeResumeHint(
16
+ command: string,
17
+ cwd: string,
18
+ sessionId: string,
19
+ ): string {
20
+ return command === "claude-agent-acp"
21
+ ? `To resume: cd ${cwd} && claude --resume ${sessionId}`
22
+ : "";
23
+ }