@vellumai/assistant 0.8.6 → 0.8.7-dev.202606052118.34cd356

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 (1078) hide show
  1. package/AGENTS.md +4 -4
  2. package/Dockerfile +21 -4
  3. package/bun.lock +13 -4
  4. package/docker-entrypoint.sh +12 -8
  5. package/docker-init-apt-root.sh +3 -1
  6. package/docker-kata-apt-env.sh +3 -1
  7. package/docker-kata-runtime-family.sh +12 -0
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/plugins.md +110 -83
  10. package/examples/plugins/echo/README.md +13 -12
  11. package/examples/plugins/echo/register.ts +0 -54
  12. package/knip.json +1 -0
  13. package/node_modules/@vellumai/environments/bun.lock +24 -0
  14. package/node_modules/@vellumai/environments/package.json +18 -0
  15. package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
  16. package/node_modules/@vellumai/environments/src/index.ts +11 -0
  17. package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
  18. package/node_modules/@vellumai/environments/src/types.ts +70 -0
  19. package/node_modules/@vellumai/environments/tsconfig.json +20 -0
  20. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
  21. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
  22. package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
  23. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +13 -8
  24. package/openapi.yaml +6964 -539
  25. package/package.json +8 -4
  26. package/scripts/generate-openapi.ts +88 -54
  27. package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
  28. package/src/__tests__/agent-loop-exit-reason.test.ts +188 -45
  29. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
  30. package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
  31. package/src/__tests__/agent-loop-provider-error-recording.test.ts +7 -5
  32. package/src/__tests__/agent-loop-thinking.test.ts +17 -12
  33. package/src/__tests__/agent-loop.test.ts +238 -422
  34. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +6 -2
  35. package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
  36. package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
  37. package/src/__tests__/annotate-risk-options.test.ts +2 -3
  38. package/src/__tests__/anthropic-provider.test.ts +296 -57
  39. package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
  40. package/src/__tests__/app-control-flow.test.ts +6 -1
  41. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  42. package/src/__tests__/approval-cascade.test.ts +4 -11
  43. package/src/__tests__/approval-routes-http.test.ts +8 -3
  44. package/src/__tests__/assistant-event-hub.test.ts +25 -0
  45. package/src/__tests__/assistant-event.test.ts +15 -0
  46. package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
  47. package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
  48. package/src/__tests__/assistant-stream-state.test.ts +645 -0
  49. package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
  50. package/src/__tests__/avatar-e2e.test.ts +7 -37
  51. package/src/__tests__/avatar-generator.test.ts +12 -42
  52. package/src/__tests__/avatar-identity-sync.test.ts +28 -3
  53. package/src/__tests__/background-shell-bash.test.ts +3 -7
  54. package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
  55. package/src/__tests__/btw-routes.test.ts +69 -15
  56. package/src/__tests__/build-persisted-content.test.ts +184 -0
  57. package/src/__tests__/call-pointer-messages.test.ts +5 -3
  58. package/src/__tests__/call-site-routing-provider.test.ts +22 -40
  59. package/src/__tests__/catalog-files.test.ts +1 -0
  60. package/src/__tests__/channel-approval-routes.test.ts +49 -21
  61. package/src/__tests__/channel-approvals.test.ts +4 -2
  62. package/src/__tests__/channel-invite-transport.test.ts +1 -5
  63. package/src/__tests__/channel-readiness-routes.test.ts +0 -4
  64. package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
  65. package/src/__tests__/channel-retry-sweep.test.ts +71 -79
  66. package/src/__tests__/clawhub-files.test.ts +1 -0
  67. package/src/__tests__/compaction-circuit.test.ts +258 -0
  68. package/src/__tests__/compaction-direct.test.ts +132 -0
  69. package/src/__tests__/compaction-events.test.ts +5 -17
  70. package/src/__tests__/compaction-trail-store.test.ts +1 -79
  71. package/src/__tests__/compaction.benchmark.test.ts +0 -30
  72. package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
  73. package/src/__tests__/computer-use-tools.test.ts +2 -2
  74. package/src/__tests__/config-watcher.test.ts +28 -0
  75. package/src/__tests__/context-search-agent-runner.test.ts +6 -3
  76. package/src/__tests__/context-token-estimator.test.ts +34 -0
  77. package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
  78. package/src/__tests__/conversation-abort-tool-results.test.ts +70 -25
  79. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +9 -7
  80. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -34
  81. package/src/__tests__/conversation-agent-loop-overflow.test.ts +476 -963
  82. package/src/__tests__/conversation-agent-loop.test.ts +823 -1321
  83. package/src/__tests__/conversation-analysis-routes.test.ts +7 -3
  84. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  85. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  86. package/src/__tests__/conversation-clear-safety.test.ts +20 -10
  87. package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
  88. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  89. package/src/__tests__/conversation-disk-view.test.ts +10 -17
  90. package/src/__tests__/conversation-fork-crud.test.ts +86 -172
  91. package/src/__tests__/conversation-fork-route.test.ts +16 -14
  92. package/src/__tests__/conversation-history-web-search.test.ts +11 -1
  93. package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
  94. package/src/__tests__/conversation-lifecycle.test.ts +3 -2
  95. package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
  96. package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
  97. package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
  98. package/src/__tests__/conversation-pairing.test.ts +10 -7
  99. package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
  100. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -0
  101. package/src/__tests__/conversation-process-callsite.test.ts +27 -30
  102. package/src/__tests__/conversation-provider-retry-repair.test.ts +80 -51
  103. package/src/__tests__/conversation-queue.test.ts +272 -164
  104. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -2
  105. package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
  106. package/src/__tests__/conversation-routes-slash-commands.test.ts +8 -7
  107. package/src/__tests__/conversation-runtime-assembly.test.ts +317 -313
  108. package/src/__tests__/conversation-runtime-workspace.test.ts +114 -36
  109. package/src/__tests__/conversation-slash-commands.test.ts +8 -42
  110. package/src/__tests__/conversation-slash-queue.test.ts +42 -31
  111. package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
  112. package/src/__tests__/conversation-speed-override.test.ts +8 -22
  113. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  114. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +90 -15
  115. package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
  116. package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
  117. package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
  118. package/src/__tests__/conversation-sync-tags.test.ts +27 -15
  119. package/src/__tests__/conversation-title-service.test.ts +135 -2
  120. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
  121. package/src/__tests__/conversation-unread-route.test.ts +14 -2
  122. package/src/__tests__/conversation-usage.test.ts +0 -2
  123. package/src/__tests__/conversation-wipe.test.ts +1 -1
  124. package/src/__tests__/conversation-workspace-cache-state.test.ts +20 -17
  125. package/src/__tests__/conversation-workspace-injection.test.ts +114 -23
  126. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +34 -13
  127. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  128. package/src/__tests__/credential-execution-tools.test.ts +1 -2
  129. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  130. package/src/__tests__/cross-provider-web-search.test.ts +220 -3
  131. package/src/__tests__/cu-unified-flow.test.ts +26 -1
  132. package/src/__tests__/db-acp-history.test.ts +101 -0
  133. package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -0
  134. package/src/__tests__/disk-pressure-guard.test.ts +66 -0
  135. package/src/__tests__/disk-pressure-routes.test.ts +9 -2
  136. package/src/__tests__/dm-persistence.test.ts +12 -3
  137. package/src/__tests__/dynamic-page-surface.test.ts +99 -0
  138. package/src/__tests__/edit-propagation.test.ts +1 -2
  139. package/src/__tests__/empty-response-hook.test.ts +304 -0
  140. package/src/__tests__/feature-flag-test-helpers.ts +2 -2
  141. package/src/__tests__/file-write-tool.test.ts +63 -0
  142. package/src/__tests__/filing-service.test.ts +2 -2
  143. package/src/__tests__/first-greeting.test.ts +55 -14
  144. package/src/__tests__/gemini-image-service.test.ts +13 -0
  145. package/src/__tests__/gemini-inline-media.test.ts +78 -0
  146. package/src/__tests__/gemini-provider.test.ts +351 -28
  147. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  148. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  149. package/src/__tests__/guardian-routing-state.test.ts +60 -71
  150. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -8
  151. package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
  152. package/src/__tests__/heartbeat-service.test.ts +3 -1
  153. package/src/__tests__/helpers/mock-provider.ts +110 -0
  154. package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
  155. package/src/__tests__/history-repair-hook.test.ts +162 -0
  156. package/src/__tests__/history-repair-observability.test.ts +1 -1
  157. package/src/__tests__/history-repair.test.ts +2 -1
  158. package/src/__tests__/host-app-control-proxy.test.ts +2 -0
  159. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  160. package/src/__tests__/host-cu-proxy.test.ts +2 -0
  161. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  162. package/src/__tests__/host-file-edit-tool.test.ts +4 -2
  163. package/src/__tests__/host-file-proxy.test.ts +31 -0
  164. package/src/__tests__/host-file-read-tool.test.ts +4 -2
  165. package/src/__tests__/host-file-write-tool.test.ts +9 -3
  166. package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
  167. package/src/__tests__/host-shell-tool.test.ts +9 -4
  168. package/src/__tests__/http-user-message-parity.test.ts +2 -2
  169. package/src/__tests__/identity-intro-cache.test.ts +47 -114
  170. package/src/__tests__/identity-routes.test.ts +248 -7
  171. package/src/__tests__/inbound-slack-persistence.test.ts +12 -3
  172. package/src/__tests__/injector-background-turn.test.ts +3 -9
  173. package/src/__tests__/injector-chain.test.ts +139 -275
  174. package/src/__tests__/injector-disk-pressure.test.ts +75 -41
  175. package/src/__tests__/injector-document-comments.test.ts +3 -3
  176. package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
  177. package/src/__tests__/injector-v3-suppression.test.ts +214 -0
  178. package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
  179. package/src/__tests__/list-messages-attachments.test.ts +7 -8
  180. package/src/__tests__/list-messages-hidden-metadata.test.ts +55 -15
  181. package/src/__tests__/list-messages-page-latest.test.ts +60 -1
  182. package/src/__tests__/list-messages-tool-merge.test.ts +56 -6
  183. package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
  184. package/src/__tests__/llm-resolver.test.ts +23 -47
  185. package/src/__tests__/llm-usage-store.test.ts +268 -1
  186. package/src/__tests__/log-export-routes.test.ts +59 -0
  187. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
  188. package/src/__tests__/mcp-auth-routes.test.ts +15 -10
  189. package/src/__tests__/mcp-health-check.test.ts +18 -13
  190. package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
  191. package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
  192. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  193. package/src/__tests__/migration-export-http.test.ts +12 -12
  194. package/src/__tests__/migration-import-commit-http.test.ts +8 -8
  195. package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
  196. package/src/__tests__/migration-validate-http.test.ts +3 -3
  197. package/src/__tests__/native-web-search.test.ts +205 -20
  198. package/src/__tests__/notification-decision-identity.test.ts +9 -18
  199. package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
  200. package/src/__tests__/oauth-commands-routes.test.ts +1 -1
  201. package/src/__tests__/onboarding-template-contract.test.ts +12 -0
  202. package/src/__tests__/openai-image-service.test.ts +17 -0
  203. package/src/__tests__/openai-provider.test.ts +97 -71
  204. package/src/__tests__/openai-responses-provider.test.ts +21 -77
  205. package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
  206. package/src/__tests__/{overflow-reduce-pipeline.test.ts → overflow-reduction-loop.test.ts} +64 -286
  207. package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
  208. package/src/__tests__/persist-unsendable-image.test.ts +215 -0
  209. package/src/__tests__/persistence-secret-redaction.test.ts +3 -1
  210. package/src/__tests__/pipeline-runner.test.ts +31 -43
  211. package/src/__tests__/pkb-autoinject.test.ts +2 -5
  212. package/src/__tests__/plugin-bootstrap.test.ts +62 -51
  213. package/src/__tests__/plugin-registry.test.ts +0 -27
  214. package/src/__tests__/plugin-route-contribution.test.ts +6 -16
  215. package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
  216. package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
  217. package/src/__tests__/plugin-types.test.ts +8 -173
  218. package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
  219. package/src/__tests__/process-message-background-slack.test.ts +17 -16
  220. package/src/__tests__/process-message-display-content.test.ts +36 -44
  221. package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
  222. package/src/__tests__/provider-error-scenarios.test.ts +7 -6
  223. package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
  224. package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
  225. package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
  226. package/src/__tests__/provider-usage-tracking.test.ts +0 -6
  227. package/src/__tests__/ratelimit.test.ts +9 -4
  228. package/src/__tests__/reaction-persistence.test.ts +1 -1
  229. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
  230. package/src/__tests__/relay-server.test.ts +20 -13
  231. package/src/__tests__/resolve-trust-class.test.ts +4 -4
  232. package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
  233. package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
  234. package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
  235. package/src/__tests__/runtime-events-sse-reconnect.test.ts +390 -0
  236. package/src/__tests__/schedule-routes.test.ts +683 -12
  237. package/src/__tests__/schedule-store.test.ts +108 -0
  238. package/src/__tests__/schedule-tools.test.ts +160 -0
  239. package/src/__tests__/secret-ingress-http.test.ts +2 -2
  240. package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
  241. package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
  242. package/src/__tests__/secret-response-routing.test.ts +13 -11
  243. package/src/__tests__/send-endpoint-busy.test.ts +6 -2
  244. package/src/__tests__/server-history-render.test.ts +314 -1
  245. package/src/__tests__/shell-observability.test.ts +249 -0
  246. package/src/__tests__/skill-feature-flags-integration.test.ts +44 -11
  247. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  248. package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
  249. package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
  250. package/src/__tests__/skillssh-files.test.ts +1 -0
  251. package/src/__tests__/starter-task-flow.test.ts +6 -6
  252. package/src/__tests__/strip-memory-injections.test.ts +102 -14
  253. package/src/__tests__/subagent-call-site-routing.test.ts +3 -3
  254. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  255. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  256. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  257. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  258. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  259. package/src/__tests__/suggestion-routes.test.ts +3 -3
  260. package/src/__tests__/sync-message-contract.test.ts +19 -16
  261. package/src/__tests__/system-prompt.test.ts +74 -0
  262. package/src/__tests__/task-scheduler.test.ts +162 -1
  263. package/src/__tests__/terminal-tools.test.ts +9 -25
  264. package/src/__tests__/thread-backfill.test.ts +4 -9
  265. package/src/__tests__/title-generate-hook.test.ts +319 -0
  266. package/src/__tests__/tool-error-hook.test.ts +278 -0
  267. package/src/__tests__/tool-preview-lifecycle.test.ts +481 -16
  268. package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
  269. package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
  270. package/src/__tests__/tool-result-truncation.test.ts +1 -1
  271. package/src/__tests__/tools-audio-read.test.ts +113 -0
  272. package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
  273. package/src/__tests__/turn-events-store.test.ts +11 -7
  274. package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
  275. package/src/__tests__/ui-work-result-surface.test.ts +159 -0
  276. package/src/__tests__/usage-routes.test.ts +285 -1
  277. package/src/__tests__/user-plugin-loader.test.ts +2 -2
  278. package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
  279. package/src/__tests__/voice-session-bridge.test.ts +19 -10
  280. package/src/__tests__/web-search-backend-failure.test.ts +166 -0
  281. package/src/acp/__tests__/agent-process.test.ts +161 -0
  282. package/src/acp/__tests__/client-handler.test.ts +40 -0
  283. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  284. package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
  285. package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
  286. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  287. package/src/acp/__tests__/session-manager-resume.test.ts +695 -0
  288. package/src/acp/agent-process.ts +61 -1
  289. package/src/acp/auto-install.test.ts +125 -0
  290. package/src/acp/auto-install.ts +174 -0
  291. package/src/acp/client-handler.ts +31 -0
  292. package/src/acp/feature-gate.test.ts +48 -0
  293. package/src/acp/feature-gate.ts +34 -0
  294. package/src/acp/prepare-agent-env.ts +52 -11
  295. package/src/acp/resolve-agent.test.ts +147 -6
  296. package/src/acp/resolve-agent.ts +81 -7
  297. package/src/acp/resume-hint.ts +22 -0
  298. package/src/acp/session-manager.ts +487 -71
  299. package/src/agent/compaction-circuit.ts +98 -0
  300. package/src/agent/loop.ts +651 -450
  301. package/src/api/README.md +19 -17
  302. package/src/api/constants/tool-execution.ts +21 -0
  303. package/src/api/events/assistant-activity-state.ts +75 -0
  304. package/src/api/events/assistant-outbound-attachment.ts +25 -27
  305. package/src/api/events/assistant-text-delta.ts +6 -8
  306. package/src/api/events/assistant-thinking-delta.ts +33 -0
  307. package/src/api/events/assistant-turn-start.ts +5 -7
  308. package/src/api/events/avatar-updated.ts +24 -0
  309. package/src/api/events/compaction-circuit-closed.ts +26 -0
  310. package/src/api/events/compaction-circuit-open.ts +28 -0
  311. package/src/api/events/confirmation-request.ts +114 -0
  312. package/src/api/events/contact-request.ts +33 -0
  313. package/src/api/events/conversation-error.ts +77 -0
  314. package/src/api/events/conversation-list-invalidated.ts +38 -0
  315. package/src/api/events/conversation-title-updated.ts +24 -0
  316. package/src/api/events/disk-pressure-status-changed.ts +61 -0
  317. package/src/api/events/document-comment-created.ts +24 -28
  318. package/src/api/events/document-comment-deleted.ts +6 -8
  319. package/src/api/events/document-comment-reopened.ts +6 -8
  320. package/src/api/events/document-comment-resolved.ts +8 -10
  321. package/src/api/events/document-editor-update.ts +27 -0
  322. package/src/api/events/error.ts +32 -0
  323. package/src/api/events/generation-cancelled.ts +4 -6
  324. package/src/api/events/generation-handoff.ts +13 -15
  325. package/src/api/events/home-feed-updated.ts +26 -0
  326. package/src/api/events/identity-changed.ts +32 -0
  327. package/src/api/events/interaction-resolved.ts +50 -0
  328. package/src/api/events/message-complete.ts +10 -12
  329. package/src/api/events/message-dequeued.ts +21 -0
  330. package/src/api/events/message-queued-deleted.ts +23 -0
  331. package/src/api/events/message-queued.ts +22 -0
  332. package/src/api/events/message-request-complete.ts +29 -0
  333. package/src/api/events/navigate-settings.ts +20 -0
  334. package/src/api/events/notification-intent.ts +33 -0
  335. package/src/api/events/open-url.ts +6 -8
  336. package/src/api/events/question-request.ts +67 -0
  337. package/src/api/events/relationship-state-updated.ts +4 -6
  338. package/src/api/events/secret-request.ts +42 -0
  339. package/src/api/events/subagent-event.ts +79 -0
  340. package/src/api/events/subagent-spawned.ts +40 -0
  341. package/src/api/events/subagent-status-changed.ts +65 -0
  342. package/src/api/events/sync-changed.ts +29 -0
  343. package/src/api/events/tool-output-chunk.ts +45 -0
  344. package/src/api/events/tool-result.ts +129 -0
  345. package/src/api/events/tool-use-preview-start.ts +32 -0
  346. package/src/api/events/tool-use-start.ts +8 -10
  347. package/src/api/events/trace-event.ts +69 -0
  348. package/src/api/events/turn-profile-auto-routed.ts +28 -0
  349. package/src/api/events/ui-surface-complete.ts +30 -0
  350. package/src/api/events/ui-surface-dismiss.ts +22 -0
  351. package/src/api/events/ui-surface-show.ts +67 -0
  352. package/src/api/events/ui-surface-update.ts +26 -0
  353. package/src/api/events/usage-update.ts +34 -0
  354. package/src/api/events/user-message-echo.ts +35 -0
  355. package/src/api/index.ts +389 -0
  356. package/src/api/requests/dictation.ts +45 -0
  357. package/src/api/responses/conversation-message.ts +374 -0
  358. package/src/api/responses/disk-pressure-status.ts +26 -0
  359. package/src/api/responses/home.ts +217 -0
  360. package/src/api/responses/llm-context-response.ts +2 -0
  361. package/src/api/responses/memory-v3-selection-log.ts +50 -0
  362. package/src/api/responses/subagent-detail.ts +48 -0
  363. package/src/approvals/guardian-decision-primitive.ts +7 -15
  364. package/src/approvals/guardian-request-resolvers.ts +7 -10
  365. package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
  366. package/src/avatar/__tests__/avatar-store.test.ts +198 -0
  367. package/src/avatar/avatar-manifest.ts +195 -0
  368. package/src/avatar/avatar-store.ts +113 -0
  369. package/src/avatar/traits-png-sync.ts +8 -2
  370. package/src/background-wake/next-wake.test.ts +31 -1
  371. package/src/background-wake/next-wake.ts +5 -1
  372. package/src/calls/call-conversation-messages.ts +6 -4
  373. package/src/calls/guardian-action-sweep.ts +6 -4
  374. package/src/calls/relay-server.ts +12 -8
  375. package/src/calls/voice-session-bridge.ts +13 -27
  376. package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
  377. package/src/cli/commands/__tests__/notifications.test.ts +58 -14
  378. package/src/cli/commands/avatar.ts +17 -11
  379. package/src/cli/commands/conversations.ts +15 -1
  380. package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
  381. package/src/cli/commands/db/__tests__/status.test.ts +253 -0
  382. package/src/cli/commands/db/format.ts +48 -0
  383. package/src/cli/commands/db/index.ts +29 -0
  384. package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
  385. package/src/cli/commands/db/repair-step-integrity.ts +146 -0
  386. package/src/cli/commands/db/repair-steps.ts +164 -0
  387. package/src/cli/commands/db/repair.ts +141 -0
  388. package/src/cli/commands/db/status.ts +366 -0
  389. package/src/cli/commands/memory-v3.ts +159 -445
  390. package/src/cli/commands/notifications.ts +112 -60
  391. package/src/cli/lib/cli-colors.ts +24 -6
  392. package/src/cli/program.ts +4 -5
  393. package/src/config/__tests__/feature-flag-registry-guard.test.ts +4 -4
  394. package/src/config/acp-defaults.test.ts +10 -0
  395. package/src/config/acp-defaults.ts +6 -0
  396. package/src/config/assistant-feature-flags.ts +24 -13
  397. package/src/config/bundled-skills/acp/SKILL.md +64 -30
  398. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  399. package/src/config/bundled-skills/app-builder/SKILL.md +224 -387
  400. package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
  401. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  402. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  403. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  404. package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
  405. package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
  406. package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
  407. package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
  408. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  409. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  410. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  411. package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
  412. package/src/config/bundled-skills/messaging/SKILL.md +0 -7
  413. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
  414. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  415. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  416. package/src/config/bundled-tool-registry.ts +2 -0
  417. package/src/config/call-site-defaults.ts +2 -7
  418. package/src/config/feature-flag-cache.ts +3 -3
  419. package/src/config/feature-flag-registry.json +68 -12
  420. package/src/config/schemas/__tests__/memory-v2.test.ts +2 -226
  421. package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
  422. package/src/config/schemas/call-site-catalog.ts +8 -15
  423. package/src/config/schemas/heartbeat.ts +9 -0
  424. package/src/config/schemas/llm.ts +3 -3
  425. package/src/config/schemas/memory-lifecycle.ts +24 -0
  426. package/src/config/schemas/memory-v2.ts +8 -253
  427. package/src/config/schemas/memory-v3.ts +47 -0
  428. package/src/config/schemas/memory.ts +6 -1
  429. package/src/config/schemas/platform.ts +8 -0
  430. package/src/config/schemas/timeouts.ts +3 -1
  431. package/src/config/seed-inference-profiles.ts +2 -2
  432. package/src/config/skills.ts +13 -0
  433. package/src/context/compactor.ts +55 -32
  434. package/src/context/strip-injections.ts +128 -0
  435. package/src/context/token-estimator.ts +42 -0
  436. package/src/context/tool-result-truncation.ts +1 -66
  437. package/src/context/window-manager.ts +141 -26
  438. package/src/credential-execution/executable-discovery.ts +16 -0
  439. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
  440. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
  441. package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
  442. package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
  443. package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
  444. package/src/daemon/approval-generators.ts +4 -4
  445. package/src/daemon/assistant-attachments.ts +1 -1
  446. package/src/daemon/config-watcher.ts +7 -1
  447. package/src/daemon/context-overflow-reducer.ts +0 -1
  448. package/src/daemon/conversation-agent-loop-handlers.ts +793 -215
  449. package/src/daemon/conversation-agent-loop.ts +487 -1478
  450. package/src/daemon/conversation-error.ts +7 -7
  451. package/src/daemon/conversation-history.ts +27 -10
  452. package/src/daemon/conversation-launch.ts +4 -8
  453. package/src/daemon/conversation-lifecycle.ts +13 -42
  454. package/src/daemon/conversation-messaging.ts +8 -9
  455. package/src/daemon/conversation-notifiers.ts +7 -5
  456. package/src/daemon/conversation-process.ts +109 -93
  457. package/src/daemon/conversation-registry.ts +159 -0
  458. package/src/daemon/conversation-runtime-assembly.ts +209 -382
  459. package/src/daemon/conversation-slash.ts +6 -25
  460. package/src/daemon/conversation-store.ts +15 -95
  461. package/src/daemon/conversation-surfaces.ts +277 -73
  462. package/src/daemon/conversation-tool-setup.ts +5 -29
  463. package/src/daemon/conversation-workspace.ts +17 -0
  464. package/src/daemon/conversation.ts +123 -146
  465. package/src/daemon/daemon-skill-host.ts +2 -6
  466. package/src/daemon/disk-pressure-guard.ts +35 -29
  467. package/src/daemon/external-plugins-bootstrap.ts +53 -32
  468. package/src/daemon/first-greeting.ts +26 -4
  469. package/src/daemon/guardian-action-generators.ts +2 -2
  470. package/src/daemon/handlers/config-a2a.ts +51 -36
  471. package/src/daemon/handlers/config-slack-channel.ts +20 -14
  472. package/src/daemon/handlers/config-telegram.ts +16 -2
  473. package/src/daemon/handlers/conversations.ts +9 -23
  474. package/src/daemon/handlers/shared.ts +158 -82
  475. package/src/daemon/handlers/skills.ts +53 -20
  476. package/src/daemon/host-app-control-proxy.ts +54 -1
  477. package/src/daemon/host-cu-proxy.ts +46 -22
  478. package/src/daemon/host-file-proxy.ts +25 -1
  479. package/src/daemon/host-proxy-preactivation.ts +25 -6
  480. package/src/daemon/lifecycle.ts +53 -55
  481. package/src/daemon/message-protocol.ts +2 -3
  482. package/src/daemon/message-provenance.ts +49 -0
  483. package/src/daemon/message-types/apps.ts +1 -29
  484. package/src/daemon/message-types/contacts.ts +3 -20
  485. package/src/daemon/message-types/conversations.ts +13 -111
  486. package/src/daemon/message-types/documents.ts +3 -9
  487. package/src/daemon/message-types/home.ts +4 -17
  488. package/src/daemon/message-types/integrations.ts +2 -6
  489. package/src/daemon/message-types/messages.ts +37 -400
  490. package/src/daemon/message-types/notifications.ts +2 -32
  491. package/src/daemon/message-types/settings.ts +3 -8
  492. package/src/daemon/message-types/skills.ts +4 -0
  493. package/src/daemon/message-types/surfaces.ts +138 -3
  494. package/src/daemon/message-types/sync.ts +12 -25
  495. package/src/daemon/message-types/workspace.ts +3 -11
  496. package/src/daemon/now-scratchpad.ts +21 -0
  497. package/src/daemon/orphan-reaper.test.ts +210 -0
  498. package/src/daemon/orphan-reaper.ts +240 -0
  499. package/src/daemon/overflow-reduction-loop.ts +230 -0
  500. package/src/daemon/persist-unsendable-image.ts +117 -0
  501. package/src/daemon/process-message.ts +50 -49
  502. package/src/daemon/server.ts +14 -0
  503. package/src/daemon/tool-side-effects.ts +10 -7
  504. package/src/daemon/trace-emitter.ts +6 -4
  505. package/src/daemon/trust-context.ts +32 -0
  506. package/src/daemon/wake-target-adapter.ts +14 -2
  507. package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -1
  508. package/src/heartbeat/heartbeat-run-store.ts +54 -1
  509. package/src/heartbeat/heartbeat-service.ts +42 -0
  510. package/src/home/feed-types.ts +36 -221
  511. package/src/home/home-greeting-cache.ts +24 -1
  512. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  513. package/src/ipc/__tests__/email-ipc.test.ts +0 -9
  514. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  515. package/src/ipc/gateway-client.test.ts +2 -2
  516. package/src/ipc/gateway-client.ts +3 -3
  517. package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
  518. package/src/ipc/routes/route-adapter.ts +45 -6
  519. package/src/ipc/skill-routes/__tests__/memory.test.ts +33 -9
  520. package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
  521. package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
  522. package/src/ipc/skill-routes/memory.ts +29 -14
  523. package/src/ipc/skill-routes/providers.ts +5 -6
  524. package/src/ipc/skill-routes/registries.ts +13 -61
  525. package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
  526. package/src/media/gemini-image-service.ts +15 -0
  527. package/src/media/openai-image-service.ts +14 -0
  528. package/src/media/types.ts +34 -0
  529. package/src/memory/__tests__/conversation-queries.test.ts +192 -8
  530. package/src/memory/__tests__/db-maintenance.test.ts +128 -0
  531. package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
  532. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
  533. package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
  534. package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
  535. package/src/memory/auth-fallback-events-store.ts +94 -0
  536. package/src/memory/context-search/agent-runner.ts +2 -4
  537. package/src/memory/conversation-crud.ts +39 -8
  538. package/src/memory/conversation-queries.ts +78 -22
  539. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  540. package/src/memory/conversation-title-service.ts +65 -41
  541. package/src/memory/db-init.ts +14 -0
  542. package/src/memory/db-maintenance.ts +18 -2
  543. package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
  544. package/src/memory/graph/consolidation.ts +8 -11
  545. package/src/memory/graph/conversation-graph-memory.ts +106 -8
  546. package/src/memory/graph/extraction.ts +6 -9
  547. package/src/memory/graph/narrative.ts +2 -2
  548. package/src/memory/graph/pattern-scan.ts +2 -2
  549. package/src/memory/graph/retriever.ts +20 -26
  550. package/src/memory/graph/tools.ts +4 -4
  551. package/src/memory/job-handlers/conversation-starters.ts +45 -34
  552. package/src/memory/job-handlers/summarization.ts +1 -2
  553. package/src/memory/jobs-store.ts +36 -1
  554. package/src/memory/jobs-worker.ts +82 -43
  555. package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
  556. package/src/memory/llm-request-log-source-local.ts +0 -11
  557. package/src/memory/llm-request-log-source.ts +9 -25
  558. package/src/memory/llm-request-log-store.ts +0 -41
  559. package/src/memory/llm-usage-store.ts +234 -50
  560. package/src/memory/memory-marker.ts +17 -0
  561. package/src/memory/memory-retrospective-job.ts +6 -2
  562. package/src/memory/memory-v2-activation-log-store.ts +1 -83
  563. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
  564. package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
  565. package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
  566. package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
  567. package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
  568. package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
  569. package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
  570. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  571. package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
  572. package/src/memory/migrations/index.ts +7 -0
  573. package/src/memory/pkb/autoinject.ts +61 -0
  574. package/src/memory/pkb/context.ts +50 -0
  575. package/src/memory/pkb/types.ts +14 -0
  576. package/src/memory/schedule-attribution-sql.ts +104 -0
  577. package/src/memory/schema/acp.ts +4 -0
  578. package/src/memory/schema/infrastructure.ts +27 -0
  579. package/src/memory/usage-grouped-buckets.ts +6 -1
  580. package/src/memory/v2/__tests__/consolidation-job.test.ts +125 -1
  581. package/src/memory/v2/__tests__/migration.test.ts +11 -3
  582. package/src/memory/v2/__tests__/page-index.test.ts +37 -1
  583. package/src/memory/v2/__tests__/router.test.ts +14 -4
  584. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
  585. package/src/memory/v2/backfill-jobs.ts +6 -0
  586. package/src/memory/v2/consolidation-job.ts +99 -10
  587. package/src/memory/v2/migration.ts +5 -3
  588. package/src/memory/v2/page-index.ts +11 -0
  589. package/src/memory/v2/router.ts +8 -11
  590. package/src/memory/v2/sweep-job.ts +8 -11
  591. package/src/memory/v2/types.ts +1 -0
  592. package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
  593. package/src/messaging/providers/slack/render-transcript.ts +2 -2
  594. package/src/messaging/style-analyzer.ts +8 -11
  595. package/src/notifications/conversation-pairing.ts +8 -13
  596. package/src/notifications/decision-engine.ts +16 -16
  597. package/src/notifications/home-feed-side-effect.ts +12 -1
  598. package/src/notifications/preference-extractor.ts +11 -14
  599. package/src/permissions/prompter.ts +46 -36
  600. package/src/permissions/question-prompter.test.ts +35 -26
  601. package/src/permissions/question-prompter.ts +6 -10
  602. package/src/plugin-api/constants.ts +4 -0
  603. package/src/plugin-api/index.ts +10 -1
  604. package/src/plugin-api/types.ts +176 -4
  605. package/src/plugins/defaults/compaction/compact.ts +59 -0
  606. package/src/plugins/defaults/compaction/package.json +15 -0
  607. package/src/plugins/defaults/compaction/register.ts +24 -0
  608. package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
  609. package/src/plugins/defaults/empty-response/package.json +15 -0
  610. package/src/plugins/defaults/empty-response/register.ts +23 -0
  611. package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
  612. package/src/plugins/defaults/history-repair/package.json +15 -0
  613. package/src/plugins/defaults/history-repair/register.ts +24 -0
  614. package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
  615. package/src/plugins/defaults/index.ts +22 -49
  616. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +95 -0
  617. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
  618. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
  619. package/src/plugins/defaults/{injectors.ts → memory-retrieval/injectors.ts} +295 -112
  620. package/src/plugins/defaults/memory-v3-shadow/__tests__/assign.test.ts +242 -0
  621. package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +118 -0
  622. package/src/plugins/defaults/memory-v3-shadow/__tests__/core.test.ts +39 -0
  623. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +36 -0
  624. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +37 -0
  625. package/src/plugins/defaults/memory-v3-shadow/__tests__/health.test.ts +219 -0
  626. package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +330 -0
  627. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +288 -0
  628. package/src/plugins/defaults/memory-v3-shadow/__tests__/needle.test.ts +107 -0
  629. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +436 -0
  630. package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
  631. package/src/plugins/defaults/memory-v3-shadow/__tests__/reconcile.test.ts +274 -0
  632. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +61 -0
  633. package/src/plugins/defaults/memory-v3-shadow/__tests__/router.test.ts +332 -0
  634. package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +179 -0
  635. package/src/plugins/defaults/memory-v3-shadow/__tests__/selector.test.ts +470 -0
  636. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +432 -0
  637. package/src/plugins/defaults/memory-v3-shadow/__tests__/snapshot.test.ts +168 -0
  638. package/src/plugins/defaults/memory-v3-shadow/__tests__/tree.test.ts +192 -0
  639. package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +54 -0
  640. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +106 -0
  641. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +44 -0
  642. package/src/plugins/defaults/memory-v3-shadow/assign.ts +268 -0
  643. package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +124 -0
  644. package/src/plugins/defaults/memory-v3-shadow/core.ts +26 -0
  645. package/src/plugins/defaults/memory-v3-shadow/data/README.md +84 -0
  646. package/src/plugins/defaults/memory-v3-shadow/data/assignments.json +5 -0
  647. package/src/plugins/defaults/memory-v3-shadow/data/core.json +1 -0
  648. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-x.md +9 -0
  649. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-y.md +9 -0
  650. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-b/topic-z.md +9 -0
  651. package/src/plugins/defaults/memory-v3-shadow/health.ts +0 -0
  652. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  653. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  654. package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
  655. package/src/plugins/defaults/memory-v3-shadow/llm-retry.ts +32 -0
  656. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +314 -0
  657. package/src/plugins/defaults/memory-v3-shadow/needle.ts +115 -0
  658. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +126 -0
  659. package/src/plugins/defaults/memory-v3-shadow/package.json +15 -0
  660. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +34 -0
  661. package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
  662. package/src/plugins/defaults/memory-v3-shadow/reconcile.ts +523 -0
  663. package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
  664. package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +32 -0
  665. package/src/plugins/defaults/memory-v3-shadow/router.ts +190 -0
  666. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +84 -0
  667. package/src/plugins/defaults/memory-v3-shadow/selector.ts +226 -0
  668. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +349 -0
  669. package/src/plugins/defaults/memory-v3-shadow/snapshot.ts +209 -0
  670. package/src/plugins/defaults/memory-v3-shadow/tree.ts +174 -0
  671. package/src/plugins/defaults/memory-v3-shadow/types.ts +59 -0
  672. package/src/plugins/defaults/memory-v3-shadow/working-set.ts +88 -0
  673. package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
  674. package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
  675. package/src/plugins/defaults/title-generate/package.json +15 -0
  676. package/src/plugins/defaults/title-generate/register.ts +35 -0
  677. package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
  678. package/src/plugins/defaults/tool-error/package.json +15 -0
  679. package/src/plugins/defaults/tool-error/register.ts +23 -0
  680. package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
  681. package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
  682. package/src/plugins/defaults/tool-result-truncate/register.ts +24 -0
  683. package/src/plugins/defaults/tool-result-truncate/terminal.ts +132 -0
  684. package/src/plugins/external-plugin-loader.ts +2 -2
  685. package/src/plugins/pipeline.ts +8 -35
  686. package/src/plugins/registry.ts +8 -25
  687. package/src/plugins/types.ts +62 -721
  688. package/src/plugins/user-loader.ts +4 -3
  689. package/src/proactive-artifact/aux-message-injector.ts +4 -5
  690. package/src/proactive-artifact/job.test.ts +28 -21
  691. package/src/proactive-artifact/job.ts +3 -1
  692. package/src/prompts/__tests__/system-prompt.test.ts +42 -0
  693. package/src/prompts/sections.ts +20 -7
  694. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
  695. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
  696. package/src/prompts/templates/BOOTSTRAP.md +7 -3
  697. package/src/prompts/templates/system-sections.ts +21 -0
  698. package/src/providers/__tests__/retry-callsite.test.ts +25 -25
  699. package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
  700. package/src/providers/anthropic/client.ts +61 -34
  701. package/src/providers/call-site-routing.ts +1 -9
  702. package/src/providers/gemini/client.ts +152 -34
  703. package/src/providers/gemini/inline-media.ts +74 -0
  704. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -2
  705. package/src/providers/openai/chat-completions-provider.ts +45 -4
  706. package/src/providers/openai/responses-provider.ts +1 -4
  707. package/src/providers/openrouter/client.ts +2 -6
  708. package/src/providers/placeholder-sentinels.ts +35 -0
  709. package/src/providers/provider-send-message.ts +6 -6
  710. package/src/providers/ratelimit.ts +1 -9
  711. package/src/providers/retry.ts +0 -5
  712. package/src/providers/types.ts +11 -2
  713. package/src/providers/usage-tracking.ts +1 -9
  714. package/src/runtime/__tests__/agent-wake.test.ts +141 -32
  715. package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
  716. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  717. package/src/runtime/agent-wake.ts +95 -23
  718. package/src/runtime/assistant-event-hub.ts +38 -8
  719. package/src/runtime/assistant-stream-state.ts +368 -0
  720. package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
  721. package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
  722. package/src/runtime/auth/route-policy.ts +42 -1079
  723. package/src/runtime/background-job-runner.ts +1 -4
  724. package/src/runtime/btw-sidechain.ts +3 -1
  725. package/src/runtime/channel-approvals.ts +4 -15
  726. package/src/runtime/channel-invite-transport.ts +5 -6
  727. package/src/runtime/channel-readiness-service.ts +2 -5
  728. package/src/runtime/channel-retry-sweep.ts +12 -16
  729. package/src/runtime/http-router.ts +35 -43
  730. package/src/runtime/http-types.ts +23 -71
  731. package/src/runtime/interactive-ui.ts +1 -1
  732. package/src/runtime/invite-instruction-generator.ts +3 -3
  733. package/src/runtime/pending-interactions.ts +3 -2
  734. package/src/runtime/routes/__tests__/acp-routes.test.ts +253 -55
  735. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
  736. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
  737. package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
  738. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
  739. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
  740. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
  741. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
  742. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
  743. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
  744. package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
  745. package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
  746. package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
  747. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  748. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  749. package/src/runtime/routes/__tests__/tts-routes.test.ts +9 -5
  750. package/src/runtime/routes/acp-routes.test.ts +186 -100
  751. package/src/runtime/routes/acp-routes.ts +110 -35
  752. package/src/runtime/routes/app-management-routes.ts +93 -131
  753. package/src/runtime/routes/app-routes.ts +38 -20
  754. package/src/runtime/routes/approval-routes.ts +17 -5
  755. package/src/runtime/routes/attachment-routes.ts +51 -16
  756. package/src/runtime/routes/audio-routes.ts +1 -0
  757. package/src/runtime/routes/audit-routes.ts +5 -0
  758. package/src/runtime/routes/auth-routes.ts +5 -0
  759. package/src/runtime/routes/avatar-routes.ts +264 -59
  760. package/src/runtime/routes/background-tool-routes.ts +9 -0
  761. package/src/runtime/routes/background-wake-routes.ts +13 -3
  762. package/src/runtime/routes/backup-routes.ts +45 -0
  763. package/src/runtime/routes/bookmark-routes.ts +13 -0
  764. package/src/runtime/routes/brain-graph-routes.ts +9 -0
  765. package/src/runtime/routes/browser-routes.ts +6 -1
  766. package/src/runtime/routes/browser-tabs-routes.ts +11 -10
  767. package/src/runtime/routes/btw-routes.ts +34 -24
  768. package/src/runtime/routes/cache-routes.ts +13 -0
  769. package/src/runtime/routes/call-routes.ts +21 -10
  770. package/src/runtime/routes/channel-availability-routes.ts +5 -1
  771. package/src/runtime/routes/channel-readiness-routes.ts +37 -4
  772. package/src/runtime/routes/channel-route-definitions.ts +21 -0
  773. package/src/runtime/routes/channel-verification-routes.ts +21 -0
  774. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
  775. package/src/runtime/routes/client-routes.ts +9 -0
  776. package/src/runtime/routes/consolidation-routes.ts +133 -25
  777. package/src/runtime/routes/contact-prompt-routes.ts +9 -0
  778. package/src/runtime/routes/contact-routes.ts +90 -23
  779. package/src/runtime/routes/content-source-routes.ts +5 -1
  780. package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
  781. package/src/runtime/routes/conversation-attention-routes.ts +5 -0
  782. package/src/runtime/routes/conversation-cli-routes.ts +54 -7
  783. package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
  784. package/src/runtime/routes/conversation-list-routes.ts +81 -12
  785. package/src/runtime/routes/conversation-management-routes.ts +57 -14
  786. package/src/runtime/routes/conversation-query-routes.ts +90 -41
  787. package/src/runtime/routes/conversation-routes.ts +446 -204
  788. package/src/runtime/routes/conversation-starter-routes.ts +35 -20
  789. package/src/runtime/routes/conversations-import-routes.ts +30 -8
  790. package/src/runtime/routes/credential-prompt-routes.ts +5 -0
  791. package/src/runtime/routes/credential-routes.ts +25 -6
  792. package/src/runtime/routes/debug-bash-routes.ts +5 -0
  793. package/src/runtime/routes/debug-routes.ts +11 -2
  794. package/src/runtime/routes/defer-routes.ts +13 -0
  795. package/src/runtime/routes/diagnostics-routes.ts +37 -46
  796. package/src/runtime/routes/disk-pressure-routes.ts +17 -31
  797. package/src/runtime/routes/document-comments-routes.ts +46 -27
  798. package/src/runtime/routes/documents-routes.ts +25 -10
  799. package/src/runtime/routes/domain-routes.ts +98 -51
  800. package/src/runtime/routes/email-routes.ts +33 -0
  801. package/src/runtime/routes/epoch-millis-range.ts +34 -0
  802. package/src/runtime/routes/events-routes.ts +107 -8
  803. package/src/runtime/routes/filing-routes.ts +9 -4
  804. package/src/runtime/routes/gateway-log-routes.ts +31 -4
  805. package/src/runtime/routes/global-search-routes.ts +53 -50
  806. package/src/runtime/routes/group-routes.ts +21 -5
  807. package/src/runtime/routes/guardian-action-routes.ts +9 -0
  808. package/src/runtime/routes/guardian-approval-interception.ts +0 -31
  809. package/src/runtime/routes/heartbeat-routes.ts +57 -21
  810. package/src/runtime/routes/home-feed-routes.ts +23 -19
  811. package/src/runtime/routes/home-state-routes.ts +8 -40
  812. package/src/runtime/routes/host-app-control-routes.ts +6 -1
  813. package/src/runtime/routes/host-bash-routes.ts +5 -0
  814. package/src/runtime/routes/host-browser-routes.ts +13 -0
  815. package/src/runtime/routes/host-cu-routes.ts +6 -1
  816. package/src/runtime/routes/host-file-routes.ts +26 -6
  817. package/src/runtime/routes/host-transfer-routes.ts +13 -2
  818. package/src/runtime/routes/http-adapter.ts +1 -2
  819. package/src/runtime/routes/identity-intro-cache.ts +28 -40
  820. package/src/runtime/routes/identity-routes.ts +236 -20
  821. package/src/runtime/routes/image-generation-routes.ts +45 -2
  822. package/src/runtime/routes/inbound-message-handler.ts +16 -12
  823. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
  824. package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
  825. package/src/runtime/routes/index.ts +2 -0
  826. package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
  827. package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
  828. package/src/runtime/routes/inference-send-routes.ts +11 -11
  829. package/src/runtime/routes/integrations/a2a.ts +32 -7
  830. package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
  831. package/src/runtime/routes/integrations/slack/channel.ts +23 -3
  832. package/src/runtime/routes/integrations/slack/share.ts +36 -8
  833. package/src/runtime/routes/integrations/telegram.ts +34 -9
  834. package/src/runtime/routes/integrations/twilio.ts +77 -7
  835. package/src/runtime/routes/integrations/vercel.ts +3 -3
  836. package/src/runtime/routes/internal-oauth-routes.ts +5 -0
  837. package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
  838. package/src/runtime/routes/internal-twilio-routes.ts +13 -0
  839. package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
  840. package/src/runtime/routes/log-export-routes.ts +36 -10
  841. package/src/runtime/routes/mcp-auth-routes.ts +25 -0
  842. package/src/runtime/routes/memory-item-routes.ts +21 -10
  843. package/src/runtime/routes/memory-v2-routes.ts +105 -44
  844. package/src/runtime/routes/memory-v3-routes.ts +306 -408
  845. package/src/runtime/routes/migration-rollback-routes.ts +5 -1
  846. package/src/runtime/routes/migration-routes.ts +29 -0
  847. package/src/runtime/routes/notification-routes.ts +17 -1
  848. package/src/runtime/routes/oauth-apps.ts +99 -23
  849. package/src/runtime/routes/oauth-commands-routes.ts +37 -14
  850. package/src/runtime/routes/oauth-connect-routes.ts +9 -0
  851. package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
  852. package/src/runtime/routes/oauth-providers.ts +79 -15
  853. package/src/runtime/routes/platform-routes.ts +102 -5
  854. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +9 -6
  855. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
  856. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
  857. package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
  858. package/src/runtime/routes/playground/force-compact.ts +2 -2
  859. package/src/runtime/routes/playground/helpers.ts +1 -2
  860. package/src/runtime/routes/playground/inject-failures.ts +13 -8
  861. package/src/runtime/routes/playground/reset-circuit.ts +14 -9
  862. package/src/runtime/routes/playground/seed-conversation.ts +1 -1
  863. package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
  864. package/src/runtime/routes/playground/state.ts +4 -3
  865. package/src/runtime/routes/plugins-routes.ts +22 -19
  866. package/src/runtime/routes/profiler-routes.ts +17 -4
  867. package/src/runtime/routes/ps-routes.ts +5 -0
  868. package/src/runtime/routes/publish-routes.ts +13 -3
  869. package/src/runtime/routes/question-routes.ts +5 -0
  870. package/src/runtime/routes/recording-routes.ts +25 -12
  871. package/src/runtime/routes/rename-conversation-routes.ts +10 -0
  872. package/src/runtime/routes/sanity-routes.ts +9 -2
  873. package/src/runtime/routes/schedule-routes.ts +288 -88
  874. package/src/runtime/routes/secret-routes.ts +31 -6
  875. package/src/runtime/routes/sequence-routes.ts +33 -0
  876. package/src/runtime/routes/settings-routes.ts +65 -19
  877. package/src/runtime/routes/skills-routes.ts +166 -73
  878. package/src/runtime/routes/slack-channel-routes.ts +5 -0
  879. package/src/runtime/routes/stt-routes.ts +13 -6
  880. package/src/runtime/routes/subagents-routes.ts +24 -18
  881. package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
  882. package/src/runtime/routes/surface-action-routes.ts +9 -0
  883. package/src/runtime/routes/surface-content-routes.ts +10 -2
  884. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  885. package/src/runtime/routes/task-routes.ts +37 -0
  886. package/src/runtime/routes/telemetry-routes.ts +9 -0
  887. package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
  888. package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
  889. package/src/runtime/routes/trace-event-routes.ts +42 -1
  890. package/src/runtime/routes/trust-rules-routes.ts +31 -2
  891. package/src/runtime/routes/tts-routes.ts +48 -6
  892. package/src/runtime/routes/types.ts +83 -16
  893. package/src/runtime/routes/ui-request-routes.ts +5 -0
  894. package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
  895. package/src/runtime/routes/usage-routes.ts +118 -42
  896. package/src/runtime/routes/user-routes-cli.ts +9 -0
  897. package/src/runtime/routes/user-routes.ts +5 -1
  898. package/src/runtime/routes/wake-conversation-routes.ts +5 -0
  899. package/src/runtime/routes/watcher-routes.ts +21 -0
  900. package/src/runtime/routes/webhook-routes.ts +50 -2
  901. package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
  902. package/src/runtime/routes/work-items-routes.ts +49 -23
  903. package/src/runtime/routes/workspace-commit-routes.ts +5 -0
  904. package/src/runtime/routes/workspace-routes.test.ts +42 -0
  905. package/src/runtime/routes/workspace-routes.ts +124 -9
  906. package/src/runtime/services/__tests__/analyze-conversation.test.ts +8 -4
  907. package/src/runtime/services/analyze-conversation.ts +5 -8
  908. package/src/runtime/services/conversation-serializer.ts +24 -2
  909. package/src/runtime/sync/resource-sync-events.ts +16 -2
  910. package/src/runtime/sync/sync-publisher.ts +2 -2
  911. package/src/schedule/run-script.ts +28 -3
  912. package/src/schedule/schedule-store.ts +28 -1
  913. package/src/schedule/schedule-usage-store.ts +83 -0
  914. package/src/schedule/scheduler.ts +15 -6
  915. package/src/signals/cancel.ts +2 -4
  916. package/src/signals/user-message.ts +5 -8
  917. package/src/skills/catalog-files.ts +4 -1
  918. package/src/skills/catalog-install.ts +3 -0
  919. package/src/skills/categories-cache.ts +118 -0
  920. package/src/skills/clawhub-files.ts +1 -0
  921. package/src/skills/skillssh-files.ts +1 -0
  922. package/src/subagent/manager.ts +20 -11
  923. package/src/telemetry/types.ts +55 -1
  924. package/src/telemetry/usage-telemetry-reporter.test.ts +250 -4
  925. package/src/telemetry/usage-telemetry-reporter.ts +88 -2
  926. package/src/tools/acp/context.ts +20 -0
  927. package/src/tools/acp/list-agents.test.ts +7 -1
  928. package/src/tools/acp/spawn.test.ts +198 -93
  929. package/src/tools/acp/spawn.ts +32 -70
  930. package/src/tools/acp/steer.test.ts +105 -8
  931. package/src/tools/acp/steer.ts +48 -17
  932. package/src/tools/apps/definitions.ts +8 -4
  933. package/src/tools/apps/executors.ts +13 -8
  934. package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
  935. package/src/tools/ask-question/ask-question-tool.ts +85 -90
  936. package/src/tools/computer-use/definitions.ts +28 -24
  937. package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
  938. package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
  939. package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
  940. package/src/tools/credentials/vault.ts +112 -111
  941. package/src/tools/execution-target.ts +1 -1
  942. package/src/tools/execution-timeout.ts +3 -4
  943. package/src/tools/executor.ts +1 -53
  944. package/src/tools/filesystem/edit.ts +45 -42
  945. package/src/tools/filesystem/list.ts +33 -30
  946. package/src/tools/filesystem/read.ts +54 -35
  947. package/src/tools/filesystem/write.ts +69 -32
  948. package/src/tools/host-filesystem/edit.ts +44 -42
  949. package/src/tools/host-filesystem/read.ts +49 -35
  950. package/src/tools/host-filesystem/transfer.ts +121 -108
  951. package/src/tools/host-filesystem/write.ts +33 -31
  952. package/src/tools/host-terminal/host-shell.ts +50 -48
  953. package/src/tools/memory/register.ts +23 -24
  954. package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
  955. package/src/tools/network/__tests__/web-search.test.ts +11 -3
  956. package/src/tools/network/web-fetch.ts +49 -46
  957. package/src/tools/network/web-search-error.test.ts +248 -0
  958. package/src/tools/network/web-search-error.ts +267 -0
  959. package/src/tools/network/web-search.ts +223 -61
  960. package/src/tools/registry.ts +39 -16
  961. package/src/tools/schedule/create.ts +13 -0
  962. package/src/tools/schedule/update.ts +16 -0
  963. package/src/tools/shared/filesystem/audio-read.ts +122 -0
  964. package/src/tools/shared/filesystem/image-read.ts +1 -1
  965. package/src/tools/skills/execute.ts +34 -31
  966. package/src/tools/skills/load.ts +29 -23
  967. package/src/tools/subagent/notify-parent.ts +35 -32
  968. package/src/tools/subagent/spawn.ts +2 -4
  969. package/src/tools/system/avatar-generator.ts +13 -22
  970. package/src/tools/system/request-permission.ts +30 -27
  971. package/src/tools/terminal/safe-env.ts +10 -1
  972. package/src/tools/terminal/shell.ts +190 -61
  973. package/src/tools/tool-defaults.ts +20 -9
  974. package/src/tools/tool-manifest.ts +4 -4
  975. package/src/tools/types.ts +74 -23
  976. package/src/tools/ui-surface/definitions.ts +99 -10
  977. package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
  978. package/src/tts/provider-catalog.ts +76 -1
  979. package/src/usage/types.ts +10 -0
  980. package/src/util/errors.ts +2 -2
  981. package/src/util/map-limit.ts +27 -0
  982. package/src/util/mutex.ts +47 -0
  983. package/src/util/platform.ts +15 -12
  984. package/src/work-items/work-item-runner.ts +7 -2
  985. package/src/workspace/git-service.ts +1 -42
  986. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
  987. package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
  988. package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
  989. package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
  990. package/src/workspace/migrations/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
  991. package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
  992. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +117 -0
  993. package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
  994. package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
  995. package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
  996. package/src/workspace/migrations/registry.ts +12 -0
  997. package/src/workspace/provider-commit-message-generator.ts +15 -17
  998. package/tsconfig.json +4 -1
  999. package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
  1000. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  1001. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  1002. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -262
  1003. package/src/__tests__/empty-response-pipeline.test.ts +0 -301
  1004. package/src/__tests__/history-repair-pipeline.test.ts +0 -396
  1005. package/src/__tests__/llm-call-pipeline.test.ts +0 -281
  1006. package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
  1007. package/src/__tests__/persistence-pipeline.test.ts +0 -514
  1008. package/src/__tests__/title-generate-pipeline.test.ts +0 -211
  1009. package/src/__tests__/token-estimate-pipeline.test.ts +0 -481
  1010. package/src/__tests__/tool-error-pipeline.test.ts +0 -241
  1011. package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
  1012. package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -344
  1013. package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
  1014. package/src/cli/commands/memory-v3-render.ts +0 -491
  1015. package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
  1016. package/src/daemon/message-types/disk-pressure.ts +0 -9
  1017. package/src/email/feature-gate.ts +0 -23
  1018. package/src/gallery/default-gallery.ts +0 -1359
  1019. package/src/gallery/gallery-manifest.ts +0 -28
  1020. package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
  1021. package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
  1022. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
  1023. package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
  1024. package/src/memory/v3/__tests__/edges.test.ts +0 -706
  1025. package/src/memory/v3/__tests__/filter.test.ts +0 -560
  1026. package/src/memory/v3/__tests__/gate.test.ts +0 -637
  1027. package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
  1028. package/src/memory/v3/__tests__/loop.test.ts +0 -775
  1029. package/src/memory/v3/__tests__/retriever.test.ts +0 -226
  1030. package/src/memory/v3/__tests__/scouts.test.ts +0 -489
  1031. package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
  1032. package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
  1033. package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
  1034. package/src/memory/v3/__tests__/traversal.test.ts +0 -508
  1035. package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
  1036. package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
  1037. package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
  1038. package/src/memory/v3/__tests__/validate.test.ts +0 -277
  1039. package/src/memory/v3/auto-edges.ts +0 -223
  1040. package/src/memory/v3/coactivation-store.ts +0 -124
  1041. package/src/memory/v3/consolidation-job.ts +0 -323
  1042. package/src/memory/v3/coretrieval-seed.ts +0 -240
  1043. package/src/memory/v3/edge-learning-job.ts +0 -160
  1044. package/src/memory/v3/edges.ts +0 -286
  1045. package/src/memory/v3/filter.ts +0 -286
  1046. package/src/memory/v3/gate.ts +0 -349
  1047. package/src/memory/v3/index-composition.ts +0 -126
  1048. package/src/memory/v3/llm-capture.ts +0 -46
  1049. package/src/memory/v3/loop.ts +0 -430
  1050. package/src/memory/v3/maintenance.ts +0 -144
  1051. package/src/memory/v3/prompt-context.ts +0 -33
  1052. package/src/memory/v3/prompts/consolidation.ts +0 -458
  1053. package/src/memory/v3/prompts/system-prompts.ts +0 -196
  1054. package/src/memory/v3/retriever.ts +0 -33
  1055. package/src/memory/v3/scouts.ts +0 -431
  1056. package/src/memory/v3/shadow-diff.ts +0 -287
  1057. package/src/memory/v3/shadow-middleware.ts +0 -347
  1058. package/src/memory/v3/traversal.ts +0 -211
  1059. package/src/memory/v3/tree-index.ts +0 -237
  1060. package/src/memory/v3/tree-store.ts +0 -394
  1061. package/src/memory/v3/tree-walk.ts +0 -356
  1062. package/src/memory/v3/types.ts +0 -65
  1063. package/src/memory/v3/validate.ts +0 -323
  1064. package/src/plugins/defaults/circuit-breaker.ts +0 -141
  1065. package/src/plugins/defaults/compaction.ts +0 -141
  1066. package/src/plugins/defaults/empty-response.ts +0 -124
  1067. package/src/plugins/defaults/history-repair.ts +0 -83
  1068. package/src/plugins/defaults/llm-call.ts +0 -77
  1069. package/src/plugins/defaults/memory-retrieval.ts +0 -219
  1070. package/src/plugins/defaults/overflow-reduce.ts +0 -185
  1071. package/src/plugins/defaults/persistence.ts +0 -146
  1072. package/src/plugins/defaults/title-generate.ts +0 -90
  1073. package/src/plugins/defaults/token-estimate.ts +0 -101
  1074. package/src/plugins/defaults/tool-error.ts +0 -119
  1075. package/src/plugins/defaults/tool-execute.ts +0 -87
  1076. package/src/plugins/defaults/tool-result-truncate.ts +0 -84
  1077. package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
  1078. package/src/skills/category-inference.ts +0 -111
