@vellumai/assistant 0.8.6 → 0.8.7-dev.202606052135.3e62c5a

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 (1079) 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 +80 -281
  10. package/examples/plugins/echo/README.md +28 -37
  11. package/examples/plugins/echo/register.ts +35 -117
  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 +320 -314
  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__/pkb-autoinject.test.ts +2 -5
  211. package/src/__tests__/plugin-bootstrap.test.ts +63 -63
  212. package/src/__tests__/plugin-registry.test.ts +3 -76
  213. package/src/__tests__/plugin-route-contribution.test.ts +6 -16
  214. package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
  215. package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
  216. package/src/__tests__/plugin-types.test.ts +3 -203
  217. package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
  218. package/src/__tests__/process-message-background-slack.test.ts +17 -16
  219. package/src/__tests__/process-message-display-content.test.ts +36 -44
  220. package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
  221. package/src/__tests__/provider-error-scenarios.test.ts +7 -6
  222. package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
  223. package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
  224. package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
  225. package/src/__tests__/provider-usage-tracking.test.ts +0 -6
  226. package/src/__tests__/ratelimit.test.ts +9 -4
  227. package/src/__tests__/reaction-persistence.test.ts +1 -1
  228. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
  229. package/src/__tests__/relay-server.test.ts +20 -13
  230. package/src/__tests__/resolve-trust-class.test.ts +4 -4
  231. package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
  232. package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
  233. package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
  234. package/src/__tests__/runtime-events-sse-reconnect.test.ts +390 -0
  235. package/src/__tests__/schedule-routes.test.ts +683 -12
  236. package/src/__tests__/schedule-store.test.ts +108 -0
  237. package/src/__tests__/schedule-tools.test.ts +160 -0
  238. package/src/__tests__/secret-ingress-http.test.ts +2 -2
  239. package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
  240. package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
  241. package/src/__tests__/secret-response-routing.test.ts +13 -11
  242. package/src/__tests__/send-endpoint-busy.test.ts +6 -2
  243. package/src/__tests__/server-history-render.test.ts +314 -1
  244. package/src/__tests__/shell-observability.test.ts +249 -0
  245. package/src/__tests__/skill-feature-flags-integration.test.ts +44 -11
  246. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  247. package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
  248. package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
  249. package/src/__tests__/skillssh-files.test.ts +1 -0
  250. package/src/__tests__/starter-task-flow.test.ts +6 -6
  251. package/src/__tests__/strip-memory-injections.test.ts +102 -14
  252. package/src/__tests__/subagent-call-site-routing.test.ts +3 -3
  253. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  254. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  255. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  256. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  257. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  258. package/src/__tests__/suggestion-routes.test.ts +3 -3
  259. package/src/__tests__/sync-message-contract.test.ts +19 -16
  260. package/src/__tests__/system-prompt.test.ts +74 -0
  261. package/src/__tests__/task-scheduler.test.ts +162 -1
  262. package/src/__tests__/terminal-tools.test.ts +9 -25
  263. package/src/__tests__/thread-backfill.test.ts +4 -9
  264. package/src/__tests__/title-generate-hook.test.ts +319 -0
  265. package/src/__tests__/tool-error-hook.test.ts +278 -0
  266. package/src/__tests__/tool-preview-lifecycle.test.ts +481 -16
  267. package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
  268. package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
  269. package/src/__tests__/tool-result-truncation.test.ts +1 -1
  270. package/src/__tests__/tools-audio-read.test.ts +113 -0
  271. package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
  272. package/src/__tests__/turn-events-store.test.ts +11 -7
  273. package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
  274. package/src/__tests__/ui-work-result-surface.test.ts +159 -0
  275. package/src/__tests__/usage-routes.test.ts +285 -1
  276. package/src/__tests__/user-plugin-loader.test.ts +2 -2
  277. package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
  278. package/src/__tests__/voice-session-bridge.test.ts +19 -10
  279. package/src/__tests__/web-search-backend-failure.test.ts +166 -0
  280. package/src/acp/__tests__/agent-process.test.ts +161 -0
  281. package/src/acp/__tests__/client-handler.test.ts +40 -0
  282. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  283. package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
  284. package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
  285. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  286. package/src/acp/__tests__/session-manager-resume.test.ts +695 -0
  287. package/src/acp/agent-process.ts +61 -1
  288. package/src/acp/auto-install.test.ts +125 -0
  289. package/src/acp/auto-install.ts +174 -0
  290. package/src/acp/client-handler.ts +31 -0
  291. package/src/acp/feature-gate.test.ts +48 -0
  292. package/src/acp/feature-gate.ts +34 -0
  293. package/src/acp/prepare-agent-env.ts +52 -11
  294. package/src/acp/resolve-agent.test.ts +147 -6
  295. package/src/acp/resolve-agent.ts +81 -7
  296. package/src/acp/resume-hint.ts +22 -0
  297. package/src/acp/session-manager.ts +487 -71
  298. package/src/agent/compaction-circuit.ts +98 -0
  299. package/src/agent/loop.ts +651 -450
  300. package/src/api/README.md +19 -17
  301. package/src/api/constants/tool-execution.ts +21 -0
  302. package/src/api/events/assistant-activity-state.ts +75 -0
  303. package/src/api/events/assistant-outbound-attachment.ts +25 -27
  304. package/src/api/events/assistant-text-delta.ts +6 -8
  305. package/src/api/events/assistant-thinking-delta.ts +33 -0
  306. package/src/api/events/assistant-turn-start.ts +5 -7
  307. package/src/api/events/avatar-updated.ts +24 -0
  308. package/src/api/events/compaction-circuit-closed.ts +26 -0
  309. package/src/api/events/compaction-circuit-open.ts +28 -0
  310. package/src/api/events/confirmation-request.ts +114 -0
  311. package/src/api/events/contact-request.ts +33 -0
  312. package/src/api/events/conversation-error.ts +77 -0
  313. package/src/api/events/conversation-list-invalidated.ts +38 -0
  314. package/src/api/events/conversation-title-updated.ts +24 -0
  315. package/src/api/events/disk-pressure-status-changed.ts +61 -0
  316. package/src/api/events/document-comment-created.ts +24 -28
  317. package/src/api/events/document-comment-deleted.ts +6 -8
  318. package/src/api/events/document-comment-reopened.ts +6 -8
  319. package/src/api/events/document-comment-resolved.ts +8 -10
  320. package/src/api/events/document-editor-update.ts +27 -0
  321. package/src/api/events/error.ts +32 -0
  322. package/src/api/events/generation-cancelled.ts +4 -6
  323. package/src/api/events/generation-handoff.ts +13 -15
  324. package/src/api/events/home-feed-updated.ts +26 -0
  325. package/src/api/events/identity-changed.ts +32 -0
  326. package/src/api/events/interaction-resolved.ts +50 -0
  327. package/src/api/events/message-complete.ts +10 -12
  328. package/src/api/events/message-dequeued.ts +21 -0
  329. package/src/api/events/message-queued-deleted.ts +23 -0
  330. package/src/api/events/message-queued.ts +22 -0
  331. package/src/api/events/message-request-complete.ts +29 -0
  332. package/src/api/events/navigate-settings.ts +20 -0
  333. package/src/api/events/notification-intent.ts +33 -0
  334. package/src/api/events/open-url.ts +6 -8
  335. package/src/api/events/question-request.ts +67 -0
  336. package/src/api/events/relationship-state-updated.ts +4 -6
  337. package/src/api/events/secret-request.ts +42 -0
  338. package/src/api/events/subagent-event.ts +79 -0
  339. package/src/api/events/subagent-spawned.ts +40 -0
  340. package/src/api/events/subagent-status-changed.ts +65 -0
  341. package/src/api/events/sync-changed.ts +29 -0
  342. package/src/api/events/tool-output-chunk.ts +45 -0
  343. package/src/api/events/tool-result.ts +129 -0
  344. package/src/api/events/tool-use-preview-start.ts +32 -0
  345. package/src/api/events/tool-use-start.ts +8 -10
  346. package/src/api/events/trace-event.ts +69 -0
  347. package/src/api/events/turn-profile-auto-routed.ts +28 -0
  348. package/src/api/events/ui-surface-complete.ts +30 -0
  349. package/src/api/events/ui-surface-dismiss.ts +22 -0
  350. package/src/api/events/ui-surface-show.ts +67 -0
  351. package/src/api/events/ui-surface-update.ts +26 -0
  352. package/src/api/events/usage-update.ts +34 -0
  353. package/src/api/events/user-message-echo.ts +35 -0
  354. package/src/api/index.ts +389 -0
  355. package/src/api/requests/dictation.ts +45 -0
  356. package/src/api/responses/conversation-message.ts +374 -0
  357. package/src/api/responses/disk-pressure-status.ts +26 -0
  358. package/src/api/responses/home.ts +217 -0
  359. package/src/api/responses/llm-context-response.ts +2 -0
  360. package/src/api/responses/memory-v3-selection-log.ts +50 -0
  361. package/src/api/responses/subagent-detail.ts +48 -0
  362. package/src/approvals/guardian-decision-primitive.ts +7 -15
  363. package/src/approvals/guardian-request-resolvers.ts +7 -10
  364. package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
  365. package/src/avatar/__tests__/avatar-store.test.ts +198 -0
  366. package/src/avatar/avatar-manifest.ts +195 -0
  367. package/src/avatar/avatar-store.ts +113 -0
  368. package/src/avatar/traits-png-sync.ts +8 -2
  369. package/src/background-wake/next-wake.test.ts +31 -1
  370. package/src/background-wake/next-wake.ts +5 -1
  371. package/src/calls/call-conversation-messages.ts +6 -4
  372. package/src/calls/guardian-action-sweep.ts +6 -4
  373. package/src/calls/relay-server.ts +12 -8
  374. package/src/calls/voice-session-bridge.ts +13 -27
  375. package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
  376. package/src/cli/commands/__tests__/notifications.test.ts +58 -14
  377. package/src/cli/commands/avatar.ts +17 -11
  378. package/src/cli/commands/conversations.ts +15 -1
  379. package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
  380. package/src/cli/commands/db/__tests__/status.test.ts +253 -0
  381. package/src/cli/commands/db/format.ts +48 -0
  382. package/src/cli/commands/db/index.ts +29 -0
  383. package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
  384. package/src/cli/commands/db/repair-step-integrity.ts +146 -0
  385. package/src/cli/commands/db/repair-steps.ts +164 -0
  386. package/src/cli/commands/db/repair.ts +141 -0
  387. package/src/cli/commands/db/status.ts +366 -0
  388. package/src/cli/commands/memory-v3.ts +159 -445
  389. package/src/cli/commands/notifications.ts +112 -60
  390. package/src/cli/lib/cli-colors.ts +24 -6
  391. package/src/cli/program.ts +4 -5
  392. package/src/config/__tests__/feature-flag-registry-guard.test.ts +4 -4
  393. package/src/config/acp-defaults.test.ts +10 -0
  394. package/src/config/acp-defaults.ts +6 -0
  395. package/src/config/assistant-feature-flags.ts +24 -13
  396. package/src/config/bundled-skills/acp/SKILL.md +64 -30
  397. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  398. package/src/config/bundled-skills/app-builder/SKILL.md +224 -387
  399. package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
  400. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  401. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  402. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  403. package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
  404. package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
  405. package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
  406. package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
  407. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  408. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  409. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  410. package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
  411. package/src/config/bundled-skills/messaging/SKILL.md +0 -7
  412. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
  413. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  414. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  415. package/src/config/bundled-tool-registry.ts +2 -0
  416. package/src/config/call-site-defaults.ts +2 -7
  417. package/src/config/feature-flag-cache.ts +3 -3
  418. package/src/config/feature-flag-registry.json +68 -12
  419. package/src/config/schemas/__tests__/memory-v2.test.ts +2 -226
  420. package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
  421. package/src/config/schemas/call-site-catalog.ts +8 -15
  422. package/src/config/schemas/heartbeat.ts +9 -0
  423. package/src/config/schemas/llm.ts +3 -3
  424. package/src/config/schemas/memory-lifecycle.ts +24 -0
  425. package/src/config/schemas/memory-v2.ts +8 -253
  426. package/src/config/schemas/memory-v3.ts +47 -0
  427. package/src/config/schemas/memory.ts +6 -1
  428. package/src/config/schemas/platform.ts +8 -0
  429. package/src/config/schemas/timeouts.ts +3 -1
  430. package/src/config/seed-inference-profiles.ts +2 -2
  431. package/src/config/skills.ts +13 -0
  432. package/src/context/compactor.ts +55 -32
  433. package/src/context/strip-injections.ts +128 -0
  434. package/src/context/token-estimator.ts +42 -0
  435. package/src/context/tool-result-truncation.ts +1 -66
  436. package/src/context/window-manager.ts +143 -27
  437. package/src/credential-execution/executable-discovery.ts +16 -0
  438. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
  439. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
  440. package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
  441. package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
  442. package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
  443. package/src/daemon/approval-generators.ts +4 -4
  444. package/src/daemon/assistant-attachments.ts +1 -1
  445. package/src/daemon/config-watcher.ts +7 -1
  446. package/src/daemon/context-overflow-reducer.ts +0 -1
  447. package/src/daemon/conversation-agent-loop-handlers.ts +793 -215
  448. package/src/daemon/conversation-agent-loop.ts +487 -1479
  449. package/src/daemon/conversation-error.ts +7 -7
  450. package/src/daemon/conversation-history.ts +27 -10
  451. package/src/daemon/conversation-launch.ts +4 -8
  452. package/src/daemon/conversation-lifecycle.ts +13 -42
  453. package/src/daemon/conversation-messaging.ts +8 -9
  454. package/src/daemon/conversation-notifiers.ts +7 -5
  455. package/src/daemon/conversation-process.ts +109 -93
  456. package/src/daemon/conversation-registry.ts +159 -0
  457. package/src/daemon/conversation-runtime-assembly.ts +218 -385
  458. package/src/daemon/conversation-slash.ts +6 -25
  459. package/src/daemon/conversation-store.ts +15 -95
  460. package/src/daemon/conversation-surfaces.ts +277 -73
  461. package/src/daemon/conversation-tool-setup.ts +5 -29
  462. package/src/daemon/conversation-workspace.ts +17 -0
  463. package/src/daemon/conversation.ts +123 -146
  464. package/src/daemon/daemon-skill-host.ts +2 -6
  465. package/src/daemon/disk-pressure-guard.ts +35 -29
  466. package/src/daemon/external-plugins-bootstrap.ts +53 -33
  467. package/src/daemon/first-greeting.ts +26 -4
  468. package/src/daemon/guardian-action-generators.ts +2 -2
  469. package/src/daemon/handlers/config-a2a.ts +51 -36
  470. package/src/daemon/handlers/config-slack-channel.ts +20 -14
  471. package/src/daemon/handlers/config-telegram.ts +16 -2
  472. package/src/daemon/handlers/conversations.ts +9 -23
  473. package/src/daemon/handlers/shared.ts +158 -82
  474. package/src/daemon/handlers/skills.ts +53 -20
  475. package/src/daemon/host-app-control-proxy.ts +54 -1
  476. package/src/daemon/host-cu-proxy.ts +46 -22
  477. package/src/daemon/host-file-proxy.ts +25 -1
  478. package/src/daemon/host-proxy-preactivation.ts +25 -6
  479. package/src/daemon/lifecycle.ts +53 -55
  480. package/src/daemon/message-protocol.ts +2 -3
  481. package/src/daemon/message-provenance.ts +49 -0
  482. package/src/daemon/message-types/apps.ts +1 -29
  483. package/src/daemon/message-types/contacts.ts +3 -20
  484. package/src/daemon/message-types/conversations.ts +13 -111
  485. package/src/daemon/message-types/documents.ts +3 -9
  486. package/src/daemon/message-types/home.ts +4 -17
  487. package/src/daemon/message-types/integrations.ts +2 -6
  488. package/src/daemon/message-types/messages.ts +37 -400
  489. package/src/daemon/message-types/notifications.ts +2 -32
  490. package/src/daemon/message-types/settings.ts +3 -8
  491. package/src/daemon/message-types/skills.ts +4 -0
  492. package/src/daemon/message-types/surfaces.ts +138 -3
  493. package/src/daemon/message-types/sync.ts +12 -25
  494. package/src/daemon/message-types/workspace.ts +3 -11
  495. package/src/daemon/now-scratchpad.ts +21 -0
  496. package/src/daemon/orphan-reaper.test.ts +210 -0
  497. package/src/daemon/orphan-reaper.ts +240 -0
  498. package/src/daemon/overflow-reduction-loop.ts +230 -0
  499. package/src/daemon/persist-unsendable-image.ts +117 -0
  500. package/src/daemon/process-message.ts +50 -49
  501. package/src/daemon/server.ts +14 -0
  502. package/src/daemon/tool-side-effects.ts +10 -7
  503. package/src/daemon/trace-emitter.ts +6 -4
  504. package/src/daemon/trust-context.ts +32 -0
  505. package/src/daemon/wake-target-adapter.ts +14 -2
  506. package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -1
  507. package/src/heartbeat/heartbeat-run-store.ts +54 -1
  508. package/src/heartbeat/heartbeat-service.ts +42 -0
  509. package/src/home/feed-types.ts +36 -221
  510. package/src/home/home-greeting-cache.ts +24 -1
  511. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  512. package/src/ipc/__tests__/email-ipc.test.ts +0 -9
  513. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  514. package/src/ipc/gateway-client.test.ts +2 -2
  515. package/src/ipc/gateway-client.ts +3 -3
  516. package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
  517. package/src/ipc/routes/route-adapter.ts +45 -6
  518. package/src/ipc/skill-routes/__tests__/memory.test.ts +33 -9
  519. package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
  520. package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
  521. package/src/ipc/skill-routes/memory.ts +29 -14
  522. package/src/ipc/skill-routes/providers.ts +5 -6
  523. package/src/ipc/skill-routes/registries.ts +13 -61
  524. package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
  525. package/src/media/gemini-image-service.ts +15 -0
  526. package/src/media/openai-image-service.ts +14 -0
  527. package/src/media/types.ts +34 -0
  528. package/src/memory/__tests__/conversation-queries.test.ts +192 -8
  529. package/src/memory/__tests__/db-maintenance.test.ts +128 -0
  530. package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
  531. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
  532. package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
  533. package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
  534. package/src/memory/auth-fallback-events-store.ts +94 -0
  535. package/src/memory/context-search/agent-runner.ts +2 -4
  536. package/src/memory/conversation-crud.ts +39 -8
  537. package/src/memory/conversation-queries.ts +78 -22
  538. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  539. package/src/memory/conversation-title-service.ts +65 -41
  540. package/src/memory/db-init.ts +14 -0
  541. package/src/memory/db-maintenance.ts +18 -2
  542. package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
  543. package/src/memory/graph/consolidation.ts +8 -11
  544. package/src/memory/graph/conversation-graph-memory.ts +106 -8
  545. package/src/memory/graph/extraction.ts +6 -9
  546. package/src/memory/graph/narrative.ts +2 -2
  547. package/src/memory/graph/pattern-scan.ts +2 -2
  548. package/src/memory/graph/retriever.ts +20 -26
  549. package/src/memory/graph/tools.ts +4 -4
  550. package/src/memory/job-handlers/conversation-starters.ts +45 -34
  551. package/src/memory/job-handlers/summarization.ts +1 -2
  552. package/src/memory/jobs-store.ts +36 -1
  553. package/src/memory/jobs-worker.ts +82 -43
  554. package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
  555. package/src/memory/llm-request-log-source-local.ts +0 -11
  556. package/src/memory/llm-request-log-source.ts +9 -25
  557. package/src/memory/llm-request-log-store.ts +0 -41
  558. package/src/memory/llm-usage-store.ts +234 -50
  559. package/src/memory/memory-marker.ts +17 -0
  560. package/src/memory/memory-retrospective-job.ts +6 -2
  561. package/src/memory/memory-v2-activation-log-store.ts +1 -83
  562. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
  563. package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
  564. package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
  565. package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
  566. package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
  567. package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
  568. package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
  569. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  570. package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
  571. package/src/memory/migrations/index.ts +7 -0
  572. package/src/memory/pkb/autoinject.ts +61 -0
  573. package/src/memory/pkb/context.ts +50 -0
  574. package/src/memory/pkb/types.ts +14 -0
  575. package/src/memory/schedule-attribution-sql.ts +104 -0
  576. package/src/memory/schema/acp.ts +4 -0
  577. package/src/memory/schema/infrastructure.ts +27 -0
  578. package/src/memory/usage-grouped-buckets.ts +6 -1
  579. package/src/memory/v2/__tests__/consolidation-job.test.ts +125 -1
  580. package/src/memory/v2/__tests__/migration.test.ts +11 -3
  581. package/src/memory/v2/__tests__/page-index.test.ts +37 -1
  582. package/src/memory/v2/__tests__/router.test.ts +14 -4
  583. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
  584. package/src/memory/v2/backfill-jobs.ts +6 -0
  585. package/src/memory/v2/consolidation-job.ts +99 -10
  586. package/src/memory/v2/migration.ts +5 -3
  587. package/src/memory/v2/page-index.ts +11 -0
  588. package/src/memory/v2/router.ts +8 -11
  589. package/src/memory/v2/sweep-job.ts +8 -11
  590. package/src/memory/v2/types.ts +1 -0
  591. package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
  592. package/src/messaging/providers/slack/render-transcript.ts +2 -2
  593. package/src/messaging/style-analyzer.ts +8 -11
  594. package/src/notifications/conversation-pairing.ts +8 -13
  595. package/src/notifications/decision-engine.ts +16 -16
  596. package/src/notifications/home-feed-side-effect.ts +12 -1
  597. package/src/notifications/preference-extractor.ts +11 -14
  598. package/src/permissions/prompter.ts +46 -36
  599. package/src/permissions/question-prompter.test.ts +35 -26
  600. package/src/permissions/question-prompter.ts +6 -10
  601. package/src/plugin-api/constants.ts +4 -0
  602. package/src/plugin-api/index.ts +9 -5
  603. package/src/plugin-api/types.ts +176 -4
  604. package/src/plugins/defaults/compaction/compact.ts +59 -0
  605. package/src/plugins/defaults/compaction/package.json +15 -0
  606. package/src/plugins/defaults/compaction/register.ts +24 -0
  607. package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
  608. package/src/plugins/defaults/empty-response/package.json +15 -0
  609. package/src/plugins/defaults/empty-response/register.ts +23 -0
  610. package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
  611. package/src/plugins/defaults/history-repair/package.json +15 -0
  612. package/src/plugins/defaults/history-repair/register.ts +24 -0
  613. package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
  614. package/src/plugins/defaults/index.ts +22 -49
  615. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +95 -0
  616. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
  617. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
  618. package/src/plugins/defaults/{injectors.ts → memory-retrieval/injectors.ts} +295 -112
  619. package/src/plugins/defaults/memory-v3-shadow/__tests__/assign.test.ts +242 -0
  620. package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +118 -0
  621. package/src/plugins/defaults/memory-v3-shadow/__tests__/core.test.ts +39 -0
  622. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +36 -0
  623. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +37 -0
  624. package/src/plugins/defaults/memory-v3-shadow/__tests__/health.test.ts +219 -0
  625. package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +330 -0
  626. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +288 -0
  627. package/src/plugins/defaults/memory-v3-shadow/__tests__/needle.test.ts +107 -0
  628. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +436 -0
  629. package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
  630. package/src/plugins/defaults/memory-v3-shadow/__tests__/reconcile.test.ts +274 -0
  631. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +61 -0
  632. package/src/plugins/defaults/memory-v3-shadow/__tests__/router.test.ts +332 -0
  633. package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +179 -0
  634. package/src/plugins/defaults/memory-v3-shadow/__tests__/selector.test.ts +470 -0
  635. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +432 -0
  636. package/src/plugins/defaults/memory-v3-shadow/__tests__/snapshot.test.ts +168 -0
  637. package/src/plugins/defaults/memory-v3-shadow/__tests__/tree.test.ts +192 -0
  638. package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +54 -0
  639. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +106 -0
  640. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +44 -0
  641. package/src/plugins/defaults/memory-v3-shadow/assign.ts +268 -0
  642. package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +124 -0
  643. package/src/plugins/defaults/memory-v3-shadow/core.ts +26 -0
  644. package/src/plugins/defaults/memory-v3-shadow/data/README.md +84 -0
  645. package/src/plugins/defaults/memory-v3-shadow/data/assignments.json +5 -0
  646. package/src/plugins/defaults/memory-v3-shadow/data/core.json +1 -0
  647. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-x.md +9 -0
  648. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-y.md +9 -0
  649. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-b/topic-z.md +9 -0
  650. package/src/plugins/defaults/memory-v3-shadow/health.ts +0 -0
  651. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  652. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  653. package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
  654. package/src/plugins/defaults/memory-v3-shadow/llm-retry.ts +32 -0
  655. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +314 -0
  656. package/src/plugins/defaults/memory-v3-shadow/needle.ts +115 -0
  657. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +126 -0
  658. package/src/plugins/defaults/memory-v3-shadow/package.json +15 -0
  659. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +34 -0
  660. package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
  661. package/src/plugins/defaults/memory-v3-shadow/reconcile.ts +523 -0
  662. package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
  663. package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +32 -0
  664. package/src/plugins/defaults/memory-v3-shadow/router.ts +190 -0
  665. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +84 -0
  666. package/src/plugins/defaults/memory-v3-shadow/selector.ts +226 -0
  667. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +349 -0
  668. package/src/plugins/defaults/memory-v3-shadow/snapshot.ts +209 -0
  669. package/src/plugins/defaults/memory-v3-shadow/tree.ts +174 -0
  670. package/src/plugins/defaults/memory-v3-shadow/types.ts +59 -0
  671. package/src/plugins/defaults/memory-v3-shadow/working-set.ts +88 -0
  672. package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
  673. package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
  674. package/src/plugins/defaults/title-generate/package.json +15 -0
  675. package/src/plugins/defaults/title-generate/register.ts +35 -0
  676. package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
  677. package/src/plugins/defaults/tool-error/package.json +15 -0
  678. package/src/plugins/defaults/tool-error/register.ts +23 -0
  679. package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
  680. package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
  681. package/src/plugins/defaults/tool-result-truncate/register.ts +24 -0
  682. package/src/plugins/defaults/tool-result-truncate/terminal.ts +132 -0
  683. package/src/plugins/external-plugin-loader.ts +2 -2
  684. package/src/plugins/pipeline.ts +6 -317
  685. package/src/plugins/registry.ts +10 -55
  686. package/src/plugins/types.ts +79 -849
  687. package/src/plugins/user-loader.ts +4 -3
  688. package/src/proactive-artifact/aux-message-injector.ts +4 -5
  689. package/src/proactive-artifact/job.test.ts +28 -21
  690. package/src/proactive-artifact/job.ts +3 -1
  691. package/src/prompts/__tests__/system-prompt.test.ts +42 -0
  692. package/src/prompts/sections.ts +20 -7
  693. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
  694. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
  695. package/src/prompts/templates/BOOTSTRAP.md +7 -3
  696. package/src/prompts/templates/system-sections.ts +21 -0
  697. package/src/providers/__tests__/retry-callsite.test.ts +25 -25
  698. package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
  699. package/src/providers/anthropic/client.ts +61 -34
  700. package/src/providers/call-site-routing.ts +1 -9
  701. package/src/providers/gemini/client.ts +152 -34
  702. package/src/providers/gemini/inline-media.ts +74 -0
  703. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -2
  704. package/src/providers/openai/chat-completions-provider.ts +45 -4
  705. package/src/providers/openai/responses-provider.ts +1 -4
  706. package/src/providers/openrouter/client.ts +2 -6
  707. package/src/providers/placeholder-sentinels.ts +35 -0
  708. package/src/providers/provider-send-message.ts +6 -6
  709. package/src/providers/ratelimit.ts +1 -9
  710. package/src/providers/retry.ts +0 -5
  711. package/src/providers/types.ts +11 -2
  712. package/src/providers/usage-tracking.ts +1 -9
  713. package/src/runtime/__tests__/agent-wake.test.ts +141 -32
  714. package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
  715. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  716. package/src/runtime/agent-wake.ts +95 -23
  717. package/src/runtime/assistant-event-hub.ts +38 -8
  718. package/src/runtime/assistant-stream-state.ts +368 -0
  719. package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
  720. package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
  721. package/src/runtime/auth/route-policy.ts +42 -1079
  722. package/src/runtime/background-job-runner.ts +1 -4
  723. package/src/runtime/btw-sidechain.ts +3 -1
  724. package/src/runtime/channel-approvals.ts +4 -15
  725. package/src/runtime/channel-invite-transport.ts +5 -6
  726. package/src/runtime/channel-readiness-service.ts +2 -5
  727. package/src/runtime/channel-retry-sweep.ts +12 -16
  728. package/src/runtime/http-router.ts +35 -43
  729. package/src/runtime/http-types.ts +23 -71
  730. package/src/runtime/interactive-ui.ts +1 -1
  731. package/src/runtime/invite-instruction-generator.ts +3 -3
  732. package/src/runtime/pending-interactions.ts +3 -2
  733. package/src/runtime/routes/__tests__/acp-routes.test.ts +253 -55
  734. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
  735. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
  736. package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
  737. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
  738. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
  739. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
  740. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
  741. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
  742. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
  743. package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
  744. package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
  745. package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
  746. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  747. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  748. package/src/runtime/routes/__tests__/tts-routes.test.ts +9 -5
  749. package/src/runtime/routes/acp-routes.test.ts +186 -100
  750. package/src/runtime/routes/acp-routes.ts +110 -35
  751. package/src/runtime/routes/app-management-routes.ts +93 -131
  752. package/src/runtime/routes/app-routes.ts +38 -20
  753. package/src/runtime/routes/approval-routes.ts +17 -5
  754. package/src/runtime/routes/attachment-routes.ts +51 -16
  755. package/src/runtime/routes/audio-routes.ts +1 -0
  756. package/src/runtime/routes/audit-routes.ts +5 -0
  757. package/src/runtime/routes/auth-routes.ts +5 -0
  758. package/src/runtime/routes/avatar-routes.ts +264 -59
  759. package/src/runtime/routes/background-tool-routes.ts +9 -0
  760. package/src/runtime/routes/background-wake-routes.ts +13 -3
  761. package/src/runtime/routes/backup-routes.ts +45 -0
  762. package/src/runtime/routes/bookmark-routes.ts +13 -0
  763. package/src/runtime/routes/brain-graph-routes.ts +9 -0
  764. package/src/runtime/routes/browser-routes.ts +6 -1
  765. package/src/runtime/routes/browser-tabs-routes.ts +11 -10
  766. package/src/runtime/routes/btw-routes.ts +34 -24
  767. package/src/runtime/routes/cache-routes.ts +13 -0
  768. package/src/runtime/routes/call-routes.ts +21 -10
  769. package/src/runtime/routes/channel-availability-routes.ts +5 -1
  770. package/src/runtime/routes/channel-readiness-routes.ts +37 -4
  771. package/src/runtime/routes/channel-route-definitions.ts +21 -0
  772. package/src/runtime/routes/channel-verification-routes.ts +21 -0
  773. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
  774. package/src/runtime/routes/client-routes.ts +9 -0
  775. package/src/runtime/routes/consolidation-routes.ts +133 -25
  776. package/src/runtime/routes/contact-prompt-routes.ts +9 -0
  777. package/src/runtime/routes/contact-routes.ts +90 -23
  778. package/src/runtime/routes/content-source-routes.ts +5 -1
  779. package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
  780. package/src/runtime/routes/conversation-attention-routes.ts +5 -0
  781. package/src/runtime/routes/conversation-cli-routes.ts +54 -7
  782. package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
  783. package/src/runtime/routes/conversation-list-routes.ts +81 -12
  784. package/src/runtime/routes/conversation-management-routes.ts +57 -14
  785. package/src/runtime/routes/conversation-query-routes.ts +90 -41
  786. package/src/runtime/routes/conversation-routes.ts +446 -204
  787. package/src/runtime/routes/conversation-starter-routes.ts +35 -20
  788. package/src/runtime/routes/conversations-import-routes.ts +30 -8
  789. package/src/runtime/routes/credential-prompt-routes.ts +5 -0
  790. package/src/runtime/routes/credential-routes.ts +25 -6
  791. package/src/runtime/routes/debug-bash-routes.ts +5 -0
  792. package/src/runtime/routes/debug-routes.ts +11 -2
  793. package/src/runtime/routes/defer-routes.ts +13 -0
  794. package/src/runtime/routes/diagnostics-routes.ts +37 -46
  795. package/src/runtime/routes/disk-pressure-routes.ts +17 -31
  796. package/src/runtime/routes/document-comments-routes.ts +46 -27
  797. package/src/runtime/routes/documents-routes.ts +25 -10
  798. package/src/runtime/routes/domain-routes.ts +98 -51
  799. package/src/runtime/routes/email-routes.ts +33 -0
  800. package/src/runtime/routes/epoch-millis-range.ts +34 -0
  801. package/src/runtime/routes/events-routes.ts +107 -8
  802. package/src/runtime/routes/filing-routes.ts +9 -4
  803. package/src/runtime/routes/gateway-log-routes.ts +31 -4
  804. package/src/runtime/routes/global-search-routes.ts +53 -50
  805. package/src/runtime/routes/group-routes.ts +21 -5
  806. package/src/runtime/routes/guardian-action-routes.ts +9 -0
  807. package/src/runtime/routes/guardian-approval-interception.ts +0 -31
  808. package/src/runtime/routes/heartbeat-routes.ts +57 -21
  809. package/src/runtime/routes/home-feed-routes.ts +23 -19
  810. package/src/runtime/routes/home-state-routes.ts +8 -40
  811. package/src/runtime/routes/host-app-control-routes.ts +6 -1
  812. package/src/runtime/routes/host-bash-routes.ts +5 -0
  813. package/src/runtime/routes/host-browser-routes.ts +13 -0
  814. package/src/runtime/routes/host-cu-routes.ts +6 -1
  815. package/src/runtime/routes/host-file-routes.ts +26 -6
  816. package/src/runtime/routes/host-transfer-routes.ts +13 -2
  817. package/src/runtime/routes/http-adapter.ts +1 -2
  818. package/src/runtime/routes/identity-intro-cache.ts +28 -40
  819. package/src/runtime/routes/identity-routes.ts +236 -20
  820. package/src/runtime/routes/image-generation-routes.ts +45 -2
  821. package/src/runtime/routes/inbound-message-handler.ts +16 -12
  822. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
  823. package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
  824. package/src/runtime/routes/index.ts +2 -0
  825. package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
  826. package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
  827. package/src/runtime/routes/inference-send-routes.ts +11 -11
  828. package/src/runtime/routes/integrations/a2a.ts +32 -7
  829. package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
  830. package/src/runtime/routes/integrations/slack/channel.ts +23 -3
  831. package/src/runtime/routes/integrations/slack/share.ts +36 -8
  832. package/src/runtime/routes/integrations/telegram.ts +34 -9
  833. package/src/runtime/routes/integrations/twilio.ts +77 -7
  834. package/src/runtime/routes/integrations/vercel.ts +3 -3
  835. package/src/runtime/routes/internal-oauth-routes.ts +5 -0
  836. package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
  837. package/src/runtime/routes/internal-twilio-routes.ts +13 -0
  838. package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
  839. package/src/runtime/routes/log-export-routes.ts +36 -10
  840. package/src/runtime/routes/mcp-auth-routes.ts +25 -0
  841. package/src/runtime/routes/memory-item-routes.ts +21 -10
  842. package/src/runtime/routes/memory-v2-routes.ts +105 -44
  843. package/src/runtime/routes/memory-v3-routes.ts +306 -408
  844. package/src/runtime/routes/migration-rollback-routes.ts +5 -1
  845. package/src/runtime/routes/migration-routes.ts +29 -0
  846. package/src/runtime/routes/notification-routes.ts +17 -1
  847. package/src/runtime/routes/oauth-apps.ts +99 -23
  848. package/src/runtime/routes/oauth-commands-routes.ts +37 -14
  849. package/src/runtime/routes/oauth-connect-routes.ts +9 -0
  850. package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
  851. package/src/runtime/routes/oauth-providers.ts +79 -15
  852. package/src/runtime/routes/platform-routes.ts +102 -5
  853. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +9 -6
  854. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
  855. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
  856. package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
  857. package/src/runtime/routes/playground/force-compact.ts +2 -2
  858. package/src/runtime/routes/playground/helpers.ts +1 -2
  859. package/src/runtime/routes/playground/inject-failures.ts +13 -8
  860. package/src/runtime/routes/playground/reset-circuit.ts +14 -9
  861. package/src/runtime/routes/playground/seed-conversation.ts +1 -1
  862. package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
  863. package/src/runtime/routes/playground/state.ts +4 -3
  864. package/src/runtime/routes/plugins-routes.ts +22 -19
  865. package/src/runtime/routes/profiler-routes.ts +17 -4
  866. package/src/runtime/routes/ps-routes.ts +5 -0
  867. package/src/runtime/routes/publish-routes.ts +13 -3
  868. package/src/runtime/routes/question-routes.ts +5 -0
  869. package/src/runtime/routes/recording-routes.ts +25 -12
  870. package/src/runtime/routes/rename-conversation-routes.ts +10 -0
  871. package/src/runtime/routes/sanity-routes.ts +9 -2
  872. package/src/runtime/routes/schedule-routes.ts +288 -88
  873. package/src/runtime/routes/secret-routes.ts +31 -6
  874. package/src/runtime/routes/sequence-routes.ts +33 -0
  875. package/src/runtime/routes/settings-routes.ts +65 -19
  876. package/src/runtime/routes/skills-routes.ts +166 -73
  877. package/src/runtime/routes/slack-channel-routes.ts +5 -0
  878. package/src/runtime/routes/stt-routes.ts +13 -6
  879. package/src/runtime/routes/subagents-routes.ts +24 -18
  880. package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
  881. package/src/runtime/routes/surface-action-routes.ts +9 -0
  882. package/src/runtime/routes/surface-content-routes.ts +10 -2
  883. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  884. package/src/runtime/routes/task-routes.ts +37 -0
  885. package/src/runtime/routes/telemetry-routes.ts +9 -0
  886. package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
  887. package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
  888. package/src/runtime/routes/trace-event-routes.ts +42 -1
  889. package/src/runtime/routes/trust-rules-routes.ts +31 -2
  890. package/src/runtime/routes/tts-routes.ts +48 -6
  891. package/src/runtime/routes/types.ts +83 -16
  892. package/src/runtime/routes/ui-request-routes.ts +5 -0
  893. package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
  894. package/src/runtime/routes/usage-routes.ts +118 -42
  895. package/src/runtime/routes/user-routes-cli.ts +9 -0
  896. package/src/runtime/routes/user-routes.ts +5 -1
  897. package/src/runtime/routes/wake-conversation-routes.ts +5 -0
  898. package/src/runtime/routes/watcher-routes.ts +21 -0
  899. package/src/runtime/routes/webhook-routes.ts +50 -2
  900. package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
  901. package/src/runtime/routes/work-items-routes.ts +49 -23
  902. package/src/runtime/routes/workspace-commit-routes.ts +5 -0
  903. package/src/runtime/routes/workspace-routes.test.ts +42 -0
  904. package/src/runtime/routes/workspace-routes.ts +124 -9
  905. package/src/runtime/services/__tests__/analyze-conversation.test.ts +8 -4
  906. package/src/runtime/services/analyze-conversation.ts +5 -8
  907. package/src/runtime/services/conversation-serializer.ts +24 -2
  908. package/src/runtime/sync/resource-sync-events.ts +16 -2
  909. package/src/runtime/sync/sync-publisher.ts +2 -2
  910. package/src/schedule/run-script.ts +28 -3
  911. package/src/schedule/schedule-store.ts +28 -1
  912. package/src/schedule/schedule-usage-store.ts +83 -0
  913. package/src/schedule/scheduler.ts +15 -6
  914. package/src/signals/cancel.ts +2 -4
  915. package/src/signals/user-message.ts +5 -8
  916. package/src/skills/catalog-files.ts +4 -1
  917. package/src/skills/catalog-install.ts +3 -0
  918. package/src/skills/categories-cache.ts +118 -0
  919. package/src/skills/clawhub-files.ts +1 -0
  920. package/src/skills/skillssh-files.ts +1 -0
  921. package/src/subagent/manager.ts +20 -11
  922. package/src/telemetry/types.ts +55 -1
  923. package/src/telemetry/usage-telemetry-reporter.test.ts +250 -4
  924. package/src/telemetry/usage-telemetry-reporter.ts +88 -2
  925. package/src/tools/acp/context.ts +20 -0
  926. package/src/tools/acp/list-agents.test.ts +7 -1
  927. package/src/tools/acp/spawn.test.ts +198 -93
  928. package/src/tools/acp/spawn.ts +32 -70
  929. package/src/tools/acp/steer.test.ts +105 -8
  930. package/src/tools/acp/steer.ts +48 -17
  931. package/src/tools/apps/definitions.ts +8 -4
  932. package/src/tools/apps/executors.ts +13 -8
  933. package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
  934. package/src/tools/ask-question/ask-question-tool.ts +85 -90
  935. package/src/tools/computer-use/definitions.ts +28 -24
  936. package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
  937. package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
  938. package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
  939. package/src/tools/credentials/vault.ts +112 -111
  940. package/src/tools/execution-target.ts +1 -1
  941. package/src/tools/execution-timeout.ts +3 -4
  942. package/src/tools/executor.ts +1 -53
  943. package/src/tools/filesystem/edit.ts +45 -42
  944. package/src/tools/filesystem/list.ts +33 -30
  945. package/src/tools/filesystem/read.ts +54 -35
  946. package/src/tools/filesystem/write.ts +69 -32
  947. package/src/tools/host-filesystem/edit.ts +44 -42
  948. package/src/tools/host-filesystem/read.ts +49 -35
  949. package/src/tools/host-filesystem/transfer.ts +121 -108
  950. package/src/tools/host-filesystem/write.ts +33 -31
  951. package/src/tools/host-terminal/host-shell.ts +50 -48
  952. package/src/tools/memory/register.ts +23 -24
  953. package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
  954. package/src/tools/network/__tests__/web-search.test.ts +11 -3
  955. package/src/tools/network/web-fetch.ts +49 -46
  956. package/src/tools/network/web-search-error.test.ts +248 -0
  957. package/src/tools/network/web-search-error.ts +267 -0
  958. package/src/tools/network/web-search.ts +223 -61
  959. package/src/tools/registry.ts +39 -16
  960. package/src/tools/schedule/create.ts +13 -0
  961. package/src/tools/schedule/update.ts +16 -0
  962. package/src/tools/shared/filesystem/audio-read.ts +122 -0
  963. package/src/tools/shared/filesystem/image-read.ts +1 -1
  964. package/src/tools/skills/execute.ts +34 -31
  965. package/src/tools/skills/load.ts +29 -23
  966. package/src/tools/subagent/notify-parent.ts +35 -32
  967. package/src/tools/subagent/spawn.ts +2 -4
  968. package/src/tools/system/avatar-generator.ts +13 -22
  969. package/src/tools/system/request-permission.ts +30 -27
  970. package/src/tools/terminal/safe-env.ts +10 -1
  971. package/src/tools/terminal/shell.ts +190 -61
  972. package/src/tools/tool-defaults.ts +20 -9
  973. package/src/tools/tool-manifest.ts +4 -4
  974. package/src/tools/types.ts +74 -23
  975. package/src/tools/ui-surface/definitions.ts +99 -10
  976. package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
  977. package/src/tts/provider-catalog.ts +76 -1
  978. package/src/usage/types.ts +10 -0
  979. package/src/util/errors.ts +2 -2
  980. package/src/util/map-limit.ts +27 -0
  981. package/src/util/mutex.ts +47 -0
  982. package/src/util/platform.ts +15 -12
  983. package/src/work-items/work-item-runner.ts +7 -2
  984. package/src/workspace/git-service.ts +1 -42
  985. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
  986. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  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__/pipeline-runner.test.ts +0 -565
  1009. package/src/__tests__/title-generate-pipeline.test.ts +0 -211
  1010. package/src/__tests__/token-estimate-pipeline.test.ts +0 -481
  1011. package/src/__tests__/tool-error-pipeline.test.ts +0 -241
  1012. package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
  1013. package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -344
  1014. package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
  1015. package/src/cli/commands/memory-v3-render.ts +0 -491
  1016. package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
  1017. package/src/daemon/message-types/disk-pressure.ts +0 -9
  1018. package/src/email/feature-gate.ts +0 -23
  1019. package/src/gallery/default-gallery.ts +0 -1359
  1020. package/src/gallery/gallery-manifest.ts +0 -28
  1021. package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
  1022. package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
  1023. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
  1024. package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
  1025. package/src/memory/v3/__tests__/edges.test.ts +0 -706
  1026. package/src/memory/v3/__tests__/filter.test.ts +0 -560
  1027. package/src/memory/v3/__tests__/gate.test.ts +0 -637
  1028. package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
  1029. package/src/memory/v3/__tests__/loop.test.ts +0 -775
  1030. package/src/memory/v3/__tests__/retriever.test.ts +0 -226
  1031. package/src/memory/v3/__tests__/scouts.test.ts +0 -489
  1032. package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
  1033. package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
  1034. package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
  1035. package/src/memory/v3/__tests__/traversal.test.ts +0 -508
  1036. package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
  1037. package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
  1038. package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
  1039. package/src/memory/v3/__tests__/validate.test.ts +0 -277
  1040. package/src/memory/v3/auto-edges.ts +0 -223
  1041. package/src/memory/v3/coactivation-store.ts +0 -124
  1042. package/src/memory/v3/consolidation-job.ts +0 -323
  1043. package/src/memory/v3/coretrieval-seed.ts +0 -240
  1044. package/src/memory/v3/edge-learning-job.ts +0 -160
  1045. package/src/memory/v3/edges.ts +0 -286
  1046. package/src/memory/v3/filter.ts +0 -286
  1047. package/src/memory/v3/gate.ts +0 -349
  1048. package/src/memory/v3/index-composition.ts +0 -126
  1049. package/src/memory/v3/llm-capture.ts +0 -46
  1050. package/src/memory/v3/loop.ts +0 -430
  1051. package/src/memory/v3/maintenance.ts +0 -144
  1052. package/src/memory/v3/prompt-context.ts +0 -33
  1053. package/src/memory/v3/prompts/consolidation.ts +0 -458
  1054. package/src/memory/v3/prompts/system-prompts.ts +0 -196
  1055. package/src/memory/v3/retriever.ts +0 -33
  1056. package/src/memory/v3/scouts.ts +0 -431
  1057. package/src/memory/v3/shadow-diff.ts +0 -287
  1058. package/src/memory/v3/shadow-middleware.ts +0 -347
  1059. package/src/memory/v3/traversal.ts +0 -211
  1060. package/src/memory/v3/tree-index.ts +0 -237
  1061. package/src/memory/v3/tree-store.ts +0 -394
  1062. package/src/memory/v3/tree-walk.ts +0 -356
  1063. package/src/memory/v3/types.ts +0 -65
  1064. package/src/memory/v3/validate.ts +0 -323
  1065. package/src/plugins/defaults/circuit-breaker.ts +0 -141
  1066. package/src/plugins/defaults/compaction.ts +0 -141
  1067. package/src/plugins/defaults/empty-response.ts +0 -124
  1068. package/src/plugins/defaults/history-repair.ts +0 -83
  1069. package/src/plugins/defaults/llm-call.ts +0 -77
  1070. package/src/plugins/defaults/memory-retrieval.ts +0 -219
  1071. package/src/plugins/defaults/overflow-reduce.ts +0 -185
  1072. package/src/plugins/defaults/persistence.ts +0 -146
  1073. package/src/plugins/defaults/title-generate.ts +0 -90
  1074. package/src/plugins/defaults/token-estimate.ts +0 -101
  1075. package/src/plugins/defaults/tool-error.ts +0 -119
  1076. package/src/plugins/defaults/tool-execute.ts +0 -87
  1077. package/src/plugins/defaults/tool-result-truncate.ts +0 -84
  1078. package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
  1079. package/src/skills/category-inference.ts +0 -111
