@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
@@ -120,7 +120,7 @@ describe("stripInjectionsForCompaction preserves history shape", () => {
120
120
  expect(out[3]).toEqual(messages[3]);
121
121
  });
122
122
 
123
- test("leaves <turn_context>, <workspace>, and <memory __injected> alone", () => {
123
+ test("strips <workspace> but leaves <turn_context> and <memory __injected> alone", () => {
124
124
  const messages: Message[] = [
125
125
  {
126
126
  role: "user",
@@ -132,6 +132,9 @@ describe("stripInjectionsForCompaction preserves history shape", () => {
132
132
  },
133
133
  ];
134
134
  const out = stripInjectionsForCompaction(messages);
135
- expect(out[0].content).toEqual(messages[0].content);
135
+ expect(out[0].content).toEqual([
136
+ { type: "text", text: "<turn_context>\nnow\n</turn_context>" },
137
+ { type: "text", text: "<memory __injected>\nrecent\n</memory>" },
138
+ ]);
136
139
  });
137
140
  });
@@ -167,6 +167,7 @@ mock.module("../memory/retriever.js", () => ({
167
167
  mock.module("../context/window-manager.js", () => ({
168
168
  ContextWindowManager: class {
169
169
  constructor() {}
170
+ updateConfig() {}
170
171
  shouldCompact() {
171
172
  return { needed: false, estimatedTokens: 0 };
172
173
  }
@@ -199,10 +200,10 @@ mock.module("../agent/loop.js", () => ({
199
200
  getActiveModel() {
200
201
  return undefined;
201
202
  }
202
- async run(
203
- _messages: Message[],
204
- _onEvent: (event: AgentEvent) => void,
205
- ): Promise<Message[]> {
203
+ async run(_options: {
204
+ messages: Message[];
205
+ onEvent: (event: AgentEvent) => void;
206
+ }): Promise<Message[]> {
206
207
  return [];
207
208
  }
208
209
  },
@@ -9,7 +9,7 @@ mock.module("../util/logger.js", () => ({
9
9
  import {
10
10
  createConversation,
11
11
  getConversation,
12
- getConversationOverrideProfileFromRow,
12
+ resolveOverrideProfile,
13
13
  setConversationInferenceProfile,
14
14
  setConversationInferenceProfileSession,
15
15
  } from "../memory/conversation-crud.js";
@@ -55,7 +55,7 @@ describe("setConversationInferenceProfile", () => {
55
55
  });
56
56
  });
57
57
 
58
- describe("getConversationOverrideProfileFromRow — lazy expiry check", () => {
58
+ describe("resolveOverrideProfile — lazy expiry check", () => {
59
59
  beforeEach(() => {
60
60
  const db = getDb();
61
61
  db.run(`DELETE FROM messages`);
@@ -73,7 +73,7 @@ describe("getConversationOverrideProfileFromRow — lazy expiry check", () => {
73
73
  );
74
74
  const row = getConversation(conv.id);
75
75
  expect(row).not.toBeNull();
76
- expect(getConversationOverrideProfileFromRow(row)).toBeUndefined();
76
+ expect(resolveOverrideProfile(row)).toBeUndefined();
77
77
  });
78
78
 
79
79
  test("returns the profile when inferenceProfileExpiresAt is in the future", () => {
@@ -86,7 +86,7 @@ describe("getConversationOverrideProfileFromRow — lazy expiry check", () => {
86
86
  );
87
87
  const row = getConversation(conv.id);
88
88
  expect(row).not.toBeNull();
89
- expect(getConversationOverrideProfileFromRow(row)).toBe("balanced");
89
+ expect(resolveOverrideProfile(row)).toBe("balanced");
90
90
  });
91
91
 
92
92
  test("returns undefined at the exact-expiry boundary (expiresAt === now)", () => {
@@ -110,7 +110,7 @@ describe("getConversationOverrideProfileFromRow — lazy expiry check", () => {
110
110
  const realNow = Date.now;
111
111
  Date.now = () => now;
112
112
  try {
113
- expect(getConversationOverrideProfileFromRow(row)).toBeUndefined();
113
+ expect(resolveOverrideProfile(row)).toBeUndefined();
114
114
  } finally {
115
115
  Date.now = realNow;
116
116
  }
@@ -126,9 +126,7 @@ describe("getConversationOverrideProfileFromRow — lazy expiry check", () => {
126
126
  );
127
127
  const row = getConversation(conv.id);
128
128
  expect(row).not.toBeNull();
129
- expect(getConversationOverrideProfileFromRow(row)).toBe(
130
- "quality-optimized",
131
- );
129
+ expect(resolveOverrideProfile(row)).toBe("quality-optimized");
132
130
  });
133
131
 
134
132
  test.each<"background" | "scheduled">(["background", "scheduled"])(
@@ -148,7 +146,7 @@ describe("getConversationOverrideProfileFromRow — lazy expiry check", () => {
148
146
  expect(row).not.toBeNull();
149
147
  expect(row?.conversationType).toBe(conversationType);
150
148
  expect(row?.inferenceProfile).toBe("quality-optimized");
151
- expect(getConversationOverrideProfileFromRow(row)).toBeUndefined();
149
+ expect(resolveOverrideProfile(row)).toBeUndefined();
152
150
  },
153
151
  );
154
152
  });
@@ -807,7 +807,7 @@ describe("web_search_tool_result structural guard", () => {
807
807
  // Media token counting iterates tool_result.contentBlocks for nested
808
808
  // image/file blocks. web_search_tool_result has opaque content with no
809
809
  // contentBlocks property, so it cannot contain nested media.
810
- "daemon/context-overflow-reducer.ts",
810
+ "plugins/defaults/compaction/context-overflow-reducer.ts",
811
811
 
812
812
  // Final orphan-pair safety pass in the Slack transcript renderer.
813
813
  // Server-side block types (`server_tool_use`, `web_search_tool_result`)
@@ -92,7 +92,7 @@ mock.module("../daemon/conversation-messaging.js", () => ({
92
92
  // ---------------------------------------------------------------------------
93
93
 
94
94
  import type { TurnInterfaceContext } from "../channels/types.js";
95
- import type { ProcessConversationContext } from "../daemon/conversation-process.js";
95
+ import type { Conversation } from "../daemon/conversation.js";
96
96
  import { drainQueue } from "../daemon/conversation-process.js";
97
97
  import {
98
98
  MessageQueue,
@@ -102,7 +102,7 @@ import { TraceEmitter } from "../daemon/trace-emitter.js";
102
102
 
103
103
  // ---------------------------------------------------------------------------
104
104
  // Fake context — captures preactivation calls, satisfies the bare minimum
105
- // of `ProcessConversationContext`. `runAgentLoop` resolves immediately so
105
+ // of `Conversation`. `runAgentLoop` resolves immediately so
106
106
  // the drain-chain does not recurse forever.
107
107
  // ---------------------------------------------------------------------------
108
108
 
@@ -113,7 +113,7 @@ interface FakeRecord {
113
113
  function makeFakeContext(opts: {
114
114
  queue: MessageQueue;
115
115
  turnInterfaceContext?: TurnInterfaceContext;
116
- }): ProcessConversationContext & FakeRecord {
116
+ }): Conversation & FakeRecord {
117
117
  const calls: string[] = [];
118
118
  let preactivatedSkillIds: string[] | undefined = undefined;
119
119
  const ctx = {
@@ -177,7 +177,7 @@ function makeFakeContext(opts: {
177
177
  setTransportHints() {},
178
178
  applyHostEnvFromTransport() {},
179
179
  ensureHostProxiesForTurn() {},
180
- } as unknown as ProcessConversationContext & FakeRecord;
180
+ } as unknown as Conversation & FakeRecord;
181
181
  return ctx;
182
182
  }
183
183
 
@@ -208,14 +208,12 @@ mock.module("../memory/retriever.js", () => ({
208
208
  mock.module("../agent/loop.js", () => ({
209
209
  AgentLoop: class {
210
210
  compactionCircuit = new CompactionCircuit("test-conv");
211
- constructor(
212
- _provider: unknown,
213
- _systemPrompt: string,
214
- options?: {
215
- config?: Record<string, unknown>;
216
- resolveSystemPrompt?: (history: Message[]) => Record<string, unknown>;
217
- },
218
- ) {
211
+ constructor(options?: {
212
+ provider?: unknown;
213
+ systemPrompt?: string;
214
+ config?: Record<string, unknown>;
215
+ resolveSystemPrompt?: (history: Message[]) => Record<string, unknown>;
216
+ }) {
219
217
  captured.constructorMaxTokens = options?.config?.maxTokens;
220
218
  const resolved = options?.resolveSystemPrompt?.([]);
221
219
  captured.resolvedMaxTokens = resolved?.maxTokens;
@@ -229,12 +227,13 @@ mock.module("../agent/loop.js", () => ({
229
227
  getResolvedTools() {
230
228
  return [];
231
229
  }
232
- async run(
233
- messages: Message[],
234
- onEvent: (event: Record<string, unknown>) => void,
235
- options?: { callSite?: string },
236
- ): Promise<Message[]> {
237
- captured.callSite = options?.callSite;
230
+ async run(options: {
231
+ messages: Message[];
232
+ onEvent: (event: Record<string, unknown>) => void;
233
+ callSite?: string;
234
+ }): Promise<Message[]> {
235
+ const { messages, onEvent } = options;
236
+ captured.callSite = options.callSite;
238
237
  onEvent({
239
238
  type: "usage",
240
239
  inputTokens: 0,
@@ -253,6 +252,7 @@ mock.module("../agent/loop.js", () => ({
253
252
  mock.module("../context/window-manager.js", () => ({
254
253
  ContextWindowManager: class {
255
254
  constructor() {}
255
+ updateConfig() {}
256
256
  shouldCompact() {
257
257
  return { needed: false, estimatedTokens: 0 };
258
258
  }
@@ -100,56 +100,59 @@ mock.module("../context/token-estimator.js", () => ({
100
100
  // but these tests exercise the Conversation-level flow, not the reducer internals.
101
101
  // The reducer mock delegates to the compactFn to simulate a forced compaction
102
102
  // tier, matching the real reducer's behavior for Tier 1.
103
- mock.module("../daemon/context-overflow-reducer.js", () => ({
104
- createInitialReducerState: () => ({
105
- appliedTiers: [],
106
- injectionMode: "full" as const,
107
- exhausted: false,
108
- }),
109
- reduceContextOverflow: async (
110
- msgs: Message[],
111
- _cfg: unknown,
112
- _state: unknown,
113
- compactFn?: (
114
- m: Message[],
115
- s: AbortSignal | undefined,
116
- o: Record<string, unknown>,
117
- ) => Promise<{
118
- compacted: boolean;
119
- messages: Message[];
120
- compactedPersistedMessages?: number;
121
- summaryText?: string;
122
- [k: string]: unknown;
123
- }>,
124
- signal?: AbortSignal,
125
- ) => {
126
- let resultMessages = msgs;
127
- let compactionResult;
128
- if (compactFn) {
129
- const cr = await compactFn(msgs, signal, { force: true });
130
- if (cr.compacted) {
131
- resultMessages = cr.messages;
132
- compactionResult = cr;
103
+ mock.module(
104
+ "../plugins/defaults/compaction/context-overflow-reducer.js",
105
+ () => ({
106
+ createInitialReducerState: () => ({
107
+ appliedTiers: [],
108
+ injectionMode: "full" as const,
109
+ exhausted: false,
110
+ }),
111
+ reduceContextOverflow: async (
112
+ msgs: Message[],
113
+ _cfg: unknown,
114
+ _state: unknown,
115
+ compactFn?: (
116
+ m: Message[],
117
+ s: AbortSignal | undefined,
118
+ o: Record<string, unknown>,
119
+ ) => Promise<{
120
+ compacted: boolean;
121
+ messages: Message[];
122
+ compactedPersistedMessages?: number;
123
+ summaryText?: string;
124
+ [k: string]: unknown;
125
+ }>,
126
+ signal?: AbortSignal,
127
+ ) => {
128
+ let resultMessages = msgs;
129
+ let compactionResult;
130
+ if (compactFn) {
131
+ const cr = await compactFn(msgs, signal, { force: true });
132
+ if (cr.compacted) {
133
+ resultMessages = cr.messages;
134
+ compactionResult = cr;
135
+ }
133
136
  }
134
- }
135
- return {
136
- messages: resultMessages,
137
- tier: "forced_compaction",
138
- state: {
139
- appliedTiers: [
140
- "forced_compaction",
141
- "tool_result_truncation",
142
- "media_stubbing",
143
- "injection_downgrade",
144
- ],
145
- injectionMode: "full",
146
- exhausted: true,
147
- },
148
- estimatedTokens: 1000,
149
- compactionResult,
150
- };
151
- },
152
- }));
137
+ return {
138
+ messages: resultMessages,
139
+ tier: "forced_compaction",
140
+ state: {
141
+ appliedTiers: [
142
+ "forced_compaction",
143
+ "tool_result_truncation",
144
+ "media_stubbing",
145
+ "injection_downgrade",
146
+ ],
147
+ injectionMode: "full",
148
+ exhausted: true,
149
+ },
150
+ estimatedTokens: 1000,
151
+ compactionResult,
152
+ };
153
+ },
154
+ }),
155
+ );
153
156
 
154
157
  mock.module("../daemon/context-overflow-policy.js", () => ({
155
158
  resolveOverflowAction: () => "fail_gracefully",
@@ -221,6 +224,7 @@ let forceCompactionEnabled = false;
221
224
  mock.module("../context/window-manager.js", () => ({
222
225
  ContextWindowManager: class {
223
226
  constructor() {}
227
+ updateConfig() {}
224
228
  shouldCompact() {
225
229
  return { needed: false, estimatedTokens: 0 };
226
230
  }
@@ -280,10 +284,11 @@ mock.module("../agent/loop.js", () => ({
280
284
  getActiveModel() {
281
285
  return undefined;
282
286
  }
283
- async run(
284
- messages: Message[],
285
- onEvent: (event: AgentEvent) => void,
286
- ): Promise<AgentLoopRunResult> {
287
+ async run(options: {
288
+ messages: Message[];
289
+ onEvent: (event: AgentEvent) => void;
290
+ }): Promise<AgentLoopRunResult> {
291
+ const { messages, onEvent } = options;
287
292
  // Prime the assistant row anchor — production code emits this from
288
293
  // `AgentLoop.run` just before `provider.sendMessage`.
289
294
  await onEvent({ type: "llm_call_started" });
@@ -486,11 +491,10 @@ describe("provider ordering error retry", () => {
486
491
  firstRunErrorMode = "ordering";
487
492
  maybeCompactCalls = [];
488
493
  forceCompactionEnabled = false;
489
- // Orchestrator pipelines (`overflowReduce`, `persistence`, …) run through
490
- // the plugin registry; re-register every default so each pipeline has a
491
- // middleware to dispatch to. The `context-overflow-reducer` module itself
492
- // (and other collaborators) are mocked above, so the default plugins'
493
- // delegates go through the mocked implementations.
494
+ // The compaction pipeline runs through the plugin registry; re-register
495
+ // every default so it has a middleware to dispatch to. Collaborators are
496
+ // mocked above, so the default plugins' delegates go through the mocked
497
+ // implementations.
494
498
  resetPluginRegistryAndRegisterDefaults();
495
499
  });
496
500
 
@@ -570,7 +574,7 @@ describe("provider ordering error retry", () => {
570
574
  });
571
575
 
572
576
  expect(agentLoopRunCount).toBe(2);
573
- expect(maybeCompactCalls).toEqual([{ force: false }, { force: true }]);
577
+ expect(maybeCompactCalls).toEqual([{ force: true }]);
574
578
  expect(events.some((e) => e.type === "message_complete")).toBe(true);
575
579
  expect(events.some((e) => e.type === "conversation_error")).toBe(false);
576
580
  });
@@ -595,9 +599,10 @@ describe("provider ordering error retry", () => {
595
599
  // (forceCompactionEnabled=false), the second run also fails with
596
600
  // context_too_large. The overflow policy (fail_gracefully) surfaces error.
597
601
  expect(agentLoopRunCount).toBe(2);
598
- // Two maybeCompact calls: initial auto-compact (force:false),
599
- // reducer's compactFn (force:true).
600
- expect(maybeCompactCalls).toEqual([{ force: false }, { force: true }]);
602
+ // One maybeCompact call: the reducer's compactFn (force:true). The
603
+ // orchestrator's start-of-turn auto-compact no longer runs — the loop's
604
+ // pre-call budget gate owns turn-start compaction and doesn't trip here.
605
+ expect(maybeCompactCalls).toEqual([{ force: true }]);
601
606
 
602
607
  expect(events.some((e) => e.type === "conversation_error")).toBe(true);
603
608
  });
@@ -618,7 +623,7 @@ describe("provider ordering error retry", () => {
618
623
 
619
624
  // Same as above — convergence loop re-runs agent loop, which also fails.
620
625
  expect(agentLoopRunCount).toBe(2);
621
- expect(maybeCompactCalls).toEqual([{ force: false }, { force: true }]);
626
+ expect(maybeCompactCalls).toEqual([{ force: true }]);
622
627
  expect(events.some((e) => e.type === "conversation_error")).toBe(true);
623
628
  });
624
629
 
@@ -637,7 +642,7 @@ describe("provider ordering error retry", () => {
637
642
  });
638
643
 
639
644
  expect(agentLoopRunCount).toBe(2);
640
- expect(maybeCompactCalls).toEqual([{ force: false }, { force: true }]);
645
+ expect(maybeCompactCalls).toEqual([{ force: true }]);
641
646
  expect(events.some((e) => e.type === "message_complete")).toBe(true);
642
647
  expect(events.some((e) => e.type === "conversation_error")).toBe(false);
643
648
  });
@@ -660,7 +665,7 @@ describe("provider ordering error retry", () => {
660
665
  // the regex patterns, but classifyConversationError recognizes statusCode 413
661
666
  // as CONTEXT_TOO_LARGE and sets contextTooLargeDetected = true.
662
667
  expect(agentLoopRunCount).toBe(2);
663
- expect(maybeCompactCalls).toEqual([{ force: false }, { force: true }]);
668
+ expect(maybeCompactCalls).toEqual([{ force: true }]);
664
669
  expect(events.some((e) => e.type === "message_complete")).toBe(true);
665
670
  expect(events.some((e) => e.type === "conversation_error")).toBe(false);
666
671
  });
@@ -265,6 +265,7 @@ mock.module("../memory/retriever.js", () => ({
265
265
  mock.module("../context/window-manager.js", () => ({
266
266
  ContextWindowManager: class {
267
267
  constructor() {}
268
+ updateConfig() {}
268
269
  shouldCompact() {
269
270
  return { needed: false, estimatedTokens: 0 };
270
271
  }
@@ -353,15 +354,14 @@ mock.module("../agent/loop.js", () => ({
353
354
  getActiveModel() {
354
355
  return undefined;
355
356
  }
356
- async run(
357
- messages: Message[],
358
- onEvent: (event: AgentEvent) => void | Promise<void>,
359
- options?: {
360
- onCheckpoint?: (
361
- checkpoint: CheckpointInfo,
362
- ) => CheckpointDecision | Promise<CheckpointDecision>;
363
- },
364
- ): Promise<AgentLoopRunResult> {
357
+ async run(options: {
358
+ messages: Message[];
359
+ onEvent: (event: AgentEvent) => void | Promise<void>;
360
+ onCheckpoint?: (
361
+ checkpoint: CheckpointInfo,
362
+ ) => CheckpointDecision | Promise<CheckpointDecision>;
363
+ }): Promise<AgentLoopRunResult> {
364
+ const { messages, onEvent } = options;
365
365
  return new Promise<AgentLoopRunResult>((resolveResult, reject) => {
366
366
  const pending: PendingRun = {
367
367
  resolve: (history: Message[]) =>