@vellumai/assistant 0.10.0 → 0.10.1-dev.202606240317.ea25efe

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 (972) 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 +12 -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__/guardian-delivery-contract.test.ts +91 -0
  176. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +96 -0
  177. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
  178. package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +48 -0
  179. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
  180. package/node_modules/@vellumai/gateway-client/src/index.ts +28 -0
  181. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
  182. package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
  183. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +95 -0
  184. package/openapi.yaml +458 -18
  185. package/package.json +2 -1
  186. package/scripts/memory-inspect.ts +24 -14
  187. package/scripts/test.sh +36 -15
  188. package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
  189. package/src/__tests__/activation-early-marking.test.ts +1 -1
  190. package/src/__tests__/actor-token-service.test.ts +39 -17
  191. package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
  192. package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
  193. package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
  194. package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
  195. package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
  196. package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
  197. package/src/__tests__/agent-loop.test.ts +3 -0
  198. package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
  199. package/src/__tests__/anthropic-provider.test.ts +210 -9
  200. package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
  201. package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
  202. package/src/__tests__/app-source-watcher.test.ts +30 -10
  203. package/src/__tests__/approval-cascade.test.ts +6 -0
  204. package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
  205. package/src/__tests__/approval-primitive.test.ts +1 -1
  206. package/src/__tests__/approval-routes-http.test.ts +1 -1
  207. package/src/__tests__/assistant-attachments.test.ts +155 -0
  208. package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
  209. package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
  210. package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
  211. package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
  212. package/src/__tests__/attachments-store.test.ts +1 -1
  213. package/src/__tests__/audit-log-rotation.test.ts +50 -54
  214. package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
  215. package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
  216. package/src/__tests__/background-shell-bash.test.ts +4 -1
  217. package/src/__tests__/background-shell-host-bash.test.ts +17 -3
  218. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
  219. package/src/__tests__/call-controller.test.ts +20 -1
  220. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  221. package/src/__tests__/call-domain.test.ts +1 -1
  222. package/src/__tests__/call-pointer-messages.test.ts +3 -4
  223. package/src/__tests__/call-recovery.test.ts +1 -1
  224. package/src/__tests__/call-routes-http.test.ts +1 -1
  225. package/src/__tests__/call-store.test.ts +1 -1
  226. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  227. package/src/__tests__/canonical-guardian-store.test.ts +24 -1
  228. package/src/__tests__/card-surface-data.test.ts +60 -0
  229. package/src/__tests__/channel-approval-routes.test.ts +73 -1119
  230. package/src/__tests__/channel-delivery-store.test.ts +1 -1
  231. package/src/__tests__/channel-guardian.test.ts +291 -641
  232. package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
  233. package/src/__tests__/channel-retry-sweep.test.ts +1 -1
  234. package/src/__tests__/compaction-events.test.ts +6 -0
  235. package/src/__tests__/compaction-trail-store.test.ts +6 -5
  236. package/src/__tests__/compaction.benchmark.test.ts +0 -1
  237. package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
  238. package/src/__tests__/config-loader-backfill.test.ts +188 -52
  239. package/src/__tests__/config-schema.test.ts +35 -0
  240. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
  241. package/src/__tests__/contact-store-user-file.test.ts +2 -2
  242. package/src/__tests__/contacts-relay-reads.test.ts +409 -0
  243. package/src/__tests__/contacts-tools.test.ts +4 -4
  244. package/src/__tests__/contacts-write.test.ts +1 -2
  245. package/src/__tests__/context-search-conversations-source.test.ts +1 -1
  246. package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
  247. package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
  248. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  249. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
  250. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
  251. package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
  252. package/src/__tests__/conversation-agent-loop.test.ts +7 -0
  253. package/src/__tests__/conversation-attachments.test.ts +2 -5
  254. package/src/__tests__/conversation-attention-store.test.ts +1 -1
  255. package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
  256. package/src/__tests__/conversation-clear-safety.test.ts +1 -1
  257. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
  258. package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
  259. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
  260. package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
  261. package/src/__tests__/conversation-disk-view.test.ts +1 -1
  262. package/src/__tests__/conversation-fork-crud.test.ts +10 -8
  263. package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
  264. package/src/__tests__/conversation-fork-route.test.ts +1 -1
  265. package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
  266. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  267. package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
  268. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  269. package/src/__tests__/conversation-lifecycle.test.ts +117 -0
  270. package/src/__tests__/conversation-list-source.test.ts +3 -3
  271. package/src/__tests__/conversation-process-callsite.test.ts +6 -14
  272. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  273. package/src/__tests__/conversation-queue.test.ts +95 -0
  274. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
  275. package/src/__tests__/conversation-routes-guardian-reply.test.ts +12 -0
  276. package/src/__tests__/conversation-routes-slash-commands.test.ts +12 -0
  277. package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
  278. package/src/__tests__/conversation-slash-queue.test.ts +6 -0
  279. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  280. package/src/__tests__/conversation-speed-override.test.ts +6 -0
  281. package/src/__tests__/conversation-starter-routes.test.ts +5 -5
  282. package/src/__tests__/conversation-store.test.ts +1 -1
  283. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +4 -4
  284. package/src/__tests__/conversation-surfaces-task-progress.test.ts +352 -0
  285. package/src/__tests__/conversation-sync-tags.test.ts +1 -1
  286. package/src/__tests__/conversation-tool-setup-attribution.test.ts +47 -0
  287. package/src/__tests__/conversation-usage.test.ts +1 -1
  288. package/src/__tests__/conversation-wipe.test.ts +9 -8
  289. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
  290. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  291. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  292. package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
  293. package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
  294. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  295. package/src/__tests__/db-acp-history.test.ts +2 -2
  296. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
  297. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
  298. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
  299. package/src/__tests__/db-migration-rollback.test.ts +129 -39
  300. package/src/__tests__/db-proxy-transaction.test.ts +1 -1
  301. package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
  302. package/src/__tests__/db-test-helpers.ts +36 -19
  303. package/src/__tests__/delete-propagation.test.ts +1 -1
  304. package/src/__tests__/deterministic-verification-control-plane.test.ts +28 -8
  305. package/src/__tests__/disk-pressure-guard.test.ts +41 -0
  306. package/src/__tests__/disk-pressure-tools.test.ts +41 -1
  307. package/src/__tests__/dm-backfill.test.ts +1 -1
  308. package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
  309. package/src/__tests__/dynamic-page-surface.test.ts +0 -94
  310. package/src/__tests__/edit-propagation.test.ts +1 -1
  311. package/src/__tests__/emit-signal-routing-intent.test.ts +93 -5
  312. package/src/__tests__/empty-response-hook.test.ts +42 -0
  313. package/src/__tests__/events-client-registration.test.ts +1 -1
  314. package/src/__tests__/events-dev-bypass-actor.test.ts +7 -1
  315. package/src/__tests__/followup-tools.test.ts +1 -1
  316. package/src/__tests__/gemini-count-tokens.test.ts +70 -0
  317. package/src/__tests__/guardian-action-sweep.test.ts +9 -2
  318. package/src/__tests__/guardian-binding-drift-heal.test.ts +76 -11
  319. package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
  320. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
  321. package/src/__tests__/guardian-dispatch.test.ts +96 -2
  322. package/src/__tests__/guardian-outbound-http.test.ts +20 -12
  323. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
  324. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  325. package/src/__tests__/guardian-routing-state.test.ts +1 -2
  326. package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
  327. package/src/__tests__/headless-browser-mode.test.ts +2 -2
  328. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  329. package/src/__tests__/heartbeat-service.test.ts +6 -0
  330. package/src/__tests__/helpers/channel-test-adapter.ts +92 -0
  331. package/src/__tests__/host-app-control-routes.test.ts +24 -30
  332. package/src/__tests__/host-bash-routes.test.ts +31 -41
  333. package/src/__tests__/host-browser-routes.test.ts +26 -32
  334. package/src/__tests__/host-cu-routes-targeted.test.ts +25 -33
  335. package/src/__tests__/host-file-routes-targeted.test.ts +40 -52
  336. package/src/__tests__/host-transfer-routes-targeted.test.ts +31 -43
  337. package/src/__tests__/http-conversation-lineage.test.ts +1 -1
  338. package/src/__tests__/http-user-message-parity.test.ts +165 -8
  339. package/src/__tests__/image-recovery-hook.test.ts +1 -1
  340. package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
  341. package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
  342. package/src/__tests__/inference-profile-reaper.test.ts +1 -1
  343. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  344. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  345. package/src/__tests__/injector-chain.test.ts +1 -1
  346. package/src/__tests__/injector-disk-pressure.test.ts +11 -6
  347. package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
  348. package/src/__tests__/invite-redemption-service.test.ts +244 -43
  349. package/src/__tests__/invite-routes-http.test.ts +35 -186
  350. package/src/__tests__/invite-service-ipc.test.ts +287 -0
  351. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
  352. package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
  353. package/src/__tests__/list-messages-attachments.test.ts +42 -1
  354. package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
  355. package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
  356. package/src/__tests__/list-messages-page-latest.test.ts +1 -1
  357. package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
  358. package/src/__tests__/llm-context-normalization.test.ts +105 -0
  359. package/src/__tests__/llm-context-route-provider.test.ts +69 -4
  360. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
  361. package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
  362. package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
  363. package/src/__tests__/llm-resolver.test.ts +205 -5
  364. package/src/__tests__/llm-usage-store.test.ts +65 -1
  365. package/src/__tests__/log-export-routes.test.ts +1 -1
  366. package/src/__tests__/log-export-workspace.test.ts +3 -3
  367. package/src/__tests__/media-stream-server-integration.test.ts +127 -0
  368. package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
  369. package/src/__tests__/memory-recall-log-store.test.ts +1 -1
  370. package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
  371. package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
  372. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  373. package/src/__tests__/mtime-cache.test.ts +375 -0
  374. package/src/__tests__/non-member-access-request.test.ts +190 -19
  375. package/src/__tests__/notification-broadcaster.test.ts +4 -0
  376. package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
  377. package/src/__tests__/notification-decision-recipient-context.test.ts +33 -32
  378. package/src/__tests__/notification-deep-link.test.ts +4 -0
  379. package/src/__tests__/notification-guardian-path.test.ts +20 -1
  380. package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
  381. package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
  382. package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
  383. package/src/__tests__/oauth-store.test.ts +1 -1
  384. package/src/__tests__/pending-interactions-resolved-event.test.ts +7 -4
  385. package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
  386. package/src/__tests__/persist-unsendable-image.test.ts +1 -1
  387. package/src/__tests__/persona-resolver.test.ts +39 -1
  388. package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
  389. package/src/__tests__/playbook-execution.test.ts +1 -1
  390. package/src/__tests__/playbook-tools.test.ts +1 -1
  391. package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
  392. package/src/__tests__/plugin-bootstrap.test.ts +78 -0
  393. package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
  394. package/src/__tests__/provider-usage-tracking.test.ts +40 -1
  395. package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
  396. package/src/__tests__/reaction-persistence.test.ts +1 -1
  397. package/src/__tests__/registry.test.ts +3 -0
  398. package/src/__tests__/relay-server.test.ts +1026 -73
  399. package/src/__tests__/runtime-attachment-metadata.test.ts +9 -1
  400. package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
  401. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  402. package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
  403. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  404. package/src/__tests__/schedule-retry.test.ts +1 -1
  405. package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
  406. package/src/__tests__/schedule-routes.test.ts +1 -1
  407. package/src/__tests__/schedule-store.test.ts +1 -1
  408. package/src/__tests__/schedule-tools.test.ts +1 -1
  409. package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
  410. package/src/__tests__/scheduler-recurrence.test.ts +1 -1
  411. package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
  412. package/src/__tests__/scheduler-wake.test.ts +2 -1
  413. package/src/__tests__/scoped-approval-grants.test.ts +1 -1
  414. package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
  415. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
  416. package/src/__tests__/secret-ingress-http.test.ts +12 -0
  417. package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
  418. package/src/__tests__/send-endpoint-busy.test.ts +31 -9
  419. package/src/__tests__/sequence-store.test.ts +1 -1
  420. package/src/__tests__/server-history-render.test.ts +40 -1
  421. package/src/__tests__/settings-routes.test.ts +11 -10
  422. package/src/__tests__/skill-load-tool.test.ts +72 -0
  423. package/src/__tests__/skills.test.ts +44 -0
  424. package/src/__tests__/slack-inbound-verification.test.ts +48 -5
  425. package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
  426. package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
  427. package/src/__tests__/sse-actor-principal-guardian-source.test.ts +102 -0
  428. package/src/__tests__/steer-on-enqueue-question.test.ts +181 -0
  429. package/src/__tests__/stt-hints.test.ts +44 -13
  430. package/src/__tests__/subagent-detail.test.ts +27 -0
  431. package/src/__tests__/subagent-disposal.test.ts +65 -0
  432. package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
  433. package/src/__tests__/subagent-tools.test.ts +1 -31
  434. package/src/__tests__/system-prompt.test.ts +1 -1
  435. package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
  436. package/src/__tests__/task-compiler.test.ts +1 -1
  437. package/src/__tests__/task-management-tools.test.ts +1 -1
  438. package/src/__tests__/task-memory-cleanup.test.ts +9 -6
  439. package/src/__tests__/task-scheduler.test.ts +1 -1
  440. package/src/__tests__/thread-backfill.test.ts +1 -1
  441. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  442. package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
  443. package/src/__tests__/tool-executor.test.ts +37 -1
  444. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
  445. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
  446. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
  447. package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
  448. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  449. package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
  450. package/src/__tests__/turn-events-store.test.ts +1 -1
  451. package/src/__tests__/twilio-routes.test.ts +98 -3
  452. package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
  453. package/src/__tests__/usage-routes.test.ts +1 -1
  454. package/src/__tests__/user-plugin-loader.test.ts +34 -29
  455. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  456. package/src/__tests__/voice-invite-redemption.test.ts +134 -36
  457. package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
  458. package/src/__tests__/voice-session-bridge.test.ts +1 -1
  459. package/src/__tests__/workspace-git-service.test.ts +114 -1
  460. package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
  461. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
  462. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
  463. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
  464. package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
  465. package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
  466. package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
  467. package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
  468. package/src/__tests__/workspace-tool-loader.test.ts +3 -0
  469. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
  470. package/src/a2a/__tests__/task-store.test.ts +1 -1
  471. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
  472. package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
  473. package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
  474. package/src/acp/__tests__/session-manager.test.ts +72 -1
  475. package/src/acp/index.ts +10 -0
  476. package/src/acp/session-manager.ts +35 -0
  477. package/src/agent/loop-exclusive-tool.test.ts +150 -0
  478. package/src/agent/loop.ts +101 -27
  479. package/src/api/constants/sse-replay.ts +41 -0
  480. package/src/api/events/ui-surface-show.ts +8 -3
  481. package/src/api/index.ts +7 -6
  482. package/src/api/responses/conversation-message.ts +4 -0
  483. package/src/api/responses/llm-request-log-entry.ts +25 -0
  484. package/src/api/responses/subagent-detail.ts +17 -0
  485. package/src/api/surfaces.ts +33 -0
  486. package/src/approvals/AGENTS.md +1 -2
  487. package/src/approvals/guardian-decision-primitive.ts +13 -210
  488. package/src/approvals/guardian-request-resolvers.ts +104 -58
  489. package/src/background-wake/wake-intent-hooks.test.ts +1 -1
  490. package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
  491. package/src/calls/__tests__/relay-setup-router.test.ts +349 -65
  492. package/src/calls/guardian-dispatch.ts +10 -8
  493. package/src/calls/inbound-trust-reader.ts +56 -0
  494. package/src/calls/media-stream-server.ts +21 -0
  495. package/src/calls/relay-server.ts +231 -72
  496. package/src/calls/relay-setup-router.ts +57 -13
  497. package/src/calls/relay-verification.ts +7 -7
  498. package/src/calls/stt-hints.ts +9 -12
  499. package/src/calls/twilio-routes.ts +13 -3
  500. package/src/cli/commands/__tests__/cache.test.ts +8 -1
  501. package/src/cli/commands/cache.ts +194 -181
  502. package/src/cli/commands/contacts.ts +6 -24
  503. package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
  504. package/src/cli/commands/db/__tests__/status.test.ts +7 -3
  505. package/src/cli/commands/db/status.ts +212 -33
  506. package/src/cli/commands/mcp.ts +252 -218
  507. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
  508. package/src/cli/commands/memory/__tests__/worker.test.ts +302 -0
  509. package/src/cli/commands/memory/index.ts +4 -0
  510. package/src/cli/commands/memory/memory-retrospective.ts +129 -0
  511. package/src/cli/commands/memory/memory-v3.ts +176 -4
  512. package/src/cli/commands/memory/worker.ts +175 -0
  513. package/src/cli/commands/plugins.ts +343 -14
  514. package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
  515. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +160 -1
  516. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
  517. package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
  518. package/src/cli/lib/install-from-github.ts +47 -6
  519. package/src/cli/lib/list-installed-plugins.ts +179 -1
  520. package/src/cli/lib/plugin-marketplace.ts +11 -0
  521. package/src/cli/lib/plugin-pin-history.ts +257 -0
  522. package/src/cli/lib/toggle-plugin.ts +146 -0
  523. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +143 -0
  524. package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
  525. package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
  526. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
  527. package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
  528. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
  529. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
  530. package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
  531. package/src/config/bundled-skills/contacts/SKILL.md +7 -12
  532. package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
  533. package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
  534. package/src/config/bundled-skills/workflows/SKILL.md +4 -3
  535. package/src/config/call-site-defaults.ts +11 -2
  536. package/src/config/feature-flag-registry.json +0 -8
  537. package/src/config/llm-resolver.ts +151 -14
  538. package/src/config/loader.ts +36 -5
  539. package/src/config/profile-dispatchability.ts +11 -0
  540. package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
  541. package/src/config/schemas/call-site-catalog.ts +7 -0
  542. package/src/config/schemas/llm.ts +2 -0
  543. package/src/config/schemas/memory-lifecycle.ts +17 -3
  544. package/src/config/schemas/memory-v3.ts +7 -0
  545. package/src/config/schemas/memory.ts +4 -0
  546. package/src/config/schemas/timeouts.ts +32 -0
  547. package/src/config/seed-inference-profiles.ts +147 -50
  548. package/src/config/skills.ts +27 -5
  549. package/src/config/sync-gated-profiles.ts +13 -1
  550. package/src/contacts/__tests__/guardian-delivery-reader.test.ts +312 -0
  551. package/src/contacts/contact-store.ts +21 -0
  552. package/src/contacts/contacts-write.ts +3 -0
  553. package/src/contacts/guardian-delivery-reader.ts +223 -0
  554. package/src/contacts/member-status.ts +9 -0
  555. package/src/credential-health/credential-health-service.ts +1 -5
  556. package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
  557. package/src/daemon/app-source-watcher.ts +31 -18
  558. package/src/daemon/assistant-attachments.ts +94 -4
  559. package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
  560. package/src/daemon/conversation-agent-loop.ts +18 -36
  561. package/src/daemon/conversation-process.ts +35 -16
  562. package/src/daemon/conversation-runtime-assembly.ts +91 -66
  563. package/src/daemon/conversation-surfaces.ts +273 -18
  564. package/src/daemon/conversation-tool-setup.ts +24 -64
  565. package/src/daemon/conversation.ts +149 -53
  566. package/src/daemon/disk-pressure-guard.ts +12 -2
  567. package/src/daemon/event-loop-watchdog.test.ts +85 -0
  568. package/src/daemon/event-loop-watchdog.ts +133 -0
  569. package/src/daemon/external-plugins-bootstrap.ts +26 -80
  570. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
  571. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
  572. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
  573. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
  574. package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
  575. package/src/daemon/handlers/config-channels.ts +41 -27
  576. package/src/daemon/handlers/conversations.ts +84 -0
  577. package/src/daemon/handlers/shared.ts +7 -0
  578. package/src/daemon/lifecycle.ts +44 -5
  579. package/src/daemon/memory-v2-startup.test.ts +72 -0
  580. package/src/daemon/memory-v2-startup.ts +87 -19
  581. package/src/daemon/message-types/inbox.ts +0 -6
  582. package/src/daemon/message-types/messages.ts +0 -4
  583. package/src/daemon/message-types/surfaces.ts +12 -11
  584. package/src/daemon/server.ts +0 -4
  585. package/src/daemon/shutdown-handlers.ts +20 -0
  586. package/src/daemon/tool-setup-types.ts +7 -5
  587. package/src/daemon/trust-context.ts +6 -0
  588. package/src/daemon/wake-conversation-ops.ts +70 -0
  589. package/src/daemon/workspace-tools-watcher.ts +7 -3
  590. package/src/documents/document-comments-store.test.ts +1 -1
  591. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
  592. package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
  593. package/src/heartbeat/heartbeat-service.ts +3 -4
  594. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  595. package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
  596. package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
  597. package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
  598. package/src/ipc/assistant-server.ts +10 -2
  599. package/src/ipc/gateway-client.ts +2 -1
  600. package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
  601. package/src/ipc/routes/invite-ipc-routes.ts +66 -0
  602. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  603. package/src/memory/__tests__/activation-session-store.test.ts +1 -1
  604. package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
  605. package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
  606. package/src/memory/__tests__/conversation-queries.test.ts +1 -1
  607. package/src/memory/__tests__/db-async-query.test.ts +1 -1
  608. package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
  609. package/src/memory/__tests__/db-maintenance.test.ts +28 -36
  610. package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
  611. package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
  612. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
  613. package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
  614. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
  615. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
  616. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
  617. package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
  618. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
  619. package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
  620. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
  621. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
  622. package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
  623. package/src/memory/__tests__/prompt-override.test.ts +192 -0
  624. package/src/memory/__tests__/table-relocation.test.ts +129 -0
  625. package/src/memory/conversation-crud.ts +461 -152
  626. package/src/memory/db-async-query.ts +89 -5
  627. package/src/memory/db-connection.ts +101 -18
  628. package/src/memory/db-init.ts +409 -234
  629. package/src/memory/db-maintenance.ts +43 -38
  630. package/src/memory/db-singleton.ts +45 -19
  631. package/src/memory/embedding-gemini.test.ts +3 -1
  632. package/src/memory/embedding-gemini.ts +18 -2
  633. package/src/memory/fork-message-copy.ts +170 -0
  634. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
  635. package/src/memory/graph/bootstrap.test.ts +6 -3
  636. package/src/memory/graph/retriever.test.ts +12 -12
  637. package/src/memory/graph/store.test.ts +15 -25
  638. package/src/memory/graph/store.ts +23 -14
  639. package/src/memory/graph/tool-handlers.ts +34 -5
  640. package/src/memory/graph/tools.ts +5 -2
  641. package/src/memory/indexer.ts +21 -9
  642. package/src/memory/job-handlers/cleanup.ts +10 -3
  643. package/src/memory/job-handlers/embedding.test.ts +4 -4
  644. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
  645. package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
  646. package/src/memory/jobs-store.ts +36 -24
  647. package/src/memory/llm-request-log-store.ts +51 -19
  648. package/src/memory/llm-usage-store.ts +79 -21
  649. package/src/memory/memory-retrospective-job.ts +27 -19
  650. package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
  651. package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
  652. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +13 -3
  653. package/src/memory/migrations/104-core-indexes.ts +1 -1
  654. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
  655. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
  656. package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
  657. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
  658. package/src/memory/migrations/136-drop-assistant-id-columns.ts +241 -219
  659. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
  660. package/src/memory/migrations/141-rename-verification-table.ts +45 -48
  661. package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
  662. package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
  663. package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
  664. package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
  665. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
  666. package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
  667. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
  668. package/src/memory/migrations/157-invite-contact-id.ts +73 -76
  669. package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
  670. package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
  671. package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
  672. package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
  673. package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
  674. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
  675. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
  676. package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
  677. package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
  678. package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
  679. package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
  680. package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
  681. package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
  682. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
  683. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
  684. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +135 -68
  685. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
  686. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
  687. package/src/memory/migrations/217-conversation-host-access.ts +13 -18
  688. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
  689. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
  690. package/src/memory/migrations/230-acp-session-history.ts +23 -28
  691. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
  692. package/src/memory/migrations/232-activation-state.ts +11 -16
  693. package/src/memory/migrations/233-document-conversations.ts +20 -25
  694. package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
  695. package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
  696. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
  697. package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
  698. package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
  699. package/src/memory/migrations/242-message-bookmarks.ts +17 -22
  700. package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
  701. package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
  702. package/src/memory/migrations/251-a2a-tasks.ts +27 -32
  703. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
  704. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
  705. package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
  706. package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
  707. package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
  708. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
  709. package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
  710. package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
  711. package/src/memory/migrations/270-schedule-description.ts +7 -12
  712. package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
  713. package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
  714. package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
  715. package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
  716. package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
  717. package/src/memory/migrations/__tests__/014-backfill-inbox-thread-state.test.ts +108 -0
  718. package/src/memory/migrations/__tests__/136-drop-assistant-id-columns.test.ts +82 -0
  719. package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +224 -0
  720. package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
  721. package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
  722. package/src/memory/migrations/helpers/relocation.ts +227 -0
  723. package/src/memory/migrations/registry.ts +63 -0
  724. package/src/memory/migrations/run-migrations.ts +187 -16
  725. package/src/memory/migrations/schema-introspection.ts +14 -0
  726. package/src/memory/migrations/validate-migration-state.ts +50 -145
  727. package/src/memory/prompt-override.ts +129 -0
  728. package/src/memory/raw-query.ts +47 -2
  729. package/src/memory/skill-loaded-events-store.test.ts +1 -1
  730. package/src/memory/task-memory-cleanup.ts +62 -41
  731. package/src/memory/tool-executed-events-store.test.ts +1 -1
  732. package/src/memory/turn-trace-store.test.ts +1 -1
  733. package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
  734. package/src/memory/v2/__tests__/cli-command-store.test.ts +25 -0
  735. package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
  736. package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
  737. package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
  738. package/src/memory/v2/__tests__/skill-store.test.ts +80 -0
  739. package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
  740. package/src/memory/v2/cli-command-store.ts +75 -38
  741. package/src/memory/v2/prompts/consolidation.ts +13 -82
  742. package/src/memory/v2/prompts/router.ts +21 -93
  743. package/src/memory/v2/skill-store.ts +68 -31
  744. package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
  745. package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
  746. package/src/memory/v3-eval/eval-packets.ts +197 -12
  747. package/src/memory/v3-eval/eval-tally.ts +234 -0
  748. package/src/memory/worker-control.ts +118 -0
  749. package/src/memory/worker-process.ts +72 -0
  750. package/src/messaging/provider.ts +10 -0
  751. package/src/messaging/providers/gmail/adapter.ts +1 -0
  752. package/src/messaging/providers/gmail/client.ts +13 -0
  753. package/src/messaging/providers/index.ts +1 -1
  754. package/src/messaging/providers/slack/send.test.ts +87 -39
  755. package/src/messaging/providers/slack/send.ts +84 -105
  756. package/src/notifications/README.md +9 -5
  757. package/src/notifications/__tests__/broadcaster.test.ts +16 -8
  758. package/src/notifications/__tests__/connected-channels.test.ts +114 -0
  759. package/src/notifications/__tests__/decision-engine.test.ts +78 -9
  760. package/src/notifications/__tests__/destination-resolver.test.ts +256 -0
  761. package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
  762. package/src/notifications/adapters/slack.ts +12 -10
  763. package/src/notifications/approval-card-builder.ts +81 -20
  764. package/src/notifications/approval-card-data.ts +8 -5
  765. package/src/notifications/broadcaster.ts +8 -1
  766. package/src/notifications/canonical-delivery-recorder.ts +7 -5
  767. package/src/notifications/conversation-candidates.ts +24 -59
  768. package/src/notifications/copy-composer.ts +48 -68
  769. package/src/notifications/decision-engine.ts +15 -7
  770. package/src/notifications/destination-resolver.ts +68 -24
  771. package/src/notifications/deterministic-checks.ts +19 -16
  772. package/src/notifications/emit-signal.ts +68 -15
  773. package/src/notifications/trusted-contact-payloads.ts +70 -0
  774. package/src/oauth/byo-connection.test.ts +9 -0
  775. package/src/oauth/connection-resolver.test.ts +174 -6
  776. package/src/oauth/connection-resolver.ts +132 -5
  777. package/src/oauth/oauth-store.ts +16 -3
  778. package/src/oauth/scope-utils.ts +39 -0
  779. package/src/permissions/question-prompter.test.ts +1 -1
  780. package/src/permissions/question-prompter.ts +7 -4
  781. package/src/plugin-api/index.ts +9 -4
  782. package/src/plugin-api/model-profiles.test.ts +123 -0
  783. package/src/plugin-api/model-profiles.ts +5 -1
  784. package/src/plugin-api/vision-support.test.ts +173 -0
  785. package/src/plugin-api/vision-support.ts +113 -0
  786. package/src/plugins/defaults/advisor/__tests__/consult.test.ts +90 -0
  787. package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +106 -0
  788. package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +60 -0
  789. package/src/plugins/defaults/advisor/consult.ts +65 -6
  790. package/src/plugins/defaults/advisor/context-pack.ts +288 -0
  791. package/src/plugins/defaults/advisor/steering.ts +14 -2
  792. package/src/plugins/defaults/advisor/tools/advisor.ts +32 -5
  793. package/src/plugins/defaults/compaction/window-manager.ts +45 -64
  794. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
  795. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +441 -0
  796. package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +57 -0
  797. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +61 -0
  798. package/src/plugins/defaults/image-fallback/package.json +14 -0
  799. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +108 -0
  800. package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
  801. package/src/plugins/defaults/image-fallback/src/image-persist.ts +56 -0
  802. package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
  803. package/src/plugins/defaults/index.ts +27 -0
  804. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
  805. package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
  806. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +134 -5
  807. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +11 -2
  808. package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +146 -0
  809. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +246 -19
  810. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +8 -1
  811. package/src/plugins/external-plugin-loader.ts +47 -6
  812. package/src/plugins/mtime-cache.ts +772 -0
  813. package/src/plugins/pipeline.ts +7 -2
  814. package/src/plugins/registry.ts +16 -5
  815. package/src/plugins/user-loader.ts +22 -76
  816. package/src/prompts/persona-resolver.ts +29 -11
  817. package/src/prompts/system-prompt.ts +1 -1
  818. package/src/prompts/templates/system-sections.ts +4 -4
  819. package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
  820. package/src/providers/anthropic/client.ts +290 -185
  821. package/src/providers/call-site-routing.ts +14 -0
  822. package/src/providers/gemini/client.ts +43 -0
  823. package/src/providers/inference/adapter-factory.ts +6 -0
  824. package/src/providers/inference/connections.ts +6 -1
  825. package/src/providers/model-catalog.ts +53 -0
  826. package/src/providers/openai/responses-provider.ts +5 -0
  827. package/src/providers/openrouter/client.ts +5 -0
  828. package/src/providers/platform-proxy/constants.ts +5 -0
  829. package/src/providers/provider-send-message.ts +4 -0
  830. package/src/providers/ratelimit.ts +13 -0
  831. package/src/providers/retry.ts +14 -0
  832. package/src/providers/together/client.ts +35 -0
  833. package/src/providers/types.ts +25 -0
  834. package/src/providers/usage-tracking.ts +11 -0
  835. package/src/runtime/AGENTS.md +9 -1
  836. package/src/runtime/__tests__/agent-wake.test.ts +259 -4
  837. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +181 -0
  838. package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +64 -0
  839. package/src/runtime/__tests__/local-principal-trust.test.ts +164 -0
  840. package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
  841. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +670 -0
  842. package/src/runtime/access-request-helper.ts +19 -39
  843. package/src/runtime/actor-trust-resolver.ts +8 -16
  844. package/src/runtime/agent-wake.ts +183 -60
  845. package/src/runtime/anchored-guardian.test.ts +156 -0
  846. package/src/runtime/anchored-guardian.ts +135 -0
  847. package/src/runtime/assistant-stream-state.ts +9 -2
  848. package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +99 -0
  849. package/src/runtime/auth/require-bound-guardian.ts +21 -11
  850. package/src/runtime/channel-reply-delivery.ts +6 -3
  851. package/src/runtime/channel-verification-service.ts +24 -0
  852. package/src/runtime/guardian-decision-types.ts +3 -22
  853. package/src/runtime/guardian-vellum-migration.ts +66 -7
  854. package/src/runtime/http-server.ts +1 -15
  855. package/src/runtime/invite-redemption-service.ts +155 -6
  856. package/src/runtime/invite-service.ts +113 -62
  857. package/src/runtime/local-actor-identity.ts +76 -11
  858. package/src/runtime/local-principal-trust.ts +52 -0
  859. package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
  860. package/src/runtime/pending-interactions.ts +11 -1
  861. package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
  862. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
  863. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
  864. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
  865. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
  866. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
  867. package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
  868. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  869. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
  870. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
  871. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
  872. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
  873. package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
  874. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
  875. package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
  876. package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
  877. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
  878. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +163 -0
  879. package/src/runtime/routes/acp-routes-list.test.ts +4 -0
  880. package/src/runtime/routes/acp-routes.test.ts +5 -6
  881. package/src/runtime/routes/attachment-routes.ts +21 -17
  882. package/src/runtime/routes/browser-routes.ts +19 -1
  883. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
  884. package/src/runtime/routes/channel-verification-routes.ts +13 -2
  885. package/src/runtime/routes/contact-routes.ts +275 -164
  886. package/src/runtime/routes/conversation-query-routes.ts +15 -5
  887. package/src/runtime/routes/conversation-routes.ts +80 -66
  888. package/src/runtime/routes/conversation-starter-routes.ts +7 -8
  889. package/src/runtime/routes/events-routes.ts +2 -2
  890. package/src/runtime/routes/guardian-approval-interception.ts +13 -274
  891. package/src/runtime/routes/host-app-control-routes.ts +5 -4
  892. package/src/runtime/routes/host-bash-routes.ts +5 -4
  893. package/src/runtime/routes/host-browser-routes.ts +9 -11
  894. package/src/runtime/routes/host-cu-routes.ts +5 -4
  895. package/src/runtime/routes/host-file-routes.ts +5 -4
  896. package/src/runtime/routes/host-transfer-routes.ts +6 -6
  897. package/src/runtime/routes/http-adapter.ts +1 -1
  898. package/src/runtime/routes/inbound-message-handler.ts +21 -16
  899. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +376 -0
  900. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +86 -64
  901. package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
  902. package/src/runtime/routes/inbound-stages/background-dispatch.ts +16 -4
  903. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +21 -8
  904. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +14 -3
  905. package/src/runtime/routes/llm-context-normalization.ts +71 -0
  906. package/src/runtime/routes/log-export-routes.ts +2 -2
  907. package/src/runtime/routes/mcp-auth-routes.ts +38 -15
  908. package/src/runtime/routes/memory-eval-routes.ts +92 -0
  909. package/src/runtime/routes/memory-item-routes.test.ts +12 -11
  910. package/src/runtime/routes/migration-routes.ts +51 -40
  911. package/src/runtime/routes/plugins-routes.ts +164 -8
  912. package/src/runtime/routes/schedule-routes.ts +1 -0
  913. package/src/runtime/routes/subagents-routes.ts +5 -0
  914. package/src/runtime/routes/surface-action-routes.ts +39 -51
  915. package/src/runtime/routes/usage-routes.ts +3 -0
  916. package/src/runtime/routes/work-items-routes.test.ts +1 -1
  917. package/src/runtime/slack-block-formatting.ts +46 -48
  918. package/src/runtime/trust-verdict-consumer.ts +210 -0
  919. package/src/schedule/scheduler.ts +6 -9
  920. package/src/signals/user-message.ts +16 -0
  921. package/src/subagent/manager.ts +9 -0
  922. package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
  923. package/src/tools/ask-question/ask-question-tool.test.ts +89 -52
  924. package/src/tools/ask-question/ask-question-tool.ts +27 -73
  925. package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
  926. package/src/tools/browser/browser-execution.ts +16 -4
  927. package/src/tools/document/document-comment-tool.test.ts +1 -1
  928. package/src/tools/executor.ts +15 -3
  929. package/src/tools/host-terminal/host-shell.ts +28 -9
  930. package/src/tools/memory/register.test.ts +32 -0
  931. package/src/tools/skills/load.ts +43 -2
  932. package/src/tools/subagent/spawn.ts +4 -10
  933. package/src/tools/terminal/shell.ts +16 -5
  934. package/src/tools/tool-defaults.ts +2 -0
  935. package/src/tools/types.ts +18 -2
  936. package/src/tools/ui-surface/definitions.ts +0 -43
  937. package/src/util/fs-watcher-error.ts +36 -0
  938. package/src/util/log-redact.ts +2 -4
  939. package/src/util/logs-db-path.ts +22 -0
  940. package/src/util/memory-db-path.ts +23 -0
  941. package/src/util/platform.ts +5 -0
  942. package/src/watcher/providers/gmail.ts +7 -2
  943. package/src/workflows/engine-integration.test.ts +1 -1
  944. package/src/workflows/engine.test.ts +1 -1
  945. package/src/workflows/engine.ts +22 -0
  946. package/src/workflows/fanout-load.test.ts +1 -1
  947. package/src/workflows/journal-store.test.ts +1 -1
  948. package/src/workflows/leaf-runner.test.ts +40 -1
  949. package/src/workflows/leaf-runner.ts +26 -1
  950. package/src/workspace/git-service.ts +144 -29
  951. package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
  952. package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
  953. package/src/workspace/migrations/registry.ts +4 -0
  954. package/src/workspace/migrations/runner.ts +32 -2
  955. package/src/__tests__/access-request-decision.test.ts +0 -375
  956. package/src/__tests__/guardian-grant-minting.test.ts +0 -607
  957. package/src/__tests__/plugin-source-watcher.test.ts +0 -302
  958. package/src/api/events/turn-profile-auto-routed.ts +0 -28
  959. package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
  960. package/src/daemon/plugin-source-watcher.ts +0 -278
  961. package/src/daemon/switch-inference-profile-tool.ts +0 -62
  962. package/src/memory/guardian-approvals.ts +0 -361
  963. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
  964. package/src/memory/migrations/038-actor-token-records.ts +0 -45
  965. package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
  966. package/src/memory/migrations/103-complex-migrations.ts +0 -23
  967. package/src/memory/migrations/113-late-migrations.ts +0 -30
  968. package/src/memory/migrations/index.ts +0 -301
  969. package/src/runtime/routes/access-request-decision.ts +0 -297
  970. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
  971. package/src/runtime/routes/channel-guardian-routes.ts +0 -19
  972. package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