@@ -0,0 +1,297 @@
1
+ /**
2
+ * Tests for the default `user-prompt-submit-temp` hook (memory retrieval).
3
+ *
4
+ * Covers the retrieval behavior, the side effects the hook owns (injected-block
5
+ * metadata, recall log, `memory_recalled` event), trust gating, error
6
+ * propagation, and abort-signal forwarding. Uses `mock.module` to stub the
7
+ * persistence helpers so the test doesn't touch the developer's real
8
+ * `~/.vellum` or database. The memory graph handle is a hand-rolled fake
9
+ * passed on the hook context — the hook only needs `prepareMemory`.
10
+ */
11
+
12
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
13
+
14
+ // Stub the persistence helpers BEFORE importing the module under test so the
15
+ // bindings resolve through the mocks.
16
+ const updateMessageMetadataMock = mock((_id: string, _updates: unknown) => {});
17
+ mock.module("../memory/conversation-crud.js", () => ({
18
+ updateMessageMetadata: updateMessageMetadataMock,
19
+ }));
20
+
21
+ const recordMemoryRecallLogMock = mock((_entry: unknown) => {});
22
+ mock.module("../memory/memory-recall-log-store.js", () => ({
23
+ recordMemoryRecallLog: recordMemoryRecallLogMock,
24
+ }));
25
+
26
+ import type { AssistantConfig } from "../config/schema.js";
27
+ import type { ServerMessage } from "../daemon/message-protocol.js";
28
+ import type { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
29
+ import type { QdrantSparseVector } from "../memory/qdrant-client.js";
30
+ import userPromptSubmitMemoryRetrieval, {
31
+ type MemoryRetrievalHookContext,
32
+ } from "../plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.js";
33
+ import type { Message } from "../providers/types.js";
34
+
35
+ /** Canonical metrics payload the graph retriever attaches to a real hit. */
36
+ function makeMetrics() {
37
+ return {
38
+ embeddingProvider: "openai",
39
+ embeddingModel: "text-embedding-3-small",
40
+ semanticHits: 2,
41
+ mergedCount: 3,
42
+ selectedCount: 1,
43
+ tier1Count: 1,
44
+ tier2Count: 0,
45
+ hybridSearchLatencyMs: 5,
46
+ sparseVectorUsed: true,
47
+ topCandidates: [
48
+ {
49
+ nodeId: "node-1",
50
+ type: "fact",
51
+ score: 0.9,
52
+ semanticSimilarity: 0.8,
53
+ recencyBoost: 0.1,
54
+ },
55
+ ],
56
+ queryContext: "query-context",
57
+ };
58
+ }
59
+
60
+ /**
61
+ * Fake graph-memory whose `prepareMemory` returns a canonical result. The hook
62
+ * unpacks this return value onto `ctx.latestMessages` and records the selected
63
+ * PKB query pair back onto the handle via `recordPkbQueryVectors`, so tests
64
+ * can assert those outputs by comparing object identity.
65
+ */
66
+ function makeFakeGraphMemory(overrides?: {
67
+ messages?: Message[];
68
+ injectedTokens?: number;
69
+ injectedBlockText?: string | null;
70
+ metrics?: ReturnType<typeof makeMetrics> | null;
71
+ queryVector?: number[];
72
+ sparseVector?: QdrantSparseVector;
73
+ userQueryVector?: number[];
74
+ userQuerySparseVector?: QdrantSparseVector;
75
+ }): {
76
+ memory: ConversationGraphMemory;
77
+ prepareMemoryMock: ReturnType<typeof mock>;
78
+ recordPkbQueryVectorsMock: ReturnType<typeof mock>;
79
+ } {
80
+ const returnValue = {
81
+ runMessages: overrides?.messages ?? [],
82
+ injectedTokens: overrides?.injectedTokens ?? 0,
83
+ latencyMs: 0,
84
+ mode: "none" as const,
85
+ injectedBlockText:
86
+ overrides?.injectedBlockText === undefined
87
+ ? null
88
+ : overrides.injectedBlockText,
89
+ metrics: overrides?.metrics ?? null,
90
+ queryVector: overrides?.queryVector,
91
+ sparseVector: overrides?.sparseVector,
92
+ userQueryVector: overrides?.userQueryVector,
93
+ userQuerySparseVector: overrides?.userQuerySparseVector,
94
+ };
95
+ const prepareMemoryMock = mock(async () => returnValue);
96
+ const recordPkbQueryVectorsMock = mock(() => {});
97
+ const memory = {
98
+ prepareMemory: prepareMemoryMock,
99
+ recordPkbQueryVectors: recordPkbQueryVectorsMock,
100
+ } as unknown as ConversationGraphMemory;
101
+ return { memory, prepareMemoryMock, recordPkbQueryVectorsMock };
102
+ }
103
+
104
+ function makeHookCtx(
105
+ overrides: Partial<MemoryRetrievalHookContext> = {},
106
+ ): MemoryRetrievalHookContext {
107
+ const { memory } = makeFakeGraphMemory();
108
+ return {
109
+ graphMemory: memory,
110
+ config: {} as AssistantConfig,
111
+ onEvent: () => {},
112
+ isTrustedActor: true,
113
+ conversationId: "conv-test",
114
+ userMessageId: "msg-test",
115
+ logger: {
116
+ warn: () => {},
117
+ } as unknown as MemoryRetrievalHookContext["logger"],
118
+ signal: new AbortController().signal,
119
+ latestMessages: [],
120
+ ...overrides,
121
+ };
122
+ }
123
+
124
+ beforeEach(() => {
125
+ updateMessageMetadataMock.mockReset();
126
+ recordMemoryRecallLogMock.mockReset();
127
+ });
128
+
129
+ describe("user-prompt-submit-temp hook (memory retrieval)", () => {
130
+ test("adopts the injected run messages when the actor is trusted", async () => {
131
+ const injected: Message[] = [
132
+ { role: "user", content: [{ type: "text", text: "injected" }] },
133
+ ];
134
+ const { memory, prepareMemoryMock } = makeFakeGraphMemory({
135
+ messages: injected,
136
+ });
137
+ const ctx = makeHookCtx({ graphMemory: memory, isTrustedActor: true });
138
+
139
+ await userPromptSubmitMemoryRetrieval(ctx);
140
+
141
+ expect(prepareMemoryMock).toHaveBeenCalledTimes(1);
142
+ // The hook adopts the retriever's injected message array verbatim —
143
+ // consumers in the agent loop rely on that identity.
144
+ expect(ctx.latestMessages).toBe(injected);
145
+ });
146
+
147
+ test("selects the user-query dense/sparse pair when present, else the summary pair", async () => {
148
+ const userDense = [1, 1, 1];
149
+ const userSparse: QdrantSparseVector = { indices: [0], values: [1] };
150
+ const summaryDense = [2, 2, 2];
151
+ const summarySparse: QdrantSparseVector = { indices: [1], values: [2] };
152
+
153
+ const withUserQuery = makeFakeGraphMemory({
154
+ queryVector: summaryDense,
155
+ sparseVector: summarySparse,
156
+ userQueryVector: userDense,
157
+ userQuerySparseVector: userSparse,
158
+ });
159
+ const userCtx = makeHookCtx({ graphMemory: withUserQuery.memory });
160
+ await userPromptSubmitMemoryRetrieval(userCtx);
161
+ // User-query pair wins — never crossed with the summary signal — and is
162
+ // recorded back onto the graph handle for the PKB-reminder injector.
163
+ expect(withUserQuery.recordPkbQueryVectorsMock).toHaveBeenCalledWith(
164
+ userDense,
165
+ userSparse,
166
+ );
167
+
168
+ const summaryOnly = makeFakeGraphMemory({
169
+ queryVector: summaryDense,
170
+ sparseVector: summarySparse,
171
+ });
172
+ const summaryCtx = makeHookCtx({ graphMemory: summaryOnly.memory });
173
+ await userPromptSubmitMemoryRetrieval(summaryCtx);
174
+ expect(summaryOnly.recordPkbQueryVectorsMock).toHaveBeenCalledWith(
175
+ summaryDense,
176
+ summarySparse,
177
+ );
178
+ });
179
+
180
+ test("skips graph retrieval and side effects for untrusted actors", async () => {
181
+ const { memory, prepareMemoryMock, recordPkbQueryVectorsMock } =
182
+ makeFakeGraphMemory();
183
+ const seeded: Message[] = [
184
+ { role: "user", content: [{ type: "text", text: "seeded" }] },
185
+ ];
186
+ const ctx = makeHookCtx({
187
+ graphMemory: memory,
188
+ isTrustedActor: false,
189
+ latestMessages: seeded,
190
+ });
191
+
192
+ await userPromptSubmitMemoryRetrieval(ctx);
193
+
194
+ expect(prepareMemoryMock).not.toHaveBeenCalled();
195
+ // No graph retrieval ran: the working array stays the seeded input and no
196
+ // PKB query pair is recorded onto the graph handle.
197
+ expect(ctx.latestMessages).toBe(seeded);
198
+ expect(recordPkbQueryVectorsMock).not.toHaveBeenCalled();
199
+ expect(recordMemoryRecallLogMock).not.toHaveBeenCalled();
200
+ expect(updateMessageMetadataMock).not.toHaveBeenCalled();
201
+ });
202
+
203
+ test("persists injected block, recall log, and emits memory_recalled", async () => {
204
+ const received: ServerMessage[] = [];
205
+ const { memory } = makeFakeGraphMemory({
206
+ injectedBlockText: "injected-block",
207
+ metrics: makeMetrics(),
208
+ });
209
+ const ctx = makeHookCtx({
210
+ graphMemory: memory,
211
+ onEvent: (msg) => received.push(msg),
212
+ userMessageId: "msg-42",
213
+ conversationId: "conv-42",
214
+ });
215
+
216
+ await userPromptSubmitMemoryRetrieval(ctx);
217
+
218
+ expect(updateMessageMetadataMock).toHaveBeenCalledWith("msg-42", {
219
+ memoryInjectedBlock: "injected-block",
220
+ });
221
+ expect(recordMemoryRecallLogMock).toHaveBeenCalledTimes(1);
222
+ const logEntry = recordMemoryRecallLogMock.mock.calls[0]?.[0] as {
223
+ conversationId: string;
224
+ reason: string;
225
+ };
226
+ expect(logEntry.conversationId).toBe("conv-42");
227
+ expect(logEntry.reason).toBe("graph:none");
228
+ expect(received).toHaveLength(1);
229
+ expect(received[0]?.type).toBe("memory_recalled");
230
+ });
231
+
232
+ test("skips metadata persist when no block text is injected", async () => {
233
+ const { memory } = makeFakeGraphMemory({ injectedBlockText: null });
234
+ const ctx = makeHookCtx({ graphMemory: memory });
235
+
236
+ await userPromptSubmitMemoryRetrieval(ctx);
237
+
238
+ expect(updateMessageMetadataMock).not.toHaveBeenCalled();
239
+ // The recall log is still written even without an injected block.
240
+ expect(recordMemoryRecallLogMock).toHaveBeenCalledTimes(1);
241
+ });
242
+
243
+ test("propagates errors from prepareMemory rather than swallowing them", async () => {
244
+ // Memory is critical — failures must surface to the caller (the agent
245
+ // loop) rather than silently degrading to an empty graph result.
246
+ const failingPrepare = mock(
247
+ (
248
+ _msgs: Message[],
249
+ _cfg: AssistantConfig,
250
+ _signal: AbortSignal,
251
+ _onEvent: (msg: ServerMessage) => void,
252
+ ) => Promise.reject(new Error("retrieval failed")),
253
+ );
254
+ const graphMemory = {
255
+ prepareMemory: failingPrepare,
256
+ } as unknown as ConversationGraphMemory;
257
+ const ctx = makeHookCtx({ graphMemory, isTrustedActor: true });
258
+
259
+ await expect(userPromptSubmitMemoryRetrieval(ctx)).rejects.toThrow(
260
+ "retrieval failed",
261
+ );
262
+ });
263
+
264
+ test("forwards the context abort signal into prepareMemory", async () => {
265
+ // The hook hands its `ctx.signal` straight to `prepareMemory` so an
266
+ // external cancel aborts the underlying retrieval.
267
+ let capturedSignal: AbortSignal | undefined;
268
+ const prepareMemoryMock = mock(
269
+ async (
270
+ _msgs: Message[],
271
+ _cfg: AssistantConfig,
272
+ signal: AbortSignal,
273
+ _onEvent: (msg: ServerMessage) => void,
274
+ ) => {
275
+ capturedSignal = signal;
276
+ return {
277
+ runMessages: [],
278
+ injectedTokens: 0,
279
+ latencyMs: 0,
280
+ mode: "none" as const,
281
+ injectedBlockText: null,
282
+ metrics: null,
283
+ };
284
+ },
285
+ );
286
+ const graphMemory = {
287
+ prepareMemory: prepareMemoryMock,
288
+ recordPkbQueryVectors: mock(() => {}),
289
+ } as unknown as ConversationGraphMemory;
290
+ const controller = new AbortController();
291
+ const ctx = makeHookCtx({ graphMemory, signal: controller.signal });
292
+
293
+ await userPromptSubmitMemoryRetrieval(ctx);
294
+
295
+ expect(capturedSignal).toBe(controller.signal);
296
+ });
297
+ });
@@ -2,26 +2,46 @@
2
2
  * Tests for the `memory-v2-static` runtime injector.
3
3
  *
4
4
  * Covers:
5
- * - Returns null when `memoryV2Static` is missing/empty.
5
+ * - Returns null when the v2 static memory files are absent/empty.
6
6
  * - Returns null when `mode === "minimal"`.
7
7
  * - Wraps content in `<info>...</info>` and uses
8
8
  * `after-memory-prefix` placement.
9
9
  * - Escapes any `</info>` substring inside the authored content so the
10
10
  * wrapper cannot be broken out of.
11
+ * - Skips (re)injection when the `<info>` block is already present in the
12
+ * turn's working messages (presence detection — the block persists in
13
+ * history between compactions).
11
14
  *
