@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
@@ -22,6 +22,7 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
22
22
 
23
23
  async function handleOpenInferenceProfileSession({
24
24
  body = {},
25
+ headers,
25
26
  }: RouteHandlerArgs) {
26
27
  if (body.profile == null || typeof body.profile !== "string") {
27
28
  throw new BadRequestError("profile must be a non-empty string");
@@ -31,13 +32,18 @@ async function handleOpenInferenceProfileSession({
31
32
  profile: body.profile,
32
33
  ttlSeconds: body.ttlSeconds as number | null | undefined,
33
34
  sessionId: body.sessionId as string | undefined,
35
+ originClientId: headers?.["x-vellum-client-id"]?.trim() || undefined,
34
36
  });
35
37
  }
36
38
 
37
39
  async function handleCloseInferenceProfileSession({
38
40
  body = {},
41
+ headers,
39
42
  }: RouteHandlerArgs) {
40
- return closeInferenceProfileSession(body.conversationId as string);
43
+ return closeInferenceProfileSession(
44
+ body.conversationId as string,
45
+ headers?.["x-vellum-client-id"]?.trim() || undefined,
46
+ );
41
47
  }
42
48
 
43
49
  function handleListInferenceProfileSessions({
@@ -1,6 +1,9 @@
1
1
  import { resolveDefaultProfileKey } from "../../config/llm-resolver.js";
2
2
  import { loadConfig } from "../../config/loader.js";
3
- import { CALL_SITE_CATALOG, CALL_SITE_DOMAINS } from "../../config/schemas/call-site-catalog.js";
3
+ import {
4
+ CALL_SITE_CATALOG,
5
+ CALL_SITE_DOMAINS,
6
+ } from "../../config/schemas/call-site-catalog.js";
4
7
  import type { LLMCallSite } from "../../config/schemas/llm.js";
5
8
  import type { RouteDefinition } from "./types.js";
6
9
 
@@ -10,14 +13,28 @@ async function handleGetCallSites() {
10
13
  domains: CALL_SITE_DOMAINS,
11
14
  callSites: CALL_SITE_CATALOG.map((entry) => ({
12
15
  ...entry,
13
- defaultProfile: resolveDefaultProfileKey(
14
- entry.id as LLMCallSite,
15
- llm,
16
- ),
16
+ defaultProfile: resolveDefaultProfileKey(entry.id as LLMCallSite, llm),
17
17
  })),
18
18
  };
19
19
  }
20
20
 
21
+ export interface LlmProfilesListResult {
22
+ /** Sorted list of profile names defined in `llm.profiles`. */
23
+ profiles: string[];
24
+ /** The workspace-wide active profile name, if one is set. */
25
+ activeProfile: string | null;
26
+ }
27
+
28
+ async function handleListProfiles(): Promise<LlmProfilesListResult> {
29
+ const { llm } = loadConfig();
30
+ const profiles = llm?.profiles ?? {};
31
+ return {
32
+ profiles: Object.keys(profiles).sort(),
33
+ activeProfile:
34
+ typeof llm?.activeProfile === "string" ? llm.activeProfile : null,
35
+ };
36
+ }
37
+
21
38
  export const ROUTES: RouteDefinition[] = [
22
39
  {
23
40
  operationId: "llm_call_sites_list",
@@ -29,4 +46,14 @@ export const ROUTES: RouteDefinition[] = [
29
46
  "Returns the full catalog of LLM call sites with display names, descriptions, and domain groupings. Used by clients to render the per-call-site override settings UI.",
30
47
  tags: ["config"],
31
48
  },
49
+ {
50
+ operationId: "llm_profiles_list",
51
+ method: "GET",
52
+ endpoint: "config/llm/profiles",
53
+ handler: handleListProfiles,
54
+ summary: "List defined LLM profiles",
55
+ description:
56
+ "Returns the sorted list of profile names defined in `llm.profiles` plus the workspace-wide active profile. Used to populate per-call profile dropdowns (e.g. memory router playground) without requiring the caller to type profile names.",
57
+ tags: ["config"],
58
+ },
32
59
  ];
@@ -44,7 +44,10 @@ import type {
44
44
  MemoryType,
45
45
  NewNode,
46
46
  } from "../../memory/graph/types.js";
47
- import { enqueueMemoryJob } from "../../memory/jobs-store.js";
47
+ import {
48
+ enqueueMemoryJob,
49
+ isMemoryEnabled,
50
+ } from "../../memory/jobs-store.js";
48
51
  import { withQdrantBreaker } from "../../memory/qdrant-circuit-breaker.js";
49
52
  import { getQdrantClient } from "../../memory/qdrant-client.js";
50
53
  import { memoryGraphNodes } from "../../memory/schema.js";
@@ -525,7 +528,9 @@ async function handleCreateMemoryItem(body: Record<string, unknown>) {
525
528
  };
526
529
 
527
530
  const created = createNode(newNode);
528
- enqueueMemoryJob("embed_graph_node", { nodeId: created.id });
531
+ if (isMemoryEnabled()) {
532
+ enqueueMemoryJob("embed_graph_node", { nodeId: created.id });
533
+ }
529
534
 
530
535
  return { item: nodeToPayload(created) };
531
536
  }
@@ -619,7 +624,7 @@ async function handleUpdateMemoryItem(
619
624
 
620
625
  updateNode(id, changes);
621
626
 
622
- if (contentChanged) {
627
+ if (contentChanged && isMemoryEnabled()) {
623
628
  enqueueMemoryJob("embed_graph_node", { nodeId: id });
624
629
  }
625
630
 
@@ -23,6 +23,10 @@ import {
23
23
  totalEdgeCount,
24
24
  validateEdgeTargets,
25
25
  } from "../../memory/v2/edge-index.js";
26
+ import { runComparisonOverHistory } from "../../memory/v2/harness/compare.js";
27
+ import type { Retriever } from "../../memory/v2/harness/retriever.js";
28
+ import { createRouterRetriever } from "../../memory/v2/harness/router-retriever.js";
29
+ import type { ComparisonReport } from "../../memory/v2/harness/runner.js";
26
30
  import { computeInjectionScores } from "../../memory/v2/injection-events.js";
27
31
  import { loadNowText } from "../../memory/v2/now-text.js";
28
32
  import { getPageIndex } from "../../memory/v2/page-index.js";
@@ -32,8 +36,10 @@ import {
32
36
  readPage,
33
37
  renderPageContent,
34
38
  } from "../../memory/v2/page-store.js";
39
+ import { ROUTER_PROMPT } from "../../memory/v2/prompts/router.js";
35
40
  import { type RouterSource, runRouter } from "../../memory/v2/router.js";
36
41
  import { seedV2SkillEntries } from "../../memory/v2/skill-store.js";
42
+ import { createV3Retriever } from "../../memory/v3/retriever.js";
37
43
  import { getLogger } from "../../util/logger.js";
38
44
  import { getWorkspaceDir } from "../../util/platform.js";
39
45
  import { RouteError } from "./errors.js";
@@ -347,10 +353,47 @@ const SimulateRouterOverridesSchema = z
347
353
  })
348
354
  .strict();
349
355
 
356
+ const RecentTurnPairSchema = z
357
+ .object({
358
+ assistantMessage: z.string(),
359
+ userMessage: z.string(),
360
+ })
361
+ .strict();
362
+
350
363
  const MemoryV2SimulateRouterParams = z
351
364
  .object({
352
- query: z.string().min(1, "query must be non-empty"),
365
+ /**
366
+ * Recent (assistant, user) turn pairs to render inside `<last_turn>`,
367
+ * oldest first. Required; must contain at least one entry. The last
368
+ * entry's `userMessage` is the just-arrived turn the router is
369
+ * routing for (must be non-empty); earlier entries are conversation
370
+ * history. The oldest pair's `assistantMessage` may be empty for a
371
+ * first-turn scenario — the daemon skips that `[assistant]:` line
372
+ * the same way `runRouterBatch` does in prod.
373
+ */
374
+ recentTurnPairs: z
375
+ .array(RecentTurnPairSchema)
376
+ .min(1, "recentTurnPairs must contain at least one entry")
377
+ .refine(
378
+ (pairs) => pairs[pairs.length - 1].userMessage.length > 0,
379
+ "the last recentTurnPairs entry's userMessage must be non-empty",
380
+ ),
381
+ /**
382
+ * Verbatim `<now>` body. When omitted, the daemon loads the workspace's
383
+ * live NOW.md so callers that don't care about per-call now context get
384
+ * production-like behavior for free. Pass an explicit string (including
385
+ * the empty string) to override.
386
+ */
387
+ nowText: z.string().optional(),
353
388
  configOverrides: SimulateRouterOverridesSchema.optional(),
389
+ profileOverride: z.string().min(1).optional(),
390
+ /**
391
+ * Inline router system-prompt override (simulator only). Empty /
392
+ * whitespace-only strings are normalized to "no override" so a
393
+ * cleared textarea behaves the same as never opening it. The 1 MiB
394
+ * cap mirrors the file-path size guard in `resolveRouterPrompt`.
395
+ */
396
+ routerPromptOverride: z.string().max(1_000_000).optional(),
354
397
  })
355
398
  .strict();
356
399
 
@@ -380,6 +423,10 @@ export interface MemoryV2SimulateRouterResult {
380
423
  };
381
424
  /** Page index size the router was given (post-tier-carve, all batches). */
382
425
  totalCandidatePages: number;
426
+ /** The profile name passed as a per-call override, if any. */
427
+ profileOverride: string | null;
428
+ /** `true` when an inline `routerPromptOverride` was applied this call. */
429
+ routerPromptOverridden: boolean;
383
430
  }
384
431
 
385
432
  /**
@@ -423,23 +470,70 @@ export async function handleSimulateRouter({
423
470
  body = {},
424
471
  }: RouteHandlerArgs): Promise<MemoryV2SimulateRouterResult> {
425
472
  requireMemoryV2Enabled();
426
- const { query, configOverrides } = MemoryV2SimulateRouterParams.parse(body);
473
+ const {
474
+ recentTurnPairs,
475
+ nowText: rawNowText,
476
+ configOverrides,
477
+ profileOverride,
478
+ routerPromptOverride: rawRouterPromptOverride,
479
+ } = MemoryV2SimulateRouterParams.parse(body);
480
+
481
+ // Normalize whitespace-only strings to "no override" so the
482
+ // bundled/file prompt resolution behaves the same as a cleared editor.
483
+ const routerPromptOverride =
484
+ rawRouterPromptOverride !== undefined &&
485
+ rawRouterPromptOverride.trim().length > 0
486
+ ? rawRouterPromptOverride
487
+ : undefined;
427
488
 
428
489
  const liveConfig = loadConfig();
429
490
  const mergedConfig = applySimulateOverrides(liveConfig, configOverrides);
430
491
  const effectiveRouter = mergedConfig.memory.v2.router;
431
492
 
493
+ // Validate the requested profile name against the configured profile
494
+ // catalog so the caller gets a structured 400 instead of a silent fall-
495
+ // through (the resolver tolerates missing override-profile references by
496
+ // design, but the playground wants the user to know they typo'd).
497
+ if (profileOverride !== undefined) {
498
+ const profiles = liveConfig.llm?.profiles ?? {};
499
+ if (!Object.prototype.hasOwnProperty.call(profiles, profileOverride)) {
500
+ const available = Object.keys(profiles).sort();
501
+ const hint =
502
+ available.length > 0
503
+ ? ` Available profiles: ${available.join(", ")}.`
504
+ : " No profiles defined in llm.profiles.";
505
+ throw new RouteError(
506
+ `Profile "${profileOverride}" is not defined in llm.profiles.${hint}`,
507
+ "MEMORY_V2_SIMULATE_INVALID_PROFILE",
508
+ 400,
509
+ );
510
+ }
511
+ }
512
+
432
513
  const workspaceDir = getWorkspaceDir();
433
- const nowText = await loadNowText(workspaceDir);
514
+ // Caller can override `<now>` explicitly; otherwise fall back to the
515
+ // live workspace NOW.md so a UI that doesn't supply nowText still
516
+ // exercises a production-like context.
517
+ const nowText =
518
+ rawNowText !== undefined ? rawNowText : await loadNowText(workspaceDir);
434
519
 
435
520
  const routerResult = await runRouter({
436
521
  workspaceDir,
437
- userMessage: query,
438
- assistantMessage: "",
522
+ recentTurnPairs,
439
523
  nowText,
440
524
  priorEverInjected: [],
441
525
  config: mergedConfig,
442
526
  database: getDb(),
527
+ ...(profileOverride !== undefined
528
+ ? { overrideProfile: profileOverride }
529
+ : {}),
530
+ ...(routerPromptOverride !== undefined ? { routerPromptOverride } : {}),
531
+ // Always return the full union — the simulator's job is to surface
532
+ // what the router actually picked across all batches, not what
533
+ // injection.ts would have trimmed it to. The `max_page_ids` knob is
534
+ // still echoed in `effectiveConfig` so the UI can show the live cap
535
+ // as informational context.
536
+ disableUnionCap: true,
443
537
  });
444
538
 
445
539
  const pageIndex = await getPageIndex(workspaceDir);
@@ -482,9 +576,93 @@ export async function handleSimulateRouter({
482
576
  : {}),
483
577
  },
484
578
  totalCandidatePages: pageIndex.entries.length,
579
+ profileOverride: profileOverride ?? null,
580
+ routerPromptOverridden: routerPromptOverride !== undefined,
485
581
  };
486
582
  }
487
583
 
584
+ // ── Router prompt template (bundled default for the playground editor) ──
585
+
586
+ export interface MemoryV2RouterPromptTemplateResult {
587
+ /** The bundled router prompt body, placeholders intact. */
588
+ template: string;
589
+ }
590
+
591
+ async function handleGetRouterPromptTemplate(): Promise<MemoryV2RouterPromptTemplateResult> {
592
+ requireMemoryV2Enabled();
593
+ return { template: ROUTER_PROMPT };
594
+ }
595
+
596
+ // ── Current `<now>` body (default value for the playground editor) ──────
597
+
598
+ export interface MemoryV2NowTextResult {
599
+ /** The current rendered NOW.md body (autoloaded essentials/threads/recent). */
600
+ nowText: string;
601
+ }
602
+
603
+ async function handleGetNowText(): Promise<MemoryV2NowTextResult> {
604
+ requireMemoryV2Enabled();
605
+ const workspaceDir = getWorkspaceDir();
606
+ const nowText = await loadNowText(workspaceDir);
607
+ return { nowText };
608
+ }
609
+
610
+ // ── Compare retrievers over historical turns (read-only) ────────────────
611
+
612
+ const MemoryV2CompareRetrieversParams = z
613
+ .object({
614
+ /**
615
+ * How many historical `mode='router'` turns to sample. Each scored turn
616
+ * re-runs the router (one LLM call), so keep this modest. Default 20.
617
+ */
618
+ limit: z.number().int().positive().optional(),
619
+ strategy: z.enum(["recent", "random"]).optional(),
620
+ conversationIds: z.array(z.string().min(1)).optional(),
621
+ ks: z.array(z.number().int().positive()).optional(),
622
+ includeNotInjected: z.boolean().optional(),
623
+ })
624
+ .strict();
625
+
626
+ const DEFAULT_COMPARE_LIMIT = 20;
627
+ const DEFAULT_COMPARE_KS = [5, 10, 25, 50];
628
+
629
+ export async function handleCompareRetrievers({
630
+ body = {},
631
+ abortSignal,
632
+ }: RouteHandlerArgs): Promise<ComparisonReport> {
633
+ requireMemoryV2Enabled();
634
+ const { limit, strategy, conversationIds, ks, includeNotInjected } =
635
+ MemoryV2CompareRetrieversParams.parse(body);
636
+
637
+ const config = loadConfig();
638
+ const workspaceDir = getWorkspaceDir();
639
+ const pageIndex = await getPageIndex(workspaceDir);
640
+ const db = getDb();
641
+
642
+ // The router is always comparand #1 (the harness self-test against its own
643
+ // logged ground truth). v3 joins as comparand #2 only when explicitly
644
+ // enabled, so the default compare surface is unchanged until v3 is switched
645
+ // on. v3 is offline-only here — the loop reads `db` but mutates nothing.
646
+ const retrievers: Retriever[] = [createRouterRetriever(db)];
647
+ if (config.memory.v3.enabled) {
648
+ retrievers.push(createV3Retriever(db));
649
+ }
650
+
651
+ return runComparisonOverHistory({
652
+ db,
653
+ workspaceDir,
654
+ config,
655
+ retrievers,
656
+ ks: ks ?? DEFAULT_COMPARE_KS,
657
+ limit: limit ?? DEFAULT_COMPARE_LIMIT,
658
+ pageExists: (slug) => pageIndex.bySlug.has(slug),
659
+ ...(strategy !== undefined ? { strategy } : {}),
660
+ ...(conversationIds !== undefined ? { conversationIds } : {}),
661
+ ...(includeNotInjected !== undefined ? { includeNotInjected } : {}),
662
+ ...(abortSignal !== undefined ? { signal: abortSignal } : {}),
663
+ });
664
+ }
665
+
488
666
  // ── Route definitions ───────────────────────────────────────────────────