@@ -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",
@@ -1,41 +1,212 @@
1
1
  import { getLogger } from "../../util/logger.js";
2
- import type { DrizzleDb } from "../db-connection.js";
2
+ import { getDbPath } from "../../util/platform.js";
3
+ import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
3
4
 
4
5
  const log = getLogger("db-init");
5
6
 
6
- /** A single forward migration step, identified for logging by its `.name`. */
7
- export type MigrationStep = (database: DrizzleDb) => void;
7
+ /**
8
+ * A single forward migration step, identified for checkpointing and logging by
9
+ * its `.name`. Anonymous steps (empty `.name`) cannot be tracked and always run.
10
+ *
11
+ * A step may be synchronous or return a promise. The runner awaits an async
12
+ * step to completion before checkpointing it and moving on, so ordering is
13
+ * preserved exactly as for sync steps: step N+1 never starts — and is never
14
+ * skipped via checkpoint — until step N has fully finished. This lets a step
15
+ * that drains a large backfill in `await`ed batches run without blocking the
16
+ * thread between batches while still guaranteeing later migrations observe its
17
+ * completed result.
18
+ */
19
+ export type MigrationStep = (database: DrizzleDb) => void | Promise<void>;
8
20
 
9
21
  export interface MigrationRunResult {
22
+ /** Steps that ran and completed successfully this boot. */
23
+ applied: string[];
10
24
  /** Steps whose body threw. */
11
25
  failed: string[];
26
+ /** Steps skipped because a prior run already applied them. */
27
+ skipped: string[];
28
+ }
29
+
30
+ /**
31
+ * Prefix under which forward-step completions are recorded in the shared
32
+ * `memory_checkpoints` ledger. A distinct namespace keeps step bookkeeping from
33
+ * colliding with registry checkpoint keys (`migration_*`, `backfill_*`,
34
+ * `drop_*`) and is deliberately chosen so `validateMigrationState` does not
35
+ * mistake a step record for an unknown registry migration.
36
+ */
37
+ export const STEP_CHECKPOINT_PREFIX = "step:";
38
+
39
+ /**
40
+ * Create the migration bookkeeping table if it is missing.
41
+ *
42
+ * The runner records its own checkpoints, so it must not depend on an earlier
43
+ * step having created the ledger. This is the single place `memory_checkpoints`
44
+ * is created; `IF NOT EXISTS` makes it a no-op on an already-migrated database.
45
+ */
46
+ function ensureCheckpointsTable(raw: ReturnType<typeof getSqliteFrom>): void {
47
+ raw.run(/*sql*/ `
48
+ CREATE TABLE IF NOT EXISTS memory_checkpoints (
49
+ key TEXT PRIMARY KEY,
50
+ value TEXT NOT NULL,
51
+ updated_at INTEGER NOT NULL
52
+ )
53
+ `);
54
+ }
55
+
56
+ /**
57
+ * Recover from crashed migrations before the migration runner executes its steps.
58
+ *
59
+ * Scans memory_checkpoints for entries with value 'started' or 'rolling_back' —
60
+ * these represent migrations that began but never completed (e.g., due to a
61
+ * process crash). Deletes the stalled checkpoint so the migration can re-run
62
+ * from scratch on this startup. Each migration's own idempotency guards (DDL
63
+ * IF NOT EXISTS, transactional rollback) ensure re-running is safe.
64
+ *
65
+ * Runs on every boot — it must observe the state left by *this* boot's prior
66
+ * crash — so it is invoked directly by {@link runMigrationSteps} before the
67
+ * checkpointed step loop rather than being a checkpointed step itself.
68
+ */
69
+ export function recoverCrashedMigrations(database: DrizzleDb): string[] {
70
+ const raw = getSqliteFrom(database);
71
+
72
+ let rows: Array<{ key: string; value: string }>;
73
+ try {
74
+ rows = raw
75
+ .query(`SELECT key, value FROM memory_checkpoints`)
76
+ .all() as Array<{ key: string; value: string }>;
77
+ } catch {
78
+ return [];
79
+ }
80
+
81
+ const crashed = rows
82
+ .filter((r) => r.value === "started" || r.value === "rolling_back")
83
+ .map((r) => r.key);
84
+ if (crashed.length === 0) return [];
85
+
86
+ log.error(
87
+ { crashed },
88
+ [
89
+ "╔══════════════════════════════════════════════════════════════╗",
90
+ "║ CRASHED MIGRATIONS DETECTED — AUTO-RECOVERING ║",
91
+ "╚══════════════════════════════════════════════════════════════╝",
92
+ "",
93
+ `The following migrations started but never completed: ${crashed.join(", ")}`,
94
+ "",
95
+ "Clearing stalled checkpoints so they can be retried on this startup.",
96
+ "If retries continue to fail, manually inspect the database:",
97
+ ` sqlite3 ${getDbPath()} "SELECT * FROM memory_checkpoints"`,
98
+ ].join("\n"),
99
+ );
100
+
101
+ for (const key of crashed) {
102
+ raw.query(`DELETE FROM memory_checkpoints WHERE key = ?`).run(key);
103
+ log.info(
104
+ { key },
105
+ `Cleared stalled checkpoint "${key}" — migration will re-run`,
106
+ );
107
+ }
108
+
109
+ return crashed;
12
110
  }
