@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
@@ -14,23 +14,25 @@
14
14
  * marker is wrapped around the assistant-role memory message we emit on
15
15
  * successful compaction so those code paths keep working unchanged.
16
16
  */
17
- import { getConfig } from "../config/loader.js";
18
- import type { CompactionConfig } from "../config/schemas/compaction.js";
19
- import type { LLMCallSite } from "../config/schemas/llm.js";
20
- import type { ContextWindowConfig } from "../config/types.js";
17
+ import { getConfig } from "../../../config/loader.js";
18
+ import type { CompactionConfig } from "../../../config/schemas/compaction.js";
19
+ import type { LLMCallSite } from "../../../config/schemas/llm.js";
20
+ import type { ContextWindowConfig } from "../../../config/types.js";
21
+ import {
22
+ type CompactionRunArgs,
23
+ type CompactionRunResult,
24
+ runAssistantDrivenCompaction,
25
+ runEmergencyCompaction,
26
+ } from "../../../context/compactor.js";
27
+ import { estimatePromptTokens } from "../../../context/token-estimator.js";
21
28
  import type {
22
29
  ContentBlock,
23
30
  Message,
24
31
  Provider,
25
32
  ToolDefinition,
26
- } from "../providers/types.js";
27
- import type { TrustClass } from "../runtime/actor-trust-resolver.js";
28
- import { getLogger } from "../util/logger.js";
29
- import {
30
- type CompactionRunArgs,
31
- runAssistantDrivenCompaction,
32
- } from "./compactor.js";
33
- import { estimatePromptTokens } from "./token-estimator.js";
33
+ } from "../../../providers/types.js";
34
+ import type { TrustClass } from "../../../runtime/actor-trust-resolver.js";
35
+ import { getLogger } from "../../../util/logger.js";
34
36
 
35
37
  const log = getLogger("context-window");
36
38
 
@@ -40,7 +42,8 @@ const INTERNAL_CONTEXT_SUMMARY_MESSAGES = new WeakSet<Message>();
40
42
 
41
43
  // ---------------------------------------------------------------------------
42
44
  // Public types — preserved for downstream consumers (agent loop, conversation,
43
- // plugin pipeline, applyCompactionResult, routes/playground/force-compact).
45
+ // default compaction plugin, applyCompactionResult,
46
+ // routes/playground/force-compact).
44
47
  // ---------------------------------------------------------------------------
45
48
 
