@vellumai/assistant 0.10.0 → 0.10.1-staging.1

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 (824) hide show
  1. package/ARCHITECTURE.md +36 -37
  2. package/bun.lock +3 -0
  3. package/docs/workflows.md +12 -7
  4. package/eslint-rules/cli-no-daemon-internals.js +6 -0
  5. package/node_modules/@slack/types/LICENSE +23 -0
  6. package/node_modules/@slack/types/README.md +32 -0
  7. package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts +953 -0
  8. package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts.map +1 -0
  9. package/node_modules/@slack/types/dist/block-kit/block-elements.js +4 -0
  10. package/node_modules/@slack/types/dist/block-kit/block-elements.js.map +1 -0
  11. package/node_modules/@slack/types/dist/block-kit/blocks.d.ts +474 -0
  12. package/node_modules/@slack/types/dist/block-kit/blocks.d.ts.map +1 -0
  13. package/node_modules/@slack/types/dist/block-kit/blocks.js +3 -0
  14. package/node_modules/@slack/types/dist/block-kit/blocks.js.map +1 -0
  15. package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts +237 -0
  16. package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts.map +1 -0
  17. package/node_modules/@slack/types/dist/block-kit/composition-objects.js +4 -0
  18. package/node_modules/@slack/types/dist/block-kit/composition-objects.js.map +1 -0
  19. package/node_modules/@slack/types/dist/block-kit/extensions.d.ts +88 -0
  20. package/node_modules/@slack/types/dist/block-kit/extensions.d.ts.map +1 -0
  21. package/node_modules/@slack/types/dist/block-kit/extensions.js +3 -0
  22. package/node_modules/@slack/types/dist/block-kit/extensions.js.map +1 -0
  23. package/node_modules/@slack/types/dist/calls.d.ts +26 -0
  24. package/node_modules/@slack/types/dist/calls.d.ts.map +1 -0
  25. package/node_modules/@slack/types/dist/calls.js +6 -0
  26. package/node_modules/@slack/types/dist/calls.js.map +1 -0
  27. package/node_modules/@slack/types/dist/chunk.d.ts +52 -0
  28. package/node_modules/@slack/types/dist/chunk.d.ts.map +1 -0
  29. package/node_modules/@slack/types/dist/chunk.js +3 -0
  30. package/node_modules/@slack/types/dist/chunk.js.map +1 -0
  31. package/node_modules/@slack/types/dist/common/bot-profile.d.ts +12 -0
  32. package/node_modules/@slack/types/dist/common/bot-profile.d.ts.map +1 -0
  33. package/node_modules/@slack/types/dist/common/bot-profile.js +3 -0
  34. package/node_modules/@slack/types/dist/common/bot-profile.js.map +1 -0
  35. package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts +6 -0
  36. package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts.map +1 -0
  37. package/node_modules/@slack/types/dist/common/status-emoji-display-info.js +3 -0
  38. package/node_modules/@slack/types/dist/common/status-emoji-display-info.js.map +1 -0
  39. package/node_modules/@slack/types/dist/dialog.d.ts +36 -0
  40. package/node_modules/@slack/types/dist/dialog.d.ts.map +1 -0
  41. package/node_modules/@slack/types/dist/dialog.js +3 -0
  42. package/node_modules/@slack/types/dist/dialog.js.map +1 -0
  43. package/node_modules/@slack/types/dist/events/app.d.ts +204 -0
  44. package/node_modules/@slack/types/dist/events/app.d.ts.map +1 -0
  45. package/node_modules/@slack/types/dist/events/app.js +3 -0
  46. package/node_modules/@slack/types/dist/events/app.js.map +1 -0
  47. package/node_modules/@slack/types/dist/events/assistant.d.ts +29 -0
  48. package/node_modules/@slack/types/dist/events/assistant.d.ts.map +1 -0
  49. package/node_modules/@slack/types/dist/events/assistant.js +3 -0
  50. package/node_modules/@slack/types/dist/events/assistant.js.map +1 -0
  51. package/node_modules/@slack/types/dist/events/call.d.ts +8 -0
  52. package/node_modules/@slack/types/dist/events/call.d.ts.map +1 -0
  53. package/node_modules/@slack/types/dist/events/call.js +3 -0
  54. package/node_modules/@slack/types/dist/events/call.js.map +1 -0
  55. package/node_modules/@slack/types/dist/events/channel.d.ts +85 -0
  56. package/node_modules/@slack/types/dist/events/channel.d.ts.map +1 -0
  57. package/node_modules/@slack/types/dist/events/channel.js +3 -0
  58. package/node_modules/@slack/types/dist/events/channel.js.map +1 -0
  59. package/node_modules/@slack/types/dist/events/dnd.d.ts +24 -0
  60. package/node_modules/@slack/types/dist/events/dnd.d.ts.map +1 -0
  61. package/node_modules/@slack/types/dist/events/dnd.js +3 -0
  62. package/node_modules/@slack/types/dist/events/dnd.js.map +1 -0
  63. package/node_modules/@slack/types/dist/events/email.d.ts +6 -0
  64. package/node_modules/@slack/types/dist/events/email.d.ts.map +1 -0
  65. package/node_modules/@slack/types/dist/events/email.js +3 -0
  66. package/node_modules/@slack/types/dist/events/email.js.map +1 -0
  67. package/node_modules/@slack/types/dist/events/emoji.d.ts +11 -0
  68. package/node_modules/@slack/types/dist/events/emoji.d.ts.map +1 -0
  69. package/node_modules/@slack/types/dist/events/emoji.js +3 -0
  70. package/node_modules/@slack/types/dist/events/emoji.js.map +1 -0
  71. package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts +21 -0
  72. package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts.map +1 -0
  73. package/node_modules/@slack/types/dist/events/entity-details-requested.js +3 -0
  74. package/node_modules/@slack/types/dist/events/entity-details-requested.js.map +1 -0
  75. package/node_modules/@slack/types/dist/events/file.d.ts +60 -0
  76. package/node_modules/@slack/types/dist/events/file.d.ts.map +1 -0
  77. package/node_modules/@slack/types/dist/events/file.js +4 -0
  78. package/node_modules/@slack/types/dist/events/file.js.map +1 -0
  79. package/node_modules/@slack/types/dist/events/function.d.ts +33 -0
  80. package/node_modules/@slack/types/dist/events/function.d.ts.map +1 -0
  81. package/node_modules/@slack/types/dist/events/function.js +3 -0
  82. package/node_modules/@slack/types/dist/events/function.js.map +1 -0
  83. package/node_modules/@slack/types/dist/events/grid-migration.d.ts +9 -0
  84. package/node_modules/@slack/types/dist/events/grid-migration.d.ts.map +1 -0
  85. package/node_modules/@slack/types/dist/events/grid-migration.js +3 -0
  86. package/node_modules/@slack/types/dist/events/grid-migration.js.map +1 -0
  87. package/node_modules/@slack/types/dist/events/group.d.ts +55 -0
  88. package/node_modules/@slack/types/dist/events/group.d.ts.map +1 -0
  89. package/node_modules/@slack/types/dist/events/group.js +3 -0
  90. package/node_modules/@slack/types/dist/events/group.js.map +1 -0
  91. package/node_modules/@slack/types/dist/events/im.d.ts +26 -0
  92. package/node_modules/@slack/types/dist/events/im.d.ts.map +1 -0
  93. package/node_modules/@slack/types/dist/events/im.js +3 -0
  94. package/node_modules/@slack/types/dist/events/im.js.map +1 -0
  95. package/node_modules/@slack/types/dist/events/index.d.ts +60 -0
  96. package/node_modules/@slack/types/dist/events/index.d.ts.map +1 -0
  97. package/node_modules/@slack/types/dist/events/index.js +43 -0
  98. package/node_modules/@slack/types/dist/events/index.js.map +1 -0
  99. package/node_modules/@slack/types/dist/events/invite.d.ts +20 -0
  100. package/node_modules/@slack/types/dist/events/invite.d.ts.map +1 -0
  101. package/node_modules/@slack/types/dist/events/invite.js +3 -0
  102. package/node_modules/@slack/types/dist/events/invite.js.map +1 -0
  103. package/node_modules/@slack/types/dist/events/link-shared.d.ts +16 -0
  104. package/node_modules/@slack/types/dist/events/link-shared.d.ts.map +1 -0
  105. package/node_modules/@slack/types/dist/events/link-shared.js +3 -0
  106. package/node_modules/@slack/types/dist/events/link-shared.js.map +1 -0
  107. package/node_modules/@slack/types/dist/events/member.d.ts +19 -0
  108. package/node_modules/@slack/types/dist/events/member.d.ts.map +1 -0
  109. package/node_modules/@slack/types/dist/events/member.js +3 -0
  110. package/node_modules/@slack/types/dist/events/member.js.map +1 -0
  111. package/node_modules/@slack/types/dist/events/message-metadata.d.ts +38 -0
  112. package/node_modules/@slack/types/dist/events/message-metadata.d.ts.map +1 -0
  113. package/node_modules/@slack/types/dist/events/message-metadata.js +3 -0
  114. package/node_modules/@slack/types/dist/events/message-metadata.js.map +1 -0
  115. package/node_modules/@slack/types/dist/events/message.d.ts +306 -0
  116. package/node_modules/@slack/types/dist/events/message.d.ts.map +1 -0
  117. package/node_modules/@slack/types/dist/events/message.js +3 -0
  118. package/node_modules/@slack/types/dist/events/message.js.map +1 -0
  119. package/node_modules/@slack/types/dist/events/pin.d.ts +60 -0
  120. package/node_modules/@slack/types/dist/events/pin.d.ts.map +1 -0
  121. package/node_modules/@slack/types/dist/events/pin.js +3 -0
  122. package/node_modules/@slack/types/dist/events/pin.js.map +1 -0
  123. package/node_modules/@slack/types/dist/events/reaction.d.ts +23 -0
  124. package/node_modules/@slack/types/dist/events/reaction.d.ts.map +1 -0
  125. package/node_modules/@slack/types/dist/events/reaction.js +3 -0
  126. package/node_modules/@slack/types/dist/events/reaction.js.map +1 -0
  127. package/node_modules/@slack/types/dist/events/shared-channel.d.ts +134 -0
  128. package/node_modules/@slack/types/dist/events/shared-channel.d.ts.map +1 -0
  129. package/node_modules/@slack/types/dist/events/shared-channel.js +3 -0
  130. package/node_modules/@slack/types/dist/events/shared-channel.js.map +1 -0
  131. package/node_modules/@slack/types/dist/events/star.d.ts +13 -0
  132. package/node_modules/@slack/types/dist/events/star.d.ts.map +1 -0
  133. package/node_modules/@slack/types/dist/events/star.js +3 -0
  134. package/node_modules/@slack/types/dist/events/star.js.map +1 -0
  135. package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts +82 -0
  136. package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts.map +1 -0
  137. package/node_modules/@slack/types/dist/events/steps-from-apps.js +3 -0
  138. package/node_modules/@slack/types/dist/events/steps-from-apps.js.map +1 -0
  139. package/node_modules/@slack/types/dist/events/subteam.d.ts +66 -0
  140. package/node_modules/@slack/types/dist/events/subteam.d.ts.map +1 -0
  141. package/node_modules/@slack/types/dist/events/subteam.js +3 -0
  142. package/node_modules/@slack/types/dist/events/subteam.js.map +1 -0
  143. package/node_modules/@slack/types/dist/events/team.d.ts +99 -0
  144. package/node_modules/@slack/types/dist/events/team.d.ts.map +1 -0
  145. package/node_modules/@slack/types/dist/events/team.js +3 -0
  146. package/node_modules/@slack/types/dist/events/team.js.map +1 -0
  147. package/node_modules/@slack/types/dist/events/token.d.ts +8 -0
  148. package/node_modules/@slack/types/dist/events/token.d.ts.map +1 -0
  149. package/node_modules/@slack/types/dist/events/token.js +3 -0
  150. package/node_modules/@slack/types/dist/events/token.js.map +1 -0
  151. package/node_modules/@slack/types/dist/events/user.d.ts +313 -0
  152. package/node_modules/@slack/types/dist/events/user.d.ts.map +1 -0
  153. package/node_modules/@slack/types/dist/events/user.js +3 -0
  154. package/node_modules/@slack/types/dist/events/user.js.map +1 -0
  155. package/node_modules/@slack/types/dist/index.d.ts +12 -0
  156. package/node_modules/@slack/types/dist/index.d.ts.map +1 -0
  157. package/node_modules/@slack/types/dist/index.js +28 -0
  158. package/node_modules/@slack/types/dist/index.js.map +1 -0
  159. package/node_modules/@slack/types/dist/message-attachments.d.ts +171 -0
  160. package/node_modules/@slack/types/dist/message-attachments.d.ts.map +1 -0
  161. package/node_modules/@slack/types/dist/message-attachments.js +3 -0
  162. package/node_modules/@slack/types/dist/message-attachments.js.map +1 -0
  163. package/node_modules/@slack/types/dist/message-metadata.d.ts +281 -0
  164. package/node_modules/@slack/types/dist/message-metadata.d.ts.map +1 -0
  165. package/node_modules/@slack/types/dist/message-metadata.js +27 -0
  166. package/node_modules/@slack/types/dist/message-metadata.js.map +1 -0
  167. package/node_modules/@slack/types/dist/views.d.ts +71 -0
  168. package/node_modules/@slack/types/dist/views.d.ts.map +1 -0
  169. package/node_modules/@slack/types/dist/views.js +3 -0
  170. package/node_modules/@slack/types/dist/views.js.map +1 -0
  171. package/node_modules/@slack/types/package.json +47 -0
  172. package/node_modules/@vellumai/gateway-client/bun.lock +3 -0
  173. package/node_modules/@vellumai/gateway-client/package.json +1 -0
  174. package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +69 -0
  175. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +65 -0
  176. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
  177. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
  178. package/node_modules/@vellumai/gateway-client/src/index.ts +14 -0
  179. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
  180. package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
  181. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +78 -0
  182. package/openapi.yaml +345 -18
  183. package/package.json +2 -1
  184. package/scripts/memory-inspect.ts +24 -14
  185. package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
  186. package/src/__tests__/activation-early-marking.test.ts +1 -1
  187. package/src/__tests__/actor-token-service.test.ts +3 -3
  188. package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
  189. package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
  190. package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
  191. package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
  192. package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
  193. package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
  194. package/src/__tests__/agent-loop.test.ts +3 -0
  195. package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
  196. package/src/__tests__/anthropic-provider.test.ts +143 -9
  197. package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
  198. package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
  199. package/src/__tests__/app-source-watcher.test.ts +30 -10
  200. package/src/__tests__/approval-cascade.test.ts +6 -0
  201. package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
  202. package/src/__tests__/approval-primitive.test.ts +1 -1
  203. package/src/__tests__/approval-routes-http.test.ts +1 -1
  204. package/src/__tests__/assistant-attachments.test.ts +155 -0
  205. package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
  206. package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
  207. package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
  208. package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
  209. package/src/__tests__/attachments-store.test.ts +1 -1
  210. package/src/__tests__/audit-log-rotation.test.ts +50 -54
  211. package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
  212. package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
  213. package/src/__tests__/background-shell-bash.test.ts +4 -1
  214. package/src/__tests__/background-shell-host-bash.test.ts +17 -3
  215. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
  216. package/src/__tests__/call-controller.test.ts +1 -1
  217. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  218. package/src/__tests__/call-domain.test.ts +1 -1
  219. package/src/__tests__/call-pointer-messages.test.ts +3 -4
  220. package/src/__tests__/call-recovery.test.ts +1 -1
  221. package/src/__tests__/call-routes-http.test.ts +1 -1
  222. package/src/__tests__/call-store.test.ts +1 -1
  223. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  224. package/src/__tests__/canonical-guardian-store.test.ts +24 -1
  225. package/src/__tests__/channel-approval-routes.test.ts +73 -1119
  226. package/src/__tests__/channel-delivery-store.test.ts +1 -1
  227. package/src/__tests__/channel-guardian.test.ts +265 -641
  228. package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
  229. package/src/__tests__/channel-retry-sweep.test.ts +1 -1
  230. package/src/__tests__/compaction-events.test.ts +6 -0
  231. package/src/__tests__/compaction-trail-store.test.ts +6 -5
  232. package/src/__tests__/compaction.benchmark.test.ts +0 -1
  233. package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
  234. package/src/__tests__/config-loader-backfill.test.ts +183 -51
  235. package/src/__tests__/config-schema.test.ts +34 -0
  236. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
  237. package/src/__tests__/contact-store-user-file.test.ts +2 -2
  238. package/src/__tests__/contacts-relay-reads.test.ts +409 -0
  239. package/src/__tests__/contacts-tools.test.ts +4 -4
  240. package/src/__tests__/contacts-write.test.ts +1 -2
  241. package/src/__tests__/context-search-conversations-source.test.ts +1 -1
  242. package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
  243. package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
  244. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  245. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
  246. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
  247. package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
  248. package/src/__tests__/conversation-agent-loop.test.ts +3 -0
  249. package/src/__tests__/conversation-attachments.test.ts +2 -5
  250. package/src/__tests__/conversation-attention-store.test.ts +1 -1
  251. package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
  252. package/src/__tests__/conversation-clear-safety.test.ts +1 -1
  253. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
  254. package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
  255. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
  256. package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
  257. package/src/__tests__/conversation-disk-view.test.ts +1 -1
  258. package/src/__tests__/conversation-fork-crud.test.ts +10 -8
  259. package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
  260. package/src/__tests__/conversation-fork-route.test.ts +1 -1
  261. package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
  262. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  263. package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
  264. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  265. package/src/__tests__/conversation-lifecycle.test.ts +117 -0
  266. package/src/__tests__/conversation-list-source.test.ts +3 -3
  267. package/src/__tests__/conversation-process-callsite.test.ts +6 -14
  268. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  269. package/src/__tests__/conversation-queue.test.ts +6 -0
  270. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
  271. package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
  272. package/src/__tests__/conversation-slash-queue.test.ts +6 -0
  273. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  274. package/src/__tests__/conversation-speed-override.test.ts +6 -0
  275. package/src/__tests__/conversation-starter-routes.test.ts +5 -5
  276. package/src/__tests__/conversation-store.test.ts +1 -1
  277. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -1
  278. package/src/__tests__/conversation-sync-tags.test.ts +1 -1
  279. package/src/__tests__/conversation-usage.test.ts +1 -1
  280. package/src/__tests__/conversation-wipe.test.ts +9 -8
  281. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
  282. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  283. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  284. package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
  285. package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
  286. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  287. package/src/__tests__/db-acp-history.test.ts +2 -2
  288. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
  289. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
  290. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
  291. package/src/__tests__/db-migration-rollback.test.ts +129 -39
  292. package/src/__tests__/db-proxy-transaction.test.ts +1 -1
  293. package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
  294. package/src/__tests__/db-test-helpers.ts +36 -19
  295. package/src/__tests__/delete-propagation.test.ts +1 -1
  296. package/src/__tests__/deterministic-verification-control-plane.test.ts +26 -8
  297. package/src/__tests__/disk-pressure-tools.test.ts +41 -1
  298. package/src/__tests__/dm-backfill.test.ts +1 -1
  299. package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
  300. package/src/__tests__/edit-propagation.test.ts +1 -1
  301. package/src/__tests__/emit-signal-routing-intent.test.ts +83 -0
  302. package/src/__tests__/empty-response-hook.test.ts +42 -0
  303. package/src/__tests__/events-client-registration.test.ts +1 -1
  304. package/src/__tests__/followup-tools.test.ts +1 -1
  305. package/src/__tests__/gemini-count-tokens.test.ts +70 -0
  306. package/src/__tests__/guardian-action-sweep.test.ts +9 -2
  307. package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
  308. package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
  309. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
  310. package/src/__tests__/guardian-dispatch.test.ts +1 -1
  311. package/src/__tests__/guardian-outbound-http.test.ts +7 -12
  312. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
  313. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  314. package/src/__tests__/guardian-routing-state.test.ts +1 -2
  315. package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
  316. package/src/__tests__/headless-browser-mode.test.ts +2 -2
  317. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  318. package/src/__tests__/heartbeat-service.test.ts +6 -0
  319. package/src/__tests__/helpers/channel-test-adapter.ts +98 -0
  320. package/src/__tests__/http-conversation-lineage.test.ts +1 -1
  321. package/src/__tests__/image-recovery-hook.test.ts +1 -1
  322. package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
  323. package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
  324. package/src/__tests__/inference-profile-reaper.test.ts +1 -1
  325. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  326. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  327. package/src/__tests__/injector-chain.test.ts +1 -1
  328. package/src/__tests__/injector-disk-pressure.test.ts +11 -6
  329. package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
  330. package/src/__tests__/invite-redemption-service.test.ts +244 -43
  331. package/src/__tests__/invite-routes-http.test.ts +35 -186
  332. package/src/__tests__/invite-service-ipc.test.ts +287 -0
  333. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
  334. package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
  335. package/src/__tests__/list-messages-attachments.test.ts +42 -1
  336. package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
  337. package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
  338. package/src/__tests__/list-messages-page-latest.test.ts +1 -1
  339. package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
  340. package/src/__tests__/llm-context-route-provider.test.ts +69 -4
  341. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
  342. package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
  343. package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
  344. package/src/__tests__/llm-usage-store.test.ts +40 -1
  345. package/src/__tests__/log-export-routes.test.ts +1 -1
  346. package/src/__tests__/log-export-workspace.test.ts +3 -3
  347. package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
  348. package/src/__tests__/memory-recall-log-store.test.ts +1 -1
  349. package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
  350. package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
  351. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  352. package/src/__tests__/mtime-cache.test.ts +375 -0
  353. package/src/__tests__/non-member-access-request.test.ts +1 -2
  354. package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
  355. package/src/__tests__/notification-guardian-path.test.ts +1 -1
  356. package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
  357. package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
  358. package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
  359. package/src/__tests__/oauth-store.test.ts +1 -1
  360. package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
  361. package/src/__tests__/persist-unsendable-image.test.ts +1 -1
  362. package/src/__tests__/persona-resolver.test.ts +39 -1
  363. package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
  364. package/src/__tests__/playbook-execution.test.ts +1 -1
  365. package/src/__tests__/playbook-tools.test.ts +1 -1
  366. package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
  367. package/src/__tests__/plugin-bootstrap.test.ts +78 -0
  368. package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
  369. package/src/__tests__/provider-usage-tracking.test.ts +1 -1
  370. package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
  371. package/src/__tests__/reaction-persistence.test.ts +1 -1
  372. package/src/__tests__/relay-server.test.ts +357 -56
  373. package/src/__tests__/runtime-attachment-metadata.test.ts +10 -1
  374. package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
  375. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  376. package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
  377. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  378. package/src/__tests__/schedule-retry.test.ts +1 -1
  379. package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
  380. package/src/__tests__/schedule-routes.test.ts +1 -1
  381. package/src/__tests__/schedule-store.test.ts +1 -1
  382. package/src/__tests__/schedule-tools.test.ts +1 -1
  383. package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
  384. package/src/__tests__/scheduler-recurrence.test.ts +1 -1
  385. package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
  386. package/src/__tests__/scheduler-wake.test.ts +2 -1
  387. package/src/__tests__/scoped-approval-grants.test.ts +1 -1
  388. package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
  389. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
  390. package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
  391. package/src/__tests__/send-endpoint-busy.test.ts +1 -1
  392. package/src/__tests__/sequence-store.test.ts +1 -1
  393. package/src/__tests__/server-history-render.test.ts +40 -1
  394. package/src/__tests__/settings-routes.test.ts +11 -10
  395. package/src/__tests__/skill-load-tool.test.ts +72 -0
  396. package/src/__tests__/slack-inbound-verification.test.ts +1 -3
  397. package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
  398. package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
  399. package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
  400. package/src/__tests__/subagent-tools.test.ts +1 -31
  401. package/src/__tests__/system-prompt.test.ts +1 -1
  402. package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
  403. package/src/__tests__/task-compiler.test.ts +1 -1
  404. package/src/__tests__/task-management-tools.test.ts +1 -1
  405. package/src/__tests__/task-memory-cleanup.test.ts +9 -6
  406. package/src/__tests__/task-scheduler.test.ts +1 -1
  407. package/src/__tests__/thread-backfill.test.ts +1 -1
  408. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  409. package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
  410. package/src/__tests__/tool-executor.test.ts +32 -1
  411. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
  412. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
  413. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
  414. package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
  415. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  416. package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
  417. package/src/__tests__/turn-events-store.test.ts +1 -1
  418. package/src/__tests__/twilio-routes.test.ts +2 -3
  419. package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
  420. package/src/__tests__/usage-routes.test.ts +1 -1
  421. package/src/__tests__/user-plugin-loader.test.ts +34 -29
  422. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  423. package/src/__tests__/voice-invite-redemption.test.ts +134 -36
  424. package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
  425. package/src/__tests__/voice-session-bridge.test.ts +1 -1
  426. package/src/__tests__/workspace-git-service.test.ts +114 -1
  427. package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
  428. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
  429. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
  430. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
  431. package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
  432. package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
  433. package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
  434. package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
  435. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
  436. package/src/a2a/__tests__/task-store.test.ts +1 -1
  437. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
  438. package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
  439. package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
  440. package/src/acp/__tests__/session-manager.test.ts +72 -1
  441. package/src/acp/index.ts +10 -0
  442. package/src/acp/session-manager.ts +35 -0
  443. package/src/agent/loop.ts +45 -27
  444. package/src/api/index.ts +0 -6
  445. package/src/approvals/AGENTS.md +1 -2
  446. package/src/approvals/guardian-decision-primitive.ts +13 -210
  447. package/src/approvals/guardian-request-resolvers.ts +104 -58
  448. package/src/background-wake/wake-intent-hooks.test.ts +1 -1
  449. package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
  450. package/src/calls/__tests__/relay-setup-router.test.ts +88 -62
  451. package/src/calls/inbound-trust-reader.ts +40 -0
  452. package/src/calls/relay-server.ts +65 -23
  453. package/src/calls/relay-setup-router.ts +20 -6
  454. package/src/calls/relay-verification.ts +7 -7
  455. package/src/cli/commands/contacts.ts +6 -24
  456. package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
  457. package/src/cli/commands/db/__tests__/status.test.ts +7 -3
  458. package/src/cli/commands/db/status.ts +212 -33
  459. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
  460. package/src/cli/commands/memory/index.ts +2 -0
  461. package/src/cli/commands/memory/memory-retrospective.ts +129 -0
  462. package/src/cli/commands/memory/memory-v3.ts +176 -4
  463. package/src/cli/commands/plugins.ts +268 -11
  464. package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
  465. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
  466. package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
  467. package/src/cli/lib/install-from-github.ts +47 -6
  468. package/src/cli/lib/plugin-marketplace.ts +11 -0
  469. package/src/cli/lib/plugin-pin-history.ts +257 -0
  470. package/src/cli/lib/toggle-plugin.ts +146 -0
  471. package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
  472. package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
  473. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
  474. package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
  475. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
  476. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
  477. package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
  478. package/src/config/bundled-skills/contacts/SKILL.md +7 -12
  479. package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
  480. package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
  481. package/src/config/bundled-skills/workflows/SKILL.md +4 -3
  482. package/src/config/call-site-defaults.ts +11 -2
  483. package/src/config/feature-flag-registry.json +0 -8
  484. package/src/config/profile-dispatchability.ts +11 -0
  485. package/src/config/schemas/call-site-catalog.ts +7 -0
  486. package/src/config/schemas/llm.ts +2 -0
  487. package/src/config/schemas/memory-lifecycle.ts +5 -3
  488. package/src/config/schemas/timeouts.ts +24 -0
  489. package/src/config/seed-inference-profiles.ts +133 -45
  490. package/src/config/sync-gated-profiles.ts +13 -1
  491. package/src/contacts/contact-store.ts +21 -0
  492. package/src/contacts/member-status.ts +9 -0
  493. package/src/credential-health/credential-health-service.ts +1 -5
  494. package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
  495. package/src/daemon/app-source-watcher.ts +31 -18
  496. package/src/daemon/assistant-attachments.ts +94 -4
  497. package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
  498. package/src/daemon/conversation-agent-loop.ts +9 -36
  499. package/src/daemon/conversation-runtime-assembly.ts +91 -66
  500. package/src/daemon/conversation-tool-setup.ts +20 -63
  501. package/src/daemon/conversation.ts +144 -52
  502. package/src/daemon/event-loop-watchdog.test.ts +85 -0
  503. package/src/daemon/event-loop-watchdog.ts +133 -0
  504. package/src/daemon/external-plugins-bootstrap.ts +26 -80
  505. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
  506. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
  507. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
  508. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
  509. package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
  510. package/src/daemon/handlers/config-channels.ts +32 -18
  511. package/src/daemon/handlers/conversations.ts +7 -0
  512. package/src/daemon/handlers/shared.ts +7 -0
  513. package/src/daemon/lifecycle.ts +16 -3
  514. package/src/daemon/message-types/inbox.ts +0 -6
  515. package/src/daemon/message-types/messages.ts +0 -4
  516. package/src/daemon/message-types/surfaces.ts +18 -8
  517. package/src/daemon/server.ts +0 -4
  518. package/src/daemon/tool-setup-types.ts +0 -7
  519. package/src/daemon/trust-context.ts +6 -0
  520. package/src/daemon/wake-conversation-ops.ts +70 -0
  521. package/src/daemon/workspace-tools-watcher.ts +7 -3
  522. package/src/documents/document-comments-store.test.ts +1 -1
  523. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
  524. package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
  525. package/src/heartbeat/heartbeat-service.ts +3 -4
  526. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  527. package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
  528. package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
  529. package/src/ipc/assistant-server.ts +8 -0
  530. package/src/ipc/gateway-client.ts +2 -1
  531. package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
  532. package/src/ipc/routes/invite-ipc-routes.ts +66 -0
  533. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  534. package/src/memory/__tests__/activation-session-store.test.ts +1 -1
  535. package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
  536. package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
  537. package/src/memory/__tests__/conversation-queries.test.ts +1 -1
  538. package/src/memory/__tests__/db-async-query.test.ts +1 -1
  539. package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
  540. package/src/memory/__tests__/db-maintenance.test.ts +28 -36
  541. package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
  542. package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
  543. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
  544. package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
  545. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
  546. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
  547. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
  548. package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
  549. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
  550. package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
  551. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
  552. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
  553. package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
  554. package/src/memory/__tests__/table-relocation.test.ts +129 -0
  555. package/src/memory/conversation-crud.ts +461 -152
  556. package/src/memory/db-async-query.ts +89 -5
  557. package/src/memory/db-connection.ts +101 -18
  558. package/src/memory/db-init.ts +409 -234
  559. package/src/memory/db-maintenance.ts +43 -38
  560. package/src/memory/db-singleton.ts +45 -19
  561. package/src/memory/fork-message-copy.ts +170 -0
  562. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
  563. package/src/memory/graph/bootstrap.test.ts +6 -3
  564. package/src/memory/graph/retriever.test.ts +12 -12
  565. package/src/memory/graph/store.test.ts +15 -25
  566. package/src/memory/graph/store.ts +23 -14
  567. package/src/memory/graph/tool-handlers.ts +34 -5
  568. package/src/memory/graph/tools.ts +5 -2
  569. package/src/memory/indexer.ts +21 -9
  570. package/src/memory/job-handlers/cleanup.ts +10 -3
  571. package/src/memory/job-handlers/embedding.test.ts +4 -4
  572. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
  573. package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
  574. package/src/memory/jobs-store.ts +36 -24
  575. package/src/memory/llm-request-log-store.ts +51 -19
  576. package/src/memory/llm-usage-store.ts +31 -1
  577. package/src/memory/memory-retrospective-job.ts +27 -19
  578. package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
  579. package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
  580. package/src/memory/migrations/104-core-indexes.ts +1 -1
  581. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
  582. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
  583. package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
  584. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
  585. package/src/memory/migrations/136-drop-assistant-id-columns.ts +227 -230
  586. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
  587. package/src/memory/migrations/141-rename-verification-table.ts +45 -48
  588. package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
  589. package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
  590. package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
  591. package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
  592. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
  593. package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
  594. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
  595. package/src/memory/migrations/157-invite-contact-id.ts +73 -76
  596. package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
  597. package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
  598. package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
  599. package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
  600. package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
  601. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
  602. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
  603. package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
  604. package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
  605. package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
  606. package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
  607. package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
  608. package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
  609. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
  610. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
  611. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +50 -57
  612. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
  613. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
  614. package/src/memory/migrations/217-conversation-host-access.ts +13 -18
  615. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
  616. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
  617. package/src/memory/migrations/230-acp-session-history.ts +23 -28
  618. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
  619. package/src/memory/migrations/232-activation-state.ts +11 -16
  620. package/src/memory/migrations/233-document-conversations.ts +20 -25
  621. package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
  622. package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
  623. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
  624. package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
  625. package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
  626. package/src/memory/migrations/242-message-bookmarks.ts +17 -22
  627. package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
  628. package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
  629. package/src/memory/migrations/251-a2a-tasks.ts +27 -32
  630. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
  631. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
  632. package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
  633. package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
  634. package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
  635. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
  636. package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
  637. package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
  638. package/src/memory/migrations/270-schedule-description.ts +7 -12
  639. package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
  640. package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
  641. package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
  642. package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
  643. package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
  644. package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
  645. package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
  646. package/src/memory/migrations/helpers/relocation.ts +227 -0
  647. package/src/memory/migrations/registry.ts +63 -0
  648. package/src/memory/migrations/run-migrations.ts +187 -16
  649. package/src/memory/migrations/validate-migration-state.ts +50 -145
  650. package/src/memory/raw-query.ts +47 -2
  651. package/src/memory/skill-loaded-events-store.test.ts +1 -1
  652. package/src/memory/task-memory-cleanup.ts +62 -41
  653. package/src/memory/tool-executed-events-store.test.ts +1 -1
  654. package/src/memory/turn-trace-store.test.ts +1 -1
  655. package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
  656. package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
  657. package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
  658. package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
  659. package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
  660. package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
  661. package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
  662. package/src/memory/v3-eval/eval-packets.ts +197 -12
  663. package/src/memory/v3-eval/eval-tally.ts +234 -0
  664. package/src/messaging/provider.ts +10 -0
  665. package/src/messaging/providers/gmail/adapter.ts +1 -0
  666. package/src/messaging/providers/gmail/client.ts +14 -0
  667. package/src/messaging/providers/index.ts +1 -1
  668. package/src/messaging/providers/slack/send.test.ts +87 -39
  669. package/src/messaging/providers/slack/send.ts +84 -105
  670. package/src/notifications/README.md +9 -5
  671. package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
  672. package/src/notifications/adapters/slack.ts +12 -10
  673. package/src/notifications/approval-card-builder.ts +81 -20
  674. package/src/notifications/approval-card-data.ts +8 -5
  675. package/src/notifications/canonical-delivery-recorder.ts +7 -5
  676. package/src/notifications/conversation-candidates.ts +24 -59
  677. package/src/notifications/copy-composer.ts +48 -68
  678. package/src/notifications/deterministic-checks.ts +19 -16
  679. package/src/notifications/emit-signal.ts +29 -1
  680. package/src/notifications/trusted-contact-payloads.ts +70 -0
  681. package/src/oauth/byo-connection.test.ts +9 -0
  682. package/src/oauth/connection-resolver.test.ts +146 -6
  683. package/src/oauth/connection-resolver.ts +132 -5
  684. package/src/oauth/oauth-store.ts +16 -3
  685. package/src/oauth/scope-utils.ts +21 -0
  686. package/src/plugin-api/index.ts +9 -4
  687. package/src/plugin-api/model-profiles.test.ts +123 -0
  688. package/src/plugin-api/model-profiles.ts +5 -1
  689. package/src/plugin-api/vision-support.test.ts +149 -0
  690. package/src/plugin-api/vision-support.ts +78 -0
  691. package/src/plugins/defaults/compaction/window-manager.ts +45 -64
  692. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
  693. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +302 -0
  694. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +103 -0
  695. package/src/plugins/defaults/image-fallback/package.json +14 -0
  696. package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
  697. package/src/plugins/defaults/image-fallback/src/image-persist.ts +59 -0
  698. package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
  699. package/src/plugins/defaults/index.ts +23 -0
  700. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
  701. package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
  702. package/src/plugins/external-plugin-loader.ts +47 -6
  703. package/src/plugins/mtime-cache.ts +772 -0
  704. package/src/plugins/pipeline.ts +7 -2
  705. package/src/plugins/registry.ts +16 -5
  706. package/src/plugins/user-loader.ts +22 -76
  707. package/src/prompts/persona-resolver.ts +29 -11
  708. package/src/prompts/system-prompt.ts +1 -1
  709. package/src/prompts/templates/system-sections.ts +4 -4
  710. package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
  711. package/src/providers/anthropic/client.ts +254 -185
  712. package/src/providers/call-site-routing.ts +10 -0
  713. package/src/providers/gemini/client.ts +43 -0
  714. package/src/providers/inference/adapter-factory.ts +6 -0
  715. package/src/providers/inference/connections.ts +6 -1
  716. package/src/providers/model-catalog.ts +37 -0
  717. package/src/providers/platform-proxy/constants.ts +5 -0
  718. package/src/providers/ratelimit.ts +9 -0
  719. package/src/providers/retry.ts +10 -0
  720. package/src/providers/together/client.ts +35 -0
  721. package/src/providers/types.ts +16 -0
  722. package/src/providers/usage-tracking.ts +7 -0
  723. package/src/runtime/AGENTS.md +9 -1
  724. package/src/runtime/__tests__/agent-wake.test.ts +259 -4
  725. package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
  726. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +417 -0
  727. package/src/runtime/actor-trust-resolver.ts +8 -16
  728. package/src/runtime/agent-wake.ts +183 -60
  729. package/src/runtime/channel-reply-delivery.ts +6 -3
  730. package/src/runtime/guardian-decision-types.ts +3 -22
  731. package/src/runtime/http-server.ts +1 -15
  732. package/src/runtime/invite-redemption-service.ts +155 -6
  733. package/src/runtime/invite-service.ts +113 -62
  734. package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
  735. package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
  736. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
  737. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
  738. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
  739. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
  740. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
  741. package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
  742. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  743. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
  744. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
  745. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
  746. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
  747. package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
  748. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
  749. package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
  750. package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
  751. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
  752. package/src/runtime/routes/acp-routes-list.test.ts +4 -0
  753. package/src/runtime/routes/acp-routes.test.ts +5 -6
  754. package/src/runtime/routes/attachment-routes.ts +21 -17
  755. package/src/runtime/routes/browser-routes.ts +19 -1
  756. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
  757. package/src/runtime/routes/channel-verification-routes.ts +12 -1
  758. package/src/runtime/routes/contact-routes.ts +275 -164
  759. package/src/runtime/routes/conversation-query-routes.ts +15 -5
  760. package/src/runtime/routes/conversation-routes.ts +24 -3
  761. package/src/runtime/routes/conversation-starter-routes.ts +7 -8
  762. package/src/runtime/routes/guardian-approval-interception.ts +13 -274
  763. package/src/runtime/routes/inbound-message-handler.ts +20 -15
  764. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +285 -0
  765. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +45 -34
  766. package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
  767. package/src/runtime/routes/log-export-routes.ts +2 -2
  768. package/src/runtime/routes/memory-eval-routes.ts +92 -0
  769. package/src/runtime/routes/memory-item-routes.test.ts +12 -11
  770. package/src/runtime/routes/migration-routes.ts +51 -40
  771. package/src/runtime/routes/plugins-routes.ts +164 -8
  772. package/src/runtime/routes/schedule-routes.ts +1 -0
  773. package/src/runtime/routes/usage-routes.ts +3 -0
  774. package/src/runtime/routes/work-items-routes.test.ts +1 -1
  775. package/src/runtime/slack-block-formatting.ts +46 -48
  776. package/src/runtime/trust-verdict-consumer.ts +172 -0
  777. package/src/schedule/scheduler.ts +6 -9
  778. package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
  779. package/src/tools/ask-question/ask-question-tool.test.ts +60 -52
  780. package/src/tools/ask-question/ask-question-tool.ts +14 -73
  781. package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
  782. package/src/tools/browser/browser-execution.ts +16 -4
  783. package/src/tools/document/document-comment-tool.test.ts +1 -1
  784. package/src/tools/executor.ts +15 -3
  785. package/src/tools/host-terminal/host-shell.ts +28 -9
  786. package/src/tools/memory/register.test.ts +32 -0
  787. package/src/tools/skills/load.ts +43 -2
  788. package/src/tools/subagent/spawn.ts +4 -10
  789. package/src/tools/terminal/shell.ts +16 -5
  790. package/src/tools/types.ts +1 -0
  791. package/src/util/fs-watcher-error.ts +36 -0
  792. package/src/util/logs-db-path.ts +22 -0
  793. package/src/util/memory-db-path.ts +23 -0
  794. package/src/watcher/providers/gmail.ts +7 -2
  795. package/src/workflows/engine-integration.test.ts +1 -1
  796. package/src/workflows/engine.test.ts +1 -1
  797. package/src/workflows/engine.ts +22 -0
  798. package/src/workflows/fanout-load.test.ts +1 -1
  799. package/src/workflows/journal-store.test.ts +1 -1
  800. package/src/workflows/leaf-runner.test.ts +40 -1
  801. package/src/workflows/leaf-runner.ts +26 -1
  802. package/src/workspace/git-service.ts +144 -29
  803. package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
  804. package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
  805. package/src/workspace/migrations/registry.ts +4 -0
  806. package/src/workspace/migrations/runner.ts +32 -2
  807. package/src/__tests__/access-request-decision.test.ts +0 -375
  808. package/src/__tests__/guardian-grant-minting.test.ts +0 -607
  809. package/src/__tests__/plugin-source-watcher.test.ts +0 -302
  810. package/src/api/events/turn-profile-auto-routed.ts +0 -28
  811. package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
  812. package/src/daemon/plugin-source-watcher.ts +0 -278
  813. package/src/daemon/switch-inference-profile-tool.ts +0 -62
  814. package/src/memory/guardian-approvals.ts +0 -361
  815. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
  816. package/src/memory/migrations/038-actor-token-records.ts +0 -45
  817. package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
  818. package/src/memory/migrations/103-complex-migrations.ts +0 -23
  819. package/src/memory/migrations/113-late-migrations.ts +0 -30
  820. package/src/memory/migrations/index.ts +0 -301
  821. package/src/runtime/routes/access-request-decision.ts +0 -297
  822. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
  823. package/src/runtime/routes/channel-guardian-routes.ts +0 -19
  824. package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
