@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
@@ -1,126 +0,0 @@
1
- import type { ContextWindowCompactOptions } from "../../../../context/window-manager.js";
2
- import {
3
- createInitialReducerState,
4
- reduceContextOverflow,
5
- type ReducerState,
6
- } from "../../../../daemon/context-overflow-reducer.js";
7
- import type {
8
- Middleware,
9
- OverflowReduceArgs,
10
- OverflowReduceResult,
11
- } from "../../../types.js";
12
-
13
- /**
14
- * Default middleware for the `overflowReduce` pipeline — implements the
15
- * historical tier-loop semantics (forced compaction, tool-result truncation,
16
- * media stubbing, injection downgrade) plus the post-step re-injection /
17
- * re-estimation dance.
18
- *
19
- * The middleware intentionally ignores `next`. Overflow reduction is a
20
- * *terminal* behavior: there is no downstream implementation to defer to when
21
- * a user-supplied middleware short-circuits. Later plugins may still wrap this
22
- * one (outer middleware can observe each reduction iteration via their own
23
- * `next` callback) but the default never delegates to a hypothetical base
24
- * handler — the inline loop was the base.
25
- */
26
- const defaultOverflowReduceMiddleware: Middleware<
27
- OverflowReduceArgs,
28
- OverflowReduceResult
29
- > = async function defaultOverflowReduceMiddleware(args, _next, _ctx) {
30
- let messages = args.messages;
31
- let runMessages = args.runMessages;
32
- let injectionMode: "full" | "minimal" = "full";
33
- let reducerState: ReducerState = createInitialReducerState();
34
- let reducerCompacted = false;
35
- let attempts = 0;
36
-
37
- while (attempts < args.maxAttempts && !reducerState.exhausted) {
38
- // Abort check at the top of every iteration. When the pipeline runner
39
- // arms a timeout (or the caller aborts externally), `args.abortSignal`
40
- // is linked to that trigger via `linkAbortSignal`, so this check lets
41
- // us bail out BETWEEN iterations rather than letting another round of
42
- // compaction / re-injection mutate `ctx.messages` after the turn has
43
- // already failed. Individual `reduceContextOverflow` calls also honor
44
- // the signal, but without this gate a fresh iteration could still
45
- // start after the signal fires, since the previous one returned
46
- // normally before the abort propagated.
47
- args.abortSignal?.throwIfAborted();
48
-
49
- attempts++;
50
- args.emitActivityState();
51
-
52
- const basisMessages = messages;
53
- const step = await reduceContextOverflow(
54
- basisMessages,
55
- {
56
- providerName: args.providerName,
57
- systemPrompt: args.systemPrompt,
58
- contextWindow: args.contextWindow,
59
- targetTokens: args.preflightBudget,
60
- toolTokenBudget: args.toolTokenBudget,
61
- },
62
- reducerState,
63
- (msgs, signal, opts: ContextWindowCompactOptions) =>
64
- args.compactFn(msgs, signal, opts),
65
- args.abortSignal,
66
- );
67
-
68
- reducerState = step.state;
69
- messages = step.messages;
70
- injectionMode = step.state.injectionMode;
71
-
72
- // Per-iteration compaction flag: whether THIS step just produced a
73
- // fresh compaction. PKB / NOW re-injection is gated on this — see the
74
- // reinjectForMode JSDoc for why the two signals differ.
75
- const stepCompacted = step.compactionResult?.compacted === true;
76
-
77
- // Let the orchestrator apply compaction side effects (circuit-breaker
78
- // tracking, event emission, ctx mutation) before we re-inject.
79
- if (step.compactionResult) {
80
- await args.onCompactionResult(step.compactionResult, basisMessages);
81
- if (stepCompacted) {
82
- reducerCompacted = true;
83
- }
84
- }
85
-
86
- // Second abort gate — if the side effects or the step itself took us
87
- // past the deadline, don't rebuild runMessages or iterate again.
88
- args.abortSignal?.throwIfAborted();
89
-
90
- // Rebuild runMessages via the orchestrator-supplied helper (which
91
- // re-runs `applyRuntimeInjections` with potentially downgraded mode
92
- // and freshly re-hydrated PKB/NOW blocks after compaction). We pass
93
- // the current reduced `messages` explicitly so the orchestrator never
94
- // has to read from mutable shared state to rebuild runMessages — a
95
- // tier that doesn't trigger compaction (tool-result truncation, media
96
- // stubbing) won't update `ctx.messages` on its own.
97
- //
98
- // `stepCompacted` and `reducerCompacted` are both passed so the
99
- // orchestrator can gate PKB / NOW re-injection per-iteration while
100
- // keeping `slackChronologicalMessages` suppressed once any iteration
101
- // has compacted.
102
- runMessages = await args.reinjectForMode(
103
- messages,
104
- injectionMode,
105
- stepCompacted,
106
- reducerCompacted,
107
- );
108
-
109
- // Re-estimate with injections included — `step.estimatedTokens` was
110
- // computed on bare history and doesn't account for tokens added by
111
- // runtime injections.
112
- const postInjectionTokens = args.estimatePostInjection(runMessages);
113
- if (postInjectionTokens <= args.preflightBudget) break;
114
- }
115
-
116
- return {
117
- messages,
118
- runMessages,
119
- injectionMode,
120
- reducerState,
121
- reducerCompacted,
122
- attempts,
123
- };
124
- };
125
-
126
- export default defaultOverflowReduceMiddleware;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-overflow-reduce",
3
- "version": "1.0.0",
4
- "description": "First-party default plugin wrapping the assistant's built-in overflow-reduce pipeline with a passthrough implementation.",
5
- "private": true,
6
- "license": "MIT",
7
- "type": "module",
8
- "main": "./register.ts",
9
- "engines": {
10
- "node": ">=20.12.0"
11
- },
12
- "peerDependencies": {
13
- "@vellumai/plugin-api": "^0.8.0"
14
- }
15
- }
@@ -1,42 +0,0 @@
1
- /**
2
- * Default `overflowReduce` plugin — extracted verbatim from the inline
3
- * preflight reducer loop that previously lived in
4
- * `daemon/conversation-agent-loop.ts` (the `while (preflightAttempts < …)`
5
- * block around lines 1045–1156 before PR 23).
6
- *
7
- * The plugin owns the reducer tier-loop (forced compaction, tool-result
8
- * truncation, media stubbing, injection downgrade) and the post-step
9
- * re-injection / re-estimation dance. Orchestrator-specific coupling
10
- * (activity emission, circuit-breaker tracking, compaction-result
11
- * application, runtime injection reassembly) is threaded in through the
12
- * callbacks carried on {@link OverflowReduceArgs}; the plugin itself has no
13
- * access to the agent-loop context object.
14
- *
15
- * The forced-compaction tier runs through the orchestrator-supplied
16
- * `compactFn`, which routes into the `compaction` plugin pipeline so
17
- * registered compaction middleware observes reducer-initiated invocations
18
- * alongside the orchestrator-owned call sites. Non-compaction tiers
19
- * (tool-result truncation, media stubbing, injection downgrade) remain
20
- * in-process: they mutate message arrays directly without crossing a
21
- * pipeline boundary. The reducer itself runs under the `overflowReduce`
22
- * pipeline, so the full layering is `overflowReduce` → reducer tier loop
23
- * → (for the forced-compaction tier only) nested `compaction` pipeline.
24
- */
25
-
26
- import { type Plugin } from "../../types.js";
27
- import defaultOverflowReduceMiddleware from "./middlewares/overflowReduce.js";
28
- import pkg from "./package.json" with { type: "json" };
29
-
30
- /**
31
- * The default plugin registered at bootstrap. No `init`/`onShutdown` —
32
- * registering the middleware is the only behavior.
33
- */
34
- export const defaultOverflowReducePlugin: Plugin = {
35
- manifest: {
36
- name: pkg.name,
37
- version: pkg.version,
38
- },
39
- middleware: {
40
- overflowReduce: defaultOverflowReduceMiddleware,
41
- },
42
- };
@@ -1,35 +0,0 @@
1
- /**
2
- * Default `title-generate` plugin.
3
- *
4
- * Contributes two hooks, both pure triggers that delegate the title work to
5
- * the service (`memory/conversation-title-service.ts`):
6
- *
7
- * - `user-prompt-submit` (`./hooks/user-prompt-submit.ts`) — first-pass title
8
- * generation from the submitted prompt.
9
- * - `stop` (`./hooks/stop.ts`) — second-pass regeneration once the
10
- * conversation reaches its third user turn, for a title that reflects the
11
- * established topic.
12
- *
13
- * Persistence and the resulting `conversation_title_updated` / `sync_changed`
14
- * broadcast are owned by the title service.
15
- *
16
- * Registered via a side-effect import from
17
- * `daemon/external-plugins-bootstrap.ts` so it is present in the registry
18
- * by the time {@link bootstrapPlugins} runs.
19
- */
20
-
21
- import { type Plugin } from "../../types.js";
22
- import stop from "./hooks/stop.js";
23
- import userPromptSubmit from "./hooks/user-prompt-submit.js";
24
- import pkg from "./package.json" with { type: "json" };
25
-
26
- export const defaultTitleGeneratePlugin: Plugin = {
27
- manifest: {
28
- name: pkg.name,
29
- version: pkg.version,
30
- },
31
- hooks: {
32
- "user-prompt-submit": userPromptSubmit,
33
- stop,
34
- },
35
- };
@@ -1,23 +0,0 @@
1
- /**
2
- * Default `tool-error` plugin.
3
- *
4
- * Contributes a `post-tool-use` hook that coaches the model to retry or report
5
- * a failed tool call, bounded per tool so an unrecoverable error doesn't churn.
6
- * The coaching is surfaced via `additionalContext` (a separate provider-only
7
- * block), leaving the tool result's own content untouched. The decision logic
8
- * lives in `./hooks/post-tool-use.ts`.
9
- */
10
-
11
- import { type Plugin } from "../../types.js";
12
- import postToolUse from "./hooks/post-tool-use.js";
13
- import pkg from "./package.json" with { type: "json" };
14
-
15
- export const defaultToolErrorPlugin: Plugin = {
16
- manifest: {
17
- name: pkg.name,
18
- version: pkg.version,
19
- },
20
- hooks: {
21
- "post-tool-use": postToolUse,
22
- },
23
- };
@@ -1,24 +0,0 @@
1
- /**
2
- * Default `tool-result-truncate` plugin.
3
- *
4
- * Contributes a `post-tool-use` hook that tail-drops an oversized tool result
5
- * down to a character budget derived from the model's context window before
6
- * the result is sent to the provider. The truncation implementation lives in
7
- * `./terminal.ts`; the hook in `./hooks/post-tool-use.ts` wires it into the
8
- * lifecycle. Defaults register before user plugins, so this runs at the front
9
- * of the hook chain.
10
- */
11
-
12
- import { type Plugin } from "../../types.js";
13
- import postToolUse from "./hooks/post-tool-use.js";
14
- import pkg from "./package.json" with { type: "json" };
15
-
16
- export const defaultToolResultTruncatePlugin: Plugin = {
17
- manifest: {
18
- name: pkg.name,
19
- version: pkg.version,
20
- },
21
- hooks: {
22
- "post-tool-use": postToolUse,
23
- },
24
- };
@@ -1,104 +0,0 @@
1
- /**
2
- * External plugin runtime — `globalThis.__vellumPluginRuntime` bridge.
3
- *
4
- * Workspace-local plugins (`<workspaceDir>/plugins/*`) get dynamic-imported by
5
- * {@link loadUserPlugins}. They need to call `registerPlugin()` from their
6
- * module body and they typically also want to read secrets, subscribe to
7
- * runtime events, etc.
8
- *
9
- * Importing those symbols by absolute path
10
- * (`/abs/path/to/assistant/src/plugins/registry.js`) works when the daemon is
11
- * running from source — both the daemon and the dynamic-imported plugin
12
- * resolve the same on-disk file and share module identity. It DOES NOT work
13
- * when the daemon is a `bun --compile` binary: the daemon's modules are baked
14
- * into the executable, and any absolute-path import re-loads a fresh disk
15
- * copy. `registerPlugin()` then writes into a disjoint registry instance and
16
- * the daemon never sees the plugin.
17
- *
18
- * The fix is to expose a single, stable handle on `globalThis` that plugins
19
- * read at module-load time. The daemon's bundled modules attach themselves
20
- * here once at startup; plugins consume the same instance regardless of how
21
- * the daemon was built.
22
- *
23
- * Plugins use the bridge like this:
24
- *
25
- * const runtime = (globalThis as { __vellumPluginRuntime?: ... })
26
- * .__vellumPluginRuntime;
27
- * if (!runtime || runtime.version !== 1) throw new Error("...");
28
- * const { registerPlugin, assistantEventHub, getSecureKeyAsync } = runtime;
29
- *
30
- * Type-only imports (`import type { Plugin } from "..."`) remain free to use
31
- * absolute paths or workspace-local copies — the TypeScript compiler erases
32
- * them and they have no module-identity effect at runtime.
33
- *
34
- * See `assistant/docs/plugins.md` for the full authoring contract and
35
- * `assistant/examples/plugins/echo/register.ts` for a worked example.
36
- */
37
-
38
- import { assistantEventHub } from "../runtime/assistant-event-hub.js";
39
- import { getSecureKeyAsync } from "../security/secure-keys.js";
40
- import { registerPlugin } from "./registry.js";
41
-
42
- /**
43
- * The handle plugins read from `globalThis.__vellumPluginRuntime`.
44
- *
45
- * `version` is the contract version. Plugins should assert against the
46
- * version they were authored against and refuse to register if they see a
47
- * different one — bumping it is a breaking change to the plugin surface.
48
- *
49
- * The field set is intentionally small: the most-commonly-needed symbols
50
- * across both static (module-load-time) and dynamic (init-time) plugin
51
- * lifecycle. Plugins that need richer runtime state can still receive it
52
- * through {@link PluginInitContext} during `init()`.
53
- */
54
- export interface VellumPluginRuntime {
55
- readonly version: 1;
56
- readonly registerPlugin: typeof registerPlugin;
57
- readonly assistantEventHub: typeof assistantEventHub;
58
- readonly getSecureKeyAsync: typeof getSecureKeyAsync;
59
- }
60
-
61
- /** Stable globalThis key. Don't rename — plugins reference it by string. */
62
- const RUNTIME_GLOBAL_KEY = "__vellumPluginRuntime" as const;
63
-
64
- interface GlobalWithRuntime {
65
- [RUNTIME_GLOBAL_KEY]?: VellumPluginRuntime;
66
- }
67
-
68
- /**
69
- * Install the plugin runtime bridge on `globalThis`. Idempotent — repeat
70
- * calls are no-ops, so it's safe to invoke from tests that also touch the
71
- * lifecycle path.
72
- *
73
- * Must be called BEFORE {@link loadUserPlugins} runs, otherwise plugins that
74
- * touch `globalThis.__vellumPluginRuntime` in their module body will throw.
75
- */
76
- export function installPluginRuntime(): void {
77
- const g = globalThis as GlobalWithRuntime;
78
- if (g[RUNTIME_GLOBAL_KEY]) return;
79
- g[RUNTIME_GLOBAL_KEY] = {
80
- version: 1,
81
- registerPlugin,
82
- assistantEventHub,
83
- getSecureKeyAsync,
84
- };
85
- }
86
-
87
- /**
88
- * Read the installed runtime. Returns `undefined` if {@link installPluginRuntime}
89
- * hasn't been called yet — plugins should treat this as a fatal error.
90
- *
91
- * Exposed mainly for tests and for the rare in-process consumer that wants
92
- * to read the bridge from the same module graph that installed it.
93
- */
94
- export function getPluginRuntime(): VellumPluginRuntime | undefined {
95
- return (globalThis as GlobalWithRuntime)[RUNTIME_GLOBAL_KEY];
96
- }
97
-
98
- /**
99
- * Tear down the runtime handle. Test-only — production code never uninstalls
100
- * because the runtime lifetime is the daemon lifetime.
101
- */
102
- export function uninstallPluginRuntimeForTests(): void {
103
- delete (globalThis as GlobalWithRuntime)[RUNTIME_GLOBAL_KEY];
104
- }
@@ -1,97 +0,0 @@
1
- /**
2
- * Auxiliary message injection for proactive artifacts.
3
- *
4
- * Injects an assistant message into a conversation without going through
5
- * the normal agent loop. Defers injection while the conversation is
6
- * actively processing to preserve chronological message ordering.
7
- */
8
-
9
- import { createAssistantMessage } from "../agent/message-types.js";
10
- import { findConversation } from "../daemon/conversation-store.js";
11
- import {
12
- conversationMessagesSyncTag,
13
- SYNC_TAGS,
14
- } from "../daemon/message-types/sync.js";
15
- import { addMessage } from "../memory/conversation-crud.js";
16
- import type { BroadcastFn } from "../notifications/adapters/macos.js";
17
- import { getLogger } from "../util/logger.js";
18
-
19
- const log = getLogger("aux-message-injector");
20
- const IDLE_POLL_MS = 200;
21
- const IDLE_TIMEOUT_MS = 60_000;
22
-
23
- async function waitForIdle(conversationId: string): Promise<boolean> {
24
- const start = Date.now();
25
- while (Date.now() - start < IDLE_TIMEOUT_MS) {
26
- const conv = findConversation(conversationId);
27
- if (!conv || !conv.isProcessing()) return true;
28
- await new Promise((resolve) => setTimeout(resolve, IDLE_POLL_MS));
29
- }
30
- return false;
31
- }
32
-
33
- export async function injectAuxAssistantMessage(params: {
34
- conversationId: string;
35
- text: string;
36
- broadcastMessage: BroadcastFn;
37
- }): Promise<void> {
38
- const conv = findConversation(params.conversationId);
39
- if (conv?.isProcessing()) {
40
- const reachedIdle = await waitForIdle(params.conversationId);
41
- if (!reachedIdle) {
42
- log.warn(
43
- { conversationId: params.conversationId },
44
- "Timed out waiting for conversation idle; injecting anyway",
45
- );
46
- }
47
- }
48
-
49
- const msg = await addMessage(
50
- params.conversationId,
51
- "assistant",
52
- JSON.stringify([{ type: "text", text: params.text }]),
53
- { skipIndexing: true },
54
- );
55
-
56
- const current = findConversation(params.conversationId);
57
- if (current && !current.isProcessing()) {
58
- current.getMessages().push(createAssistantMessage(params.text));
59
-
60
- params.broadcastMessage({
61
- type: "assistant_text_delta",
62
- text: params.text,
63
- conversationId: params.conversationId,
64
- });
65
- params.broadcastMessage({
66
- type: "message_complete",
67
- conversationId: params.conversationId,
68
- messageId: msg.id,
69
- source: "aux",
70
- });
71
- }
72
-
73
- // The injected aux message bumps `lastMessageAt`, which can move the
74
- // row in the paginated sidebar window — that's a shape change. macOS
75
- // refreshes its full list on `conversation_list_invalidated`; web
76
- // refreshes via the paired `sync_changed` `conversationsList` tag.
77
- //
78
- // TODO(electron-cutover): drop the `conversation_list_invalidated`
79
- // emission once macOS migrates to the Electron client and consumes
80
- // `sync_changed` directly. See `runtime/sync/resource-sync-events.ts`
81
- // for the symmetric helper used by route handlers.
82
- params.broadcastMessage(
83
- {
84
- type: "conversation_list_invalidated",
85
- reason: "reordered",
86
- },
87
- undefined,
88
- { targetInterfaceId: "macos" },
89
- );
90
- params.broadcastMessage({
91
- type: "sync_changed",
92
- tags: [
93
- SYNC_TAGS.conversationsList,
94
- conversationMessagesSyncTag(params.conversationId),
95
- ],
96
- });
97
- }