@vellumai/assistant 0.8.8 → 0.8.9-dev.202606091853.fbaa2ae

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 (475) hide show
  1. package/ARCHITECTURE.md +6 -6
  2. package/bun.lock +2 -2
  3. package/docs/activation-funnel-telemetry.md +310 -0
  4. package/examples/plugins/echo/README.md +61 -60
  5. package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
  6. package/examples/plugins/echo/hooks/stop.ts +16 -0
  7. package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
  8. package/examples/plugins/echo/package.json +1 -2
  9. package/examples/plugins/echo/src/emit.ts +19 -0
  10. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
  11. package/openapi.yaml +263 -121
  12. package/package.json +2 -2
  13. package/src/__tests__/activation-early-marking.test.ts +120 -0
  14. package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
  15. package/src/__tests__/agent-loop-exit-reason.test.ts +204 -144
  16. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
  17. package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
  18. package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
  19. package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
  20. package/src/__tests__/agent-loop-thinking.test.ts +36 -20
  21. package/src/__tests__/agent-loop.test.ts +441 -96
  22. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
  23. package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
  24. package/src/__tests__/anthropic-provider.test.ts +23 -8
  25. package/src/__tests__/app-builder-tool-scripts.test.ts +21 -0
  26. package/src/__tests__/app-control-flow.test.ts +1 -1
  27. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  28. package/src/__tests__/app-executors.test.ts +132 -0
  29. package/src/__tests__/approval-cascade.test.ts +6 -5
  30. package/src/__tests__/approval-routes-http.test.ts +4 -1
  31. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
  32. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  33. package/src/__tests__/channel-approvals.test.ts +1 -1
  34. package/src/__tests__/compaction-circuit.test.ts +258 -0
  35. package/src/__tests__/compaction-direct.test.ts +146 -0
  36. package/src/__tests__/compaction-events.test.ts +7 -7
  37. package/src/__tests__/compaction.benchmark.test.ts +1 -1
  38. package/src/__tests__/compactor-web-search-strip.test.ts +213 -0
  39. package/src/__tests__/context-overflow-reducer.test.ts +265 -125
  40. package/src/__tests__/context-window-manager-compact-retry.test.ts +121 -15
  41. package/src/__tests__/conversation-abort-tool-results.test.ts +7 -5
  42. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
  43. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +78 -119
  44. package/src/__tests__/conversation-agent-loop-overflow.test.ts +158 -234
  45. package/src/__tests__/conversation-agent-loop.test.ts +342 -623
  46. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  47. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -5
  48. package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
  49. package/src/__tests__/conversation-error.test.ts +15 -1
  50. package/src/__tests__/conversation-history-web-search.test.ts +6 -1
  51. package/src/__tests__/conversation-media-retry.test.ts +1 -1
  52. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +44 -4
  53. package/src/__tests__/conversation-process-callsite.test.ts +15 -15
  54. package/src/__tests__/conversation-provider-retry-repair.test.ts +66 -65
  55. package/src/__tests__/conversation-queue.test.ts +10 -10
  56. package/src/__tests__/conversation-runtime-assembly.test.ts +1059 -231
  57. package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
  58. package/src/__tests__/conversation-slash-queue.test.ts +7 -5
  59. package/src/__tests__/conversation-slash-unknown.test.ts +7 -5
  60. package/src/__tests__/conversation-speed-override.test.ts +11 -10
  61. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  62. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +395 -0
  63. package/src/__tests__/conversation-surfaces-app-control.test.ts +48 -1
  64. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +73 -4
  65. package/src/__tests__/conversation-undo.test.ts +2 -2
  66. package/src/__tests__/conversation-workspace-cache-state.test.ts +24 -21
  67. package/src/__tests__/conversation-workspace-injection.test.ts +69 -7
  68. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +15 -12
  69. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  70. package/src/__tests__/corrected-target.test.ts +93 -0
  71. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  72. package/src/__tests__/cu-unified-flow.test.ts +36 -0
  73. package/src/__tests__/db-acp-history.test.ts +101 -0
  74. package/src/__tests__/dynamic-page-surface.test.ts +31 -0
  75. package/src/__tests__/empty-response-hook.test.ts +1 -1
  76. package/src/__tests__/file-write-tool.test.ts +63 -0
  77. package/src/__tests__/gateway-only-guard.test.ts +17 -2
  78. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  79. package/src/__tests__/guardian-routing-invariants.test.ts +93 -4
  80. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  81. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  82. package/src/__tests__/heartbeat-service.test.ts +1 -0
  83. package/src/__tests__/history-repair-hook.test.ts +5 -1
  84. package/src/__tests__/host-app-control-proxy.test.ts +45 -0
  85. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  86. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  87. package/src/__tests__/inference-profile-reaper.test.ts +62 -0
  88. package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
  89. package/src/__tests__/injector-background-turn.test.ts +13 -23
  90. package/src/__tests__/injector-chain.test.ts +268 -44
  91. package/src/__tests__/injector-disk-pressure.test.ts +210 -52
  92. package/src/__tests__/injector-document-comments.test.ts +97 -114
  93. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  94. package/src/__tests__/injector-v3-suppression.test.ts +4 -4
  95. package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
  96. package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
  97. package/src/__tests__/llm-resolver.test.ts +73 -0
  98. package/src/__tests__/memory-retrieval-hook.test.ts +156 -38
  99. package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
  100. package/src/__tests__/notification-decision-strategy.test.ts +3 -3
  101. package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
  102. package/src/__tests__/persist-unsendable-image-downscale.test.ts +145 -0
  103. package/src/__tests__/persist-unsendable-image.test.ts +97 -1
  104. package/src/__tests__/plugin-api-shim.test.ts +6 -9
  105. package/src/__tests__/plugin-bootstrap.test.ts +91 -81
  106. package/src/__tests__/plugin-registry.test.ts +3 -49
  107. package/src/__tests__/plugin-skill-contribution.test.ts +15 -14
  108. package/src/__tests__/plugin-tool-contribution.test.ts +7 -4
  109. package/src/__tests__/plugin-types.test.ts +0 -70
  110. package/src/__tests__/post-turn-tool-result-truncation.test.ts +69 -0
  111. package/src/__tests__/pre-model-call-sanitize.test.ts +109 -0
  112. package/src/__tests__/published-app-updater.test.ts +138 -0
  113. package/src/__tests__/reaction-persistence.test.ts +1 -1
  114. package/src/__tests__/send-endpoint-busy.test.ts +4 -1
  115. package/src/__tests__/skill-feature-flags-integration.test.ts +31 -0
  116. package/src/__tests__/steer-tool-repair.test.ts +1 -1
  117. package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
  118. package/src/__tests__/subagent-detail.test.ts +25 -7
  119. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  120. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  121. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  122. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  123. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  124. package/src/__tests__/title-generate-hook.test.ts +5 -1
  125. package/src/__tests__/tool-error-hook.test.ts +1 -1
  126. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
  127. package/src/__tests__/user-plugin-loader.test.ts +54 -286
  128. package/src/__tests__/web-fetch.test.ts +45 -0
  129. package/src/acp/__tests__/agent-process.test.ts +161 -0
  130. package/src/acp/__tests__/client-handler.test.ts +40 -0
  131. package/src/acp/__tests__/helpers/acp-config-stub.ts +0 -2
  132. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  133. package/src/acp/__tests__/helpers/exec-file-stub.ts +106 -0
  134. package/src/acp/__tests__/prepare-agent-env.test.ts +97 -0
  135. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  136. package/src/acp/__tests__/session-manager-resume.test.ts +888 -0
  137. package/src/acp/agent-process.ts +61 -1
  138. package/src/acp/auto-install.test.ts +280 -0
  139. package/src/acp/auto-install.ts +232 -0
  140. package/src/acp/client-handler.ts +31 -0
  141. package/src/acp/prepare-agent-env.ts +80 -27
  142. package/src/acp/resolve-agent.test.ts +188 -28
  143. package/src/acp/resolve-agent.ts +119 -42
  144. package/src/acp/resume-hint.ts +23 -0
  145. package/src/acp/session-manager.ts +507 -73
  146. package/src/agent/compaction-circuit.ts +60 -102
  147. package/src/agent/loop.ts +403 -251
  148. package/src/api/responses/conversation-message.ts +22 -2
  149. package/src/api/responses/memory-v3-selection-log.ts +19 -10
  150. package/src/approvals/guardian-request-resolvers.ts +27 -1
  151. package/src/background-wake/next-wake.ts +1 -0
  152. package/src/cli/commands/__tests__/memory-v3.test.ts +191 -210
  153. package/src/cli/commands/channel-verification-sessions.ts +6 -6
  154. package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
  155. package/src/cli/commands/memory-v3.ts +57 -199
  156. package/src/cli/commands/plugins.ts +43 -37
  157. package/src/cli/lib/__tests__/install-from-github.test.ts +790 -111
  158. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
  159. package/src/cli/lib/__tests__/plugin-details.test.ts +381 -0
  160. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +270 -0
  161. package/src/cli/lib/__tests__/search-plugins.test.ts +233 -32
  162. package/src/cli/lib/install-from-github.ts +797 -60
  163. package/src/cli/lib/plugin-catalog-cache.ts +84 -0
  164. package/src/cli/lib/plugin-details.ts +416 -0
  165. package/src/cli/lib/plugin-marketplace.ts +215 -0
  166. package/src/cli/lib/search-plugins.ts +201 -29
  167. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  168. package/src/config/acp-defaults.test.ts +10 -0
  169. package/src/config/acp-defaults.ts +9 -3
  170. package/src/config/acp-schema.ts +1 -7
  171. package/src/config/bundled-skills/acp/SKILL.md +80 -41
  172. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  173. package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
  174. package/src/config/bundled-skills/app-builder/TOOLS.json +72 -2
  175. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  176. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  177. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  178. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  179. package/src/config/bundled-skills/app-builder/tools/app-update.ts +18 -0
  180. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  181. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  182. package/src/config/bundled-tool-registry.ts +4 -0
  183. package/src/config/call-site-defaults.ts +0 -3
  184. package/src/config/feature-flag-registry.json +10 -16
  185. package/src/config/llm-resolver.ts +39 -7
  186. package/src/config/schemas/__tests__/memory-v3.test.ts +25 -9
  187. package/src/config/schemas/call-site-catalog.ts +0 -21
  188. package/src/config/schemas/heartbeat.ts +9 -0
  189. package/src/config/schemas/llm.ts +17 -3
  190. package/src/config/schemas/memory-v3.ts +58 -8
  191. package/src/config/seed-inference-profiles.ts +18 -0
  192. package/src/context/compactor.ts +22 -4
  193. package/src/context/post-turn-tool-result-truncation.ts +39 -1
  194. package/src/context/strip-injections.ts +8 -2
  195. package/src/daemon/conversation-agent-loop-handlers.ts +18 -36
  196. package/src/daemon/conversation-agent-loop.ts +308 -1297
  197. package/src/daemon/conversation-error.ts +31 -4
  198. package/src/daemon/conversation-history.ts +1 -1
  199. package/src/daemon/conversation-lifecycle.ts +11 -255
  200. package/src/daemon/conversation-media-retry.ts +19 -6
  201. package/src/daemon/conversation-messaging.ts +17 -0
  202. package/src/daemon/conversation-process.ts +22 -141
  203. package/src/daemon/conversation-queue-manager.ts +8 -0
  204. package/src/daemon/conversation-registry.ts +159 -0
  205. package/src/daemon/conversation-runtime-assembly.ts +361 -393
  206. package/src/daemon/conversation-store.ts +9 -90
  207. package/src/daemon/conversation-surfaces.ts +165 -11
  208. package/src/daemon/conversation-workspace.ts +17 -0
  209. package/src/daemon/conversation.ts +444 -62
  210. package/src/daemon/disk-pressure-policy.ts +0 -1
  211. package/src/daemon/external-plugins-bootstrap.ts +36 -46
  212. package/src/daemon/handlers/config-channels.ts +11 -2
  213. package/src/daemon/handlers/conversations.ts +3 -1
  214. package/src/daemon/handlers/skills.ts +4 -1
  215. package/src/daemon/host-app-control-proxy.ts +72 -57
  216. package/src/daemon/host-proxy-preactivation.ts +1 -3
  217. package/src/daemon/lifecycle.ts +21 -7
  218. package/src/daemon/persist-unsendable-image.ts +62 -25
  219. package/src/daemon/process-message.ts +1 -1
  220. package/src/daemon/server.ts +2 -0
  221. package/src/daemon/tool-side-effects.ts +15 -0
  222. package/src/daemon/wake-conversation-ops.ts +269 -0
  223. package/src/embedded/plugin-api.ts +2 -2
  224. package/src/export/__tests__/transcript-formatter.test.ts +5 -0
  225. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
  226. package/src/heartbeat/heartbeat-run-store.ts +23 -1
  227. package/src/heartbeat/heartbeat-service.ts +26 -0
  228. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  229. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  230. package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
  231. package/src/ipc/skill-routes/memory.ts +4 -2
  232. package/src/memory/__tests__/activation-session-store.test.ts +41 -0
  233. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
  234. package/src/memory/__tests__/onboarding-events-store.test.ts +80 -0
  235. package/src/memory/activation-session-store.ts +43 -0
  236. package/src/memory/conversation-crud.ts +29 -19
  237. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  238. package/src/memory/db-init.ts +6 -0
  239. package/src/memory/job-handlers/conversation-starters.ts +13 -2
  240. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
  241. package/src/memory/jobs-worker.ts +25 -1
  242. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  243. package/src/memory/migrations/273-onboarding-events-funnel-columns.ts +46 -0
  244. package/src/memory/migrations/274-create-activation-sessions.ts +15 -0
  245. package/src/memory/migrations/index.ts +3 -0
  246. package/src/memory/onboarding-events-store.ts +66 -18
  247. package/src/memory/schema/acp.ts +4 -0
  248. package/src/memory/schema/infrastructure.ts +13 -0
  249. package/src/memory/v2/__tests__/consolidation-job.test.ts +4 -97
  250. package/src/memory/v2/__tests__/page-store.test.ts +22 -0
  251. package/src/memory/v2/consolidation-job.ts +2 -63
  252. package/src/memory/v2/types.ts +5 -0
  253. package/src/messaging/providers/telegram-bot/api.ts +14 -5
  254. package/src/notifications/__tests__/copy-composer.test.ts +244 -0
  255. package/src/notifications/access-request-copy.ts +298 -0
  256. package/src/notifications/adapters/slack.ts +3 -3
  257. package/src/notifications/adapters/telegram.ts +9 -2
  258. package/src/notifications/copy-composer.ts +49 -267
  259. package/src/notifications/decision-engine.ts +16 -35
  260. package/src/notifications/home-feed-side-effect.ts +1 -6
  261. package/src/plugin-api/constants.ts +4 -0
  262. package/src/plugin-api/index.ts +40 -11
  263. package/src/plugin-api/types.ts +108 -0
  264. package/src/plugins/defaults/compaction/compact.ts +106 -0
  265. package/src/{daemon → plugins/defaults/compaction}/context-overflow-reducer.ts +250 -42
  266. package/src/plugins/defaults/compaction/corrected-target.ts +53 -0
  267. package/src/plugins/defaults/compaction/manager-store.ts +57 -0
  268. package/src/plugins/defaults/compaction/package.json +1 -2
  269. package/src/{context → plugins/defaults/compaction}/window-manager.ts +95 -25
  270. package/src/plugins/defaults/empty-response/package.json +0 -1
  271. package/src/plugins/defaults/history-repair/package.json +0 -1
  272. package/src/plugins/defaults/index.ts +156 -26
  273. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +100 -52
  274. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +285 -0
  275. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
  276. package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
  277. package/src/plugins/defaults/memory-retrieval/package.json +14 -0
  278. package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
  279. package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +71 -0
  280. package/src/plugins/defaults/memory-v3-shadow/__tests__/dense.test.ts +181 -0
  281. package/src/plugins/defaults/memory-v3-shadow/__tests__/edge.test.ts +247 -0
  282. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +147 -134
  283. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +456 -0
  284. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +662 -0
  285. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +306 -0
  286. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +91 -0
  287. package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +402 -0
  288. package/src/plugins/defaults/memory-v3-shadow/__tests__/section-needle.test.ts +135 -0
  289. package/src/plugins/defaults/memory-v3-shadow/__tests__/sections.test.ts +125 -0
  290. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +74 -19
  291. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +446 -0
  292. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +592 -0
  293. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -24
  294. package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +91 -0
  295. package/src/plugins/defaults/memory-v3-shadow/dense.ts +97 -0
  296. package/src/plugins/defaults/memory-v3-shadow/edge.ts +252 -0
  297. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  298. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  299. package/src/plugins/defaults/memory-v3-shadow/injector.ts +76 -0
  300. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +555 -0
  301. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +266 -0
  302. package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
  303. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +71 -0
  304. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +204 -0
  305. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +16 -8
  306. package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +236 -0
  307. package/src/plugins/defaults/memory-v3-shadow/section-needle.ts +200 -0
  308. package/src/plugins/defaults/memory-v3-shadow/sections.ts +115 -0
  309. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +156 -0
  310. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +382 -0
  311. package/src/plugins/defaults/memory-v3-shadow/types.ts +92 -0
  312. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +4 -1
  313. package/src/plugins/defaults/title-generate/package.json +0 -1
  314. package/src/plugins/defaults/tool-error/package.json +0 -1
  315. package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
  316. package/src/plugins/external-api.ts +12 -2
  317. package/src/plugins/pipeline.ts +6 -293
  318. package/src/plugins/registry.ts +9 -37
  319. package/src/plugins/types.ts +76 -381
  320. package/src/plugins/user-loader.ts +30 -127
  321. package/src/prompts/__tests__/system-prompt.test.ts +6 -0
  322. package/src/prompts/system-prompt.ts +61 -10
  323. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +71 -4
  324. package/src/providers/anthropic/client.ts +9 -10
  325. package/src/providers/inference/kimi-cjk-token-ids.ts +493 -0
  326. package/src/providers/inference/logit-bias.ts +55 -0
  327. package/src/providers/model-catalog.ts +34 -0
  328. package/src/providers/openai/__tests__/vision-not-supported.test.ts +75 -0
  329. package/src/providers/openai/chat-completions-provider.ts +44 -1
  330. package/src/providers/retry.ts +22 -0
  331. package/src/providers/types.ts +6 -0
  332. package/src/runtime/__tests__/agent-wake.test.ts +555 -691
  333. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  334. package/src/runtime/agent-wake.ts +108 -209
  335. package/src/runtime/assistant-event-hub.ts +1 -1
  336. package/src/runtime/channel-approvals.ts +1 -1
  337. package/src/runtime/interactive-ui.ts +1 -1
  338. package/src/runtime/routes/__tests__/acp-routes.test.ts +466 -55
  339. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  340. package/src/runtime/routes/__tests__/plugins-routes.test.ts +423 -73
  341. package/src/runtime/routes/__tests__/stt-routes.test.ts +112 -0
  342. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  343. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  344. package/src/runtime/routes/acp-routes.test.ts +185 -32
  345. package/src/runtime/routes/acp-routes.ts +328 -30
  346. package/src/runtime/routes/app-management-routes.ts +3 -0
  347. package/src/runtime/routes/approval-routes.ts +1 -1
  348. package/src/runtime/routes/browser-routes.ts +1 -1
  349. package/src/runtime/routes/browser-tabs-routes.ts +6 -10
  350. package/src/runtime/routes/channel-verification-routes.ts +14 -5
  351. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  352. package/src/runtime/routes/conversation-list-routes.ts +1 -1
  353. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  354. package/src/runtime/routes/conversation-routes.ts +30 -2
  355. package/src/runtime/routes/conversation-starter-routes.ts +13 -7
  356. package/src/runtime/routes/conversations-import-routes.ts +24 -7
  357. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  358. package/src/runtime/routes/host-cu-routes.ts +1 -1
  359. package/src/runtime/routes/identity-routes.ts +18 -3
  360. package/src/runtime/routes/inbound-message-handler.ts +1 -1
  361. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +33 -34
  362. package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
  363. package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
  364. package/src/runtime/routes/memory-v3-routes.ts +65 -305
  365. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +1 -1
  366. package/src/runtime/routes/playground/helpers.ts +1 -1
  367. package/src/runtime/routes/plugins-routes.ts +337 -35
  368. package/src/runtime/routes/stt-routes.ts +45 -12
  369. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  370. package/src/runtime/routes/work-items-routes.ts +2 -4
  371. package/src/runtime/routes/workspace-routes.ts +50 -15
  372. package/src/runtime/services/conversation-serializer.ts +1 -1
  373. package/src/runtime/verification-outbound-actions.ts +147 -2
  374. package/src/runtime/verification-templates.ts +29 -3
  375. package/src/services/published-app-updater.ts +30 -8
  376. package/src/signals/cancel.ts +2 -4
  377. package/src/subagent/manager.ts +21 -5
  378. package/src/telemetry/__tests__/activation-funnel.test.ts +95 -0
  379. package/src/telemetry/activation-funnel.ts +167 -0
  380. package/src/telemetry/types.ts +13 -0
  381. package/src/telemetry/usage-telemetry-reporter.test.ts +154 -0
  382. package/src/telemetry/usage-telemetry-reporter.ts +26 -1
  383. package/src/tools/acp/context.ts +20 -0
  384. package/src/tools/acp/list-agents.test.ts +9 -19
  385. package/src/tools/acp/list-agents.ts +3 -15
  386. package/src/tools/acp/spawn.test.ts +173 -202
  387. package/src/tools/acp/spawn.ts +37 -172
  388. package/src/tools/acp/steer.test.ts +105 -8
  389. package/src/tools/acp/steer.ts +48 -17
  390. package/src/tools/apps/executors.ts +166 -50
  391. package/src/tools/browser/browser-execution.ts +12 -2
  392. package/src/tools/filesystem/write.ts +34 -0
  393. package/src/tools/network/web-fetch.ts +65 -24
  394. package/src/tools/skills/load.ts +1 -1
  395. package/src/tools/subagent/spawn.ts +2 -4
  396. package/src/tools/ui-surface/definitions.ts +32 -5
  397. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  398. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
  399. package/docs/plugins.md +0 -832
  400. package/examples/plugins/echo/register.ts +0 -143
  401. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  402. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  403. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
  404. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
  405. package/src/__tests__/pipeline-runner.test.ts +0 -554
  406. package/src/daemon/wake-target-adapter.ts +0 -253
  407. package/src/memory/v3/__tests__/assign.test.ts +0 -242
  408. package/src/memory/v3/__tests__/capabilities.test.ts +0 -118
  409. package/src/memory/v3/__tests__/core.test.ts +0 -39
  410. package/src/memory/v3/__tests__/health.test.ts +0 -219
  411. package/src/memory/v3/__tests__/maintain-job.test.ts +0 -288
  412. package/src/memory/v3/__tests__/needle.test.ts +0 -107
  413. package/src/memory/v3/__tests__/orchestrate.test.ts +0 -436
  414. package/src/memory/v3/__tests__/provider-blocks.test.ts +0 -13
  415. package/src/memory/v3/__tests__/reconcile.test.ts +0 -274
  416. package/src/memory/v3/__tests__/render-injection.test.ts +0 -61
  417. package/src/memory/v3/__tests__/router.test.ts +0 -332
  418. package/src/memory/v3/__tests__/selector.test.ts +0 -470
  419. package/src/memory/v3/__tests__/shadow-plugin.test.ts +0 -432
  420. package/src/memory/v3/__tests__/snapshot.test.ts +0 -168
  421. package/src/memory/v3/__tests__/tree.test.ts +0 -192
  422. package/src/memory/v3/assign.ts +0 -268
  423. package/src/memory/v3/capabilities.ts +0 -124
  424. package/src/memory/v3/core.ts +0 -26
  425. package/src/memory/v3/health.ts +0 -0
  426. package/src/memory/v3/maintain-job.ts +0 -314
  427. package/src/memory/v3/needle.ts +0 -115
  428. package/src/memory/v3/orchestrate.ts +0 -126
  429. package/src/memory/v3/page-content.ts +0 -34
  430. package/src/memory/v3/provider-blocks.ts +0 -26
  431. package/src/memory/v3/reconcile.ts +0 -523
  432. package/src/memory/v3/router.ts +0 -190
  433. package/src/memory/v3/selection-log-store.ts +0 -84
  434. package/src/memory/v3/selector.ts +0 -226
  435. package/src/memory/v3/shadow-plugin.ts +0 -411
  436. package/src/memory/v3/snapshot.ts +0 -209
  437. package/src/memory/v3/tree.ts +0 -174
  438. package/src/memory/v3/types.ts +0 -59
  439. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +0 -187
  440. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
  441. package/src/plugins/defaults/circuit-breaker/package.json +0 -15
  442. package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
  443. package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
  444. package/src/plugins/defaults/compaction/register.ts +0 -35
  445. package/src/plugins/defaults/compaction/terminal.ts +0 -73
  446. package/src/plugins/defaults/empty-response/register.ts +0 -23
  447. package/src/plugins/defaults/history-repair/register.ts +0 -24
  448. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +0 -216
  449. package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
  450. package/src/plugins/defaults/overflow-reduce/package.json +0 -15
  451. package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
  452. package/src/plugins/defaults/title-generate/register.ts +0 -35
  453. package/src/plugins/defaults/tool-error/register.ts +0 -23
  454. package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
  455. package/src/proactive-artifact/aux-message-injector.ts +0 -97
  456. package/src/proactive-artifact/decision.test.ts +0 -226
  457. package/src/proactive-artifact/decision.ts +0 -165
  458. package/src/proactive-artifact/index.ts +0 -7
  459. package/src/proactive-artifact/job.test.ts +0 -962
  460. package/src/proactive-artifact/job.ts +0 -372
  461. package/src/proactive-artifact/message-copy.ts +0 -58
  462. package/src/proactive-artifact/trigger-state.test.ts +0 -286
  463. package/src/proactive-artifact/trigger-state.ts +0 -123
  464. package/src/util/map-limit.ts +0 -27
  465. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
  466. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
  467. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
  468. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
  469. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
  470. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
  471. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
  472. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
  473. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
  474. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
  475. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
