@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
@@ -0,0 +1,47 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+ import { getSqliteFrom } from "../db-connection.js";
3
+
4
+ /**
5
+ * Create the `document_comments` table for inline and document-level comments.
6
+ *
7
+ * Supports threaded replies via `parent_comment_id` and resolution tracking
8
+ * via `status`, `resolved_by`, and `resolved_at`. The FK on `surface_id`
9
+ * cascades deletes from `documents` — when a document is removed, all its
10
+ * comments are cleaned up automatically.
11
+ *
12
+ * Idempotent — re-running is a no-op once the table and indices exist.
13
+ */
14
+ export function migrateCreateDocumentComments(database: DrizzleDb): void {
15
+ const raw = getSqliteFrom(database);
16
+
17
+ raw.exec(/*sql*/ `
18
+ CREATE TABLE IF NOT EXISTS document_comments (
19
+ id TEXT PRIMARY KEY,
20
+ surface_id TEXT NOT NULL,
21
+ conversation_id TEXT NOT NULL,
22
+ author TEXT NOT NULL,
23
+ content TEXT NOT NULL,
24
+ anchor_start INTEGER,
25
+ anchor_end INTEGER,
26
+ anchor_text TEXT,
27
+ parent_comment_id TEXT,
28
+ status TEXT NOT NULL DEFAULT 'open',
29
+ resolved_by TEXT,
30
+ resolved_at INTEGER,
31
+ created_at INTEGER NOT NULL,
32
+ updated_at INTEGER NOT NULL,
33
+ FOREIGN KEY (surface_id) REFERENCES documents(surface_id) ON DELETE CASCADE,
34
+ FOREIGN KEY (parent_comment_id) REFERENCES document_comments(id) ON DELETE CASCADE
35
+ )
36
+ `);
37
+
38
+ raw.exec(/*sql*/ `
39
+ CREATE INDEX IF NOT EXISTS idx_document_comments_surface
40
+ ON document_comments(surface_id)
41
+ `);
42
+
43
+ raw.exec(/*sql*/ `
44
+ CREATE INDEX IF NOT EXISTS idx_document_comments_parent
45
+ ON document_comments(parent_comment_id)
46
+ `);
47
+ }
@@ -0,0 +1,43 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+ import { tableHasColumn } from "./schema-introspection.js";
3
+ import { withCrashRecovery } from "./validate-migration-state.js";
4
+
5
+ const CHECKPOINT_KEY = "migration_external_conversation_binding_chat_name_v1";
6
+
7
+ export function migrateExternalConversationBindingChatName(
8
+ database: DrizzleDb,
9
+ ): void {
10
+ withCrashRecovery(database, CHECKPOINT_KEY, () => {
11
+ if (
12
+ tableHasColumn(
13
+ database,
14
+ "external_conversation_bindings",
15
+ "external_chat_name",
16
+ )
17
+ ) {
18
+ return;
19
+ }
20
+
21
+ database.run(
22
+ `ALTER TABLE external_conversation_bindings ADD COLUMN external_chat_name TEXT`,
23
+ );
24
+ });
25
+ }
26
+
27
+ export function downExternalConversationBindingChatName(
28
+ database: DrizzleDb,
29
+ ): void {
30
+ if (
31
+ !tableHasColumn(
32
+ database,
33
+ "external_conversation_bindings",
34
+ "external_chat_name",
35
+ )
36
+ ) {
37
+ return;
38
+ }
39
+
40
+ database.run(
41
+ `ALTER TABLE external_conversation_bindings DROP COLUMN external_chat_name`,
42
+ );
43
+ }
@@ -0,0 +1,24 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+ import { getSqliteFrom } from "../db-connection.js";
3
+ import { tableHasColumn } from "./schema-introspection.js";
4
+ import { withCrashRecovery } from "./validate-migration-state.js";
5
+
6
+ const CHECKPOINT_KEY = "migration_channel_inbound_delivery_attempts_v1";
7
+
8
+ /** Add a delivery-specific retry counter for channel inbound events. */
9
+ export function migrateChannelInboundDeliveryAttempts(
10
+ database: DrizzleDb,
11
+ ): void {
12
+ withCrashRecovery(database, CHECKPOINT_KEY, () => {
13
+ if (
14
+ tableHasColumn(database, "channel_inbound_events", "delivery_attempts")
15
+ ) {
16
+ return;
17
+ }
18
+ const raw = getSqliteFrom(database);
19
+ raw.exec(/*sql*/ `
20
+ ALTER TABLE channel_inbound_events
21
+ ADD COLUMN delivery_attempts INTEGER NOT NULL DEFAULT 0
22
+ `);
23
+ });
24
+ }
@@ -0,0 +1,113 @@
1
+ import { getLogger } from "../../util/logger.js";
2
+ import type { DrizzleDb } from "../db-connection.js";
3
+ import { getSqliteFrom } from "../db-connection.js";
4
+ import { withCrashRecovery } from "./validate-migration-state.js";
5
+
6
+ const CHECKPOINT_KEY = "migration_memory_v2_injection_events_v1";
7
+ const log = getLogger("memory-v2-injection-events-migration");
8
+
9
+ /**
10
+ * Create the memory_v2_injection_events table — an append-only event log of
11
+ * (slug, injected_at) tuples capturing every router selection.
12
+ *
13
+ * This is the data source for the time-decayed injection frequency score
14
+ * that drives tier 2 assignment in memory router v4. Score is computed on
15
+ * read as `Σ exp(-λ × (now - tᵢ))` with `λ = ln(2) / 3 days`, so the table
16
+ * just accumulates raw events; the formula or half-life can change later
17
+ * without losing signal.
18
+ *
19
+ * Backfill: walks existing `memory_v2_activation_logs` and replays each
20
+ * row's router-sourced slugs as historical events. Without backfill the
21
+ * scores would take ~3 half-lives (≈9 days) to reach steady state; with
22
+ * backfill tier 2 assignment has signal from day one.
23
+ *
24
+ * Indexes:
25
+ * - `(slug, injected_at)` for per-slug score reads (the hot path).
26
+ * - `(injected_at)` for time-range pruning later.
27
+ */
28
+ export function migrateMemoryV2InjectionEvents(database: DrizzleDb): void {
29
+ withCrashRecovery(database, CHECKPOINT_KEY, () => {
30
+ const raw = getSqliteFrom(database);
31
+ raw.exec(/*sql*/ `
32
+ CREATE TABLE IF NOT EXISTS memory_v2_injection_events (
33
+ id INTEGER PRIMARY KEY,
34
+ slug TEXT NOT NULL,
35
+ injected_at INTEGER NOT NULL
36
+ )
37
+ `);
38
+ raw.exec(/*sql*/ `
39
+ CREATE INDEX IF NOT EXISTS idx_memory_v2_injection_events_slug_time
40
+ ON memory_v2_injection_events (slug, injected_at)
41
+ `);
42
+ raw.exec(/*sql*/ `
43
+ CREATE INDEX IF NOT EXISTS idx_memory_v2_injection_events_time
44
+ ON memory_v2_injection_events (injected_at)
45
+ `);
46
+
47
+ // Bail before backfill on databases that predate memory_v2_activation_logs
48
+ // (migration 234) — there's no historical signal to replay.
49
+ const logsTable = raw
50
+ .query(
51
+ `SELECT name FROM sqlite_master WHERE type='table' AND name='memory_v2_activation_logs'`,
52
+ )
53
+ .get();
54
+ if (!logsTable) return;
55
+
56
+ // Re-run safety net independent of the checkpoint: if events already
57
+ // exist, do not append duplicates. The checkpoint normally short-circuits
58
+ // re-runs in withCrashRecovery; this guards the manual-clear path.
59
+ const existing = raw
60
+ .query(`SELECT COUNT(*) as n FROM memory_v2_injection_events`)
61
+ .get() as { n: number };
62
+ if (existing.n > 0) return;
63
+
64
+ const rows = raw
65
+ .query(
66
+ `SELECT concepts_json, created_at FROM memory_v2_activation_logs ORDER BY created_at ASC`,
67
+ )
68
+ .all() as Array<{ concepts_json: string; created_at: number }>;
69
+ if (rows.length === 0) return;
70
+
71
+ const insert = raw.prepare(
72
+ `INSERT INTO memory_v2_injection_events (slug, injected_at) VALUES (?, ?)`,
73
+ );
74
+ const replay = raw.transaction(
75
+ (events: ReadonlyArray<{ slug: string; t: number }>) => {
76
+ for (const e of events) insert.run(e.slug, e.t);
77
+ },
78
+ );
79
+
80
+ const buffer: Array<{ slug: string; t: number }> = [];
81
+ let parseFailures = 0;
82
+ for (const row of rows) {
83
+ let concepts: Array<{ slug?: unknown; source?: unknown }>;
84
+ try {
85
+ concepts = JSON.parse(row.concepts_json) as Array<{
86
+ slug?: unknown;
87
+ source?: unknown;
88
+ }>;
89
+ } catch {
90
+ parseFailures += 1;
91
+ continue;
92
+ }
93
+ if (!Array.isArray(concepts)) continue;
94
+ for (const c of concepts) {
95
+ if (typeof c.slug !== "string") continue;
96
+ // Carry-over entries were not router-selected this turn — exclude.
97
+ if (c.source !== "router") continue;
98
+ buffer.push({ slug: c.slug, t: row.created_at });
99
+ }
100
+ }
101
+
102
+ if (buffer.length > 0) replay(buffer);
103
+ log.info(
104
+ { inserted: buffer.length, rowsScanned: rows.length, parseFailures },
105
+ `Backfilled ${buffer.length} injection events from ${rows.length} activation log rows`,
106
+ );
107
+ });
108
+ }
109
+
110
+ export function downMemoryV2InjectionEvents(database: DrizzleDb): void {
111
+ const raw = getSqliteFrom(database);
112
+ raw.exec(/*sql*/ `DROP TABLE IF EXISTS memory_v2_injection_events`);
113
+ }
@@ -0,0 +1,22 @@
1
+ import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
2
+
3
+ /**
4
+ * Strip `base_url` from provider connections whose provider is NOT
5
+ * `openai-compatible`. These values should never have been accepted — the
6
+ * route layer now rejects them, but existing rows may still carry one from
7
+ * before the validation was added. Setting it to NULL prevents
8
+ * API-key exfiltration via a redirected base URL.
9
+ *
10
+ * Idempotent — re-running is a no-op once all non-openai-compatible rows
11
+ * already have NULL base_url.
12
+ */
13
+ export function migrateStripBaseUrlNonOpenaiCompatible(
14
+ database: DrizzleDb,
15
+ ): void {
16
+ const raw = getSqliteFrom(database);
17
+
18
+ // Only clear base_url on rows where provider is NOT openai-compatible.
19
+ raw.exec(
20
+ `UPDATE provider_connections SET base_url = NULL WHERE provider != 'openai-compatible' AND base_url IS NOT NULL`,
21
+ );
22
+ }
@@ -0,0 +1,13 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+
3
+ export function migrateOnboardingEventsPriorAssistants(
4
+ database: DrizzleDb,
5
+ ): void {
6
+ try {
7
+ database.run(
8
+ /*sql*/ `ALTER TABLE onboarding_events ADD COLUMN prior_assistants_json TEXT`,
9
+ );
10
+ } catch {
11
+ /* already exists */
12
+ }
13
+ }
@@ -0,0 +1,33 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+ import { tableHasColumn } from "./schema-introspection.js";
3
+ import { withCrashRecovery } from "./validate-migration-state.js";
4
+
5
+ const CHECKPOINT_KEY = "migration_conversation_cleaned_at_v1";
6
+
7
+ const COLUMN_NAME = "cleaned_at";
8
+ const COLUMN_DEFINITION = "cleaned_at INTEGER";
9
+
10
+ /**
11
+ * Add a `cleaned_at` timestamp to conversations.
12
+ *
13
+ * Records the moment `/clean` ran. The load path uses it to skip metadata
14
+ * reinjection (and strip injection prefixes from message content) for
15
+ * messages whose `created_at < cleaned_at`, so the clean survives daemon
16
+ * restart and conversation eviction. `forkConversation` copies the marker
17
+ * to the child only when the fork point is at-or-after the clean.
18
+ */
19
+ export function migrateConversationCleanedAt(database: DrizzleDb): void {
20
+ withCrashRecovery(database, CHECKPOINT_KEY, () => {
21
+ if (tableHasColumn(database, "conversations", COLUMN_NAME)) {
22
+ return;
23
+ }
24
+ database.run(`ALTER TABLE conversations ADD COLUMN ${COLUMN_DEFINITION}`);
25
+ });
26
+ }
27
+
28
+ export function downConversationCleanedAt(database: DrizzleDb): void {
29
+ if (!tableHasColumn(database, "conversations", COLUMN_NAME)) {
30
+ return;
31
+ }
32
+ database.run(`ALTER TABLE conversations DROP COLUMN ${COLUMN_NAME}`);
33
+ }
@@ -0,0 +1,44 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+ import { tableHasColumn } from "./schema-introspection.js";
3
+ import { withCrashRecovery } from "./validate-migration-state.js";
4
+
5
+ const CHECKPOINT_KEY = "migration_rename_cleaned_at_v1";
6
+
7
+ const OLD_COLUMN = "cleaned_at";
8
+ const NEW_COLUMN = "history_stripped_at";
9
+
10
+ /**
11
+ * Rename `conversations.cleaned_at` → `conversations.history_stripped_at`.
12
+ *
13
+ * The marker now records any injection-strip event (`/clean` or compaction),
14
+ * not just `/clean`. Renaming reflects the broader semantics; compaction
15
+ * sets it alongside its summary state instead of destructively wiping
16
+ * message metadata.
17
+ */
18
+ export function migrateRenameCleanedAt(database: DrizzleDb): void {
19
+ withCrashRecovery(database, CHECKPOINT_KEY, () => {
20
+ if (tableHasColumn(database, "conversations", NEW_COLUMN)) {
21
+ return;
22
+ }
23
+ if (!tableHasColumn(database, "conversations", OLD_COLUMN)) {
24
+ // 259 didn't run (fresh install on a newer schema where 259's column
25
+ // was added under the new name) — nothing to rename.
26
+ return;
27
+ }
28
+ database.run(
29
+ `ALTER TABLE conversations RENAME COLUMN ${OLD_COLUMN} TO ${NEW_COLUMN}`,
30
+ );
31
+ });
32
+ }
33
+
34
+ export function downRenameCleanedAt(database: DrizzleDb): void {
35
+ if (!tableHasColumn(database, "conversations", NEW_COLUMN)) {
36
+ return;
37
+ }
38
+ if (tableHasColumn(database, "conversations", OLD_COLUMN)) {
39
+ return;
40
+ }
41
+ database.run(
42
+ `ALTER TABLE conversations RENAME COLUMN ${NEW_COLUMN} TO ${OLD_COLUMN}`,
43
+ );
44
+ }
@@ -0,0 +1,36 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+ import { tableHasColumn } from "./schema-introspection.js";
3
+ import { withCrashRecovery } from "./validate-migration-state.js";
4
+
5
+ const CHECKPOINT_KEY = "migration_llm_usage_add_raw_usage_v1";
6
+
7
+ const TABLE = "llm_usage_events";
8
+ const COLUMN = "raw_usage";
9
+
10
+ /**
11
+ * Add a `raw_usage` TEXT column to `llm_usage_events` for storing the
12
+ * provider's untouched `usage` block as JSON.
13
+ *
14
+ * The Anthropic API surfaces a TTL breakdown of cache writes
15
+ * (`usage.cache_creation.ephemeral_5m_input_tokens`,
16
+ * `usage.cache_creation.ephemeral_1h_input_tokens`); OpenAI surfaces
17
+ * nested `prompt_tokens_details` and `completion_tokens_details`; both
18
+ * are kept as opaque JSON so admin charts and downstream consumers can
19
+ * extract provider-specific detail without requiring a new column every
20
+ * time a provider adds a usage field. `NULL` for rows persisted before
21
+ * this migration ran and for providers that did not return a usage
22
+ * payload.
23
+ */
24
+ export function migrateLlmUsageAddRawUsage(database: DrizzleDb): void {
25
+ withCrashRecovery(database, CHECKPOINT_KEY, () => {
26
+ if (!tableHasColumn(database, TABLE, COLUMN)) {
27
+ database.run(`ALTER TABLE ${TABLE} ADD COLUMN ${COLUMN} TEXT`);
28
+ }
29
+ });
30
+ }
31
+
32
+ export function downLlmUsageAddRawUsage(database: DrizzleDb): void {
33
+ if (tableHasColumn(database, TABLE, COLUMN)) {
34
+ database.run(`ALTER TABLE ${TABLE} DROP COLUMN ${COLUMN}`);
35
+ }
36
+ }
@@ -0,0 +1,57 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+ import { getSqliteFrom } from "../db-connection.js";
3
+ import { withCrashRecovery } from "./validate-migration-state.js";
4
+
5
+ const CHECKPOINT_KEY = "migration_memory_v3_coactivation_v1";
6
+
7
+ /**
8
+ * Create the memory_v3_coactivation table — an append-only log of
9
+ * pass-1 → pass-N co-activation pairs observed during a v3 retrieval loop.
10
+ *
11
+ * Each row records that a page (`target_slug`) first surfaced on a later
12
+ * descent pass was co-selected alongside a page (`source_slug`) that surfaced
13
+ * on pass 1, with `pass_gap` = passOf(target) − passOf(source). This is the
14
+ * raw gradient signal that edge-learning later reconciles into curated-graph
15
+ * edge weights: a source that repeatedly precedes a target across turns is a
16
+ * candidate association. `used` is the usefulness flag (0 here — the loop
17
+ * cannot know whether the target was actually load-bearing for the turn; a
18
+ * later edge-learning pass reconciles it).
19
+ *
20
+ * The table just accumulates raw events; the edge-learning formula or the
21
+ * decay/weighting can change later without losing signal.
22
+ *
23
+ * Indexes:
24
+ * - `(source_slug, target_slug)` for per-pair aggregation (the hot path for
25
+ * edge-learning reads).
26
+ * - `(created_at)` for time-range pruning later.
27
+ */
28
+ export function migrateMemoryV3Coactivation(database: DrizzleDb): void {
29
+ withCrashRecovery(database, CHECKPOINT_KEY, () => {
30
+ const raw = getSqliteFrom(database);
31
+ raw.exec(/*sql*/ `
32
+ CREATE TABLE IF NOT EXISTS memory_v3_coactivation (
33
+ id INTEGER PRIMARY KEY,
34
+ conversation_id TEXT NOT NULL,
35
+ turn INTEGER NOT NULL,
36
+ source_slug TEXT NOT NULL,
37
+ target_slug TEXT NOT NULL,
38
+ pass_gap INTEGER NOT NULL,
39
+ used INTEGER NOT NULL,
40
+ created_at INTEGER NOT NULL
41
+ )
42
+ `);
43
+ raw.exec(/*sql*/ `
44
+ CREATE INDEX IF NOT EXISTS idx_memory_v3_coactivation_pair
45
+ ON memory_v3_coactivation (source_slug, target_slug)
46
+ `);
47
+ raw.exec(/*sql*/ `
48
+ CREATE INDEX IF NOT EXISTS idx_memory_v3_coactivation_time
49
+ ON memory_v3_coactivation (created_at)
50
+ `);
51
+ });
52
+ }
53
+
54
+ export function downMemoryV3Coactivation(database: DrizzleDb): void {
55
+ const raw = getSqliteFrom(database);
56
+ raw.exec(/*sql*/ `DROP TABLE IF EXISTS memory_v3_coactivation`);
57
+ }
@@ -0,0 +1,50 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+ import { getSqliteFrom } from "../db-connection.js";
3
+ import { withCrashRecovery } from "./validate-migration-state.js";
4
+
5
+ const CHECKPOINT_KEY = "migration_memory_v3_auto_edges_v1";
6
+
7
+ /**
8
+ * Create the memory_v3_auto_edges table — the **learned** edge graph, a
9
+ * distinct class from the curated `edges:` frontmatter graph.
10
+ *
11
+ * Each row is a weighted directed association `source_slug → target_slug` that
12
+ * the edge-learning job (`memory_v3_edge_learning`) accrues from *used*
13
+ * co-activations (migration 262's `memory_v3_coactivation` rows) and decays
14
+ * over time. `weight` is a multiplicatively-decaying real; `last_reinforced_at`
15
+ * is the wall-clock ms of the most recent reinforcement, used by the decay
16
+ * pass to compute elapsed time per pair.
17
+ *
18
+ * Auto-edges are advisory: the read path consumes only above-threshold pairs
19
+ * via edge-expansion's `extraAdjacency` seam, and high-weight pairs surface as
20
+ * promotion *candidates* for the assistant to ratify into curated `edges:`
21
+ * during consolidation. This table never auto-writes page frontmatter.
22
+ *
23
+ * `PRIMARY KEY(source_slug, target_slug)` makes each ordered pair unique, so
24
+ * reinforce is a single UPSERT. The index on `(weight)` keeps the
25
+ * above-threshold scan and top-N promotion-candidate read cheap as the learned
26
+ * graph grows.
27
+ */
28
+ export function migrateMemoryV3AutoEdges(database: DrizzleDb): void {
29
+ withCrashRecovery(database, CHECKPOINT_KEY, () => {
30
+ const raw = getSqliteFrom(database);
31
+ raw.exec(/*sql*/ `
32
+ CREATE TABLE IF NOT EXISTS memory_v3_auto_edges (
33
+ source_slug TEXT NOT NULL,
34
+ target_slug TEXT NOT NULL,
35
+ weight REAL NOT NULL,
36
+ last_reinforced_at INTEGER NOT NULL,
37
+ PRIMARY KEY (source_slug, target_slug)
38
+ )
39
+ `);
40
+ raw.exec(/*sql*/ `
41
+ CREATE INDEX IF NOT EXISTS idx_memory_v3_auto_edges_weight
42
+ ON memory_v3_auto_edges (weight)
43
+ `);
44
+ });
45
+ }
46
+
47
+ export function downMemoryV3AutoEdges(database: DrizzleDb): void {
48
+ const raw = getSqliteFrom(database);
49
+ raw.exec(/*sql*/ `DROP TABLE IF EXISTS memory_v3_auto_edges`);
50
+ }
@@ -0,0 +1,29 @@
1
+ import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
2
+
3
+ /**
4
+ * Adds `call_site` (nullable TEXT) to the `llm_request_logs` table.
5
+ *
6
+ * Records the logical call site that produced the row — `mainAgent`,
7
+ * `compactionAgent`, etc. (string values from `LLMCallSite` in
8
+ * `config/schemas/llm.ts`). Lets the LLM Context Inspector and other
9
+ * observability tools filter "show me only compaction calls" without
10
+ * having to infer from request payload shape.
11
+ *
12
+ * No backfill — historical rows stay NULL ("we don't know"). New rows
13
+ * stamped at insertion time by callers of `recordRequestLog`.
14
+ *
15
+ * Idempotent — re-running is a no-op once the column exists. Modeled on
16
+ * migration 252 (`llm-request-log-agent-loop-exit-reason`).
17
+ */
18
+ export function migrateLlmRequestLogCallSite(database: DrizzleDb): void {
19
+ const raw = getSqliteFrom(database);
20
+
21
+ const columns = raw
22
+ .query(`PRAGMA table_info(llm_request_logs)`)
23
+ .all() as Array<{ name: string }>;
24
+ const columnNames = new Set(columns.map((c) => c.name));
25
+
26
+ if (!columnNames.has("call_site")) {
27
+ raw.exec(`ALTER TABLE llm_request_logs ADD COLUMN call_site TEXT`);
28
+ }
29
+ }
@@ -217,6 +217,40 @@ export {
217
217
  export { migrateProviderConnectionBaseUrlAndModels } from "./250-provider-connection-base-url-and-models.js";
218
218
  export { downA2ATasks, migrateA2ATasks } from "./251-a2a-tasks.js";
219
219
  export { migrateLlmRequestLogAgentLoopExitReason } from "./252-llm-request-log-agent-loop-exit-reason.js";
220
+ export { migrateConversationLastNotifiedProfile } from "./253-conversation-last-notified-profile.js";
221
+ export { migrateCreateDocumentComments } from "./253-document-comments.js";
222
+ export {
223
+ downExternalConversationBindingChatName,
224
+ migrateExternalConversationBindingChatName,
225
+ } from "./254-external-conversation-binding-chat-name.js";
226
+ export { migrateChannelInboundDeliveryAttempts } from "./255-channel-inbound-delivery-attempts.js";
227
+ export {
228
+ downMemoryV2InjectionEvents,
229
+ migrateMemoryV2InjectionEvents,
230
+ } from "./256-memory-v2-injection-events.js";
231
+ export { migrateStripBaseUrlNonOpenaiCompatible } from "./257-strip-base-url-non-openai-compatible.js";
232
+ export { migrateOnboardingEventsPriorAssistants } from "./258-onboarding-events-prior-assistants.js";
233
+ export {
234
+ downConversationCleanedAt,
235
+ migrateConversationCleanedAt,
236
+ } from "./259-conversation-cleaned-at.js";
237
+ export {
238
+ downRenameCleanedAt,
239
+ migrateRenameCleanedAt,
240
+ } from "./260-rename-cleaned-at.js";
241
+ export {
242
+ downLlmUsageAddRawUsage,
243
+ migrateLlmUsageAddRawUsage,
244
+ } from "./261-llm-usage-add-raw-usage.js";
245
+ export {
246
+ downMemoryV3Coactivation,
247
+ migrateMemoryV3Coactivation,
248
+ } from "./262-memory-v3-coactivation.js";
249
+ export {
250
+ downMemoryV3AutoEdges,
251
+ migrateMemoryV3AutoEdges,
252
+ } from "./263-memory-v3-auto-edges.js";
253
+ export { migrateLlmRequestLogCallSite } from "./264-llm-request-log-call-site.js";
220
254
  export {
221
255
  MIGRATION_REGISTRY,
222
256
  type MigrationRegistryEntry,
@@ -50,6 +50,13 @@ import { downToolInvocationsMatchedRuleId } from "./236-tool-invocations-matched
50
50
  import { downHeartbeatRuns } from "./237-heartbeat-runs.js";
51
51
  import { downNormalizeSlackExternalContent } from "./249-normalize-slack-external-content.js";
52
52
  import { downA2ATasks } from "./251-a2a-tasks.js";
53
+ import { downExternalConversationBindingChatName } from "./254-external-conversation-binding-chat-name.js";
54
+ import { downMemoryV2InjectionEvents } from "./256-memory-v2-injection-events.js";
55
+ import { downConversationCleanedAt } from "./259-conversation-cleaned-at.js";
56
+ import { downRenameCleanedAt } from "./260-rename-cleaned-at.js";
57
+ import { downLlmUsageAddRawUsage } from "./261-llm-usage-add-raw-usage.js";
58
+ import { downMemoryV3Coactivation } from "./262-memory-v3-coactivation.js";
59
+ import { downMemoryV3AutoEdges } from "./263-memory-v3-auto-edges.js";
53
60
 
54
61
  export interface MigrationRegistryEntry {
55
62
  /** The checkpoint key written to memory_checkpoints on completion. */
@@ -428,6 +435,57 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
428
435
  "Create a2a_tasks table for tracking A2A request/response lifecycle",
429
436
  down: downA2ATasks,
430
437
  },
438
+ {
439
+ key: "migration_external_conversation_binding_chat_name_v1",
440
+ version: 50,
441
+ description:
442
+ "Add external_chat_name to external conversation bindings for channel footer metadata",
443
+ down: downExternalConversationBindingChatName,
444
+ },
445
+ {
446
+ key: "migration_memory_v2_injection_events_v1",
447
+ version: 51,
448
+ dependsOn: ["migration_memory_v2_activation_logs_v1"],
449
+ description:
450
+ "Create memory_v2_injection_events table and backfill from activation logs for EMA-based tier 2 routing",
451
+ down: downMemoryV2InjectionEvents,
452
+ },
453
+ {
454
+ key: "migration_conversation_cleaned_at_v1",
455
+ version: 52,
456
+ description:
457
+ "Add cleaned_at timestamp to conversations so /clean survives reload and forks inherit conditionally on fork point",
458
+ down: downConversationCleanedAt,
459
+ },
460
+ {
461
+ key: "migration_rename_cleaned_at_v1",
462
+ version: 53,
463
+ dependsOn: ["migration_conversation_cleaned_at_v1"],
464
+ description:
465
+ "Rename conversations.cleaned_at to history_stripped_at; the marker now records any injection-strip event (including compaction), not just /clean",
466
+ down: downRenameCleanedAt,
467
+ },
468
+ {
469
+ key: "migration_llm_usage_add_raw_usage_v1",
470
+ version: 54,
471
+ description:
472
+ "Add raw_usage TEXT column to llm_usage_events for storing the provider's untouched usage block as JSON (Anthropic TTL breakdown, OpenAI prompt/completion token details, etc.) so downstream consumers can extract provider-specific detail without per-field schema changes",
473
+ down: downLlmUsageAddRawUsage,
474
+ },
475
+ {
476
+ key: "migration_memory_v3_coactivation_v1",
477
+ version: 55,
478
+ description:
479
+ "Create memory_v3_coactivation table — append-only log of pass-1 → pass-N co-activation pairs (gradient signal) emitted by the v3 retrieval loop and reconciled later by edge-learning",
480
+ down: downMemoryV3Coactivation,
481
+ },
482
+ {
483
+ key: "migration_memory_v3_auto_edges_v1",
484
+ version: 56,
485
+ description:
486
+ "Create memory_v3_auto_edges table — weighted, decaying learned association graph (distinct from curated edges:) accrued by the edge-learning job from used co-activations and consumed above-threshold by edge expansion",
487
+ down: downMemoryV3AutoEdges,
488
+ },
431
489
  ];
432
490
 
433
491
  export function getMaxMigrationVersion(): number {
@@ -14,6 +14,7 @@ export interface OnboardingEvent {
14
14
  tone: string | null;
15
15
  googleConnected: boolean | null;
16
16
  googleScopesJson: string | null;
17
+ priorAssistantsJson: string | null;
17
18
  abVariant: string | null;
18
19
  }
19
20
 
@@ -24,6 +25,7 @@ export interface RecordOnboardingEventParams {
24
25
  tone?: string;
25
26
  googleConnected?: boolean;
26
27
  googleScopes?: string[];
28
+ priorAssistants?: string[];
27
29
  abVariant?: string;
28
30
  }
29
31
 
@@ -47,6 +49,9 @@ export function recordOnboardingEvent(
47
49
  googleScopesJson: params.googleScopes
48
50
  ? JSON.stringify(params.googleScopes)
49
51
  : null,
52
+ priorAssistantsJson: params.priorAssistants
53
+ ? JSON.stringify(params.priorAssistants)
54
+ : null,
50
55
  abVariant: params.abVariant ?? null,
51
56
  };
52
57
  db.insert(onboardingEvents)
@@ -59,6 +64,7 @@ export function recordOnboardingEvent(
59
64
  tone: event.tone,
60
65
  googleConnected: event.googleConnected,
61
66
  googleScopesJson: event.googleScopesJson,
67
+ priorAssistantsJson: event.priorAssistantsJson,
62
68
  abVariant: event.abVariant,
63
69
  })
64
70
  .run();
@@ -85,6 +91,7 @@ export function queryUnreportedOnboardingEvents(
85
91
  tone: onboardingEvents.tone,
86
92
  googleConnected: onboardingEvents.googleConnected,
87
93
  googleScopesJson: onboardingEvents.googleScopesJson,
94
+ priorAssistantsJson: onboardingEvents.priorAssistantsJson,
88
95
  abVariant: onboardingEvents.abVariant,
89
96
  })
90
97
  .from(onboardingEvents)