@vellumai/assistant 0.8.3 → 0.8.5

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 (665) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/docker-entrypoint.sh +0 -1
  3. package/docs/browser-use-architecture-phase2.md +1 -1
  4. package/knip.json +2 -1
  5. package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
  6. package/openapi.yaml +1492 -100
  7. package/package.json +1 -1
  8. package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
  9. package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
  10. package/src/__tests__/agent-loop.test.ts +88 -3
  11. package/src/__tests__/anthropic-provider.test.ts +302 -33
  12. package/src/__tests__/approval-cascade.test.ts +1 -1
  13. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  14. package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
  15. package/src/__tests__/audit-log-rotation.test.ts +70 -16
  16. package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
  17. package/src/__tests__/btw-routes.test.ts +2 -3
  18. package/src/__tests__/call-controller.test.ts +0 -1
  19. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  20. package/src/__tests__/channel-delivery-store.test.ts +193 -0
  21. package/src/__tests__/channel-guardian.test.ts +3 -3
  22. package/src/__tests__/channel-reply-delivery.test.ts +284 -5
  23. package/src/__tests__/channel-retry-sweep.test.ts +274 -1
  24. package/src/__tests__/checker.test.ts +6 -15
  25. package/src/__tests__/compaction-events.test.ts +2 -1
  26. package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
  27. package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
  28. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
  29. package/src/__tests__/computer-use-tools.test.ts +2 -4
  30. package/src/__tests__/config-watcher.test.ts +1 -1
  31. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  32. package/src/__tests__/context-token-estimator.test.ts +91 -1
  33. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
  34. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
  35. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +55 -4
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +228 -8
  37. package/src/__tests__/conversation-agent-loop.test.ts +188 -129
  38. package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
  39. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  40. package/src/__tests__/conversation-clean-command.test.ts +137 -0
  41. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  42. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
  43. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  44. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  45. package/src/__tests__/conversation-error.test.ts +31 -0
  46. package/src/__tests__/conversation-fork-crud.test.ts +324 -0
  47. package/src/__tests__/conversation-lifecycle.test.ts +53 -12
  48. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  49. package/src/__tests__/conversation-load-history-stripped.test.ts +279 -0
  50. package/src/__tests__/conversation-pairing.test.ts +2 -2
  51. package/src/__tests__/conversation-process-callsite.test.ts +1 -1
  52. package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -1
  53. package/src/__tests__/conversation-queue.test.ts +1 -1
  54. package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
  55. package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
  56. package/src/__tests__/conversation-runtime-assembly.test.ts +264 -81
  57. package/src/__tests__/conversation-seed-composer.test.ts +66 -4
  58. package/src/__tests__/conversation-skill-tools.test.ts +2 -5
  59. package/src/__tests__/conversation-slash-commands.test.ts +36 -8
  60. package/src/__tests__/conversation-slash-queue.test.ts +1 -1
  61. package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
  62. package/src/__tests__/conversation-speed-override.test.ts +1 -1
  63. package/src/__tests__/conversation-store.test.ts +1 -1
  64. package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
  65. package/src/__tests__/conversation-sync-tags.test.ts +99 -32
  66. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -1
  67. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  68. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  69. package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
  70. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  71. package/src/__tests__/credential-security-invariants.test.ts +7 -0
  72. package/src/__tests__/credential-vault-unit.test.ts +2 -2
  73. package/src/__tests__/cu-unified-flow.test.ts +10 -1
  74. package/src/__tests__/dm-backfill.test.ts +64 -0
  75. package/src/__tests__/dm-persistence.test.ts +33 -0
  76. package/src/__tests__/document-find-replace.test.ts +501 -0
  77. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  78. package/src/__tests__/email-html-renderer.test.ts +12 -0
  79. package/src/__tests__/first-greeting.test.ts +23 -2
  80. package/src/__tests__/gateway-flag-listener.test.ts +237 -0
  81. package/src/__tests__/gemini-provider.test.ts +78 -0
  82. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  83. package/src/__tests__/guardian-outbound-http.test.ts +7 -5
  84. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  85. package/src/__tests__/headless-browser-navigate.test.ts +172 -0
  86. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  87. package/src/__tests__/heartbeat-service.test.ts +4 -0
  88. package/src/__tests__/host-bash-proxy.test.ts +6 -0
  89. package/src/__tests__/host-browser-proxy.test.ts +10 -0
  90. package/src/__tests__/host-cu-proxy.test.ts +8 -1
  91. package/src/__tests__/host-file-proxy.test.ts +8 -1
  92. package/src/__tests__/host-shell-tool.test.ts +1 -1
  93. package/src/__tests__/host-transfer-proxy.test.ts +8 -1
  94. package/src/__tests__/identity-routes.test.ts +57 -0
  95. package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
  96. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  97. package/src/__tests__/injector-chain.test.ts +2 -0
  98. package/src/__tests__/injector-document-comments.test.ts +378 -0
  99. package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
  100. package/src/__tests__/list-messages-attachments.test.ts +21 -17
  101. package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
  102. package/src/__tests__/list-messages-page-latest.test.ts +130 -14
  103. package/src/__tests__/list-messages-tool-merge.test.ts +77 -17
  104. package/src/__tests__/llm-context-normalization.test.ts +0 -2
  105. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  106. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  107. package/src/__tests__/llm-resolver.test.ts +161 -9
  108. package/src/__tests__/llm-usage-store.test.ts +66 -0
  109. package/src/__tests__/log-export-routes.test.ts +99 -2
  110. package/src/__tests__/logger.test.ts +89 -0
  111. package/src/__tests__/mcp-abort-signal.test.ts +2 -2
  112. package/src/__tests__/media-generate-image.test.ts +31 -0
  113. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  114. package/src/__tests__/message-queue-steer.test.ts +114 -0
  115. package/src/__tests__/model-intents.test.ts +2 -4
  116. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  117. package/src/__tests__/onboarding-template-contract.test.ts +1 -1
  118. package/src/__tests__/openai-provider.test.ts +151 -0
  119. package/src/__tests__/openai-responses-provider.test.ts +118 -16
  120. package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
  121. package/src/__tests__/pending-interactions-resolved-event.test.ts +189 -0
  122. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  123. package/src/__tests__/platform.test.ts +2 -5
  124. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  125. package/src/__tests__/plugin-bootstrap.test.ts +2 -2
  126. package/src/__tests__/plugin-source-watcher.test.ts +302 -0
  127. package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
  128. package/src/__tests__/plugin-types.test.ts +3 -2
  129. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  130. package/src/__tests__/pricing.test.ts +12 -0
  131. package/src/__tests__/process-message-background-slack.test.ts +1 -51
  132. package/src/__tests__/process-message-display-content.test.ts +21 -16
  133. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  134. package/src/__tests__/registry.test.ts +2 -8
  135. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  136. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  137. package/src/__tests__/server-history-render.test.ts +83 -4
  138. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  139. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  140. package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
  141. package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
  142. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  143. package/src/__tests__/steer-tool-repair.test.ts +249 -0
  144. package/src/__tests__/subagent-notify-parent.test.ts +1 -1
  145. package/src/__tests__/suggestion-routes.test.ts +1 -0
  146. package/src/__tests__/sync-message-contract.test.ts +59 -0
  147. package/src/__tests__/system-prompt.test.ts +161 -124
  148. package/src/__tests__/terminal-tools.test.ts +12 -2
  149. package/src/__tests__/thinking-block-replay.test.ts +113 -0
  150. package/src/__tests__/thread-backfill.test.ts +370 -22
  151. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  152. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  153. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  154. package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
  155. package/src/__tests__/tool-executor.test.ts +89 -53
  156. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  157. package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
  158. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  159. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  160. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  161. package/src/__tests__/twilio-routes.test.ts +1 -1
  162. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  163. package/src/__tests__/usage-routes.test.ts +3 -0
  164. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  165. package/src/__tests__/web-fetch.test.ts +2 -2
  166. package/src/__tests__/workspace-git-service.test.ts +94 -10
  167. package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
  168. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  169. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  170. package/src/acp/prepare-agent-env.ts +78 -0
  171. package/src/acp/session-manager.ts +1 -1
  172. package/src/agent/attachments.ts +1 -0
  173. package/src/agent/loop.ts +65 -20
  174. package/src/api/README.md +5 -0
  175. package/src/api/index.ts +4 -0
  176. package/src/api/package.json +10 -0
  177. package/src/background-wake/background-wake-routes.test.ts +233 -0
  178. package/src/background-wake/next-wake.test.ts +289 -0
  179. package/src/background-wake/next-wake.ts +172 -0
  180. package/src/background-wake/runtime-registry.ts +24 -0
  181. package/src/browser/operations.ts +15 -0
  182. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  183. package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
  184. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  185. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  186. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  187. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  188. package/src/cli/commands/__tests__/memory-v2.test.ts +10 -12
  189. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  190. package/src/cli/commands/browser.ts +247 -0
  191. package/src/cli/commands/conversations.ts +128 -1
  192. package/src/cli/commands/domain.ts +91 -41
  193. package/src/cli/commands/inference-providers.ts +147 -1
  194. package/src/cli/commands/inference.ts +93 -40
  195. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  196. package/src/cli/commands/memory-v2.ts +483 -0
  197. package/src/cli/commands/memory-v3-render.ts +344 -0
  198. package/src/cli/commands/memory-v3.ts +316 -0
  199. package/src/cli/commands/notifications.ts +24 -2
  200. package/src/cli/program.ts +2 -0
  201. package/src/cli/utils/conversation-id.ts +17 -5
  202. package/src/config/assistant-feature-flags.ts +21 -9
  203. package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
  204. package/src/config/bundled-skills/document-editor/SKILL.md +124 -0
  205. package/src/config/bundled-skills/document-editor/TOOLS.json +258 -0
  206. package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
  207. package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
  208. package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
  209. package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
  210. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  211. package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
  212. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  213. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  214. package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
  215. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  216. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  217. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  218. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  219. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  220. package/src/config/bundled-skills/schedule/SKILL.md +8 -0
  221. package/src/config/bundled-tool-registry.ts +24 -12
  222. package/src/config/call-site-defaults.ts +20 -0
  223. package/src/config/feature-flag-registry.json +115 -3
  224. package/src/config/llm-resolver.ts +16 -2
  225. package/src/config/schemas/__tests__/memory-v2.test.ts +217 -1
  226. package/src/config/schemas/call-site-catalog.ts +35 -0
  227. package/src/config/schemas/llm.ts +14 -0
  228. package/src/config/schemas/memory-v2.ts +294 -1
  229. package/src/config/schemas/memory.ts +2 -1
  230. package/src/context/compactor.ts +60 -1
  231. package/src/context/token-estimator.ts +47 -4
  232. package/src/context/window-manager.ts +25 -0
  233. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  234. package/src/conversations/message-consolidation.ts +404 -0
  235. package/src/credential-health/credential-health-service.ts +34 -19
  236. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
  237. package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
  238. package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
  239. package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
  240. package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
  241. package/src/daemon/conversation-agent-loop-handlers.ts +155 -36
  242. package/src/daemon/conversation-agent-loop.ts +307 -88
  243. package/src/daemon/conversation-error.ts +31 -1
  244. package/src/daemon/conversation-lifecycle.ts +149 -118
  245. package/src/daemon/conversation-messaging.ts +3 -0
  246. package/src/daemon/conversation-process.ts +273 -0
  247. package/src/daemon/conversation-queue-manager.ts +14 -0
  248. package/src/daemon/conversation-runtime-assembly.ts +145 -84
  249. package/src/daemon/conversation-slash.ts +37 -5
  250. package/src/daemon/conversation-surfaces.ts +45 -2
  251. package/src/daemon/conversation-tool-setup.ts +70 -3
  252. package/src/daemon/conversation-usage.ts +2 -0
  253. package/src/daemon/conversation.ts +54 -32
  254. package/src/daemon/disk-pressure-guard.ts +14 -2
  255. package/src/daemon/first-greeting.ts +10 -0
  256. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
  257. package/src/daemon/handlers/config-a2a.ts +160 -0
  258. package/src/daemon/handlers/config-model.test.ts +2 -0
  259. package/src/daemon/handlers/conversations.ts +90 -3
  260. package/src/daemon/handlers/shared.ts +92 -29
  261. package/src/daemon/host-bash-proxy.ts +1 -1
  262. package/src/daemon/host-browser-proxy.ts +5 -5
  263. package/src/daemon/host-cu-proxy.ts +5 -5
  264. package/src/daemon/host-file-proxy.ts +5 -5
  265. package/src/daemon/host-proxy-base.ts +4 -4
  266. package/src/daemon/host-transfer-proxy.ts +11 -11
  267. package/src/daemon/lifecycle.ts +40 -23
  268. package/src/daemon/meet-manifest-loader.ts +1 -7
  269. package/src/daemon/message-protocol.ts +4 -0
  270. package/src/daemon/message-types/conversations.ts +14 -9
  271. package/src/daemon/message-types/document-comments.ts +50 -0
  272. package/src/daemon/message-types/home.ts +1 -13
  273. package/src/daemon/message-types/messages.ts +66 -7
  274. package/src/daemon/message-types/surfaces.ts +3 -1
  275. package/src/daemon/message-types/sync.ts +14 -0
  276. package/src/daemon/message-types/web-activity.ts +57 -0
  277. package/src/daemon/plugin-source-watcher.ts +135 -3
  278. package/src/daemon/process-message.ts +69 -12
  279. package/src/daemon/shutdown-handlers.ts +24 -5
  280. package/src/daemon/switch-inference-profile-tool.ts +52 -0
  281. package/src/daemon/tool-setup-types.ts +13 -0
  282. package/src/daemon/trust-context.ts +6 -0
  283. package/src/documents/document-comments-store.test.ts +338 -0
  284. package/src/documents/document-comments-store.ts +237 -0
  285. package/src/documents/document-store.ts +202 -0
  286. package/src/events/relationship-state-updated.ts +25 -0
  287. package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -2
  288. package/src/heartbeat/heartbeat-service.ts +1 -0
  289. package/src/home/__tests__/suggested-prompts.test.ts +33 -2
  290. package/src/home/feed-types.ts +6 -1
  291. package/src/home/home-content-refresh.ts +52 -0
  292. package/src/home/home-greeting-cache.ts +69 -0
  293. package/src/home/home-greeting.ts +85 -0
  294. package/src/home/suggested-prompts.ts +168 -9
  295. package/src/ipc/gateway-flag-listener.ts +123 -0
  296. package/src/ipc/skill-routes/registries.ts +8 -12
  297. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  298. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  299. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
  300. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  301. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
  302. package/src/memory/__tests__/memory-retrospective-job.test.ts +327 -6
  303. package/src/memory/auto-analysis-enqueue.ts +5 -1
  304. package/src/memory/conversation-crud.ts +191 -100
  305. package/src/memory/conversation-starters-cadence.ts +3 -1
  306. package/src/memory/conversation-title-service.ts +19 -3
  307. package/src/memory/db-async-query.ts +214 -0
  308. package/src/memory/db-init.ts +26 -0
  309. package/src/memory/db-maintenance.ts +30 -21
  310. package/src/memory/delivery-crud.ts +41 -0
  311. package/src/memory/delivery-status.ts +141 -15
  312. package/src/memory/external-conversation-store.ts +32 -1
  313. package/src/memory/graph/bootstrap.ts +8 -1
  314. package/src/memory/graph/capability-seed.ts +7 -3
  315. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  316. package/src/memory/graph/extraction.ts +1 -5
  317. package/src/memory/graph/graph-search.ts +7 -1
  318. package/src/memory/indexer.ts +28 -18
  319. package/src/memory/job-handlers/cleanup.ts +76 -18
  320. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  321. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  322. package/src/memory/jobs-store.ts +14 -0
  323. package/src/memory/jobs-worker.ts +68 -15
  324. package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
  325. package/src/memory/llm-request-log-source-local.ts +7 -0
  326. package/src/memory/llm-request-log-source.ts +9 -2
  327. package/src/memory/llm-request-log-store.ts +43 -1
  328. package/src/memory/llm-usage-store.ts +24 -0
  329. package/src/memory/memory-retrospective-constants.ts +28 -0
  330. package/src/memory/memory-retrospective-enqueue.ts +11 -3
  331. package/src/memory/memory-retrospective-job.ts +413 -18
  332. package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
  333. package/src/memory/memory-v2-activation-log-store.ts +41 -14
  334. package/src/memory/migrations/100-core-tables.ts +1 -0
  335. package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
  336. package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
  337. package/src/memory/migrations/253-document-comments.ts +47 -0
  338. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
  339. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
  340. package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
  341. package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
  342. package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
  343. package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
  344. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  345. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  346. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  347. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  348. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  349. package/src/memory/migrations/index.ts +34 -0
  350. package/src/memory/migrations/registry.ts +58 -0
  351. package/src/memory/onboarding-events-store.ts +7 -0
  352. package/src/memory/schema/calls.ts +1 -0
  353. package/src/memory/schema/conversations.ts +3 -0
  354. package/src/memory/schema/infrastructure.ts +22 -0
  355. package/src/memory/tool-usage-store.ts +36 -8
  356. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  357. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  358. package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
  359. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  360. package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
  361. package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
  362. package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
  363. package/src/memory/v2/__tests__/injection.test.ts +158 -112
  364. package/src/memory/v2/__tests__/page-index.test.ts +365 -1
  365. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  366. package/src/memory/v2/__tests__/router.test.ts +660 -4
  367. package/src/memory/v2/consolidation-job.ts +14 -0
  368. package/src/memory/v2/harness/compare.ts +57 -0
  369. package/src/memory/v2/harness/metrics.ts +124 -0
  370. package/src/memory/v2/harness/oracle.ts +145 -0
  371. package/src/memory/v2/harness/replay-input.ts +224 -0
  372. package/src/memory/v2/harness/retriever.ts +74 -0
  373. package/src/memory/v2/harness/router-retriever.ts +43 -0
  374. package/src/memory/v2/harness/runner.ts +106 -0
  375. package/src/memory/v2/harness/trace.ts +58 -0
  376. package/src/memory/v2/injection-events.ts +101 -0
  377. package/src/memory/v2/injection.ts +42 -25
  378. package/src/memory/v2/page-index.ts +209 -7
  379. package/src/memory/v2/page-store.ts +18 -0
  380. package/src/memory/v2/prompts/router.ts +26 -1
  381. package/src/memory/v2/qdrant.ts +14 -2
  382. package/src/memory/v2/router.ts +369 -62
  383. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  384. package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
  385. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  386. package/src/memory/v3/__tests__/edges.test.ts +563 -0
  387. package/src/memory/v3/__tests__/filter.test.ts +512 -0
  388. package/src/memory/v3/__tests__/gate.test.ts +574 -0
  389. package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
  390. package/src/memory/v3/__tests__/loop.test.ts +530 -0
  391. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  392. package/src/memory/v3/__tests__/scouts.test.ts +440 -0
  393. package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
  394. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  395. package/src/memory/v3/__tests__/traversal.test.ts +469 -0
  396. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  397. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  398. package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
  399. package/src/memory/v3/__tests__/validate.test.ts +245 -0
  400. package/src/memory/v3/auto-edges.ts +223 -0
  401. package/src/memory/v3/coactivation-store.ts +124 -0
  402. package/src/memory/v3/consolidation-job.ts +323 -0
  403. package/src/memory/v3/edge-learning-job.ts +160 -0
  404. package/src/memory/v3/edges.ts +249 -0
  405. package/src/memory/v3/filter.ts +281 -0
  406. package/src/memory/v3/gate.ts +334 -0
  407. package/src/memory/v3/index-composition.ts +113 -0
  408. package/src/memory/v3/llm-capture.ts +46 -0
  409. package/src/memory/v3/loop.ts +382 -0
  410. package/src/memory/v3/maintenance.ts +144 -0
  411. package/src/memory/v3/prompt-context.ts +33 -0
  412. package/src/memory/v3/prompts/consolidation.ts +458 -0
  413. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  414. package/src/memory/v3/retriever.ts +33 -0
  415. package/src/memory/v3/scouts.ts +420 -0
  416. package/src/memory/v3/shadow-middleware.ts +305 -0
  417. package/src/memory/v3/traversal.ts +206 -0
  418. package/src/memory/v3/tree-index.ts +237 -0
  419. package/src/memory/v3/tree-store.ts +394 -0
  420. package/src/memory/v3/tree-walk.ts +351 -0
  421. package/src/memory/v3/types.ts +65 -0
  422. package/src/memory/v3/validate.ts +300 -0
  423. package/src/messaging/providers/index.ts +7 -1
  424. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
  425. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
  426. package/src/messaging/providers/slack/adapter.ts +178 -25
  427. package/src/messaging/providers/slack/api.test.ts +54 -0
  428. package/src/messaging/providers/slack/api.ts +119 -3
  429. package/src/messaging/providers/slack/client.ts +12 -0
  430. package/src/messaging/providers/slack/deep-link.ts +20 -1
  431. package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
  432. package/src/messaging/providers/slack/message-metadata.ts +156 -0
  433. package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
  434. package/src/messaging/providers/slack/render-transcript.ts +176 -49
  435. package/src/messaging/providers/slack/send.test.ts +77 -0
  436. package/src/messaging/providers/slack/send.ts +8 -2
  437. package/src/messaging/providers/slack/types.ts +14 -0
  438. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
  439. package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
  440. package/src/notifications/adapters/macos.ts +18 -1
  441. package/src/notifications/adapters/platform.ts +1 -1
  442. package/src/notifications/conversation-seed-composer.ts +14 -2
  443. package/src/notifications/decision-engine.ts +1 -4
  444. package/src/notifications/deferred-emit.ts +135 -0
  445. package/src/notifications/emit-signal.ts +38 -50
  446. package/src/notifications/home-feed-side-effect.ts +60 -30
  447. package/src/oauth/connect-orchestrator.ts +3 -0
  448. package/src/oauth/credential-token-resolver.ts +2 -0
  449. package/src/oauth/manual-token-connection.ts +19 -0
  450. package/src/oauth/oauth-store.ts +12 -0
  451. package/src/oauth/seed-providers.ts +22 -0
  452. package/src/permissions/prompter.ts +8 -5
  453. package/src/permissions/question-prompter.ts +5 -2
  454. package/src/permissions/secret-prompter.ts +6 -3
  455. package/src/plugin-api/index.ts +4 -0
  456. package/src/plugin-api/types.ts +7 -33
  457. package/src/plugins/defaults/index.ts +6 -0
  458. package/src/plugins/defaults/injectors.ts +100 -20
  459. package/src/plugins/external-plugin-loader.ts +5 -68
  460. package/src/plugins/types.ts +11 -16
  461. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  462. package/src/prompts/__tests__/system-prompt.test.ts +46 -2
  463. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  464. package/src/prompts/normalize-onboarding.ts +40 -0
  465. package/src/prompts/persona-resolver.ts +36 -21
  466. package/src/prompts/sections.ts +69 -19
  467. package/src/prompts/system-prompt.ts +118 -216
  468. package/src/prompts/template-detection.ts +37 -0
  469. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
  470. package/src/prompts/templates/BOOTSTRAP.md +10 -2
  471. package/src/prompts/templates/VOICE.md +3 -0
  472. package/src/prompts/templates/system-sections.ts +281 -9
  473. package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
  474. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  475. package/src/providers/anthropic/client.ts +159 -66
  476. package/src/providers/call-site-routing.ts +14 -2
  477. package/src/providers/connection-model-compat.ts +38 -0
  478. package/src/providers/connection-resolution.ts +16 -2
  479. package/src/providers/fireworks/client.ts +20 -2
  480. package/src/providers/gemini/client.ts +49 -6
  481. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
  482. package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
  483. package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
  484. package/src/providers/inference/adapter-factory.ts +18 -1
  485. package/src/providers/inference/auth.ts +3 -3
  486. package/src/providers/inference/codex-token-refresh.ts +128 -0
  487. package/src/providers/inference/resolve-auth.ts +49 -6
  488. package/src/providers/minimax/client.ts +106 -0
  489. package/src/providers/model-catalog.ts +91 -1
  490. package/src/providers/model-intents.ts +1 -1
  491. package/src/providers/openai/chat-completions-provider.ts +63 -23
  492. package/src/providers/openai/codex-models.ts +18 -0
  493. package/src/providers/openai/responses-provider.ts +86 -23
  494. package/src/providers/openrouter/client.ts +5 -1
  495. package/src/providers/provider-send-message.ts +7 -1
  496. package/src/providers/retry.ts +34 -3
  497. package/src/providers/thinking-config.ts +26 -1
  498. package/src/providers/types.ts +25 -0
  499. package/src/providers/usage-tracking.ts +2 -0
  500. package/src/runtime/AGENTS.md +2 -2
  501. package/src/runtime/__tests__/agent-wake.test.ts +214 -0
  502. package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
  503. package/src/runtime/agent-wake.ts +152 -56
  504. package/src/runtime/assistant-event-hub.ts +76 -6
  505. package/src/runtime/auth/route-policy.ts +43 -3
  506. package/src/runtime/background-job-runner.ts +26 -0
  507. package/src/runtime/btw-sidechain.ts +0 -6
  508. package/src/runtime/channel-reply-delivery.ts +182 -47
  509. package/src/runtime/channel-retry-sweep.ts +141 -16
  510. package/src/runtime/http-types.ts +7 -6
  511. package/src/runtime/migrations/vbundle-builder.ts +10 -3
  512. package/src/runtime/pending-interactions.ts +50 -8
  513. package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
  514. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +161 -1
  515. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
  516. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +290 -0
  517. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  518. package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
  519. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
  520. package/src/runtime/routes/acp-routes.test.ts +255 -6
  521. package/src/runtime/routes/acp-routes.ts +8 -1
  522. package/src/runtime/routes/approval-routes.ts +4 -1
  523. package/src/runtime/routes/avatar-routes.ts +10 -10
  524. package/src/runtime/routes/background-wake-routes.ts +188 -0
  525. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  526. package/src/runtime/routes/btw-routes.ts +0 -6
  527. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
  528. package/src/runtime/routes/content-source-routes.ts +78 -0
  529. package/src/runtime/routes/conversation-cli-routes.ts +147 -2
  530. package/src/runtime/routes/conversation-list-routes.ts +12 -4
  531. package/src/runtime/routes/conversation-management-routes.ts +77 -20
  532. package/src/runtime/routes/conversation-query-routes.ts +196 -31
  533. package/src/runtime/routes/conversation-routes.ts +472 -425
  534. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  535. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  536. package/src/runtime/routes/document-comments-routes.ts +287 -0
  537. package/src/runtime/routes/documents-routes.ts +33 -0
  538. package/src/runtime/routes/domain-routes.ts +60 -10
  539. package/src/runtime/routes/email-routes.ts +5 -2
  540. package/src/runtime/routes/events-routes.ts +54 -10
  541. package/src/runtime/routes/group-routes.ts +24 -8
  542. package/src/runtime/routes/home-feed-routes.ts +6 -3
  543. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  544. package/src/runtime/routes/host-browser-routes.ts +17 -2
  545. package/src/runtime/routes/host-cu-routes.ts +2 -2
  546. package/src/runtime/routes/identity-routes.ts +21 -0
  547. package/src/runtime/routes/inbound-message-handler.ts +288 -58
  548. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  549. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
  550. package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
  551. package/src/runtime/routes/index.ts +20 -4
  552. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  553. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  554. package/src/runtime/routes/inference-provider-connection-routes.ts +63 -7
  555. package/src/runtime/routes/integrations/a2a.ts +60 -1
  556. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  557. package/src/runtime/routes/log-export-routes.ts +39 -0
  558. package/src/runtime/routes/memory-item-routes.ts +8 -3
  559. package/src/runtime/routes/memory-v2-routes.ts +427 -0
  560. package/src/runtime/routes/memory-v3-routes.ts +316 -0
  561. package/src/runtime/routes/migration-routes.ts +21 -24
  562. package/src/runtime/routes/notification-routes.ts +19 -2
  563. package/src/runtime/routes/plugins-routes.ts +337 -0
  564. package/src/runtime/routes/question-routes.ts +4 -1
  565. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  566. package/src/runtime/routes/sanity-routes.ts +159 -0
  567. package/src/runtime/routes/secret-routes.ts +25 -5
  568. package/src/runtime/routes/settings-routes.ts +12 -11
  569. package/src/runtime/routes/slack-channel-routes.ts +188 -0
  570. package/src/runtime/routes/workspace-routes.ts +25 -10
  571. package/src/runtime/services/conversation-serializer.ts +30 -4
  572. package/src/runtime/sync/resource-sync-events.ts +106 -38
  573. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  574. package/src/runtime/sync/sync-publisher.ts +2 -1
  575. package/src/runtime/verification-outbound-actions.ts +73 -1
  576. package/src/schedule/integration-status.ts +3 -1
  577. package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
  578. package/src/security/oauth2-device-code.ts +307 -0
  579. package/src/security/oauth2.ts +26 -9
  580. package/src/security/secure-keys.ts +5 -0
  581. package/src/skills/catalog-install.ts +6 -2
  582. package/src/telemetry/types.ts +12 -0
  583. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  584. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  585. package/src/tools/acp/spawn.test.ts +119 -0
  586. package/src/tools/acp/spawn.ts +15 -2
  587. package/src/tools/apps/definitions.ts +2 -8
  588. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  589. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  590. package/src/tools/browser/__tests__/pinned-tabs.test.ts +150 -0
  591. package/src/tools/browser/browser-execution.ts +106 -0
  592. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  593. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
  594. package/src/tools/browser/cdp-client/__tests__/types.test.ts +4 -0
  595. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +22 -0
  596. package/src/tools/browser/cdp-client/extension-cdp-client.ts +42 -2
  597. package/src/tools/browser/cdp-client/factory.ts +171 -4
  598. package/src/tools/browser/cdp-client/local-cdp-client.ts +21 -0
  599. package/src/tools/browser/cdp-client/types.ts +101 -0
  600. package/src/tools/browser/pinned-tabs.ts +146 -0
  601. package/src/tools/computer-use/definitions.ts +22 -78
  602. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  603. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  604. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  605. package/src/tools/credentials/vault.ts +3 -9
  606. package/src/tools/document/document-comment-tool.test.ts +379 -0
  607. package/src/tools/document/document-comment-tool.ts +156 -0
  608. package/src/tools/document/document-tool.ts +187 -2
  609. package/src/tools/execution-target.ts +21 -23
  610. package/src/tools/executor.ts +6 -1
  611. package/src/tools/filesystem/edit.ts +3 -9
  612. package/src/tools/filesystem/list.ts +3 -9
  613. package/src/tools/filesystem/read.ts +3 -9
  614. package/src/tools/filesystem/write.ts +3 -9
  615. package/src/tools/host-filesystem/edit.ts +3 -9
  616. package/src/tools/host-filesystem/read.ts +3 -9
  617. package/src/tools/host-filesystem/transfer.ts +3 -9
  618. package/src/tools/host-filesystem/write.ts +3 -9
  619. package/src/tools/host-terminal/host-shell.ts +3 -9
  620. package/src/tools/mcp/mcp-tool-factory.ts +1 -8
  621. package/src/tools/memory/register.test.ts +1 -1
  622. package/src/tools/memory/register.ts +4 -9
  623. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
  624. package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
  625. package/src/tools/network/domain-normalize.ts +17 -0
  626. package/src/tools/network/web-fetch.ts +216 -73
  627. package/src/tools/network/web-search.ts +216 -98
  628. package/src/tools/registry.ts +7 -23
  629. package/src/tools/schema-transforms.ts +1 -1
  630. package/src/tools/skills/execute.ts +3 -9
  631. package/src/tools/skills/load.ts +3 -9
  632. package/src/tools/skills/skill-tool-factory.ts +1 -8
  633. package/src/tools/subagent/notify-parent.ts +3 -9
  634. package/src/tools/system/request-permission.ts +3 -9
  635. package/src/tools/terminal/safe-env.ts +3 -2
  636. package/src/tools/terminal/shell.ts +3 -9
  637. package/src/tools/tool-approval-handler.ts +19 -12
  638. package/src/tools/tool-defaults.ts +94 -0
  639. package/src/tools/types.ts +31 -98
  640. package/src/tools/ui-surface/definitions.ts +9 -23
  641. package/src/types/onboarding-context.ts +4 -0
  642. package/src/usage/pricing.ts +23 -0
  643. package/src/usage/types.ts +12 -0
  644. package/src/util/__tests__/favicon.test.ts +84 -0
  645. package/src/util/favicon.ts +40 -0
  646. package/src/util/logger.ts +16 -7
  647. package/src/util/platform.ts +7 -7
  648. package/src/util/sqlite3-runtime.ts +65 -0
  649. package/src/workspace/git-service.ts +75 -4
  650. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  651. package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
  652. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  653. package/src/workspace/migrations/registry.ts +4 -0
  654. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  655. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  656. package/src/config/bundled-skills/document/SKILL.md +0 -54
  657. package/src/config/bundled-skills/document/TOOLS.json +0 -106
  658. package/src/daemon/seed-files.ts +0 -18
  659. package/src/prompts/cache-boundary.ts +0 -8
  660. package/src/runtime/routes/interface-routes.ts +0 -43
  661. /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
  662. /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
  663. /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
  664. /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
  665. /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
