@vellumai/assistant 0.8.8 → 0.8.9-staging.1

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 (340) hide show
  1. package/bun.lock +2 -2
  2. package/examples/plugins/echo/README.md +61 -60
  3. package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
  4. package/examples/plugins/echo/hooks/stop.ts +16 -0
  5. package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
  6. package/examples/plugins/echo/package.json +1 -2
  7. package/examples/plugins/echo/src/emit.ts +19 -0
  8. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
  9. package/openapi.yaml +236 -6
  10. package/package.json +2 -2
  11. package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
  12. package/src/__tests__/agent-loop-exit-reason.test.ts +185 -140
  13. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
  14. package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
  15. package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
  16. package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
  17. package/src/__tests__/agent-loop-thinking.test.ts +36 -20
  18. package/src/__tests__/agent-loop.test.ts +441 -96
  19. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
  20. package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
  21. package/src/__tests__/anthropic-provider.test.ts +1 -1
  22. package/src/__tests__/app-control-flow.test.ts +1 -1
  23. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  24. package/src/__tests__/approval-cascade.test.ts +5 -4
  25. package/src/__tests__/approval-routes-http.test.ts +4 -1
  26. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
  27. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  28. package/src/__tests__/channel-approvals.test.ts +1 -1
  29. package/src/__tests__/compaction-circuit.test.ts +258 -0
  30. package/src/__tests__/compaction-direct.test.ts +132 -0
  31. package/src/__tests__/compaction-events.test.ts +5 -5
  32. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -4
  33. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
  34. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +59 -103
  35. package/src/__tests__/conversation-agent-loop-overflow.test.ts +94 -189
  36. package/src/__tests__/conversation-agent-loop.test.ts +249 -490
  37. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  38. package/src/__tests__/conversation-confirmation-signals.test.ts +5 -4
  39. package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
  40. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -4
  41. package/src/__tests__/conversation-process-callsite.test.ts +14 -14
  42. package/src/__tests__/conversation-provider-retry-repair.test.ts +18 -16
  43. package/src/__tests__/conversation-queue.test.ts +9 -9
  44. package/src/__tests__/conversation-runtime-assembly.test.ts +923 -231
  45. package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
  46. package/src/__tests__/conversation-slash-queue.test.ts +6 -4
  47. package/src/__tests__/conversation-slash-unknown.test.ts +6 -4
  48. package/src/__tests__/conversation-speed-override.test.ts +10 -9
  49. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  50. package/src/__tests__/conversation-workspace-cache-state.test.ts +23 -20
  51. package/src/__tests__/conversation-workspace-injection.test.ts +68 -6
  52. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +14 -11
  53. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  54. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  55. package/src/__tests__/db-acp-history.test.ts +101 -0
  56. package/src/__tests__/dynamic-page-surface.test.ts +31 -0
  57. package/src/__tests__/empty-response-hook.test.ts +1 -1
  58. package/src/__tests__/file-write-tool.test.ts +63 -0
  59. package/src/__tests__/gateway-only-guard.test.ts +12 -2
  60. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  61. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  62. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  63. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  64. package/src/__tests__/heartbeat-service.test.ts +1 -0
  65. package/src/__tests__/history-repair-hook.test.ts +1 -1
  66. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  67. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  68. package/src/__tests__/inference-profile-reaper.test.ts +62 -0
  69. package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
  70. package/src/__tests__/injector-background-turn.test.ts +13 -23
  71. package/src/__tests__/injector-chain.test.ts +268 -44
  72. package/src/__tests__/injector-disk-pressure.test.ts +210 -52
  73. package/src/__tests__/injector-document-comments.test.ts +97 -114
  74. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  75. package/src/__tests__/injector-v3-suppression.test.ts +4 -4
  76. package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
  77. package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
  78. package/src/__tests__/memory-retrieval-hook.test.ts +73 -6
  79. package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
  80. package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
  81. package/src/__tests__/plugin-api-shim.test.ts +6 -9
  82. package/src/__tests__/plugin-bootstrap.test.ts +12 -23
  83. package/src/__tests__/plugin-registry.test.ts +3 -49
  84. package/src/__tests__/plugin-types.test.ts +0 -70
  85. package/src/__tests__/reaction-persistence.test.ts +1 -1
  86. package/src/__tests__/send-endpoint-busy.test.ts +4 -1
  87. package/src/__tests__/skill-feature-flags-integration.test.ts +33 -0
  88. package/src/__tests__/steer-tool-repair.test.ts +1 -1
  89. package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
  90. package/src/__tests__/subagent-detail.test.ts +25 -7
  91. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  92. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  93. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  94. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  95. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  96. package/src/__tests__/title-generate-hook.test.ts +1 -1
  97. package/src/__tests__/tool-error-hook.test.ts +1 -1
  98. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
  99. package/src/__tests__/user-plugin-loader.test.ts +54 -286
  100. package/src/acp/__tests__/agent-process.test.ts +161 -0
  101. package/src/acp/__tests__/client-handler.test.ts +40 -0
  102. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  103. package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
  104. package/src/acp/__tests__/prepare-agent-env.test.ts +137 -0
  105. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  106. package/src/acp/__tests__/session-manager-resume.test.ts +736 -0
  107. package/src/acp/agent-process.ts +61 -1
  108. package/src/acp/auto-install.test.ts +196 -0
  109. package/src/acp/auto-install.ts +177 -0
  110. package/src/acp/client-handler.ts +31 -0
  111. package/src/acp/feature-gate.test.ts +48 -0
  112. package/src/acp/feature-gate.ts +34 -0
  113. package/src/acp/prepare-agent-env.ts +83 -29
  114. package/src/acp/resolve-agent.test.ts +320 -7
  115. package/src/acp/resolve-agent.ts +182 -18
  116. package/src/acp/resume-hint.ts +25 -0
  117. package/src/acp/session-manager.ts +495 -73
  118. package/src/acp/types.ts +8 -0
  119. package/src/agent/compaction-circuit.ts +60 -102
  120. package/src/agent/loop.ts +390 -240
  121. package/src/api/responses/conversation-message.ts +14 -1
  122. package/src/approvals/guardian-request-resolvers.ts +1 -1
  123. package/src/background-wake/next-wake.ts +1 -0
  124. package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
  125. package/src/cli/commands/plugins.ts +43 -37
  126. package/src/cli/lib/__tests__/install-from-github.test.ts +429 -111
  127. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
  128. package/src/cli/lib/__tests__/plugin-details.test.ts +372 -0
  129. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +220 -0
  130. package/src/cli/lib/__tests__/search-plugins.test.ts +226 -32
  131. package/src/cli/lib/install-from-github.ts +464 -55
  132. package/src/cli/lib/plugin-catalog-cache.ts +84 -0
  133. package/src/cli/lib/plugin-details.ts +409 -0
  134. package/src/cli/lib/plugin-marketplace.ts +197 -0
  135. package/src/cli/lib/search-plugins.ts +195 -29
  136. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  137. package/src/config/acp-defaults.test.ts +10 -0
  138. package/src/config/acp-defaults.ts +6 -0
  139. package/src/config/bundled-skills/acp/SKILL.md +83 -31
  140. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  141. package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
  142. package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
  143. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  144. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  145. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  146. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  147. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  148. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  149. package/src/config/bundled-tool-registry.ts +2 -0
  150. package/src/config/feature-flag-registry.json +14 -5
  151. package/src/config/schemas/heartbeat.ts +9 -0
  152. package/src/context/strip-injections.ts +8 -2
  153. package/src/context/window-manager.ts +27 -13
  154. package/src/daemon/conversation-agent-loop-handlers.ts +10 -35
  155. package/src/daemon/conversation-agent-loop.ts +167 -1005
  156. package/src/daemon/conversation-lifecycle.ts +11 -255
  157. package/src/daemon/conversation-process.ts +8 -136
  158. package/src/daemon/conversation-registry.ts +159 -0
  159. package/src/daemon/conversation-runtime-assembly.ts +293 -392
  160. package/src/daemon/conversation-store.ts +9 -90
  161. package/src/daemon/conversation-surfaces.ts +24 -8
  162. package/src/daemon/conversation-workspace.ts +17 -0
  163. package/src/daemon/conversation.ts +383 -56
  164. package/src/daemon/external-plugins-bootstrap.ts +14 -19
  165. package/src/daemon/handlers/conversations.ts +3 -1
  166. package/src/daemon/handlers/skills.ts +4 -1
  167. package/src/daemon/host-proxy-preactivation.ts +1 -3
  168. package/src/daemon/lifecycle.ts +21 -0
  169. package/src/daemon/server.ts +2 -0
  170. package/src/daemon/wake-conversation-ops.ts +269 -0
  171. package/src/embedded/plugin-api.ts +2 -2
  172. package/src/export/__tests__/transcript-formatter.test.ts +5 -0
  173. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
  174. package/src/heartbeat/heartbeat-run-store.ts +23 -1
  175. package/src/heartbeat/heartbeat-service.ts +26 -0
  176. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  177. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  178. package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
  179. package/src/ipc/skill-routes/memory.ts +4 -2
  180. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
  181. package/src/memory/conversation-crud.ts +29 -19
  182. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  183. package/src/memory/db-init.ts +2 -0
  184. package/src/memory/job-handlers/conversation-starters.ts +13 -2
  185. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
  186. package/src/memory/jobs-worker.ts +25 -1
  187. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  188. package/src/memory/migrations/index.ts +1 -0
  189. package/src/memory/schema/acp.ts +4 -0
  190. package/src/memory/v2/__tests__/consolidation-job.test.ts +3 -3
  191. package/src/memory/v2/consolidation-job.ts +13 -4
  192. package/src/plugin-api/constants.ts +4 -0
  193. package/src/plugin-api/index.ts +6 -5
  194. package/src/plugin-api/types.ts +75 -0
  195. package/src/plugins/defaults/compaction/compact.ts +59 -0
  196. package/src/plugins/defaults/compaction/manager-store.ts +44 -0
  197. package/src/plugins/defaults/compaction/package.json +1 -2
  198. package/src/plugins/defaults/empty-response/package.json +0 -1
  199. package/src/plugins/defaults/history-repair/package.json +0 -1
  200. package/src/plugins/defaults/index.ts +135 -26
  201. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +103 -38
  202. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +167 -56
  203. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
  204. package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
  205. package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
  206. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/assign.test.ts +4 -4
  207. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +9 -6
  208. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/maintain-job.test.ts +5 -5
  209. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/orchestrate.test.ts +8 -5
  210. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/reconcile.test.ts +2 -2
  211. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/render-injection.test.ts +1 -1
  212. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/router.test.ts +10 -5
  213. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +8 -8
  214. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selector.test.ts +5 -5
  215. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/shadow-plugin.test.ts +16 -17
  216. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -2
  217. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/assign.ts +9 -5
  218. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/capabilities.ts +5 -2
  219. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  220. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  221. package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
  222. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/maintain-job.ts +15 -8
  223. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/orchestrate.ts +2 -2
  224. package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
  225. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/page-content.ts +2 -2
  226. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/provider-blocks.ts +1 -1
  227. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/reconcile.ts +7 -3
  228. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +1 -1
  229. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/router.ts +5 -5
  230. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selection-log-store.ts +4 -4
  231. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selector.ts +7 -7
  232. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/shadow-plugin.ts +32 -94
  233. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/tree.ts +1 -1
  234. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/types.ts +1 -1
  235. package/src/plugins/defaults/title-generate/package.json +0 -1
  236. package/src/plugins/defaults/tool-error/package.json +0 -1
  237. package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
  238. package/src/plugins/pipeline.ts +6 -293
  239. package/src/plugins/registry.ts +9 -37
  240. package/src/plugins/types.ts +76 -381
  241. package/src/plugins/user-loader.ts +30 -127
  242. package/src/proactive-artifact/aux-message-injector.ts +1 -1
  243. package/src/proactive-artifact/job.test.ts +1 -1
  244. package/src/prompts/__tests__/system-prompt.test.ts +6 -0
  245. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +35 -3
  246. package/src/runtime/__tests__/agent-wake.test.ts +555 -691
  247. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  248. package/src/runtime/agent-wake.ts +108 -209
  249. package/src/runtime/assistant-event-hub.ts +1 -1
  250. package/src/runtime/channel-approvals.ts +1 -1
  251. package/src/runtime/interactive-ui.ts +1 -1
  252. package/src/runtime/routes/__tests__/acp-routes.test.ts +283 -55
  253. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  254. package/src/runtime/routes/__tests__/plugins-routes.test.ts +398 -73
  255. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  256. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  257. package/src/runtime/routes/acp-routes.test.ts +89 -25
  258. package/src/runtime/routes/acp-routes.ts +81 -29
  259. package/src/runtime/routes/approval-routes.ts +1 -1
  260. package/src/runtime/routes/browser-routes.ts +1 -1
  261. package/src/runtime/routes/browser-tabs-routes.ts +6 -10
  262. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  263. package/src/runtime/routes/conversation-list-routes.ts +1 -1
  264. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  265. package/src/runtime/routes/conversation-routes.ts +28 -2
  266. package/src/runtime/routes/conversation-starter-routes.ts +13 -7
  267. package/src/runtime/routes/conversations-import-routes.ts +24 -7
  268. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  269. package/src/runtime/routes/host-cu-routes.ts +1 -1
  270. package/src/runtime/routes/identity-routes.ts +18 -3
  271. package/src/runtime/routes/inbound-message-handler.ts +1 -1
  272. package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
  273. package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
  274. package/src/runtime/routes/memory-v3-routes.ts +16 -6
  275. package/src/runtime/routes/playground/helpers.ts +1 -1
  276. package/src/runtime/routes/plugins-routes.ts +336 -35
  277. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  278. package/src/runtime/routes/work-items-routes.ts +2 -4
  279. package/src/runtime/services/conversation-serializer.ts +1 -1
  280. package/src/signals/cancel.ts +2 -4
  281. package/src/subagent/manager.ts +21 -5
  282. package/src/tools/acp/context.ts +20 -0
  283. package/src/tools/acp/list-agents.test.ts +7 -1
  284. package/src/tools/acp/spawn.test.ts +158 -55
  285. package/src/tools/acp/spawn.ts +47 -72
  286. package/src/tools/acp/steer.test.ts +105 -8
  287. package/src/tools/acp/steer.ts +48 -17
  288. package/src/tools/apps/executors.ts +13 -8
  289. package/src/tools/filesystem/write.ts +34 -0
  290. package/src/tools/subagent/spawn.ts +2 -4
  291. package/src/tools/ui-surface/definitions.ts +25 -5
  292. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  293. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
  294. package/docs/plugins.md +0 -832
  295. package/examples/plugins/echo/register.ts +0 -143
  296. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  297. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  298. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
  299. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
  300. package/src/__tests__/pipeline-runner.test.ts +0 -554
  301. package/src/__tests__/plugin-external-api.test.ts +0 -68
  302. package/src/daemon/wake-target-adapter.ts +0 -253
  303. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
  304. package/src/plugins/defaults/circuit-breaker/package.json +0 -15
  305. package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
  306. package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
  307. package/src/plugins/defaults/compaction/register.ts +0 -35
  308. package/src/plugins/defaults/compaction/terminal.ts +0 -73
  309. package/src/plugins/defaults/empty-response/register.ts +0 -23
  310. package/src/plugins/defaults/history-repair/register.ts +0 -24
  311. package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
  312. package/src/plugins/defaults/overflow-reduce/package.json +0 -15
  313. package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
  314. package/src/plugins/defaults/title-generate/register.ts +0 -35
  315. package/src/plugins/defaults/tool-error/register.ts +0 -23
  316. package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
  317. package/src/plugins/external-api.ts +0 -104
  318. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/capabilities.test.ts +0 -0
  319. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/core.test.ts +0 -0
  320. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
  321. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
  322. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/health.test.ts +0 -0
  323. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/needle.test.ts +0 -0
  324. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/provider-blocks.test.ts +0 -0
  325. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/snapshot.test.ts +0 -0
  326. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/tree.test.ts +0 -0
  327. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
  328. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
  329. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/core.ts +0 -0
  330. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
  331. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
  332. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
  333. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
  334. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
  335. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
  336. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/health.ts +0 -0
  337. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
  338. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/needle.ts +0 -0
  339. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/snapshot.ts +0 -0
  340. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +0 -0
