@vellumai/assistant 0.8.4 → 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 (438) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/docs/browser-use-architecture-phase2.md +1 -1
  3. package/knip.json +2 -1
  4. package/openapi.yaml +809 -11
  5. package/package.json +1 -1
  6. package/src/__tests__/anthropic-provider.test.ts +34 -37
  7. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  8. package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
  9. package/src/__tests__/audit-log-rotation.test.ts +70 -16
  10. package/src/__tests__/background-workers-disk-pressure.test.ts +3 -3
  11. package/src/__tests__/btw-routes.test.ts +2 -3
  12. package/src/__tests__/call-controller.test.ts +0 -1
  13. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  14. package/src/__tests__/channel-guardian.test.ts +3 -3
  15. package/src/__tests__/checker.test.ts +6 -15
  16. package/src/__tests__/compaction-events.test.ts +1 -0
  17. package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
  18. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
  19. package/src/__tests__/computer-use-tools.test.ts +2 -4
  20. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  21. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
  22. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
  23. package/src/__tests__/conversation-agent-loop-overflow.test.ts +197 -2
  24. package/src/__tests__/conversation-agent-loop.test.ts +163 -122
  25. package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
  26. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  27. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  28. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  29. package/src/__tests__/conversation-error.test.ts +31 -0
  30. package/src/__tests__/conversation-fork-crud.test.ts +178 -15
  31. package/src/__tests__/conversation-lifecycle.test.ts +52 -11
  32. package/src/__tests__/{conversation-load-cleaned-at.test.ts → conversation-load-history-stripped.test.ts} +13 -13
  33. package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -0
  34. package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
  35. package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
  36. package/src/__tests__/conversation-skill-tools.test.ts +2 -5
  37. package/src/__tests__/conversation-store.test.ts +1 -1
  38. package/src/__tests__/conversation-sync-tags.test.ts +99 -32
  39. package/src/__tests__/conversation-workspace-cache-state.test.ts +1 -0
  40. package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
  41. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  42. package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
  43. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  44. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  45. package/src/__tests__/credential-vault-unit.test.ts +2 -2
  46. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  47. package/src/__tests__/email-html-renderer.test.ts +12 -0
  48. package/src/__tests__/gateway-flag-listener.test.ts +237 -0
  49. package/src/__tests__/gemini-provider.test.ts +78 -0
  50. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  51. package/src/__tests__/guardian-outbound-http.test.ts +7 -5
  52. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  53. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  54. package/src/__tests__/heartbeat-service.test.ts +4 -0
  55. package/src/__tests__/host-shell-tool.test.ts +1 -1
  56. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  57. package/src/__tests__/list-messages-tool-merge.test.ts +70 -11
  58. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  59. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  60. package/src/__tests__/llm-resolver.test.ts +77 -9
  61. package/src/__tests__/llm-usage-store.test.ts +66 -0
  62. package/src/__tests__/logger.test.ts +89 -0
  63. package/src/__tests__/mcp-abort-signal.test.ts +2 -2
  64. package/src/__tests__/media-generate-image.test.ts +31 -0
  65. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  66. package/src/__tests__/model-intents.test.ts +2 -4
  67. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  68. package/src/__tests__/onboarding-template-contract.test.ts +1 -1
  69. package/src/__tests__/openai-provider.test.ts +46 -0
  70. package/src/__tests__/openai-responses-provider.test.ts +114 -12
  71. package/src/__tests__/pending-interactions-resolved-event.test.ts +0 -1
  72. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  73. package/src/__tests__/platform.test.ts +2 -2
  74. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  75. package/src/__tests__/plugin-bootstrap.test.ts +2 -2
  76. package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
  77. package/src/__tests__/plugin-types.test.ts +3 -2
  78. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  79. package/src/__tests__/pricing.test.ts +12 -0
  80. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  81. package/src/__tests__/registry.test.ts +2 -8
  82. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  83. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  84. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  85. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  86. package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
  87. package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
  88. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  89. package/src/__tests__/subagent-notify-parent.test.ts +1 -1
  90. package/src/__tests__/suggestion-routes.test.ts +1 -0
  91. package/src/__tests__/sync-message-contract.test.ts +59 -0
  92. package/src/__tests__/system-prompt.test.ts +145 -131
  93. package/src/__tests__/terminal-tools.test.ts +1 -1
  94. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  95. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  96. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  97. package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
  98. package/src/__tests__/tool-executor.test.ts +9 -62
  99. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  100. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  101. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  102. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  103. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  104. package/src/__tests__/usage-routes.test.ts +3 -0
  105. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  106. package/src/__tests__/workspace-git-service.test.ts +6 -5
  107. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  108. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  109. package/src/acp/prepare-agent-env.ts +78 -0
  110. package/src/acp/session-manager.ts +1 -1
  111. package/src/agent/loop.ts +8 -0
  112. package/src/api/README.md +5 -0
  113. package/src/api/index.ts +4 -0
  114. package/src/api/package.json +10 -0
  115. package/src/background-wake/background-wake-routes.test.ts +233 -0
  116. package/src/background-wake/runtime-registry.ts +24 -0
  117. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  118. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  119. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  120. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  121. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  122. package/src/cli/commands/__tests__/memory-v2.test.ts +1 -0
  123. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  124. package/src/cli/commands/browser.ts +247 -0
  125. package/src/cli/commands/domain.ts +91 -41
  126. package/src/cli/commands/inference.ts +93 -40
  127. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  128. package/src/cli/commands/memory-v2.ts +176 -1
  129. package/src/cli/commands/memory-v3-render.ts +344 -0
  130. package/src/cli/commands/memory-v3.ts +316 -0
  131. package/src/cli/program.ts +2 -0
  132. package/src/config/assistant-feature-flags.ts +21 -9
  133. package/src/config/bundled-skills/document-editor/SKILL.md +11 -2
  134. package/src/config/bundled-skills/document-editor/TOOLS.json +18 -0
  135. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  136. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  137. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  138. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  139. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  140. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  141. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  142. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  143. package/src/config/bundled-tool-registry.ts +2 -0
  144. package/src/config/call-site-defaults.ts +7 -6
  145. package/src/config/feature-flag-registry.json +16 -0
  146. package/src/config/schemas/__tests__/memory-v2.test.ts +213 -1
  147. package/src/config/schemas/call-site-catalog.ts +21 -7
  148. package/src/config/schemas/llm.ts +12 -1
  149. package/src/config/schemas/memory-v2.ts +246 -0
  150. package/src/config/schemas/memory.ts +2 -1
  151. package/src/context/compactor.ts +52 -0
  152. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  153. package/src/conversations/message-consolidation.ts +404 -0
  154. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
  155. package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
  156. package/src/daemon/conversation-agent-loop-handlers.ts +2 -13
  157. package/src/daemon/conversation-agent-loop.ts +126 -76
  158. package/src/daemon/conversation-error.ts +31 -1
  159. package/src/daemon/conversation-lifecycle.ts +27 -22
  160. package/src/daemon/conversation-runtime-assembly.ts +10 -9
  161. package/src/daemon/conversation-tool-setup.ts +63 -3
  162. package/src/daemon/conversation-usage.ts +2 -0
  163. package/src/daemon/conversation.ts +14 -29
  164. package/src/daemon/disk-pressure-guard.ts +14 -2
  165. package/src/daemon/handlers/config-model.test.ts +1 -0
  166. package/src/daemon/handlers/conversations.ts +11 -3
  167. package/src/daemon/host-browser-proxy.ts +5 -5
  168. package/src/daemon/host-cu-proxy.ts +4 -4
  169. package/src/daemon/host-file-proxy.ts +4 -4
  170. package/src/daemon/host-proxy-base.ts +4 -4
  171. package/src/daemon/host-transfer-proxy.ts +10 -10
  172. package/src/daemon/lifecycle.ts +23 -20
  173. package/src/daemon/meet-manifest-loader.ts +1 -7
  174. package/src/daemon/message-types/conversations.ts +6 -9
  175. package/src/daemon/message-types/home.ts +1 -13
  176. package/src/daemon/message-types/messages.ts +6 -14
  177. package/src/daemon/message-types/sync.ts +14 -0
  178. package/src/daemon/shutdown-handlers.ts +24 -5
  179. package/src/daemon/switch-inference-profile-tool.ts +52 -0
  180. package/src/daemon/tool-setup-types.ts +13 -0
  181. package/src/events/relationship-state-updated.ts +25 -0
  182. package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -1
  183. package/src/home/home-greeting.ts +0 -9
  184. package/src/home/suggested-prompts.ts +0 -9
  185. package/src/ipc/gateway-flag-listener.ts +123 -0
  186. package/src/ipc/skill-routes/registries.ts +8 -12
  187. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  188. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  189. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
  190. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  191. package/src/memory/__tests__/memory-retrospective-job.test.ts +7 -0
  192. package/src/memory/auto-analysis-enqueue.ts +5 -1
  193. package/src/memory/conversation-crud.ts +71 -70
  194. package/src/memory/conversation-starters-cadence.ts +3 -1
  195. package/src/memory/conversation-title-service.ts +19 -3
  196. package/src/memory/db-async-query.ts +214 -0
  197. package/src/memory/db-init.ts +10 -0
  198. package/src/memory/db-maintenance.ts +30 -21
  199. package/src/memory/graph/bootstrap.ts +8 -1
  200. package/src/memory/graph/capability-seed.ts +7 -3
  201. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  202. package/src/memory/graph/extraction.ts +1 -5
  203. package/src/memory/graph/graph-search.ts +7 -1
  204. package/src/memory/indexer.ts +28 -18
  205. package/src/memory/job-handlers/cleanup.ts +76 -18
  206. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  207. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  208. package/src/memory/jobs-store.ts +14 -0
  209. package/src/memory/jobs-worker.ts +55 -22
  210. package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
  211. package/src/memory/llm-request-log-source-local.ts +7 -0
  212. package/src/memory/llm-request-log-source.ts +9 -2
  213. package/src/memory/llm-request-log-store.ts +43 -1
  214. package/src/memory/llm-usage-store.ts +24 -0
  215. package/src/memory/memory-retrospective-enqueue.ts +8 -1
  216. package/src/memory/memory-retrospective-job.ts +5 -0
  217. package/src/memory/memory-v2-activation-log-store.ts +15 -6
  218. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  219. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  220. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  221. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  222. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  223. package/src/memory/migrations/index.ts +17 -0
  224. package/src/memory/migrations/registry.ts +33 -0
  225. package/src/memory/schema/conversations.ts +1 -1
  226. package/src/memory/schema/infrastructure.ts +21 -0
  227. package/src/memory/tool-usage-store.ts +36 -8
  228. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  229. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  230. package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
  231. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  232. package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
  233. package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
  234. package/src/memory/v2/__tests__/injection.test.ts +127 -98
  235. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  236. package/src/memory/v2/__tests__/router.test.ts +171 -3
  237. package/src/memory/v2/harness/compare.ts +57 -0
  238. package/src/memory/v2/harness/metrics.ts +124 -0
  239. package/src/memory/v2/harness/oracle.ts +145 -0
  240. package/src/memory/v2/harness/replay-input.ts +224 -0
  241. package/src/memory/v2/harness/retriever.ts +74 -0
  242. package/src/memory/v2/harness/router-retriever.ts +43 -0
  243. package/src/memory/v2/harness/runner.ts +106 -0
  244. package/src/memory/v2/harness/trace.ts +58 -0
  245. package/src/memory/v2/injection.ts +21 -15
  246. package/src/memory/v2/prompts/router.ts +26 -1
  247. package/src/memory/v2/qdrant.ts +14 -2
  248. package/src/memory/v2/router.ts +171 -18
  249. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  250. package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
  251. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  252. package/src/memory/v3/__tests__/edges.test.ts +563 -0
  253. package/src/memory/v3/__tests__/filter.test.ts +512 -0
  254. package/src/memory/v3/__tests__/gate.test.ts +574 -0
  255. package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
  256. package/src/memory/v3/__tests__/loop.test.ts +530 -0
  257. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  258. package/src/memory/v3/__tests__/scouts.test.ts +440 -0
  259. package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
  260. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  261. package/src/memory/v3/__tests__/traversal.test.ts +469 -0
  262. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  263. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  264. package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
  265. package/src/memory/v3/__tests__/validate.test.ts +245 -0
  266. package/src/memory/v3/auto-edges.ts +223 -0
  267. package/src/memory/v3/coactivation-store.ts +124 -0
  268. package/src/memory/v3/consolidation-job.ts +323 -0
  269. package/src/memory/v3/edge-learning-job.ts +160 -0
  270. package/src/memory/v3/edges.ts +249 -0
  271. package/src/memory/v3/filter.ts +281 -0
  272. package/src/memory/v3/gate.ts +334 -0
  273. package/src/memory/v3/index-composition.ts +113 -0
  274. package/src/memory/v3/llm-capture.ts +46 -0
  275. package/src/memory/v3/loop.ts +382 -0
  276. package/src/memory/v3/maintenance.ts +144 -0
  277. package/src/memory/v3/prompt-context.ts +33 -0
  278. package/src/memory/v3/prompts/consolidation.ts +458 -0
  279. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  280. package/src/memory/v3/retriever.ts +33 -0
  281. package/src/memory/v3/scouts.ts +420 -0
  282. package/src/memory/v3/shadow-middleware.ts +305 -0
  283. package/src/memory/v3/traversal.ts +206 -0
  284. package/src/memory/v3/tree-index.ts +237 -0
  285. package/src/memory/v3/tree-store.ts +394 -0
  286. package/src/memory/v3/tree-walk.ts +351 -0
  287. package/src/memory/v3/types.ts +65 -0
  288. package/src/memory/v3/validate.ts +300 -0
  289. package/src/notifications/adapters/macos.ts +18 -1
  290. package/src/notifications/adapters/platform.ts +1 -1
  291. package/src/notifications/decision-engine.ts +1 -4
  292. package/src/notifications/emit-signal.ts +29 -49
  293. package/src/permissions/prompter.ts +3 -3
  294. package/src/permissions/question-prompter.ts +5 -2
  295. package/src/permissions/secret-prompter.ts +2 -2
  296. package/src/plugin-api/index.ts +4 -0
  297. package/src/plugin-api/types.ts +7 -33
  298. package/src/plugins/defaults/index.ts +6 -0
  299. package/src/plugins/defaults/injectors.ts +18 -11
  300. package/src/plugins/external-plugin-loader.ts +5 -68
  301. package/src/plugins/types.ts +11 -16
  302. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  303. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  304. package/src/prompts/persona-resolver.ts +36 -21
  305. package/src/prompts/sections.ts +39 -7
  306. package/src/prompts/system-prompt.ts +50 -185
  307. package/src/prompts/templates/BOOTSTRAP.md +2 -2
  308. package/src/prompts/templates/system-sections.ts +230 -8
  309. package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
  310. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  311. package/src/providers/anthropic/client.ts +32 -66
  312. package/src/providers/call-site-routing.ts +14 -2
  313. package/src/providers/connection-model-compat.ts +38 -0
  314. package/src/providers/connection-resolution.ts +16 -2
  315. package/src/providers/gemini/client.ts +49 -6
  316. package/src/providers/inference/adapter-factory.ts +3 -0
  317. package/src/providers/minimax/client.ts +106 -0
  318. package/src/providers/model-catalog.ts +43 -0
  319. package/src/providers/model-intents.ts +1 -1
  320. package/src/providers/openai/chat-completions-provider.ts +6 -3
  321. package/src/providers/openai/codex-models.ts +18 -0
  322. package/src/providers/openai/responses-provider.ts +78 -21
  323. package/src/providers/provider-send-message.ts +7 -1
  324. package/src/providers/retry.ts +34 -3
  325. package/src/providers/thinking-config.ts +26 -1
  326. package/src/providers/usage-tracking.ts +2 -0
  327. package/src/runtime/AGENTS.md +2 -2
  328. package/src/runtime/agent-wake.ts +1 -0
  329. package/src/runtime/assistant-event-hub.ts +76 -6
  330. package/src/runtime/auth/route-policy.ts +36 -0
  331. package/src/runtime/btw-sidechain.ts +0 -6
  332. package/src/runtime/http-types.ts +0 -2
  333. package/src/runtime/migrations/vbundle-builder.ts +10 -3
  334. package/src/runtime/pending-interactions.ts +0 -1
  335. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +106 -0
  336. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +25 -6
  337. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  338. package/src/runtime/routes/acp-routes.test.ts +255 -6
  339. package/src/runtime/routes/acp-routes.ts +8 -1
  340. package/src/runtime/routes/avatar-routes.ts +10 -10
  341. package/src/runtime/routes/background-wake-routes.ts +188 -0
  342. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  343. package/src/runtime/routes/btw-routes.ts +0 -6
  344. package/src/runtime/routes/conversation-cli-routes.ts +1 -1
  345. package/src/runtime/routes/conversation-list-routes.ts +12 -4
  346. package/src/runtime/routes/conversation-management-routes.ts +77 -20
  347. package/src/runtime/routes/conversation-query-routes.ts +142 -36
  348. package/src/runtime/routes/conversation-routes.ts +252 -410
  349. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  350. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  351. package/src/runtime/routes/domain-routes.ts +60 -10
  352. package/src/runtime/routes/email-routes.ts +5 -2
  353. package/src/runtime/routes/events-routes.ts +54 -10
  354. package/src/runtime/routes/group-routes.ts +24 -8
  355. package/src/runtime/routes/host-browser-routes.ts +10 -2
  356. package/src/runtime/routes/host-cu-routes.ts +2 -2
  357. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  358. package/src/runtime/routes/index.ts +8 -0
  359. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  360. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  361. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  362. package/src/runtime/routes/memory-item-routes.ts +8 -3
  363. package/src/runtime/routes/memory-v2-routes.ts +215 -5
  364. package/src/runtime/routes/memory-v3-routes.ts +316 -0
  365. package/src/runtime/routes/migration-routes.ts +21 -24
  366. package/src/runtime/routes/plugins-routes.ts +337 -0
  367. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  368. package/src/runtime/routes/secret-routes.ts +25 -5
  369. package/src/runtime/routes/settings-routes.ts +12 -11
  370. package/src/runtime/routes/slack-channel-routes.ts +5 -4
  371. package/src/runtime/routes/workspace-routes.ts +25 -10
  372. package/src/runtime/sync/resource-sync-events.ts +106 -38
  373. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  374. package/src/runtime/sync/sync-publisher.ts +2 -1
  375. package/src/runtime/verification-outbound-actions.ts +73 -1
  376. package/src/telemetry/types.ts +12 -0
  377. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  378. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  379. package/src/tools/acp/spawn.test.ts +119 -0
  380. package/src/tools/acp/spawn.ts +15 -2
  381. package/src/tools/apps/definitions.ts +2 -8
  382. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  383. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  384. package/src/tools/browser/__tests__/pinned-tabs.test.ts +70 -0
  385. package/src/tools/browser/browser-execution.ts +16 -3
  386. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  387. package/src/tools/browser/cdp-client/__tests__/types.test.ts +3 -0
  388. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +12 -0
  389. package/src/tools/browser/cdp-client/extension-cdp-client.ts +27 -1
  390. package/src/tools/browser/cdp-client/factory.ts +100 -17
  391. package/src/tools/browser/cdp-client/local-cdp-client.ts +12 -0
  392. package/src/tools/browser/cdp-client/types.ts +65 -0
  393. package/src/tools/browser/pinned-tabs.ts +96 -40
  394. package/src/tools/computer-use/definitions.ts +22 -78
  395. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  396. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  397. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  398. package/src/tools/credentials/vault.ts +3 -9
  399. package/src/tools/document/document-tool.ts +59 -0
  400. package/src/tools/execution-target.ts +21 -23
  401. package/src/tools/executor.ts +6 -1
  402. package/src/tools/filesystem/edit.ts +3 -9
  403. package/src/tools/filesystem/list.ts +3 -9
  404. package/src/tools/filesystem/read.ts +3 -9
  405. package/src/tools/filesystem/write.ts +3 -9
  406. package/src/tools/host-filesystem/edit.ts +3 -9
  407. package/src/tools/host-filesystem/read.ts +3 -9
  408. package/src/tools/host-filesystem/transfer.ts +3 -9
  409. package/src/tools/host-filesystem/write.ts +3 -9
  410. package/src/tools/host-terminal/host-shell.ts +3 -9
  411. package/src/tools/mcp/mcp-tool-factory.ts +1 -8
  412. package/src/tools/memory/register.test.ts +1 -1
  413. package/src/tools/memory/register.ts +4 -9
  414. package/src/tools/network/web-fetch.ts +3 -9
  415. package/src/tools/network/web-search.ts +25 -32
  416. package/src/tools/registry.ts +7 -23
  417. package/src/tools/schema-transforms.ts +1 -1
  418. package/src/tools/skills/execute.ts +3 -9
  419. package/src/tools/skills/load.ts +3 -9
  420. package/src/tools/skills/skill-tool-factory.ts +1 -8
  421. package/src/tools/subagent/notify-parent.ts +3 -9
  422. package/src/tools/system/request-permission.ts +3 -9
  423. package/src/tools/terminal/shell.ts +3 -9
  424. package/src/tools/tool-defaults.ts +94 -0
  425. package/src/tools/types.ts +27 -98
  426. package/src/tools/ui-surface/definitions.ts +6 -22
  427. package/src/usage/pricing.ts +23 -0
  428. package/src/usage/types.ts +12 -0
  429. package/src/util/logger.ts +16 -7
  430. package/src/util/platform.ts +7 -2
  431. package/src/util/sqlite3-runtime.ts +65 -0
  432. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  433. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  434. package/src/workspace/migrations/registry.ts +2 -0
  435. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  436. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  437. package/src/daemon/query-complexity-router.ts +0 -75
  438. package/src/prompts/cache-boundary.ts +0 -8