@@ -0,0 +1,227 @@
1
+ import type { Database } from "bun:sqlite";
2
+
3
+ import { getLogger } from "../../../util/logger.js";
4
+ import { getDbPath } from "../../../util/platform.js";
5
+ import {
6
+ parseChangesFromStdout,
7
+ runAsyncSqlite,
8
+ } from "../../db-async-query.js";
9
+
10
+ const log = getLogger("memory-db");
11
+
12
+ /**
13
+ * Incremental relocation of a heavy table out of the main DB and into its
14
+ * own file (`assistant-logs.db` / `assistant-memory.db`).
15
+ *
16
+ * A one-shot `INSERT … SELECT` + `DROP TABLE` of a multi-GB table on the daemon
17
+ * connection would pin the write lock and block the event loop for minutes.
18
+ * Instead a relocation runs as an async migration step in two parts:
19
+ *
20
+ * 1. {@link stageTableForRelocation} renames the source table in `main` aside
21
+ * to `<table>__relocating` (instant, metadata-only), so live reads/writes
22
+ * route to the dedicated connection's copy immediately.
23
+ * 2. {@link drainStagedTable} copies the staged rows into the target file in
24
+ * bounded batches and truncates them from the staging table as it goes,
25
+ * then drops it. Each batch runs through `runAsyncSqlite`, which opens the
26
+ * target file directly (the sqlite3 subprocess ATTACHes it), so the work
27
+ * is independent of the daemon connection; the migration `await`s it to
28
+ * completion before checkpointing, so later startup work observes the
29
+ * finished move.
30
+ *
31
+ * The engine is generic: each migration owns its {@link RelocationSpec} (the
32
+ * instance-specific columns / filter / target file) and passes it in.
33
+ */
34
+
35
+ /** Suffix of the staging table the source is renamed to during relocation. */
36
+ export const RELOCATING_SUFFIX = "__relocating";
37
+
38
+ /**
39
+ * Describes how to drain one relocatable table. Defined by the owning migration
40
+ * — never centrally — so instance-specific SQL stays next to the migration that
41
+ * needs it.
42
+ */
43
+ export interface RelocationSpec {
44
+ /** Live, unqualified table name (renamed aside, then drained into the target). */
45
+ table: string;
46
+ /** Absolute path of the attached DB file the table is moved into. */
47
+ targetDbPath: () => string;
48
+ /**
49
+ * Columns to copy, in a fixed order — listed explicitly (not `SELECT *`) so
50
+ * the copy is insensitive to the physical column order of the source table,
51
+ * which varies with the history of `ALTER TABLE … ADD COLUMN` migrations.
52
+ * Columns absent from the (legacy) source are copied as NULL.
53
+ */
54
+ columns: string[];
55
+ /**
56
+ * Optional predicate (evaluated against the staging table) selecting rows
57
+ * worth preserving. Rows that do **not** match are deleted without being
58
+ * copied. Omit to copy every row.
59
+ */
60
+ copyWhere?: string;
61
+ /**
62
+ * Optional per-column SELECT expressions, keyed by column name, for columns
63
+ * that must be transformed during the copy rather than carried verbatim
64
+ * (e.g. resetting a status). The expression is evaluated against the staging
65
+ * row; unlisted columns copy as-is (or NULL when absent from the source).
66
+ */
67
+ columnExpr?: Record<string, string>;
68
+ }
69
+
70
+ function tableExistsInMain(raw: Database, name: string): boolean {
71
+ return (
72
+ raw
73
+ .query(
74
+ `SELECT name FROM main.sqlite_master WHERE type='table' AND name = ?`,
75
+ )
76
+ .get(name) != null
77
+ );
78
+ }
79
+
80
+ function tableIsEmpty(raw: Database, name: string): boolean {
81
+ // EXISTS short-circuits at the first row, so this stays cheap even on a huge
82
+ // table — no full COUNT(*) scan.
83
+ return raw.query(`SELECT 1 FROM main."${name}" LIMIT 1`).get() == null;
84
+ }
85
+
86
+ /**
87
+ * Move the source table in `main` aside so the unqualified name resolves to the
88
+ * attached copy, returning whether a staging table now exists (i.e. a drain is
89
+ * needed). Idempotent and safe to re-run after a crash:
90
+ *
91
+ * - `main.<table>` empty → drop it (a freshly recreated shadow, or
92
+ * an already-drained leftover).
93
+ * - `main.<table>` non-empty, no
94
+ * staging yet → rename it to `<table>__relocating`.
95
+ * - staging already exists → leave it; a prior boot started the move.
96
+ *
97
+ * `table` comes from a {@link RelocationSpec} (never user input); it is quoted
98
+ * defensively all the same.
99
+ */
100
+ export function stageTableForRelocation(raw: Database, table: string): boolean {
101
+ const staging = `${table}${RELOCATING_SUFFIX}`;
102
+ const hasStaging = tableExistsInMain(raw, staging);
103
+
104
+ if (tableExistsInMain(raw, table)) {
105
+ if (tableIsEmpty(raw, table)) {
106
+ raw.exec(`DROP TABLE main."${table}"`);
107
+ } else if (!hasStaging) {
108
+ raw.exec(`ALTER TABLE main."${table}" RENAME TO "${staging}"`);
109
+ return true;
110
+ }
111
+ // else: a non-empty live table alongside an existing staging table is not
112
+ // expected; leave both and let the in-flight drain finish first.
113
+ }
114
+
115
+ return tableExistsInMain(raw, staging);
116
+ }
117
+
118
+ /**
119
+ * Rows copied/purged per drain batch. Each batch is a couple of bounded
120
+ * statements, so the write lock is held only briefly and the event loop is free
121
+ * between batches. Sized as a balance between throughput and lock-hold time.
122
+ */
123
+ const DRAIN_BATCH = 10_000;
124
+
125
+ /**
126
+ * Drain a `<table>__relocating` staging table created by
127
+ * {@link stageTableForRelocation}: copy the rows worth keeping into the attached
128
+ * target in bounded batches, purge the rest without copying, then drop the
129
+ * staging table and truncate the main WAL. Resolves once the move is complete.
130
+ *
131
+ * Awaited inline by the relocation migration step, so it runs at most once per
132
+ * boot under the migration runner's checkpoint: an interrupted drain leaves the
133
+ * step uncheckpointed and the staging table in place, and the next boot
134
+ * re-stages (a no-op) and resumes from the remaining rows. Each batch is
135
+ * dispatched off the connection via `runAsyncSqlite` (sqlite3 subprocess when
136
+ * available; in-process fallback otherwise), keeping the event loop responsive
137
+ * between batches. A batch failure throws so the step is reported failed and
138
+ * retried on the next boot rather than checkpointed as done.
139
+ */
140
+ export async function drainStagedTable(
141
+ raw: Database,
142
+ spec: RelocationSpec,
143
+ ): Promise<void> {
144
+ const { table } = spec;
145
+ const staging = `${table}${RELOCATING_SUFFIX}`;
146
+
147
+ // Nothing to do once the staging table is gone (drain finished previously).
148
+ if (!tableExistsInMain(raw, staging)) return;
149
+
150
+ // Build a select list from the staging table's actual columns: apply any
151
+ // per-column transform, copy a present column verbatim, NULL-fill an absent
152
+ // (legacy) one so an older row still copies cleanly.
153
+ const present = new Set(
154
+ (
155
+ raw
156
+ .query(`SELECT name FROM pragma_table_info('${staging}', 'main')`)
157
+ .all() as Array<{ name: string }>
158
+ ).map((r) => r.name),
159
+ );
160
+ const colList = spec.columns.map((c) => `"${c}"`).join(", ");
161
+ const selectList = spec.columns
162
+ .map((c) => spec.columnExpr?.[c] ?? (present.has(c) ? `"${c}"` : "NULL"))
163
+ .join(", ");
164
+
165
+ const dbPath = getDbPath();
166
+ const whereCopy = spec.copyWhere ? `WHERE ${spec.copyWhere}` : "";
167
+
168
+ for (;;) {
169
+ // (1) Purge a batch of non-keeper rows (no copy) when a copy filter narrows
170
+ // what is worth preserving — this is the bulk of a runaway queue.
171
+ let purged = 0;
172
+ if (spec.copyWhere) {
173
+ const res = await runAsyncSqlite(
174
+ `DELETE FROM "${staging}" WHERE rowid IN (` +
175
+ `SELECT rowid FROM "${staging}" WHERE NOT (${spec.copyWhere}) LIMIT ${DRAIN_BATCH});\n` +
176
+ `SELECT changes();`,
177
+ { dbPath },
178
+ );
179
+ if (!res.ok) {
180
+ throw new Error(
181
+ `relocation purge batch failed for "${table}": ${res.error}`,
182
+ );
183
+ }
184
+ purged = parseChangesFromStdout(res.stdout);
185
+ }
186
+
187
+ // (2) Copy a batch of keepers, then truncate those same rows. Two
188
+ // autocommitted statements (no BEGIN): the copy commits before the
189
+ // delete, so a crash in between just re-copies (INSERT OR IGNORE no-op)
190
+ // and re-deletes next boot — safe across the non-atomic cross-DB commit.
191
+ const copyRes = await runAsyncSqlite(
192
+ `INSERT OR IGNORE INTO "${table}" (${colList}) ` +
193
+ `SELECT ${selectList} FROM "${staging}" ${whereCopy} ORDER BY rowid LIMIT ${DRAIN_BATCH};\n` +
194
+ `DELETE FROM "${staging}" WHERE rowid IN (` +
195
+ `SELECT rowid FROM "${staging}" ${whereCopy} ORDER BY rowid LIMIT ${DRAIN_BATCH});\n` +
196
+ `SELECT changes();`,
197
+ {
198
+ dbPath,
199
+ attach: [{ path: spec.targetDbPath(), alias: "_reloc_target" }],
200
+ },
201
+ );
202
+ if (!copyRes.ok) {
203
+ throw new Error(
204
+ `relocation copy batch failed for "${table}": ${copyRes.error}`,
205
+ );
206
+ }
207
+ const moved = parseChangesFromStdout(copyRes.stdout);
208
+
209
+ if (purged > 0 || moved > 0) {
210
+ log.info({ table, purged, moved }, "relocation: drain progressed");
211
+ continue;
212
+ }
213
+ break;
214
+ }
215
+
216
+ // Drained — drop the (now empty) staging table and truncate the main WAL.
217
+ const finalizeRes = await runAsyncSqlite(
218
+ `DROP TABLE IF EXISTS "${staging}";\nPRAGMA wal_checkpoint(TRUNCATE);`,
219
+ { dbPath },
220
+ );
221
+ if (!finalizeRes.ok) {
222
+ throw new Error(
223
+ `relocation finalize failed for "${table}": ${finalizeRes.error}`,
224
+ );
225
+ }
226
+ log.info({ table }, "relocation: complete — staging dropped");
227
+ }
@@ -62,6 +62,12 @@ import { downScheduleDescription } from "./270-schedule-description.js";
62
62
  export interface MigrationRegistryEntry {
63
63
  /** The checkpoint key written to memory_checkpoints on completion. */
64
64
  key: string;
65
+ /**
66
+ * The name of the migration step function (as registered in db-init's step
67
+ * array). The step runner writes `step:${stepName}` checkpoints — this field
68
+ * maps registry entries to those step checkpoints for validation and rollback.
69
+ */
70
+ stepName: string;
65
71
  /** Monotonic version number used for ordering assertions. */
66
72
  version: number;
67
73
  /** Keys of other migrations that must complete before this one runs. */
@@ -86,6 +92,7 @@ export interface MigrationRegistryEntry {
86
92
  export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
87
93
  {
88
94
  key: "migration_job_deferrals",
95
+ stepName: "migrateJobDeferrals",
89
96
  version: 1,
90
97
  description:
91
98
  "Reconcile legacy deferral history from attempts column into deferrals column",
@@ -93,6 +100,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
93
100
  },
94
101
  {
95
102
  key: "migration_memory_entity_relations_dedup_v1",
103
+ stepName: "migrateMemoryEntityRelationDedup",
96
104
  version: 2,
97
105
  description:
98
106
  "Deduplicate entity relation edges before enforcing the (source, target, relation) unique index",
@@ -100,6 +108,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
100
108
  },
101
109
  {
102
110
  key: "migration_memory_items_fingerprint_scope_unique_v1",
111
+ stepName: "migrateMemoryItemsFingerprintScopeUnique",
103
112
  version: 3,
104
113
  description:
105
114
  "Replace column-level UNIQUE on fingerprint with compound (fingerprint, scope_id) unique index",
@@ -107,6 +116,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
107
116
  },
108
117
  {
109
118
  key: "migration_memory_items_scope_salted_fingerprints_v1",
119
+ stepName: "migrateMemoryItemsScopeSaltedFingerprints",
110
120
  version: 4,
111
121
  dependsOn: ["migration_memory_items_fingerprint_scope_unique_v1"],
112
122
  description:
@@ -115,6 +125,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
115
125
  },
116
126
  {
117
127
  key: "migration_normalize_assistant_id_to_self_v1",
128
+ stepName: "migrateAssistantIdToSelf",
118
129
  version: 5,
119
130
  description:
120
131
  'Normalize all assistant_id values in scoped tables to the implicit "self" single-tenant identity',
@@ -122,6 +133,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
122
133
  },
123
134
  {
124
135
  key: "migration_remove_assistant_id_columns_v1",
136
+ stepName: "migrateRemoveAssistantIdColumns",
125
137
  version: 6,
126
138
  dependsOn: ["migration_normalize_assistant_id_to_self_v1"],
127
139
  description:
@@ -130,6 +142,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
130
142
  },
131
143
  {
132
144
  key: "migration_remove_assistant_id_lue_v1",
145
+ stepName: "migrateLlmUsageEventsDropAssistantId",
133
146
  version: 7,
134
147
  dependsOn: ["migration_normalize_assistant_id_to_self_v1"],
135
148
  description:
@@ -138,6 +151,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
138
151
  },
139
152
  {
140
153
  key: "backfill_inbox_thread_state_from_bindings",
154
+ stepName: "createAssistantInboxTables",
141
155
  version: 8,
142
156
  description:
143
157
  "Seed assistant_inbox_thread_state from external_conversation_bindings",
@@ -145,6 +159,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
145
159
  },
146
160
  {
147
161
  key: "drop_active_search_index_v1",
162
+ stepName: "createCoreIndexes",
148
163
  version: 9,
149
164
  description:
150
165
  "Drop old idx_memory_items_active_search so it can be recreated with updated covering columns",
@@ -152,6 +167,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
152
167
  },
153
168
  {
154
169
  key: "migration_notification_tables_schema_v1",
170
+ stepName: "createNotificationTables",
155
171
  version: 10,
156
172
  description:
157
173
  "Drop legacy enum-based notification tables so they can be recreated with the new signal-contract schema",
@@ -159,6 +175,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
159
175
  },
160
176
  {
161
177
  key: "migration_rename_macos_ios_channel_to_vellum_v1",
178
+ stepName: "migrateRenameChannelToVellum",
162
179
  version: 11,
163
180
  description:
164
181
  "Rename macos and ios channel identifiers to vellum across all tables",
@@ -166,6 +183,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
166
183
  },
167
184
  {
168
185
  key: "migration_embedding_vector_blob_v1",
186
+ stepName: "migrateEmbeddingVectorBlob",
169
187
  version: 12,
170
188
  description:
171
189
  "Add vector_blob BLOB column to memory_embeddings and backfill from vector_json for compact binary storage",
@@ -173,6 +191,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
173
191
  },
174
192
  {
175
193
  key: "migration_embeddings_nullable_vector_json_v1",
194
+ stepName: "migrateEmbeddingsNullableVectorJson",
176
195
  version: 13,
177
196
  dependsOn: ["migration_embedding_vector_blob_v1"],
178
197
  description:
@@ -181,6 +200,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
181
200
  },
182
201
  {
183
202
  key: "migration_normalize_phone_identities_v1",
203
+ stepName: "migrateNormalizePhoneIdentities",
184
204
  version: 14,
185
205
  description:
186
206
  "Normalize phone-like identity fields to E.164 format across guardian bindings, verification challenges, canonical requests, ingress members, and rate limits",
@@ -188,6 +208,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
188
208
  },
189
209
  {
190
210
  key: "migration_backfill_guardian_principal_id_v3",
211
+ stepName: "migrateBackfillGuardianPrincipalId",
191
212
  version: 15,
192
213
  description:
193
214
  "Backfill guardianPrincipalId for existing channel_guardian_bindings and canonical_guardian_requests rows, expire unresolvable pending requests",
@@ -195,6 +216,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
195
216
  },
196
217
  {
197
218
  key: "migration_guardian_principal_id_not_null_v1",
219
+ stepName: "migrateGuardianPrincipalIdNotNull",
198
220
  version: 16,
199
221
  dependsOn: ["migration_backfill_guardian_principal_id_v3"],
200
222
  description:
@@ -203,6 +225,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
203
225
  },
204
226
  {
205
227
  key: "migration_contacts_notes_column_v1",
228
+ stepName: "migrateContactsNotesColumn",
206
229
  version: 17,
207
230
  description:
208
231
  "Consolidate relationship/importance/response_expectation/preferred_tone into a single notes TEXT column, then drop the legacy columns",
@@ -210,6 +233,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
210
233
  },
211
234
  {
212
235
  key: "backfill_contact_interaction_stats",
236
+ stepName: "migrateBackfillContactInteractionStats",
213
237
  version: 18,
214
238
  description:
215
239
  "Backfill contacts.last_interaction from the max lastSeenAt across each contact's channels",
@@ -217,6 +241,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
217
241
  },
218
242
  {
219
243
  key: "migration_drop_assistant_id_columns_v1",
244
+ stepName: "migrateDropAssistantIdColumns",
220
245
  version: 19,
221
246
  dependsOn: ["migration_normalize_assistant_id_to_self_v1"],
222
247
  description:
@@ -225,6 +250,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
225
250
  },
226
251
  {
227
252
  key: "migration_backfill_usage_cache_accounting_v1",
253
+ stepName: "migrateBackfillUsageCacheAccounting",
228
254
  version: 20,
229
255
  description:
230
256
  "Backfill historical Anthropic llm_usage_events rows from llm_request_logs with cache-aware pricing",
@@ -232,6 +258,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
232
258
  },
233
259
  {
234
260
  key: "migration_rename_verification_table_v1",
261
+ stepName: "migrateRenameVerificationTable",
235
262
  version: 21,
236
263
  description:
237
264
  "Rename channel_guardian_verification_challenges table to channel_verification_sessions and update indexes",
@@ -239,6 +266,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
239
266
  },
240
267
  {
241
268
  key: "migration_rename_verification_session_id_column_v1",
269
+ stepName: "migrateRenameVerificationSessionIdColumn",
242
270
  version: 22,
243
271
  description:
244
272
  "Rename guardian_verification_session_id column in call_sessions to verification_session_id",
@@ -246,6 +274,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
246
274
  },
247
275
  {
248
276
  key: "migration_rename_guardian_verification_values_v1",
277
+ stepName: "migrateRenameGuardianVerificationValues",
249
278
  version: 23,
250
279
  description:
251
280
  "Rename persisted guardian_verification call_mode and guardian_voice_verification_* event_type values to drop the guardian_ prefix",
@@ -253,6 +282,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
253
282
  },
254
283
  {
255
284
  key: "migration_rename_voice_to_phone_v1",
285
+ stepName: "migrateRenameVoiceToPhone",
256
286
  version: 24,
257
287
  description:
258
288
  'Rename stored "voice" channel values to "phone" across all tables with channel text columns',
@@ -260,6 +290,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
260
290
  },
261
291
  {
262
292
  key: "migration_drop_accounts_table_v1",
293
+ stepName: "migrateDropAccountsTable",
263
294
  version: 25,
264
295
  description:
265
296
  "Drop the unused legacy accounts table and its leftover indexes after account_manage removal",
@@ -267,6 +298,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
267
298
  },
268
299
  {
269
300
  key: "migration_reminders_to_schedules_v1",
301
+ stepName: "migrateRemindersToSchedules",
270
302
  version: 26,
271
303
  description:
272
304
  "Copy all existing reminders into cron_jobs as one-shot schedules with correct status and field mapping",
@@ -274,6 +306,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
274
306
  },
275
307
  {
276
308
  key: "migration_drop_reminders_table_v1",
309
+ stepName: "migrateDropRemindersTable",
277
310
  version: 27,
278
311
  dependsOn: ["migration_reminders_to_schedules_v1"],
279
312
  description:
@@ -282,6 +315,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
282
315
  },
283
316
  {
284
317
  key: "migration_oauth_apps_client_secret_path_v1",
318
+ stepName: "migrateOAuthAppsClientSecretPath",
285
319
  version: 28,
286
320
  description:
287
321
  "Add client_secret_credential_path column to oauth_apps and backfill existing rows with convention-based paths",
@@ -289,6 +323,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
289
323
  },
290
324
  {
291
325
  key: "migration_guardian_timestamps_epoch_ms_v1",
326
+ stepName: "migrateGuardianTimestampsEpochMs",
292
327
  version: 29,
293
328
  description:
294
329
  "Convert guardian table timestamps from ISO 8601 text to epoch ms integers for consistency with all other tables",
@@ -296,6 +331,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
296
331
  },
297
332
  {
298
333
  key: "migration_guardian_timestamps_rebuild_v1",
334
+ stepName: "migrateGuardianTimestampsEpochMs",
299
335
  version: 30,
300
336
  dependsOn: ["migration_guardian_timestamps_epoch_ms_v1"],
301
337
  description:
@@ -304,6 +340,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
304
340
  },
305
341
  {
306
342
  key: "migration_rename_gmail_provider_key_to_google_v1",
343
+ stepName: "migrateRenameGmailProviderKeyToGoogle",
307
344
  version: 31,
308
345
  description:
309
346
  "Rename integration:gmail provider key to integration:google across oauth_providers, oauth_apps, and oauth_connections",
@@ -311,6 +348,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
311
348
  },
312
349
  {
313
350
  key: "migration_rename_thread_starters_table_v1",
351
+ stepName: "migrateRenameThreadStartersTable",
314
352
  version: 32,
315
353
  description:
316
354
  "Rename thread_starters table to conversation_starters and recreate indexes with new names",
@@ -318,6 +356,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
318
356
  },
319
357
  {
320
358
  key: "migration_drop_capability_card_state_v1",
359
+ stepName: "migrateDropCapabilityCardState",
321
360
  version: 33,
322
361
  dependsOn: ["migration_rename_thread_starters_table_v1"],
323
362
  description:
@@ -326,6 +365,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
326
365
  },
327
366
  {
328
367
  key: "migration_backfill_inline_attachments_v1",
368
+ stepName: "migrateBackfillInlineAttachmentsToDisk",
329
369
  version: 34,
330
370
  description:
331
371
  "Backfill existing inline base64 attachments to on-disk storage and clear dataBase64",
@@ -333,6 +373,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
333
373
  },
334
374
  {
335
375
  key: "migration_rename_thread_starters_checkpoints_v1",
376
+ stepName: "migrateRenameThreadStartersCheckpoints",
336
377
  version: 35,
337
378
  dependsOn: ["migration_rename_thread_starters_table_v1"],
338
379
  description:
@@ -341,6 +382,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
341
382
  },
342
383
  {
343
384
  key: "migration_backfill_audio_attachment_mime_types_v1",
385
+ stepName: "migrateBackfillAudioAttachmentMimeTypes",
344
386
  version: 36,
345
387
  description:
346
388
  "Backfill correct MIME types for audio attachments stored as application/octet-stream due to missing extension map entries",
@@ -348,6 +390,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
348
390
  },
349
391
  {
350
392
  key: "migration_add_source_type_columns_v1",
393
+ stepName: "migrateAddSourceTypeColumns",
351
394
  version: 37,
352
395
  description:
353
396
  "Add source_type and source_message_role columns to memory_items with backfill from verification_state and source messages",
@@ -355,6 +398,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
355
398
  },
356
399
  {
357
400
  key: "migration_strip_integration_prefix_from_provider_keys_v1",
401
+ stepName: "migrateStripIntegrationPrefixFromProviderKeys",
358
402
  version: 38,
359
403
  description:
360
404
  "Strip integration: prefix from provider_key across oauth_providers, oauth_apps, and oauth_connections",
@@ -362,6 +406,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
362
406
  },
363
407
  {
364
408
  key: "migration_rename_memory_graph_type_values_v1",
409
+ stepName: "migrateRenameMemoryGraphTypeValues",
365
410
  version: 39,
366
411
  description:
367
412
  "Rename legacy memory graph node type values: style → behavioral, relationship → semantic",
@@ -369,6 +414,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
369
414
  },
370
415
  {
371
416
  key: "migration_scrub_corrupted_image_attachments_v1",
417
+ stepName: "migrateScrubCorruptedImageAttachments",
372
418
  version: 40,
373
419
  description:
374
420
  "Remove image attachments containing HTML error pages instead of image data",
@@ -376,6 +422,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
376
422
  },
377
423
  {
378
424
  key: "migration_conversation_host_access_v1",
425
+ stepName: "migrateConversationHostAccess",
379
426
  version: 41,
380
427
  description:
381
428
  "Add a host_access column to conversations so computer access is persisted per conversation with a safe default of disabled",
@@ -383,6 +430,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
383
430
  },
384
431
  {
385
432
  key: "migration_normalize_user_file_by_principal_v1",
433
+ stepName: "migrateNormalizeUserFileByPrincipal",
386
434
  version: 42,
387
435
  description:
388
436
  "Normalize contacts.user_file across rows sharing the same principal_id so every channel for one principal loads the same users/<slug>.md persona and journal directory",
@@ -390,12 +438,14 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
390
438
  },
391
439
  {
392
440
  key: "migration_activation_state_v1",
441
+ stepName: "migrateActivationState",
393
442
  version: 43,
394
443
  description: "Create activation_state table for memory v2",
395
444
  down: downActivationState,
396
445
  },
397
446
  {
398
447
  key: "migration_memory_v2_activation_logs_v1",
448
+ stepName: "migrateMemoryV2ActivationLogs",
399
449
  version: 44,
400
450
  description:
401
451
  "Create memory_v2_activation_logs table for per-turn v2 activation telemetry consumed by the LLM Context Inspector",
@@ -403,6 +453,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
403
453
  },
404
454
  {
405
455
  key: "migration_slack_compaction_watermark_v1",
456
+ stepName: "migrateSlackCompactionWatermark",
406
457
  version: 45,
407
458
  description:
408
459
  "Add Slack-specific compaction watermark columns to conversations",
@@ -410,6 +461,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
410
461
  },
411
462
  {
412
463
  key: "migration_tool_invocations_matched_trust_rule_id_v1",
464
+ stepName: "migrateToolInvocationsMatchedRuleId",
413
465
  version: 46,
414
466
  description:
415
467
  "Add matched_trust_rule_id column to tool_invocations for trust rule audit and rule editor UI",
@@ -417,6 +469,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
417
469
  },
418
470
  {
419
471
  key: "migration_heartbeat_runs_v1",
472
+ stepName: "migrateHeartbeatRuns",
420
473
  version: 47,
421
474
  description:
422
475
  "Create heartbeat_runs table for tracking heartbeat execution lifecycle with CAS state transitions",
@@ -424,6 +477,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
424
477
  },
425
478
  {
426
479
  key: "migration_normalize_slack_external_content_v1",
480
+ stepName: "migrateNormalizeSlackExternalContent",
427
481
  version: 48,
428
482
  description:
429
483
  "Normalize legacy persisted Slack external_content wrappers back to raw message content",
@@ -431,6 +485,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
431
485
  },
432
486
  {
433
487
  key: "migration_a2a_tasks_v1",
488
+ stepName: "migrateA2ATasks",
434
489
  version: 49,
435
490
  description:
436
491
  "Create a2a_tasks table for tracking A2A request/response lifecycle",
@@ -438,6 +493,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
438
493
  },
439
494
  {
440
495
  key: "migration_external_conversation_binding_chat_name_v1",
496
+ stepName: "migrateExternalConversationBindingChatName",
441
497
  version: 50,
442
498
  description:
443
499
  "Add external_chat_name to external conversation bindings for channel footer metadata",
@@ -445,6 +501,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
445
501
  },
446
502
  {
447
503
  key: "migration_memory_v2_injection_events_v1",
504
+ stepName: "migrateMemoryV2InjectionEvents",
448
505
  version: 51,
449
506
  dependsOn: ["migration_memory_v2_activation_logs_v1"],
450
507
  description:
@@ -453,6 +510,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
453
510
  },
454
511
  {
455
512
  key: "migration_conversation_cleaned_at_v1",
513
+ stepName: "migrateConversationCleanedAt",
456
514
  version: 52,
457
515
  description:
458
516
  "Add cleaned_at timestamp to conversations so /clean survives reload and forks inherit conditionally on fork point",
@@ -460,6 +518,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
460
518
  },
461
519
  {
462
520
  key: "migration_rename_cleaned_at_v1",
521
+ stepName: "migrateRenameCleanedAt",
463
522
  version: 53,
464
523
  dependsOn: ["migration_conversation_cleaned_at_v1"],
465
524
  description:
@@ -468,6 +527,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
468
527
  },
469
528
  {
470
529
  key: "migration_llm_usage_add_raw_usage_v1",
530
+ stepName: "migrateLlmUsageAddRawUsage",
471
531
  version: 54,
472
532
  description:
473
533
  "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",
@@ -475,6 +535,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
475
535
  },
476
536
  {
477
537
  key: "migration_memory_v3_coactivation_v1",
538
+ stepName: "migrateMemoryV3Coactivation",
478
539
  version: 55,
479
540
  description:
480
541
  "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",
@@ -482,6 +543,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
482
543
  },
483
544
  {
484
545
  key: "migration_memory_v3_auto_edges_v1",
546
+ stepName: "migrateMemoryV3AutoEdges",
485
547
  version: 56,
486
548
  description:
487
549
  "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",
@@ -489,6 +551,7 @@ export const MIGRATION_REGISTRY: MigrationRegistryEntry[] = [
489
551
  },
490
552
  {
491
553
  key: "migration_schedule_description_backfill_v1",
554
+ stepName: "migrateScheduleDescription",
492
555
  version: 57,
493
556
  description:
494
557
  "Backfill authored schedule descriptions for legacy non-defer schedules from their existing names",