@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,75 +1,107 @@
1
1
  /**
2
- * Default `user-prompt-submit-temp` hook: runs the memory-graph retrieval the
3
- * agent loop needs before building a turn's runtime-injection block.
2
+ * Default `user-prompt-submit-temp` hook: prepares a turn's prompt before the
3
+ * first provider call by running memory-graph retrieval and then applying the
4
+ * runtime injections that assemble the turn.
4
5
  *
5
6
  * **Memory graph** via {@link ConversationGraphMemory.prepareMemory} —
6
7
  * dispatches to context-load or per-turn retrieval depending on initialization
7
- * state; gated on the actor being trusted (guardian).
8
+ * state; gated on the actor being trusted (guardian). The hook owns the
9
+ * retrieval's side effects — persisting the injected block onto the user
10
+ * message's metadata, writing the recall log, and emitting the
11
+ * `memory_recalled` event. The PKB query-vector pair is recorded on the
12
+ * conversation's graph handle for the PKB-reminder injector to read back. PKB
13
+ * context and NOW.md are sourced directly by their injectors (gated on block
14
+ * presence), not produced here.
8
15
  *
9
- * The hook also owns the retrieval's side effects persisting the injected
10
- * block onto the user message's metadata, writing the recall log, and emitting
11
- * the `memory_recalled` event — so the loop only consumes the turn-scoped
12
- * `latestMessages` written back onto the context. The PKB query-vector pair is
13
- * recorded on the conversation's graph handle for the PKB-reminder injector to
14
- * read back. PKB context and NOW.md are sourced directly by their injectors
15
- * (gated on block presence), not produced here.
16
+ * **Runtime injection** via {@link applyRuntimeInjections}runs for every
17
+ * actor (not just trusted ones) on the retrieved history, assembling the Slack
18
+ * chronological transcript, the unified `<turn_context>` block,
19
+ * channel/voice/transport hints, and the NOW.md / PKB / memory-v2 / workspace
20
+ * blocks, then persisting the assembled blocks onto the user message's metadata
21
+ * so they survive reloads. This is the first-call counterpart of the
22
+ * post-compaction hook, which re-applies the same injections after a mid-loop
23
+ * compaction.
16
24
  *
17
25
  * This fires at the early "prompt submitted, before context assembly" moment,
18
- * distinct from the canonical late `user-prompt-submit` hook (history repair,
19
- * title): memory's outputs feed the injection and overflow-reduction transforms
20
- * that run between the two moments. The `-temp` suffix marks this as a
21
- * transitional staging point that folds into `user-prompt-submit` once
26
+ * ahead of the canonical late `user-prompt-submit` hook (history repair,
27
+ * title), which normalizes the assembled history after the overflow-reduction
28
+ * transform that runs between the two moments. The `-temp` suffix marks this as
29
+ * a transitional staging point that folds into `user-prompt-submit` once
22
30
  * compaction is cleared from the gap between the two call sites.
23
31
  */
24
32
 
25
33
  import type { PluginHookFn } from "@vellumai/plugin-api";
26
34
  import type { Logger } from "pino";
27
35
 
28
- import type { AssistantConfig } from "../../../../config/schema.js";
36
+ import { getConfig } from "../../../../config/loader.js";
37
+ import { findConversationOrSubagent } from "../../../../daemon/conversation-registry.js";
38
+ import {
39
+ applyRuntimeInjections,
40
+ type InboundActorContext,
41
+ type InjectionMode,
42
+ type RuntimeInjectionResult,
43
+ } from "../../../../daemon/conversation-runtime-assembly.js";
29
44
  import type { ServerMessage } from "../../../../daemon/message-protocol.js";
30
45
  import type { MemoryRecalled } from "../../../../daemon/message-types/memory.js";
46
+ import { resolveTrustClass } from "../../../../daemon/trust-context.js";
31
47
  import { updateMessageMetadata } from "../../../../memory/conversation-crud.js";
32
- import type { ConversationGraphMemory } from "../../../../memory/graph/conversation-graph-memory.js";
33
48
  import { recordMemoryRecallLog } from "../../../../memory/memory-recall-log-store.js";
34
49
  import type { Message } from "../../../../providers/types.js";
35
50
  import type { GraphMemoryResult } from "../../../types.js";
36
51
 