@@ -7,7 +7,7 @@
7
7
  * placeholders) and add the pipeline runner, registry, and bootstrap.
8
8
  *
9
9
  * The assistant composes behavior around a small set of named pipelines
10
- * (`turn`, `llmCall`, `toolExecute`, ...). Each plugin may contribute one
10
+ * (`compaction`). Each plugin may contribute one
11
11
  * {@link Middleware} per pipeline; the registry composes them in onion
12
12
  * order at runtime. Plugins may also contribute {@link Injector}s that emit
13
13
  * system-prompt-time content, as well as model-visible capabilities
@@ -16,38 +16,21 @@
16
16
  * Design doc: `.private/plans/agent-plugin-system.md`.
17
17
  */
18
18
 
19
- import type { ContextWindowConfig } from "../config/schemas/inference.js";
19
+ import type { CompactionCircuitClosedEvent } from "../api/events/compaction-circuit-closed.js";
20
+ import type { CompactionCircuitOpenEvent } from "../api/events/compaction-circuit-open.js";
21
+ import type { LLMCallSite } from "../config/schemas/llm.js";
22
+ import type { ContextWindowManager } from "../context/window-manager.js";
20
23
  import type {
21
- ContextWindowManager,
22
- ContextWindowResult,
23
- } from "../context/window-manager.js";
24
- import type { ReducerState } from "../daemon/context-overflow-reducer.js";
25
- import type {
26
- ActiveSurfaceContext,
27
24
  ChannelCapabilities,
28
25
  ChannelCommandContext,
29
26
  InjectionMode,
30
27
  } from "../daemon/conversation-runtime-assembly.js";