489
667
 
490
668
  export const ROUTES: RouteDefinition[] = [
@@ -576,4 +754,36 @@ export const ROUTES: RouteDefinition[] = [
576
754
  tags: ["memory"],
577
755
  requestBody: MemoryV2SimulateRouterParams,
578
756
  },
757
+ {
758
+ operationId: "memory_v2_compare_retrievers",
759
+ method: "POST",
760
+ endpoint: "memory/v2/compare-retrievers",
761
+ handler: handleCompareRetrievers,
762
+ summary:
763
+ "Compare retrievers against the router's logged selections (read-only)",
764
+ description:
765
+ "Runs one or more retrievers over a sample of historical turns (memory_v2_activation_logs, mode='router') and scores their selected pages against the logged selections as ground truth, reconstructing each turn's inputs from the messages table + current NOW. Read-only — writes nothing. Each scored turn re-runs the router (one LLM call), so keep `limit` modest. Today the only retriever is the router itself, so this is the harness self-test.",
766
+ tags: ["memory"],
767
+ requestBody: MemoryV2CompareRetrieversParams,
768
+ },
769
+ {
770
+ operationId: "memory_v2_router_prompt_template",
771
+ method: "GET",
772
+ endpoint: "memory/v2/router-prompt-template",
773
+ handler: handleGetRouterPromptTemplate,
774
+ summary: "Return the bundled router system-prompt template",
775
+ description:
776
+ "Returns the bundled `ROUTER_PROMPT` body with placeholders intact (`{{ASSISTANT_NAME}}`, `{{USER_NAME}}`, `{{PAGE_INDEX}}`). Used by the memory router playground's 'Load default' affordance so users have a known-good starting point when authoring an inline prompt override.",
777
+ tags: ["memory"],
778
+ },
779
+ {
780
+ operationId: "memory_v2_now_text",
781
+ method: "GET",
782
+ endpoint: "memory/v2/now-text",
783
+ handler: handleGetNowText,
784
+ summary: "Return the current rendered `<now>` body",
785
+ description:
786
+ "Returns the current NOW.md (autoloaded essentials/threads/recent). Used by the memory router playground to seed its `<now>` text area with a production-like default so callers can edit from a realistic baseline.",
787
+ tags: ["memory"],
788
+ },
579
789
  ];