@vellumai/assistant 0.8.8 → 0.8.9-staging.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/bun.lock +2 -2
  2. package/examples/plugins/echo/README.md +61 -60
  3. package/examples/plugins/echo/hooks/post-tool-use.ts +18 -0
  4. package/examples/plugins/echo/hooks/stop.ts +16 -0
  5. package/examples/plugins/echo/hooks/user-prompt-submit.ts +18 -0
  6. package/examples/plugins/echo/package.json +1 -2
  7. package/examples/plugins/echo/src/emit.ts +19 -0
  8. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +7 -6
  9. package/openapi.yaml +236 -6
  10. package/package.json +2 -2
  11. package/src/__tests__/agent-loop-callsite-precedence.test.ts +69 -14
  12. package/src/__tests__/agent-loop-exit-reason.test.ts +185 -140
  13. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +50 -35
  14. package/src/__tests__/agent-loop-output-hooks.test.ts +357 -0
  15. package/src/__tests__/agent-loop-override-profile.test.ts +25 -6
  16. package/src/__tests__/agent-loop-provider-error-recording.test.ts +41 -21
  17. package/src/__tests__/agent-loop-thinking.test.ts +36 -20
  18. package/src/__tests__/agent-loop.test.ts +441 -96
  19. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +14 -14
  20. package/src/__tests__/agent-wake-override-profile.test.ts +17 -21
  21. package/src/__tests__/anthropic-provider.test.ts +1 -1
  22. package/src/__tests__/app-control-flow.test.ts +1 -1
  23. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  24. package/src/__tests__/approval-cascade.test.ts +5 -4
  25. package/src/__tests__/approval-routes-http.test.ts +4 -1
  26. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -1
  27. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  28. package/src/__tests__/channel-approvals.test.ts +1 -1
  29. package/src/__tests__/compaction-circuit.test.ts +258 -0
  30. package/src/__tests__/compaction-direct.test.ts +132 -0
  31. package/src/__tests__/compaction-events.test.ts +5 -5
  32. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -4
  33. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +7 -10
  34. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +59 -103
  35. package/src/__tests__/conversation-agent-loop-overflow.test.ts +94 -189
  36. package/src/__tests__/conversation-agent-loop.test.ts +249 -490
  37. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  38. package/src/__tests__/conversation-confirmation-signals.test.ts +5 -4
  39. package/src/__tests__/conversation-crud-inference-profile.test.ts +7 -9
  40. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -4
  41. package/src/__tests__/conversation-process-callsite.test.ts +14 -14
  42. package/src/__tests__/conversation-provider-retry-repair.test.ts +18 -16
  43. package/src/__tests__/conversation-queue.test.ts +9 -9
  44. package/src/__tests__/conversation-runtime-assembly.test.ts +923 -231
  45. package/src/__tests__/conversation-runtime-workspace.test.ts +115 -20
  46. package/src/__tests__/conversation-slash-queue.test.ts +6 -4
  47. package/src/__tests__/conversation-slash-unknown.test.ts +6 -4
  48. package/src/__tests__/conversation-speed-override.test.ts +10 -9
  49. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  50. package/src/__tests__/conversation-workspace-cache-state.test.ts +23 -20
  51. package/src/__tests__/conversation-workspace-injection.test.ts +68 -6
  52. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +14 -11
  53. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  54. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  55. package/src/__tests__/db-acp-history.test.ts +101 -0
  56. package/src/__tests__/dynamic-page-surface.test.ts +31 -0
  57. package/src/__tests__/empty-response-hook.test.ts +1 -1
  58. package/src/__tests__/file-write-tool.test.ts +63 -0
  59. package/src/__tests__/gateway-only-guard.test.ts +12 -2
  60. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  61. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  62. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  63. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  64. package/src/__tests__/heartbeat-service.test.ts +1 -0
  65. package/src/__tests__/history-repair-hook.test.ts +1 -1
  66. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  67. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  68. package/src/__tests__/inference-profile-reaper.test.ts +62 -0
  69. package/src/__tests__/inference-profile-session-handler.test.ts +86 -0
  70. package/src/__tests__/injector-background-turn.test.ts +13 -23
  71. package/src/__tests__/injector-chain.test.ts +268 -44
  72. package/src/__tests__/injector-disk-pressure.test.ts +210 -52
  73. package/src/__tests__/injector-document-comments.test.ts +97 -114
  74. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  75. package/src/__tests__/injector-v3-suppression.test.ts +4 -4
  76. package/src/__tests__/list-messages-client-message-id.test.ts +91 -0
  77. package/src/__tests__/list-messages-hidden-metadata.test.ts +38 -0
  78. package/src/__tests__/memory-retrieval-hook.test.ts +73 -6
  79. package/src/__tests__/memory-v2-static-injector.test.ts +86 -8
  80. package/src/__tests__/parallel-tool.benchmark.test.ts +35 -8
  81. package/src/__tests__/plugin-api-shim.test.ts +6 -9
  82. package/src/__tests__/plugin-bootstrap.test.ts +12 -23
  83. package/src/__tests__/plugin-registry.test.ts +3 -49
  84. package/src/__tests__/plugin-types.test.ts +0 -70
  85. package/src/__tests__/reaction-persistence.test.ts +1 -1
  86. package/src/__tests__/send-endpoint-busy.test.ts +4 -1
  87. package/src/__tests__/skill-feature-flags-integration.test.ts +33 -0
  88. package/src/__tests__/steer-tool-repair.test.ts +1 -1
  89. package/src/__tests__/subagent-call-site-routing.test.ts +1 -1
  90. package/src/__tests__/subagent-detail.test.ts +25 -7
  91. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  92. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  93. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  94. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  95. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  96. package/src/__tests__/title-generate-hook.test.ts +1 -1
  97. package/src/__tests__/tool-error-hook.test.ts +1 -1
  98. package/src/__tests__/tool-result-truncate-hook.test.ts +1 -1
  99. package/src/__tests__/user-plugin-loader.test.ts +54 -286
  100. package/src/acp/__tests__/agent-process.test.ts +161 -0
  101. package/src/acp/__tests__/client-handler.test.ts +40 -0
  102. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  103. package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
  104. package/src/acp/__tests__/prepare-agent-env.test.ts +137 -0
  105. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  106. package/src/acp/__tests__/session-manager-resume.test.ts +736 -0
  107. package/src/acp/agent-process.ts +61 -1
  108. package/src/acp/auto-install.test.ts +196 -0
  109. package/src/acp/auto-install.ts +177 -0
  110. package/src/acp/client-handler.ts +31 -0
  111. package/src/acp/feature-gate.test.ts +48 -0
  112. package/src/acp/feature-gate.ts +34 -0
  113. package/src/acp/prepare-agent-env.ts +83 -29
  114. package/src/acp/resolve-agent.test.ts +320 -7
  115. package/src/acp/resolve-agent.ts +182 -18
  116. package/src/acp/resume-hint.ts +25 -0
  117. package/src/acp/session-manager.ts +495 -73
  118. package/src/acp/types.ts +8 -0
  119. package/src/agent/compaction-circuit.ts +60 -102
  120. package/src/agent/loop.ts +390 -240
  121. package/src/api/responses/conversation-message.ts +14 -1
  122. package/src/approvals/guardian-request-resolvers.ts +1 -1
  123. package/src/background-wake/next-wake.ts +1 -0
  124. package/src/cli/commands/db/__tests__/repair.test.ts +3 -1
  125. package/src/cli/commands/plugins.ts +43 -37
  126. package/src/cli/lib/__tests__/install-from-github.test.ts +429 -111
  127. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +196 -0
  128. package/src/cli/lib/__tests__/plugin-details.test.ts +372 -0
  129. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +220 -0
  130. package/src/cli/lib/__tests__/search-plugins.test.ts +226 -32
  131. package/src/cli/lib/install-from-github.ts +464 -55
  132. package/src/cli/lib/plugin-catalog-cache.ts +84 -0
  133. package/src/cli/lib/plugin-details.ts +409 -0
  134. package/src/cli/lib/plugin-marketplace.ts +197 -0
  135. package/src/cli/lib/search-plugins.ts +195 -29
  136. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  137. package/src/config/acp-defaults.test.ts +10 -0
  138. package/src/config/acp-defaults.ts +6 -0
  139. package/src/config/bundled-skills/acp/SKILL.md +83 -31
  140. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  141. package/src/config/bundled-skills/app-builder/SKILL.md +224 -381
  142. package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
  143. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  144. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  145. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  146. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  147. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  148. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  149. package/src/config/bundled-tool-registry.ts +2 -0
  150. package/src/config/feature-flag-registry.json +14 -5
  151. package/src/config/schemas/heartbeat.ts +9 -0
  152. package/src/context/strip-injections.ts +8 -2
  153. package/src/context/window-manager.ts +27 -13
  154. package/src/daemon/conversation-agent-loop-handlers.ts +10 -35
  155. package/src/daemon/conversation-agent-loop.ts +167 -1005
  156. package/src/daemon/conversation-lifecycle.ts +11 -255
  157. package/src/daemon/conversation-process.ts +8 -136
  158. package/src/daemon/conversation-registry.ts +159 -0
  159. package/src/daemon/conversation-runtime-assembly.ts +293 -392
  160. package/src/daemon/conversation-store.ts +9 -90
  161. package/src/daemon/conversation-surfaces.ts +24 -8
  162. package/src/daemon/conversation-workspace.ts +17 -0
  163. package/src/daemon/conversation.ts +383 -56
  164. package/src/daemon/external-plugins-bootstrap.ts +14 -19
  165. package/src/daemon/handlers/conversations.ts +3 -1
  166. package/src/daemon/handlers/skills.ts +4 -1
  167. package/src/daemon/host-proxy-preactivation.ts +1 -3
  168. package/src/daemon/lifecycle.ts +21 -0
  169. package/src/daemon/server.ts +2 -0
  170. package/src/daemon/wake-conversation-ops.ts +269 -0
  171. package/src/embedded/plugin-api.ts +2 -2
  172. package/src/export/__tests__/transcript-formatter.test.ts +5 -0
  173. package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -0
  174. package/src/heartbeat/heartbeat-run-store.ts +23 -1
  175. package/src/heartbeat/heartbeat-service.ts +26 -0
  176. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  177. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  178. package/src/ipc/skill-routes/__tests__/memory.test.ts +15 -0
  179. package/src/ipc/skill-routes/memory.ts +4 -2
  180. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +87 -0
  181. package/src/memory/conversation-crud.ts +29 -19
  182. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  183. package/src/memory/db-init.ts +2 -0
  184. package/src/memory/job-handlers/conversation-starters.ts +13 -2
  185. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -4
  186. package/src/memory/jobs-worker.ts +25 -1
  187. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  188. package/src/memory/migrations/index.ts +1 -0
  189. package/src/memory/schema/acp.ts +4 -0
  190. package/src/memory/v2/__tests__/consolidation-job.test.ts +3 -3
  191. package/src/memory/v2/consolidation-job.ts +13 -4
  192. package/src/plugin-api/constants.ts +4 -0
  193. package/src/plugin-api/index.ts +6 -5
  194. package/src/plugin-api/types.ts +75 -0
  195. package/src/plugins/defaults/compaction/compact.ts +59 -0
  196. package/src/plugins/defaults/compaction/manager-store.ts +44 -0
  197. package/src/plugins/defaults/compaction/package.json +1 -2
  198. package/src/plugins/defaults/empty-response/package.json +0 -1
  199. package/src/plugins/defaults/history-repair/package.json +0 -1
  200. package/src/plugins/defaults/index.ts +135 -26
  201. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +103 -38
  202. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +167 -56
  203. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +2 -2
  204. package/src/plugins/defaults/{injectors/register.ts → memory-retrieval/injectors.ts} +148 -73
  205. package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +223 -0
  206. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/assign.test.ts +4 -4
  207. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/live-integration.test.ts +9 -6
  208. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/maintain-job.test.ts +5 -5
  209. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/orchestrate.test.ts +8 -5
  210. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/reconcile.test.ts +2 -2
  211. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/render-injection.test.ts +1 -1
  212. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/router.test.ts +10 -5
  213. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selection-log-store.test.ts +8 -8
  214. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/selector.test.ts +5 -5
  215. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/shadow-plugin.test.ts +16 -17
  216. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/types.test.ts +2 -2
  217. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/assign.ts +9 -5
  218. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/capabilities.ts +5 -2
  219. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  220. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  221. package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
  222. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/maintain-job.ts +15 -8
  223. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/orchestrate.ts +2 -2
  224. package/src/plugins/defaults/memory-v3-shadow/package.json +14 -0
  225. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/page-content.ts +2 -2
  226. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/provider-blocks.ts +1 -1
  227. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/reconcile.ts +7 -3
  228. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/render-injection.ts +1 -1
  229. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/router.ts +5 -5
  230. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selection-log-store.ts +4 -4
  231. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/selector.ts +7 -7
  232. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/shadow-plugin.ts +32 -94
  233. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/tree.ts +1 -1
  234. package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/types.ts +1 -1
  235. package/src/plugins/defaults/title-generate/package.json +0 -1
  236. package/src/plugins/defaults/tool-error/package.json +0 -1
  237. package/src/plugins/defaults/tool-result-truncate/package.json +0 -1
  238. package/src/plugins/pipeline.ts +6 -293
  239. package/src/plugins/registry.ts +9 -37
  240. package/src/plugins/types.ts +76 -381
  241. package/src/plugins/user-loader.ts +30 -127
  242. package/src/proactive-artifact/aux-message-injector.ts +1 -1
  243. package/src/proactive-artifact/job.test.ts +1 -1
  244. package/src/prompts/__tests__/system-prompt.test.ts +6 -0
  245. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +35 -3
  246. package/src/runtime/__tests__/agent-wake.test.ts +555 -691
  247. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  248. package/src/runtime/agent-wake.ts +108 -209
  249. package/src/runtime/assistant-event-hub.ts +1 -1
  250. package/src/runtime/channel-approvals.ts +1 -1
  251. package/src/runtime/interactive-ui.ts +1 -1
  252. package/src/runtime/routes/__tests__/acp-routes.test.ts +283 -55
  253. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  254. package/src/runtime/routes/__tests__/plugins-routes.test.ts +398 -73
  255. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  256. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  257. package/src/runtime/routes/acp-routes.test.ts +89 -25
  258. package/src/runtime/routes/acp-routes.ts +81 -29
  259. package/src/runtime/routes/approval-routes.ts +1 -1
  260. package/src/runtime/routes/browser-routes.ts +1 -1
  261. package/src/runtime/routes/browser-tabs-routes.ts +6 -10
  262. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  263. package/src/runtime/routes/conversation-list-routes.ts +1 -1
  264. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  265. package/src/runtime/routes/conversation-routes.ts +28 -2
  266. package/src/runtime/routes/conversation-starter-routes.ts +13 -7
  267. package/src/runtime/routes/conversations-import-routes.ts +24 -7
  268. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  269. package/src/runtime/routes/host-cu-routes.ts +1 -1
  270. package/src/runtime/routes/identity-routes.ts +18 -3
  271. package/src/runtime/routes/inbound-message-handler.ts +1 -1
  272. package/src/runtime/routes/inference-profile-session-handler.ts +11 -0
  273. package/src/runtime/routes/inference-profile-session-reaper.ts +6 -0
  274. package/src/runtime/routes/memory-v3-routes.ts +16 -6
  275. package/src/runtime/routes/playground/helpers.ts +1 -1
  276. package/src/runtime/routes/plugins-routes.ts +336 -35
  277. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  278. package/src/runtime/routes/work-items-routes.ts +2 -4
  279. package/src/runtime/services/conversation-serializer.ts +1 -1
  280. package/src/signals/cancel.ts +2 -4
  281. package/src/subagent/manager.ts +21 -5
  282. package/src/tools/acp/context.ts +20 -0
  283. package/src/tools/acp/list-agents.test.ts +7 -1
  284. package/src/tools/acp/spawn.test.ts +158 -55
  285. package/src/tools/acp/spawn.ts +47 -72
  286. package/src/tools/acp/steer.test.ts +105 -8
  287. package/src/tools/acp/steer.ts +48 -17
  288. package/src/tools/apps/executors.ts +13 -8
  289. package/src/tools/filesystem/write.ts +34 -0
  290. package/src/tools/subagent/spawn.ts +2 -4
  291. package/src/tools/ui-surface/definitions.ts +25 -5
  292. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  293. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +69 -45
  294. package/docs/plugins.md +0 -832
  295. package/examples/plugins/echo/register.ts +0 -143
  296. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  297. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  298. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -251
  299. package/src/__tests__/overflow-reduce-pipeline.test.ts +0 -667
  300. package/src/__tests__/pipeline-runner.test.ts +0 -554
  301. package/src/__tests__/plugin-external-api.test.ts +0 -68
  302. package/src/daemon/wake-target-adapter.ts +0 -253
  303. package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +0 -93
  304. package/src/plugins/defaults/circuit-breaker/package.json +0 -15
  305. package/src/plugins/defaults/circuit-breaker/register.ts +0 -39
  306. package/src/plugins/defaults/compaction/middlewares/compaction.ts +0 -25
  307. package/src/plugins/defaults/compaction/register.ts +0 -35
  308. package/src/plugins/defaults/compaction/terminal.ts +0 -73
  309. package/src/plugins/defaults/empty-response/register.ts +0 -23
  310. package/src/plugins/defaults/history-repair/register.ts +0 -24
  311. package/src/plugins/defaults/overflow-reduce/middlewares/overflowReduce.ts +0 -126
  312. package/src/plugins/defaults/overflow-reduce/package.json +0 -15
  313. package/src/plugins/defaults/overflow-reduce/register.ts +0 -42
  314. package/src/plugins/defaults/title-generate/register.ts +0 -35
  315. package/src/plugins/defaults/tool-error/register.ts +0 -23
  316. package/src/plugins/defaults/tool-result-truncate/register.ts +0 -24
  317. package/src/plugins/external-api.ts +0 -104
  318. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/capabilities.test.ts +0 -0
  319. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/core.test.ts +0 -0
  320. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/eval-turns.json +0 -0
  321. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/fixtures/live-turns.json +0 -0
  322. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/health.test.ts +0 -0
  323. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/needle.test.ts +0 -0
  324. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/provider-blocks.test.ts +0 -0
  325. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/snapshot.test.ts +0 -0
  326. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/tree.test.ts +0 -0
  327. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-eviction.test.ts +0 -0
  328. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/__tests__/working-set-skeleton.test.ts +0 -0
  329. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/core.ts +0 -0
  330. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/README.md +0 -0
  331. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/assignments.json +0 -0
  332. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/core.json +0 -0
  333. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-x.md +0 -0
  334. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-a/topic-y.md +0 -0
  335. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/data/leaves/domain-b/topic-z.md +0 -0
  336. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/health.ts +0 -0
  337. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/llm-retry.ts +0 -0
  338. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/needle.ts +0 -0
  339. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/snapshot.ts +0 -0
  340. /package/src/{memory/v3 → plugins/defaults/memory-v3-shadow}/working-set.ts +0 -0