@@ -1,24 +1,32 @@
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
 
@@ -26,6 +34,12 @@ import type { PluginHookFn } from "@vellumai/plugin-api";
26
34
  import type { Logger } from "pino";
27
35
 
28
36
  import type { AssistantConfig } from "../../../../config/schema.js";
37
+ import {
38
+ applyRuntimeInjections,
39
+ type InboundActorContext,
40
+ type InjectionMode,
41
+ type RuntimeInjectionResult,
42
+ } from "../../../../daemon/conversation-runtime-assembly.js";
29
43
  import type { ServerMessage } from "../../../../daemon/message-protocol.js";
30
44
  import type { MemoryRecalled } from "../../../../daemon/message-types/memory.js";
31
45
  import { updateMessageMetadata } from "../../../../memory/conversation-crud.js";
@@ -65,11 +79,39 @@ export interface MemoryRetrievalHookContext {
65
79
  /**
66
80
  * Working message list for the turn. Seeded by the loop with the
67
81
  * 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.
82
+ * overwrites it with the fully injected result (the memory-graph block, when
83
+ * the actor is trusted, plus the runtime injections). Read back by the loop.
71
84
  */
72
85
  latestMessages: Message[];
86
+ /**
87
+ * Stable ID for the current request, forwarded onto the injector turn
88
+ * context. The one turn-identity field the live conversation can't recover.
89
+ */
90
+ readonly requestId: string | undefined;
91
+ /**
92
+ * Injection volume for the assembled blocks. `"full"` on the first call;
93
+ * overflow reduction downgrades subsequent re-injection, but the first-call
94
+ * assembly this hook performs runs at the loop's committed mode.
95
+ */
96
+ readonly mode: InjectionMode;
97
+ /**
98
+ * Whether the in-flight turn has no human present to answer clarification
99
+ * questions. Resolved once at turn start and threaded in so injection uses
100
+ * the turn-start snapshot rather than live state that can flip mid-turn.
101
+ */
102
+ readonly isNonInteractive: boolean;
103
+ /**
104
+ * The `model_profile:` turn-context label, or `null` when the active
105
+ * inference profile is unchanged since the last notified one. Resolved once
106
+ * at turn start, so it is threaded in rather than re-derived.
107
+ */
108
+ readonly modelProfile: string | null;
109
+ /**
110
+ * Inbound actor identity and trust fields for the unified `<turn_context>`
111
+ * block, or `null` on guardian turns (which suppress the actor section).
112
+ * Resolved once at turn start from the actor-trust resolver and threaded in.
113
+ */
114
+ readonly actorContext: InboundActorContext | null;
73
115
  }