37
52
  /**
38
- * Context threaded through the `user-prompt-submit-temp` hook. The readonly
39
- * fields carry the conversation-scoped state the retriever needs (graph
40
- * handle, event sink, abort signal); the output fields are populated by the
41
- * hook and read back by the agent loop. `latestMessages` straddles both: the
42
- * loop seeds it with the pre-injection array and the hook overwrites it with
43
- * the injected result.
53
+ * Context threaded through the `user-prompt-submit-temp` hook. The
54
+ * conversation-scoped retrieval state (graph handle, abort signal, trust
55
+ * class) is self-resolved from the live conversation by id; the readonly
56
+ * fields here carry the event sink and the turn-start injection snapshot,
57
+ * while `latestMessages` straddles input and output the loop seeds it with
58
+ * the pre-injection array and the hook overwrites it with the injected result.
44
59
  */
45
60
  export interface MemoryRetrievalHookContext {
46
- /** Per-conversation memory graph handle. */
47
- readonly graphMemory: ConversationGraphMemory;
48
- /** Assistant config snapshot. */
49
- readonly config: AssistantConfig;
50
61
  /** Event sink used by the graph retriever and `memory_recalled` emission. */
51
62
  readonly onEvent: (msg: ServerMessage) => void;
52
- /** True when the actor for this turn is trusted (guardian-class). */
53
- readonly isTrustedActor: boolean;
54
63
  /** Conversation the turn belongs to — keys the recall-log row. */
55
64
  readonly conversationId: string;
56
65
  /** User message the injected memory block is persisted onto. */
57
66
  readonly userMessageId: string;
58
67
  /** Turn-scoped logger for non-fatal persistence warnings. */
59
68
  readonly logger: Logger;
60
- /**
61
- * Per-turn abort signal forwarded to `prepareMemory`. An external cancel
62
- * aborts the underlying retrieval instead of letting it run to completion.
63
- */
64
- readonly signal: AbortSignal;
65
69
  /**
66
70
  * Working message list for the turn. Seeded by the loop with the
67
71
  * pre-injection messages and consumed as the retrieval input; the hook
68
- * overwrites it with the memory-graph block injected, or leaves it
69
- * unchanged when no graph retrieval ran (untrusted actor, or a no-op
70
- * retrieval). Read back by the loop.
72
+ * overwrites it with the fully injected result (the memory-graph block, when
73
+ * the actor is trusted, plus the runtime injections). Read back by the loop.
71
74
  */
72
75
  latestMessages: Message[];
76
+ /**
77
+ * Stable ID for the current request, forwarded onto the injector turn
78
+ * context. The one turn-identity field the live conversation can't recover.
79
+ */
80
+ readonly requestId: string | undefined;
81
+ /**
82
+ * Injection volume for the assembled blocks. `"full"` on the first call;
83
+ * overflow reduction downgrades subsequent re-injection, but the first-call
84
+ * assembly this hook performs runs at the loop's committed mode.
85
+ */
86
+ readonly mode: InjectionMode;
87
+ /**
88
+ * Whether the in-flight turn has no human present to answer clarification
89
+ * questions. Resolved once at turn start and threaded in so injection uses
90
+ * the turn-start snapshot rather than live state that can flip mid-turn.
91
+ */
92
+ readonly isNonInteractive: boolean;
93
+ /**
94
+ * The `model_profile:` turn-context label, or `null` when the active
95
+ * inference profile is unchanged since the last notified one. Resolved once
96
+ * at turn start, so it is threaded in rather than re-derived.
97
+ */
98
+ readonly modelProfile: string | null;
99
+ /**
100
+ * Inbound actor identity and trust fields for the unified `<turn_context>`
101
+ * block, or `null` on guardian turns (which suppress the actor section).
102
+ * Resolved once at turn start from the actor-trust resolver and threaded in.
103
+ */
104
+ readonly actorContext: InboundActorContext | null;
73
105
  }
74
106
 
