@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
@@ -1,73 +0,0 @@
1
- /**
2
- * Default `compaction` behavior: summarizes conversation history when the
3
- * context window fills up.
4
- *
5
- * This module is side-effect free: importing it does not register any plugin.
6
- *
7
- * Delegates to the orchestrator's existing {@link ContextWindowManager}
8
- * instance, read from `ctx.contextWindowManager` on the {@link TurnContext} as
9
- * a typed optional field. The orchestrator is responsible for attaching that
10
- * handle to the per-turn context. If the handle is missing, this throws a
11
- * {@link PluginExecutionError} so the bug surfaces with clear attribution
12
- * instead of a late `undefined.maybeCompact is not a function`.
13
- */
14
-
15
- import type {
16
- ContextWindowCompactOptions,
17
- ContextWindowManager,
18
- ContextWindowResult,
19
- } from "../../../context/window-manager.js";
20
- import type { Message } from "../../../providers/types.js";
21
- import {
22
- type CompactionArgs,
23
- type CompactionResult,
24
- PluginExecutionError,
25
- type TurnContext,
26
- } from "../../types.js";
27
-
28
- /**
29
- * Name under which the default plugin registers. Exposed so tests and later
30
- * plugins can assert registration order or override the default via
31
- * composition.
32
- */
33
- export const DEFAULT_COMPACTION_PLUGIN_NAME = "default-compaction";
34
-
35
- /**
36
- * Read `contextWindowManager` off the turn context. Throws
37
- * {@link PluginExecutionError} when absent so the failure attributes cleanly
38
- * to the default plugin instead of manifesting as a later NPE.
39
- */
40
- function extractManager(ctx: TurnContext): ContextWindowManager {
41
- const manager = ctx.contextWindowManager;
42
- if (
43
- manager == null ||
44
- typeof manager !== "object" ||
45
- typeof (manager as { maybeCompact?: unknown }).maybeCompact !== "function"
46
- ) {
47
- throw new PluginExecutionError(
48
- "default-compaction: ctx.contextWindowManager is missing — orchestrator must attach it before invoking compaction",
49
- DEFAULT_COMPACTION_PLUGIN_NAME,
50
- );
51
- }
52
- return manager;
53
- }
54
-
55
- /**
56
- * Run compaction for the turn: reads the context window manager off the turn
57
- * context and returns the (possibly summarized) message history from
58
- * `maybeCompact`.
59
- */
60
- export async function defaultCompactionTerminal(
61
- args: CompactionArgs,
62
- ctx: TurnContext,
63
- ): Promise<CompactionResult> {
64
- const manager = extractManager(ctx);
65
- const messages = args.messages as Message[];
66
- const options = args.options as ContextWindowCompactOptions | undefined;
67
- const result: ContextWindowResult = await manager.maybeCompact(
68
- messages,
69
- args.signal,
70
- options,
71
- );
72
- return result;
73
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * Default `empty-response` plugin.
3
- *
4
- * Contributes a `stop` hook that re-queries the model when a turn yields with
5
- * no tool calls but came back empty (or as a provider refusal). The decision
6
- * logic lives in `./hooks/stop.ts`. Defaults register before user plugins, so
7
- * this runs at the front of the `stop` hook chain.
8
- */
9
-
10
- import { type Plugin } from "../../types.js";
11
- import stop from "./hooks/stop.js";
12
- import pkg from "./package.json" with { type: "json" };
13
-
14
- /** Singleton plugin — the registry rejects duplicate registrations by name. */
15
- export const defaultEmptyResponsePlugin: Plugin = {
16
- manifest: {
17
- name: pkg.name,
18
- version: pkg.version,
19
- },
20
- hooks: {
21
- stop,
22
- },
23
- };
@@ -1,24 +0,0 @@
1
- /**
2
- * Default `history-repair` plugin.
3
- *
4
- * Contributes a `user-prompt-submit` hook that normalizes the working message
5
- * history (tool-use/tool-result pairing, role alternation) before the agent
6
- * loop hands it to the provider. The repair implementation lives in
7
- * `./terminal.ts`; the hook in `./hooks/user-prompt-submit.ts` wires it into
8
- * the lifecycle. Defaults register before user plugins, so this normalization
9
- * runs at the front of the hook chain.
10
- */
11
-
12
- import { type Plugin } from "../../types.js";
13
- import userPromptSubmit from "./hooks/user-prompt-submit.js";
14
- import pkg from "./package.json" with { type: "json" };
15
-
16
- export const defaultHistoryRepairPlugin: Plugin = {
17
- manifest: {
18
- name: pkg.name,
19
- version: pkg.version,
20
- },
21
- hooks: {
22
- "user-prompt-submit": userPromptSubmit,
23
- },
24
- };
@@ -1,216 +0,0 @@
1
- /**
2
- * Default `user-prompt-submit-temp` hook: runs the memory-graph retrieval the
3
- * agent loop needs before building a turn's runtime-injection block.
4
- *
5
- * **Memory graph** via {@link ConversationGraphMemory.prepareMemory} —
6
- * dispatches to context-load or per-turn retrieval depending on initialization
7
- * state; gated on the actor being trusted (guardian).
8
- *
9
- * The hook also owns the retrieval's side effects — persisting the injected
10
- * block onto the user message's metadata, writing the recall log, and emitting
11
- * the `memory_recalled` event — so the loop only consumes the turn-scoped
12
- * `latestMessages` written back onto the context. The PKB query-vector pair is
13
- * recorded on the conversation's graph handle for the PKB-reminder injector to
14
- * read back. PKB context and NOW.md are sourced directly by their injectors
15
- * (gated on block presence), not produced here.
16
- *
17
- * This fires at the early "prompt submitted, before context assembly" moment,
18
- * distinct from the canonical late `user-prompt-submit` hook (history repair,
19
- * title): memory's outputs feed the injection and overflow-reduction transforms
20
- * that run between the two moments. The `-temp` suffix marks this as a
21
- * transitional staging point that folds into `user-prompt-submit` once
22
- * compaction is cleared from the gap between the two call sites.
23
- */
24
-
25
- import type { PluginHookFn } from "@vellumai/plugin-api";
26
- import type { Logger } from "pino";
27
-
28
- import type { AssistantConfig } from "../../../../config/schema.js";
29
- import type { ServerMessage } from "../../../../daemon/message-protocol.js";
30
- import type { MemoryRecalled } from "../../../../daemon/message-types/memory.js";
31
- import { updateMessageMetadata } from "../../../../memory/conversation-crud.js";
32
- import type { ConversationGraphMemory } from "../../../../memory/graph/conversation-graph-memory.js";
33
- import { recordMemoryRecallLog } from "../../../../memory/memory-recall-log-store.js";
34
- import type { Message } from "../../../../providers/types.js";
35
- import type { GraphMemoryResult } from "../../../types.js";
36
-
37
- /**
38
- * Context threaded through the `user-prompt-submit-temp` hook. The readonly
39
- * fields carry the conversation-scoped state the retriever needs (graph
40
- * handle, event sink, abort signal); the output fields are populated by the
41
- * hook and read back by the agent loop. `latestMessages` straddles both: the
42
- * loop seeds it with the pre-injection array and the hook overwrites it with
43
- * the injected result.
44
- */
45
- export interface MemoryRetrievalHookContext {
46
- /** Per-conversation memory graph handle. */
47
- readonly graphMemory: ConversationGraphMemory;
48
- /** Assistant config snapshot. */
49
- readonly config: AssistantConfig;
50
- /** Event sink used by the graph retriever and `memory_recalled` emission. */
51
- readonly onEvent: (msg: ServerMessage) => void;
52
- /** True when the actor for this turn is trusted (guardian-class). */
53
- readonly isTrustedActor: boolean;
54
- /** Conversation the turn belongs to — keys the recall-log row. */
55
- readonly conversationId: string;
56
- /** User message the injected memory block is persisted onto. */
57
- readonly userMessageId: string;
58
- /** Turn-scoped logger for non-fatal persistence warnings. */
59
- readonly logger: Logger;
60
- /**
61
- * Per-turn abort signal forwarded to `prepareMemory`. An external cancel
62
- * aborts the underlying retrieval instead of letting it run to completion.
63
- */
64
- readonly signal: AbortSignal;
65
- /**
66
- * Working message list for the turn. Seeded by the loop with the
67
- * pre-injection messages and consumed as the retrieval input; the hook
68
- * overwrites it with the memory-graph block injected, or leaves it
69
- * unchanged when no graph retrieval ran (untrusted actor, or a no-op
70
- * retrieval). Read back by the loop.
71
- */
72
- latestMessages: Message[];
73
- }
74
-
75
- /**
76
- * Persist and broadcast the retrieval's side effects: the injected block on
77
- * the user message's metadata (so it survives reloads), a recall-log row, and
78
- * the `memory_recalled` debug event. All three are best-effort — a failure to
79
- * persist must not abort the turn.
80
- */
81
- function recordRecallSideEffects(
82
- graphResult: GraphMemoryResult,
83
- ctx: MemoryRetrievalHookContext,
84
- ): void {
85
- // Persist the injected block text in message metadata so it survives
86
- // conversation reloads (eviction, restart, fork). loadFromDb re-injects
87
- // from metadata.
88
- if (graphResult.injectedBlockText) {
89
- try {
90
- updateMessageMetadata(ctx.userMessageId, {
91
- memoryInjectedBlock: graphResult.injectedBlockText,
92
- });
93
- } catch (err) {
94
- ctx.logger.warn(
95
- { err },
96
- "Failed to persist memory injection to metadata (non-fatal)",
97
- );
98
- }
99
- }
100
-
101
- const m = graphResult.metrics;
102
-
103
- try {
104
- recordMemoryRecallLog({
105
- conversationId: ctx.conversationId,
106
- enabled: true,
107
- degraded: false,
108
- provider: m?.embeddingProvider ?? undefined,
109
- model: m?.embeddingModel ?? undefined,
110
- semanticHits: m?.semanticHits ?? 0,
111
- mergedCount: m?.mergedCount ?? 0,
112
- selectedCount: m?.selectedCount ?? 0,
113
- tier1Count: m?.tier1Count ?? 0,
114
- tier2Count: m?.tier2Count ?? 0,
115
- hybridSearchLatencyMs: m?.hybridSearchLatencyMs ?? 0,
116
- sparseVectorUsed: m?.sparseVectorUsed ?? false,
117
- injectedTokens: graphResult.injectedTokens,
118
- latencyMs: graphResult.latencyMs,
119
- topCandidatesJson: (m?.topCandidates ?? []).map((c) => ({
120
- key: c.nodeId,
121
- type: c.type,
122
- kind: "graph",
123
- finalScore: c.score,
124
- semantic: c.semanticSimilarity,
125
- recency: c.recencyBoost,
126
- })),
127
- injectedText: graphResult.injectedBlockText ?? undefined,
128
- reason: `graph:${graphResult.mode}`,
129
- queryContext: m?.queryContext ?? undefined,
130
- });
131
- } catch (err) {
132
- ctx.logger.warn({ err }, "Failed to persist memory recall log (non-fatal)");
133
- }
134
-
135
- if (m) {
136
- const memoryRecalledEvent: MemoryRecalled = {
137
- type: "memory_recalled",
138
- provider: m.embeddingProvider ?? "unknown",
139
- model: m.embeddingModel ?? "unknown",
140
- semanticHits: m.semanticHits,
141
- mergedCount: m.mergedCount,
142
- selectedCount: m.selectedCount,
143
- tier1Count: m.tier1Count,
144
- tier2Count: m.tier2Count,
145
- hybridSearchLatencyMs: m.hybridSearchLatencyMs,
146
- sparseVectorUsed: m.sparseVectorUsed,
147
- injectedTokens: graphResult.injectedTokens,
148
- latencyMs: graphResult.latencyMs,
149
- topCandidates: m.topCandidates.map((c) => ({
150
- key: c.nodeId,
151
- type: c.type,
152
- kind: "graph",
153
- finalScore: c.score,
154
- semantic: c.semanticSimilarity,
155
- recency: c.recencyBoost,
156
- })),
157
- };
158
- ctx.onEvent(memoryRecalledEvent);
159
- }
160
- }
161
-
162
- /**
163
- * Run the default retrieval, writing `latestMessages` back onto the context and
164
- * recording the PKB query-vector pair on the graph handle. Skips the
165
- * memory-graph call entirely (leaving `latestMessages` as the seeded input
166
- * messages and no query pair recorded) when the actor is not trusted.
167
- *
168
- * Memory retrieval blocks the turn — there is no soft timeout here. Memory is
169
- * critical context, and silently dropping it produces a worse outcome than a
170
- * slower turn. Cancellation still works via `ctx.signal`, which is threaded
171
- * into `prepareMemory`.
172
- */
173
- const userPromptSubmitMemoryRetrieval: PluginHookFn<
174
- MemoryRetrievalHookContext
175
- > = async (ctx) => {
176
- if (!ctx.isTrustedActor) {
177
- // Untrusted actors skip memory-graph retrieval entirely.
178
- return;
179
- }
180
-
181
- const graphResult = await ctx.graphMemory.prepareMemory(
182
- ctx.latestMessages,
183
- ctx.config,
184
- ctx.signal,
185
- ctx.onEvent,
186
- );
187
-
188
- recordRecallSideEffects(graphResult, ctx);
189
-
190
- ctx.latestMessages = graphResult.runMessages;
191
- // Select dense+sparse as a matched pair so RRF fusion combines two signals
192
- // aligned to the same query text:
193
- // 1. Context-load with a user query: user-query dense + user-query sparse
194
- // — the cleanest pairing.
195
- // 2. Otherwise (context-load without a user query, or per-turn): whatever
196
- // `queryVector` / `sparseVector` the retriever produced, which are
197
- // themselves co-aligned (both summary-derived in context-load, both
198
- // user-last-message-derived in per-turn).
199
- // Never pair a user-query dense with a summary-aligned sparse.
200
- // The PKB-reminder injector reads this pair back off the same graph handle
201
- // (looked up by conversation id) rather than receiving it threaded through
202
- // the agent loop.
203
- if (graphResult.userQueryVector) {
204
- ctx.graphMemory.recordPkbQueryVectors(
205
- graphResult.userQueryVector,
206
- graphResult.userQuerySparseVector,
207
- );
208
- } else {
209
- ctx.graphMemory.recordPkbQueryVectors(
210
- graphResult.queryVector,
211
- graphResult.sparseVector,
212
- );
213
- }
214
- };
215
-
216
- export default userPromptSubmitMemoryRetrieval;
@@ -1,126 +0,0 @@
1
- import type { ContextWindowCompactOptions } from "../../../../context/window-manager.js";
2
- import {
3
- createInitialReducerState,
4
- reduceContextOverflow,
5
- type ReducerState,
6
- } from "../../../../daemon/context-overflow-reducer.js";
7
- import type {
8
- Middleware,
9
- OverflowReduceArgs,
10
- OverflowReduceResult,
11
- } from "../../../types.js";
12
-
13
- /**
14
- * Default middleware for the `overflowReduce` pipeline — implements the
15
- * historical tier-loop semantics (forced compaction, tool-result truncation,
16
- * media stubbing, injection downgrade) plus the post-step re-injection /
17
- * re-estimation dance.
18
- *
19
- * The middleware intentionally ignores `next`. Overflow reduction is a
20
- * *terminal* behavior: there is no downstream implementation to defer to when
21
- * a user-supplied middleware short-circuits. Later plugins may still wrap this
22
- * one (outer middleware can observe each reduction iteration via their own
23
- * `next` callback) but the default never delegates to a hypothetical base
24
- * handler — the inline loop was the base.
25
- */
26
- const defaultOverflowReduceMiddleware: Middleware<
27
- OverflowReduceArgs,
28
- OverflowReduceResult
29
- > = async function defaultOverflowReduceMiddleware(args, _next, _ctx) {
30
- let messages = args.messages;
31
- let runMessages = args.runMessages;
32
- let injectionMode: "full" | "minimal" = "full";
33
- let reducerState: ReducerState = createInitialReducerState();
34
- let reducerCompacted = false;
35
- let attempts = 0;
36
-
37
- while (attempts < args.maxAttempts && !reducerState.exhausted) {
38
- // Abort check at the top of every iteration. When the pipeline runner
39
- // arms a timeout (or the caller aborts externally), `args.abortSignal`
40
- // is linked to that trigger via `linkAbortSignal`, so this check lets
41
- // us bail out BETWEEN iterations rather than letting another round of
42
- // compaction / re-injection mutate `ctx.messages` after the turn has
43
- // already failed. Individual `reduceContextOverflow` calls also honor
44
- // the signal, but without this gate a fresh iteration could still
45
- // start after the signal fires, since the previous one returned
46
- // normally before the abort propagated.
47
- args.abortSignal?.throwIfAborted();
48
-
49
- attempts++;
50
- args.emitActivityState();
51
-
52
- const basisMessages = messages;
53
- const step = await reduceContextOverflow(
54
- basisMessages,
55
- {
56
- providerName: args.providerName,
57
- systemPrompt: args.systemPrompt,
58
- contextWindow: args.contextWindow,
59
- targetTokens: args.preflightBudget,
60
- toolTokenBudget: args.toolTokenBudget,
61
- },
62
- reducerState,
63
- (msgs, signal, opts: ContextWindowCompactOptions) =>
64
- args.compactFn(msgs, signal, opts),
65
- args.abortSignal,
66
- );
67
-
68
- reducerState = step.state;
69
- messages = step.messages;
70
- injectionMode = step.state.injectionMode;
71
-
72
- // Per-iteration compaction flag: whether THIS step just produced a
73
- // fresh compaction. PKB / NOW re-injection is gated on this — see the
74
- // reinjectForMode JSDoc for why the two signals differ.
75
- const stepCompacted = step.compactionResult?.compacted === true;
76
-
77
- // Let the orchestrator apply compaction side effects (circuit-breaker
78
- // tracking, event emission, ctx mutation) before we re-inject.
79
- if (step.compactionResult) {
80
- await args.onCompactionResult(step.compactionResult, basisMessages);
81
- if (stepCompacted) {
82
- reducerCompacted = true;
83
- }
84
- }
85
-
86
- // Second abort gate — if the side effects or the step itself took us
87
- // past the deadline, don't rebuild runMessages or iterate again.
88
- args.abortSignal?.throwIfAborted();
89
-
90
- // Rebuild runMessages via the orchestrator-supplied helper (which
91
- // re-runs `applyRuntimeInjections` with potentially downgraded mode
92
- // and freshly re-hydrated PKB/NOW blocks after compaction). We pass
93
- // the current reduced `messages` explicitly so the orchestrator never
94
- // has to read from mutable shared state to rebuild runMessages — a
95
- // tier that doesn't trigger compaction (tool-result truncation, media
96
- // stubbing) won't update `ctx.messages` on its own.
97
- //
98
- // `stepCompacted` and `reducerCompacted` are both passed so the
99
- // orchestrator can gate PKB / NOW re-injection per-iteration while
100
- // keeping `slackChronologicalMessages` suppressed once any iteration
101
- // has compacted.
102
- runMessages = await args.reinjectForMode(
103
- messages,
104
- injectionMode,
105
- stepCompacted,
106
- reducerCompacted,
107
- );
108
-
109
- // Re-estimate with injections included — `step.estimatedTokens` was
110
- // computed on bare history and doesn't account for tokens added by
111
- // runtime injections.
112
- const postInjectionTokens = args.estimatePostInjection(runMessages);
113
- if (postInjectionTokens <= args.preflightBudget) break;
114
- }
115
-
116
- return {
117
- messages,
118
- runMessages,
119
- injectionMode,
120
- reducerState,
121
- reducerCompacted,
122
- attempts,
123
- };
124
- };
125
-
126
- export default defaultOverflowReduceMiddleware;
@@ -1,15 +0,0 @@
1
- {
2
- "name": "default-overflow-reduce",
3
- "version": "1.0.0",
4
- "description": "First-party default plugin wrapping the assistant's built-in overflow-reduce pipeline with a passthrough implementation.",
5
- "private": true,
6
- "license": "MIT",
7
- "type": "module",
8
- "main": "./register.ts",
9
- "engines": {
10
- "node": ">=20.12.0"
11
- },
12
- "peerDependencies": {
13
- "@vellumai/plugin-api": "^0.8.0"
14
- }
15
- }
@@ -1,42 +0,0 @@
1
- /**
2
- * Default `overflowReduce` plugin — extracted verbatim from the inline
3
- * preflight reducer loop that previously lived in
4
- * `daemon/conversation-agent-loop.ts` (the `while (preflightAttempts < …)`
5
- * block around lines 1045–1156 before PR 23).
6
- *
7
- * The plugin owns the reducer tier-loop (forced compaction, tool-result
8
- * truncation, media stubbing, injection downgrade) and the post-step
9
- * re-injection / re-estimation dance. Orchestrator-specific coupling
10
- * (activity emission, circuit-breaker tracking, compaction-result
11
- * application, runtime injection reassembly) is threaded in through the
12
- * callbacks carried on {@link OverflowReduceArgs}; the plugin itself has no
13
- * access to the agent-loop context object.
14
- *
15
- * The forced-compaction tier runs through the orchestrator-supplied
16
- * `compactFn`, which routes into the `compaction` plugin pipeline so
17
- * registered compaction middleware observes reducer-initiated invocations
18
- * alongside the orchestrator-owned call sites. Non-compaction tiers
19
- * (tool-result truncation, media stubbing, injection downgrade) remain
20
- * in-process: they mutate message arrays directly without crossing a
21
- * pipeline boundary. The reducer itself runs under the `overflowReduce`
22
- * pipeline, so the full layering is `overflowReduce` → reducer tier loop
23
- * → (for the forced-compaction tier only) nested `compaction` pipeline.
24
- */
25
-
26
- import { type Plugin } from "../../types.js";
27
- import defaultOverflowReduceMiddleware from "./middlewares/overflowReduce.js";
28
- import pkg from "./package.json" with { type: "json" };
29
-
30
- /**
31
- * The default plugin registered at bootstrap. No `init`/`onShutdown` —
32
- * registering the middleware is the only behavior.
33
- */
34
- export const defaultOverflowReducePlugin: Plugin = {
35
- manifest: {
36
- name: pkg.name,
37
- version: pkg.version,
38
- },
39
- middleware: {
40
- overflowReduce: defaultOverflowReduceMiddleware,
41
- },
42
- };
@@ -1,35 +0,0 @@
1
- /**
2
- * Default `title-generate` plugin.
3
- *
4
- * Contributes two hooks, both pure triggers that delegate the title work to
5
- * the service (`memory/conversation-title-service.ts`):
6
- *
7
- * - `user-prompt-submit` (`./hooks/user-prompt-submit.ts`) — first-pass title
8
- * generation from the submitted prompt.
9
- * - `stop` (`./hooks/stop.ts`) — second-pass regeneration once the
10
- * conversation reaches its third user turn, for a title that reflects the
11
- * established topic.
12
- *
13
- * Persistence and the resulting `conversation_title_updated` / `sync_changed`
14
- * broadcast are owned by the title service.
15
- *
16
- * Registered via a side-effect import from
17
- * `daemon/external-plugins-bootstrap.ts` so it is present in the registry
18
- * by the time {@link bootstrapPlugins} runs.
19
- */
20
-
21
- import { type Plugin } from "../../types.js";
22
- import stop from "./hooks/stop.js";
23
- import userPromptSubmit from "./hooks/user-prompt-submit.js";
24
- import pkg from "./package.json" with { type: "json" };
25
-
26
- export const defaultTitleGeneratePlugin: Plugin = {
27
- manifest: {
28
- name: pkg.name,
29
- version: pkg.version,
30
- },
31
- hooks: {
32
- "user-prompt-submit": userPromptSubmit,
33
- stop,
34
- },
35
- };
@@ -1,23 +0,0 @@
1
- /**
2
- * Default `tool-error` plugin.
3
- *
4
- * Contributes a `post-tool-use` hook that coaches the model to retry or report
5
- * a failed tool call, bounded per tool so an unrecoverable error doesn't churn.
6
- * The coaching is surfaced via `additionalContext` (a separate provider-only
7
- * block), leaving the tool result's own content untouched. The decision logic
8
- * lives in `./hooks/post-tool-use.ts`.
9
- */
10
-
11
- import { type Plugin } from "../../types.js";
12
- import postToolUse from "./hooks/post-tool-use.js";
13
- import pkg from "./package.json" with { type: "json" };
14
-
15
- export const defaultToolErrorPlugin: Plugin = {
16
- manifest: {
17
- name: pkg.name,
18
- version: pkg.version,
19
- },
20
- hooks: {
21
- "post-tool-use": postToolUse,
22
- },
23
- };
@@ -1,24 +0,0 @@
1
- /**
2
- * Default `tool-result-truncate` plugin.
3
- *
4
- * Contributes a `post-tool-use` hook that tail-drops an oversized tool result
5
- * down to a character budget derived from the model's context window before
6
- * the result is sent to the provider. The truncation implementation lives in
7
- * `./terminal.ts`; the hook in `./hooks/post-tool-use.ts` wires it into the
8
- * lifecycle. Defaults register before user plugins, so this runs at the front
9
- * of the hook chain.
10
- */
11
-
12
- import { type Plugin } from "../../types.js";
13
- import postToolUse from "./hooks/post-tool-use.js";
14
- import pkg from "./package.json" with { type: "json" };
15
-
16
- export const defaultToolResultTruncatePlugin: Plugin = {
17
- manifest: {
18
- name: pkg.name,
19
- version: pkg.version,
20
- },
21
- hooks: {
22
- "post-tool-use": postToolUse,
23
- },
24
- };