@@ -260,6 +260,8 @@ mock.module("../page-store.js", () => ({
260
260
  interface RouterResultStub {
261
261
  selectedSlugs: string[];
262
262
  failureReason: string | null;
263
+ /** Tier provenance per slug. Defaults to `tier3:0` for any selected slug. */
264
+ sourceBySlug?: Map<string, string>;
263
265
  }
264
266
 
265
267
  const routerState = {
@@ -270,12 +272,20 @@ const routerState = {
270
272
  mock.module("../router.js", () => ({
271
273
  runRouter: async () => {
272
274
  routerState.callCount++;
273
- return (
274
- routerState.nextResult ?? {
275
- selectedSlugs: [],
276
- failureReason: null,
277
- }
278
- );
275
+ const result = routerState.nextResult ?? {
276
+ selectedSlugs: [],
277
+ failureReason: null,
278
+ };
279
+ // Synthesize a default sourceBySlug for stubs that don't set one — pre-
280
+ // tier-provenance tests stage `selectedSlugs` only and expect every pick
281
+ // to flow through as a router selection. Treating them as `tier3:0` is
282
+ // the closest equivalent under the new model.
283
+ if (!result.sourceBySlug) {
284
+ const map = new Map<string, string>();
285
+ for (const slug of result.selectedSlugs) map.set(slug, "tier3:0");
286
+ result.sourceBySlug = map;
287
+ }
288
+ return result;
279
289
  },
280
290
  }));
281
291
 
@@ -388,6 +398,8 @@ import type { SkillEntry } from "../types.js";
388
398
  const { getSqliteFrom } = await import("../../db-connection.js");
389
399
  const { migrateActivationState } =
390
400
  await import("../../migrations/232-activation-state.js");
401
+ const { migrateMemoryV2InjectionEvents } =
402
+ await import("../../migrations/256-memory-v2-injection-events.js");
391
403
  const schema = await import("../../schema.js");
392
404
  const { clearEverInjected, hydrate, save } =
393
405
  await import("../activation-store.js");
@@ -409,6 +421,7 @@ function createTestDb(): DrizzleDb {
409
421
  )
410
422
  `);
411
423
  migrateActivationState(db);
424
+ migrateMemoryV2InjectionEvents(db);
412
425
  return db;
413
426
  }
414
427
 
@@ -564,8 +577,9 @@ describe("injectMemoryV2Block", () => {
564
577
  database: db,
565
578
  conversationId: "conv-1",
566
579
  currentTurn: 1,
567
- userMessage: "Tell me about Alice's editor",
568
- assistantMessage: "",
580
+ recentTurnPairs: [
581
+ { assistantMessage: "", userMessage: "Tell me about Alice's editor" },
582
+ ],
569
583
  nowText: "Spring afternoon",
570
584
  messageId: "msg-1",
571
585
  config: makeConfig(),
@@ -600,8 +614,9 @@ describe("injectMemoryV2Block", () => {
600
614
  database: db,
601
615
  conversationId: "conv-1",
602
616
  currentTurn: 1,
603
- userMessage: "Alice's editor",
604
- assistantMessage: "",
617
+ recentTurnPairs: [
618
+ { assistantMessage: "", userMessage: "Alice's editor" },
619
+ ],
605
620
  nowText: "Now",
606
621
  messageId: "msg-1",
607
622
  config: makeConfig(),
@@ -614,8 +629,12 @@ describe("injectMemoryV2Block", () => {
614
629
  database: db,
615
630
  conversationId: "conv-1",
616
631
  currentTurn: 2,
617
- userMessage: "And what about VS Code?",
618
- assistantMessage: "Alice loves it.",
632
+ recentTurnPairs: [
633
+ {
634
+ assistantMessage: "Alice loves it.",
635
+ userMessage: "And what about VS Code?",
636
+ },
637
+ ],
619
638
  nowText: "Now",
620
639
  messageId: "msg-2",
621
640
  config: makeConfig(),
@@ -641,8 +660,9 @@ describe("injectMemoryV2Block", () => {
641
660
  database: db,
642
661
  conversationId: "conv-1",
643
662
  currentTurn: 1,
644
- userMessage: "Editor preferences",
645
- assistantMessage: "",
663
+ recentTurnPairs: [
664
+ { assistantMessage: "", userMessage: "Editor preferences" },
665
+ ],
646
666
  nowText: "Now",
647
667
  messageId: "msg-1",
648
668
  config: makeConfig(),
@@ -659,8 +679,12 @@ describe("injectMemoryV2Block", () => {
659
679
  database: db,
660
680
  conversationId: "conv-1",
661
681
  currentTurn: 2,
662
- userMessage: "Tell me about Carol's music taste",
663
- assistantMessage: "",
682
+ recentTurnPairs: [
683
+ {
684
+ assistantMessage: "",
685
+ userMessage: "Tell me about Carol's music taste",
686
+ },
687
+ ],
664
688
  nowText: "Now",
665
689
  messageId: "msg-2",
666
690
  config: makeConfig(),
@@ -686,8 +710,9 @@ describe("injectMemoryV2Block", () => {
686
710
  database: db,
687
711
  conversationId: "conv-1",
688
712
  currentTurn: 1,
689
- userMessage: "Alice's editor",
690
- assistantMessage: "",
713
+ recentTurnPairs: [
714
+ { assistantMessage: "", userMessage: "Alice's editor" },
715
+ ],
691
716
  nowText: "Now",
692
717
  messageId: "msg-1",
693
718
  config: makeConfig(),
@@ -707,8 +732,9 @@ describe("injectMemoryV2Block", () => {
707
732
  database: db,
708
733
  conversationId: "conv-1",
709
734
  currentTurn: 2,
710
- userMessage: "Alice's editor again",
711
- assistantMessage: "",
735
+ recentTurnPairs: [
736
+ { assistantMessage: "", userMessage: "Alice's editor again" },
737
+ ],
712
738
  nowText: "Now",
713
739
  messageId: "msg-2",
714
740
  config: makeConfig(),
@@ -734,8 +760,12 @@ describe("injectMemoryV2Block", () => {
734
760
  database: db,
735
761
  conversationId: "conv-1",
736
762
  currentTurn: 1,
737
- userMessage: "tell me about the summarized page",
738
- assistantMessage: "",
763
+ recentTurnPairs: [
764
+ {
765
+ assistantMessage: "",
766
+ userMessage: "tell me about the summarized page",
767
+ },
768
+ ],
739
769
  nowText: "Now",
740
770
  messageId: "msg-1",
741
771
  config: makeConfig(),
@@ -743,7 +773,7 @@ describe("injectMemoryV2Block", () => {
743
773
 
744
774
  expect(result.block).not.toBeNull();
745
775
  expect(result.block).toContain(
746
- "**CRITICAL:** These are page summaries. Read the page file if it looks relevant.",
776
+ 'Use `file_read("memory/concepts/path/to/file.md")` to read the full pages for any of the injected memory summaries you want more information on.',
747
777
  );
748
778
  expect(result.block).toContain(
749
779
  "# memory/concepts/summarized-page.md\nA short prose description",
@@ -768,19 +798,22 @@ describe("injectMemoryV2Block", () => {
768
798
  database: db,
769
799
  conversationId: "conv-1",
770
800
  currentTurn: 1,
771
- userMessage: "show me everything",
772
- assistantMessage: "",
801
+ recentTurnPairs: [
802
+ { assistantMessage: "", userMessage: "show me everything" },
803
+ ],
773
804
  nowText: "Now",
774
805
  messageId: "msg-1",
775
806
  config: makeConfig(),
776
807
  });
777
808
 
778
809
  expect(result.block).not.toBeNull();
779
- // CRITICAL header appears exactly once.
780
- const criticalCount = (
781
- result.block!.match(/\*\*CRITICAL:\*\* These are page summaries\./g) ?? []
810
+ // Header appears exactly once.
811
+ const headerCount = (
812
+ result.block!.match(
813
+ /Use `file_read\("memory\/concepts\/path\/to\/file\.md"\)` to read/g,
814
+ ) ?? []
782
815
  ).length;
783
- expect(criticalCount).toBe(1);
816
+ expect(headerCount).toBe(1);
784
817
  // summarized-page → short form (path + summary, no body, no frontmatter).
785
818
  expect(result.block).toContain("# memory/concepts/summarized-page.md\nA");
786
819
  expect(result.block).not.toContain("Long-form body content");
@@ -803,8 +836,9 @@ describe("injectMemoryV2Block", () => {
803
836
  database: db,
804
837
  conversationId: "conv-1",
805
838
  currentTurn: 1,
806
- userMessage: "show me the demo",
807
- assistantMessage: "",
839
+ recentTurnPairs: [
840
+ { assistantMessage: "", userMessage: "show me the demo" },
841
+ ],
808
842
  nowText: "Now",
809
843
  messageId: "msg-1",
810
844
  config: makeConfig(),
@@ -836,8 +870,9 @@ describe("injectMemoryV2Block", () => {
836
870
  database: db,
837
871
  conversationId: "conv-1",
838
872
  currentTurn: 1,
839
- userMessage: "music and editors",
840
- assistantMessage: "",
873
+ recentTurnPairs: [
874
+ { assistantMessage: "", userMessage: "music and editors" },
875
+ ],
841
876
  nowText: "Now",
842
877
  messageId: "msg-1",
843
878
  config: makeConfig(),
@@ -864,8 +899,7 @@ describe("injectMemoryV2Block", () => {
864
899
  database: db,
865
900
  conversationId: "conv-1",
866
901
  currentTurn: 1,
867
- userMessage: "carol",
868
- assistantMessage: "",
902
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "carol" }],
869
903
  nowText: "",
870
904
  messageId: "msg-1",
871
905
  config: makeConfig({ epsilon: 0.05 }),
@@ -886,8 +920,7 @@ describe("injectMemoryV2Block", () => {
886
920
  database: db,
887
921
  conversationId: "conv-1",
888
922
  currentTurn: 1,
889
- userMessage: "phantom",
890
- assistantMessage: "",
923
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "phantom" }],
891
924
  nowText: "",
892
925
  messageId: "msg-1",
893
926
  config: makeConfig(),
@@ -937,8 +970,9 @@ describe("injectMemoryV2Block", () => {
937
970
  database: db,
938
971
  conversationId: "conv-1",
939
972
  currentTurn: 1,
940
- userMessage: "Help me with examples",
941
- assistantMessage: "",
973
+ recentTurnPairs: [
974
+ { assistantMessage: "", userMessage: "Help me with examples" },
975
+ ],
942
976
  nowText: "Now",
943
977
  messageId: "msg-1",
944
978
  config: makeConfig(),
@@ -977,8 +1011,9 @@ describe("injectMemoryV2Block", () => {
977
1011
  database: db,
978
1012
  conversationId: "conv-1",
979
1013
  currentTurn: 1,
980
- userMessage: "Alice's editor",
981
- assistantMessage: "",
1014
+ recentTurnPairs: [
1015
+ { assistantMessage: "", userMessage: "Alice's editor" },
1016
+ ],
982
1017
  nowText: "Now",
983
1018
  messageId: "msg-1",
984
1019
  config: makeConfig(),
@@ -1016,8 +1051,7 @@ describe("injectMemoryV2Block", () => {
1016
1051
  database: db,
1017
1052
  conversationId: "conv-1",
1018
1053
  currentTurn: 1,
1019
- userMessage: "examples",
1020
- assistantMessage: "",
1054
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "examples" }],
1021
1055
  nowText: "Now",
1022
1056
  messageId: "msg-1",
1023
1057
  config: makeConfig(),
@@ -1034,8 +1068,9 @@ describe("injectMemoryV2Block", () => {
1034
1068
  database: db,
1035
1069
  conversationId: "conv-1",
1036
1070
  currentTurn: 2,
1037
- userMessage: "more examples",
1038
- assistantMessage: "ok",
1071
+ recentTurnPairs: [
1072
+ { assistantMessage: "ok", userMessage: "more examples" },
1073
+ ],
1039
1074
  nowText: "Now",
1040
1075
  messageId: "msg-2",
1041
1076
  config: makeConfig(),
@@ -1063,8 +1098,7 @@ describe("injectMemoryV2Block", () => {
1063
1098
  database: db,
1064
1099
  conversationId: "conv-1",
1065
1100
  currentTurn: 1,
1066
- userMessage: "anything",
1067
- assistantMessage: "",
1101
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "anything" }],
1068
1102
  nowText: "Now",
1069
1103
  messageId: "msg-1",
1070
1104
  config: makeConfig(),
@@ -1089,8 +1123,7 @@ describe("injectMemoryV2Block", () => {
1089
1123
  database: db,
1090
1124
  conversationId: "conv-1",
1091
1125
  currentTurn: 1,
1092
- userMessage: "anything",
1093
- assistantMessage: "",
1126
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "anything" }],
1094
1127
  nowText: "",
1095
1128
  messageId: "msg-1",
1096
1129
  config: makeConfig(),
@@ -1118,8 +1151,9 @@ describe("injectMemoryV2Block", () => {
1118
1151
  database: db,
1119
1152
  conversationId: "conv-1",
1120
1153
  currentTurn: 1,
1121
- userMessage: "How do I register a video?",
1122
- assistantMessage: "",
1154
+ recentTurnPairs: [
1155
+ { assistantMessage: "", userMessage: "How do I register a video?" },
1156
+ ],
1123
1157
  nowText: "Now",
1124
1158
  messageId: "msg-1",
1125
1159
  config: makeConfig(),
@@ -1160,8 +1194,7 @@ describe("injectMemoryV2Block", () => {
1160
1194
  database: db,
1161
1195
  conversationId: "conv-1",
1162
1196
  currentTurn: 1,
1163
- userMessage: "Help me",
1164
- assistantMessage: "",
1197
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "Help me" }],
1165
1198
  nowText: "Now",
1166
1199
  messageId: "msg-1",
1167
1200
  config: makeConfig(),
@@ -1191,8 +1224,7 @@ describe("injectMemoryV2Block", () => {
1191
1224
  database: db,
1192
1225
  conversationId: "conv-1",
1193
1226
  currentTurn: 1,
1194
- userMessage: "anything",
1195
- assistantMessage: "",
1227
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "anything" }],
1196
1228
  nowText: "Now",
1197
1229
  messageId: "msg-1",
1198
1230
  config: makeConfig(),
@@ -1217,8 +1249,7 @@ describe("injectMemoryV2Block", () => {
1217
1249
  database: db,
1218
1250
  conversationId: "conv-1",
1219
1251
  currentTurn: 1,
1220
- userMessage: "config",
1221
- assistantMessage: "",
1252
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "config" }],
1222
1253
  nowText: "Now",
1223
1254
  messageId: "msg-1",
1224
1255
  config: makeConfig(),
@@ -1232,8 +1263,7 @@ describe("injectMemoryV2Block", () => {
1232
1263
  database: db,
1233
1264
  conversationId: "conv-1",
1234
1265
  currentTurn: 2,
1235
- userMessage: "more config",
1236
- assistantMessage: "ok",
1266
+ recentTurnPairs: [{ assistantMessage: "ok", userMessage: "more config" }],
1237
1267
  nowText: "Now",
1238
1268
  messageId: "msg-2",
1239
1269
  config: makeConfig(),
@@ -1254,8 +1284,9 @@ describe("injectMemoryV2Block", () => {
1254
1284
  database: db,
1255
1285
  conversationId: "conv-1",
1256
1286
  currentTurn: 1,
1257
- userMessage: "Alice's editor",
1258
- assistantMessage: "",
1287
+ recentTurnPairs: [
1288
+ { assistantMessage: "", userMessage: "Alice's editor" },
1289
+ ],
1259
1290
  nowText: "Now",
1260
1291
  messageId: "msg-1",
1261
1292
  config: makeConfig(),
@@ -1270,8 +1301,9 @@ describe("injectMemoryV2Block", () => {
1270
1301
  database: db,
1271
1302
  conversationId: "conv-1",
1272
1303
  currentTurn: 2,
1273
- userMessage: "Reload context",
1274
- assistantMessage: "",
1304
+ recentTurnPairs: [
1305
+ { assistantMessage: "", userMessage: "Reload context" },
1306
+ ],
1275
1307
  nowText: "Now",
1276
1308
  messageId: "msg-2",
1277
1309
  mode: "context-load",
@@ -1306,8 +1338,7 @@ describe("injectMemoryV2Block", () => {
1306
1338
  database: db,
1307
1339
  conversationId: "conv-1",
1308
1340
  currentTurn: 1,
1309
- userMessage: "hi",
1310
- assistantMessage: "",
1341
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "hi" }],
1311
1342
  nowText: "",
1312
1343
  messageId: "msg-1",
1313
1344
  mode: "context-load",
@@ -1347,8 +1378,9 @@ describe("injectMemoryV2Block", () => {
1347
1378
  database: db,
1348
1379
  conversationId: "conv-1",
1349
1380
  currentTurn: 1,
1350
- userMessage: "Alice's editor",
1351
- assistantMessage: "",
1381
+ recentTurnPairs: [
1382
+ { assistantMessage: "", userMessage: "Alice's editor" },
1383
+ ],
1352
1384
  nowText: "Now",
1353
1385
  messageId: "msg-1",
1354
1386
  config: makeConfig(),
@@ -1366,8 +1398,7 @@ describe("injectMemoryV2Block", () => {
1366
1398
  database: db,
1367
1399
  conversationId: "conv-1",
1368
1400
  currentTurn: 2,
1369
- userMessage: "Carol's music",
1370
- assistantMessage: "",
1401
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "Carol's music" }],
1371
1402
  nowText: "Now",
1372
1403
  messageId: "msg-2",
1373
1404
  config: makeConfig(),
@@ -1429,8 +1460,9 @@ describe("injectMemoryV2Block", () => {
1429
1460
  database: db,
1430
1461
  conversationId: "conv-1",
1431
1462
  currentTurn: 1,
1432
- userMessage: "Alice's editor",
1433
- assistantMessage: "",
1463
+ recentTurnPairs: [
1464
+ { assistantMessage: "", userMessage: "Alice's editor" },
1465
+ ],
1434
1466
  nowText: "Now",
1435
1467
  messageId: "msg-1",
1436
1468
  config: makeConfig(),
@@ -1455,8 +1487,9 @@ describe("injectMemoryV2Block", () => {
1455
1487
  database: db,
1456
1488
  conversationId: "conv-1",
1457
1489
  currentTurn: 1,
1458
- userMessage: "Alice's editor",
1459
- assistantMessage: "",
1490
+ recentTurnPairs: [
1491
+ { assistantMessage: "", userMessage: "Alice's editor" },
1492
+ ],
1460
1493
  nowText: "Now",
1461
1494
  messageId: "msg-1",
1462
1495
  config: makeConfig(),
@@ -1478,8 +1511,9 @@ describe("injectMemoryV2Block", () => {
1478
1511
  database: db,
1479
1512
  conversationId: "conv-1",
1480
1513
  currentTurn: 2,
1481
- userMessage: "Reload context",
1482
- assistantMessage: "",
1514
+ recentTurnPairs: [
1515
+ { assistantMessage: "", userMessage: "Reload context" },
1516
+ ],
1483
1517
  nowText: "Now",
1484
1518
  messageId: "msg-2",
1485
1519
  mode: "context-load",
@@ -1518,8 +1552,12 @@ describe("injectMemoryV2Block", () => {
1518
1552
  database: db,
1519
1553
  conversationId: "conv-1",
1520
1554
  currentTurn: 1,
1521
- userMessage: "Alice's editor and Bob's coffee",
1522
- assistantMessage: "",
1555
+ recentTurnPairs: [
1556
+ {
1557
+ assistantMessage: "",
1558
+ userMessage: "Alice's editor and Bob's coffee",
1559
+ },
1560
+ ],
1523
1561
  nowText: "Now",
1524
1562
  messageId: "msg-1",
1525
1563
  config: makeConfig(),
@@ -1536,8 +1574,9 @@ describe("injectMemoryV2Block", () => {
1536
1574
  database: db,
1537
1575
  conversationId: "conv-1",
1538
1576
  currentTurn: 2,
1539
- userMessage: "Reload context",
1540
- assistantMessage: "",
1577
+ recentTurnPairs: [
1578
+ { assistantMessage: "", userMessage: "Reload context" },
1579
+ ],
1541
1580
  nowText: "Now",
1542
1581
  messageId: "msg-2",
1543
1582
  mode: "context-load",
@@ -1566,8 +1605,9 @@ describe("injectMemoryV2Block", () => {
1566
1605
  database: db,
1567
1606
  conversationId: "conv-1",
1568
1607
  currentTurn: 1,
1569
- userMessage: "Alice's editor",
1570
- assistantMessage: "",
1608
+ recentTurnPairs: [
1609
+ { assistantMessage: "", userMessage: "Alice's editor" },
1610
+ ],
1571
1611
  nowText: "Now",
1572
1612
  messageId: "msg-1",
1573
1613
  config: makeConfig(),
@@ -1609,8 +1649,9 @@ describe("injectMemoryV2Block", () => {
1609
1649
  database: db,
1610
1650
  conversationId: "conv-1",
1611
1651
  currentTurn: 1,
1612
- userMessage: "music and editors",
1613
- assistantMessage: "",
1652
+ recentTurnPairs: [
1653
+ { assistantMessage: "", userMessage: "music and editors" },
1654
+ ],
1614
1655
  nowText: "Now",
1615
1656
  messageId: "msg-1",
1616
1657
  config: makeConfig(),
@@ -1665,8 +1706,9 @@ describe("injectMemoryV2Block", () => {
1665
1706
  database: db,
1666
1707
  conversationId: "conv-1",
1667
1708
  currentTurn: 1,
1668
- userMessage: "Alice's editor",
1669
- assistantMessage: "",
1709
+ recentTurnPairs: [
1710
+ { assistantMessage: "", userMessage: "Alice's editor" },
1711
+ ],
1670
1712
  nowText: "Now",
1671
1713
  messageId: "msg-1",
1672
1714
  config: makeConfig(),
@@ -1711,8 +1753,9 @@ describe("injectMemoryV2Block", () => {
1711
1753
  database: db,
1712
1754
  conversationId: "conv-finalize",
1713
1755
  currentTurn: 7,
1714
- userMessage: "Alice's editor",
1715
- assistantMessage: "",
1756
+ recentTurnPairs: [
1757
+ { assistantMessage: "", userMessage: "Alice's editor" },
1758
+ ],
1716
1759
  nowText: "Now",
1717
1760
  messageId: "msg-finalize",
1718
1761
  config: makeConfig(),
@@ -1784,8 +1827,9 @@ describe("injectMemoryV2Block", () => {
1784
1827
  database: db,
1785
1828
  conversationId: "conv-router-1",
1786
1829
  currentTurn: 1,
1787
- userMessage: "Tell me about Alice",
1788
- assistantMessage: "",
1830
+ recentTurnPairs: [
1831
+ { assistantMessage: "", userMessage: "Tell me about Alice" },
1832
+ ],
1789
1833
  nowText: "Now",
1790
1834
  messageId: "msg-1",
1791
1835
  config: makeConfig({ router: { enabled: true } }),
@@ -1820,7 +1864,9 @@ describe("injectMemoryV2Block", () => {
1820
1864
  expect(row.mode).toBe("router");
1821
1865
  const aliceRow = row.concepts.find((c) => c.slug === "alice-vscode");
1822
1866
  expect(aliceRow).toBeDefined();
1823
- expect(aliceRow!.source).toBe("router");
1867
+ // Default-stub provenance is `tier3:0` (single-batch path); see the
1868
+ // runRouter mock for the synthesis rule.
1869
+ expect(aliceRow!.source).toBe("tier3:0");
1824
1870
  expect(aliceRow!.status).toBe("injected");
1825
1871
  expect(aliceRow!.finalActivation).toBe(0);
1826
1872
  expect(aliceRow!.ownActivation).toBe(0);
@@ -1836,8 +1882,7 @@ describe("injectMemoryV2Block", () => {
1836
1882
  database: db,
1837
1883
  conversationId: "conv-router-fail",
1838
1884
  currentTurn: 3,
1839
- userMessage: "anything",
1840
- assistantMessage: "ok",
1885
+ recentTurnPairs: [{ assistantMessage: "ok", userMessage: "anything" }],
1841
1886
  nowText: "Now",
1842
1887
  messageId: "msg-fail",
1843
1888
  config: makeConfig({ router: { enabled: true } }),
@@ -1892,8 +1937,9 @@ describe("injectMemoryV2Block", () => {
1892
1937
  database: db,
1893
1938
  conversationId: "conv-router-fail-save-throws",
1894
1939
  currentTurn: 5,
1895
- userMessage: "anything",
1896
- assistantMessage: "ok",
1940
+ recentTurnPairs: [
1941
+ { assistantMessage: "ok", userMessage: "anything" },
1942
+ ],
1897
1943
  nowText: "Now",
1898
1944
  messageId: "msg-fail-save",
1899
1945
  config: makeConfig({ router: { enabled: true } }),
@@ -1928,8 +1974,7 @@ describe("injectMemoryV2Block", () => {
1928
1974
  database: db,
1929
1975
  conversationId: "conv-router-abstain",
1930
1976
  currentTurn: 1,
1931
- userMessage: "small talk",
1932
- assistantMessage: "",
1977
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "small talk" }],
1933
1978
  nowText: "Now",
1934
1979
  messageId: "msg-abstain",
1935
1980
  config: makeConfig({ router: { enabled: true } }),
@@ -1967,8 +2012,7 @@ describe("injectMemoryV2Block", () => {
1967
2012
  database: db,
1968
2013
  conversationId: "conv-router-missing",
1969
2014
  currentTurn: 1,
1970
- userMessage: "phantom",
1971
- assistantMessage: "",
2015
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "phantom" }],
1972
2016
  nowText: "Now",
1973
2017
  messageId: "msg-missing",
1974
2018
  config: makeConfig({ router: { enabled: true } }),
@@ -2002,7 +2046,7 @@ describe("injectMemoryV2Block", () => {
2002
2046
  );
2003
2047
  expect(phantom).toBeDefined();
2004
2048
  expect(phantom!.status).toBe("page_missing");
2005
- expect(phantom!.source).toBe("router");
2049
+ expect(phantom!.source).toBe("tier3:0");
2006
2050
  });
2007
2051
 
2008
2052
  test("flag-on: router re-picking a prior-everInjected slug does NOT re-render it; non-overlapping picks render and append to everInjected", async () => {
@@ -2015,8 +2059,9 @@ describe("injectMemoryV2Block", () => {
2015
2059
  database: db,
2016
2060
  conversationId: "conv-router-dedup",
2017
2061
  currentTurn: 1,
2018
- userMessage: "Tell me about Alice",
2019
- assistantMessage: "",
2062
+ recentTurnPairs: [
2063
+ { assistantMessage: "", userMessage: "Tell me about Alice" },
2064
+ ],
2020
2065
  nowText: "Now",
2021
2066
  messageId: "msg-1",
2022
2067
  config: makeConfig({ router: { enabled: true } }),
@@ -2036,8 +2081,9 @@ describe("injectMemoryV2Block", () => {
2036
2081
  database: db,
2037
2082
  conversationId: "conv-router-dedup",
2038
2083
  currentTurn: 2,
2039
- userMessage: "And Bob?",
2040
- assistantMessage: "Sure",
2084
+ recentTurnPairs: [
2085
+ { assistantMessage: "Sure", userMessage: "And Bob?" },
2086
+ ],
2041
2087
  nowText: "Now",
2042
2088
  messageId: "msg-2",
2043
2089
  config: makeConfig({ router: { enabled: true } }),
@@ -2069,8 +2115,7 @@ describe("injectMemoryV2Block", () => {
2069
2115
  database: db,
2070
2116
  conversationId: "conv-router-source",
2071
2117
  currentTurn: 1,
2072
- userMessage: "Alice",
2073
- assistantMessage: "",
2118
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "Alice" }],
2074
2119
  nowText: "Now",
2075
2120
  messageId: "msg-1",
2076
2121
  config: makeConfig({ router: { enabled: true } }),
@@ -2088,8 +2133,7 @@ describe("injectMemoryV2Block", () => {
2088
2133
  database: db,
2089
2134
  conversationId: "conv-router-source",
2090
2135
  currentTurn: 2,
2091
- userMessage: "Bob",
2092
- assistantMessage: "",
2136
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "Bob" }],
2093
2137
  nowText: "Now",
2094
2138
  messageId: "msg-2",
2095
2139
  config: makeConfig({ router: { enabled: true } }),
@@ -2107,7 +2151,7 @@ describe("injectMemoryV2Block", () => {
2107
2151
  expect(bobRow).toBeDefined();
2108
2152
  expect(aliceRow!.source).toBe("carry_over");
2109
2153
  expect(aliceRow!.status).toBe("in_context");
2110
- expect(bobRow!.source).toBe("router");
2154
+ expect(bobRow!.source).toBe("tier3:0");
2111
2155
  expect(bobRow!.status).toBe("injected");
2112
2156
  });
2113
2157
 
@@ -2125,8 +2169,9 @@ describe("injectMemoryV2Block", () => {
2125
2169
  database: db,
2126
2170
  conversationId: "conv-flag-off",
2127
2171
  currentTurn: 1,
2128
- userMessage: "Alice's editor",
2129
- assistantMessage: "",
2172
+ recentTurnPairs: [
2173
+ { assistantMessage: "", userMessage: "Alice's editor" },
2174
+ ],
2130
2175
  nowText: "Now",
2131
2176
  messageId: "msg-1",
2132
2177
  config: makeConfig({ router: { enabled: false } }),
@@ -2161,8 +2206,9 @@ describe("injectMemoryV2Block", () => {
2161
2206
  database: db,
2162
2207
  conversationId: "conv-context-load-router-on",
2163
2208
  currentTurn: 1,
2164
- userMessage: "Tell me about Alice",
2165
- assistantMessage: "",
2209
+ recentTurnPairs: [
2210
+ { assistantMessage: "", userMessage: "Tell me about Alice" },
2211
+ ],
2166
2212
  nowText: "Now",
2167
2213
  messageId: "msg-1",
2168
2214
  mode: "context-load",