@@ -2,11 +2,11 @@ import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
3
  import { CompactionCircuit } from "../agent/compaction-circuit.js";
4
4
  import type { AgentLoop } from "../agent/loop.js";
5
- import type { AgentLoopConversationContext } from "../daemon/conversation-agent-loop.js";
5
+ import type { Conversation } from "../daemon/conversation.js";
6
6
  import type { DiskPressureStatus } from "../daemon/disk-pressure-guard.js";
7
7
  import type { ServerMessage } from "../daemon/message-protocol.js";
8
8
 
9
- type Context = AgentLoopConversationContext;
9
+ type Context = Conversation;
10
10
 
11
11
  mock.module("../util/logger.js", () => ({
12
12
  getLogger: () =>
@@ -96,7 +96,7 @@ mock.module("../memory/conversation-crud.js", () => ({
96
96
  getMessageById: () => null,
97
97
  getConversationOriginChannel: () => null,
98
98
  getConversationOriginInterface: () => null,
99
- getConversationOverrideProfileFromRow: () => null,
99
+ resolveOverrideProfile: () => null,
100
100
  provenanceFromTrustContext: () => ({}),
101
101
  setConversationHistoryStrippedAt: () => {},
102
102
  updateConversationContextWindow: () => {},
@@ -106,9 +106,7 @@ mock.module("../memory/conversation-crud.js", () => ({
106
106
 
107
107
  import { runAgentLoopImpl } from "../daemon/conversation-agent-loop.js";
108
108
 
109
- function makeCtx(
110
- overrides: Partial<Context> = {},
111
- ): AgentLoopConversationContext {
109
+ function makeCtx(overrides: Partial<Context> = {}): Conversation {
112
110
  let processing = true;
113
111
  return {
114
112
  conversationId: "conv-123",
@@ -137,6 +135,8 @@ function makeCtx(
137
135
  } as unknown as Context["contextWindowManager"],
138
136
  contextCompactedMessageCount: 0,
139
137
  contextCompactedAt: null,
138
+ conversationType: "background",
139
+ source: "memory",
140
140
  memoryPolicy: { scopeId: "default", includeDefaultFallback: true },
141
141
  currentActiveSurfaceId: undefined,
142
142
  currentPage: undefined,
@@ -145,8 +145,6 @@ function makeCtx(
145
145
  surfaceActionRequestIds: new Set<string>(),
146
146
  currentTurnSurfaces: [],
147
147
  workingDir: "/tmp",
148
- workspaceTopLevelContext: null,
149
- workspaceTopLevelDirty: false,
150
148
  channelCapabilities: undefined,
151
149
  commandIntent: undefined,
152
150
  trustContext: undefined,
@@ -172,7 +170,6 @@ function makeCtx(
172
170
  hasNoClient: false,
173
171
  prompter: {} as Context["prompter"],
174
172
  queue: {} as Context["queue"],
175
- refreshWorkspaceTopLevelContextIfNeeded: () => {},
176
173
  markWorkspaceTopLevelDirty: () => {},
177
174
  emitActivityState: () => {},
178
175
  getQueueDepth: () => 0,
@@ -183,7 +180,7 @@ function makeCtx(
183
180
  getTurnChannelContext: () => null,
184
181
  graphMemory: {} as Context["graphMemory"],
185
182
  ...overrides,
186
- } as AgentLoopConversationContext;
183
+ } as unknown as Conversation;
187
184
  }
188
185
 
189
186
  describe("runAgentLoopImpl disk pressure gate", () => {
@@ -15,7 +15,7 @@ import { createRequire } from "node:module";
15
15
  import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
16
16
 
17
17
  import { CompactionCircuit } from "../agent/compaction-circuit.js";
18
- import type { AgentEvent, AgentLoopRunOptions } from "../agent/loop.js";
18
+ import type { AgentLoopRunOptions } from "../agent/loop.js";
19
19
  import type { LLMCallSite } from "../config/schemas/llm.js";
20
20
  import { resetPluginRegistryAndRegisterDefaults } from "../plugins/defaults/index.js";
21
21
  import type { Message, ToolDefinition } from "../providers/types.js";
@@ -150,12 +150,26 @@ mock.module("../memory/conversation-crud.js", () => ({
150
150
  updateMessageMetadata: () => {},
151
151
  getMessages: () => [],
152
152
  getConversation: () => mockConversationRow,
153
- getConversationOverrideProfileFromRow: (
154
- row: { conversationType?: string; inferenceProfile?: string | null } | null,
153
+ resolveOverrideProfile: (
154
+ fields: {
155
+ conversationType?: string | null;
156
+ inferenceProfile?: string | null;
157
+ inferenceProfileExpiresAt?: number | null;
158
+ } | null,
155
159
  ) => {
156
- if (row?.conversationType === "background") return undefined;
157
- const profile = row?.inferenceProfile;
158
- return typeof profile === "string" ? profile : undefined;
160
+ if (
161
+ fields?.conversationType === "background" ||
162
+ fields?.conversationType === "scheduled"
163
+ ) {
164
+ return undefined;
165
+ }
166
+ if (
167
+ fields?.inferenceProfileExpiresAt != null &&
168
+ fields.inferenceProfileExpiresAt <= Date.now()
169
+ ) {
170
+ return undefined;
171
+ }
172
+ return fields?.inferenceProfile ?? undefined;
159
173
  },
160
174
  provenanceFromTrustContext: () => ({
161
175
  source: "user",
@@ -343,10 +357,8 @@ mock.module("../memory/llm-request-log-store.js", () => ({
343
357
 
344
358
  // ── Imports (after mocks) ────────────────────────────────────────────
345
359
 
346
- import {
347
- type AgentLoopConversationContext,
348
- runAgentLoopImpl,
349
- } from "../daemon/conversation-agent-loop.js";
360
+ import type { Conversation } from "../daemon/conversation.js";
361
+ import { runAgentLoopImpl } from "../daemon/conversation-agent-loop.js";
350
362
 
351
363
  // ── Test helpers ─────────────────────────────────────────────────────
352
364
 
@@ -362,22 +374,20 @@ let mutateBeforeResolveOverrideProfile: (() => void) | undefined;
362
374
 
363
375
  function makeCtx(
364
376
  captured: CapturedAgentLoopRun[],
365
- overrides?: Partial<AgentLoopConversationContext>,
366
- ): AgentLoopConversationContext {
377
+ overrides?: Partial<Conversation>,
378
+ ): Conversation {
367
379
  const agentLoopRun = async (
368
- messages: Message[],
369
- _onEvent: (event: AgentEvent) => void,
370
- options?: AgentLoopRunOptions,
380
+ options: AgentLoopRunOptions,
371
381
  ): Promise<Message[]> => {
372
382
  mutateBeforeResolveOverrideProfile?.();
373
383
  captured.push({
374
- callSite: options?.callSite,
375
- overrideProfile: options?.overrideProfile,
376
- resolvedOverrideProfile: options?.resolveOverrideProfile?.(),
377
- resolvedMaxInputTokens: options?.resolveContextWindow?.().maxInputTokens,
384
+ callSite: options.callSite,
385
+ overrideProfile: options.overrideProfile,
386
+ resolvedOverrideProfile: options.resolveOverrideProfile?.(),
387
+ resolvedMaxInputTokens: options.resolveContextWindow?.().maxInputTokens,
378
388
  });
379
389
  return [
380
- ...messages,
390
+ ...options.messages,
381
391
  {
382
392
  role: "assistant" as const,
383
393
  content: [{ type: "text" as const, text: "response" }],
@@ -406,7 +416,7 @@ function makeCtx(
406
416
  getResolvedTools: () => [] as ToolDefinition[],
407
417
  getActiveModel: () => undefined,
408
418
  compactionCircuit: new CompactionCircuit("test-conv"),
409
- } as unknown as AgentLoopConversationContext["agentLoop"],
419
+ } as unknown as Conversation["agentLoop"],
410
420
  provider: {
411
421
  name: "mock-provider",
412
422
  sendMessage: async () => ({
@@ -415,13 +425,14 @@ function makeCtx(
415
425
  usage: { inputTokens: 0, outputTokens: 0 },
416
426
  stopReason: "end_turn",
417
427
  }),
418
- } as unknown as AgentLoopConversationContext["provider"],
428
+ } as unknown as Conversation["provider"],
419
429
  systemPrompt: "system prompt",
420
430
 
421
431
  contextWindowManager: {
432
+ updateConfig: () => {},
422
433
  shouldCompact: () => ({ needed: false, estimatedTokens: 0 }),
423
434
  maybeCompact: async () => ({ compacted: false }),
424
- } as unknown as AgentLoopConversationContext["contextWindowManager"],
435
+ } as unknown as Conversation["contextWindowManager"],
425
436
  contextCompactedMessageCount: 0,
426
437
  contextCompactedAt: null,
427
438
 
@@ -435,8 +446,6 @@ function makeCtx(
435
446
  currentTurnSurfaces: [],
436
447
 
437
448
  workingDir: "/tmp",
438
- workspaceTopLevelContext: null,
439
- workspaceTopLevelDirty: false,
440
449
  channelCapabilities: undefined,
441
450
  commandIntent: undefined,
442
451
  trustContext: undefined,
@@ -446,15 +455,15 @@ function makeCtx(
446
455
  preactivatedSkillIds: undefined,
447
456
  skillProjectionState: new Map(),
448
457
  skillProjectionCache:
449
- new Map() as unknown as AgentLoopConversationContext["skillProjectionCache"],
458
+ new Map() as unknown as Conversation["skillProjectionCache"],
450
459
 
451
460
  traceEmitter: {
452
461
  emit: () => {},
453
- } as unknown as AgentLoopConversationContext["traceEmitter"],
462
+ } as unknown as Conversation["traceEmitter"],
454
463
  profiler: {
455
464
  startRequest: () => {},
456
465
  emitSummary: () => {},
457
- } as unknown as AgentLoopConversationContext["profiler"],
466
+ } as unknown as Conversation["profiler"],
458
467
  usageStats: {
459
468
  totalInputTokens: 0,
460
469
  totalOutputTokens: 0,
@@ -467,13 +476,12 @@ function makeCtx(
467
476
  lastAttachmentWarnings: [],
468
477
 
469
478
  hasNoClient: false,
470
- prompter: {} as unknown as AgentLoopConversationContext["prompter"],
471
- queue: {} as unknown as AgentLoopConversationContext["queue"],
479
+ prompter: {} as unknown as Conversation["prompter"],
480
+ queue: {} as unknown as Conversation["queue"],
472
481
 
473
482
  getWorkspaceGitService: () => ({ ensureInitialized: async () => {} }),
474
483
  commitTurnChanges: async () => {},
475
484
 
476
- refreshWorkspaceTopLevelContextIfNeeded: () => {},
477
485
  markWorkspaceTopLevelDirty: () => {},
478
486
  emitActivityState: () => {},
479
487
  getQueueDepth: () => 0,
@@ -500,10 +508,10 @@ function makeCtx(
500
508
  }),
501
509
  retrackCachedNodes: () => {},
502
510
  recordPkbQueryVectors: () => {},
503
- } as unknown as AgentLoopConversationContext["graphMemory"],
511
+ } as unknown as Conversation["graphMemory"],
504
512
 
505
513
  ...overrides,
506
- } as AgentLoopConversationContext;
514
+ } as unknown as Conversation;
507
515
  }
508
516
 
509
517
  // ── Tests ────────────────────────────────────────────────────────────
@@ -541,20 +549,11 @@ afterAll(() => {
541
549
 
542
550
  describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
543
551
  test("non-background conversation with inferenceProfile threads it through as overrideProfile", async () => {
544
- mockConversationRow = {
545
- id: "conv-1",
552
+ const captured: CapturedAgentLoopRun[] = [];
553
+ const ctx = makeCtx(captured, {
546
554
  conversationType: "standard",
547
555
  inferenceProfile: "quality-optimized",
548
- contextSummary: null,
549
- contextCompactedMessageCount: 0,
550
- totalInputTokens: 0,
551
- totalOutputTokens: 0,
552
- totalEstimatedCost: 0,
553
- title: null,
554
- };
555
-
556
- const captured: CapturedAgentLoopRun[] = [];
557
- const ctx = makeCtx(captured);
556
+ });
558
557
 
559
558
  await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
560
559
 
@@ -564,21 +563,12 @@ describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
564
563
  }
565
564
  });
566
565
 
567
- test("background conversation ignores inferenceProfile column", async () => {
568
- mockConversationRow = {
569
- id: "conv-1",
566
+ test("background conversation ignores inferenceProfile", async () => {
567
+ const captured: CapturedAgentLoopRun[] = [];
568
+ const ctx = makeCtx(captured, {
570
569
  conversationType: "background",
571
570
  inferenceProfile: "quality-optimized",
572
- contextSummary: null,
573
- contextCompactedMessageCount: 0,
574
- totalInputTokens: 0,
575
- totalOutputTokens: 0,
576
- totalEstimatedCost: 0,
577
- title: null,
578
- };
579
-
580
- const captured: CapturedAgentLoopRun[] = [];
581
- const ctx = makeCtx(captured);
571
+ });
582
572
 
583
573
  await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
584
574
 
@@ -588,22 +578,9 @@ describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
588
578
  }
589
579
  });
590
580
 
591
- test("absence of inferenceProfile column behaves identically to today (no override)", async () => {
592
- // `mockConversationRow` already defaults to inferenceProfile: null.
593
- // Also explicitly cover the case where the column is missing entirely.
594
- mockConversationRow = {
595
- id: "conv-1",
596
- conversationType: "standard",
597
- contextSummary: null,
598
- contextCompactedMessageCount: 0,
599
- totalInputTokens: 0,
600
- totalOutputTokens: 0,
601
- totalEstimatedCost: 0,
602
- title: null,
603
- };
604
-
581
+ test("absence of inferenceProfile behaves identically to today (no override)", async () => {
605
582
  const captured: CapturedAgentLoopRun[] = [];
606
- const ctx = makeCtx(captured);
583
+ const ctx = makeCtx(captured, { conversationType: "standard" });
607
584
 
608
585
  await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
609
586
 
@@ -613,26 +590,17 @@ describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
613
590
  }
614
591
  });
615
592
 
616
- test("explicit options.overrideProfile takes precedence over the column read", async () => {
593
+ test("explicit options.overrideProfile takes precedence over the conversation override", async () => {
617
594
  // Subagent path: SubagentManager forwards the parent's pinned profile
618
595
  // into the spawned (background) conversation's runAgentLoop call via
619
596
  // `options.overrideProfile`. The agent loop must respect that even
620
- // though the subagent's own conversation row is `background` (which
597
+ // though the subagent's own conversation is `background` (which
621
598
  // would otherwise zero out the override per the rule above).
622
- mockConversationRow = {
623
- id: "conv-1",
599
+ const captured: CapturedAgentLoopRun[] = [];
600
+ const ctx = makeCtx(captured, {
624
601
  conversationType: "background",
625
602
  inferenceProfile: null,
626
- contextSummary: null,
627
- contextCompactedMessageCount: 0,
628
- totalInputTokens: 0,
629
- totalOutputTokens: 0,
630
- totalEstimatedCost: 0,
631
- title: null,
632
- };
633
-
634
- const captured: CapturedAgentLoopRun[] = [];
635
- const ctx = makeCtx(captured);
603
+ });
636
604
 
637
605
  await runAgentLoopImpl(ctx, "hello", "msg-1", () => {}, {
638
606
  overrideProfile: "fast",
@@ -645,27 +613,15 @@ describe("runAgentLoopImpl — per-conversation inferenceProfile", () => {
645
613
  });
646
614
 
647
615
  test("re-resolves inferenceProfile when a tool changes it mid-turn", async () => {
648
- mockConversationRow = {
649
- id: "conv-1",
616
+ const captured: CapturedAgentLoopRun[] = [];
617
+ const ctx = makeCtx(captured, {
650
618
  conversationType: "standard",
651
619
  inferenceProfile: null,
652
- contextSummary: null,
653
- contextCompactedMessageCount: 0,
654
- totalInputTokens: 0,
655
- totalOutputTokens: 0,
656
- totalEstimatedCost: 0,
657
- title: null,
658
- };
620
+ });
659
621
  mutateBeforeResolveOverrideProfile = () => {
660
- mockConversationRow = {
661
- ...mockConversationRow!,
662
- inferenceProfile: "quality-optimized",
663
- };
622
+ ctx.inferenceProfile = "quality-optimized";
664
623
  };
665
624
 
666
- const captured: CapturedAgentLoopRun[] = [];
667
- const ctx = makeCtx(captured);
668
-
669
625
  await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
670
626
 
671
627
  expect(captured.length).toBeGreaterThan(0);