12
- * Hermetic: drives the injector's `produce()` directly with a synthesized
13
- * `TurnContext` — no daemon, no filesystem.
15
+ * The injector sources its content itself via `readMemoryV2StaticContent()`
16
+ * behind the personal-memory trust gate, so each test seeds the workspace
17
+ * memory files rather than passing the content in as an option. Mocks
18
+ * `config/loader` so the v2 gates are on without standing up a full config.
14
19
  */
15
20
 
16
- import { describe, expect, test } from "bun:test";
21
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
22
+ import { dirname } from "node:path";
23
+ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
17
24
 
18
- import { defaultInjectorsPlugin } from "../plugins/defaults/injectors.js";
25
+ const realLoader = await import("../config/loader.js");
26
+
27
+ mock.module("../config/loader.js", () => ({
28
+ ...realLoader,
29
+ loadConfig: () => ({
30
+ memory: { enabled: true, v2: { enabled: true } },
31
+ }),
32
+ getConfig: () => ({
33
+ memory: { enabled: true, v2: { enabled: true } },
34
+ }),
35
+ }));
36
+
37
+ const { defaultInjectors } =
38
+ await import("../plugins/defaults/memory-retrieval/injectors.js");
19
39
  import type { Injector, TurnContext } from "../plugins/types.js";