@@ -577,8 +577,9 @@ describe("injectMemoryV2Block", () => {
577
577
  database: db,
578
578
  conversationId: "conv-1",
579
579
  currentTurn: 1,
580
- userMessage: "Tell me about Alice's editor",
581
- assistantMessage: "",
580
+ recentTurnPairs: [
581
+ { assistantMessage: "", userMessage: "Tell me about Alice's editor" },
582
+ ],
582
583
  nowText: "Spring afternoon",
583
584
  messageId: "msg-1",
584
585
  config: makeConfig(),
@@ -613,8 +614,9 @@ describe("injectMemoryV2Block", () => {
613
614
  database: db,
614
615
  conversationId: "conv-1",
615
616
  currentTurn: 1,
616
- userMessage: "Alice's editor",
617
- assistantMessage: "",
617
+ recentTurnPairs: [
618
+ { assistantMessage: "", userMessage: "Alice's editor" },
619
+ ],
618
620
  nowText: "Now",
619
621
  messageId: "msg-1",
620
622
  config: makeConfig(),
@@ -627,8 +629,12 @@ describe("injectMemoryV2Block", () => {
627
629
  database: db,
628
630
  conversationId: "conv-1",
629
631
  currentTurn: 2,
630
- userMessage: "And what about VS Code?",
631
- assistantMessage: "Alice loves it.",
632
+ recentTurnPairs: [
633
+ {
634
+ assistantMessage: "Alice loves it.",
635
+ userMessage: "And what about VS Code?",
636
+ },
637
+ ],
632
638
  nowText: "Now",
633
639
  messageId: "msg-2",
634
640
  config: makeConfig(),
@@ -654,8 +660,9 @@ describe("injectMemoryV2Block", () => {
654
660
  database: db,
655
661
  conversationId: "conv-1",
656
662
  currentTurn: 1,
657
- userMessage: "Editor preferences",
658
- assistantMessage: "",
663
+ recentTurnPairs: [
664
+ { assistantMessage: "", userMessage: "Editor preferences" },
665
+ ],
659
666
  nowText: "Now",
660
667
  messageId: "msg-1",
661
668
  config: makeConfig(),
@@ -672,8 +679,12 @@ describe("injectMemoryV2Block", () => {
672
679
  database: db,
673
680
  conversationId: "conv-1",
674
681
  currentTurn: 2,
675
- userMessage: "Tell me about Carol's music taste",
676
- assistantMessage: "",
682
+ recentTurnPairs: [
683
+ {
684
+ assistantMessage: "",
685
+ userMessage: "Tell me about Carol's music taste",
686
+ },
687
+ ],
677
688
  nowText: "Now",
678
689
  messageId: "msg-2",
679
690
  config: makeConfig(),
@@ -699,8 +710,9 @@ describe("injectMemoryV2Block", () => {
699
710
  database: db,
700
711
  conversationId: "conv-1",
701
712
  currentTurn: 1,
702
- userMessage: "Alice's editor",
703
- assistantMessage: "",
713
+ recentTurnPairs: [
714
+ { assistantMessage: "", userMessage: "Alice's editor" },
715
+ ],
704
716
  nowText: "Now",
705
717
  messageId: "msg-1",
706
718
  config: makeConfig(),
@@ -720,8 +732,9 @@ describe("injectMemoryV2Block", () => {
720
732
  database: db,
721
733
  conversationId: "conv-1",
722
734
  currentTurn: 2,
723
- userMessage: "Alice's editor again",
724
- assistantMessage: "",
735
+ recentTurnPairs: [
736
+ { assistantMessage: "", userMessage: "Alice's editor again" },
737
+ ],
725
738
  nowText: "Now",
726
739
  messageId: "msg-2",
727
740
  config: makeConfig(),
@@ -747,8 +760,12 @@ describe("injectMemoryV2Block", () => {
747
760
  database: db,
748
761
  conversationId: "conv-1",
749
762
  currentTurn: 1,
750
- userMessage: "tell me about the summarized page",
751
- assistantMessage: "",
763
+ recentTurnPairs: [
764
+ {
765
+ assistantMessage: "",
766
+ userMessage: "tell me about the summarized page",
767
+ },
768
+ ],
752
769
  nowText: "Now",
753
770
  messageId: "msg-1",
754
771
  config: makeConfig(),
@@ -781,8 +798,9 @@ describe("injectMemoryV2Block", () => {
781
798
  database: db,
782
799
  conversationId: "conv-1",
783
800
  currentTurn: 1,
784
- userMessage: "show me everything",
785
- assistantMessage: "",
801
+ recentTurnPairs: [
802
+ { assistantMessage: "", userMessage: "show me everything" },
803
+ ],
786
804
  nowText: "Now",
787
805
  messageId: "msg-1",
788
806
  config: makeConfig(),
@@ -818,8 +836,9 @@ describe("injectMemoryV2Block", () => {
818
836
  database: db,
819
837
  conversationId: "conv-1",
820
838
  currentTurn: 1,
821
- userMessage: "show me the demo",
822
- assistantMessage: "",
839
+ recentTurnPairs: [
840
+ { assistantMessage: "", userMessage: "show me the demo" },
841
+ ],
823
842
  nowText: "Now",
824
843
  messageId: "msg-1",
825
844
  config: makeConfig(),
@@ -851,8 +870,9 @@ describe("injectMemoryV2Block", () => {
851
870
  database: db,
852
871
  conversationId: "conv-1",
853
872
  currentTurn: 1,
854
- userMessage: "music and editors",
855
- assistantMessage: "",
873
+ recentTurnPairs: [
874
+ { assistantMessage: "", userMessage: "music and editors" },
875
+ ],
856
876
  nowText: "Now",
857
877
  messageId: "msg-1",
858
878
  config: makeConfig(),
@@ -879,8 +899,7 @@ describe("injectMemoryV2Block", () => {
879
899
  database: db,
880
900
  conversationId: "conv-1",
881
901
  currentTurn: 1,
882
- userMessage: "carol",
883
- assistantMessage: "",
902
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "carol" }],
884
903
  nowText: "",
885
904
  messageId: "msg-1",
886
905
  config: makeConfig({ epsilon: 0.05 }),
@@ -901,8 +920,7 @@ describe("injectMemoryV2Block", () => {
901
920
  database: db,
902
921
  conversationId: "conv-1",
903
922
  currentTurn: 1,
904
- userMessage: "phantom",
905
- assistantMessage: "",
923
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "phantom" }],
906
924
  nowText: "",
907
925
  messageId: "msg-1",
908
926
  config: makeConfig(),
@@ -952,8 +970,9 @@ describe("injectMemoryV2Block", () => {
952
970
  database: db,
953
971
  conversationId: "conv-1",
954
972
  currentTurn: 1,
955
- userMessage: "Help me with examples",
956
- assistantMessage: "",
973
+ recentTurnPairs: [
974
+ { assistantMessage: "", userMessage: "Help me with examples" },
975
+ ],
957
976
  nowText: "Now",
958
977
  messageId: "msg-1",
959
978
  config: makeConfig(),
@@ -992,8 +1011,9 @@ describe("injectMemoryV2Block", () => {
992
1011
  database: db,
993
1012
  conversationId: "conv-1",
994
1013
  currentTurn: 1,
995
- userMessage: "Alice's editor",
996
- assistantMessage: "",
1014
+ recentTurnPairs: [
1015
+ { assistantMessage: "", userMessage: "Alice's editor" },
1016
+ ],
997
1017
  nowText: "Now",
998
1018
  messageId: "msg-1",
999
1019
  config: makeConfig(),
@@ -1031,8 +1051,7 @@ describe("injectMemoryV2Block", () => {
1031
1051
  database: db,
1032
1052
  conversationId: "conv-1",
1033
1053
  currentTurn: 1,
1034
- userMessage: "examples",
1035
- assistantMessage: "",
1054
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "examples" }],
1036
1055
  nowText: "Now",
1037
1056
  messageId: "msg-1",
1038
1057
  config: makeConfig(),
@@ -1049,8 +1068,9 @@ describe("injectMemoryV2Block", () => {
1049
1068
  database: db,
1050
1069
  conversationId: "conv-1",
1051
1070
  currentTurn: 2,
1052
- userMessage: "more examples",
1053
- assistantMessage: "ok",
1071
+ recentTurnPairs: [
1072
+ { assistantMessage: "ok", userMessage: "more examples" },
1073
+ ],
1054
1074
  nowText: "Now",
1055
1075
  messageId: "msg-2",
1056
1076
  config: makeConfig(),
@@ -1078,8 +1098,7 @@ describe("injectMemoryV2Block", () => {
1078
1098
  database: db,
1079
1099
  conversationId: "conv-1",
1080
1100
  currentTurn: 1,
1081
- userMessage: "anything",
1082
- assistantMessage: "",
1101
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "anything" }],
1083
1102
  nowText: "Now",
1084
1103
  messageId: "msg-1",
1085
1104
  config: makeConfig(),
@@ -1104,8 +1123,7 @@ describe("injectMemoryV2Block", () => {
1104
1123
  database: db,
1105
1124
  conversationId: "conv-1",
1106
1125
  currentTurn: 1,
1107
- userMessage: "anything",
1108
- assistantMessage: "",
1126
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "anything" }],
1109
1127
  nowText: "",
1110
1128
  messageId: "msg-1",
1111
1129
  config: makeConfig(),
@@ -1133,8 +1151,9 @@ describe("injectMemoryV2Block", () => {
1133
1151
  database: db,
1134
1152
  conversationId: "conv-1",
1135
1153
  currentTurn: 1,
1136
- userMessage: "How do I register a video?",
1137
- assistantMessage: "",
1154
+ recentTurnPairs: [
1155
+ { assistantMessage: "", userMessage: "How do I register a video?" },
1156
+ ],
1138
1157
  nowText: "Now",
1139
1158
  messageId: "msg-1",
1140
1159
  config: makeConfig(),
@@ -1175,8 +1194,7 @@ describe("injectMemoryV2Block", () => {
1175
1194
  database: db,
1176
1195
  conversationId: "conv-1",
1177
1196
  currentTurn: 1,
1178
- userMessage: "Help me",
1179
- assistantMessage: "",
1197
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "Help me" }],
1180
1198
  nowText: "Now",
1181
1199
  messageId: "msg-1",
1182
1200
  config: makeConfig(),
@@ -1206,8 +1224,7 @@ describe("injectMemoryV2Block", () => {
1206
1224
  database: db,
1207
1225
  conversationId: "conv-1",
1208
1226
  currentTurn: 1,
1209
- userMessage: "anything",
1210
- assistantMessage: "",
1227
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "anything" }],
1211
1228
  nowText: "Now",
1212
1229
  messageId: "msg-1",
1213
1230
  config: makeConfig(),
@@ -1232,8 +1249,7 @@ describe("injectMemoryV2Block", () => {
1232
1249
  database: db,
1233
1250
  conversationId: "conv-1",
1234
1251
  currentTurn: 1,
1235
- userMessage: "config",
1236
- assistantMessage: "",
1252
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "config" }],
1237
1253
  nowText: "Now",
1238
1254
  messageId: "msg-1",
1239
1255
  config: makeConfig(),
@@ -1247,8 +1263,7 @@ describe("injectMemoryV2Block", () => {
1247
1263
  database: db,
1248
1264
  conversationId: "conv-1",
1249
1265
  currentTurn: 2,
1250
- userMessage: "more config",
1251
- assistantMessage: "ok",
1266
+ recentTurnPairs: [{ assistantMessage: "ok", userMessage: "more config" }],
1252
1267
  nowText: "Now",
1253
1268
  messageId: "msg-2",
1254
1269
  config: makeConfig(),
@@ -1269,8 +1284,9 @@ describe("injectMemoryV2Block", () => {
1269
1284
  database: db,
1270
1285
  conversationId: "conv-1",
1271
1286
  currentTurn: 1,
1272
- userMessage: "Alice's editor",
1273
- assistantMessage: "",
1287
+ recentTurnPairs: [
1288
+ { assistantMessage: "", userMessage: "Alice's editor" },
1289
+ ],
1274
1290
  nowText: "Now",
1275
1291
  messageId: "msg-1",
1276
1292
  config: makeConfig(),
@@ -1285,8 +1301,9 @@ describe("injectMemoryV2Block", () => {
1285
1301
  database: db,
1286
1302
  conversationId: "conv-1",
1287
1303
  currentTurn: 2,
1288
- userMessage: "Reload context",
1289
- assistantMessage: "",
1304
+ recentTurnPairs: [
1305
+ { assistantMessage: "", userMessage: "Reload context" },
1306
+ ],
1290
1307
  nowText: "Now",
1291
1308
  messageId: "msg-2",
1292
1309
  mode: "context-load",
@@ -1321,8 +1338,7 @@ describe("injectMemoryV2Block", () => {
1321
1338
  database: db,
1322
1339
  conversationId: "conv-1",
1323
1340
  currentTurn: 1,
1324
- userMessage: "hi",
1325
- assistantMessage: "",
1341
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "hi" }],
1326
1342
  nowText: "",
1327
1343
  messageId: "msg-1",
1328
1344
  mode: "context-load",
@@ -1362,8 +1378,9 @@ describe("injectMemoryV2Block", () => {
1362
1378
  database: db,
1363
1379
  conversationId: "conv-1",
1364
1380
  currentTurn: 1,
1365
- userMessage: "Alice's editor",
1366
- assistantMessage: "",
1381
+ recentTurnPairs: [
1382
+ { assistantMessage: "", userMessage: "Alice's editor" },
1383
+ ],
1367
1384
  nowText: "Now",
1368
1385
  messageId: "msg-1",
1369
1386
  config: makeConfig(),
@@ -1381,8 +1398,7 @@ describe("injectMemoryV2Block", () => {
1381
1398
  database: db,
1382
1399
  conversationId: "conv-1",
1383
1400
  currentTurn: 2,
1384
- userMessage: "Carol's music",
1385
- assistantMessage: "",
1401
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "Carol's music" }],
1386
1402
  nowText: "Now",
1387
1403
  messageId: "msg-2",
1388
1404
  config: makeConfig(),
@@ -1444,8 +1460,9 @@ describe("injectMemoryV2Block", () => {
1444
1460
  database: db,
1445
1461
  conversationId: "conv-1",
1446
1462
  currentTurn: 1,
1447
- userMessage: "Alice's editor",
1448
- assistantMessage: "",
1463
+ recentTurnPairs: [
1464
+ { assistantMessage: "", userMessage: "Alice's editor" },
1465
+ ],
1449
1466
  nowText: "Now",
1450
1467
  messageId: "msg-1",
1451
1468
  config: makeConfig(),
@@ -1470,8 +1487,9 @@ describe("injectMemoryV2Block", () => {
1470
1487
  database: db,
1471
1488
  conversationId: "conv-1",
1472
1489
  currentTurn: 1,
1473
- userMessage: "Alice's editor",
1474
- assistantMessage: "",
1490
+ recentTurnPairs: [
1491
+ { assistantMessage: "", userMessage: "Alice's editor" },
1492
+ ],
1475
1493
  nowText: "Now",
1476
1494
  messageId: "msg-1",
1477
1495
  config: makeConfig(),
@@ -1493,8 +1511,9 @@ describe("injectMemoryV2Block", () => {
1493
1511
  database: db,
1494
1512
  conversationId: "conv-1",
1495
1513
  currentTurn: 2,
1496
- userMessage: "Reload context",
1497
- assistantMessage: "",
1514
+ recentTurnPairs: [
1515
+ { assistantMessage: "", userMessage: "Reload context" },
1516
+ ],
1498
1517
  nowText: "Now",
1499
1518
  messageId: "msg-2",
1500
1519
  mode: "context-load",
@@ -1533,8 +1552,12 @@ describe("injectMemoryV2Block", () => {
1533
1552
  database: db,
1534
1553
  conversationId: "conv-1",
1535
1554
  currentTurn: 1,
1536
- userMessage: "Alice's editor and Bob's coffee",
1537
- assistantMessage: "",
1555
+ recentTurnPairs: [
1556
+ {
1557
+ assistantMessage: "",
1558
+ userMessage: "Alice's editor and Bob's coffee",
1559
+ },
1560
+ ],
1538
1561
  nowText: "Now",
1539
1562
  messageId: "msg-1",
1540
1563
  config: makeConfig(),
@@ -1551,8 +1574,9 @@ describe("injectMemoryV2Block", () => {
1551
1574
  database: db,
1552
1575
  conversationId: "conv-1",
1553
1576
  currentTurn: 2,
1554
- userMessage: "Reload context",
1555
- assistantMessage: "",
1577
+ recentTurnPairs: [
1578
+ { assistantMessage: "", userMessage: "Reload context" },
1579
+ ],
1556
1580
  nowText: "Now",
1557
1581
  messageId: "msg-2",
1558
1582
  mode: "context-load",
@@ -1581,8 +1605,9 @@ describe("injectMemoryV2Block", () => {
1581
1605
  database: db,
1582
1606
  conversationId: "conv-1",
1583
1607
  currentTurn: 1,
1584
- userMessage: "Alice's editor",
1585
- assistantMessage: "",
1608
+ recentTurnPairs: [
1609
+ { assistantMessage: "", userMessage: "Alice's editor" },
1610
+ ],
1586
1611
  nowText: "Now",
1587
1612
  messageId: "msg-1",
1588
1613
  config: makeConfig(),
@@ -1624,8 +1649,9 @@ describe("injectMemoryV2Block", () => {
1624
1649
  database: db,
1625
1650
  conversationId: "conv-1",
1626
1651
  currentTurn: 1,
1627
- userMessage: "music and editors",
1628
- assistantMessage: "",
1652
+ recentTurnPairs: [
1653
+ { assistantMessage: "", userMessage: "music and editors" },
1654
+ ],
1629
1655
  nowText: "Now",
1630
1656
  messageId: "msg-1",
1631
1657
  config: makeConfig(),
@@ -1680,8 +1706,9 @@ describe("injectMemoryV2Block", () => {
1680
1706
  database: db,
1681
1707
  conversationId: "conv-1",
1682
1708
  currentTurn: 1,
1683
- userMessage: "Alice's editor",
1684
- assistantMessage: "",
1709
+ recentTurnPairs: [
1710
+ { assistantMessage: "", userMessage: "Alice's editor" },
1711
+ ],
1685
1712
  nowText: "Now",
1686
1713
  messageId: "msg-1",
1687
1714
  config: makeConfig(),
@@ -1726,8 +1753,9 @@ describe("injectMemoryV2Block", () => {
1726
1753
  database: db,
1727
1754
  conversationId: "conv-finalize",
1728
1755
  currentTurn: 7,
1729
- userMessage: "Alice's editor",
1730
- assistantMessage: "",
1756
+ recentTurnPairs: [
1757
+ { assistantMessage: "", userMessage: "Alice's editor" },
1758
+ ],
1731
1759
  nowText: "Now",
1732
1760
  messageId: "msg-finalize",
1733
1761
  config: makeConfig(),
@@ -1799,8 +1827,9 @@ describe("injectMemoryV2Block", () => {
1799
1827
  database: db,
1800
1828
  conversationId: "conv-router-1",
1801
1829
  currentTurn: 1,
1802
- userMessage: "Tell me about Alice",
1803
- assistantMessage: "",
1830
+ recentTurnPairs: [
1831
+ { assistantMessage: "", userMessage: "Tell me about Alice" },
1832
+ ],
1804
1833
  nowText: "Now",
1805
1834
  messageId: "msg-1",
1806
1835
  config: makeConfig({ router: { enabled: true } }),
@@ -1853,8 +1882,7 @@ describe("injectMemoryV2Block", () => {
1853
1882
  database: db,
1854
1883
  conversationId: "conv-router-fail",
1855
1884
  currentTurn: 3,
1856
- userMessage: "anything",
1857
- assistantMessage: "ok",
1885
+ recentTurnPairs: [{ assistantMessage: "ok", userMessage: "anything" }],
1858
1886
  nowText: "Now",
1859
1887
  messageId: "msg-fail",
1860
1888
  config: makeConfig({ router: { enabled: true } }),
@@ -1909,8 +1937,9 @@ describe("injectMemoryV2Block", () => {
1909
1937
  database: db,
1910
1938
  conversationId: "conv-router-fail-save-throws",
1911
1939
  currentTurn: 5,
1912
- userMessage: "anything",
1913
- assistantMessage: "ok",
1940
+ recentTurnPairs: [
1941
+ { assistantMessage: "ok", userMessage: "anything" },
1942
+ ],
1914
1943
  nowText: "Now",
1915
1944
  messageId: "msg-fail-save",
1916
1945
  config: makeConfig({ router: { enabled: true } }),
@@ -1945,8 +1974,7 @@ describe("injectMemoryV2Block", () => {
1945
1974
  database: db,
1946
1975
  conversationId: "conv-router-abstain",
1947
1976
  currentTurn: 1,
1948
- userMessage: "small talk",
1949
- assistantMessage: "",
1977
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "small talk" }],
1950
1978
  nowText: "Now",
1951
1979
  messageId: "msg-abstain",
1952
1980
  config: makeConfig({ router: { enabled: true } }),
@@ -1984,8 +2012,7 @@ describe("injectMemoryV2Block", () => {
1984
2012
  database: db,
1985
2013
  conversationId: "conv-router-missing",
1986
2014
  currentTurn: 1,
1987
- userMessage: "phantom",
1988
- assistantMessage: "",
2015
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "phantom" }],
1989
2016
  nowText: "Now",
1990
2017
  messageId: "msg-missing",
1991
2018
  config: makeConfig({ router: { enabled: true } }),
@@ -2032,8 +2059,9 @@ describe("injectMemoryV2Block", () => {
2032
2059
  database: db,
2033
2060
  conversationId: "conv-router-dedup",
2034
2061
  currentTurn: 1,
2035
- userMessage: "Tell me about Alice",
2036
- assistantMessage: "",
2062
+ recentTurnPairs: [
2063
+ { assistantMessage: "", userMessage: "Tell me about Alice" },
2064
+ ],
2037
2065
  nowText: "Now",
2038
2066
  messageId: "msg-1",
2039
2067
  config: makeConfig({ router: { enabled: true } }),
@@ -2053,8 +2081,9 @@ describe("injectMemoryV2Block", () => {
2053
2081
  database: db,
2054
2082
  conversationId: "conv-router-dedup",
2055
2083
  currentTurn: 2,
2056
- userMessage: "And Bob?",
2057
- assistantMessage: "Sure",
2084
+ recentTurnPairs: [
2085
+ { assistantMessage: "Sure", userMessage: "And Bob?" },
2086
+ ],
2058
2087
  nowText: "Now",
2059
2088
  messageId: "msg-2",
2060
2089
  config: makeConfig({ router: { enabled: true } }),
@@ -2086,8 +2115,7 @@ describe("injectMemoryV2Block", () => {
2086
2115
  database: db,
2087
2116
  conversationId: "conv-router-source",
2088
2117
  currentTurn: 1,
2089
- userMessage: "Alice",
2090
- assistantMessage: "",
2118
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "Alice" }],
2091
2119
  nowText: "Now",
2092
2120
  messageId: "msg-1",
2093
2121
  config: makeConfig({ router: { enabled: true } }),
@@ -2105,8 +2133,7 @@ describe("injectMemoryV2Block", () => {
2105
2133
  database: db,
2106
2134
  conversationId: "conv-router-source",
2107
2135
  currentTurn: 2,
2108
- userMessage: "Bob",
2109
- assistantMessage: "",
2136
+ recentTurnPairs: [{ assistantMessage: "", userMessage: "Bob" }],
2110
2137
  nowText: "Now",
2111
2138
  messageId: "msg-2",
2112
2139
  config: makeConfig({ router: { enabled: true } }),
@@ -2142,8 +2169,9 @@ describe("injectMemoryV2Block", () => {
2142
2169
  database: db,
2143
2170
  conversationId: "conv-flag-off",
2144
2171
  currentTurn: 1,
2145
- userMessage: "Alice's editor",
2146
- assistantMessage: "",
2172
+ recentTurnPairs: [
2173
+ { assistantMessage: "", userMessage: "Alice's editor" },
2174
+ ],
2147
2175
  nowText: "Now",
2148
2176
  messageId: "msg-1",
2149
2177
  config: makeConfig({ router: { enabled: false } }),
@@ -2178,8 +2206,9 @@ describe("injectMemoryV2Block", () => {
2178
2206
  database: db,
2179
2207
  conversationId: "conv-context-load-router-on",
2180
2208
  currentTurn: 1,
2181
- userMessage: "Tell me about Alice",
2182
- assistantMessage: "",
2209
+ recentTurnPairs: [
2210
+ { assistantMessage: "", userMessage: "Tell me about Alice" },
2211
+ ],
2183
2212
  nowText: "Now",
2184
2213
  messageId: "msg-1",
2185
2214
  mode: "context-load",
@@ -887,4 +887,40 @@ describe("memory v2 qdrant — hybrid query", () => {
887
887
  );
888
888
  expect(results).toEqual([]);
889
889
  });
890
+
891
+ test("an empty dense vector runs a sparse-only query (skips the dense channels)", async () => {
892
+ state.collectionExistsBeforeCreate = true;
893
+ // Only the two sparse channels should fire. Queue body + summary sparse hits.
894
+ state.queryResponses.sparse.push({
895
+ points: [{ score: 7, payload: { slug: "people/alice" } }],
896
+ });
897
+ state.queryResponses.sparse.push({
898
+ points: [{ score: 5, payload: { slug: "people/alice" } }],
899
+ });
900
+
901
+ const results = await hybridQueryConceptPages(
902
+ [],
903
+ { indices: [1, 2], values: [0.5, 0.5] },
904
+ 5,
905
+ );
906
+
907
+ // Regression: a 0-dimension dense vector used to be forwarded verbatim,
908
+ // drawing a Qdrant "Vector dimension error: expected dim N, got 0" 400.
909
+ // It must now skip the dense channels entirely — only sparse runs.
910
+ const usings = state.queryCalls.map((c) => c.using).sort();
911
+ expect(usings).toEqual(["sparse", "summary_sparse"]);
912
+ expect(state.queryCalls.some((c) => c.using === "dense")).toBe(false);
913
+ expect(state.queryCalls.some((c) => c.using === "summary_dense")).toBe(
914
+ false,
915
+ );
916
+
917
+ // The sparse hits still come back; the dense score stays undefined.
918
+ const alice = results.find((r) => r.slug === "people/alice");
919
+ expect(alice).toEqual({
920
+ slug: "people/alice",
921
+ sparseScore: 7,
922
+ summarySparseScore: 5,
923
+ });
924
+ expect(alice?.denseScore).toBeUndefined();
925
+ });
890
926
  });