31
- import type { RepairResult } from "../daemon/history-repair.js";
32
- import type { ServerMessage } from "../daemon/message-protocol.js";
33
- import type { PkbContextConversation } from "../daemon/pkb-context-tracker.js";
34
28
  import type { TrustContext } from "../daemon/trust-context.js";
35
- import type { MessageRole } from "../memory/conversation-crud.js";
36
- import type { QdrantSparseVector } from "../memory/qdrant-client.js";
37
- import type {
38
- ContentBlock,
39
- Message,
40
- Provider,
41
- ProviderResponse,
42
- SendMessageOptions,
43
- ToolDefinition,
44
- } from "../providers/types.js";
29
+ import type { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
30
+ import type { PluginHookFn } from "../plugin-api/types.js";
31
+ import type { Message } from "../providers/types.js";
45
32
  import type { SkillRoute } from "../runtime/skill-route-registry.js";
46
- import type {
47
- LoadedTool,
48
- ToolContext,
49
- ToolExecutionResult,
50
- } from "../tools/types.js";
33
+ import type { Tool } from "../tools/types.js";
51
34
  import { AssistantError, ErrorCode } from "../util/errors.js";
52
35
 
53
36
  // ─── Manifest ────────────────────────────────────────────────────────────────
@@ -89,11 +72,12 @@ export interface PluginManifest {
89
72
  config?: unknown;
90
73
  }
91
74
 
92
- // ─── Init / Shutdown context ─────────────────────────────────────────────────
93
- // Public types — defined in `assistant/src/plugin-api/types.ts` and re-exported
94
- // here so existing internal call sites keep working. Plugin authors will
95
- // import these from `@vellumai/plugin-api` once that package is published.
75
+ // ─── Public plugin-API types ─────────────────────────────────────────────────
76
+ // Defined in `assistant/src/plugin-api/types.ts` and re-exported here so
77
+ // existing internal call sites keep working. Plugin authors import these from
78
+ // `@vellumai/plugin-api`.
96
79
  export type {
80
+ PluginHookFn,
97
81
  PluginInitContext,
98
82
  PluginShutdownContext,
99
83
  } from "../plugin-api/types.js";
@@ -118,181 +102,22 @@ export type Middleware<A, R> = (
118
102
  * Exhaustive list of pipeline slot names. New pipelines must be added here
119
103
  * and in `DEFAULT_TIMEOUTS` (PR 12). The registry only understands these.
120
104
  */
121
- export type PipelineName =
122
- | "turn"
123
- | "llmCall"
124
- | "toolExecute"
125
- | "memoryRetrieval"
126
- | "historyRepair"
127
- | "tokenEstimate"
128
- | "compaction"
129
- | "overflowReduce"
130
- | "persistence"
131
- | "titleGenerate"
132
- | "toolResultTruncate"
133
- | "emptyResponse"
134
- | "toolError"
135
- | "circuitBreaker";
105
+ export type PipelineName = "compaction";
136
106
 
137
107
  // ─── Per-pipeline args / results (placeholder shapes) ────────────────────────
138
108
  // Concrete field-level types land in M2/M3 PRs as each pipeline is wrapped.
139
109
  // Until then we expose `unknown`-tagged aliases so downstream code can name
140
110
  // the types without depending on unstable internal shapes.
141
111
 
142
- export type TurnArgs = { readonly input: unknown };
143
- export type TurnResult = { readonly output: unknown };
144
-
145
- /**
146
- * Pipeline arguments for `llmCall` — mirrors the inputs to
147
- * {@link Provider.sendMessage}. The terminal handler (the default plugin)
148
- * delegates straight to `args.provider.sendMessage(args.messages, args.tools,
149
- * args.systemPrompt, args.options)`; middleware may observe or rewrite any
150
- * field before that call, short-circuit with a synthetic {@link LLMCallResult},
151
- * or post-process the response on the way out.
152
- *
153
- * `provider` is passed in `args` (rather than resolved from the runtime) so
154
- * middleware can swap it deterministically per-call. `options` carries the
155
- * full `SendMessageOptions` bag — `config`, `onEvent`, and `signal` — so
156
- * middleware can substitute streaming handlers or cancellation signals
157
- * without reconstructing them.
158
- */
159
- export type LLMCallArgs = {
160
- readonly provider: Provider;
161
- readonly messages: Message[];
162
- readonly tools?: ToolDefinition[];
163
- readonly systemPrompt?: string;
164
- readonly options?: SendMessageOptions;
165
- };
166
- export type LLMCallResult = ProviderResponse;
167
-
168
- /**
169
- * Arguments passed to the `toolExecute` pipeline — mirrors the public
170
- * {@link ToolExecutor.execute} signature so middleware can observe (and
171
- * mutate) the tool name, input payload, and the full {@link ToolContext}
172
- * before the terminal runs the actual execution.
173
- */
174
- export interface ToolExecuteArgs {
175
- readonly name: string;
176
- readonly input: Record<string, unknown>;
177
- readonly context: ToolContext;
178
- }
179
-
180
- /**
181
- * Result returned from the `toolExecute` pipeline — identical to
182
- * {@link ToolExecutionResult} so short-circuit middleware can supply a
183
- * synthetic result without invoking the terminal.
184
- */
185
- export type ToolExecuteResult = ToolExecutionResult;
186
-
187
112
  /**
188
- * A single retrieved memory artifact.
189
- *
190
- * The memory-graph retriever emits complex, tightly-coupled state (content
191
- * blocks, query vectors, metrics, events, etc.) that downstream code in the
192
- * agent loop consumes holistically. Representing each memory-graph output as
193
- * an opaque `MemoryBlock` lets plugins swap in completely different shapes
194
- * (custom retrievers, mocks for testing) without requiring the plugin surface
195
- * to re-declare the graph result schema here. Refined by consumers via
196
- * runtime narrowing — the default retriever attaches a structural marker so
197
- * the agent loop can safely unwrap its own output.
113
+ * Full output of a single memory-graph retrieval — the object returned by
114
+ * {@link ConversationGraphMemory.prepareMemory} (injected messages, query
115
+ * vectors, metrics). The agent loop consumes these fields directly to drive
116
+ * PKB hint search and runtime injection.
198
117
  */
199
- export type MemoryBlock = unknown;
200
-
201
- /**
202
- * Inputs to the memory-retrieval pipeline. The pipeline takes only
203
- * identifiers and the trust context — the actual data sources (PKB files,
204
- * NOW.md, memory graph) are side-effectful and read by the terminal.
205
- *
206
- * `signal` is the per-turn abort signal forwarded to the memory graph's
207
- * `prepareMemory` call. Carrying it on `args` (rather than on the
208
- * `DefaultMemoryRetrievalDeps` extra-state bundle) is load-bearing: the
209
- * pipeline runner's `linkAbortSignal` swaps any `AbortSignal`-typed
210
- * property on top-level args for an internal linked signal, so a plugin
211
- * timeout (or external cancel) actually reaches `prepareMemory` and cancels
212
- * the underlying retrieval instead of letting it run to completion after
213
- * the pipeline has already errored.
214
- */
215
- export interface MemoryArgs {
216
- readonly conversationId: string;
217
- readonly trustContext: TrustContext | undefined;
218
- readonly turnIndex: number;
219
- readonly signal: AbortSignal;
220
- }
221
-
222
- /**
223
- * Outputs of the memory-retrieval pipeline.
224
- *
225
- * - `pkbContent` / `nowContent`: trimmed file contents ready for injection,
226
- * or `null` when the file is missing/empty.
227
- * - `memoryGraphBlocks`: zero or one memory-graph retrievals (the default
228
- * retriever yields exactly one when the actor is trusted and the graph
229
- * produced output, zero otherwise). Multi-entry arrays are reserved for
230
- * future multi-source retrievers; the current agent loop consumes only
231
- * the first entry.
232
- */
233
- export interface MemoryResult {
234
- readonly pkbContent: string | null;
235
- readonly nowContent: string | null;
236
- readonly memoryGraphBlocks: ReadonlyArray<MemoryBlock>;
237
- }
238
-
239
- /**
240
- * Arguments for the `historyRepair` pipeline. `history` is the pre-repair
241
- * message list scheduled for the next provider call; `provider` is the
242
- * downstream provider key (`ctx.provider.name`) so plugins that want to
243
- * special-case repair per provider can discriminate without looking up the
244
- * ambient provider from `TurnContext`.
245
- *
246
- * The pipeline currently wraps only the standard pre-run repair pass
247
- * (`repairHistory`). The orchestrator's one-shot deep-repair fallback
248
- * (`deepRepairHistory`), invoked only after a provider ordering error,
249
- * remains a direct call. Adding a `mode` discriminator here would be
250
- * premature — deep-repair has no known plugin-level consumer yet.
251
- */
252
- export type HistoryRepairArgs = {
253
- readonly history: Message[];
254
- readonly provider: string;
255
- };
256
-
257
- /**
258
- * Result of the `historyRepair` pipeline. Carries both the repaired message
259
- * list and the `RepairStats` record the orchestrator logs when any repair
260
- * happened — the default plugin forwards the shape unchanged from
261
- * {@link repairHistory}.
262
- */
263
- export type HistoryRepairResult = RepairResult;
264
-
265
- /**
266
- * Inputs to the `tokenEstimate` pipeline. The default middleware delegates
267
- * these straight to {@link estimatePromptTokensRaw}; custom plugins may
268
- * substitute an alternate estimator (e.g. provider-native tokenization) by
269
- * short-circuiting the pipeline with their own {@link EstimateResult}.
270
- *
271
- * Fields:
272
- * - `history` — current message list to estimate over.
273
- * - `systemPrompt` — system prompt string, or `undefined` when absent.
274
- * - `tools` — tool definitions visible on this turn. The default plugin
275
- * sums their token budget via `estimateToolsTokens(tools)` and hands the
276
- * result to the raw estimator via `toolTokenBudget`. Plugins that want to
277
- * ignore tool cost can skip that term.
278
- * - `providerName` — canonical calibration provider key (the value returned
279
- * by `getCalibrationProviderKey(provider)`). Drives provider-specific
280
- * heuristics inside the raw estimator (e.g. Anthropic image sizing).
281
- */
282
- export type EstimateArgs = {
283
- readonly history: Message[];
284
- readonly systemPrompt: string | undefined;
285
- readonly tools: ToolDefinition[];
286
- readonly providerName: string | undefined;
287
- };
288
-
289
- /** Result of the `tokenEstimate` pipeline — total estimated prompt tokens. */
290
- export type EstimateResult = number;
291
-
292
- /** Alias retained for symmetry with the rest of the pipeline-name family. */
293
- export type TokenEstimateArgs = EstimateArgs;
294
- /** Alias retained for symmetry with the rest of the pipeline-name family. */
295
- export type TokenEstimateResult = EstimateResult;
118
+ export type GraphMemoryResult = Awaited<
119
+ ReturnType<ConversationGraphMemory["prepareMemory"]>
120
+ >;
296
121
 
297
122
  /**
298
123
  * Pipeline inputs for the `compaction` slot — the arguments the assistant
@@ -322,440 +147,15 @@ export type CompactionArgs = {
322
147
  export type CompactionResult = unknown;
323
148
 
324
149
  /**
325
- * Input to the `overflowReduce` pipeline. Captures everything the reducer
326
- * tier loop needs, including the message history, reducer configuration,
327
- * and side-effect callbacks that bridge the pipeline back to the orchestrator's
328
- * mutable per-turn state (context-window manager, activity emitter, runtime
329
- * injection reassembly, memory reinjection).
330
- *
331
- * The callbacks are supplied by the orchestrator because the reducer loop
332
- * needs to coordinate with state that lives on the `AgentLoopConversationContext`
333
- * (message mutation, compaction event emission, circuit breaker tracking,
334
- * injection block reassembly). Keeping them as explicit callbacks — rather
335
- * than pulling the whole context into the pipeline — preserves the rule that
336
- * `TurnContext` stays minimal and pipeline-agnostic.
150
+ * The complete set of compaction circuit-breaker transition events:
151
+ * `compaction_circuit_open` when the breaker trips and `compaction_circuit_closed`
152
+ * on the open→closed transition. Both are a subset of `ServerMessage`, so any
153
+ * existing `ServerMessage` sink remains assignable to a
154
+ * `(msg: CompactionCircuitEvent) => void` parameter.
337
155
  */
338
- export interface OverflowReduceArgs {
339
- /** Bare persisted message history (mutable copy — the default middleware
340
- * applies reducer results in-place via the `applyMessages` callback). */
341
- readonly messages: Message[];
342
- /** Current run-time message array with runtime injections applied. */
343
- readonly runMessages: Message[];
344
- /** System prompt used for post-step token estimation. */
345
- readonly systemPrompt: string;
346
- /** Provider name used for token estimation (calibration provider key). */
347
- readonly providerName: string;
348
- /** Context window config (drives compaction behavior). */
349
- readonly contextWindow: ContextWindowConfig;
350
- /** Token budget the reducer must get below (preflight budget). */
351
- readonly preflightBudget: number;
352
- /** Tool-token overhead included in every estimation call. */
353
- readonly toolTokenBudget?: number;
354
- /** Maximum reducer iterations before the loop exits unconditionally. */
355
- readonly maxAttempts: number;
356
- /** Abort signal threaded through compaction calls. */
357
- readonly abortSignal?: AbortSignal;
358
- /**
359
- * Compaction callback — the reducer never owns the ContextWindowManager
360
- * instance. The orchestrator supplies this closure so the default plugin
361
- * can delegate the forced-compaction tier without crossing the
362
- * pipeline/infra boundary on its own.
363
- */
364
- readonly compactFn: (
365
- messages: Message[],
366
- signal: AbortSignal | undefined,
367
- options: unknown,
368
- ) => Promise<ContextWindowResult>;
369
- /**
370
- * Invoked before each reducer iteration to emit the `context_compacting`
371
- * activity state. The orchestrator owns activity emission because the
372
- * signal is trust/channel aware.
373
- */
374
- readonly emitActivityState: () => void;
375
- /**
376
- * Invoked after each reducer step that produced a successful compaction.
377
- * Handles circuit-breaker tracking, event emission, and context mutation.
378
- * The pipeline passes back `didCompact` so the orchestrator can flip its
379
- * `reducerCompacted` / `shouldInjectWorkspace` flags and the next
380
- * re-injection uses the fresh messages.
381
- */
382
- readonly onCompactionResult: (
383
- result: ContextWindowResult,
384
- compactedBasis?: Message[],
385
- ) => void | Promise<void>;
386
- /**
387
- * Invoked after each step to rebuild `runMessages` from the step's
388
- * reduced history with the requested injection mode. The orchestrator
389
- * owns this helper so the full per-turn injection options object doesn't
390
- * leak into the pipeline surface. The plugin passes the current reduced
391
- * messages array explicitly so the orchestrator doesn't need to read
392
- * mutable shared state. Returns the new `runMessages`.
393
- *
394
- * Two distinct "did compact" signals are passed so the orchestrator can
395
- * apply the correct per-iteration vs sticky gating:
396
- * - `stepCompacted` — whether THIS iteration's reducer step produced a
397
- * fresh compaction. Gates PKB / NOW re-injection: compaction strips the
398
- * existing blocks, so only iterations that just compacted need the
399
- * content re-threaded. Iterations that only truncated tool results or
400
- * downgraded injections must NOT force a re-injection or the token
401
- * count grows each round.
402
- * - `accumulatedCompacted` — whether ANY iteration in this pipeline
403
- * invocation has compacted. Gates `slackChronologicalMessages`
404
- * suppression: once compaction has run, the captured Slack transcript
405
- * snapshot would overwrite the compacted history, so it must stay
406
- * suppressed for every subsequent iteration even if that iteration
407
- * didn't re-compact.
408
- */
409
- readonly reinjectForMode: (
410
- messages: Message[],
411
- mode: InjectionMode,
412
- stepCompacted: boolean,
413
- accumulatedCompacted: boolean,
414
- ) => Promise<Message[]>;
415
- /**
416
- * Invoked after each step to post-estimate the rebuilt `runMessages`.
417
- * Pulled out so the orchestrator controls how estimation is performed
418
- * (and which fields feed it) without the pipeline reimplementing it.
419
- */
420
- readonly estimatePostInjection: (runMessages: Message[]) => number;
421
- }
422
-
423
- /** Output of the `overflowReduce` pipeline. */
424
- export interface OverflowReduceResult {
425
- /** Final reduced `ctx.messages` value (mutated in place by the reducer). */
426
- readonly messages: Message[];
427
- /** Final `runMessages` with re-applied runtime injections. */
428
- readonly runMessages: Message[];
429
- /** Final injection mode (may be `"minimal"` if the downgrade tier fired). */
430
- readonly injectionMode: InjectionMode;
431
- /** Accumulated reducer state at exit. */
432
- readonly reducerState: ReducerState;
433
- /** True if any step successfully compacted history. */
434
- readonly reducerCompacted: boolean;
435
- /** How many iterations of the tier loop executed. */
436
- readonly attempts: number;
437
- }
438
-
439
- /**
440
- * Pipeline arguments for `persistence` — a discriminated union over the
441
- * message-CRUD operations plugins may observe, redirect, or short-circuit:
442
- *
443
- * - `add` — append a new message (`addMessage`). Mirrors
444
- * `addMessage(conversationId, role, content, metadata?, opts?)`.
445
- * When `syncToDisk` is set, the default plugin also runs
446
- * {@link syncMessageToDisk} against the just-persisted row
447
- * so the JSONL disk view stays consistent. The
448
- * `createdAtMs` field carries the conversation's creation
449
- * timestamp — needed to resolve the disk-view directory.
450
- * - `reserve` — pre-allocate an empty assistant anchor row
451
- * (`reserveMessage`) so the agent loop can stamp streaming
452
- * events with stable identity before any content is
453
- * produced. Returns the same row shape as `add`.
454
- * - `updateContent` — overwrite the content of an existing message
455
- * (`updateMessageContent`). Used to finalize a previously
456
- * reserved row, and by consolidation paths.
457
- * - `update` — shallow-merge metadata into an existing message
458
- * (`updateMessageMetadata`). Returns `void`.
459
- * - `delete` — remove a single message (`deleteMessageById`). Returns
460
- * the {@link DeletedMemoryIds}-shaped segment/summary IDs
461
- * the caller must clean up out-of-band.
462
- *
463
- * The discriminated `op` field lets plugin middleware narrow the union and
464
- * tailor behavior per-operation (e.g. "only observe deletes", "redirect
465
- * adds to a mock store").
466
- */
467
- export type PersistAddArgs = {
468
- readonly op: "add";
469
- readonly conversationId: string;
470
- readonly role: MessageRole;
471
- readonly content: string;
472
- readonly metadata?: Record<string, unknown>;
473
- readonly addOptions?: { readonly skipIndexing?: boolean };
474
- /**
475
- * When `true`, the default plugin additionally invokes
476
- * {@link syncMessageToDisk} with the returned message's id. Requires
477
- * {@link createdAtMs} to resolve the conversation's disk-view directory.
478
- */
479
- readonly syncToDisk?: boolean;
480
- /** Conversation creation timestamp — only read when `syncToDisk` is true. */
481
- readonly createdAtMs?: number;
482
- };
483
-
484
- export type PersistReserveArgs = {
485
- readonly op: "reserve";
486
- readonly conversationId: string;
487
- readonly role: MessageRole;
488
- readonly metadata?: Record<string, unknown>;
489
- };
490
-
491
- export type PersistUpdateContentArgs = {
492
- readonly op: "updateContent";
493
- readonly messageId: string;
494
- readonly content: string;
495
- };
496
-
497
- export type PersistUpdateArgs = {
498
- readonly op: "update";
499
- readonly messageId: string;
500
- readonly updates: Record<string, unknown>;
501
- };
502
-
503
- export type PersistDeleteArgs = {
504
- readonly op: "delete";
505
- readonly messageId: string;
506
- };
507
-
508
- export type PersistArgs =
509
- | PersistAddArgs
510
- | PersistReserveArgs
511
- | PersistUpdateContentArgs
512
- | PersistUpdateArgs
513
- | PersistDeleteArgs;
514
-
515
- /**
516
- * Result row returned by an `add` op — matches the shape produced by
517
- * {@link addMessage}. Kept structural (not imported from `memory/`) so the
518
- * plugin types module stays decoupled from the storage layer.
519
- */
520
- export type PersistAddResult = {
521
- readonly op: "add";
522
- readonly message: {
523
- readonly id: string;
524
- readonly conversationId: string;
525
- readonly role: string;
526
- readonly content: string;
527
- readonly createdAt: number;
528
- readonly metadata?: string;
529
- };
530
- };
531
-
532
- /**
533
- * Result row returned by a `reserve` op — same row shape as `add` but with
534
- * empty `content` (`"[]"`) and tagged distinctly so middleware can branch
535
- * on intent.
536
- */
537
- export type PersistReserveResult = {
538
- readonly op: "reserve";
539
- readonly message: {
540
- readonly id: string;
541
- readonly conversationId: string;
542
- readonly role: string;
543
- readonly content: string;
544
- readonly createdAt: number;
545
- readonly metadata?: string;
546
- };
547
- };
548
-
549
- export type PersistUpdateContentResult = { readonly op: "updateContent" };
550
-
551
- export type PersistUpdateResult = { readonly op: "update" };
552
-
553
- /** IDs of segments/summaries the caller must remove from Qdrant. */
554
- export type PersistDeleteResult = {
555
- readonly op: "delete";
556
- readonly segmentIds: string[];
557
- readonly deletedSummaryIds: string[];
558
- };
559
-
560
- export type PersistResult =
561
- | PersistAddResult
562
- | PersistReserveResult
563
- | PersistUpdateContentResult
564
- | PersistUpdateResult
565
- | PersistDeleteResult;
566
-
567
- /**
568
- * Arguments for the `titleGenerate` pipeline. Mirrors the parameters of
569
- * `queueGenerateConversationTitle` in `memory/conversation-title-service.ts`
570
- * so the default plugin can delegate verbatim.
571
- *
572
- * `provider` is optional because the underlying service falls back to
573
- * `getConfiguredProvider("conversationTitle")` when absent. `userMessage`
574
- * carries the first turn's text — the service uses it as LLM context and
575
- * also to derive a deterministic fallback title if the call fails.
576
- *
577
- * `onTitleUpdated` is a fire-and-forget callback the pipeline invokes when
578
- * the title is finally persisted. The default implementation is
579
- * fire-and-forget overall, so the pipeline result (`TitleResult`) carries no
580
- * payload — callers that need the title must use the callback.
581
- */
582
- export type TitleArgs = {
583
- readonly conversationId: string;
584
- readonly provider?: Provider;
585
- readonly userMessage: string;
586
- readonly onTitleUpdated?: (title: string) => void;
587
- };
588
- /**
589
- * Result of the `titleGenerate` pipeline. The default implementation is
590
- * fire-and-forget (it schedules background work and returns immediately),
591
- * so there is nothing meaningful to return. Defined as an empty object so
592
- * custom plugins can opt into richer payloads later.
593
- */
594
- export type TitleResult = Readonly<Record<string, never>>;
595
-
596
- /**
597
- * @deprecated Alias kept for the M1 scaffolding era. Prefer {@link TitleArgs}.
598
- */
599
- export type TitleGenerateArgs = TitleArgs;
600
- /**
601
- * @deprecated Alias kept for the M1 scaffolding era. Prefer {@link TitleResult}.
602
- */
603
- export type TitleGenerateResult = TitleResult;
604
-
605
- /**
606
- * Input to the `toolResultTruncate` pipeline: the raw tool-result text and
607
- * the character budget the caller computed from the context-window share
608
- * (see `calculateMaxToolResultChars` in `context/tool-result-truncation.ts`).
609
- */
610
- export type ToolResultTruncateArgs = {
611
- readonly content: string;
612
- readonly maxChars: number;
613
- };
614
-
615
- /**
616
- * Output of the `toolResultTruncate` pipeline: the (possibly truncated)
617
- * content and a boolean flag indicating whether the pipeline actually
618
- * shortened the input. Callers use `truncated` for telemetry / warnings.
619
- */
620
- export type ToolResultTruncateResult = {
621
- readonly content: string;
622
- readonly truncated: boolean;
623
- };
624
-
625
- /**
626
- * Snapshot of the just-completed assistant turn plus retry/context counters
627
- * the `emptyResponse` pipeline needs to decide whether to nudge, accept, or
628
- * surface an error.
629
- *
630
- * `emptyResponseRetries` is the *current* retry counter — the pipeline may
631
- * compare it to `maxEmptyResponseRetries` to implement a retry cap. The loop
632
- * increments the counter only after a `"nudge"` decision; the pipeline is
633
- * stateless across turns.
634
- *
635
- * `priorAssistantHadVisibleText` signals that an earlier turn in the current
636
- * `run()` invocation already delivered user-visible text. When true, an
637
- * empty follow-up is the model correctly ending its turn and nudging would
638
- * mislead it into resending text the user already saw.
639
- */
640
- export interface EmptyResponseArgs {
641
- /** Content blocks produced by the assistant on this turn. */
642
- readonly responseContent: ReadonlyArray<ContentBlock>;
643
- /**
644
- * Number of `tool_use` blocks in `responseContent`. Mirrors the loop's own
645
- * count so middleware doesn't have to recompute it. When > 0 the turn is
646
- * not empty — the model issued tool calls.
647
- */
648
- readonly toolUseBlocksLength: number;
649
- /** 0-based index of the tool-use turn being evaluated. */
650
- readonly toolUseTurns: number;
651
- /** How many empty-response nudges the loop has already issued this run. */
652
- readonly emptyResponseRetries: number;
653
- /** Upper bound for `emptyResponseRetries`. The default is 1. */
654
- readonly maxEmptyResponseRetries: number;
655
- /**
656
- * Whether ANY prior assistant turn in the current `run()` call carried
657
- * visible text. See `agent/loop.ts` for why the whole-run scan matters.
658
- */
659
- readonly priorAssistantHadVisibleText: boolean;
660
- }
661
-
662
- /**
663
- * Decision produced by the `emptyResponse` pipeline.
664
- *
665
- * - `"nudge"` — loop appends `nudgeText` as a `user` message and retries.
666
- * `nudgeText` MUST be present; it is what the model will see.
667
- * - `"accept"` — loop treats the turn as complete (pushes the assistant
668
- * message to history and exits the tool-use chain normally).
669
- * - `"error"` — loop surfaces a clear error. Reserved for middleware that
670
- * wants to escalate an empty response rather than absorb it.
671
- */
672
- export interface EmptyResponseDecision {
673
- readonly action: "nudge" | "accept" | "error";
674
- /** Nudge text the loop will push to history. Required when `action === "nudge"`. */
675
- readonly nudgeText?: string;
676
- }
677
-
678
- /** Alias so the {@link PipelineMiddlewareMap} entry names its own result shape. */
679
- export type EmptyResponseResult = EmptyResponseDecision;
680
-
681
- /**
682
- * Arguments to the `toolError` pipeline — invoked by the agent loop once per
683
- * turn that produced tool results, BEFORE the turn's tool-result user message
684
- * is pushed into history.
685
- *
686
- * `hasToolError` is true when at least one tool in the current turn returned
687
- * `isError: true`. `consecutiveErrorTurns` is the running count of
688
- * back-to-back error turns (reset to 0 on a clean turn, incremented on each
689
- * error turn). `maxConsecutiveErrorNudges` is the default cap the agent loop
690
- * currently applies; plugins receive it so they can match the default
691
- * threshold exactly or compute a relative offset.
692
- */
693
- export type ToolErrorArgs = {
694
- readonly hasToolError: boolean;
695
- readonly consecutiveErrorTurns: number;
696
- readonly maxConsecutiveErrorNudges: number;
697
- };
698
-
699
- /**
700
- * Decision returned by the `toolError` pipeline. When `action` is `"nudge"`,
701
- * the agent loop appends a text block with `nudgeText` to the turn's tool
702
- * results so the next LLM turn sees the nudge. When `action` is `"skip"`, no
703
- * nudge is injected and the tool results pass through unchanged.
704
- */
705
- export type ToolErrorDecision =
706
- | { readonly action: "nudge"; readonly nudgeText: string }
707
- | { readonly action: "skip" };
708
-
709
- /** Alias kept so `PipelineMiddlewareMap.toolError` reads result-shaped. */
710
- export type ToolErrorResult = ToolErrorDecision;
711
-
712
- /**
713
- * Arguments for the `circuitBreaker` pipeline.
714
- *
715
- * A single call pattern handles both querying and updating the breaker:
716
- * - `{ key }` — query-only. Returns the current `{ open, cooldownRemainingMs? }`.
717
- * - `{ key, outcome }` — update state, then return the post-update decision.
718
- *
719
- * `key` identifies the circuit bucket so independent circuits (e.g. per
720
- * conversation, per provider) can coexist. The default compaction plugin
721
- * uses `"compaction:<conversationId>"`.
722
- *
723
- * `state` is a pragmatic extension beyond the minimal `{ key, outcome? }`
724
- * shape: the `Conversation` owns `consecutiveCompactionFailures` and
725
- * `compactionCircuitOpenUntil` because dev-only playground routes read and
726
- * mutate those fields directly. The default plugin reads/updates the same
727
- * container so the pipeline stays a pure wrapper rather than forking state
728
- * ownership.
729
- *
730
- * `onEvent` is optional — when provided, the default plugin emits
731
- * `compaction_circuit_open` / `compaction_circuit_closed` transition events
732
- * through it. Callers that just want to query without emitting (or without
733
- * a `ServerMessage` sink handy) can omit it.
734
- */
735
- export type CircuitBreakerArgs = {
736
- readonly key: string;
737
- readonly outcome?: "success" | "failure";
738
- readonly state: {
739
- readonly conversationId: string;
740
- consecutiveCompactionFailures: number;
741
- compactionCircuitOpenUntil: number | null;
742
- };
743
- readonly onEvent?: (msg: ServerMessage) => void;
744
- };
745
-
746
- /**
747
- * Result of a `circuitBreaker` pipeline invocation.
748
- *
749
- * - `open` — `true` when the breaker is currently tripped (auto paths must
750
- * skip). `false` when closed (auto paths may proceed).
751
- * - `cooldownRemainingMs` — when `open` is `true`, the number of ms until
752
- * the breaker auto-closes (for informational display). Omitted when the
753
- * breaker is closed.
754
- */
755
- export type CircuitBreakerResult = {
756
- readonly open: boolean;
757
- readonly cooldownRemainingMs?: number;
758
- };
156
+ export type CompactionCircuitEvent =
157
+ | CompactionCircuitOpenEvent
158
+ | CompactionCircuitClosedEvent;
759
159
 
760
160
  /**
761
161
  * Mapping from {@link PipelineName} to the middleware signature the registry
@@ -763,23 +163,7 @@ export type CircuitBreakerResult = {
763
163
  * `getMiddlewaresFor<P>()` type narrowing in PR 13.
764
164
  */
765
165
  export interface PipelineMiddlewareMap {
766
- turn: Middleware<TurnArgs, TurnResult>;
767
- llmCall: Middleware<LLMCallArgs, LLMCallResult>;
768
- toolExecute: Middleware<ToolExecuteArgs, ToolExecuteResult>;
769
- memoryRetrieval: Middleware<MemoryArgs, MemoryResult>;
770
- historyRepair: Middleware<HistoryRepairArgs, HistoryRepairResult>;
771
- tokenEstimate: Middleware<TokenEstimateArgs, TokenEstimateResult>;
772
166
  compaction: Middleware<CompactionArgs, CompactionResult>;
773
- overflowReduce: Middleware<OverflowReduceArgs, OverflowReduceResult>;
774
- persistence: Middleware<PersistArgs, PersistResult>;
775
- titleGenerate: Middleware<TitleArgs, TitleResult>;
776
- toolResultTruncate: Middleware<
777
- ToolResultTruncateArgs,
778
- ToolResultTruncateResult
779
- >;
780
- emptyResponse: Middleware<EmptyResponseArgs, EmptyResponseResult>;
781
- toolError: Middleware<ToolErrorArgs, ToolErrorResult>;
782
- circuitBreaker: Middleware<CircuitBreakerArgs, CircuitBreakerResult>;
783
167
  }
784
168
 
785
169
  // ─── TurnContext ─────────────────────────────────────────────────────────────
@@ -807,49 +191,8 @@ export interface TurnInjectionInputs {
807
191
  * context (unified turn context, etc.). Drives per-injector gating.
808
192
  */
809
193
  readonly mode?: InjectionMode;
810
- /** Disk-pressure cleanup-mode context or null to skip the warning. */
811
- readonly diskPressureContext?: DiskPressureInjectionContext | null;
812
- /** Workspace top-level context text (`<workspace>...`) or null to skip. */
813
- readonly workspaceTopLevelContext?: string | null;
814
194
  /** Pre-built unified-turn-context text (`<turn_context>...`) or null to skip. */
815
195
  readonly unifiedTurnContext?: string | null;
816
- /** PKB auto-injected content (`<knowledge_base>...`) or null to skip. */
817
- readonly pkbContext?: string | null;
818
- /**
819
- * Whether PKB is active for this turn — drives the `<system_reminder>` /
820
- * hybrid-search relevance-hint branch.
821
- */
822
- readonly pkbActive?: boolean;
823
- /** Dense query vector surfaced from the graph memory retriever for PKB hints. */
824
- readonly pkbQueryVector?: number[];
825
- /** Optional sparse vector accompanying `pkbQueryVector`. */
826
- readonly pkbSparseVector?: QdrantSparseVector;
827
- /** Memory scope id used to filter PKB search results. */
828
- readonly pkbScopeId?: string;
829
- /**
830
- * Live conversation (or a minimal shape containing `messages`) used to
831
- * compute which PKB paths are already "in context" and therefore suppressed
832
- * from hint suggestions.
833
- */
834
- readonly pkbConversation?: PkbContextConversation;
835
- /** Auto-injected PKB filenames resolved relative to `pkbRoot`. */
836
- readonly pkbAutoInjectList?: string[];
837
- /** Absolute path to the PKB directory (e.g. `<workspace>/pkb`). */
838
- readonly pkbRoot?: string;
839
- /**
840
- * Working directory against which relative `file_read` paths resolve.
841
- * Falls back to `pkbRoot` when omitted.
842
- */
843
- readonly pkbWorkingDir?: string;
844
- /**
845
- * Pre-rendered v2 static memory content (essentials/threads/recent/buffer
846
- * concatenated, header-wrapped) or null to skip. The agent loop only
847
- * passes this on full-mode turns; the injector wraps it in `<memory>` for
848
- * the user message.
849
- */
850
- readonly memoryV2Static?: string | null;
851
- /** NOW.md scratchpad content or null to skip. */
852
- readonly nowScratchpad?: string | null;
853
196
  /** Pre-built `<active_subagents>` block or null to skip. */
854
197
  readonly subagentStatusBlock?: string | null;
855
198
  /** Channel capabilities — drives slack gating. */
@@ -866,12 +209,6 @@ export interface TurnInjectionInputs {
866
209
  * no focus block is appended.
867
210
  */
868
211
  readonly slackActiveThreadFocusBlock?: string | null;
869
- /**
870
- * Active dashboard-surface context (read from `<active_workspace>`). Kept
871
- * on the injection inputs bag (not its own injector) because it is
872
- * orchestrator-owned surface state, not a default-chain element.
873
- */
874
- readonly activeSurface?: ActiveSurfaceContext | null;
875
212
  /** Channel command context (e.g. Telegram /start) or null to skip. */
876
213
  readonly channelCommandContext?: ChannelCommandContext | null;
877
214
  /** Voice call-control prompt or null to skip. */
@@ -903,11 +240,6 @@ export interface TurnInjectionInputs {
903
240
  }> | null;
904
241
  }
905
242
 
906
- export interface DiskPressureInjectionContext {
907
- /** True when the current turn is allowed to run only for storage cleanup. */
908
- readonly cleanupModeActive: boolean;
909
- }
910
-
911
243
  /**
912
244
  * Per-turn execution context threaded through every middleware invocation.
913
245
  *
@@ -960,6 +292,20 @@ export interface TurnContext {
960
292
  * a context without `injectionInputs` produces an empty injection chain.
961
293
  */
962
294
  injectionInputs?: TurnInjectionInputs;
295
+ /**
296
+ * The {@link LLMCallSite} this turn's pipeline work belongs to —
297
+ * `"mainAgent"` for the user-facing conversational reply, or the specific
298
+ * background/utility site (`"compactionAgent"`, `"subagentSpawn"`,
299
+ * `"memoryConsolidation"`, `"conversationTitle"`, …) when the agent loop is
300
+ * driving non-main work that happens to share the same `conversationId`.
301
+ *
302
+ * Lets {@link Injector}s and pipeline middleware scope their behaviour to
303
+ * the main reply and stay out of background turns, which `onEvent` presence
304
+ * alone cannot distinguish (compaction and subagent loops also stream).
305
+ * Omitted by call sites that don't tag a site (synthesized test contexts);
306
+ * consumers should treat absence conservatively.
307
+ */
308
+ callSite?: LLMCallSite;
963
309
  }
964
310
 
965
311
  // ─── Injectors ───────────────────────────────────────────────────────────────
@@ -1039,8 +385,21 @@ export interface Injector {
1039
385
  name: string;
1040
386
  /** Ascending sort key — lower runs first. */
1041
387
  order: number;
1042
- /** Produce a block, or `null` to contribute nothing on this turn. */
1043
- produce(ctx: TurnContext): Promise<InjectionBlock | null>;
388
+ /**
389
+ * Produce a block, or `null` to contribute nothing on this turn.
390
+ *
391
+ * `runMessages` is the turn's working message array — the same array the
392
+ * chain's blocks are spliced onto — passed explicitly so injectors that
393
+ * need the current prompt contents (e.g. the PKB reminder, which scans for
394
+ * already-loaded `file_read` paths) read it from a parameter rather than a
395
+ * field on the shared {@link TurnContext}. Absent for text-only chain
396
+ * consumers ({@link composeInjectorChain}) that drive injectors without a
397
+ * message array.
398
+ */
399
+ produce(
400
+ ctx: TurnContext,
401
+ runMessages?: Message[],
402
+ ): Promise<InjectionBlock | null>;
1044
403
  }
1045
404
 
1046
405
  // ─── Model-visible capability slots ──────────────────────────────────────────
@@ -1108,22 +467,6 @@ export interface PluginSkillRegistration {
1108
467
 
1109
468
  // ─── Plugin ──────────────────────────────────────────────────────────────────
1110
469
 
1111
- /**
1112
- * A plugin lifecycle hook. Receives a per-lifecycle context shape and
1113
- * may return either a transformed context or `void`. Today's runtime
1114
- * consumes only the resolved-or-rejected nature of the promise; the
1115
- * `TCtx` return is reserved for future hooks that fan a transformed
1116
- * context out to downstream plugins.
1117
- *
1118
- * Each known hook key has a documented context shape:
1119
- * - `init` — {@link PluginInitContext}
1120
- * - `shutdown` — {@link PluginShutdownContext}
1121
- *
1122
- * Unknown keys are populated by the loader for forward compatibility
1123
- * but are not invoked by today's runtime.
1124
- */
1125
- export type PluginHookFn<TCtx = unknown> = (ctx: TCtx) => Promise<TCtx | void>;
1126
-
1127
470
  /**
1128
471
  * Map of lifecycle hooks contributed by a plugin. Keys match file
1129
472
  * basenames under `<plugin>/hooks/` — the external loader populates one
@@ -1143,7 +486,7 @@ export type PluginHooks = Record<string, PluginHookFn<any>>;
1143
486
 
1144
487
  /**
1145
488
  * A registered plugin. Every field besides `manifest` is optional — a plugin
1146
- * may contribute any combination of middleware, injectors, and model-visible
489
+ * may contribute any combination of middleware and model-visible
1147
490
  * capabilities. Lifecycle hooks live under `hooks`.
1148
491
  */
1149
492
  export interface Plugin {
@@ -1157,16 +500,14 @@ export interface Plugin {
1157
500
  * `@vellumai/plugin-api`); the loader derives `name` from the
1158
501
  * `tools/<name>.ts` basename and runs the definition through
1159
502
  * `finalizeTool` to fill omitted required fields, producing the
1160
- * `LoadedTool` values stored here. Category / ownership metadata is
503
+ * `Tool` values stored here. Category / ownership metadata is
1161
504
  * stamped by `registerPluginTools` at registration time.
1162
505
  */
1163
- tools?: LoadedTool[];
506
+ tools?: Tool[];
1164
507
  /** HTTP route registrations served by the assistant. */
1165
508
  routes?: PluginRouteRegistration[];
1166
509
  /** Skill registrations loaded at startup. */
1167
510
  skills?: PluginSkillRegistration[];
1168
- /** Prompt-time injectors contributed by this plugin. */
1169
- injectors?: Injector[];
1170
511
  /**
1171
512
  * Named middleware slots. At most one middleware per slot per plugin.
1172
513
  * The registry composes multiple plugins' middleware for a slot in