@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
@@ -5,13 +5,21 @@
5
5
  * before it is sent to the provider. They are pure (no side effects).
6
6
  */
7
7
 
8
- import { existsSync, readFileSync, statSync } from "node:fs";
9
- import { join, resolve } from "node:path";
8
+ import { statSync } from "node:fs";
9
+ import { join } from "node:path";
10
10
 
11
11
  import { type ChannelId, parseInterfaceId } from "../channels/types.js";
12
+ import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
12
13
  import { getConfig } from "../config/loader.js";
14
+ import { stripUserTextBlocksByPrefix } from "../context/strip-injections.js";
13
15
  import { createContextSummaryMessage } from "../context/window-manager.js";
14
- import { getAppDirPath, listAppFiles } from "../memory/app-store.js";
16
+ import { getDocumentsForConversation } from "../documents/document-store.js";
17
+ import {
18
+ getApp,
19
+ getAppDirPath,
20
+ listAppFiles,
21
+ resolveAppDir,
22
+ } from "../memory/app-store.js";
15
23
  import {
16
24
  getMessages as defaultGetMessages,
17
25
  type MessageRow,
@@ -19,8 +27,8 @@ import {
19
27
  import {
20
28
  countMemoryPrefixBlocks,
21
29
  extractMemoryPrefixBlocks,
30
+ stripAllMemoryInjections,
22
31
  } from "../memory/graph/conversation-graph-memory.js";
23
- import type { QdrantSparseVector } from "../memory/qdrant-client.js";
24
32
  import {
25
33
  readSlackMetadata,
26
34
  readSlackMetadataFromMessageMetadata,
@@ -33,9 +41,9 @@ import {
33
41
  type RenderedSlackTranscriptMessage,
34
42
  renderSlackTranscriptWithProvenance,
35
43
  } from "../messaging/providers/slack/render-transcript.js";
36
- import { getInjectors } from "../plugins/registry.js";
44
+ import { getInjectorChain } from "../plugins/defaults/memory-retrieval/injector-chain.js";
45
+ import { MEMORY_V3_BLOCK_ID } from "../plugins/defaults/memory-v3-shadow/types.js";
37
46
  import type {
38
- DiskPressureInjectionContext,
39
47
  InjectionBlock,
40
48
  InjectionPlacement,
41
49
  TurnContext,
@@ -51,12 +59,19 @@ import { channelStatusToMemberStatus } from "../runtime/routes/inbound-stages/ac
51
59
  import type { SubagentState } from "../subagent/types.js";
52
60
  import { TERMINAL_STATUSES } from "../subagent/types.js";
53
61
  import { canonicalizeInboundIdentity } from "../util/canonicalize-identity.js";
54
- import { getWorkspaceDir, getWorkspacePromptPath } from "../util/platform.js";
55
- import { stripCommentLines } from "../util/strip-comment-lines.js";
56
- import { filterMessagesForUntrustedActor } from "./conversation-lifecycle.js";
57
- import { type PkbContextConversation } from "./pkb-context-tracker.js";
62
+ import { findConversationOrSubagent } from "./conversation-registry.js";
63
+ import type {
64
+ DynamicPageSurfaceData,
65
+ SurfaceData,
66
+ SurfaceType,
67
+ } from "./message-protocol.js";
68
+ import { filterMessagesForUntrustedActor } from "./message-provenance.js";
58
69
  import type { TrustContext } from "./trust-context.js";
59
70
 
71
+ // The compaction strip lives in the compaction layer (`context/`) so the agent
72
+ // loop can own it; re-exported here for this module's existing consumers.
73
+ export { stripInjectionsForCompaction } from "../context/strip-injections.js";
74
+
60
75
  /**
61
76
  * Describes the capabilities of the channel through which the user is
62
77
  * interacting. Used to gate UI-specific references and permission asks.
@@ -255,8 +270,8 @@ export function isGroupChatType(chatType?: string): boolean {
255
270
  }
256
271
  }
257
272
 
258
- /** Context about the active workspace surface, passed to applyRuntimeInjections. */
259
- export interface ActiveSurfaceContext {
273
+ /** Context about the active workspace surface, rendered into the `<active_workspace>` block. */
274
+ interface ActiveSurfaceContext {
260
275
  surfaceId: string;
261
276
  html: string;
262
277
  /** When set, the surface is backed by a persisted app. */
@@ -269,8 +284,72 @@ export interface ActiveSurfaceContext {
269
284
  appPages?: Record<string, string>;
270
285
  /** The page currently displayed in the WebView (e.g. "settings.html"). */
271
286
  currentPage?: string;
272
- /** Pre-fetched list of files in the app directory. */
273
- appFiles?: string[];
287
+ }
288
+
289
+ /**
290
+ * Resolve the conversation's active workspace surface into the context block
291
+ * consumed by {@link applyRuntimeInjections}, or `null` when no dynamic-page
292
+ * surface is active. App-backed surfaces are enriched with their persisted app
293
+ * metadata; the file tree is listed on demand by the injector.
294
+ */
295
+ export function buildActiveSurfaceContext(params: {
296
+ currentActiveSurfaceId: string | undefined;
297
+ currentPage: string | undefined;
298
+ surfaceState: ReadonlyMap<
299
+ string,
300
+ { surfaceType: SurfaceType; data: SurfaceData }
301
+ >;
302
+ }): ActiveSurfaceContext | null {
303
+ const { currentActiveSurfaceId, currentPage, surfaceState } = params;
304
+ if (!currentActiveSurfaceId) return null;
305
+
306
+ const stored = surfaceState.get(currentActiveSurfaceId);
307
+ if (!stored || stored.surfaceType !== "dynamic_page") return null;
308
+
309
+ const data = stored.data as DynamicPageSurfaceData;
310
+ const activeSurface: ActiveSurfaceContext = {
311
+ surfaceId: currentActiveSurfaceId,
312
+ html: data.html,
313
+ currentPage,
314
+ };
315
+
316
+ if (data.appId) {
317
+ const app = getApp(data.appId);
318
+ if (app) {
319
+ activeSurface.appId = app.id;
320
+ activeSurface.appName = app.name;
321
+ activeSurface.appDirName = resolveAppDir(app.id).dirName;
322
+ activeSurface.appSchemaJson = app.schemaJson;
323
+ if (app.pages && Object.keys(app.pages).length > 0) {
324
+ activeSurface.appPages = app.pages;
325
+ }
326
+ }
327
+ }
328
+
329
+ return activeSurface;
330
+ }
331
+
332
+ /**
333
+ * Lists the conversation's active documents as the lightweight summaries the
334
+ * `active-documents` injector surfaces to the assistant — letting it target
335
+ * existing documents with `document_update` instead of issuing duplicate
336
+ * `document_create` calls. Returns `null` when the conversation has none.
337
+ */
338
+ export function buildActiveDocuments(conversationId: string): Array<{
339
+ surfaceId: string;
340
+ title: string;
341
+ wordCount: number;
342
+ updatedAt: number;
343
+ }> | null {
344
+ const conversationDocs = getDocumentsForConversation(conversationId);
345
+ return conversationDocs.length > 0
346
+ ? conversationDocs.map((d) => ({
347
+ surfaceId: d.surfaceId,
348
+ title: d.title,
349
+ wordCount: d.wordCount,
350
+ updatedAt: d.updatedAt,
351
+ }))
352
+ : null;
274
353
  }
275
354
 
276
355
  const MAX_CONTEXT_LENGTH = 100_000;
@@ -299,7 +378,7 @@ function injectActiveSurfaceContext(
299
378
  lines.push(
300
379
  `The user is viewing app "${ctx.appName ?? "Untitled"}" (app_id: "${ctx.appId}", slug: "${slug}") in workspace mode.`,
301
380
  "",
302
- 'PREREQUISITE: If `app_refresh` is not yet available, call `skill_load` with `id: "app-builder"` first to load it.',
381
+ 'PREREQUISITE: If `app_refresh` is not yet available, call `skill_load` with `skill: "app-builder"` first to load it.',
303
382
  "",
304
383
  "RULES FOR WORKSPACE MODIFICATION:",
305
384
  `1. Use \`file_edit\` to make surgical changes to app files. The file path is \`${getAppDirPath(ctx.appId)}/<path>\`.`,
@@ -313,7 +392,7 @@ function injectActiveSurfaceContext(
313
392
  );
314
393
 
315
394
  // File tree with sizes (capped at 50 files to bound prompt size)
316
- const files = ctx.appFiles ?? listAppFiles(ctx.appId);
395
+ const files = listAppFiles(ctx.appId);
317
396
  const MAX_FILE_TREE_ENTRIES = 50;
318
397
  const displayFiles = files.slice(0, MAX_FILE_TREE_ENTRIES);
319
398
  lines.push("", "App files:");
@@ -488,7 +567,7 @@ export function buildSubagentStatusBlock(
488
567
  }
489
568
 
490
569
  // The `<active_subagents>` block is emitted by the `subagent-status` default
491
- // injector (`plugins/defaults/injectors.ts`) as an `append-user-tail`
570
+ // injector (`plugins/defaults/memory-retrieval/injectors.ts`) as an `append-user-tail`
492
571
  // placement. Use {@link applyRuntimeInjections} with
493
572
  // `options.subagentStatusBlock` set, or drive the injector chain directly
494
573
  // via `collectInjectorBlocks`.
@@ -512,30 +591,7 @@ function injectVoiceCallControlContext(
512
591
  // NOW.md scratchpad injection
513
592
  // ---------------------------------------------------------------------------
514
593
 
515
- /**
516
- * Read the NOW.md scratchpad from the workspace prompt directory.
517
- *
518
- * Returns the trimmed content with `_`-prefixed comment lines stripped,
519
- * or `null` if the file is missing, empty, or unreadable.
520
- */
521
- export function readNowScratchpad(): string | null {
522
- const nowPath = getWorkspacePromptPath("NOW.md");
523
- if (!existsSync(nowPath)) return null;
524
- try {
525
- const stripped = stripCommentLines(readFileSync(nowPath, "utf-8")).trim();
526
- return stripped.length > 0 ? stripped : null;
527
- } catch {
528
- return null;
529
- }
530
- }
531
-
532
- /**
533
- * The `<NOW.md>` block is emitted by the `now-md` default injector
534
- * (`plugins/defaults/injectors.ts`) as an `after-memory-prefix` placement.
535
- * Use {@link applyRuntimeInjections} with `options.nowScratchpad` set.
536
- */
537
-
538
- /** Strip `<NOW.md>` blocks injected by `injectNowScratchpad`. */
594
+ /** Strip `<NOW.md>` blocks injected by the `now-md` default injector. */
539
595
  export function stripNowScratchpad(messages: Message[]): Message[] {
540
596
  return stripUserTextBlocksByPrefix(messages, [
541
597
  // Shared prefix catches both the current tag and any pre-line-limit
@@ -545,102 +601,6 @@ export function stripNowScratchpad(messages: Message[]): Message[] {
545
601
  ]);
546
602
  }
547
603
 
548
- // ---------------------------------------------------------------------------
549
- // PKB (Personal Knowledge Base) injection
550
- // ---------------------------------------------------------------------------
551
-
552
- const PKB_DEFAULT_FILES = [
553
- "INDEX.md",
554
- "essentials.md",
555
- "threads.md",
556
- "buffer.md",
557
- ];
558
-
559
- const AUTOINJECT_FILENAME = "_autoinject.md";
560
-
561
- /** Max buffer.md lines injected into prompts — keeps context bounded even when filing is off. */
562
- const MAX_BUFFER_LINES = 50;
563
-
564
- /**
565
- * Read `_autoinject.md` from the PKB directory and return the list of
566
- * filenames to inject.
567
- *
568
- * - Returns `null` when the file is missing or unreadable — callers
569
- * should fall back to the hardcoded defaults.
570
- * - Returns `[]` when the file exists but has no entries (empty or
571
- * comments only) — an explicit opt-out meaning "inject nothing."
572
- */
573
- export function readAutoinjectList(pkbDir: string): string[] | null {
574
- const filePath = join(pkbDir, AUTOINJECT_FILENAME);
575
- if (!existsSync(filePath)) return null;
576
- try {
577
- const raw = stripCommentLines(readFileSync(filePath, "utf-8"));
578
- const files = raw
579
- .split("\n")
580
- .map((l) => l.trim())
581
- .filter((l) => l.length > 0);
582
- return files.length > 0 ? files : [];
583
- } catch {
584
- return null;
585
- }
586
- }
587
-
588
- /**
589
- * Resolve the effective list of auto-inject filenames for a PKB directory.
590
- *
591
- * This is the single source of truth used both by `readPkbContext` (which
592
- * actually injects the files) and by the PKB reminder-hint tracker in
593
- * `conversation-agent-loop.ts` (which needs to know what's already in
594
- * context so it doesn't redundantly recommend those files).
595
- *
596
- * Returns `PKB_DEFAULT_FILES` when `_autoinject.md` is missing/unreadable,
597
- * or the parsed list (possibly empty) when it is present.
598
- */
599
- export function getPkbAutoInjectList(pkbRoot: string): string[] {
600
- return readAutoinjectList(pkbRoot) ?? PKB_DEFAULT_FILES;
601
- }
602
-
603
- /**
604
- * Read the always-loaded PKB files and append a nudge encouraging the
605
- * assistant to proactively read topic files and use `remember` aggressively.
606
- *
607
- * Which files are loaded is determined by `pkb/_autoinject.md` (one filename
608
- * per line). Falls back to the built-in defaults when that file is absent.
609
- *
610
- * Returns the concatenated content ready for injection, or `null` if all
611
- * files are missing or empty.
612
- */
613
- export function readPkbContext(): string | null {
614
- const pkbDir = join(getWorkspaceDir(), "pkb");
615
- if (!existsSync(pkbDir)) return null;
616
-
617
- const filesToInject = getPkbAutoInjectList(pkbDir);
618
-
619
- const parts: string[] = [];
620
- for (const file of filesToInject) {
621
- // Path traversal guard: reject entries that escape the pkb directory
622
- const filePath = resolve(pkbDir, file);
623
- if (!filePath.startsWith(pkbDir + "/")) continue;
624
-
625
- if (!existsSync(filePath)) continue;
626
- try {
627
- let content = stripCommentLines(readFileSync(filePath, "utf-8")).trim();
628
- if (file === "buffer.md" && content.length > 0) {
629
- // Cap buffer entries to prevent unbounded growth when filing is disabled
630
- const lines = content.split("\n");
631
- if (lines.length > MAX_BUFFER_LINES) {
632
- content = lines.slice(-MAX_BUFFER_LINES).join("\n");
633
- }
634
- }
635
- if (content.length > 0) parts.push(content);
636
- } catch {
637
- // Skip unreadable files
638
- }
639
- }
640
-
641
- return parts.length > 0 ? parts.join("\n\n") : null;
642
- }
643
-
644
604
  /**
645
605
  * Prepend channel capability context to the last user message so the
646
606
  * model knows what the current channel can and cannot do.
@@ -992,53 +952,6 @@ export function buildUnifiedTurnContextBlock(
992
952
  return lines.join("\n");
993
953
  }
994
954
 
995
- // ---------------------------------------------------------------------------
996
- // Prefix-based stripping primitive
997
- // ---------------------------------------------------------------------------
998
-
999
- /**
1000
- * A matcher for an injected text block. A plain string matches by prefix
1001
- * (`startsWith`). A `{ prefix, suffix }` wrapper requires BOTH the opening
1002
- * prefix and the closing suffix, so user-authored content that merely begins
1003
- * with an injection-like opening tag (e.g. a message discussing `<info>`
1004
- * markup) is not mistaken for an injected block and dropped. This mirrors
1005
- * `countMemoryPrefixBlocks`, which only treats `<memory>…</memory>` /
1006
- * `<info>…</info>` blocks as injected when the full wrapper is present.
1007
- */
1008
- type InjectionMatcher = string | { prefix: string; suffix: string };
1009
-
1010
- /**
1011
- * Remove text blocks from user messages that match any of the given matchers.
1012
- * If stripping removes all content blocks from a message, the message itself
1013
- * is dropped.
1014
- *
1015
- * This is the shared primitive behind the individual strip* functions and
1016
- * the `stripInjectionsForCompaction` pipeline.
1017
- */
1018
- function stripUserTextBlocksByPrefix(
1019
- messages: Message[],
1020
- matchers: InjectionMatcher[],
1021
- ): Message[] {
1022
- return messages
1023
- .map((message) => {
1024
- if (message.role !== "user") return message;
1025
- const nextContent = message.content.filter((block) => {
1026
- if (block.type !== "text") return true;
1027
- return !matchers.some((m) =>
1028
- typeof m === "string"
1029
- ? block.text.startsWith(m)
1030
- : block.text.startsWith(m.prefix) && block.text.endsWith(m.suffix),
1031
- );
1032
- });
1033
- if (nextContent.length === message.content.length) return message;
1034
- if (nextContent.length === 0) return null;
1035
- return { ...message, content: nextContent };
1036
- })
1037
- .filter(
1038
- (message): message is NonNullable<typeof message> => message != null,
1039
- );
1040
- }
1041
-
1042
955
  // ---------------------------------------------------------------------------
1043
956
  // Individual strip functions (thin wrappers around the primitive)
1044
957
  // ---------------------------------------------------------------------------
@@ -1647,10 +1560,9 @@ function buildActiveThreadBlockFromRenderable(
1647
1560
 
1648
1561
  if (members.length === 0) return null;
1649
1562
 
1650
- // The active-thread block is flattened to plain text below, which discards
1651
- // `Message.role`. Assistant rows that render content-only are relabeled in
1652
- // the post-render step. Timezone-aware assistant rows are already
1653
- // bracket-tagged by the renderer and must not receive another prefix.
1563
+ // The active-thread block is flattened to plain text below. User rows keep
1564
+ // explicit Slack attribution through the renderer; assistant rows pass
1565
+ // through unchanged so the model does not learn a synthetic reply prefix.
1654
1566
  // Unnamed user rows (no real Slack displayName) get a `@user` senderLabel
1655
1567
  // here so their tag line carries attribution through the renderer. Labeled
1656
1568
  // user rows and assistant rows pass through unchanged.
@@ -1662,18 +1574,8 @@ function buildActiveThreadBlockFromRenderable(
1662
1574
 
1663
1575
  const rendered = renderSlackTranscriptWithProvenance(labeledMembers);
1664
1576
  if (rendered.renderedMessages.length === 0) return null;
1665
- // Reaction / overflow-trailer lines are renderer-owned Slack event lines,
1666
- // and timezone-aware assistant rows already carry metadata-backed compact
1667
- // attribution. Regular assistant content and the `[deleted]` sentinel get
1668
- // the prefix so attribution survives flattening.
1669
1577
  const lines = rendered.renderedMessages
1670
- .map((entry) => {
1671
- const text = extractTagLineTexts([entry.message])[0] ?? "";
1672
- return entry.message.role === "assistant" &&
1673
- entry.tagLineProvenance === "none"
1674
- ? `@assistant: ${text}`
1675
- : text;
1676
- })
1578
+ .map((entry) => extractTagLineTexts([entry.message])[0] ?? "")
1677
1579
  .join("\n");
1678
1580
  return `<active_thread>\n${lines}\n</active_thread>`;
1679
1581
  }
@@ -1735,98 +1637,6 @@ export function loadSlackActiveThreadFocusBlock(
1735
1637
  return assembleSlackActiveThreadFocusBlock(rows, capabilities);
1736
1638
  }
1737
1639
 
1738
- /** Matchers stripped by the pipeline (order doesn't matter — single pass). */
1739
- const RUNTIME_INJECTION_PREFIXES: InjectionMatcher[] = [
1740
- "<channel_capabilities>",
1741
- "<channel_command_context>",
1742
- "<disk_pressure_warning>",
1743
- "<channel_turn_context>", // backward-compat: strip legacy separate channel blocks
1744
- "<guardian_context>",
1745
- "<inbound_actor_context>", // backward-compat: strip legacy separate actor blocks
1746
- "<interface_turn_context>", // backward-compat: strip legacy separate interface blocks
1747
- // NOTE: <turn_context> is intentionally NOT stripped — unified turn context
1748
- // blocks persist in history so the assistant retains temporal/actor grounding.
1749
- "<background_turn>",
1750
- "<memory_context __injected>",
1751
- "<memory_context>", // backward-compat: strip legacy blocks from pre-__injected history
1752
- // The static `memory-v2-static` block (`<info>\n…</info>`) and the
1753
- // dynamic activation block (`<memory>\n…</memory>`, plus legacy
1754
- // `<memory __injected>…`) are both stripped so each compaction
1755
- // re-injects the freshest essentials/threads/recent/buffer view and
1756
- // re-runs the activation pipeline, matching the `<knowledge_base>`
1757
- // cadence. The activation pipeline dedupes via `everInjected`, and
1758
- // compaction handles aggregate growth, so accumulation does not cause
1759
- // unbounded context growth. Both wrappers may appear in persisted rows.
1760
- //
1761
- // These two use the full `{ prefix, suffix }` wrapper shape (not a bare
1762
- // prefix) so that user-authored text merely starting with `<memory>\n` or
1763
- // `<info>\n` is never silently dropped during compaction/`/clean`. This
1764
- // matches the full-wrapper requirement in `countMemoryPrefixBlocks`.
1765
- { prefix: "<memory>\n", suffix: "\n</memory>" },
1766
- { prefix: "<info>\n", suffix: "\n</info>" },
1767
- "<voice_call_control>",
1768
- "<workspace_top_level>", // backward-compat: strip legacy workspace blocks
1769
- // NOTE: <workspace> is intentionally NOT stripped — workspace context
1770
- // persists in history so the assistant retains workspace grounding.
1771
- "<temporal_context>\nToday:", // backward-compat: strip legacy temporal blocks
1772
- "<active_subagents>",
1773
- "<active_workspace>",
1774
- "<active_dynamic_page>",
1775
- "<non_interactive_context>",
1776
- // Shared prefix catches both the current NOW.md tag and any pre-line-limit
1777
- // variant that may linger in in-flight histories during a rolling deploy.
1778
- "<NOW.md Always keep this up to date",
1779
- "<now_scratchpad>", // backward-compat: strip legacy blocks from pre-rename history
1780
- "<knowledge_base>",
1781
- "<pkb>", // backward-compat: strip legacy tag from pre-rename history
1782
- "<system_reminder>",
1783
- "<transport_hints>",
1784
- // The Slack active-thread focus block is non-persisted and injected on
1785
- // the FINAL user turn only. Strip it here so re-assembly during compaction
1786
- // and overflow recovery does not duplicate it across turns.
1787
- "<active_thread>",
1788
- "<system_notice>One or more tool calls returned an error.",
1789
- ];
1790
-
1791
- /**
1792
- * Strip all runtime-injected context from message history in a single pass.
1793
- *
1794
- * Used only during compaction and overflow recovery — not on normal turns.
1795
- * Runtime injections persist in history to keep the conversation prefix
1796
- * stable for Anthropic's prefix caching. Stripping is only needed when
1797
- * compaction rewrites the message array (cache miss is expected anyway).
1798
- */
1799
- export function stripInjectionsForCompaction(messages: Message[]): Message[] {
1800
- return stripUserTextBlocksByPrefix(messages, RUNTIME_INJECTION_PREFIXES);
1801
- }
1802
-
1803
- /**
1804
- * Extract the most recently injected NOW.md content from the message history.
1805
- * Returns null if no NOW.md injection is found.
1806
- */
1807
- export function findLastInjectedNowContent(messages: Message[]): string | null {
1808
- // Matches every NOW.md opening tag we emit (the tag text may evolve over
1809
- // time, e.g. adding a line-limit hint), so in-flight histories with older
1810
- // tag variants remain discoverable during a rolling deploy.
1811
- const openTagPrefix = "<NOW.md Always keep this up to date";
1812
- const suffix = "\n</NOW.md>";
1813
- for (let i = messages.length - 1; i >= 0; i--) {
1814
- const msg = messages[i];
1815
- if (msg.role !== "user") continue;
1816
- for (const block of msg.content) {
1817
- if (block.type !== "text" || !block.text.startsWith(openTagPrefix)) {
1818
- continue;
1819
- }
1820
- const tagEnd = block.text.indexOf(">\n");
1821
- if (tagEnd < 0) continue;
1822
- const contentStart = tagEnd + ">\n".length;
1823
- const end = block.text.lastIndexOf(suffix);
1824
- if (end > contentStart) return block.text.slice(contentStart, end);
1825
- }
1826
- }
1827
- return null;
1828
- }
1829
-
1830
1640
  /**
1831
1641
  * Controls which runtime injections are applied.
1832
1642
  *
@@ -1874,8 +1684,14 @@ export interface RuntimeInjectionResult {
1874
1684
  }
1875
1685
 
1876
1686
  /**
1877
- * Run every registered {@link Injector}'s `produce()` in ascending `order`
1878
- * and return every non-null block the chain produced.
1687
+ * Run every {@link Injector} in the chain ({@link getInjectorChain}, already
1688
+ * sorted by ascending `order`) and return every non-null block it produced.
1689
+ *
1690
+ * `runMessages` is the turn's working message array, forwarded to each
1691
+ * injector so producers that need the current prompt contents read it from a
1692
+ * parameter rather than the shared {@link TurnContext}. Omitted by text-only
1693
+ * callers ({@link composeInjectorChain}) that drive the chain without a
1694
+ * message array.
1879
1695
  *
1880
1696
  * Injectors returning `null` are omitted from the result. The returned array
1881
1697
  * preserves ascending-`order` sort so downstream callers (notably
@@ -1884,12 +1700,11 @@ export interface RuntimeInjectionResult {
1884
1700
  */
1885
1701
  async function collectInjectorBlocks(
1886
1702
  ctx: TurnContext,
1703
+ runMessages?: Message[],
1887
1704
  ): Promise<InjectionBlock[]> {
1888
- const injectors = getInjectors();
1889
- if (injectors.length === 0) return [];
1890
1705
  const out: InjectionBlock[] = [];
1891
- for (const injector of injectors) {
1892
- const block = await injector.produce(ctx);
1706
+ for (const injector of getInjectorChain()) {
1707
+ const block = await injector.produce(ctx, runMessages);
1893
1708
  if (block) out.push(block);
1894
1709
  }
1895
1710
  return out;
@@ -2007,63 +1822,21 @@ function applyInjectionBlock(
2007
1822
  * bag attached to the {@link TurnContext} the caller provides (or to an
2008
1823
  * ephemeral {@link TurnContext} synthesized for test call sites). A small
2009
1824
  * number of fields drive hardcoded branches that live outside the injector
2010
- * chain — `activeSurface`, `channelCapabilities`, `channelCommandContext`,
2011
- * `voiceCallControlPrompt`, `transportHints`, and `isNonInteractive` —
2012
- * because they are orchestrator-owned content that never made sense as
2013
- * plugin-overridable default injectors.
1825
+ * chain — `channelCommandContext`, `voiceCallControlPrompt`,
1826
+ * `transportHints`, and `isNonInteractive` — because they are
1827
+ * orchestrator-owned content that never made sense as plugin-overridable
1828
+ * default injectors.
1829
+ *
1830
+ * The active workspace surface, the channel capabilities, and the active
1831
+ * document list are not on this bag: `applyRuntimeInjections` resolves them
1832
+ * from the live conversation itself (its surface state, `channelCapabilities`,
1833
+ * and the document store keyed by `conversationId` respectively), so the
1834
+ * orchestrator does not compute or thread them per turn.
2014
1835
  */
2015
1836
  export interface RuntimeInjectionOptions {
2016
- diskPressureContext?: DiskPressureInjectionContext | null;
2017
- /**
2018
- * Active dashboard-surface context (read from `<active_workspace>`). Kept
2019
- * on the options bag rather than an injector because it is a
2020
- * channel-capability concern that has never been gated as a default
2021
- * injector.
2022
- */
2023
- activeSurface?: ActiveSurfaceContext | null;
2024
- workspaceTopLevelContext?: string | null;
2025
- channelCapabilities?: ChannelCapabilities | null;
2026
1837
  channelCommandContext?: ChannelCommandContext | null;
2027
1838
  unifiedTurnContext?: string | null;
2028
1839
  voiceCallControlPrompt?: string | null;
2029
- pkbContext?: string | null;
2030
- pkbActive?: boolean;
2031
- /**
2032
- * Dense query vector surfaced from the graph memory retriever.
2033
- * When present together with `pkbActive`, used to run `searchPkbFiles`
2034
- * to surface relevance hints in the PKB system reminder. When missing,
2035
- * the reminder falls back to the flat static text.
2036
- */
2037
- pkbQueryVector?: number[];
2038
- /** Optional sparse vector accompanying `pkbQueryVector`. */
2039
- pkbSparseVector?: QdrantSparseVector;
2040
- /** Memory scope id used to filter PKB search results. */
2041
- pkbScopeId?: string;
2042
- /**
2043
- * The live conversation (or a minimal shape containing `messages`) used
2044
- * to compute which PKB paths are already "in context" and therefore
2045
- * suppressed from hint suggestions.
2046
- */
2047
- pkbConversation?: PkbContextConversation;
2048
- /** Auto-injected PKB filenames (resolved relative to `pkbRoot`). */
2049
- pkbAutoInjectList?: string[];
2050
- /** Absolute path to the PKB directory (e.g. `<workspace>/pkb`). */
2051
- pkbRoot?: string;
2052
- /**
2053
- * Working directory against which relative `file_read` tool paths
2054
- * resolve, used to detect workspace-relative reads like
2055
- * `pkb/threads.md`. Falls back to `pkbRoot` when omitted.
2056
- */
2057
- pkbWorkingDir?: string;
2058
- /**
2059
- * Pre-rendered v2 static memory content (essentials/threads/recent/buffer
2060
- * concatenated, header-wrapped). When non-null on full-mode turns the
2061
- * `memory-v2-static` injector wraps it in `<info>` and splices it onto
2062
- * the user message; subsequent turns leave the prior block cached on its
2063
- * original user message.
2064
- */
2065
- memoryV2Static?: string | null;
2066
- nowScratchpad?: string | null;
2067
1840
  subagentStatusBlock?: string | null;
2068
1841
  isNonInteractive?: boolean;
2069
1842
  /**
@@ -2108,7 +1881,6 @@ export interface RuntimeInjectionOptions {
2108
1881
  * `undefined` when the inbound is a top-level (non-thread) post.
2109
1882
  */
2110
1883
  slackActiveThreadFocusBlock?: string | null;
2111
- activeDocuments?: TurnInjectionInputs["activeDocuments"];
2112
1884
  mode?: InjectionMode;
2113
1885
  /**
2114
1886
  * Per-turn {@link TurnContext} forwarded to plugin-registered
@@ -2136,44 +1908,38 @@ export interface RuntimeInjectionOptions {
2136
1908
  */
2137
1909
  function buildTurnInjectionInputs(
2138
1910
  options: RuntimeInjectionOptions,
1911
+ channelCapabilities: ChannelCapabilities | null,
1912
+ activeDocuments: TurnInjectionInputs["activeDocuments"],
2139
1913
  ): TurnInjectionInputs {
2140
1914
  return {
2141
1915
  mode: options.mode,
2142
- diskPressureContext: options.diskPressureContext,
2143
- workspaceTopLevelContext: options.workspaceTopLevelContext,
2144
1916
  unifiedTurnContext: options.unifiedTurnContext,
2145
- pkbContext: options.pkbContext,
2146
- pkbActive: options.pkbActive,
2147
- pkbQueryVector: options.pkbQueryVector,
2148
- pkbSparseVector: options.pkbSparseVector,
2149
- pkbScopeId: options.pkbScopeId,
2150
- pkbConversation: options.pkbConversation,
2151
- pkbAutoInjectList: options.pkbAutoInjectList,
2152
- pkbRoot: options.pkbRoot,
2153
- pkbWorkingDir: options.pkbWorkingDir,
2154
- memoryV2Static: options.memoryV2Static,
2155
- nowScratchpad: options.nowScratchpad,
2156
1917
  subagentStatusBlock: options.subagentStatusBlock,
2157
- channelCapabilities: options.channelCapabilities,
1918
+ channelCapabilities,
2158
1919
  slackChronologicalMessages: options.slackChronologicalMessages,
2159
1920
  slackActiveThreadFocusBlock: options.slackActiveThreadFocusBlock,
2160
- activeSurface: options.activeSurface,
2161
1921
  channelCommandContext: options.channelCommandContext,
2162
1922
  voiceCallControlPrompt: options.voiceCallControlPrompt,
2163
1923
  transportHints: options.transportHints,
2164
1924
  isNonInteractive: options.isNonInteractive,
2165
1925
  isBackgroundConversation: options.isBackgroundConversation,
2166
- activeDocuments: options.activeDocuments,
1926
+ activeDocuments,
2167
1927
  };
2168
1928
  }
2169
1929
 
1930
+ /**
1931
+ * Conversation id used for the synthetic fallback {@link TurnContext} and the
1932
+ * live-conversation lookup when the caller omits a context (test call sites).
1933
+ */
1934
+ const RUNTIME_ASSEMBLY_FALLBACK_CONVERSATION_ID = "runtime-assembly-fallback";
1935
+
2170
1936
  /** Minimal synthetic TurnContext used when the caller omits one. */
2171
1937
  function synthesizeFallbackTurnContext(
2172
1938
  inputs: TurnInjectionInputs,
2173
1939
  ): TurnContext {
2174
1940
  return {
2175
- requestId: "runtime-assembly-fallback",
2176
- conversationId: "runtime-assembly-fallback",
1941
+ requestId: RUNTIME_ASSEMBLY_FALLBACK_CONVERSATION_ID,
1942
+ conversationId: RUNTIME_ASSEMBLY_FALLBACK_CONVERSATION_ID,
2177
1943
  turnIndex: 0,
2178
1944
  trust: {
2179
1945
  sourceChannel: inputs.channelCapabilities?.channel
@@ -2214,6 +1980,8 @@ function synthesizeFallbackTurnContext(
2214
1980
  * 6. Run the remaining hardcoded branches (`isNonInteractive`,
2215
1981
  * `voiceCallControlPrompt`, `activeSurface`, `channelCapabilities`,
2216
1982
  * `channelCommandContext`, `transportHints`) in their historical order.
1983
+ * `activeSurface` and `channelCapabilities` are sourced from the live
1984
+ * conversation rather than `options`.
2217
1985
  * 7. Finally, apply the chain's remaining blocks by placement:
2218
1986
  * `"append-user-tail"` in ascending `order`, then `"prepend-user-tail"`
2219
1987
  * in descending `order` so the lowest-`order` prepend lands topmost in
@@ -2228,19 +1996,39 @@ export async function applyRuntimeInjections(
2228
1996
  options: RuntimeInjectionOptions,
2229
1997
  ): Promise<RuntimeInjectionResult> {
2230
1998
  const mode = options.mode ?? "full";
2231
- const slackConversation = options.channelCapabilities?.channel === "slack";
1999
+
2000
+ // Source the channel capabilities from the live conversation rather than a
2001
+ // per-turn option computed by the orchestrator. The same value drives the
2002
+ // Slack-conversation gate, the `<channel_capabilities>` branch, and the
2003
+ // per-injector inputs the Slack injectors read.
2004
+ const conversationId =
2005
+ options.turnContext?.conversationId ??
2006
+ RUNTIME_ASSEMBLY_FALLBACK_CONVERSATION_ID;
2007
+ const channelCapabilities =
2008
+ findConversationOrSubagent(conversationId)?.channelCapabilities ?? null;
2009
+ const slackConversation = channelCapabilities?.channel === "slack";
2010
+
2011
+ // Source the active documents from the document store keyed by the same
2012
+ // conversation id rather than a per-turn option computed by the
2013
+ // orchestrator; the `active-documents` and `document-comments` injectors
2014
+ // read the result off their per-injector inputs.
2015
+ const activeDocuments = buildActiveDocuments(conversationId);
2232
2016
 
2233
2017
  // Build the per-injector inputs and attach them to the caller's
2234
2018
  // TurnContext (without mutating it). When the caller didn't supply one,
2235
2019
  // synthesize a minimal fallback so the chain still runs — test call sites
2236
2020
  // that drive injection via `options` without constructing a full context
2237
2021
  // continue to work.
2238
- const injectionInputs = buildTurnInjectionInputs(options);
2022
+ const injectionInputs = buildTurnInjectionInputs(
2023
+ options,
2024
+ channelCapabilities,
2025
+ activeDocuments,
2026
+ );
2239
2027
  const turnCtx: TurnContext = options.turnContext
2240
2028
  ? { ...options.turnContext, injectionInputs }
2241
2029
  : synthesizeFallbackTurnContext(injectionInputs);
2242
2030
 
2243
- const chainBlocks = await collectInjectorBlocks(turnCtx);
2031
+ const chainBlocks = await collectInjectorBlocks(turnCtx, runMessages);
2244
2032
 
2245
2033
  // Split the chain output by placement so the downstream assembly can
2246
2034
  // process each slot with the correct ordering rule.
@@ -2319,7 +2107,30 @@ export async function applyRuntimeInjections(
2319
2107
  ? injectorChainPieces.join("\n\n")
2320
2108
  : undefined;
2321
2109
 
2322
- let result = runMessages;
2110
+ // ── Step 0: memory-v3-live v2 suppression ──
2111
+ // When the `memory-v3-live` flag is on AND the v3 injector actually produced
2112
+ // a block this turn, v3 is the sole `<memory>` source. v2's `prepareMemory`
2113
+ // already prepended its own `<memory>` block to the tail user message (and
2114
+ // historical turns may carry v2 blocks from earlier turns). Strip every user
2115
+ // message's memory prefix here so:
2116
+ // 1. The v3 `after-memory-prefix` block (Step 2) lands at the top of the
2117
+ // tail with no v2 prefix ahead of it — exactly one `<memory>` block.
2118
+ // 2. History is byte-stable across turns for prompt caching.
2119
+ // Keyed off the v3 block being present (not the flag alone) so a v3 failure
2120
+ // (`produce()` → null) leaves v2's block intact — fallback rather than a
2121
+ // memory-less turn. Idempotent: re-injection sites that already stripped
2122
+ // see no change. Flag off → bit-for-bit identical to the v2 path.
2123
+ const suppressV2MemoryForV3 = isAssistantFeatureFlagEnabled(
2124
+ "memory-v3-live",
2125
+ getConfig(),
2126
+ );
2127
+ const v3ProducedBlock = afterMemory.some((b) => b.id === MEMORY_V3_BLOCK_ID);
2128
+ let runMessagesForAssembly = runMessages;
2129
+ if (suppressV2MemoryForV3 && v3ProducedBlock) {
2130
+ runMessagesForAssembly = stripAllMemoryInjections(runMessages);
2131
+ }
2132
+
2133
+ let result = runMessagesForAssembly;
2323
2134
 
2324
2135
  // ── Step 1: Slack chronological replacement (chain "replace" block) ──
2325
2136
  if (replaceBlock && replaceBlock.messagesOverride) {
@@ -2328,7 +2139,9 @@ export async function applyRuntimeInjections(
2328
2139
  // runtime assembly runs. The Slack transcript is freshly rendered
2329
2140
  // from persisted rows and has no such prefix, so swap it in and then
2330
2141
  // re-prepend the captured prefix onto the new tail user message.
2331
- const carriedMemoryBlocks = extractMemoryPrefixBlocks(runMessages);
2142
+ const carriedMemoryBlocks = extractMemoryPrefixBlocks(
2143
+ runMessagesForAssembly,
2144
+ );
2332
2145
  result = replaceBlock.messagesOverride;
2333
2146
  if (carriedMemoryBlocks.length > 0) {
2334
2147
  const slackTail = result[result.length - 1];
@@ -2394,22 +2207,36 @@ export async function applyRuntimeInjections(
2394
2207
  }
2395
2208
  }
2396
2209
 
2397
- if (mode === "full" && options.activeSurface) {
2398
- const userTail = result[result.length - 1];
2399
- if (userTail && userTail.role === "user") {
2400
- result = [
2401
- ...result.slice(0, -1),
2402
- injectActiveSurfaceContext(userTail, options.activeSurface),
2403
- ];
2210
+ if (mode === "full") {
2211
+ // Source the active workspace surface from the live conversation's surface
2212
+ // state rather than from a per-turn option computed by the orchestrator.
2213
+ const surfaceConversation = findConversationOrSubagent(
2214
+ turnCtx.conversationId,
2215
+ );
2216
+ const activeSurface = surfaceConversation
2217
+ ? buildActiveSurfaceContext({
2218
+ currentActiveSurfaceId: surfaceConversation.currentActiveSurfaceId,
2219
+ currentPage: surfaceConversation.currentPage,
2220
+ surfaceState: surfaceConversation.surfaceState,
2221
+ })
2222
+ : null;
2223
+ if (activeSurface) {
2224
+ const userTail = result[result.length - 1];
2225
+ if (userTail && userTail.role === "user") {
2226
+ result = [
2227
+ ...result.slice(0, -1),
2228
+ injectActiveSurfaceContext(userTail, activeSurface),
2229
+ ];
2230
+ }
2404
2231
  }
2405
2232
  }
2406
2233
 
2407
- if (options.channelCapabilities) {
2234
+ if (channelCapabilities) {
2408
2235
  const userTail = result[result.length - 1];
2409
2236
  if (userTail && userTail.role === "user") {
2410
2237
  result = [
2411
2238
  ...result.slice(0, -1),
2412
- injectChannelCapabilityContext(userTail, options.channelCapabilities),
2239
+ injectChannelCapabilityContext(userTail, channelCapabilities),
2413
2240
  ];
2414
2241
  }
2415
2242
  }