46
49
  export interface ContextWindowResult {
@@ -117,6 +120,21 @@ export interface ContextWindowCompactOptions {
117
120
  actorTrustClass?: TrustClass;
118
121
  }
119
122
 
123
+ export interface EmergencyCompactOptions {
124
+ /**
125
+ * The provider-reported estimate at the overflow that triggered recovery.
126
+ * Sizing the emergency summary needs the actual rejected token count, not
127
+ * the manager's pre-send estimate (which under-counted, hence the
128
+ * rejection).
129
+ */
130
+ previousEstimatedInputTokens: number;
131
+ /**
132
+ * Per-conversation inference-profile override forwarded to the summary
133
+ * call.
134
+ */
135
+ overrideProfile?: string | null;
136
+ }
137
+
120
138
  export interface ContextWindowManagerOptions {
121
139
  provider: Provider;
122
140
  systemPrompt: string | (() => string);
@@ -198,8 +216,7 @@ export class ContextWindowManager {
198
216
  * `compactedMessages` so `compactedPersistedMessages` only reflects DB
199
217
  * rows. Decremented after a successful compaction.
200
218
  */
201
- nonPersistedPrefixCount = 0;
202
- summaryIsInjected = false;
219
+ private _nonPersistedPrefixCount = 0;
203
220
  private _resolvedSystemPrompt: string | undefined;
204
221
 
205
222
  constructor(options: ContextWindowManagerOptions) {
@@ -215,6 +232,21 @@ export class ContextWindowManager {
215
232
  this.config = config;
216
233
  }
217
234
 
235
+ /** Leading non-persisted inherited-context messages the compactor preserves. */
236
+ get nonPersistedPrefixCount(): number {
237
+ return this._nonPersistedPrefixCount;
238
+ }
239
+
240
+ /**
241
+ * Seed the non-persisted inherited-context prefix when a forked/sub
242
+ * conversation inherits its parent's in-memory context. The compactor folds
243
+ * this prefix into the summary and {@link consumeCompactionState} decrements
244
+ * it as the leading messages are compacted away.
245
+ */
246
+ seedNonPersistedPrefix(count: number): void {
247
+ this._nonPersistedPrefixCount = count;
248
+ }
249
+
218
250
  private get estimationProviderName(): string {
219
251
  return this.provider.tokenEstimationProvider ?? this.provider.name;
220
252
  }
@@ -352,7 +384,7 @@ export class ContextWindowManager {
352
384
  signal,
353
385
  overrideProfile: options?.overrideProfile ?? null,
354
386
  actorTrustClass: options?.actorTrustClass,
355
- nonPersistedPrefixCount: this.nonPersistedPrefixCount,
387
+ nonPersistedPrefixCount: this._nonPersistedPrefixCount,
356
388
  };
357
389
 
358
390
  // Retry budget for the compactor itself. Lives here (not in the
@@ -390,7 +422,7 @@ export class ContextWindowManager {
390
422
  ...baseArgs,
391
423
  messages: result.messages,
392
424
  previousEstimatedInputTokens: previousEstimate,
393
- nonPersistedPrefixCount: this.nonPersistedPrefixCount,
425
+ nonPersistedPrefixCount: this._nonPersistedPrefixCount,
394
426
  });
395
427
  if (!nextResult.compacted) break;
396
428
  const nextEstimate = this.recomputePostCompactionEstimate(
@@ -413,6 +445,45 @@ export class ContextWindowManager {
413
445
  return { ...result, estimatedInputTokens, exhausted: true };
414
446
  }
415
447
 
448
+ /**
449
+ * Emergency mid-turn compaction — summarize everything before the last
450
+ * tool_use/tool_result pair and let the agent continue with
451
+ * `[summary, last_tool_call, last_tool_result]`. Used as a recovery rung
452
+ * after the provider rejects a turn for context overflow. The manager
453
+ * supplies the provider, system prompt, token budget, conversation id, and
454
+ * non-persisted prefix count it already owns; the caller provides only the
455
+ * overflow-specific inputs.
456
+ */
457
+ async emergencyCompact(
458
+ messages: Message[],
459
+ options: EmergencyCompactOptions,
460
+ signal?: AbortSignal,
461
+ ): Promise<CompactionRunResult> {
462
+ if (this.conversationId == null) {
463
+ throw new Error(
464
+ "ContextWindowManager has no conversationId — cannot run emergency compaction",
465
+ );
466
+ }
467
+ try {
468
+ return await runEmergencyCompaction({
469
+ conversationId: this.conversationId,
470
+ messages,
471
+ provider: this.provider,
472
+ systemPrompt: this.systemPrompt,
473
+ tools: undefined,
474
+ compaction: this.resolveCompactionConfig(),
475
+ maxInputTokens: this.config.maxInputTokens,
476
+ previousEstimatedInputTokens: options.previousEstimatedInputTokens,
477
+ force: true,
478
+ signal,
479
+ overrideProfile: options.overrideProfile ?? null,
480
+ nonPersistedPrefixCount: this._nonPersistedPrefixCount,
481
+ });
482
+ } finally {
483
+ this.clearSystemPromptCache();
484
+ }
485
+ }
486
+
416
487
  /**
417
488
  * Recompute the prompt-token estimate against the post-compaction
418
489
  * message array. The compactor returns a conservative placeholder; the
@@ -434,21 +505,20 @@ export class ContextWindowManager {
434
505
  }
435
506
 
436
507
  /**
437
- * Decrement the non-persisted prefix bookkeeping and clear the
438
- * injected-summary flag after a productive compaction. Called once per
439
- * successful internal attempt so multi-attempt runs keep the count
440
- * honest as the leading injected messages get folded into the summary.
508
+ * Decrement the non-persisted prefix bookkeeping after a productive
509
+ * compaction. Called once per successful internal attempt so multi-attempt
510
+ * runs keep the count honest as the leading injected messages get folded
511
+ * into the summary.
441
512
  */
442
513
  private consumeCompactionState(compactedMessages: number): void {
443
514
  const compactedAway = Math.min(
444
- this.nonPersistedPrefixCount,
515
+ this._nonPersistedPrefixCount,
445
516
  compactedMessages,
446
517
  );
447
- this.nonPersistedPrefixCount = Math.max(
518
+ this._nonPersistedPrefixCount = Math.max(
448
519
  0,
449
- this.nonPersistedPrefixCount - compactedAway,
520
+ this._nonPersistedPrefixCount - compactedAway,
450
521
  );
451
- this.summaryIsInjected = false;
452
522
  }
453
523
  }
454
524
 
@@ -5,7 +5,6 @@
5
5
  "private": true,
6
6
  "license": "MIT",
7
7
  "type": "module",
8
- "main": "./register.ts",
9
8
  "engines": {
10
9
  "node": ">=20.12.0"
11
10
  },
@@ -5,7 +5,6 @@
5
5
  "private": true,
6
6
  "license": "MIT",
7
7
  "type": "module",
8
- "main": "./register.ts",
9
8
  "engines": {
10
9
  "node": ">=20.12.0"
11
10
  },
@@ -1,9 +1,12 @@
1
1
  /**
2
- * Aggregate export of the first-party default plugins.
2
+ * First-party default plugins — definitions and centralized registration.
3
3
  *
4
- * Each default wraps one of the assistant's built-in pipelines with a
5
- * passthrough implementation so the pipeline shape is always explicit at boot
6
- * and at test time, even when no third-party plugins are loaded.
4
+ * Each default contributes the hooks for one of the assistant's built-in
5
+ * behaviors (history repair, title generation, tool-error coaching, …) so the
6
+ * lifecycle is always populated at boot and at test time, even when no
7
+ * third-party plugins are loaded. A `Plugin` is the manifest (name/version,
8
+ * sourced from the sibling `package.json`) plus its hook map; the hook
9
+ * implementations live in each `defaults/<name>/hooks/` directory.
7
10
  *
8
11
  * Consumers:
9
12
  *
@@ -16,44 +19,171 @@
16
19
  * production-parity state (e.g. `conversation-agent-loop.test.ts`); those
17
20
  * call {@link resetPluginRegistryAndRegisterDefaults}.
18
21
  *
19
- * Each `defaults/<name>/register.ts` module only builds and exports its
20
- * `Plugin` object; registration is centralized here. The plugin identifiers
21
- * are dereferenced inside {@link registerDefaultPlugins} at call time, once
22
- * every module has finished initializing, so importing this aggregator does no
23
- * registration work.
22
+ * The plugin definitions below are plain `const`s, so importing this module
23
+ * does no registration work — registration is driven by
24
+ * {@link registerDefaultPlugins} at call time.
24
25
  */
25
26
 
26
27
  import { registerPlugin, resetPluginRegistryForTests } from "../registry.js";
27
28
  import { type Plugin, PluginExecutionError } from "../types.js";
28
- import { defaultCircuitBreakerPlugin } from "./circuit-breaker/register.js";
29
- import { defaultCompactionPlugin } from "./compaction/register.js";
30
- import { defaultEmptyResponsePlugin } from "./empty-response/register.js";
31
- import { defaultHistoryRepairPlugin } from "./history-repair/register.js";
32
- import { defaultOverflowReducePlugin } from "./overflow-reduce/register.js";
33
- import { defaultTitleGeneratePlugin } from "./title-generate/register.js";
34
- import { defaultToolErrorPlugin } from "./tool-error/register.js";
35
- import { defaultToolResultTruncatePlugin } from "./tool-result-truncate/register.js";
29
+ import compactionPkg from "./compaction/package.json" with { type: "json" };
30
+ import emptyResponseStop from "./empty-response/hooks/stop.js";
31
+ import emptyResponsePkg from "./empty-response/package.json" with { type: "json" };
32
+ import historyRepairUserPromptSubmit from "./history-repair/hooks/user-prompt-submit.js";
33
+ import historyRepairPkg from "./history-repair/package.json" with { type: "json" };
34
+ import memoryRetrievalUserPromptSubmit from "./memory-retrieval/hooks/user-prompt-submit.js";
35
+ import memoryRetrievalPkg from "./memory-retrieval/package.json" with { type: "json" };
36
+ import memoryV3PostCompact from "./memory-v3-shadow/hooks/post-compact.js";
37
+ import memoryV3UserPromptSubmit from "./memory-v3-shadow/hooks/user-prompt-submit.js";
38
+ import memoryV3Pkg from "./memory-v3-shadow/package.json" with { type: "json" };
39
+ import titleGenerateStop from "./title-generate/hooks/stop.js";
40
+ import titleGenerateUserPromptSubmit from "./title-generate/hooks/user-prompt-submit.js";
41
+ import titleGeneratePkg from "./title-generate/package.json" with { type: "json" };
42
+ import toolErrorPostToolUse from "./tool-error/hooks/post-tool-use.js";
43
+ import toolErrorPkg from "./tool-error/package.json" with { type: "json" };
44
+ import toolResultTruncatePostToolUse from "./tool-result-truncate/hooks/post-tool-use.js";
45
+ import toolResultTruncatePkg from "./tool-result-truncate/package.json" with { type: "json" };
46
+
47
+ /**
48
+ * `compaction` — compaction is implemented in `compaction/compact.ts` as
49
+ * `defaultCompact`, which the agent loop calls directly. The plugin stays
50
+ * registered as a placeholder so it keeps a presence in the defaults list
51
+ * while we decide how plugins should surface compaction; it contributes no
52
+ * hooks today.
53
+ */
54
+ export const defaultCompactionPlugin: Plugin = {
55
+ manifest: {
56
+ name: compactionPkg.name,
57
+ version: compactionPkg.version,
58
+ },
59
+ };
60
+
61
+ /**
62
+ * `empty-response` — a `stop` hook that re-queries the model when a turn
63
+ * yields with no tool calls but came back empty (or as a provider refusal).
64
+ */
65
+ export const defaultEmptyResponsePlugin: Plugin = {
66
+ manifest: {
67
+ name: emptyResponsePkg.name,
68
+ version: emptyResponsePkg.version,
69
+ },
70
+ hooks: {
71
+ stop: emptyResponseStop,
72
+ },
73
+ };
74
+
75
+ /**
76
+ * `memory-retrieval` — a `user-prompt-submit` hook that runs memory-graph
77
+ * retrieval and assembles the turn's runtime injections (the unified
78
+ * `<turn_context>` block, Slack chronological transcript, NOW.md / PKB /
79
+ * memory-v2 / workspace blocks). Registered first in the chain so later
80
+ * `user-prompt-submit` hooks (history repair, title) see the fully
81
+ * memory-injected history.
82
+ */
83
+ export const defaultMemoryRetrievalPlugin: Plugin = {
84
+ manifest: {
85
+ name: memoryRetrievalPkg.name,
86
+ version: memoryRetrievalPkg.version,
87
+ },
88
+ hooks: {
89
+ "user-prompt-submit": memoryRetrievalUserPromptSubmit,
90
+ },
91
+ };
92
+
93
+ /**
94
+ * `history-repair` — a `user-prompt-submit` hook that normalizes the working
95
+ * message history (tool-use/tool-result pairing, role alternation) before the
96
+ * agent loop hands it to the provider.
97
+ */
98
+ export const defaultHistoryRepairPlugin: Plugin = {
99
+ manifest: {
100
+ name: historyRepairPkg.name,
101
+ version: historyRepairPkg.version,
102
+ },
103
+ hooks: {
104
+ "user-prompt-submit": historyRepairUserPromptSubmit,
105
+ },
106
+ };
107
+
108
+ /**
109
+ * `memory-v3-shadow` — houses the memory-v3 shadow/live orchestration engine
110
+ * (`memory-v3-shadow/`) and its injector. The `user-prompt-submit` /
111
+ * `post-compact` hooks are no-op scaffolding for the eventual convergence,
112
+ * when v3 injection moves off the loop-driven chain and into these hooks.
113
+ */
114
+ export const memoryV3ShadowPlugin: Plugin = {
115
+ manifest: {
116
+ name: memoryV3Pkg.name,
117
+ version: memoryV3Pkg.version,
118
+ },
119
+ hooks: {
120
+ "user-prompt-submit": memoryV3UserPromptSubmit,
121
+ "post-compact": memoryV3PostCompact,
122
+ },
123
+ };
124
+
125
+ /**
126
+ * `title-generate` — two pure-trigger hooks that delegate the title work to
127
+ * the conversation-title service: `user-prompt-submit` (first-pass title) and
128
+ * `stop` (second-pass regeneration once the topic is established).
129
+ */
130
+ export const defaultTitleGeneratePlugin: Plugin = {
131
+ manifest: {
132
+ name: titleGeneratePkg.name,
133
+ version: titleGeneratePkg.version,
134
+ },
135
+ hooks: {
136
+ "user-prompt-submit": titleGenerateUserPromptSubmit,
137
+ stop: titleGenerateStop,
138
+ },
139
+ };
140
+
141
+ /**
142
+ * `tool-error` — a `post-tool-use` hook that coaches the model to retry or
143
+ * report a failed tool call, bounded per tool. The coaching is surfaced via
144
+ * `additionalContext`, leaving the tool result's own content untouched.
145
+ */
146
+ export const defaultToolErrorPlugin: Plugin = {
147
+ manifest: {
148
+ name: toolErrorPkg.name,
149
+ version: toolErrorPkg.version,
150
+ },
151
+ hooks: {
152
+ "post-tool-use": toolErrorPostToolUse,
153
+ },
154
+ };
155
+
156
+ /**
157
+ * `tool-result-truncate` — a `post-tool-use` hook that tail-drops an oversized
158
+ * tool result down to a character budget derived from the model's context
159
+ * window before the result is sent to the provider.
160
+ */
161
+ export const defaultToolResultTruncatePlugin: Plugin = {
162
+ manifest: {
163
+ name: toolResultTruncatePkg.name,
164
+ version: toolResultTruncatePkg.version,
165
+ },
166
+ hooks: {
167
+ "post-tool-use": toolResultTruncatePostToolUse,
168
+ },
169
+ };
36
170
 
37
171
  /**
38
172
  * Full set of first-party default plugins. Used by
39
173
  * {@link registerDefaultPlugins} to drive the registration loop; the array
40
- * order is the registration order, which determines onion order for middleware
41
- * composition (defaults innermost, user plugins outermost).
42
- *
43
- * Returned by a function rather than a top-level `const` so the array
44
- * contents are read at call time, after every imported plugin identifier is
45
- * guaranteed initialized.
174
+ * order is the registration order, which fixes hook-chain order (defaults run
175
+ * ahead of any later-registered user plugins).
46
176
  */
47
177
  function getAllDefaultPlugins(): readonly Plugin[] {
48
178
  return [
179
+ defaultMemoryRetrievalPlugin,
49
180
  defaultToolResultTruncatePlugin,
50
181
  defaultEmptyResponsePlugin,
51
182
  defaultToolErrorPlugin,
52
- defaultOverflowReducePlugin,
53
183
  defaultHistoryRepairPlugin,
54
184
  defaultCompactionPlugin,
55
- defaultCircuitBreakerPlugin,
56
185
  defaultTitleGeneratePlugin,
186
+ memoryV3ShadowPlugin,
57
187
  ];
58
188
  }
59
189
 
@@ -85,7 +215,7 @@ export function registerDefaultPlugins(): void {
85
215
  * so integration tests that exercise the full agent loop have a
86
216
  * production-parity plugin stack. Use this in `beforeEach` of tests that
87
217
  * dispatch through pipelines with a terminal that assumes the default
88
- * plugin handles every op (e.g. overflowReduce).
218
+ * plugin handles every op (e.g. compaction).
89
219
  *
90
220
  * Tests that specifically need an empty registry (pipeline-unit tests, the
91
221
  * plugin-registry tests themselves) should continue to call
@@ -10,82 +10,130 @@
10
10
  * history (and the blocks it captured), with no dependency on the agent loop's
11
11
  * closure state.
12
12
  *
13
- * It re-applies the runtime injections via {@link applyRuntimeInjections},
14
- * re-tracks the memory graph's cached nodes against the re-injected history,
15
- * and converts now-historical `web_search_tool_result` blocks to text so their
16
- * expired `encrypted_content` tokens are not replayed. The remaining
17
- * orchestrator-side step (the post-injection bookkeeping the loop records) is
18
- * expected to migrate here as the hook subsumes the loop's re-injection
19
- * ceremony.
13
+ * It re-applies the runtime injections via {@link applyRuntimeInjections} and
14
+ * re-tracks the memory graph's cached nodes against the re-injected history.
15
+ * The remaining orchestrator-side step (the post-injection bookkeeping the
16
+ * loop records) is expected to migrate here as the hook subsumes the loop's
17
+ * re-injection ceremony.
20
18
  *
21
19
  * The memory graph handle is sourced internally from the plugin's own
22
20
  * conversation-keyed registry ({@link getLiveGraphMemory}) rather than being
23
21
  * threaded in by the loop — it is memory-retrieval-specific state, not
24
- * something the generic loop or the shared {@link TurnContext} should carry.
22
+ * something the generic loop should carry.
25
23
  */
26
24
 
27
25
  import {
28
26
  applyRuntimeInjections,
29
- type RuntimeInjectionOptions,
27
+ type InboundActorContext,
28
+ type InjectionMode,
30
29
  type RuntimeInjectionResult,
31
30
  } from "../../../../daemon/conversation-runtime-assembly.js";
32
- import { stripHistoricalWebSearchResults } from "../../../../daemon/web-search-history.js";
31
+ import {
32
+ resolveTrustClass,
33
+ type TrustContext,
34
+ } from "../../../../daemon/trust-context.js";
33
35
  import { getLiveGraphMemory } from "../../../../memory/graph/conversation-graph-memory.js";
34
- import type { PluginLogger } from "../../../../plugin-api/types.js";
35
36
  import type { Message } from "../../../../providers/types.js";
36
- import type { TurnContext } from "../../../types.js";
37
37
 
38
38
  /**
39
- * The slice of the hook's context the agent loop supplies from its own working
40
- * state. Re-injection inputs migrate loop-ward by growing this type; the loop
41
- * hands the hook an object of this shape via
42
- * {@link MidLoopCompaction.postCompactionHook}.
39
+ * Everything the post-compaction hook needs, supplied by the agent loop from
40
+ * its own working state. Re-injection inputs migrate loop-ward by growing this
41
+ * type; the loop hands the hook an object of this shape when it calls
42
+ * {@link postCompact} directly.
43
+ *
44
+ * The turn-identity fields are flat here: `conversationId` is the key the
45
+ * re-injection resolves the live conversation through (and the only one that,
46
+ * together with `requestId` and `trust`, cannot be recovered from that live
47
+ * conversation), while `turnIndex` and `callSite` are intentionally omitted so
48
+ * {@link applyRuntimeInjections} self-resolves them from the live conversation.
49
+ * The memory graph handle is likewise sourced internally via
50
+ * {@link getLiveGraphMemory} rather than threaded in.
43
51
  */
44
- export interface PostCompactionHookInput {
52
+ export interface PostCompactContext {
45
53
  /** Compacted message history to re-inject onto. */
46
54
  history: Message[];
47
- /** Per-turn conversation context forwarded to the injector chain. */
48
- turnContext?: TurnContext;
55
+ /**
56
+ * Stable ID for the current request, forwarded onto the injector turn
57
+ * context. The one turn-identity field that cannot be recovered from the
58
+ * live conversation, so the loop supplies it.
59
+ */
60
+ requestId: string | undefined;
61
+ /**
62
+ * Conversation the turn is scoped to. The key the re-injection resolves the
63
+ * live conversation (and its channel/trust/transcript state) through, so the
64
+ * loop always supplies it.
65
+ */
66
+ conversationId: string;
67
+ /**
68
+ * Trust classification and channel identity for the inbound actor, forwarded
69
+ * onto the injector turn context and used to gate the memory-graph re-track.
70
+ * Supplied by the loop as the turn-start snapshot rather than re-resolved
71
+ * mid-turn.
72
+ */
73
+ trust: TrustContext;
74
+ /**
75
+ * Whether the in-flight turn has no human present to answer clarification
76
+ * questions. Resolved once by the agent loop at turn start (from its
77
+ * `isInteractive` option, which can fall back to mutable client/headless
78
+ * state that flips mid-turn on SSE reconnect) and handed to the hook here, so
79
+ * re-injection uses the loop's turn-start snapshot rather than re-reading
80
+ * live conversation state.
81
+ */
82
+ isNonInteractive: boolean;
83
+ /**
84
+ * Injection volume for the re-applied blocks. Owned by the agent loop, which
85
+ * drops to `"minimal"` when overflow reduction trims the prompt; handed to
86
+ * the hook here so re-injection matches the loop's committed decision instead
87
+ * of re-deriving it.
88
+ */
89
+ mode: InjectionMode;
90
+ /**
91
+ * The `model_profile:` turn-context label, or `null` when the active
92
+ * inference profile is unchanged since the last notified one. The agent loop
93
+ * resolves it once at turn start from config and the turn's profile override,
94
+ * and notifies the model only on change — a decision that flips mid-turn once
95
+ * the notification is persisted, so it cannot be re-derived. Handed to the
96
+ * hook here so re-injection re-emits the loop's turn-start value.
97
+ */
98
+ modelProfile: string | null;
99
+ /**
100
+ * Inbound actor identity and trust fields for the unified `<turn_context>`
101
+ * block, or `null` on guardian turns (which suppress the actor section). The
102
+ * agent loop resolves it once at turn start via the actor-trust resolver,
103
+ * whose contact/member registry inputs can be mutated mid-turn by contact
104
+ * tools, so it cannot be re-derived. Handed to the hook here so re-injection
105
+ * re-emits the loop's turn-start value.
106
+ */
107
+ actorContext: InboundActorContext | null;
49
108
  }
50
109
 
51
- /**
52
- * Everything the hook needs in a single context: the loop-supplied
53
- * {@link PostCompactionHookInput}, the resolved {@link RuntimeInjectionOptions}
54
- * (spread top-level so each field stays individually addressable), and the
55
- * conversation-scoped state the options bag cannot carry (actor trust and a
56
- * turn-scoped logger). The memory graph handle is not part of this context —
57
- * the hook sources it internally via {@link getLiveGraphMemory}.
58
- */
59
- export interface PostCompactContext
60
- extends RuntimeInjectionOptions, PostCompactionHookInput {
61
- /** True when the actor for this turn is trusted (guardian-class). */
62
- isTrustedActor: boolean;
63
- /** Turn-scoped logger for diagnostics emitted while re-injecting. */
64
- logger: PluginLogger;
65
- }
66
-
67
- export default async function postCompactReinject(
110
+ export default async function postCompact(
68
111
  ctx: PostCompactContext,
69
112
  ): Promise<RuntimeInjectionResult> {
70
- const { history, isTrustedActor, logger, ...options } = ctx;
71
- const result = await applyRuntimeInjections(history, options);
113
+ const { history, requestId, conversationId, trust, ...options } = ctx;
114
+ // The remaining `options` carry the non-identity injection inputs
115
+ // (`isNonInteractive`, `mode`, `modelProfile`, `actorContext`). Forward the
116
+ // turn-identity fields the live conversation can't supply (`requestId`,
117
+ // `conversationId`, `trust`); `turnIndex` and `callSite` self-resolve from
118
+ // the live conversation so the re-injection matches the turn's initial
119
+ // assembly.
120
+ const result = await applyRuntimeInjections(history, {
121
+ ...options,
122
+ requestId,
123
+ conversationId,
124
+ trust,
125
+ });
72
126
  // Re-track the nodes the memory graph last injected so they survive against
73
127
  // the re-injected history. Untrusted actors and minimal-mode turns never
74
128
  // received a memory-graph injection, so there is nothing to re-track. The
75
- // live graph handle is looked up from the plugin's own registry by the
76
- // turn's conversation id — the same instance the turn's retrieval mutated,
77
- // so re-tracking sees the real cached-node state.
129
+ // actor's trust class is derived from the turn's own trust context (the same
130
+ // value the injector chain resolves). The live graph handle is looked up
131
+ // from the plugin's own registry by the turn's conversation id — the same
132
+ // instance the turn's retrieval mutated, so re-tracking sees the real
133
+ // cached-node state.
134
+ const isTrustedActor = resolveTrustClass(trust) === "guardian";
78
135
  if (isTrustedActor && options.mode !== "minimal") {
79
- getLiveGraphMemory(
80
- options.turnContext?.conversationId,
81
- )?.retrackCachedNodes();
82
- }
83
- const strip = stripHistoricalWebSearchResults(result.messages);
84
- if (strip.stats.blocksStripped > 0) {
85
- logger.info(
86
- { phase: "mid-loop-compact", ...strip.stats },
87
- "Converted historical web_search_tool_result blocks to text summaries",
88
- );
136
+ getLiveGraphMemory(conversationId)?.retrackCachedNodes();
89
137
  }
90
- return { ...result, messages: strip.messages };
138
+ return result;
91
139
  }