13
111
 
14
112
  /**
15
- * Run the ordered list of forward migration steps against the database.
113
+ * Run the ordered list of forward migration steps against the database, each at
114
+ * most once across boots.
115
+ *
116
+ * A step's name is recorded in `memory_checkpoints` after its body completes —
117
+ * for an async step, after its returned promise resolves; on
118
+ * later boots an applied step is skipped instead of re-executed. This turns the
119
+ * unconditional ~200-step re-probe — which floors daemon startup at tens of
120
+ * seconds on a fully-migrated database — into a single bookkeeping read.
121
+ *
122
+ * Step bookkeeping lives in the `memory_checkpoints` ledger under the
123
+ * {@link STEP_CHECKPOINT_PREFIX} namespace, so applied-state for every
124
+ * migration lives in one place.
125
+ *
126
+ * Before the step loop runs, the ledger is created if missing and
127
+ * {@link recoverCrashedMigrations} clears any stalled checkpoints left by a
128
+ * prior crash, so a migration interrupted mid-flight re-runs this boot.
16
129
  *
17
130
  * Individual step failures are caught and logged so one broken migration does
18
- * not prevent independent later ones from succeeding.
131
+ * not prevent independent later ones from succeeding; a failed step is not
132
+ * checkpointed and is retried on the next boot.
19
133
  */
