@vellumai/assistant 0.8.3 → 0.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (665) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/docker-entrypoint.sh +0 -1
  3. package/docs/browser-use-architecture-phase2.md +1 -1
  4. package/knip.json +2 -1
  5. package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
  6. package/openapi.yaml +1492 -100
  7. package/package.json +1 -1
  8. package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
  9. package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
  10. package/src/__tests__/agent-loop.test.ts +88 -3
  11. package/src/__tests__/anthropic-provider.test.ts +302 -33
  12. package/src/__tests__/approval-cascade.test.ts +1 -1
  13. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  14. package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
  15. package/src/__tests__/audit-log-rotation.test.ts +70 -16
  16. package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
  17. package/src/__tests__/btw-routes.test.ts +2 -3
  18. package/src/__tests__/call-controller.test.ts +0 -1
  19. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  20. package/src/__tests__/channel-delivery-store.test.ts +193 -0
  21. package/src/__tests__/channel-guardian.test.ts +3 -3
  22. package/src/__tests__/channel-reply-delivery.test.ts +284 -5
  23. package/src/__tests__/channel-retry-sweep.test.ts +274 -1
  24. package/src/__tests__/checker.test.ts +6 -15
  25. package/src/__tests__/compaction-events.test.ts +2 -1
  26. package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
  27. package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
  28. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
  29. package/src/__tests__/computer-use-tools.test.ts +2 -4
  30. package/src/__tests__/config-watcher.test.ts +1 -1
  31. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  32. package/src/__tests__/context-token-estimator.test.ts +91 -1
  33. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
  34. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
  35. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +55 -4
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +228 -8
  37. package/src/__tests__/conversation-agent-loop.test.ts +188 -129
  38. package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
  39. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  40. package/src/__tests__/conversation-clean-command.test.ts +137 -0
  41. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  42. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
  43. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  44. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  45. package/src/__tests__/conversation-error.test.ts +31 -0
  46. package/src/__tests__/conversation-fork-crud.test.ts +324 -0
  47. package/src/__tests__/conversation-lifecycle.test.ts +53 -12
  48. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  49. package/src/__tests__/conversation-load-history-stripped.test.ts +279 -0
  50. package/src/__tests__/conversation-pairing.test.ts +2 -2
  51. package/src/__tests__/conversation-process-callsite.test.ts +1 -1
  52. package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -1
  53. package/src/__tests__/conversation-queue.test.ts +1 -1
  54. package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
  55. package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
  56. package/src/__tests__/conversation-runtime-assembly.test.ts +264 -81
  57. package/src/__tests__/conversation-seed-composer.test.ts +66 -4
  58. package/src/__tests__/conversation-skill-tools.test.ts +2 -5
  59. package/src/__tests__/conversation-slash-commands.test.ts +36 -8
  60. package/src/__tests__/conversation-slash-queue.test.ts +1 -1
  61. package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
  62. package/src/__tests__/conversation-speed-override.test.ts +1 -1
  63. package/src/__tests__/conversation-store.test.ts +1 -1
  64. package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
  65. package/src/__tests__/conversation-sync-tags.test.ts +99 -32
  66. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -1
  67. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  68. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  69. package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
  70. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  71. package/src/__tests__/credential-security-invariants.test.ts +7 -0
  72. package/src/__tests__/credential-vault-unit.test.ts +2 -2
  73. package/src/__tests__/cu-unified-flow.test.ts +10 -1
  74. package/src/__tests__/dm-backfill.test.ts +64 -0
  75. package/src/__tests__/dm-persistence.test.ts +33 -0
  76. package/src/__tests__/document-find-replace.test.ts +501 -0
  77. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  78. package/src/__tests__/email-html-renderer.test.ts +12 -0
  79. package/src/__tests__/first-greeting.test.ts +23 -2
  80. package/src/__tests__/gateway-flag-listener.test.ts +237 -0
  81. package/src/__tests__/gemini-provider.test.ts +78 -0
  82. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  83. package/src/__tests__/guardian-outbound-http.test.ts +7 -5
  84. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  85. package/src/__tests__/headless-browser-navigate.test.ts +172 -0
  86. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  87. package/src/__tests__/heartbeat-service.test.ts +4 -0
  88. package/src/__tests__/host-bash-proxy.test.ts +6 -0
  89. package/src/__tests__/host-browser-proxy.test.ts +10 -0
  90. package/src/__tests__/host-cu-proxy.test.ts +8 -1
  91. package/src/__tests__/host-file-proxy.test.ts +8 -1
  92. package/src/__tests__/host-shell-tool.test.ts +1 -1
  93. package/src/__tests__/host-transfer-proxy.test.ts +8 -1
  94. package/src/__tests__/identity-routes.test.ts +57 -0
  95. package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
  96. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  97. package/src/__tests__/injector-chain.test.ts +2 -0
  98. package/src/__tests__/injector-document-comments.test.ts +378 -0
  99. package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
  100. package/src/__tests__/list-messages-attachments.test.ts +21 -17
  101. package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
  102. package/src/__tests__/list-messages-page-latest.test.ts +130 -14
  103. package/src/__tests__/list-messages-tool-merge.test.ts +77 -17
  104. package/src/__tests__/llm-context-normalization.test.ts +0 -2
  105. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  106. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  107. package/src/__tests__/llm-resolver.test.ts +161 -9
  108. package/src/__tests__/llm-usage-store.test.ts +66 -0
  109. package/src/__tests__/log-export-routes.test.ts +99 -2
  110. package/src/__tests__/logger.test.ts +89 -0
  111. package/src/__tests__/mcp-abort-signal.test.ts +2 -2
  112. package/src/__tests__/media-generate-image.test.ts +31 -0
  113. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  114. package/src/__tests__/message-queue-steer.test.ts +114 -0
  115. package/src/__tests__/model-intents.test.ts +2 -4
  116. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  117. package/src/__tests__/onboarding-template-contract.test.ts +1 -1
  118. package/src/__tests__/openai-provider.test.ts +151 -0
  119. package/src/__tests__/openai-responses-provider.test.ts +118 -16
  120. package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
  121. package/src/__tests__/pending-interactions-resolved-event.test.ts +189 -0
  122. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  123. package/src/__tests__/platform.test.ts +2 -5
  124. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  125. package/src/__tests__/plugin-bootstrap.test.ts +2 -2
  126. package/src/__tests__/plugin-source-watcher.test.ts +302 -0
  127. package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
  128. package/src/__tests__/plugin-types.test.ts +3 -2
  129. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  130. package/src/__tests__/pricing.test.ts +12 -0
  131. package/src/__tests__/process-message-background-slack.test.ts +1 -51
  132. package/src/__tests__/process-message-display-content.test.ts +21 -16
  133. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  134. package/src/__tests__/registry.test.ts +2 -8
  135. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  136. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  137. package/src/__tests__/server-history-render.test.ts +83 -4
  138. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  139. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  140. package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
  141. package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
  142. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  143. package/src/__tests__/steer-tool-repair.test.ts +249 -0
  144. package/src/__tests__/subagent-notify-parent.test.ts +1 -1
  145. package/src/__tests__/suggestion-routes.test.ts +1 -0
  146. package/src/__tests__/sync-message-contract.test.ts +59 -0
  147. package/src/__tests__/system-prompt.test.ts +161 -124
  148. package/src/__tests__/terminal-tools.test.ts +12 -2
  149. package/src/__tests__/thinking-block-replay.test.ts +113 -0
  150. package/src/__tests__/thread-backfill.test.ts +370 -22
  151. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  152. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  153. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  154. package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
  155. package/src/__tests__/tool-executor.test.ts +89 -53
  156. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  157. package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
  158. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  159. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  160. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  161. package/src/__tests__/twilio-routes.test.ts +1 -1
  162. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  163. package/src/__tests__/usage-routes.test.ts +3 -0
  164. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  165. package/src/__tests__/web-fetch.test.ts +2 -2
  166. package/src/__tests__/workspace-git-service.test.ts +94 -10
  167. package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
  168. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  169. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  170. package/src/acp/prepare-agent-env.ts +78 -0
  171. package/src/acp/session-manager.ts +1 -1
  172. package/src/agent/attachments.ts +1 -0
  173. package/src/agent/loop.ts +65 -20
  174. package/src/api/README.md +5 -0
  175. package/src/api/index.ts +4 -0
  176. package/src/api/package.json +10 -0
  177. package/src/background-wake/background-wake-routes.test.ts +233 -0
  178. package/src/background-wake/next-wake.test.ts +289 -0
  179. package/src/background-wake/next-wake.ts +172 -0
  180. package/src/background-wake/runtime-registry.ts +24 -0
  181. package/src/browser/operations.ts +15 -0
  182. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  183. package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
  184. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  185. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  186. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  187. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  188. package/src/cli/commands/__tests__/memory-v2.test.ts +10 -12
  189. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  190. package/src/cli/commands/browser.ts +247 -0
  191. package/src/cli/commands/conversations.ts +128 -1
  192. package/src/cli/commands/domain.ts +91 -41
  193. package/src/cli/commands/inference-providers.ts +147 -1
  194. package/src/cli/commands/inference.ts +93 -40
  195. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  196. package/src/cli/commands/memory-v2.ts +483 -0
  197. package/src/cli/commands/memory-v3-render.ts +344 -0
  198. package/src/cli/commands/memory-v3.ts +316 -0
  199. package/src/cli/commands/notifications.ts +24 -2
  200. package/src/cli/program.ts +2 -0
  201. package/src/cli/utils/conversation-id.ts +17 -5
  202. package/src/config/assistant-feature-flags.ts +21 -9
  203. package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
  204. package/src/config/bundled-skills/document-editor/SKILL.md +124 -0
  205. package/src/config/bundled-skills/document-editor/TOOLS.json +258 -0
  206. package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
  207. package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
  208. package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
  209. package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
  210. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  211. package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
  212. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  213. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  214. package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
  215. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  216. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  217. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  218. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  219. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  220. package/src/config/bundled-skills/schedule/SKILL.md +8 -0
  221. package/src/config/bundled-tool-registry.ts +24 -12
  222. package/src/config/call-site-defaults.ts +20 -0
  223. package/src/config/feature-flag-registry.json +115 -3
  224. package/src/config/llm-resolver.ts +16 -2
  225. package/src/config/schemas/__tests__/memory-v2.test.ts +217 -1
  226. package/src/config/schemas/call-site-catalog.ts +35 -0
  227. package/src/config/schemas/llm.ts +14 -0
  228. package/src/config/schemas/memory-v2.ts +294 -1
  229. package/src/config/schemas/memory.ts +2 -1
  230. package/src/context/compactor.ts +60 -1
  231. package/src/context/token-estimator.ts +47 -4
  232. package/src/context/window-manager.ts +25 -0
  233. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  234. package/src/conversations/message-consolidation.ts +404 -0
  235. package/src/credential-health/credential-health-service.ts +34 -19
  236. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
  237. package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
  238. package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
  239. package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
  240. package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
  241. package/src/daemon/conversation-agent-loop-handlers.ts +155 -36
  242. package/src/daemon/conversation-agent-loop.ts +307 -88
  243. package/src/daemon/conversation-error.ts +31 -1
  244. package/src/daemon/conversation-lifecycle.ts +149 -118
  245. package/src/daemon/conversation-messaging.ts +3 -0
  246. package/src/daemon/conversation-process.ts +273 -0
  247. package/src/daemon/conversation-queue-manager.ts +14 -0
  248. package/src/daemon/conversation-runtime-assembly.ts +145 -84
  249. package/src/daemon/conversation-slash.ts +37 -5
  250. package/src/daemon/conversation-surfaces.ts +45 -2
  251. package/src/daemon/conversation-tool-setup.ts +70 -3
  252. package/src/daemon/conversation-usage.ts +2 -0
  253. package/src/daemon/conversation.ts +54 -32
  254. package/src/daemon/disk-pressure-guard.ts +14 -2
  255. package/src/daemon/first-greeting.ts +10 -0
  256. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
  257. package/src/daemon/handlers/config-a2a.ts +160 -0
  258. package/src/daemon/handlers/config-model.test.ts +2 -0
  259. package/src/daemon/handlers/conversations.ts +90 -3
  260. package/src/daemon/handlers/shared.ts +92 -29
  261. package/src/daemon/host-bash-proxy.ts +1 -1
  262. package/src/daemon/host-browser-proxy.ts +5 -5
  263. package/src/daemon/host-cu-proxy.ts +5 -5
  264. package/src/daemon/host-file-proxy.ts +5 -5
  265. package/src/daemon/host-proxy-base.ts +4 -4
  266. package/src/daemon/host-transfer-proxy.ts +11 -11
  267. package/src/daemon/lifecycle.ts +40 -23
  268. package/src/daemon/meet-manifest-loader.ts +1 -7
  269. package/src/daemon/message-protocol.ts +4 -0
  270. package/src/daemon/message-types/conversations.ts +14 -9
  271. package/src/daemon/message-types/document-comments.ts +50 -0
  272. package/src/daemon/message-types/home.ts +1 -13
  273. package/src/daemon/message-types/messages.ts +66 -7
  274. package/src/daemon/message-types/surfaces.ts +3 -1
  275. package/src/daemon/message-types/sync.ts +14 -0
  276. package/src/daemon/message-types/web-activity.ts +57 -0
  277. package/src/daemon/plugin-source-watcher.ts +135 -3
  278. package/src/daemon/process-message.ts +69 -12
  279. package/src/daemon/shutdown-handlers.ts +24 -5
  280. package/src/daemon/switch-inference-profile-tool.ts +52 -0
  281. package/src/daemon/tool-setup-types.ts +13 -0
  282. package/src/daemon/trust-context.ts +6 -0
  283. package/src/documents/document-comments-store.test.ts +338 -0
  284. package/src/documents/document-comments-store.ts +237 -0
  285. package/src/documents/document-store.ts +202 -0
  286. package/src/events/relationship-state-updated.ts +25 -0
  287. package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -2
  288. package/src/heartbeat/heartbeat-service.ts +1 -0
  289. package/src/home/__tests__/suggested-prompts.test.ts +33 -2
  290. package/src/home/feed-types.ts +6 -1
  291. package/src/home/home-content-refresh.ts +52 -0
  292. package/src/home/home-greeting-cache.ts +69 -0
  293. package/src/home/home-greeting.ts +85 -0
  294. package/src/home/suggested-prompts.ts +168 -9
  295. package/src/ipc/gateway-flag-listener.ts +123 -0
  296. package/src/ipc/skill-routes/registries.ts +8 -12
  297. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  298. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  299. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
  300. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  301. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
  302. package/src/memory/__tests__/memory-retrospective-job.test.ts +327 -6
  303. package/src/memory/auto-analysis-enqueue.ts +5 -1
  304. package/src/memory/conversation-crud.ts +191 -100
  305. package/src/memory/conversation-starters-cadence.ts +3 -1
  306. package/src/memory/conversation-title-service.ts +19 -3
  307. package/src/memory/db-async-query.ts +214 -0
  308. package/src/memory/db-init.ts +26 -0
  309. package/src/memory/db-maintenance.ts +30 -21
  310. package/src/memory/delivery-crud.ts +41 -0
  311. package/src/memory/delivery-status.ts +141 -15
  312. package/src/memory/external-conversation-store.ts +32 -1
  313. package/src/memory/graph/bootstrap.ts +8 -1
  314. package/src/memory/graph/capability-seed.ts +7 -3
  315. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  316. package/src/memory/graph/extraction.ts +1 -5
  317. package/src/memory/graph/graph-search.ts +7 -1
  318. package/src/memory/indexer.ts +28 -18
  319. package/src/memory/job-handlers/cleanup.ts +76 -18
  320. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  321. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  322. package/src/memory/jobs-store.ts +14 -0
  323. package/src/memory/jobs-worker.ts +68 -15
  324. package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
  325. package/src/memory/llm-request-log-source-local.ts +7 -0
  326. package/src/memory/llm-request-log-source.ts +9 -2
  327. package/src/memory/llm-request-log-store.ts +43 -1
  328. package/src/memory/llm-usage-store.ts +24 -0
  329. package/src/memory/memory-retrospective-constants.ts +28 -0
  330. package/src/memory/memory-retrospective-enqueue.ts +11 -3
  331. package/src/memory/memory-retrospective-job.ts +413 -18
  332. package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
  333. package/src/memory/memory-v2-activation-log-store.ts +41 -14
  334. package/src/memory/migrations/100-core-tables.ts +1 -0
  335. package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
  336. package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
  337. package/src/memory/migrations/253-document-comments.ts +47 -0
  338. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
  339. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
  340. package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
  341. package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
  342. package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
  343. package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
  344. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  345. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  346. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  347. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  348. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  349. package/src/memory/migrations/index.ts +34 -0
  350. package/src/memory/migrations/registry.ts +58 -0
  351. package/src/memory/onboarding-events-store.ts +7 -0
  352. package/src/memory/schema/calls.ts +1 -0
  353. package/src/memory/schema/conversations.ts +3 -0
  354. package/src/memory/schema/infrastructure.ts +22 -0
  355. package/src/memory/tool-usage-store.ts +36 -8
  356. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  357. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  358. package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
  359. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  360. package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
  361. package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
  362. package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
  363. package/src/memory/v2/__tests__/injection.test.ts +158 -112
  364. package/src/memory/v2/__tests__/page-index.test.ts +365 -1
  365. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  366. package/src/memory/v2/__tests__/router.test.ts +660 -4
  367. package/src/memory/v2/consolidation-job.ts +14 -0
  368. package/src/memory/v2/harness/compare.ts +57 -0
  369. package/src/memory/v2/harness/metrics.ts +124 -0
  370. package/src/memory/v2/harness/oracle.ts +145 -0
  371. package/src/memory/v2/harness/replay-input.ts +224 -0
  372. package/src/memory/v2/harness/retriever.ts +74 -0
  373. package/src/memory/v2/harness/router-retriever.ts +43 -0
  374. package/src/memory/v2/harness/runner.ts +106 -0
  375. package/src/memory/v2/harness/trace.ts +58 -0
  376. package/src/memory/v2/injection-events.ts +101 -0
  377. package/src/memory/v2/injection.ts +42 -25
  378. package/src/memory/v2/page-index.ts +209 -7
  379. package/src/memory/v2/page-store.ts +18 -0
  380. package/src/memory/v2/prompts/router.ts +26 -1
  381. package/src/memory/v2/qdrant.ts +14 -2
  382. package/src/memory/v2/router.ts +369 -62
  383. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  384. package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
  385. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  386. package/src/memory/v3/__tests__/edges.test.ts +563 -0
  387. package/src/memory/v3/__tests__/filter.test.ts +512 -0
  388. package/src/memory/v3/__tests__/gate.test.ts +574 -0
  389. package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
  390. package/src/memory/v3/__tests__/loop.test.ts +530 -0
  391. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  392. package/src/memory/v3/__tests__/scouts.test.ts +440 -0
  393. package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
  394. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  395. package/src/memory/v3/__tests__/traversal.test.ts +469 -0
  396. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  397. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  398. package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
  399. package/src/memory/v3/__tests__/validate.test.ts +245 -0
  400. package/src/memory/v3/auto-edges.ts +223 -0
  401. package/src/memory/v3/coactivation-store.ts +124 -0
  402. package/src/memory/v3/consolidation-job.ts +323 -0
  403. package/src/memory/v3/edge-learning-job.ts +160 -0
  404. package/src/memory/v3/edges.ts +249 -0
  405. package/src/memory/v3/filter.ts +281 -0
  406. package/src/memory/v3/gate.ts +334 -0
  407. package/src/memory/v3/index-composition.ts +113 -0
  408. package/src/memory/v3/llm-capture.ts +46 -0
  409. package/src/memory/v3/loop.ts +382 -0
  410. package/src/memory/v3/maintenance.ts +144 -0
  411. package/src/memory/v3/prompt-context.ts +33 -0
  412. package/src/memory/v3/prompts/consolidation.ts +458 -0
  413. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  414. package/src/memory/v3/retriever.ts +33 -0
  415. package/src/memory/v3/scouts.ts +420 -0
  416. package/src/memory/v3/shadow-middleware.ts +305 -0
  417. package/src/memory/v3/traversal.ts +206 -0
  418. package/src/memory/v3/tree-index.ts +237 -0
  419. package/src/memory/v3/tree-store.ts +394 -0
  420. package/src/memory/v3/tree-walk.ts +351 -0
  421. package/src/memory/v3/types.ts +65 -0
  422. package/src/memory/v3/validate.ts +300 -0
  423. package/src/messaging/providers/index.ts +7 -1
  424. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
  425. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
  426. package/src/messaging/providers/slack/adapter.ts +178 -25
  427. package/src/messaging/providers/slack/api.test.ts +54 -0
  428. package/src/messaging/providers/slack/api.ts +119 -3
  429. package/src/messaging/providers/slack/client.ts +12 -0
  430. package/src/messaging/providers/slack/deep-link.ts +20 -1
  431. package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
  432. package/src/messaging/providers/slack/message-metadata.ts +156 -0
  433. package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
  434. package/src/messaging/providers/slack/render-transcript.ts +176 -49
  435. package/src/messaging/providers/slack/send.test.ts +77 -0
  436. package/src/messaging/providers/slack/send.ts +8 -2
  437. package/src/messaging/providers/slack/types.ts +14 -0
  438. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
  439. package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
  440. package/src/notifications/adapters/macos.ts +18 -1
  441. package/src/notifications/adapters/platform.ts +1 -1
  442. package/src/notifications/conversation-seed-composer.ts +14 -2
  443. package/src/notifications/decision-engine.ts +1 -4
  444. package/src/notifications/deferred-emit.ts +135 -0
  445. package/src/notifications/emit-signal.ts +38 -50
  446. package/src/notifications/home-feed-side-effect.ts +60 -30
  447. package/src/oauth/connect-orchestrator.ts +3 -0
  448. package/src/oauth/credential-token-resolver.ts +2 -0
  449. package/src/oauth/manual-token-connection.ts +19 -0
  450. package/src/oauth/oauth-store.ts +12 -0
  451. package/src/oauth/seed-providers.ts +22 -0
  452. package/src/permissions/prompter.ts +8 -5
  453. package/src/permissions/question-prompter.ts +5 -2
  454. package/src/permissions/secret-prompter.ts +6 -3
  455. package/src/plugin-api/index.ts +4 -0
  456. package/src/plugin-api/types.ts +7 -33
  457. package/src/plugins/defaults/index.ts +6 -0
  458. package/src/plugins/defaults/injectors.ts +100 -20
  459. package/src/plugins/external-plugin-loader.ts +5 -68
  460. package/src/plugins/types.ts +11 -16
  461. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  462. package/src/prompts/__tests__/system-prompt.test.ts +46 -2
  463. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  464. package/src/prompts/normalize-onboarding.ts +40 -0
  465. package/src/prompts/persona-resolver.ts +36 -21
  466. package/src/prompts/sections.ts +69 -19
  467. package/src/prompts/system-prompt.ts +118 -216
  468. package/src/prompts/template-detection.ts +37 -0
  469. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
  470. package/src/prompts/templates/BOOTSTRAP.md +10 -2
  471. package/src/prompts/templates/VOICE.md +3 -0
  472. package/src/prompts/templates/system-sections.ts +281 -9
  473. package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
  474. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  475. package/src/providers/anthropic/client.ts +159 -66
  476. package/src/providers/call-site-routing.ts +14 -2
  477. package/src/providers/connection-model-compat.ts +38 -0
  478. package/src/providers/connection-resolution.ts +16 -2
  479. package/src/providers/fireworks/client.ts +20 -2
  480. package/src/providers/gemini/client.ts +49 -6
  481. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
  482. package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
  483. package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
  484. package/src/providers/inference/adapter-factory.ts +18 -1
  485. package/src/providers/inference/auth.ts +3 -3
  486. package/src/providers/inference/codex-token-refresh.ts +128 -0
  487. package/src/providers/inference/resolve-auth.ts +49 -6
  488. package/src/providers/minimax/client.ts +106 -0
  489. package/src/providers/model-catalog.ts +91 -1
  490. package/src/providers/model-intents.ts +1 -1
  491. package/src/providers/openai/chat-completions-provider.ts +63 -23
  492. package/src/providers/openai/codex-models.ts +18 -0
  493. package/src/providers/openai/responses-provider.ts +86 -23
  494. package/src/providers/openrouter/client.ts +5 -1
  495. package/src/providers/provider-send-message.ts +7 -1
  496. package/src/providers/retry.ts +34 -3
  497. package/src/providers/thinking-config.ts +26 -1
  498. package/src/providers/types.ts +25 -0
  499. package/src/providers/usage-tracking.ts +2 -0
  500. package/src/runtime/AGENTS.md +2 -2
  501. package/src/runtime/__tests__/agent-wake.test.ts +214 -0
  502. package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
  503. package/src/runtime/agent-wake.ts +152 -56
  504. package/src/runtime/assistant-event-hub.ts +76 -6
  505. package/src/runtime/auth/route-policy.ts +43 -3
  506. package/src/runtime/background-job-runner.ts +26 -0
  507. package/src/runtime/btw-sidechain.ts +0 -6
  508. package/src/runtime/channel-reply-delivery.ts +182 -47
  509. package/src/runtime/channel-retry-sweep.ts +141 -16
  510. package/src/runtime/http-types.ts +7 -6
  511. package/src/runtime/migrations/vbundle-builder.ts +10 -3
  512. package/src/runtime/pending-interactions.ts +50 -8
  513. package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
  514. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +161 -1
  515. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
  516. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +290 -0
  517. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  518. package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
  519. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
  520. package/src/runtime/routes/acp-routes.test.ts +255 -6
  521. package/src/runtime/routes/acp-routes.ts +8 -1
  522. package/src/runtime/routes/approval-routes.ts +4 -1
  523. package/src/runtime/routes/avatar-routes.ts +10 -10
  524. package/src/runtime/routes/background-wake-routes.ts +188 -0
  525. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  526. package/src/runtime/routes/btw-routes.ts +0 -6
  527. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
  528. package/src/runtime/routes/content-source-routes.ts +78 -0
  529. package/src/runtime/routes/conversation-cli-routes.ts +147 -2
  530. package/src/runtime/routes/conversation-list-routes.ts +12 -4
  531. package/src/runtime/routes/conversation-management-routes.ts +77 -20
  532. package/src/runtime/routes/conversation-query-routes.ts +196 -31
  533. package/src/runtime/routes/conversation-routes.ts +472 -425
  534. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  535. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  536. package/src/runtime/routes/document-comments-routes.ts +287 -0
  537. package/src/runtime/routes/documents-routes.ts +33 -0
  538. package/src/runtime/routes/domain-routes.ts +60 -10
  539. package/src/runtime/routes/email-routes.ts +5 -2
  540. package/src/runtime/routes/events-routes.ts +54 -10
  541. package/src/runtime/routes/group-routes.ts +24 -8
  542. package/src/runtime/routes/home-feed-routes.ts +6 -3
  543. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  544. package/src/runtime/routes/host-browser-routes.ts +17 -2
  545. package/src/runtime/routes/host-cu-routes.ts +2 -2
  546. package/src/runtime/routes/identity-routes.ts +21 -0
  547. package/src/runtime/routes/inbound-message-handler.ts +288 -58
  548. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  549. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
  550. package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
  551. package/src/runtime/routes/index.ts +20 -4
  552. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  553. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  554. package/src/runtime/routes/inference-provider-connection-routes.ts +63 -7
  555. package/src/runtime/routes/integrations/a2a.ts +60 -1
  556. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  557. package/src/runtime/routes/log-export-routes.ts +39 -0
  558. package/src/runtime/routes/memory-item-routes.ts +8 -3
  559. package/src/runtime/routes/memory-v2-routes.ts +427 -0
  560. package/src/runtime/routes/memory-v3-routes.ts +316 -0
  561. package/src/runtime/routes/migration-routes.ts +21 -24
  562. package/src/runtime/routes/notification-routes.ts +19 -2
  563. package/src/runtime/routes/plugins-routes.ts +337 -0
  564. package/src/runtime/routes/question-routes.ts +4 -1
  565. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  566. package/src/runtime/routes/sanity-routes.ts +159 -0
  567. package/src/runtime/routes/secret-routes.ts +25 -5
  568. package/src/runtime/routes/settings-routes.ts +12 -11
  569. package/src/runtime/routes/slack-channel-routes.ts +188 -0
  570. package/src/runtime/routes/workspace-routes.ts +25 -10
  571. package/src/runtime/services/conversation-serializer.ts +30 -4
  572. package/src/runtime/sync/resource-sync-events.ts +106 -38
  573. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  574. package/src/runtime/sync/sync-publisher.ts +2 -1
  575. package/src/runtime/verification-outbound-actions.ts +73 -1
  576. package/src/schedule/integration-status.ts +3 -1
  577. package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
  578. package/src/security/oauth2-device-code.ts +307 -0
  579. package/src/security/oauth2.ts +26 -9
  580. package/src/security/secure-keys.ts +5 -0
  581. package/src/skills/catalog-install.ts +6 -2
  582. package/src/telemetry/types.ts +12 -0
  583. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  584. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  585. package/src/tools/acp/spawn.test.ts +119 -0
  586. package/src/tools/acp/spawn.ts +15 -2
  587. package/src/tools/apps/definitions.ts +2 -8
  588. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  589. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  590. package/src/tools/browser/__tests__/pinned-tabs.test.ts +150 -0
  591. package/src/tools/browser/browser-execution.ts +106 -0
  592. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  593. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
  594. package/src/tools/browser/cdp-client/__tests__/types.test.ts +4 -0
  595. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +22 -0
  596. package/src/tools/browser/cdp-client/extension-cdp-client.ts +42 -2
  597. package/src/tools/browser/cdp-client/factory.ts +171 -4
  598. package/src/tools/browser/cdp-client/local-cdp-client.ts +21 -0
  599. package/src/tools/browser/cdp-client/types.ts +101 -0
  600. package/src/tools/browser/pinned-tabs.ts +146 -0
  601. package/src/tools/computer-use/definitions.ts +22 -78
  602. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  603. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  604. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  605. package/src/tools/credentials/vault.ts +3 -9
  606. package/src/tools/document/document-comment-tool.test.ts +379 -0
  607. package/src/tools/document/document-comment-tool.ts +156 -0
  608. package/src/tools/document/document-tool.ts +187 -2
  609. package/src/tools/execution-target.ts +21 -23
  610. package/src/tools/executor.ts +6 -1
  611. package/src/tools/filesystem/edit.ts +3 -9
  612. package/src/tools/filesystem/list.ts +3 -9
  613. package/src/tools/filesystem/read.ts +3 -9
  614. package/src/tools/filesystem/write.ts +3 -9
  615. package/src/tools/host-filesystem/edit.ts +3 -9
  616. package/src/tools/host-filesystem/read.ts +3 -9
  617. package/src/tools/host-filesystem/transfer.ts +3 -9
  618. package/src/tools/host-filesystem/write.ts +3 -9
  619. package/src/tools/host-terminal/host-shell.ts +3 -9
  620. package/src/tools/mcp/mcp-tool-factory.ts +1 -8
  621. package/src/tools/memory/register.test.ts +1 -1
  622. package/src/tools/memory/register.ts +4 -9
  623. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
  624. package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
  625. package/src/tools/network/domain-normalize.ts +17 -0
  626. package/src/tools/network/web-fetch.ts +216 -73
  627. package/src/tools/network/web-search.ts +216 -98
  628. package/src/tools/registry.ts +7 -23
  629. package/src/tools/schema-transforms.ts +1 -1
  630. package/src/tools/skills/execute.ts +3 -9
  631. package/src/tools/skills/load.ts +3 -9
  632. package/src/tools/skills/skill-tool-factory.ts +1 -8
  633. package/src/tools/subagent/notify-parent.ts +3 -9
  634. package/src/tools/system/request-permission.ts +3 -9
  635. package/src/tools/terminal/safe-env.ts +3 -2
  636. package/src/tools/terminal/shell.ts +3 -9
  637. package/src/tools/tool-approval-handler.ts +19 -12
  638. package/src/tools/tool-defaults.ts +94 -0
  639. package/src/tools/types.ts +31 -98
  640. package/src/tools/ui-surface/definitions.ts +9 -23
  641. package/src/types/onboarding-context.ts +4 -0
  642. package/src/usage/pricing.ts +23 -0
  643. package/src/usage/types.ts +12 -0
  644. package/src/util/__tests__/favicon.test.ts +84 -0
  645. package/src/util/favicon.ts +40 -0
  646. package/src/util/logger.ts +16 -7
  647. package/src/util/platform.ts +7 -7
  648. package/src/util/sqlite3-runtime.ts +65 -0
  649. package/src/workspace/git-service.ts +75 -4
  650. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  651. package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
  652. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  653. package/src/workspace/migrations/registry.ts +4 -0
  654. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  655. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  656. package/src/config/bundled-skills/document/SKILL.md +0 -54
  657. package/src/config/bundled-skills/document/TOOLS.json +0 -106
  658. package/src/daemon/seed-files.ts +0 -18
  659. package/src/prompts/cache-boundary.ts +0 -8
  660. package/src/runtime/routes/interface-routes.ts +0 -43
  661. /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
  662. /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
  663. /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
  664. /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
  665. /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  import { and, asc, eq, inArray, lte, notInArray, or, sql } from "drizzle-orm";