@@ -13,17 +13,22 @@
13
13
  * Sites not exercised here (`aborted_via_error`) require deeper provider
14
14
  * fakery and are best covered by integration tests.
15
15
  */
16
- import { describe, expect, spyOn, test } from "bun:test";
16
+ import { afterEach, describe, expect, mock, test } from "bun:test";
17
17
 
18
18
  import type {
19
19
  AgentEvent,
20
20
  CheckpointDecision,
21
21
  CheckpointInfo,
22
- MidLoopCompaction,
23
22
  } from "../agent/loop.js";
24
23
  import { AgentLoop, isMaxTokensStopReason } from "../agent/loop.js";
25
- import type { TurnContext } from "../plugins/types.js";
26
- import { PluginTimeoutError } from "../plugins/types.js";
24
+ import type { ContextWindowConfig } from "../config/types.js";
25
+ import type { TrustContext } from "../daemon/trust-context.js";
26
+ import {
27
+ createContextWindowManager,
28
+ disposeContextWindowManager,
29
+ getContextWindowManager,
30
+ } from "../plugins/defaults/compaction/manager-store.js";
31
+ import type { PostCompactContext } from "../plugins/defaults/memory-retrieval/hooks/post-compact.js";
27
32
  import type {
28
33
  Message,
29
34
  Provider,
@@ -32,6 +37,23 @@ import type {
32
37
  ToolDefinition,
33
38
  } from "../providers/types.js";
34
39
 
40
+ // The agent loop invokes the default post-compaction re-injection hook directly
41
+ // when it compacts in place. Stub it so these unit tests can drive the
42
+ // re-injection result without the daemon-level injector chain. Tests assign
43
+ // `postCompactImpl` to observe the call or force a failure; when unset
44
+ // the hook is a no-op that returns the history it was handed.
45
+ let postCompactImpl:
46
+ | ((input: PostCompactContext) => Promise<Message[]>)
47
+ | null = null;
48
+ mock.module(
49
+ "../plugins/defaults/memory-retrieval/hooks/post-compact.js",
50
+ () => ({
51
+ default: async (input: PostCompactContext) => ({
52
+ messages: postCompactImpl ? await postCompactImpl(input) : input.history,
53
+ }),
54
+ }),
55
+ );
56
+
35
57
  // ---------------------------------------------------------------------------
36
58
  // Helpers (mirrored from agent-loop.test.ts so this file is self-contained)
37
59
  // ---------------------------------------------------------------------------
@@ -101,38 +123,26 @@ const userMessage: Message = {
101
123
  content: [{ type: "text", text: "Hello" }],
102
124
  };
103
125
 
104
- // A turn context whose `contextWindowManager.maybeCompact` returns a canned
105
- // result, so the loop's native compaction pipeline runs without the real
106
- // orchestrator machinery.
107
- function fakeCompactionTurnContext(result: {
108
- compacted: boolean;
109
- exhausted: boolean;
110
- }): TurnContext {
111
- return {
112
- requestId: "req-compact",
113
- conversationId: "conv-compact",
114
- turnIndex: 0,
115
- trust: { sourceChannel: "vellum", trustClass: "unknown" },
116
- contextWindowManager: {
117
- maybeCompact: async () => result,
118
- },
119
- } as unknown as TurnContext;
120
- }
121
-
122
- // A turn context whose compaction call times out, exercising the loop's
123
- // PluginTimeoutError handling.
124
- function timeoutCompactionTurnContext(): TurnContext {
125
- return {
126
- requestId: "req-compact",
127
- conversationId: "conv-compact",
128
- turnIndex: 0,
129
- trust: { sourceChannel: "vellum", trustClass: "unknown" },
130
- contextWindowManager: {
131
- maybeCompact: async () => {
132
- throw new PluginTimeoutError("compaction", "default-compaction", 1);
133
- },
134
- },
135
- } as unknown as TurnContext;
126
+ // Register a context-window manager whose `maybeCompact` returns a canned
127
+ // result in the compaction store the loop resolves from, so the loop's
128
+ // compaction call runs without the real orchestrator machinery. Returns the
129
+ // trust snapshot the loop also needs as a run option.
130
+ function fakeCompaction(
131
+ conversationId: string,
132
+ result: { compacted: boolean; exhausted: boolean },
133
+ ): { trust: TrustContext } {
134
+ createContextWindowManager({
135
+ provider: { name: "mock-provider" } as unknown as Provider,
136
+ systemPrompt: "system",
137
+ config: {} as unknown as ContextWindowConfig,
138
+ conversationId,
139
+ });
140
+ const manager = getContextWindowManager(conversationId);
141
+ if (manager) {
142
+ manager.maybeCompact = (async () =>
143
+ result) as unknown as typeof manager.maybeCompact;
144
+ }
145
+ return { trust: { sourceChannel: "vellum", trustClass: "unknown" } };
136
146
  }
137
147
 
138
148
  function lastExitEvent(
@@ -153,6 +163,10 @@ function countExitEvents(events: AgentEvent[]): number {
153
163
  // ---------------------------------------------------------------------------
154
164
 
155
165
  describe("AgentLoop exit-reason instrumentation", () => {
166
+ afterEach(() => {
167
+ disposeContextWindowManager("test-conversation");
168
+ });
169
+
156
170
  test("recognizes provider output-token stop reasons", () => {
157
171
  expect(isMaxTokensStopReason("max_tokens")).toBe(true);
158
172
  expect(isMaxTokensStopReason("MAX_TOKENS")).toBe(true);
@@ -164,11 +178,19 @@ describe("AgentLoop exit-reason instrumentation", () => {
164
178
 
165
179
  test("emits exit event exactly once with 'no_tool_calls' on plain text response", async () => {
166
180
  const { provider } = createMockProvider([textResponse("Hi there!")]);
167
- const loop = new AgentLoop(provider, "system prompt");
181
+ const loop = new AgentLoop({
182
+ provider: provider,
183
+ systemPrompt: "system prompt",
184
+ conversationId: "test-conversation",
185
+ });
168
186
 
169
187
  const events: AgentEvent[] = [];
170
- await loop.run([userMessage], (e) => {
171
- events.push(e);
188
+ await loop.run({
189
+ messages: [userMessage],
190
+ onEvent: (e) => {
191
+ events.push(e);
192
+ },
193
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
172
194
  });
173
195
 
174
196
  expect(countExitEvents(events)).toBe(1);
@@ -178,11 +200,19 @@ describe("AgentLoop exit-reason instrumentation", () => {
178
200
 
179
201
  test("agent_loop_exit is the last event emitted", async () => {
180
202
  const { provider } = createMockProvider([textResponse("Hi there!")]);
181
- const loop = new AgentLoop(provider, "system prompt");
203
+ const loop = new AgentLoop({
204
+ provider: provider,
205
+ systemPrompt: "system prompt",
206
+ conversationId: "test-conversation",
207
+ });
182
208
 
183
209
  const events: AgentEvent[] = [];
184
- await loop.run([userMessage], (e) => {
185
- events.push(e);
210
+ await loop.run({
211
+ messages: [userMessage],
212
+ onEvent: (e) => {
213
+ events.push(e);
214
+ },
215
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
186
216
  });
187
217
 
188
218
  expect(events.length).toBeGreaterThan(0);
@@ -193,11 +223,19 @@ describe("AgentLoop exit-reason instrumentation", () => {
193
223
  const { provider } = createMockProvider([
194
224
  maxTokensResponse("Partial answer"),
195
225
  ]);
196
- const loop = new AgentLoop(provider, "system prompt");
226
+ const loop = new AgentLoop({
227
+ provider: provider,
228
+ systemPrompt: "system prompt",
229
+ conversationId: "test-conversation",
230
+ });
197
231
 
198
232
  const events: AgentEvent[] = [];
199
- await loop.run([userMessage], (e) => {
200
- events.push(e);
233
+ await loop.run({
234
+ messages: [userMessage],
235
+ onEvent: (e) => {
236
+ events.push(e);
237
+ },
238
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
201
239
  });
202
240
 
203
241
  expect(events.map((e) => e.type)).toEqual([
@@ -228,13 +266,20 @@ describe("AgentLoop exit-reason instrumentation", () => {
228
266
  stopReason: "max_tokens",
229
267
  },
230
268
  ]);
231
- const loop = new AgentLoop(provider, "system prompt", {
269
+ const loop = new AgentLoop({
270
+ provider: provider,
271
+ systemPrompt: "system prompt",
272
+ conversationId: "test-conversation",
232
273
  tools: dummyTools,
233
274
  });
234
275
 
235
276
  const events: AgentEvent[] = [];
236
- const { history: result } = await loop.run([userMessage], (e) => {
237
- events.push(e);
277
+ const { history: result } = await loop.run({
278
+ messages: [userMessage],
279
+ onEvent: (e) => {
280
+ events.push(e);
281
+ },
282
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
238
283
  });
239
284
 
240
285
  expect(events.some((e) => e.type === "tool_use")).toBe(false);
@@ -246,19 +291,24 @@ describe("AgentLoop exit-reason instrumentation", () => {
246
291
 
247
292
  test("emits 'aborted_pre_call' when signal is already aborted at run start", async () => {
248
293
  const { provider } = createMockProvider([textResponse("never sent")]);
249
- const loop = new AgentLoop(provider, "system prompt");
294
+ const loop = new AgentLoop({
295
+ provider: provider,
296
+ systemPrompt: "system prompt",
297
+ conversationId: "test-conversation",
298
+ });
250
299
 
251
300
  const controller = new AbortController();
252
301
  controller.abort();
253
302
 
254
303
  const events: AgentEvent[] = [];
255
- await loop.run(
256
- [userMessage],
257
- (e) => {
304
+ await loop.run({
305
+ messages: [userMessage],
306
+ onEvent: (e) => {
258
307
  events.push(e);
259
308
  },
260
- { signal: controller.signal },
261
- );
309
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
310
+ signal: controller.signal,
311
+ });
262
312
 
263
313
  expect(countExitEvents(events)).toBe(1);
264
314
  expect(lastExitEvent(events)?.reason).toBe("aborted_pre_call");
@@ -273,14 +323,21 @@ describe("AgentLoop exit-reason instrumentation", () => {
273
323
  isError: false,
274
324
  yieldToUser: true,
275
325
  });
276
- const loop = new AgentLoop(provider, "system", {
326
+ const loop = new AgentLoop({
327
+ provider: provider,
328
+ systemPrompt: "system",
329
+ conversationId: "test-conversation",
277
330
  tools: dummyTools,
278
331
  toolExecutor: toolExecutor,
279
332
  });
280
333
 
281
334
  const events: AgentEvent[] = [];
282
- await loop.run([userMessage], (e) => {
283
- events.push(e);
335
+ await loop.run({
336
+ messages: [userMessage],
337
+ onEvent: (e) => {
338
+ events.push(e);
339
+ },
340
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
284
341
  });
285
342
 
286
343
  expect(countExitEvents(events)).toBe(1);
@@ -293,7 +350,10 @@ describe("AgentLoop exit-reason instrumentation", () => {
293
350
  textResponse("never reached"),
294
351
  ]);
295
352
  const toolExecutor = async () => ({ content: "ok", isError: false });
296
- const loop = new AgentLoop(provider, "system", {
353
+ const loop = new AgentLoop({
354
+ provider: provider,
355
+ systemPrompt: "system",
356
+ conversationId: "test-conversation",
297
357
  tools: dummyTools,
298
358
  toolExecutor: toolExecutor,
299
359
  });
@@ -302,13 +362,14 @@ describe("AgentLoop exit-reason instrumentation", () => {
302
362
  "budget";
303
363
 
304
364
  const events: AgentEvent[] = [];
305
- await loop.run(
306
- [userMessage],
307
- (e) => {
365
+ await loop.run({
366
+ messages: [userMessage],
367
+ onEvent: (e) => {
308
368
  events.push(e);
309
369
  },
310
- { onCheckpoint },
311
- );
370
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
371
+ onCheckpoint,
372
+ });
312
373
 
313
374
  expect(countExitEvents(events)).toBe(0);
314
375
  });
@@ -321,7 +382,10 @@ describe("AgentLoop exit-reason instrumentation", () => {
321
382
  textResponse("never reached"),
322
383
  ]);
323
384
  const toolExecutor = async () => ({ content: "ok", isError: false });
324
- const loop = new AgentLoop(provider, "system", {
385
+ const loop = new AgentLoop({
386
+ provider: provider,
387
+ systemPrompt: "system",
388
+ conversationId: "test-conversation",
325
389
  tools: dummyTools,
326
390
  toolExecutor: toolExecutor,
327
391
  });
@@ -329,7 +393,10 @@ describe("AgentLoop exit-reason instrumentation", () => {
329
393
  // AND an effective context window so small that any real token estimate
330
394
  // of the running history exceeds the mid-loop threshold.
331
395
  // WHEN the loop checkpoints after the tool results land
332
- const result = await loop.run([userMessage], () => {}, {
396
+ const result = await loop.run({
397
+ messages: [userMessage],
398
+ onEvent: () => {},
399
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
333
400
  resolveContextWindow: () => ({
334
401
  maxInputTokens: 10,
335
402
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -348,13 +415,19 @@ describe("AgentLoop exit-reason instrumentation", () => {
348
415
  textResponse("done"),
349
416
  ]);
350
417
  const toolExecutor = async () => ({ content: "ok", isError: false });
351
- const loop = new AgentLoop(provider, "system", {
418
+ const loop = new AgentLoop({
419
+ provider: provider,
420
+ systemPrompt: "system",
421
+ conversationId: "test-conversation",
352
422
  tools: dummyTools,
353
423
  toolExecutor: toolExecutor,
354
424
  });
355
425
 
356
426
  // WHEN the loop runs to completion
357
- const result = await loop.run([userMessage], () => {}, {
427
+ const result = await loop.run({
428
+ messages: [userMessage],
429
+ onEvent: () => {},
430
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
358
431
  resolveContextWindow: () => ({
359
432
  maxInputTokens: 10,
360
433
  overflowRecovery: { enabled: false, safetyMarginRatio: 0 },
@@ -373,38 +446,37 @@ describe("AgentLoop exit-reason instrumentation", () => {
373
446
  textResponse("done after compaction"),
374
447
  ]);
375
448
  const toolExecutor = async () => ({ content: "ok", isError: false });
376
- const loop = new AgentLoop(provider, "system", {
449
+ const loop = new AgentLoop({
450
+ provider: provider,
451
+ systemPrompt: "system",
452
+ conversationId: "test-conversation",
377
453
  tools: dummyTools,
378
454
  toolExecutor: toolExecutor,
379
455
  });
380
456
 
381
457
  let reinjected = false;
382
458
  const events: AgentEvent[] = [];
383
- const compaction: MidLoopCompaction = {
384
- postCompactionHook: async () => {
385
- reinjected = true;
386
- return [userMessage];
387
- },
459
+ postCompactImpl = async () => {
460
+ reinjected = true;
461
+ return [userMessage];
388
462
  };
389
463
 
390
464
  // WHEN the in-loop budget gate trips at the checkpoint
391
- const result = await loop.run(
392
- [userMessage],
393
- (event) => {
465
+ const result = await loop.run({
466
+ messages: [userMessage],
467
+ onEvent: (event) => {
394
468
  events.push(event);
395
469
  },
396
- {
397
- resolveContextWindow: () => ({
398
- maxInputTokens: 10,
399
- overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
400
- }),
401
- compaction,
402
- turnContext: fakeCompactionTurnContext({
403
- compacted: true,
404
- exhausted: false,
405
- }),
406
- },
407
- );
470
+ resolveContextWindow: () => ({
471
+ maxInputTokens: 10,
472
+ overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
473
+ }),
474
+ compactInPlace: true,
475
+ ...fakeCompaction("test-conversation", {
476
+ compacted: true,
477
+ exhausted: false,
478
+ }),
479
+ });
408
480
 
409
481
  // THEN the loop runs the compaction ceremony in place and continues to a
410
482
  // clean exit instead of yielding for budget. The durable commit is
@@ -416,67 +488,36 @@ describe("AgentLoop exit-reason instrumentation", () => {
416
488
  expect(result.exitReason).not.toBe("budget");
417
489
  });
418
490
 
419
- test("yields 'budget' when inline compaction times out", async () => {
420
- const { provider } = createMockProvider([
421
- toolUseResponse("t1", "read_file", { path: "/a.txt" }),
422
- textResponse("never reached"),
423
- ]);
424
- const toolExecutor = async () => ({ content: "ok", isError: false });
425
- const loop = new AgentLoop(provider, "system", {
426
- tools: dummyTools,
427
- toolExecutor: toolExecutor,
428
- });
429
-
430
- const compaction: MidLoopCompaction = {
431
- postCompactionHook: async () => {
432
- throw new Error("postCompactionHook must not run after a timeout");
433
- },
434
- };
435
- const recordOutcomeSpy = spyOn(loop.compactionCircuit, "recordOutcome");
436
-
437
- // WHEN the compaction pipeline throws a PluginTimeoutError
438
- const result = await loop.run([userMessage], () => {}, {
439
- resolveContextWindow: () => ({
440
- maxInputTokens: 10,
441
- overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
442
- }),
443
- compaction,
444
- turnContext: timeoutCompactionTurnContext(),
445
- });
446
-
447
- // THEN the loop records the timeout as a compaction failure against its
448
- // own circuit breaker, and yields for budget so the orchestrator can
449
- // escalate.
450
- expect(recordOutcomeSpy).toHaveBeenCalledTimes(1);
451
- expect(recordOutcomeSpy.mock.calls[0]?.[1]).toBe(true);
452
- expect(result.exitReason).toBe("budget");
453
- });
454
-
455
491
  test("yields 'budget' when inline compaction reports exhausted", async () => {
456
492
  const { provider } = createMockProvider([
457
493
  toolUseResponse("t1", "read_file", { path: "/a.txt" }),
458
494
  textResponse("never reached"),
459
495
  ]);
460
496
  const toolExecutor = async () => ({ content: "ok", isError: false });
461
- const loop = new AgentLoop(provider, "system", {
497
+ const loop = new AgentLoop({
498
+ provider: provider,
499
+ systemPrompt: "system",
500
+ conversationId: "test-conversation",
462
501
  tools: dummyTools,
463
502
  toolExecutor: toolExecutor,
464
503
  });
465
504
 
466
- const compaction: MidLoopCompaction = {
467
- postCompactionHook: async () => {
468
- throw new Error("postCompactionHook must not run when exhausted");
469
- },
505
+ postCompactImpl = async () => {
506
+ throw new Error(
507
+ "post-compaction re-injection must not run when exhausted",
508
+ );
470
509
  };
471
510
 
472
511
  // WHEN compaction exhausts its retry budget
473
- const result = await loop.run([userMessage], () => {}, {
512
+ const result = await loop.run({
513
+ messages: [userMessage],
514
+ onEvent: () => {},
474
515
  resolveContextWindow: () => ({
475
516
  maxInputTokens: 10,
476
517
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
477
518
  }),
478
- compaction,
479
- turnContext: fakeCompactionTurnContext({
519
+ compactInPlace: true,
520
+ ...fakeCompaction("test-conversation", {
480
521
  compacted: false,
481
522
  exhausted: true,
482
523
  }),
@@ -493,11 +534,19 @@ describe("AgentLoop exit-reason instrumentation", () => {
493
534
  throw new Error("provider exploded");
494
535
  },
495
536
  };
496
- const loop = new AgentLoop(provider, "system prompt");
537
+ const loop = new AgentLoop({
538
+ provider: provider,
539
+ systemPrompt: "system prompt",
540
+ conversationId: "test-conversation",
541
+ });
497
542
 
498
543
  const events: AgentEvent[] = [];
499
- await loop.run([userMessage], (e) => {
500
- events.push(e);
544
+ await loop.run({
545
+ messages: [userMessage],
546
+ onEvent: (e) => {
547
+ events.push(e);
548
+ },
549
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
501
550
  });
502
551
 
503
552
  expect(countExitEvents(events)).toBe(1);
@@ -516,14 +565,21 @@ describe("AgentLoop exit-reason instrumentation", () => {
516
565
  isError: false,
517
566
  yieldToUser: true,
518
567
  });
519
- const loop = new AgentLoop(provider, "system", {
568
+ const loop = new AgentLoop({
569
+ provider: provider,
570
+ systemPrompt: "system",
571
+ conversationId: "test-conversation",
520
572
  tools: dummyTools,
521
573
  toolExecutor: toolExecutor,
522
574
  });
523
575
 
524
576
  const events: AgentEvent[] = [];
525
- await loop.run([userMessage], (e) => {
526
- events.push(e);
577
+ await loop.run({
578
+ messages: [userMessage],
579
+ onEvent: (e) => {
580
+ events.push(e);
581
+ },
582
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
527
583
  });
528
584
 
529
585
  expect(countExitEvents(events)).toBe(1);
@@ -540,19 +596,23 @@ describe("AgentLoop exit-reason instrumentation", () => {
540
596
  controller.abort();
541
597
  return { content: "ok", isError: false };
542
598
  };
543
- const loop = new AgentLoop(provider, "system", {
599
+ const loop = new AgentLoop({
600
+ provider: provider,
601
+ systemPrompt: "system",
602
+ conversationId: "test-conversation",
544
603
  tools: dummyTools,
545
604
  toolExecutor: toolExecutor,
546
605
  });
547
606
 
548
607
  const events: AgentEvent[] = [];
549
- await loop.run(
550
- [userMessage],
551
- (e) => {
608
+ await loop.run({
609
+ messages: [userMessage],
610
+ onEvent: (e) => {
552
611
  events.push(e);
553
612
  },
554
- { signal: controller.signal },
555
- );
613
+ trust: { sourceChannel: "vellum", trustClass: "unknown" },
614
+ signal: controller.signal,
615
+ });
556
616
 
557
617
  expect(countExitEvents(events)).toBe(1);
558
618
  expect(lastExitEvent(events)?.reason).toBe("aborted_during_tools");