74
116
 
75
117
  /**
@@ -160,10 +202,63 @@ function recordRecallSideEffects(
160
202
  }
161
203
 
162
204
  /**
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.
205
+ * Persist the assembled runtime-injection blocks onto the user message's
206
+ * metadata so they survive conversation reloads (eviction, restart, fork)
207
+ * loadFromDb re-injects from metadata. Only this first-call site persists: the
208
+ * mid-loop re-entry sites send identical bytes and their tail row may not
209
+ * correspond to `userMessageId`. All present blocks are written in a single
210
+ * update to avoid doubling SQLite SELECT+UPDATE work each turn. Best-effort — a
211
+ * persistence failure must not abort the turn.
212
+ */
213
+ function persistInjectionBlocks(
214
+ blocks: RuntimeInjectionResult["blocks"],
215
+ ctx: MemoryRetrievalHookContext,
216
+ ): void {
217
+ if (
218
+ !blocks.unifiedTurnContext &&
219
+ !blocks.pkbSystemReminder &&
220
+ !blocks.workspaceBlock &&
221
+ !blocks.nowScratchpadBlock &&
222
+ !blocks.pkbContextBlock &&
223
+ !blocks.memoryV2StaticBlock
224
+ ) {
225
+ return;
226
+ }
227
+ try {
228
+ const metadataUpdates: Record<string, unknown> = {};
229
+ if (blocks.unifiedTurnContext) {
230
+ metadataUpdates.turnContextBlock = blocks.unifiedTurnContext;
231
+ }
232
+ if (blocks.pkbSystemReminder) {
233
+ metadataUpdates.pkbSystemReminderBlock = blocks.pkbSystemReminder;
234
+ }
235
+ if (blocks.workspaceBlock) {
236
+ metadataUpdates.workspaceBlock = blocks.workspaceBlock;
237
+ }
238
+ if (blocks.nowScratchpadBlock) {
239
+ metadataUpdates.nowScratchpadBlock = blocks.nowScratchpadBlock;
240
+ }
241
+ if (blocks.pkbContextBlock) {
242
+ metadataUpdates.pkbContextBlock = blocks.pkbContextBlock;
243
+ }
244
+ if (blocks.memoryV2StaticBlock) {
245
+ metadataUpdates.memoryV2StaticBlock = blocks.memoryV2StaticBlock;
246
+ }
247
+ updateMessageMetadata(ctx.userMessageId, metadataUpdates);
248
+ } catch (err) {
249
+ ctx.logger.warn(
250
+ { err },
251
+ "Failed to persist injection metadata (non-fatal)",
252
+ );
253
+ }
254
+ }
255
+
256
+ /**
257
+ * Run the default retrieval and assemble the turn's prompt. Memory-graph
258
+ * retrieval is gated on the actor being trusted (guardian); untrusted actors
259
+ * skip it, leaving `latestMessages` as the seeded input. Runtime injection then
260
+ * runs for every actor, writing the fully injected result back onto
261
+ * `latestMessages` and persisting the assembled blocks.
167
262
  *
168
263
  * Memory retrieval blocks the turn — there is no soft timeout here. Memory is
169
264
  * critical context, and silently dropping it produces a worse outcome than a
@@ -173,44 +268,60 @@ function recordRecallSideEffects(
173
268
  const userPromptSubmitMemoryRetrieval: PluginHookFn<
174
269
  MemoryRetrievalHookContext
175
270
  > = async (ctx) => {
176
- if (!ctx.isTrustedActor) {
177
- // Untrusted actors skip memory-graph retrieval entirely.
178
- return;
179
- }
180
-
181
- const graphResult = await ctx.graphMemory.prepareMemory(
182
- ctx.latestMessages,
183
- ctx.config,
184
- ctx.signal,
185
- ctx.onEvent,
186
- );
271
+ if (ctx.isTrustedActor) {
272
+ const graphResult = await ctx.graphMemory.prepareMemory(
273
+ ctx.latestMessages,
274
+ ctx.config,
275
+ ctx.signal,
276
+ ctx.onEvent,
277
+ );
187
278
 
188
- recordRecallSideEffects(graphResult, ctx);
279
+ recordRecallSideEffects(graphResult, ctx);
189
280
 
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
- );
281
+ ctx.latestMessages = graphResult.runMessages;
282
+ // Select dense+sparse as a matched pair so RRF fusion combines two signals
283
+ // aligned to the same query text:
284
+ // 1. Context-load with a user query: user-query dense + user-query sparse
285
+ // — the cleanest pairing.
286
+ // 2. Otherwise (context-load without a user query, or per-turn): whatever
287
+ // `queryVector` / `sparseVector` the retriever produced, which are
288
+ // themselves co-aligned (both summary-derived in context-load, both
289
+ // user-last-message-derived in per-turn).
290
+ // Never pair a user-query dense with a summary-aligned sparse.
291
+ // The PKB-reminder injector reads this pair back off the same graph handle
292
+ // (looked up by conversation id) rather than receiving it threaded through
293
+ // the agent loop.
294
+ if (graphResult.userQueryVector) {
295
+ ctx.graphMemory.recordPkbQueryVectors(
296
+ graphResult.userQueryVector,
297
+ graphResult.userQuerySparseVector,
298
+ );
299
+ } else {
300
+ ctx.graphMemory.recordPkbQueryVectors(
301
+ graphResult.queryVector,
302
+ graphResult.sparseVector,
303
+ );
304
+ }
213
305
  }
306
+
307
+ // Runtime injection assembles the turn's prompt onto the retrieved history.
308
+ // It runs for every actor (untrusted actors skip only the memory-graph step
309
+ // above). `applyRuntimeInjections` self-resolves every per-turn injection
310
+ // input — the Slack chronological transcript, the unified `<turn_context>`
311
+ // block, channel/voice/transport hints, and the turn's trust/index/call-site
312
+ // — from the live conversation, so we hand in only the request id and
313
+ // conversation id plus the fields resolved once at turn start (`mode`,
314
+ // `isNonInteractive`, `modelProfile`, `actorContext`).
315
+ const injection = await applyRuntimeInjections(ctx.latestMessages, {
316
+ isNonInteractive: ctx.isNonInteractive,
317
+ modelProfile: ctx.modelProfile,
318
+ actorContext: ctx.actorContext,
319
+ mode: ctx.mode,
320
+ requestId: ctx.requestId,
321
+ conversationId: ctx.conversationId,
322
+ });
323
+ ctx.latestMessages = injection.messages;
324
+ persistInjectionBlocks(injection.blocks, ctx);
214
325
  };
215
326
 
216
327
  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