2
2
  import { v4 as uuid } from "uuid";
3
3
 
4
+ import { getConfig } from "../config/loader.js";
4
5
  import { getLogger } from "../util/logger.js";
5
6
  import { truncate } from "../util/truncate.js";
6
7
  import { getDb } from "./db-connection.js";
@@ -43,6 +44,9 @@ export type MemoryJobType =
43
44
  | "memory_v2_migrate"
44
45
  | "memory_v2_reembed"
45
46
  | "memory_v2_activation_recompute"
47
+ | "memory_v3_consolidate"
48
+ | "memory_v3_index_maintenance"
49
+ | "memory_v3_edge_learning"
46
50
  | "memory_retrospective";
47
51
 
48
52
  export const EMBED_JOB_TYPES: MemoryJobType[] = [
@@ -66,12 +70,22 @@ export const SLOW_LLM_JOB_TYPES: MemoryJobType[] = [
66
70
  "generate_conversation_starters",
67
71
  "memory_v2_sweep",
68
72
  "memory_v2_consolidate",
73
+ "memory_v3_consolidate",
69
74
  "memory_v2_migrate",
70
75
  "memory_retrospective",
71
76
  "backfill",
72
77
  "graph_bootstrap",
73
78
  ];
74
79
 
80
+ /** Returns `false` only when `config.memory.enabled` is explicitly `false`; defaults to `true` on missing config or load errors. */
81
+ export function isMemoryEnabled(): boolean {
82
+ try {
83
+ return getConfig().memory?.enabled !== false;
84
+ } catch {
85
+ return true;
86
+ }
87
+ }
88
+
75
89
  export interface MemoryJob<T = Record<string, unknown>> {
76
90
  id: string;
77
91
  type: MemoryJobType;
@@ -1,3 +1,5 @@
1
+ import { join } from "node:path";
2
+
1
3
  import { getConfig } from "../config/loader.js";
2
4
  import type { AssistantConfig } from "../config/types.js";
3
5
  import {
@@ -6,6 +8,7 @@ import {
6
8
  shouldLogDiskPressureBackgroundSkip,
7
9
  } from "../daemon/disk-pressure-background-gate.js";
8
10
  import { getLogger } from "../util/logger.js";
11
+ import { getWorkspaceDir } from "../util/platform.js";
9
12
  import { getMemoryCheckpoint, setMemoryCheckpoint } from "./checkpoints.js";
10
13
  import {
11
14
  getLastScheduledCleanupEnqueueMs,
@@ -75,8 +78,14 @@ import {
75
78
  memoryV2MigrateJob,
76
79
  memoryV2ReembedJob,
77
80
  } from "./v2/backfill-jobs.js";
78
- import { memoryV2ConsolidateJob } from "./v2/consolidation-job.js";
81
+ import {
82
+ countBufferLines,
83
+ memoryV2ConsolidateJob,
84
+ } from "./v2/consolidation-job.js";
79
85
  import { memoryV2SweepJob } from "./v2/sweep-job.js";
86
+ import { memoryV3ConsolidateJob } from "./v3/consolidation-job.js";
87
+ import { memoryV3EdgeLearningJob } from "./v3/edge-learning-job.js";
88
+ import { memoryV3IndexMaintenanceJob } from "./v3/maintenance.js";
80
89
 
81
90
  const log = getLogger("memory-jobs-worker");
82
91
 
@@ -253,7 +262,7 @@ export async function runMemoryJobsOnce(
253
262
  maybeEnqueueScheduledCleanupJobs(config);
254
263
  }
255
264
  maybeEnqueueGraphMaintenanceJobs(config);
256
- maybeRunDbMaintenance();
265
+ await maybeRunDbMaintenance();
257
266
  return 0;
258
267
  }
259
268
 
@@ -307,7 +316,7 @@ export async function runMemoryJobsOnce(
307
316
  maybeEnqueueScheduledCleanupJobs(config);
308
317
  }
309
318
  maybeEnqueueGraphMaintenanceJobs(config);
310
- maybeRunDbMaintenance();
319
+ await maybeRunDbMaintenance();
311
320
  return slowProcessed + fastProcessed + embedProcessed;
312
321
  }
313
322
 
@@ -518,10 +527,10 @@ async function processJob(
518
527
  pruneOldConversationsJob(job, config);
519
528
  return;
520
529
  case "prune_old_llm_request_logs":
521
- pruneOldLlmRequestLogsJob(job, config);
530
+ await pruneOldLlmRequestLogsJob(job, config);
522
531
  return;
523
532
  case "prune_old_trace_events":
524
- pruneOldTraceEventsJob(job, config);
533
+ await pruneOldTraceEventsJob(job, config);
525
534
  return;
526
535
  case "build_conversation_summary":
527
536
  // Stale rows enqueued before v2 was enabled must not consume the
@@ -597,6 +606,16 @@ async function processJob(
597
606
  case "memory_v2_consolidate":
598
607
  await memoryV2ConsolidateJob(job, config);
599
608
  return;
609
+ case "memory_v3_consolidate":
610
+ await memoryV3ConsolidateJob(job, config);
611
+ return;
612
+ case "memory_v3_index_maintenance":
613
+ await memoryV3IndexMaintenanceJob(job);
614
+ return;
615
+ case "memory_v3_edge_learning":
616
+ // Fast lane: bounded DB work (decay + reinforce + read), no LLM.
617
+ memoryV3EdgeLearningJob(job);
618
+ return;
600
619
  case "memory_v2_migrate":
601
620
  await memoryV2MigrateJob(job, config);
602
621
  return;
@@ -675,17 +694,28 @@ export const GRAPH_MAINTENANCE_CHECKPOINTS = {
675
694
  patternScan: "graph_maintenance:pattern_scan:last_run",
676
695
  narrative: "graph_maintenance:narrative:last_run",
677
696
  memoryV2Consolidate: "memory_v2_consolidate_last_run",
697
+ memoryV3Consolidate: "memory_v3_consolidate_last_run",
678
698
  } as const;
679
699
 
680
700
  /**
681
701
  * Enqueue periodic graph maintenance jobs.
682
702
  *
683
703
  * Mutually exclusive between v1 and v2:
684
- * - v2 active (`memory.v2.enabled` on) → only `memory_v2_consolidate` is
685
- * scheduled.
704
+ * - v2 active (`memory.v2.enabled` on) → only one buffer-drainer is
705
+ * scheduled (see below).
686
706
  * - v2 inactive → the four v1 entries (decay, consolidate, pattern_scan,
687
707
  * narrative) are scheduled instead.
688
708
  *
709
+ * **Buffer-drainer retarget (v2 vs v3).** The `memory/buffer.md` is shared, so
710
+ * exactly one consolidator may own the drain at a time. When
711
+ * `memory.v3.write.enabled` is on, the v3 consolidator (`memory_v3_consolidate`)
712
+ * is scheduled INSTEAD of `memory_v2_consolidate` — same shared buffer +
713
+ * standing-context files, additionally authored into the v3 tree. When the v3
714
+ * write flag is off (default) the v2 consolidator stays the sole drainer,
715
+ * unchanged. The retarget is a clean conditional, fully reversible via the flag.
716
+ * Concept pages stay the shared canonical store, so the v2 router keeps working
717
+ * off pages v3 writes regardless of which consolidator ran.
718
+ *
689
719
  * Read/write paths route to v2 when the flag is on, so v1 graph data goes
690
720
  * unread; running v1 maintenance alongside v2 is wasted compute and LLM
691
721
  * spend. The v1 code path remains live so flipping the flag back to off
@@ -702,20 +732,29 @@ export function maybeEnqueueGraphMaintenanceJobs(
702
732
  nowMs = Date.now(),
703
733
  ): void {
704
734
  const v2Active = config.memory.v2.enabled;
735
+ const v3WriteActive = config.memory.v3.write.enabled;
736
+
737
+ // The single buffer-drainer entry for the v2-active branch: v3 when the v3
738
+ // write flag owns the drain, v2 otherwise. Same shared buffer either way.
739
+ const consolidateEntry = v3WriteActive
740
+ ? {
741
+ key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV3Consolidate,
742
+ intervalMs: config.memory.v3.write.consolidateIntervalMs,
743
+ jobType: "memory_v3_consolidate" as MemoryJobType,
744
+ }
745
+ : {
746
+ key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
747
+ intervalMs:
748
+ config.memory.v2.consolidation_interval_hours * 60 * 60 * 1000,
749
+ jobType: "memory_v2_consolidate" as MemoryJobType,
750
+ };
705
751
 
706
752
  const schedule: Array<{
707
753
  key: string;
708
754
  intervalMs: number;
709
755
  jobType: MemoryJobType;
710
756
  }> = v2Active
711
- ? [
712
- {
713
- key: GRAPH_MAINTENANCE_CHECKPOINTS.memoryV2Consolidate,
714
- intervalMs:
715
- config.memory.v2.consolidation_interval_hours * 60 * 60 * 1000,
716
- jobType: "memory_v2_consolidate",
717
- },
718
- ]
757
+ ? [consolidateEntry]
719
758
  : [
720
759
  {
721
760
  key: GRAPH_MAINTENANCE_CHECKPOINTS.decay,
@@ -739,11 +778,25 @@ export function maybeEnqueueGraphMaintenanceJobs(
739
778
  },
740
779
  ];
741
780
 
781
+ let enqueuedConsolidate = false;
742
782
  for (const { key, intervalMs, jobType } of schedule) {
743
783
  const lastRun = parseInt(getMemoryCheckpoint(key) ?? "0", 10);
744
784
  if (nowMs - lastRun >= intervalMs) {
745
785
  enqueueMemoryJob(jobType, {});
746
786
  setMemoryCheckpoint(key, String(nowMs));
787
+ if (jobType === consolidateEntry.jobType) enqueuedConsolidate = true;
788
+ }
789
+ }
790
+
791
+ // Size-based trigger: when the shared buffer crosses the configured line
792
+ // count, drain it now rather than waiting out the interval. Retargets to the
793
+ // same consolidator the interval branch above selected.
794
+ const maxLines = config.memory.v2.consolidation_max_buffer_lines;
795
+ if (v2Active && !enqueuedConsolidate && maxLines !== null) {
796
+ const bufferPath = join(getWorkspaceDir(), "memory", "buffer.md");
797
+ if (countBufferLines(bufferPath) >= maxLines) {
798
+ enqueueMemoryJob(consolidateEntry.jobType, {});
799
+ setMemoryCheckpoint(consolidateEntry.key, String(nowMs));
747
800
  }
748
801
  }
749
802
  }
@@ -58,6 +58,16 @@ interface ClickHouseRow {
58
58
  response_payload: string;
59
59
  created_at: string;
60
60
  agent_loop_exit_reason: string;
61
+ /**
62
+ * Mirrors `llm_request_logs.call_site` from the SQLite source. Added
63
+ * to the CH `default.llm_request_logs` table via ALTER TABLE (matching
64
+ * the `agent_loop_exit_reason` precedent — see
65
+ * `memory/concepts/objects/clickhouse-mirror.md`).
66
+ *
67
+ * CH columns are `DEFAULT ''` rather than Nullable, so empty-string
68
+ * means "not set" — `toLogRow` maps that back to NULL on the JS side.
69
+ */
70
+ call_site: string;
61
71
  }
62
72
 
63
73
  /** Injectable fetch override for tests. Defaults to globalThis.fetch. */
@@ -125,7 +135,8 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
125
135
  request_payload,
126
136
  response_payload,
127
137
  toUnixTimestamp64Milli(created_at) AS created_at,
128
- agent_loop_exit_reason
138
+ agent_loop_exit_reason,
139
+ call_site
129
140
  FROM ${this.tableRef()}
130
141
  WHERE assistant_id = {assistant_id:String}
131
142
  AND id = {log_id:String}
@@ -171,6 +182,33 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
171
182
  );
172
183
  }
173
184
 
185
+ async getRequestLogsByConversationId(
186
+ conversationId: string,
187
+ ): Promise<LogRow[]> {
188
+ const aid = await this.assistantId();
189
+ const sql = `SELECT
190
+ id,
191
+ conversation_id,
192
+ message_id,
193
+ provider,
194
+ request_payload,
195
+ response_payload,
196
+ toUnixTimestamp64Milli(created_at) AS created_at,
197
+ agent_loop_exit_reason,
198
+ call_site
199
+ FROM ${this.tableRef()}
200
+ WHERE assistant_id = {assistant_id:String}
201
+ AND conversation_id = {conversation_id:String}
202
+ ORDER BY created_at ASC, id ASC
203
+ LIMIT 1 BY id
204
+ FORMAT JSONEachRow`;
205
+ const rows = await this.exec(sql, {
206
+ assistant_id: aid,
207
+ conversation_id: conversationId,
208
+ });
209
+ return rows.map((r) => this.toLogRow(r));
210
+ }
211
+
174
212
  private async selectByMessageIds(ids: string[]): Promise<LogRow[]> {
175
213
  if (ids.length === 0) return [];
176
214
  const aid = await this.assistantId();
@@ -197,7 +235,8 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
197
235
  request_payload,
198
236
  response_payload,
199
237
  toUnixTimestamp64Milli(created_at) AS created_at,
200
- agent_loop_exit_reason
238
+ agent_loop_exit_reason,
239
+ call_site
201
240
  FROM ${this.tableRef()}
202
241
  WHERE assistant_id = {assistant_id:String}
203
242
  AND message_id IN (${placeholders.join(",")})
@@ -288,6 +327,7 @@ export class ClickHouseLlmRequestLogSource implements LlmRequestLogSource {
288
327
  createdAt: Number(row.created_at),
289
328
  agentLoopExitReason:
290
329
  row.agent_loop_exit_reason === "" ? null : row.agent_loop_exit_reason,
330
+ callSite: row.call_site === "" ? null : row.call_site,
291
331
  };
292
332
  }
293
333
 
@@ -11,6 +11,7 @@
11
11
  import type { LlmRequestLogSource } from "./llm-request-log-source.js";
12
12
  import {
13
13
  getRequestLogById,
14
+ getRequestLogsByConversationId,
14
15
  getRequestLogsByMessageId,
15
16
  type LogRow,
16
17
  } from "./llm-request-log-store.js";
@@ -23,4 +24,10 @@ export class LocalLlmRequestLogSource implements LlmRequestLogSource {
23
24
  async getRequestLogsByMessageId(messageId: string): Promise<LogRow[]> {
24
25
  return getRequestLogsByMessageId(messageId);
25
26
  }
27
+
28
+ async getRequestLogsByConversationId(
29
+ conversationId: string,
30
+ ): Promise<LogRow[]> {
31
+ return getRequestLogsByConversationId(conversationId);
32
+ }
26
33
  }
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Pluggable read source for LLM request logs.
3
3
  *
4
- * The Inspector view at `GET /v1/messages/:id/llm-context` (and the
5
- * single-log payload route) historically read directly from the local
4
+ * The Inspector views at `GET /v1/messages/:id/llm-context` and
5
+ * `GET /v1/conversations/llm-context` (plus the single-log payload route) historically read directly from the local
6
6
  * SQLite `llm_request_logs` table via `llm-request-log-store.ts`. The
7
7
  * source-of-truth remains local, but the *read path* is now configurable
8
8
  * via `llmRequestLogs.readSource` in workspace config.
@@ -31,6 +31,13 @@ export interface LlmRequestLogSource {
31
31
  * INSERT-only against the source-of-truth).
32
32
  */
33
33
  getRequestLogsByMessageId(messageId: string): Promise<LogRow[]>;
34
+
35
+ /**
36
+ * Fetch every LLM request log associated with the given conversation.
37
+ * This is the conversation-wide inspector read path: linked, unlinked,
38
+ * and orphaned logs are all included because they share conversation_id.
39
+ */
40
+ getRequestLogsByConversationId(conversationId: string): Promise<LogRow[]>;
34
41
  }