20
- export function runMigrationSteps(
134
+ export async function runMigrationSteps(
21
135
  database: DrizzleDb,
22
136
  steps: MigrationStep[],
23
- ): MigrationRunResult {
137
+ ): Promise<MigrationRunResult> {
138
+ const raw = getSqliteFrom(database);
139
+
140
+ ensureCheckpointsTable(raw);
141
+ recoverCrashedMigrations(database);
142
+
143
+ const applied = new Set(
144
+ (
145
+ raw
146
+ .query(
147
+ `SELECT key FROM memory_checkpoints WHERE key LIKE '${STEP_CHECKPOINT_PREFIX}%' AND value = '1'`,
148
+ )
149
+ .all() as Array<{ key: string }>
150
+ ).map((row) => row.key.slice(STEP_CHECKPOINT_PREFIX.length)),
151
+ );
152
+ const markStarted = raw.query(
153
+ `INSERT OR REPLACE INTO memory_checkpoints (key, value, updated_at) VALUES (?, 'started', ?)`,
154
+ );
155
+ const markApplied = raw.query(
156
+ `INSERT OR REPLACE INTO memory_checkpoints (key, value, updated_at) VALUES (?, '1', ?)`,
157
+ );
158
+
24
159
  const failed: string[] = [];
160
+ const skipped: string[] = [];
161
+ const ran: string[] = [];
25
162
 
26
163
  for (const step of steps) {
164
+ const name = step.name;
165
+ const checkpointable = name !== "";
166
+
167
+ if (checkpointable && applied.has(name)) {
168
+ skipped.push(name);
169
+ log.debug({ migration: name }, `Skipping applied migration: ${name}`);
170
+ continue;
171
+ }
172
+
27
173
  try {
28
- log.debug({ migration: step.name }, `Starting migration: ${step.name}`);
29
- step(database);
30
- log.debug({ migration: step.name }, `Migration succeeded: ${step.name}`);
174
+ if (checkpointable) {
175
+ markStarted.run(`${STEP_CHECKPOINT_PREFIX}${name}`, Date.now());
176
+ }
177
+ log.info({ migration: name }, `Starting migration: ${name}`);
178
+ const result = step(database);
179
+ if (result instanceof Promise) {
180
+ await result;
181
+ }
182
+ log.info({ migration: name }, `Migration succeeded: ${name}`);
183
+ if (checkpointable) {
184
+ markApplied.run(`${STEP_CHECKPOINT_PREFIX}${name}`, Date.now());
185
+ ran.push(name);
186
+ }
31
187
  } catch (err) {
32
- failed.push(step.name);
33
- log.error(
34
- { err, migration: step.name },
35
- `Migration failed: ${step.name}`,
36
- );
188
+ // Leave the 'started' marker in place (if one was written)
189
+ // recoverCrashedMigrations will detect it on the next boot, log
190
+ // a warning, and clear it so the step re-runs.
191
+ failed.push(name);
192
+ log.error({ err, migration: name }, `Migration failed: ${name}`);
37
193
  }
38
194
  }
39
195
 
40
- return { failed };
196
+ return { applied: ran, failed, skipped };
197
+ }
198
+
199
+ /**
200
+ * Discard every forward-step checkpoint so the next {@link runMigrationSteps}
201
+ * call re-runs and re-records all steps.
202
+ *
203
+ * Migration rollback calls this. A rolled-back step's `step:` checkpoint
204
+ * must be discarded, otherwise the runner skips the step on the next
205
+ * upgrade and the rolled-back schema is never restored. Only the `step:`
206
+ * namespace is cleared, leaving other ledger entries untouched.
207
+ */
208
+ export function clearMigrationStepCheckpoints(database: DrizzleDb): void {
209
+ getSqliteFrom(database).run(
210
+ `DELETE FROM memory_checkpoints WHERE key LIKE '${STEP_CHECKPOINT_PREFIX}%'`,
211
+ );
41
212
  }