40
+ import type { Message } from "../providers/types.js";
41
+ import { getWorkspacePromptPath } from "../util/platform.js";
20
42
 
21
43
  function findInjector(name: string): Injector {
22
- const injector = defaultInjectorsPlugin.injectors?.find(
23
- (i) => i.name === name,
24
- );
44
+ const injector = defaultInjectors.find((i) => i.name === name);
25
45
  if (!injector) {
26
46
  throw new Error(`injector '${name}' not registered`);
27
47
  }
@@ -34,57 +54,69 @@ function makeContext(overrides: Partial<TurnContext> = {}): TurnContext {
34
54
  conversationId: "conv-test",
35
55
  turnIndex: 0,
36
56
  trust: { sourceChannel: "vellum", trustClass: "guardian" },
57
+ injectionInputs: {},
37
58
  ...overrides,
38
59
  };
39
60
  }
40
61
 
62
+ /** Seed a single v2 static memory section under `## Essentials`. */
63
+ function seedEssentials(body: string): void {
64
+ const path = getWorkspacePromptPath("memory/essentials.md");
65
+ mkdirSync(dirname(path), { recursive: true });
66
+ writeFileSync(path, body, "utf-8");
67
+ }
68
+
69
+ function seedThreads(body: string): void {
70
+ const path = getWorkspacePromptPath("memory/threads.md");
71
+ mkdirSync(dirname(path), { recursive: true });
72
+ writeFileSync(path, body, "utf-8");
73
+ }
74
+
75
+ function clearV2StaticFiles(): void {
76
+ for (const file of [
77
+ "memory/essentials.md",
78
+ "memory/threads.md",
79
+ "memory/recent.md",
80
+ "memory/buffer.md",
81
+ ]) {
82
+ rmSync(getWorkspacePromptPath(file), { force: true });
83
+ }
84
+ }
85
+
41
86
  const memoryV2StaticInjector = findInjector("memory-v2-static");