35
42
 
36
43
  /**
@@ -1,6 +1,7 @@
1
- import { and, desc, eq, gte, inArray, isNull, lte, sql } from "drizzle-orm";
1
+ import { and, asc, desc, eq, gte, inArray, isNull, lte, sql } from "drizzle-orm";
2
2
  import { v4 as uuid } from "uuid";
3
3
 
4
+ import type { LLMCallSite } from "../config/schemas/llm.js";
4
5
  import { AssistantError, ProviderError } from "../util/errors.js";
5
6
  import {
6
7
  getAssistantMessageIdsInTurn,
@@ -26,6 +27,12 @@ export type LogRow = {
26
27
  * `AgentLoopExitReason` in `agent/loop.ts`.
27
28
  */
28
29
  agentLoopExitReason: string | null;
30
+ /**
31
+ * Logical call site that produced this row — `mainAgent`,
32
+ * `compactionAgent`, etc. NULL on pre-migration-264 rows (no backfill).
33
+ * In practice values come from `LLMCallSite` (`config/schemas/llm.ts`).
34
+ */
35
+ callSite: string | null;
29
36
  };
30
37
 
31
38
  /**
@@ -73,6 +80,7 @@ export function recordRequestLog(
73
80
  responsePayload: string,
74
81
  messageId?: string,
75
82
  provider?: string,
83
+ callSite?: LLMCallSite,
76
84
  ): string {
77
85
  const db = getDb();
78
86
  const id = uuid();
@@ -88,6 +96,10 @@ export function recordRequestLog(
88
96
  // Stamped later via setAgentLoopExitReasonOnLatestLog, once the
89
97
  // agent loop body actually exits. Intermediate rows stay NULL.
90
98
  agentLoopExitReason: null,
99
+ // Logical call site (`mainAgent`, `compactionAgent`, …). NULL when
100
+ // a caller hasn't been updated yet — preserves backward compat
101
+ // while we plumb call sites through one site at a time.
102
+ callSite: callSite ?? null,
91
103
  })
92
104
  .run();
93
105
  return id;
@@ -182,6 +194,7 @@ function selectLogsByMessageIds(messageIds: string[]): LogRow[] {
182
194
  responsePayload: llmRequestLogs.responsePayload,
183
195
  createdAt: llmRequestLogs.createdAt,
184
196
  agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
197
+ callSite: llmRequestLogs.callSite,
185
198
  })
186
199
  .from(llmRequestLogs)
187
200
  .where(inArray(llmRequestLogs.messageId, messageIds))
@@ -189,6 +202,32 @@ function selectLogsByMessageIds(messageIds: string[]): LogRow[] {
189
202
  .all();
190
203
  }
191
204
 
205
+ /**
206
+ * Query every LLM request log recorded for a conversation, ordered by
207
+ * creation time. Conversation-scoped inspector views intentionally do
208
+ * not apply turn recovery: the `conversation_id` column already includes
209
+ * linked, unlinked, and orphaned rows for the full conversation.
210
+ */
211
+ export function getRequestLogsByConversationId(conversationId: string): LogRow[] {
212
+ const db = getDb();
213
+ return db
214
+ .select({
215
+ id: llmRequestLogs.id,
216
+ conversationId: llmRequestLogs.conversationId,
217
+ messageId: llmRequestLogs.messageId,
218
+ provider: llmRequestLogs.provider,
219
+ requestPayload: llmRequestLogs.requestPayload,
220
+ responsePayload: llmRequestLogs.responsePayload,
221
+ createdAt: llmRequestLogs.createdAt,
222
+ agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
223
+ callSite: llmRequestLogs.callSite,
224
+ })
225
+ .from(llmRequestLogs)
226
+ .where(eq(llmRequestLogs.conversationId, conversationId))
227
+ .orderBy(asc(llmRequestLogs.createdAt), asc(llmRequestLogs.id))
228
+ .all();
229
+ }
230
+
192
231
  /**
193
232
  * Find orphaned logs — logs whose `message_id` references a message that no
194
233
  * longer exists in the DB. These are left behind when intermediate assistant
@@ -214,6 +253,7 @@ function selectOrphanedLogsInRange(
214
253
  responsePayload: llmRequestLogs.responsePayload,
215
254
  createdAt: llmRequestLogs.createdAt,
216
255
  agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
256
+ callSite: llmRequestLogs.callSite,
217
257
  })
218
258
  .from(llmRequestLogs)
219
259
  .leftJoin(messages, eq(llmRequestLogs.messageId, messages.id))
@@ -255,6 +295,7 @@ function selectUnlinkedLogsInRange(
255
295
  responsePayload: llmRequestLogs.responsePayload,
256
296
  createdAt: llmRequestLogs.createdAt,
257
297
  agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
298
+ callSite: llmRequestLogs.callSite,
258
299
  })
259
300
  .from(llmRequestLogs)
260
301
  .where(
@@ -282,6 +323,7 @@ export function getRequestLogById(logId: string): LogRow | null {
282
323
  responsePayload: llmRequestLogs.responsePayload,
283
324
  createdAt: llmRequestLogs.createdAt,
284
325
  agentLoopExitReason: llmRequestLogs.agentLoopExitReason,
326
+ callSite: llmRequestLogs.callSite,
285
327
  })
286
328
  .from(llmRequestLogs)
287
329
  .where(eq(llmRequestLogs.id, logId))
@@ -57,6 +57,7 @@ export function recordUsageEvent(
57
57
  outputTokens: event.outputTokens,
58
58
  cacheCreationInputTokens: event.cacheCreationInputTokens,
59
59
  cacheReadInputTokens: event.cacheReadInputTokens,
60
+ rawUsage: event.rawUsage === null ? null : JSON.stringify(event.rawUsage),
60
61
  estimatedCostUsd: event.estimatedCostUsd,
61
62
  pricingStatus: event.pricingStatus,
62
63
  llmCallCount: event.llmCallCount ?? 1,
@@ -87,6 +88,7 @@ function rowToUsageEvent(row: {
87
88
  outputTokens: number;
88
89
  cacheCreationInputTokens: number | null;
89
90
  cacheReadInputTokens: number | null;
91
+ rawUsage: string | null;
90
92
  estimatedCostUsd: number | null;
91
93
  pricingStatus: string;
92
94
  }): UsageEvent {
@@ -107,11 +109,32 @@ function rowToUsageEvent(row: {
107
109
  outputTokens: row.outputTokens,
108
110
  cacheCreationInputTokens: row.cacheCreationInputTokens,
109
111
  cacheReadInputTokens: row.cacheReadInputTokens,
112
+ rawUsage: parseRawUsage(row.rawUsage),
110
113
  estimatedCostUsd: row.estimatedCostUsd,
111
114
  pricingStatus: row.pricingStatus as "priced" | "unpriced",
112
115
  };
113
116
  }
114
117
 
118
+ /**
119
+ * Parse the JSON-serialized provider usage payload stored in `raw_usage`.
120
+ * Returns `null` for missing or malformed values; malformed JSON is logged
121
+ * and discarded rather than failing the read, because callers (admin
122
+ * dashboards, telemetry forwarders) treat `raw_usage` as opaque diagnostic
123
+ * data and shouldn't be blocked by a single corrupt row.
124
+ */
125
+ function parseRawUsage(value: string | null): Record<string, unknown> | null {
126
+ if (value === null) return null;
127
+ try {
128
+ const parsed = JSON.parse(value);
129
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
130
+ return parsed as Record<string, unknown>;
131
+ }
132
+ return null;
133
+ } catch {
134
+ return null;
135
+ }
136
+ }
137
+
115
138
  export function listUsageEvents(options?: { limit?: number }): UsageEvent[] {
116
139
  const db = getDb();
117
140
  const rows = db
@@ -187,6 +210,7 @@ export function queryUnreportedUsageEvents(
187
210
  outputTokens: llmUsageEvents.outputTokens,
188
211
  cacheCreationInputTokens: llmUsageEvents.cacheCreationInputTokens,
189
212
  cacheReadInputTokens: llmUsageEvents.cacheReadInputTokens,
213
+ rawUsage: llmUsageEvents.rawUsage,
190
214
  estimatedCostUsd: llmUsageEvents.estimatedCostUsd,
191
215
  pricingStatus: llmUsageEvents.pricingStatus,
192
216
  conversationType: conversations.conversationType,
@@ -5,9 +5,37 @@
5
5
  */
6
6
  export const MEMORY_RETROSPECTIVE_SOURCE = "memory-retrospective";
7
7
 
8
+ /**
9
+ * Sentinel value for the `source` column of fork-based memory-retrospective
10
+ * conversations (the new `memory-retrospective-fork` flag path). Distinct
11
+ * from MEMORY_RETROSPECTIVE_SOURCE so dedup can scope its message scan to the
12
+ * post-fork tail — fork-kind rows carry the full source prefix and would
13
+ * otherwise pollute prior-remember dedup with source-inline `remember` calls.
14
+ */
15
+ export const MEMORY_RETROSPECTIVE_FORK_SOURCE = "memory-retrospective-fork";
16
+
17
+ /**
18
+ * Union of both retrospective source sentinels. Use when looking up the most
19
+ * recent retrospective for a source conversation (either kind is valid) or
20
+ * when filtering retrospective bg conversations out of recursion queries.
21
+ */
22
+ export const MEMORY_RETROSPECTIVE_SOURCES: readonly string[] = [
23
+ MEMORY_RETROSPECTIVE_SOURCE,
24
+ MEMORY_RETROSPECTIVE_FORK_SOURCE,
25
+ ];
26
+
8
27
  /**
9
28
  * Dedicated `group_id` value for memory-retrospective background
10
29
  * conversations. Placed under `system:background` alongside auto-analysis,
11
30
  * heartbeat, and filing conversations.
12
31
  */
13
32
  export const MEMORY_RETROSPECTIVE_GROUP_ID = "system:background";
33
+
34
+ /**
35
+ * `metadata.kind` value stamped on the user-role instruction message that
36
+ * fork-based retrospectives append to the forked conversation. Used purely
37
+ * for observability — operators inspecting a retrospective fork's history
38
+ * can tell the user-role message apart from a real user turn.
39
+ */
40
+ export const MEMORY_RETROSPECTIVE_INSTRUCTION_KIND =
41
+ "memory_retrospective_instruction";
@@ -19,8 +19,11 @@ import {
19
19
  } from "../runtime/actor-trust-resolver.js";
20
20
  import { getLogger } from "../util/logger.js";
21
21
  import { getConversationSource } from "./conversation-crud.js";
22
- import { upsertMemoryRetrospectiveJob } from "./jobs-store.js";
23
- import { MEMORY_RETROSPECTIVE_SOURCE } from "./memory-retrospective-constants.js";
22
+ import {
23
+ isMemoryEnabled,
24
+ upsertMemoryRetrospectiveJob,
25
+ } from "./jobs-store.js";
26
+ import { MEMORY_RETROSPECTIVE_SOURCES } from "./memory-retrospective-constants.js";
24
27
 
25
28
  const log = getLogger("memory-retrospective-enqueue");
26
29
 
@@ -38,6 +41,10 @@ export function enqueueMemoryRetrospectiveIfEnabled(args: {
38
41
  }): void {
39
42
  const { conversationId, trigger } = args;
40
43
 
44
+ if (!isMemoryEnabled()) {
45
+ return;
46
+ }
47
+
41
48
  if (isMemoryRetrospectiveConversation(conversationId)) {
42
49
  log.debug(
43
50
  { conversationId, trigger },
@@ -67,7 +74,8 @@ export function enqueueMemoryRetrospectiveIfEnabled(args: {
67
74
  export function isMemoryRetrospectiveConversation(
68
75
  conversationId: string,
69
76
  ): boolean {
70
- return getConversationSource(conversationId) === MEMORY_RETROSPECTIVE_SOURCE;
77
+ const source = getConversationSource(conversationId);
78
+ return source !== null && MEMORY_RETROSPECTIVE_SOURCES.includes(source);
71
79
  }
72
80
 
73
81
  /**