75
107
  /**
@@ -160,10 +192,63 @@ function recordRecallSideEffects(
160
192
  }
161
193
 
162
194
  /**
163
- * Run the default retrieval, writing `latestMessages` back onto the context and
164
- * recording the PKB query-vector pair on the graph handle. Skips the
165
- * memory-graph call entirely (leaving `latestMessages` as the seeded input
166
- * messages and no query pair recorded) when the actor is not trusted.
195
+ * Persist the assembled runtime-injection blocks onto the user message's
196
+ * metadata so they survive conversation reloads (eviction, restart, fork)
197
+ * loadFromDb re-injects from metadata. Only this first-call site persists: the
198
+ * mid-loop re-entry sites send identical bytes and their tail row may not
199
+ * correspond to `userMessageId`. All present blocks are written in a single
200
+ * update to avoid doubling SQLite SELECT+UPDATE work each turn. Best-effort — a
201
+ * persistence failure must not abort the turn.
202
+ */
203
+ function persistInjectionBlocks(
204
+ blocks: RuntimeInjectionResult["blocks"],
205
+ ctx: MemoryRetrievalHookContext,
206
+ ): void {
207
+ if (
208
+ !blocks.unifiedTurnContext &&
209
+ !blocks.pkbSystemReminder &&
210
+ !blocks.workspaceBlock &&
211
+ !blocks.nowScratchpadBlock &&
212
+ !blocks.pkbContextBlock &&
213
+ !blocks.memoryV2StaticBlock
214
+ ) {
215
+ return;
216
+ }
217
+ try {
218
+ const metadataUpdates: Record<string, unknown> = {};
219
+ if (blocks.unifiedTurnContext) {
220
+ metadataUpdates.turnContextBlock = blocks.unifiedTurnContext;
221
+ }
222
+ if (blocks.pkbSystemReminder) {
223
+ metadataUpdates.pkbSystemReminderBlock = blocks.pkbSystemReminder;
224
+ }
225
+ if (blocks.workspaceBlock) {
226
+ metadataUpdates.workspaceBlock = blocks.workspaceBlock;
227
+ }
228
+ if (blocks.nowScratchpadBlock) {
229
+ metadataUpdates.nowScratchpadBlock = blocks.nowScratchpadBlock;
230
+ }
231
+ if (blocks.pkbContextBlock) {
232
+ metadataUpdates.pkbContextBlock = blocks.pkbContextBlock;
233
+ }
234
+ if (blocks.memoryV2StaticBlock) {
235
+ metadataUpdates.memoryV2StaticBlock = blocks.memoryV2StaticBlock;
236
+ }
237
+ updateMessageMetadata(ctx.userMessageId, metadataUpdates);
238
+ } catch (err) {
239
+ ctx.logger.warn(
240
+ { err },
241
+ "Failed to persist injection metadata (non-fatal)",
242
+ );
243
+ }
244
+ }
245
+
246
+ /**
247
+ * Run the default retrieval and assemble the turn's prompt. Memory-graph
248
+ * retrieval is gated on the actor being trusted (guardian); untrusted actors
249
+ * skip it, leaving `latestMessages` as the seeded input. Runtime injection then
250
+ * runs for every actor, writing the fully injected result back onto
251
+ * `latestMessages` and persisting the assembled blocks.
167
252
  *
168
253
  * Memory retrieval blocks the turn — there is no soft timeout here. Memory is
169
254
  * critical context, and silently dropping it produces a worse outcome than a
@@ -173,44 +258,69 @@ function recordRecallSideEffects(
173
258
  const userPromptSubmitMemoryRetrieval: PluginHookFn<
174
259
  MemoryRetrievalHookContext
175
260
  > = async (ctx) => {
176
- if (!ctx.isTrustedActor) {
177
- // Untrusted actors skip memory-graph retrieval entirely.
178
- return;
179
- }
261
+ // The conversation-scoped retrieval state — graph handle, abort signal, and
262
+ // trust class is resolved from the live conversation by id rather than
263
+ // threaded in, mirroring how `applyRuntimeInjections` self-resolves its
264
+ // per-turn inputs.
265
+ const conversation = findConversationOrSubagent(ctx.conversationId);
266
+ const abortSignal = conversation?.abortController?.signal;
267
+ const isTrustedActor =
268
+ resolveTrustClass(conversation?.trustContext) === "guardian";
180
269
 
181
- const graphResult = await ctx.graphMemory.prepareMemory(
182
- ctx.latestMessages,
183
- ctx.config,
184
- ctx.signal,
185
- ctx.onEvent,
186
- );
270
+ if (conversation && isTrustedActor && abortSignal) {
271
+ const graphResult = await conversation.graphMemory.prepareMemory(
272
+ ctx.latestMessages,
273
+ getConfig(),
274
+ abortSignal,
275
+ ctx.onEvent,
276
+ );
187
277
 
188
- recordRecallSideEffects(graphResult, ctx);
278
+ recordRecallSideEffects(graphResult, ctx);
189
279
 
190
- ctx.latestMessages = graphResult.runMessages;
191
- // Select dense+sparse as a matched pair so RRF fusion combines two signals
192
- // aligned to the same query text:
193
- // 1. Context-load with a user query: user-query dense + user-query sparse
194
- // — the cleanest pairing.
195
- // 2. Otherwise (context-load without a user query, or per-turn): whatever
196
- // `queryVector` / `sparseVector` the retriever produced, which are
197
- // themselves co-aligned (both summary-derived in context-load, both
198
- // user-last-message-derived in per-turn).
199
- // Never pair a user-query dense with a summary-aligned sparse.
200
- // The PKB-reminder injector reads this pair back off the same graph handle
201
- // (looked up by conversation id) rather than receiving it threaded through
202
- // the agent loop.
203
- if (graphResult.userQueryVector) {
204
- ctx.graphMemory.recordPkbQueryVectors(
205
- graphResult.userQueryVector,
206
- graphResult.userQuerySparseVector,
207
- );
208
- } else {
209
- ctx.graphMemory.recordPkbQueryVectors(
210
- graphResult.queryVector,
211
- graphResult.sparseVector,
212
- );
280
+ ctx.latestMessages = graphResult.runMessages;
281
+ // Select dense+sparse as a matched pair so RRF fusion combines two signals
282
+ // aligned to the same query text:
283
+ // 1. Context-load with a user query: user-query dense + user-query sparse
284
+ // — the cleanest pairing.
285
+ // 2. Otherwise (context-load without a user query, or per-turn): whatever
286
+ // `queryVector` / `sparseVector` the retriever produced, which are
287
+ // themselves co-aligned (both summary-derived in context-load, both
288
+ // user-last-message-derived in per-turn).
289
+ // Never pair a user-query dense with a summary-aligned sparse.
290
+ // The PKB-reminder injector reads this pair back off the same graph handle
291
+ // (looked up by conversation id) rather than receiving it threaded through
292
+ // the agent loop.
293
+ if (graphResult.userQueryVector) {
294
+ conversation.graphMemory.recordPkbQueryVectors(
295
+ graphResult.userQueryVector,
296
+ graphResult.userQuerySparseVector,
297
+ );
298
+ } else {
299
+ conversation.graphMemory.recordPkbQueryVectors(
300
+ graphResult.queryVector,
301
+ graphResult.sparseVector,
302
+ );
303
+ }
213
304
  }
305
+
306
+ // Runtime injection assembles the turn's prompt onto the retrieved history.
307
+ // It runs for every actor (untrusted actors skip only the memory-graph step
308
+ // above). `applyRuntimeInjections` self-resolves every per-turn injection
309
+ // input — the Slack chronological transcript, the unified `<turn_context>`
310
+ // block, channel/voice/transport hints, and the turn's trust/index/call-site
311
+ // — from the live conversation, so we hand in only the request id and
312
+ // conversation id plus the fields resolved once at turn start (`mode`,
313
+ // `isNonInteractive`, `modelProfile`, `actorContext`).
314
+ const injection = await applyRuntimeInjections(ctx.latestMessages, {
315
+ isNonInteractive: ctx.isNonInteractive,
316
+ modelProfile: ctx.modelProfile,
317
+ actorContext: ctx.actorContext,
318
+ mode: ctx.mode,
319
+ requestId: ctx.requestId,
320
+ conversationId: ctx.conversationId,
321
+ });
322
+ ctx.latestMessages = injection.messages;
323
+ persistInjectionBlocks(injection.blocks, ctx);
214
324
  };
215
325
 
216
326
  export default userPromptSubmitMemoryRetrieval;
@@ -18,9 +18,9 @@
18
18
  * ordering assumptions about when `defaultInjectors` finishes initializing.
19
19
  */
20
20
 
21
- import { memoryV3Injector } from "../../../memory/v3/shadow-plugin.js";
22
21
  import type { Injector } from "../../types.js";
23
- import { defaultInjectors } from "../injectors/register.js";
22
+ import { memoryV3Injector } from "../memory-v3-shadow/injector.js";
23
+ import { defaultInjectors } from "./injectors.js";
24
24
 
25
25
  let cachedChain: Injector[] | null = null;
26
26