42
87
 
43
88
  describe("memory-v2-static injector", () => {
44
- test("returns null when memoryV2Static is undefined", async () => {
45
- const ctx = makeContext({ injectionInputs: {} });
46
- expect(await memoryV2StaticInjector.produce(ctx)).toBeNull();
47
- });
89
+ beforeEach(() => clearV2StaticFiles());
90
+ afterEach(() => clearV2StaticFiles());
48
91
 
49
- test("returns null when memoryV2Static is null", async () => {
50
- const ctx = makeContext({ injectionInputs: { memoryV2Static: null } });
51
- expect(await memoryV2StaticInjector.produce(ctx)).toBeNull();
52
- });
53
-
54
- test("returns null when memoryV2Static is an empty string", async () => {
55
- const ctx = makeContext({ injectionInputs: { memoryV2Static: "" } });
92
+ test("returns null when the v2 static memory files are absent", async () => {
93
+ const ctx = makeContext();
56
94
  expect(await memoryV2StaticInjector.produce(ctx)).toBeNull();
57
95
  });
58
96
 
59
97
  test("returns null in minimal mode even with content", async () => {
60
- const ctx = makeContext({
61
- injectionInputs: {
62
- mode: "minimal",
63
- memoryV2Static: "## Essentials\n\nAlice prefers VS Code.",
64
- },
65
- });
98
+ seedEssentials("Alice prefers VS Code.");
99
+ const ctx = makeContext({ injectionInputs: { mode: "minimal" } });
66
100
  expect(await memoryV2StaticInjector.produce(ctx)).toBeNull();
67
101
  });
68
102
 
69
103
  test("wraps content in <info>...</info> with after-memory-prefix placement", async () => {
70
- const content =
71
- "## Essentials\n\nAlice prefers VS Code.\n\n## Threads\n\nOpen: ship PR.";
72
- const ctx = makeContext({
73
- injectionInputs: { memoryV2Static: content },
74
- });
104
+ seedEssentials("Alice prefers VS Code.");
105
+ seedThreads("Open: ship PR.");
106
+ const ctx = makeContext();
75
107
 
76
108
  const block = await memoryV2StaticInjector.produce(ctx);
77
109
  expect(block).not.toBeNull();
78
110
  expect(block!.id).toBe("memory-v2-static");
79
111
  expect(block!.placement).toBe("after-memory-prefix");
80
- expect(block!.text).toBe(`<info>\n${content}\n</info>`);
112
+ expect(block!.text).toBe(
113
+ "<info>\n## Essentials\n\nAlice prefers VS Code.\n\n## Threads\n\nOpen: ship PR.\n</info>",
114
+ );
81
115
  });
82
116
 
83
117
  test("escapes inner </info> closing tags so the wrapper cannot be broken out of", async () => {
84
- const content = "## Essentials\n\nText with </info> embedded.";
85
- const ctx = makeContext({
86
- injectionInputs: { memoryV2Static: content },
87
- });
118
+ seedEssentials("Text with </info> embedded.");
119
+ const ctx = makeContext();
88
120
 
89
121
  const block = await memoryV2StaticInjector.produce(ctx);
90
122
  expect(block).not.toBeNull();
@@ -92,4 +124,40 @@ describe("memory-v2-static injector", () => {
92
124
  "<info>\n## Essentials\n\nText with &lt;/info&gt; embedded.\n</info>",
93
125
  );
94
126
  });
127
+
128
+ test("skips (re)injection when the <info> block is already present", async () => {
129
+ seedEssentials("Alice prefers VS Code.");
130
+ const ctx = makeContext();
131
+ const runMessages: Message[] = [
132
+ {
133
+ role: "user",
134
+ content: [
135
+ { type: "text", text: "<info>\nstale memory\n</info>" },
136
+ { type: "text", text: "What next?" },
137
+ ],
138
+ },
139
+ ];
140
+ expect(await memoryV2StaticInjector.produce(ctx, runMessages)).toBeNull();
141
+ });
142
+
143
+ test("skips (re)injection when a legacy <memory>-wrapped static block is present", async () => {
144
+ // Rows persisted before the `<info>` switch rehydrate the static block as
145
+ // `<memory>…</memory>`. Re-injecting a fresh `<info>` copy alongside it
146
+ // would duplicate the content until the next compaction.
147
+ seedEssentials("Alice prefers VS Code.");
148
+ const ctx = makeContext();
149
+ const runMessages: Message[] = [
150
+ {
151
+ role: "user",
152
+ content: [
153
+ {
154
+ type: "text",
155
+ text: "<memory>\n## Essentials\n\nAlice prefers VS Code.\n</memory>",
156
+ },
157
+ { type: "text", text: "What next?" },
158
+ ],
159
+ },
160
+ ];
161
+ expect(await memoryV2StaticInjector.produce(ctx, runMessages)).toBeNull();
162
+ });
95
163
  });
@@ -48,8 +48,10 @@ const addMessageMock = mock(
48
48
  conversationId: string,
49
49
  role: string,
50
50
  content: string,
51
- _metadata?: Record<string, unknown>,
52
- _opts?: { skipIndexing?: boolean },
51
+ _options?: {
52
+ metadata?: Record<string, unknown>;
53
+ skipIndexing?: boolean;
54
+ },
53
55
  ) => ({
54
56
  id: "xpost-msg-1",
55
57
  conversationId,
@@ -197,8 +199,10 @@ describe("messaging-send tool", () => {
197
199
  "bound-conv-99",
198
200
  "assistant",
199
201
  JSON.stringify([{ type: "text", text: "hello from A" }]),
200
- { automated: true, crossPostedFrom: "conv-A" },
201
- { skipIndexing: true },
202
+ {
203
+ metadata: { automated: true, crossPostedFrom: "conv-A" },
204
+ skipIndexing: true,
205
+ },
202
206
  );
203
207
  expect(syncMessageToDiskMock).toHaveBeenCalledWith(
204
208
  "bound-conv-99",
@@ -500,10 +500,10 @@ describe("export config sanitization", () => {
500
500
 
501
501
  describe("route policy registration", () => {
502
502
  test("migrations/export policy requires settings.write scope", async () => {
503
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
504
- const policy = getPolicy("migrations/export");
503
+ const { ROUTES } = await import("../runtime/routes/index.js");
504
+ const policy = (ROUTES.find((r) => r.endpoint === "migrations/export")?.policy ?? null);
505
505
 
506
- expect(policy).toBeDefined();
506
+ expect(policy).not.toBeNull();
507
507
  expect(policy?.requiredScopes).toContain("settings.write");
508
508
  expect(policy?.allowedPrincipalTypes).toContain("actor");
509
509
  expect(policy?.allowedPrincipalTypes).toContain("svc_gateway");
@@ -511,10 +511,10 @@ describe("route policy registration", () => {
511
511
  });
512
512
 
513
513
  test("migrations/validate policy is still registered", async () => {
514
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
515
- const policy = getPolicy("migrations/validate");
514
+ const { ROUTES } = await import("../runtime/routes/index.js");
515
+ const policy = (ROUTES.find((r) => r.endpoint === "migrations/validate")?.policy ?? null);
516
516
 
517
- expect(policy).toBeDefined();
517
+ expect(policy).not.toBeNull();
518
518
  expect(policy?.requiredScopes).toContain("settings.read");
519
519
  });
520
520
  });
@@ -525,10 +525,10 @@ describe("route policy registration", () => {
525
525
 
526
526
  describe("auth policy shape", () => {
527
527
  test("export policy requires settings.write and would deny without it", async () => {
528
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
529
- const policy = getPolicy("migrations/export");
528
+ const { ROUTES } = await import("../runtime/routes/index.js");
529
+ const policy = (ROUTES.find((r) => r.endpoint === "migrations/export")?.policy ?? null);
530
530
 
531
- expect(policy).toBeDefined();
531
+ expect(policy).not.toBeNull();
532
532
  // Verify the policy shape means a caller without settings.write would be denied
533
533
  expect(policy!.requiredScopes).toEqual(["settings.write"]);
534
534
  // Verify only the expected principal types are allowed
@@ -539,9 +539,9 @@ describe("auth policy shape", () => {
539
539
  });
540
540
 
541
541
  test("export policy differs from validate policy on scopes (validate is read-only)", async () => {
542
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
543
- const exportPolicy = getPolicy("migrations/export");
544
- const validatePolicy = getPolicy("migrations/validate");
542
+ const { ROUTES } = await import("../runtime/routes/index.js");
543
+ const exportPolicy = (ROUTES.find((r) => r.endpoint === "migrations/export")?.policy ?? null);
544
+ const validatePolicy = (ROUTES.find((r) => r.endpoint === "migrations/validate")?.policy ?? null);
545
545
 
546
546
  // validate is read-only so requires settings.read; export requires settings.write
547
547
  expect(exportPolicy!.requiredScopes).toEqual(["settings.write"]);
@@ -1129,10 +1129,10 @@ describe("commitImport — config sanitization", () => {
1129
1129
 
1130
1130
  describe("route policy registration", () => {
1131
1131
  test("migrations/import policy requires settings.write scope", async () => {
1132
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
1133
- const policy = getPolicy("migrations/import");
1132
+ const { ROUTES } = await import("../runtime/routes/index.js");
1133
+ const policy = (ROUTES.find((r) => r.endpoint === "migrations/import")?.policy ?? null);
1134
1134
 
1135
- expect(policy).toBeDefined();
1135
+ expect(policy).not.toBeNull();
1136
1136
  expect(policy?.requiredScopes).toContain("settings.write");
1137
1137
  expect(policy?.allowedPrincipalTypes).toContain("actor");
1138
1138
  expect(policy?.allowedPrincipalTypes).toContain("svc_gateway");
@@ -1140,11 +1140,11 @@ describe("route policy registration", () => {
1140
1140
  });
1141
1141
 
1142
1142
  test("import policy matches export/preflight but differs from validate on scopes", async () => {
1143
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
1144
- const importPolicy = getPolicy("migrations/import");
1145
- const validatePolicy = getPolicy("migrations/validate");
1146
- const exportPolicy = getPolicy("migrations/export");
1147
- const preflightPolicy = getPolicy("migrations/import-preflight");
1143
+ const { ROUTES } = await import("../runtime/routes/index.js");
1144
+ const importPolicy = (ROUTES.find((r) => r.endpoint === "migrations/import")?.policy ?? null);
1145
+ const validatePolicy = (ROUTES.find((r) => r.endpoint === "migrations/validate")?.policy ?? null);
1146
+ const exportPolicy = (ROUTES.find((r) => r.endpoint === "migrations/export")?.policy ?? null);
1147
+ const preflightPolicy = (ROUTES.find((r) => r.endpoint === "migrations/import-preflight")?.policy ?? null);
1148
1148
 
1149
1149
  // import, export, and preflight all require settings.write
1150
1150
  expect(importPolicy!.requiredScopes).toEqual(exportPolicy!.requiredScopes);
@@ -710,10 +710,10 @@ describe("DefaultPathResolver", () => {
710
710
 
711
711
  describe("route policy registration", () => {
712
712
  test("migrations/import-preflight policy requires settings.write scope", async () => {
713
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
714
- const policy = getPolicy("migrations/import-preflight");
713
+ const { ROUTES } = await import("../runtime/routes/index.js");
714
+ const policy = (ROUTES.find((r) => r.endpoint === "migrations/import-preflight")?.policy ?? null);
715
715
 
716
- expect(policy).toBeDefined();
716
+ expect(policy).not.toBeNull();
717
717
  expect(policy?.requiredScopes).toContain("settings.write");
718
718
  expect(policy?.allowedPrincipalTypes).toContain("actor");
719
719
  expect(policy?.allowedPrincipalTypes).toContain("svc_gateway");
@@ -721,10 +721,10 @@ describe("route policy registration", () => {
721
721
  });
722
722
 
723
723
  test("import-preflight policy matches export but differs from validate on scopes", async () => {
724
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
725
- const preflightPolicy = getPolicy("migrations/import-preflight");
726
- const validatePolicy = getPolicy("migrations/validate");
727
- const exportPolicy = getPolicy("migrations/export");
724
+ const { ROUTES } = await import("../runtime/routes/index.js");
725
+ const preflightPolicy = (ROUTES.find((r) => r.endpoint === "migrations/import-preflight")?.policy ?? null);
726
+ const validatePolicy = (ROUTES.find((r) => r.endpoint === "migrations/validate")?.policy ?? null);
727
+ const exportPolicy = (ROUTES.find((r) => r.endpoint === "migrations/export")?.policy ?? null);
728
728
 
729
729
  // preflight and export both require settings.write
730
730
  expect(preflightPolicy!.requiredScopes).toEqual(
@@ -630,10 +630,10 @@ describe("handleMigrationValidate", () => {
630
630
  describe("route policy registration", () => {
631
631
  test("migrations/validate policy requires settings.read scope", async () => {
632
632
  // Import route-policy to verify the registration exists
633
- const { getPolicy } = await import("../runtime/auth/route-policy.js");
634
- const policy = getPolicy("migrations/validate");
633
+ const { ROUTES } = await import("../runtime/routes/index.js");
634
+ const policy = (ROUTES.find((r) => r.endpoint === "migrations/validate")?.policy ?? null);
635
635
 
636
- expect(policy).toBeDefined();
636
+ expect(policy).not.toBeNull();
637
637
  expect(policy?.requiredScopes).toContain("settings.read");
638
638
  expect(policy?.allowedPrincipalTypes).toContain("actor");
639
639
  expect(policy?.allowedPrincipalTypes).toContain("svc_gateway");