@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,210 +0,0 @@
1
- /**
2
- * Tests for the `compaction` plugin pipeline (PR 25).
3
- *
4
- * Covers:
5
- * - Default plugin delegates to the manager's `maybeCompact` and returns the
6
- * same `ContextWindowResult` object the manager produced.
7
- * - A custom plugin layered on top can short-circuit before the terminal is
8
- * reached and return a different summary, demonstrating that the pipeline
9
- * slot is observable and replaceable without patching the manager.
10
- *
11
- * The tests drive `runPipeline` directly rather than going through the full
12
- * orchestrator — the integration path (conversation-agent-loop) is exercised
13
- * by `conversation-agent-loop-overflow.test.ts`, which must continue to pass
14
- * as the acceptance criterion for this PR.
15
- */
16
-
17
- import { describe, expect, test } from "bun:test";
18
-
19
- import type { TrustContext } from "../daemon/trust-context.js";
20
- import {
21
- DEFAULT_COMPACTION_PLUGIN_NAME,
22
- defaultCompactionTerminal,
23
- } from "../plugins/defaults/compaction/terminal.js";
24
- import { runPipeline } from "../plugins/pipeline.js";
25
- import {
26
- type CompactionArgs,
27
- type CompactionResult,
28
- type Middleware,
29
- PluginExecutionError,
30
- type TurnContext,
31
- } from "../plugins/types.js";
32
-
33
- type ContextWindowResultShape = {
34
- compacted: boolean;
35
- summaryText: string;
36
- messages: unknown[];
37
- previousEstimatedInputTokens: number;
38
- estimatedInputTokens: number;
39
- maxInputTokens: number;
40
- thresholdTokens: number;
41
- compactedMessages: number;
42
- compactedPersistedMessages: number;
43
- summaryCalls: number;
44
- summaryInputTokens: number;
45
- summaryOutputTokens: number;
46
- summaryModel: string;
47
- reason?: string;
48
- };
49
-
50
- const trust: TrustContext = {
51
- sourceChannel: "vellum",
52
- trustClass: "guardian",
53
- };
54
-
55
- function makeTurnCtx(manager: {
56
- maybeCompact: (...args: unknown[]) => Promise<unknown>;
57
- }): TurnContext {
58
- return {
59
- requestId: "req-compaction-test",
60
- conversationId: "conv-compaction-test",
61
- turnIndex: 0,
62
- trust,
63
- // `TurnContext.contextWindowManager` is a typed optional field; the
64
- // default compaction plugin reads it directly without a cast.
65
- contextWindowManager:
66
- manager as unknown as TurnContext["contextWindowManager"],
67
- };
68
- }
69
-
70
- function makeResult(
71
- overrides: Partial<ContextWindowResultShape> = {},
72
- ): ContextWindowResultShape {
73
- return {
74
- compacted: true,
75
- summaryText: "default-summary",
76
- messages: [],
77
- previousEstimatedInputTokens: 1000,
78
- estimatedInputTokens: 100,
79
- maxInputTokens: 100000,
80
- thresholdTokens: 80000,
81
- compactedMessages: 3,
82
- compactedPersistedMessages: 3,
83
- summaryCalls: 1,
84
- summaryInputTokens: 500,
85
- summaryOutputTokens: 120,
86
- summaryModel: "default-model",
87
- ...overrides,
88
- };
89
- }
90
-
91
- describe("compaction pipeline", () => {
92
- test("default plugin delegates to the manager and returns its result unchanged", async () => {
93
- const observed: {
94
- messages: unknown;
95
- signal: unknown;
96
- options: unknown;
97
- }[] = [];
98
- const expected = makeResult({
99
- summaryText: "manager-summary",
100
- compactedMessages: 7,
101
- });
102
- const manager = {
103
- maybeCompact: async (
104
- messages: unknown,
105
- signal: unknown,
106
- options: unknown,
107
- ) => {
108
- observed.push({ messages, signal, options });
109
- return expected;
110
- },
111
- };
112
- const turnCtx = makeTurnCtx(manager);
113
- const args: CompactionArgs = {
114
- messages: [{ role: "user", content: "hi" }],
115
- signal: new AbortController().signal,
116
- options: { precomputedEstimate: 1234 },
117
- };
118
-
119
- // No middleware registered — the runner invokes the terminal directly.
120
- const result = (await runPipeline<CompactionArgs, CompactionResult>(
121
- "compaction",
122
- [],
123
- (innerArgs) => defaultCompactionTerminal(innerArgs, turnCtx),
124
- args,
125
- turnCtx,
126
- 30000,
127
- )) as ContextWindowResultShape;
128
-
129
- // Terminal forwarded args verbatim to the manager — except for
130
- // `signal`, which the pipeline runner replaces with a signal linked
131
- // to its internal timeout controller. The linked signal must forward
132
- // caller-originated aborts, which is verified in the dedicated
133
- // pipeline-runner abort-propagation tests.
134
- expect(observed).toHaveLength(1);
135
- expect(observed[0]!.messages).toBe(args.messages);
136
- expect(observed[0]!.signal).toBeInstanceOf(AbortSignal);
137
- expect(observed[0]!.options).toBe(args.options);
138
-
139
- // Returned result is the manager's object, unmodified — no wrapping
140
- // or shape transformation is allowed in the default path.
141
- expect(result).toBe(expected);
142
- expect(result.summaryText).toBe("manager-summary");
143
- expect(result.compactedMessages).toBe(7);
144
- });
145
-
146
- test("custom plugin short-circuits to a different summary without touching the manager", async () => {
147
- let managerCallCount = 0;
148
- const manager = {
149
- maybeCompact: async () => {
150
- managerCallCount++;
151
- return makeResult({ summaryText: "should-not-run" });
152
- },
153
- };
154
- const turnCtx = makeTurnCtx(manager);
155
-
156
- const custom: Middleware<CompactionArgs, CompactionResult> =
157
- async function customCompaction(_args, _next, _ctx) {
158
- // Short-circuit — omit the `next` call so the terminal never fires.
159
- return makeResult({
160
- summaryText: "custom-plugin-summary",
161
- compactedMessages: 0,
162
- summaryCalls: 0,
163
- reason: "short-circuited by custom plugin",
164
- });
165
- };
166
-
167
- const args: CompactionArgs = {
168
- messages: [],
169
- signal: undefined,
170
- options: undefined,
171
- };
172
-
173
- const result = (await runPipeline<CompactionArgs, CompactionResult>(
174
- "compaction",
175
- [custom],
176
- (innerArgs) => defaultCompactionTerminal(innerArgs, turnCtx),
177
- args,
178
- turnCtx,
179
- 30000,
180
- )) as ContextWindowResultShape;
181
-
182
- expect(managerCallCount).toBe(0);
183
- expect(result.summaryText).toBe("custom-plugin-summary");
184
- expect(result.reason).toBe("short-circuited by custom plugin");
185
- });
186
-
187
- test("default terminal surfaces a PluginExecutionError when the manager is missing", async () => {
188
- // Build a turn context without the extension field so the default
189
- // terminal's lenient read fails — this guards against a future refactor
190
- // that removes the handle-attach helper in the orchestrator.
191
- const turnCtxWithoutManager: TurnContext = {
192
- requestId: "req-missing",
193
- conversationId: "conv-missing",
194
- turnIndex: 0,
195
- trust,
196
- };
197
- const args: CompactionArgs = {
198
- messages: [],
199
- signal: undefined,
200
- options: undefined,
201
- };
202
-
203
- await expect(
204
- defaultCompactionTerminal(args, turnCtxWithoutManager),
205
- ).rejects.toThrow(PluginExecutionError);
206
- await expect(
207
- defaultCompactionTerminal(args, turnCtxWithoutManager),
208
- ).rejects.toThrow(DEFAULT_COMPACTION_PLUGIN_NAME);
209
- });
210
- });
@@ -1,251 +0,0 @@
1
- /**
2
- * Tests for the compaction call-site recovery path added in JARVIS-587.
3
- *
4
- * When the `compaction` pipeline exceeds its 30s budget (manifest-wide
5
- * `DEFAULT_TIMEOUTS.compaction`), the pipeline runner throws
6
- * `PluginTimeoutError`. The three compaction call sites in
7
- * `conversation-agent-loop.ts` (start-of-turn, mid-loop, emergency) catch
8
- * that error, record the failure on the loop-held `CompactionCircuit`
9
- * (`recordOutcome(turn, true, ...)`) so the circuit breaker counts it, and degrade
10
- * gracefully.
11
- *
12
- * This file asserts the tight coupling between:
13
- * (1) a `PluginTimeoutError`-driven failure and
14
- * (2) the compaction circuit breaker's 3-strike threshold.
15
- *
16
- * The existing `circuit-breaker-pipeline.test.ts` already exercises the
17
- * breaker's transitions end-to-end. These tests verify that our new
18
- * catch-blocks feed the breaker the same `"failure"` outcome a normal
19
- * summary-LLM throw would, and that repeated timeouts therefore trip the
20
- * same 3-strike trip.
21
- */
22
-
23
- import { afterEach, beforeEach, describe, expect, test } from "bun:test";
24
-
25
- import {
26
- type CircuitTurnInfo,
27
- CompactionCircuit,
28
- } from "../agent/compaction-circuit.js";
29
- import type { ServerMessage } from "../daemon/message-protocol.js";
30
- import type { TrustContext } from "../daemon/trust-context.js";
31
- import { COMPACTION_CIRCUIT_FAILURE_THRESHOLD } from "../plugins/defaults/circuit-breaker/middlewares/circuitBreaker.js";
32
- import { defaultCircuitBreakerPlugin } from "../plugins/defaults/circuit-breaker/register.js";
33
- import { DEFAULT_TIMEOUTS, runPipeline } from "../plugins/pipeline.js";
34
- import {
35
- getMiddlewaresFor,
36
- registerPlugin,
37
- resetPluginRegistryForTests,
38
- } from "../plugins/registry.js";
39
- import {
40
- type CompactionArgs,
41
- type CompactionResult,
42
- type Middleware,
43
- PluginTimeoutError,
44
- type TurnContext,
45
- } from "../plugins/types.js";
46
-
47
- // ─── Fixtures ───────────────────────────────────────────────────────────────
48
-
49
- function makeCircuit(conversationId = "conv-timeout-test"): CompactionCircuit {
50
- return new CompactionCircuit(conversationId);
51
- }
52
-
53
- const turn: CircuitTurnInfo = {
54
- turnCount: 0,
55
- trustContext: { sourceChannel: "vellum", trustClass: "guardian" },
56
- };
57
-
58
- const trust: TrustContext = {
59
- sourceChannel: "vellum",
60
- trustClass: "guardian",
61
- };
62
-
63
- function makeTurnCtx(conversationId: string): TurnContext {
64
- return {
65
- requestId: "req-timeout-test",
66
- conversationId,
67
- turnIndex: 0,
68
- trust,
69
- };
70
- }
71
-
72
- function collectEvents(): {
73
- events: ServerMessage[];
74
- onEvent: (msg: ServerMessage) => void;
75
- } {
76
- const events: ServerMessage[] = [];
77
- return { events, onEvent: (msg) => events.push(msg) };
78
- }
79
-
80
- // ─── Tests ──────────────────────────────────────────────────────────────────
81
-
82
- describe("compaction timeout recovery (JARVIS-587)", () => {
83
- beforeEach(() => {
84
- resetPluginRegistryForTests();
85
- registerPlugin(defaultCircuitBreakerPlugin);
86
- });
87
-
88
- afterEach(() => {
89
- resetPluginRegistryForTests();
90
- });
91
-
92
- test("runPipeline('compaction', ...) throws PluginTimeoutError on budget breach", async () => {
93
- // Baseline: the compaction pipeline still surfaces PluginTimeoutError when
94
- // its timer fires. This guards the outer race from silently swallowing
95
- // the timeout when the inner call is aborted by our Part A wiring.
96
- const hang: Middleware<CompactionArgs, CompactionResult> = async (
97
- _args,
98
- _next,
99
- ) =>
100
- new Promise<CompactionResult>(() => {
101
- // intentionally never resolves
102
- });
103
-
104
- let caught: unknown;
105
- try {
106
- await runPipeline<CompactionArgs, CompactionResult>(
107
- "compaction",
108
- [hang],
109
- async () => ({ compacted: false }) as unknown as CompactionResult,
110
- { messages: [] as unknown, signal: undefined, options: undefined },
111
- makeTurnCtx("conv-budget-breach"),
112
- // Override the manifest timeout to keep the test fast.
113
- 20,
114
- );
115
- } catch (err) {
116
- caught = err;
117
- }
118
- expect(caught).toBeInstanceOf(PluginTimeoutError);
119
- expect((caught as PluginTimeoutError).pipeline).toBe("compaction");
120
- });
121
-
122
- test("recordOutcome(failed=true) driven by PluginTimeoutError trips the breaker at the 3rd strike", async () => {
123
- // Simulates the production sequence: each mid-loop compaction hits the
124
- // pipeline's 30s ceiling, the catch path calls
125
- // `circuit.recordOutcome(turn, true, onEvent)`. After three such catches
126
- // the circuit breaker must be open — matching the same invariant the
127
- // existing breaker test file exercises for normal summary-LLM throws.
128
- const circuit = makeCircuit();
129
- const { onEvent, events } = collectEvents();
130
-
131
- // First two timeouts — circuit still closed.
132
- await circuit.recordOutcome(turn, true, onEvent);
133
- await circuit.recordOutcome(turn, true, onEvent);
134
- expect(circuit.consecutiveCompactionFailures).toBe(2);
135
- expect(circuit.compactionCircuitOpenUntil).toBeNull();
136
- expect(events).toHaveLength(0);
137
-
138
- // Third timeout — breaker trips and emits the canonical transition event.
139
- await circuit.recordOutcome(turn, true, onEvent);
140
- expect(circuit.consecutiveCompactionFailures).toBe(
141
- COMPACTION_CIRCUIT_FAILURE_THRESHOLD,
142
- );
143
- expect(circuit.compactionCircuitOpenUntil).not.toBeNull();
144
- expect(events).toHaveLength(1);
145
- expect(events[0]).toEqual({
146
- type: "compaction_circuit_open",
147
- conversationId: circuit.conversationId,
148
- reason: "3_consecutive_failures",
149
- openUntil: circuit.compactionCircuitOpenUntil as number,
150
- });
151
- });
152
-
153
- test("a successful compaction after two timeouts resets the counter", async () => {
154
- // The recovery path doesn't interfere with the breaker's normal reset —
155
- // once a compaction call eventually succeeds, the streak is broken and
156
- // the next failure starts counting from 1.
157
- const circuit = makeCircuit();
158
- const { onEvent } = collectEvents();
159
-
160
- await circuit.recordOutcome(turn, true, onEvent);
161
- await circuit.recordOutcome(turn, true, onEvent);
162
- expect(circuit.consecutiveCompactionFailures).toBe(2);
163
-
164
- await circuit.recordOutcome(turn, false, onEvent);
165
- expect(circuit.consecutiveCompactionFailures).toBe(0);
166
- expect(circuit.compactionCircuitOpenUntil).toBeNull();
167
-
168
- await circuit.recordOutcome(turn, true, onEvent);
169
- expect(circuit.consecutiveCompactionFailures).toBe(1);
170
- });
171
-
172
- test("compaction call-site recovery remains defense-in-depth even when DEFAULT_TIMEOUTS.compaction is null", () => {
173
- // At the time this PR landed, `DEFAULT_TIMEOUTS.compaction` was null
174
- // (pipeline timeouts globally disabled — see #27608). That makes the
175
- // call-site catch blocks unreachable in production right now, but the
176
- // catch blocks still matter: any future reintroduction of a per-pipeline
177
- // compaction timeout immediately benefits from circuit-breaker recording
178
- // and graceful-degradation without needing to re-touch every call site.
179
- //
180
- // This test just documents the current value so a future change that
181
- // reintroduces a timeout must also decide (intentionally) whether the
182
- // recovery path should continue to fire.
183
- const value = DEFAULT_TIMEOUTS.compaction;
184
- expect(value === null || typeof value === "number").toBe(true);
185
- });
186
- });
187
-
188
- describe("abort propagation end-to-end (Part A + updateSummary fallback)", () => {
189
- beforeEach(() => {
190
- resetPluginRegistryForTests();
191
- registerPlugin(defaultCircuitBreakerPlugin);
192
- });
193
-
194
- afterEach(() => {
195
- resetPluginRegistryForTests();
196
- });
197
-
198
- test("caller-provided signal is replaced with a linked signal that fires on timeout", async () => {
199
- // Minimal proof that Part A actually wires the signal through the
200
- // compaction pipeline: when the pipeline runner's timer fires, the
201
- // signal seen by the inner terminal is aborted — allowing
202
- // `updateSummary`'s try/catch around `provider.sendMessage` to trigger
203
- // the local-fallback path instead of the call hanging indefinitely.
204
- let observedSignal: AbortSignal | undefined;
205
- const waitForAbort: Middleware<CompactionArgs, CompactionResult> = async (
206
- args,
207
- _next,
208
- ) => {
209
- observedSignal = args.signal;
210
- return new Promise<CompactionResult>((_resolve, reject) => {
211
- args.signal?.addEventListener("abort", () => {
212
- reject(
213
- Object.assign(new Error("aborted by signal"), {
214
- name: "AbortError",
215
- }),
216
- );
217
- });
218
- });
219
- };
220
-
221
- const callerController = new AbortController();
222
-
223
- let caught: unknown;
224
- try {
225
- await runPipeline<CompactionArgs, CompactionResult>(
226
- "compaction",
227
- [waitForAbort, ...getMiddlewaresFor("compaction")],
228
- async () => ({ compacted: false }) as unknown as CompactionResult,
229
- {
230
- messages: [] as unknown,
231
- signal: callerController.signal,
232
- options: undefined,
233
- },
234
- makeTurnCtx("conv-abort-test"),
235
- 20,
236
- );
237
- } catch (err) {
238
- caught = err;
239
- }
240
-
241
- expect(caught).toBeInstanceOf(PluginTimeoutError);
242
- expect(observedSignal).toBeDefined();
243
- // The runner swaps the caller's signal for a linked signal — the two are
244
- // distinct objects but both should end up aborted once the timer fires.
245
- expect(observedSignal).not.toBe(callerController.signal);
246
- expect(observedSignal!.aborted).toBe(true);
247
- // Caller's own signal is untouched — pipeline timeout does not cascade
248
- // outward onto the caller's controller.
249
- expect(callerController.signal.aborted).toBe(false);
250
- });
251
- });