@vellumai/assistant 0.10.0 → 0.10.1-staging.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (824) hide show
  1. package/ARCHITECTURE.md +36 -37
  2. package/bun.lock +3 -0
  3. package/docs/workflows.md +12 -7
  4. package/eslint-rules/cli-no-daemon-internals.js +6 -0
  5. package/node_modules/@slack/types/LICENSE +23 -0
  6. package/node_modules/@slack/types/README.md +32 -0
  7. package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts +953 -0
  8. package/node_modules/@slack/types/dist/block-kit/block-elements.d.ts.map +1 -0
  9. package/node_modules/@slack/types/dist/block-kit/block-elements.js +4 -0
  10. package/node_modules/@slack/types/dist/block-kit/block-elements.js.map +1 -0
  11. package/node_modules/@slack/types/dist/block-kit/blocks.d.ts +474 -0
  12. package/node_modules/@slack/types/dist/block-kit/blocks.d.ts.map +1 -0
  13. package/node_modules/@slack/types/dist/block-kit/blocks.js +3 -0
  14. package/node_modules/@slack/types/dist/block-kit/blocks.js.map +1 -0
  15. package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts +237 -0
  16. package/node_modules/@slack/types/dist/block-kit/composition-objects.d.ts.map +1 -0
  17. package/node_modules/@slack/types/dist/block-kit/composition-objects.js +4 -0
  18. package/node_modules/@slack/types/dist/block-kit/composition-objects.js.map +1 -0
  19. package/node_modules/@slack/types/dist/block-kit/extensions.d.ts +88 -0
  20. package/node_modules/@slack/types/dist/block-kit/extensions.d.ts.map +1 -0
  21. package/node_modules/@slack/types/dist/block-kit/extensions.js +3 -0
  22. package/node_modules/@slack/types/dist/block-kit/extensions.js.map +1 -0
  23. package/node_modules/@slack/types/dist/calls.d.ts +26 -0
  24. package/node_modules/@slack/types/dist/calls.d.ts.map +1 -0
  25. package/node_modules/@slack/types/dist/calls.js +6 -0
  26. package/node_modules/@slack/types/dist/calls.js.map +1 -0
  27. package/node_modules/@slack/types/dist/chunk.d.ts +52 -0
  28. package/node_modules/@slack/types/dist/chunk.d.ts.map +1 -0
  29. package/node_modules/@slack/types/dist/chunk.js +3 -0
  30. package/node_modules/@slack/types/dist/chunk.js.map +1 -0
  31. package/node_modules/@slack/types/dist/common/bot-profile.d.ts +12 -0
  32. package/node_modules/@slack/types/dist/common/bot-profile.d.ts.map +1 -0
  33. package/node_modules/@slack/types/dist/common/bot-profile.js +3 -0
  34. package/node_modules/@slack/types/dist/common/bot-profile.js.map +1 -0
  35. package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts +6 -0
  36. package/node_modules/@slack/types/dist/common/status-emoji-display-info.d.ts.map +1 -0
  37. package/node_modules/@slack/types/dist/common/status-emoji-display-info.js +3 -0
  38. package/node_modules/@slack/types/dist/common/status-emoji-display-info.js.map +1 -0
  39. package/node_modules/@slack/types/dist/dialog.d.ts +36 -0
  40. package/node_modules/@slack/types/dist/dialog.d.ts.map +1 -0
  41. package/node_modules/@slack/types/dist/dialog.js +3 -0
  42. package/node_modules/@slack/types/dist/dialog.js.map +1 -0
  43. package/node_modules/@slack/types/dist/events/app.d.ts +204 -0
  44. package/node_modules/@slack/types/dist/events/app.d.ts.map +1 -0
  45. package/node_modules/@slack/types/dist/events/app.js +3 -0
  46. package/node_modules/@slack/types/dist/events/app.js.map +1 -0
  47. package/node_modules/@slack/types/dist/events/assistant.d.ts +29 -0
  48. package/node_modules/@slack/types/dist/events/assistant.d.ts.map +1 -0
  49. package/node_modules/@slack/types/dist/events/assistant.js +3 -0
  50. package/node_modules/@slack/types/dist/events/assistant.js.map +1 -0
  51. package/node_modules/@slack/types/dist/events/call.d.ts +8 -0
  52. package/node_modules/@slack/types/dist/events/call.d.ts.map +1 -0
  53. package/node_modules/@slack/types/dist/events/call.js +3 -0
  54. package/node_modules/@slack/types/dist/events/call.js.map +1 -0
  55. package/node_modules/@slack/types/dist/events/channel.d.ts +85 -0
  56. package/node_modules/@slack/types/dist/events/channel.d.ts.map +1 -0
  57. package/node_modules/@slack/types/dist/events/channel.js +3 -0
  58. package/node_modules/@slack/types/dist/events/channel.js.map +1 -0
  59. package/node_modules/@slack/types/dist/events/dnd.d.ts +24 -0
  60. package/node_modules/@slack/types/dist/events/dnd.d.ts.map +1 -0
  61. package/node_modules/@slack/types/dist/events/dnd.js +3 -0
  62. package/node_modules/@slack/types/dist/events/dnd.js.map +1 -0
  63. package/node_modules/@slack/types/dist/events/email.d.ts +6 -0
  64. package/node_modules/@slack/types/dist/events/email.d.ts.map +1 -0
  65. package/node_modules/@slack/types/dist/events/email.js +3 -0
  66. package/node_modules/@slack/types/dist/events/email.js.map +1 -0
  67. package/node_modules/@slack/types/dist/events/emoji.d.ts +11 -0
  68. package/node_modules/@slack/types/dist/events/emoji.d.ts.map +1 -0
  69. package/node_modules/@slack/types/dist/events/emoji.js +3 -0
  70. package/node_modules/@slack/types/dist/events/emoji.js.map +1 -0
  71. package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts +21 -0
  72. package/node_modules/@slack/types/dist/events/entity-details-requested.d.ts.map +1 -0
  73. package/node_modules/@slack/types/dist/events/entity-details-requested.js +3 -0
  74. package/node_modules/@slack/types/dist/events/entity-details-requested.js.map +1 -0
  75. package/node_modules/@slack/types/dist/events/file.d.ts +60 -0
  76. package/node_modules/@slack/types/dist/events/file.d.ts.map +1 -0
  77. package/node_modules/@slack/types/dist/events/file.js +4 -0
  78. package/node_modules/@slack/types/dist/events/file.js.map +1 -0
  79. package/node_modules/@slack/types/dist/events/function.d.ts +33 -0
  80. package/node_modules/@slack/types/dist/events/function.d.ts.map +1 -0
  81. package/node_modules/@slack/types/dist/events/function.js +3 -0
  82. package/node_modules/@slack/types/dist/events/function.js.map +1 -0
  83. package/node_modules/@slack/types/dist/events/grid-migration.d.ts +9 -0
  84. package/node_modules/@slack/types/dist/events/grid-migration.d.ts.map +1 -0
  85. package/node_modules/@slack/types/dist/events/grid-migration.js +3 -0
  86. package/node_modules/@slack/types/dist/events/grid-migration.js.map +1 -0
  87. package/node_modules/@slack/types/dist/events/group.d.ts +55 -0
  88. package/node_modules/@slack/types/dist/events/group.d.ts.map +1 -0
  89. package/node_modules/@slack/types/dist/events/group.js +3 -0
  90. package/node_modules/@slack/types/dist/events/group.js.map +1 -0
  91. package/node_modules/@slack/types/dist/events/im.d.ts +26 -0
  92. package/node_modules/@slack/types/dist/events/im.d.ts.map +1 -0
  93. package/node_modules/@slack/types/dist/events/im.js +3 -0
  94. package/node_modules/@slack/types/dist/events/im.js.map +1 -0
  95. package/node_modules/@slack/types/dist/events/index.d.ts +60 -0
  96. package/node_modules/@slack/types/dist/events/index.d.ts.map +1 -0
  97. package/node_modules/@slack/types/dist/events/index.js +43 -0
  98. package/node_modules/@slack/types/dist/events/index.js.map +1 -0
  99. package/node_modules/@slack/types/dist/events/invite.d.ts +20 -0
  100. package/node_modules/@slack/types/dist/events/invite.d.ts.map +1 -0
  101. package/node_modules/@slack/types/dist/events/invite.js +3 -0
  102. package/node_modules/@slack/types/dist/events/invite.js.map +1 -0
  103. package/node_modules/@slack/types/dist/events/link-shared.d.ts +16 -0
  104. package/node_modules/@slack/types/dist/events/link-shared.d.ts.map +1 -0
  105. package/node_modules/@slack/types/dist/events/link-shared.js +3 -0
  106. package/node_modules/@slack/types/dist/events/link-shared.js.map +1 -0
  107. package/node_modules/@slack/types/dist/events/member.d.ts +19 -0
  108. package/node_modules/@slack/types/dist/events/member.d.ts.map +1 -0
  109. package/node_modules/@slack/types/dist/events/member.js +3 -0
  110. package/node_modules/@slack/types/dist/events/member.js.map +1 -0
  111. package/node_modules/@slack/types/dist/events/message-metadata.d.ts +38 -0
  112. package/node_modules/@slack/types/dist/events/message-metadata.d.ts.map +1 -0
  113. package/node_modules/@slack/types/dist/events/message-metadata.js +3 -0
  114. package/node_modules/@slack/types/dist/events/message-metadata.js.map +1 -0
  115. package/node_modules/@slack/types/dist/events/message.d.ts +306 -0
  116. package/node_modules/@slack/types/dist/events/message.d.ts.map +1 -0
  117. package/node_modules/@slack/types/dist/events/message.js +3 -0
  118. package/node_modules/@slack/types/dist/events/message.js.map +1 -0
  119. package/node_modules/@slack/types/dist/events/pin.d.ts +60 -0
  120. package/node_modules/@slack/types/dist/events/pin.d.ts.map +1 -0
  121. package/node_modules/@slack/types/dist/events/pin.js +3 -0
  122. package/node_modules/@slack/types/dist/events/pin.js.map +1 -0
  123. package/node_modules/@slack/types/dist/events/reaction.d.ts +23 -0
  124. package/node_modules/@slack/types/dist/events/reaction.d.ts.map +1 -0
  125. package/node_modules/@slack/types/dist/events/reaction.js +3 -0
  126. package/node_modules/@slack/types/dist/events/reaction.js.map +1 -0
  127. package/node_modules/@slack/types/dist/events/shared-channel.d.ts +134 -0
  128. package/node_modules/@slack/types/dist/events/shared-channel.d.ts.map +1 -0
  129. package/node_modules/@slack/types/dist/events/shared-channel.js +3 -0
  130. package/node_modules/@slack/types/dist/events/shared-channel.js.map +1 -0
  131. package/node_modules/@slack/types/dist/events/star.d.ts +13 -0
  132. package/node_modules/@slack/types/dist/events/star.d.ts.map +1 -0
  133. package/node_modules/@slack/types/dist/events/star.js +3 -0
  134. package/node_modules/@slack/types/dist/events/star.js.map +1 -0
  135. package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts +82 -0
  136. package/node_modules/@slack/types/dist/events/steps-from-apps.d.ts.map +1 -0
  137. package/node_modules/@slack/types/dist/events/steps-from-apps.js +3 -0
  138. package/node_modules/@slack/types/dist/events/steps-from-apps.js.map +1 -0
  139. package/node_modules/@slack/types/dist/events/subteam.d.ts +66 -0
  140. package/node_modules/@slack/types/dist/events/subteam.d.ts.map +1 -0
  141. package/node_modules/@slack/types/dist/events/subteam.js +3 -0
  142. package/node_modules/@slack/types/dist/events/subteam.js.map +1 -0
  143. package/node_modules/@slack/types/dist/events/team.d.ts +99 -0
  144. package/node_modules/@slack/types/dist/events/team.d.ts.map +1 -0
  145. package/node_modules/@slack/types/dist/events/team.js +3 -0
  146. package/node_modules/@slack/types/dist/events/team.js.map +1 -0
  147. package/node_modules/@slack/types/dist/events/token.d.ts +8 -0
  148. package/node_modules/@slack/types/dist/events/token.d.ts.map +1 -0
  149. package/node_modules/@slack/types/dist/events/token.js +3 -0
  150. package/node_modules/@slack/types/dist/events/token.js.map +1 -0
  151. package/node_modules/@slack/types/dist/events/user.d.ts +313 -0
  152. package/node_modules/@slack/types/dist/events/user.d.ts.map +1 -0
  153. package/node_modules/@slack/types/dist/events/user.js +3 -0
  154. package/node_modules/@slack/types/dist/events/user.js.map +1 -0
  155. package/node_modules/@slack/types/dist/index.d.ts +12 -0
  156. package/node_modules/@slack/types/dist/index.d.ts.map +1 -0
  157. package/node_modules/@slack/types/dist/index.js +28 -0
  158. package/node_modules/@slack/types/dist/index.js.map +1 -0
  159. package/node_modules/@slack/types/dist/message-attachments.d.ts +171 -0
  160. package/node_modules/@slack/types/dist/message-attachments.d.ts.map +1 -0
  161. package/node_modules/@slack/types/dist/message-attachments.js +3 -0
  162. package/node_modules/@slack/types/dist/message-attachments.js.map +1 -0
  163. package/node_modules/@slack/types/dist/message-metadata.d.ts +281 -0
  164. package/node_modules/@slack/types/dist/message-metadata.d.ts.map +1 -0
  165. package/node_modules/@slack/types/dist/message-metadata.js +27 -0
  166. package/node_modules/@slack/types/dist/message-metadata.js.map +1 -0
  167. package/node_modules/@slack/types/dist/views.d.ts +71 -0
  168. package/node_modules/@slack/types/dist/views.d.ts.map +1 -0
  169. package/node_modules/@slack/types/dist/views.js +3 -0
  170. package/node_modules/@slack/types/dist/views.js.map +1 -0
  171. package/node_modules/@slack/types/package.json +47 -0
  172. package/node_modules/@vellumai/gateway-client/bun.lock +3 -0
  173. package/node_modules/@vellumai/gateway-client/package.json +1 -0
  174. package/node_modules/@vellumai/gateway-client/src/__tests__/contact-read-contracts.test.ts +69 -0
  175. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +65 -0
  176. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +162 -0
  177. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +8 -0
  178. package/node_modules/@vellumai/gateway-client/src/index.ts +14 -0
  179. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +4 -2
  180. package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +3 -2
  181. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +78 -0
  182. package/openapi.yaml +345 -18
  183. package/package.json +2 -1
  184. package/scripts/memory-inspect.ts +24 -14
  185. package/src/__tests__/access-request-seed-content-blocks.test.ts +83 -103
  186. package/src/__tests__/activation-early-marking.test.ts +1 -1
  187. package/src/__tests__/actor-token-service.test.ts +3 -3
  188. package/src/__tests__/agent-loop-callsite-precedence.test.ts +1 -40
  189. package/src/__tests__/agent-loop-compaction-events.test.ts +0 -1
  190. package/src/__tests__/agent-loop-compaction-strip.test.ts +0 -1
  191. package/src/__tests__/agent-loop-exit-reason.test.ts +0 -1
  192. package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
  193. package/src/__tests__/agent-loop-regrowth-guard.test.ts +0 -1
  194. package/src/__tests__/agent-loop.test.ts +3 -0
  195. package/src/__tests__/agent-wake-override-profile.test.ts +2 -0
  196. package/src/__tests__/anthropic-provider.test.ts +143 -9
  197. package/src/__tests__/app-builder-skill-instructions.test.ts +47 -5
  198. package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -1
  199. package/src/__tests__/app-source-watcher.test.ts +30 -10
  200. package/src/__tests__/approval-cascade.test.ts +6 -0
  201. package/src/__tests__/approval-interception-trust-gates.test.ts +151 -0
  202. package/src/__tests__/approval-primitive.test.ts +1 -1
  203. package/src/__tests__/approval-routes-http.test.ts +1 -1
  204. package/src/__tests__/assistant-attachments.test.ts +155 -0
  205. package/src/__tests__/assistant-event-hub-machine-name.test.ts +2 -4
  206. package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
  207. package/src/__tests__/assistant-events-sse-shed.test.ts +1 -1
  208. package/src/__tests__/attachment-upload-trusted-source.test.ts +13 -8
  209. package/src/__tests__/attachments-store.test.ts +1 -1
  210. package/src/__tests__/audit-log-rotation.test.ts +50 -54
  211. package/src/__tests__/auth-fallback-events-store.test.ts +1 -1
  212. package/src/__tests__/auto-analysis-end-to-end.test.ts +9 -14
  213. package/src/__tests__/background-shell-bash.test.ts +4 -1
  214. package/src/__tests__/background-shell-host-bash.test.ts +17 -3
  215. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
  216. package/src/__tests__/call-controller.test.ts +1 -1
  217. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  218. package/src/__tests__/call-domain.test.ts +1 -1
  219. package/src/__tests__/call-pointer-messages.test.ts +3 -4
  220. package/src/__tests__/call-recovery.test.ts +1 -1
  221. package/src/__tests__/call-routes-http.test.ts +1 -1
  222. package/src/__tests__/call-store.test.ts +1 -1
  223. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  224. package/src/__tests__/canonical-guardian-store.test.ts +24 -1
  225. package/src/__tests__/channel-approval-routes.test.ts +73 -1119
  226. package/src/__tests__/channel-delivery-store.test.ts +1 -1
  227. package/src/__tests__/channel-guardian.test.ts +265 -641
  228. package/src/__tests__/channel-inbound-disk-pressure.test.ts +1 -2
  229. package/src/__tests__/channel-retry-sweep.test.ts +1 -1
  230. package/src/__tests__/compaction-events.test.ts +6 -0
  231. package/src/__tests__/compaction-trail-store.test.ts +6 -5
  232. package/src/__tests__/compaction.benchmark.test.ts +0 -1
  233. package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -1
  234. package/src/__tests__/config-loader-backfill.test.ts +183 -51
  235. package/src/__tests__/config-schema.test.ts +34 -0
  236. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -2
  237. package/src/__tests__/contact-store-user-file.test.ts +2 -2
  238. package/src/__tests__/contacts-relay-reads.test.ts +409 -0
  239. package/src/__tests__/contacts-tools.test.ts +4 -4
  240. package/src/__tests__/contacts-write.test.ts +1 -2
  241. package/src/__tests__/context-search-conversations-source.test.ts +1 -1
  242. package/src/__tests__/context-window-manager-compact-retry.test.ts +6 -2
  243. package/src/__tests__/context-window-manager-overflow-rung.test.ts +6 -2
  244. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  245. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -0
  246. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +3 -0
  247. package/src/__tests__/conversation-agent-loop-overflow.test.ts +3 -0
  248. package/src/__tests__/conversation-agent-loop.test.ts +3 -0
  249. package/src/__tests__/conversation-attachments.test.ts +2 -5
  250. package/src/__tests__/conversation-attention-store.test.ts +1 -1
  251. package/src/__tests__/conversation-attention-telegram.test.ts +1 -2
  252. package/src/__tests__/conversation-clear-safety.test.ts +1 -1
  253. package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
  254. package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -1
  255. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +12 -19
  256. package/src/__tests__/conversation-disk-view-integration.test.ts +1 -1
  257. package/src/__tests__/conversation-disk-view.test.ts +1 -1
  258. package/src/__tests__/conversation-fork-crud.test.ts +10 -8
  259. package/src/__tests__/conversation-fork-retrospective.test.ts +250 -0
  260. package/src/__tests__/conversation-fork-route.test.ts +1 -1
  261. package/src/__tests__/conversation-inference-profile-list.test.ts +1 -1
  262. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  263. package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
  264. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  265. package/src/__tests__/conversation-lifecycle.test.ts +117 -0
  266. package/src/__tests__/conversation-list-source.test.ts +3 -3
  267. package/src/__tests__/conversation-process-callsite.test.ts +6 -14
  268. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  269. package/src/__tests__/conversation-queue.test.ts +6 -0
  270. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
  271. package/src/__tests__/conversation-runtime-assembly.test.ts +115 -12
  272. package/src/__tests__/conversation-slash-queue.test.ts +6 -0
  273. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  274. package/src/__tests__/conversation-speed-override.test.ts +6 -0
  275. package/src/__tests__/conversation-starter-routes.test.ts +5 -5
  276. package/src/__tests__/conversation-store.test.ts +1 -1
  277. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -1
  278. package/src/__tests__/conversation-sync-tags.test.ts +1 -1
  279. package/src/__tests__/conversation-usage.test.ts +1 -1
  280. package/src/__tests__/conversation-wipe.test.ts +9 -8
  281. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
  282. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  283. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  284. package/src/__tests__/conversations-import-system-filter.test.ts +1 -1
  285. package/src/__tests__/copy-composer-tc-templates.test.ts +17 -0
  286. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  287. package/src/__tests__/db-acp-history.test.ts +2 -2
  288. package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +5 -7
  289. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +6 -7
  290. package/src/__tests__/db-llm-request-log-provider-migration.test.ts +5 -10
  291. package/src/__tests__/db-migration-rollback.test.ts +129 -39
  292. package/src/__tests__/db-proxy-transaction.test.ts +1 -1
  293. package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -11
  294. package/src/__tests__/db-test-helpers.ts +36 -19
  295. package/src/__tests__/delete-propagation.test.ts +1 -1
  296. package/src/__tests__/deterministic-verification-control-plane.test.ts +26 -8
  297. package/src/__tests__/disk-pressure-tools.test.ts +41 -1
  298. package/src/__tests__/dm-backfill.test.ts +1 -1
  299. package/src/__tests__/drop-capability-card-state-migration.test.ts +0 -8
  300. package/src/__tests__/edit-propagation.test.ts +1 -1
  301. package/src/__tests__/emit-signal-routing-intent.test.ts +83 -0
  302. package/src/__tests__/empty-response-hook.test.ts +42 -0
  303. package/src/__tests__/events-client-registration.test.ts +1 -1
  304. package/src/__tests__/followup-tools.test.ts +1 -1
  305. package/src/__tests__/gemini-count-tokens.test.ts +70 -0
  306. package/src/__tests__/guardian-action-sweep.test.ts +9 -2
  307. package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
  308. package/src/__tests__/guardian-card-withdrawal.test.ts +1 -1
  309. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -1
  310. package/src/__tests__/guardian-dispatch.test.ts +1 -1
  311. package/src/__tests__/guardian-outbound-http.test.ts +7 -12
  312. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +1 -1
  313. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  314. package/src/__tests__/guardian-routing-state.test.ts +1 -2
  315. package/src/__tests__/guardian-verification-voice-binding.test.ts +1 -1
  316. package/src/__tests__/headless-browser-mode.test.ts +2 -2
  317. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  318. package/src/__tests__/heartbeat-service.test.ts +6 -0
  319. package/src/__tests__/helpers/channel-test-adapter.ts +98 -0
  320. package/src/__tests__/http-conversation-lineage.test.ts +1 -1
  321. package/src/__tests__/image-recovery-hook.test.ts +1 -1
  322. package/src/__tests__/inbound-invite-redemption.test.ts +1 -2
  323. package/src/__tests__/inbound-trust-verdict.test.ts +254 -0
  324. package/src/__tests__/inference-profile-reaper.test.ts +1 -1
  325. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  326. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  327. package/src/__tests__/injector-chain.test.ts +1 -1
  328. package/src/__tests__/injector-disk-pressure.test.ts +11 -6
  329. package/src/__tests__/internal-telemetry-routes.test.ts +1 -1
  330. package/src/__tests__/invite-redemption-service.test.ts +244 -43
  331. package/src/__tests__/invite-routes-http.test.ts +35 -186
  332. package/src/__tests__/invite-service-ipc.test.ts +287 -0
  333. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +5 -5
  334. package/src/__tests__/jobs-store-upsert-debounced.test.ts +9 -12
  335. package/src/__tests__/list-messages-attachments.test.ts +42 -1
  336. package/src/__tests__/list-messages-client-message-id.test.ts +1 -1
  337. package/src/__tests__/list-messages-hidden-metadata.test.ts +1 -1
  338. package/src/__tests__/list-messages-page-latest.test.ts +1 -1
  339. package/src/__tests__/list-messages-tool-merge.test.ts +1 -1
  340. package/src/__tests__/llm-context-route-provider.test.ts +69 -4
  341. package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +9 -5
  342. package/src/__tests__/llm-request-log-call-site.test.ts +6 -6
  343. package/src/__tests__/llm-request-log-turn-query.test.ts +27 -13
  344. package/src/__tests__/llm-usage-store.test.ts +40 -1
  345. package/src/__tests__/log-export-routes.test.ts +1 -1
  346. package/src/__tests__/log-export-workspace.test.ts +3 -3
  347. package/src/__tests__/memory-jobs-worker-lanes.test.ts +5 -5
  348. package/src/__tests__/memory-recall-log-store.test.ts +1 -1
  349. package/src/__tests__/memory-upsert-concurrency.test.ts +3 -4
  350. package/src/__tests__/messages-after-tiebreaker.test.ts +1 -1
  351. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  352. package/src/__tests__/mtime-cache.test.ts +375 -0
  353. package/src/__tests__/non-member-access-request.test.ts +1 -2
  354. package/src/__tests__/notification-candidate-guardian-context.test.ts +203 -0
  355. package/src/__tests__/notification-guardian-path.test.ts +1 -1
  356. package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -1
  357. package/src/__tests__/oauth-provider-profiles.test.ts +1 -1
  358. package/src/__tests__/oauth-provider-visibility.test.ts +1 -1
  359. package/src/__tests__/oauth-store.test.ts +1 -1
  360. package/src/__tests__/persist-unsendable-image-downscale.test.ts +1 -1
  361. package/src/__tests__/persist-unsendable-image.test.ts +1 -1
  362. package/src/__tests__/persona-resolver.test.ts +39 -1
  363. package/src/__tests__/platform-bash-auto-approve.test.ts +1 -1
  364. package/src/__tests__/playbook-execution.test.ts +1 -1
  365. package/src/__tests__/playbook-tools.test.ts +1 -1
  366. package/src/__tests__/plugin-api-model-profiles.test.ts +74 -21
  367. package/src/__tests__/plugin-bootstrap.test.ts +78 -0
  368. package/src/__tests__/provider-platform-proxy-integration.test.ts +25 -5
  369. package/src/__tests__/provider-usage-tracking.test.ts +1 -1
  370. package/src/__tests__/prune-old-conversations-job.test.ts +1 -1
  371. package/src/__tests__/reaction-persistence.test.ts +1 -1
  372. package/src/__tests__/relay-server.test.ts +357 -56
  373. package/src/__tests__/runtime-attachment-metadata.test.ts +10 -1
  374. package/src/__tests__/runtime-events-sse-bilingual.test.ts +7 -9
  375. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  376. package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -1
  377. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  378. package/src/__tests__/schedule-retry.test.ts +1 -1
  379. package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -1
  380. package/src/__tests__/schedule-routes.test.ts +1 -1
  381. package/src/__tests__/schedule-store.test.ts +1 -1
  382. package/src/__tests__/schedule-tools.test.ts +1 -1
  383. package/src/__tests__/scheduler-disk-pressure.test.ts +1 -1
  384. package/src/__tests__/scheduler-recurrence.test.ts +1 -1
  385. package/src/__tests__/scheduler-reuse-conversation.test.ts +1 -1
  386. package/src/__tests__/scheduler-wake.test.ts +2 -1
  387. package/src/__tests__/scoped-approval-grants.test.ts +1 -1
  388. package/src/__tests__/scoped-grant-security-matrix.test.ts +5 -5
  389. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +0 -8
  390. package/src/__tests__/secret-routes-platform-proxy.test.ts +1 -0
  391. package/src/__tests__/send-endpoint-busy.test.ts +1 -1
  392. package/src/__tests__/sequence-store.test.ts +1 -1
  393. package/src/__tests__/server-history-render.test.ts +40 -1
  394. package/src/__tests__/settings-routes.test.ts +11 -10
  395. package/src/__tests__/skill-load-tool.test.ts +72 -0
  396. package/src/__tests__/slack-inbound-verification.test.ts +1 -3
  397. package/src/__tests__/slack-messaging-token-resolution.test.ts +13 -2
  398. package/src/__tests__/slack-reaction-canonical-approval.test.ts +1 -1
  399. package/src/__tests__/subagent-tool-gate-mode.test.ts +2 -73
  400. package/src/__tests__/subagent-tools.test.ts +1 -31
  401. package/src/__tests__/system-prompt.test.ts +1 -1
  402. package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
  403. package/src/__tests__/task-compiler.test.ts +1 -1
  404. package/src/__tests__/task-management-tools.test.ts +1 -1
  405. package/src/__tests__/task-memory-cleanup.test.ts +9 -6
  406. package/src/__tests__/task-scheduler.test.ts +1 -1
  407. package/src/__tests__/thread-backfill.test.ts +1 -1
  408. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  409. package/src/__tests__/tool-approval-seed-content-blocks.test.ts +2 -0
  410. package/src/__tests__/tool-executor.test.ts +32 -1
  411. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -2
  412. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +73 -1
  413. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +34 -34
  414. package/src/__tests__/trusted-contact-multichannel.test.ts +1 -2
  415. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  416. package/src/__tests__/turn-boundary-resolution.test.ts +3 -3
  417. package/src/__tests__/turn-events-store.test.ts +1 -1
  418. package/src/__tests__/twilio-routes.test.ts +2 -3
  419. package/src/__tests__/usage-cache-backfill-migration.test.ts +20 -10
  420. package/src/__tests__/usage-routes.test.ts +1 -1
  421. package/src/__tests__/user-plugin-loader.test.ts +34 -29
  422. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  423. package/src/__tests__/voice-invite-redemption.test.ts +134 -36
  424. package/src/__tests__/voice-scoped-grant-consumer.test.ts +1 -1
  425. package/src/__tests__/voice-session-bridge.test.ts +1 -1
  426. package/src/__tests__/workspace-git-service.test.ts +114 -1
  427. package/src/__tests__/workspace-heartbeat-service.test.ts +45 -0
  428. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -1
  429. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -1
  430. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +88 -18
  431. package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +6 -6
  432. package/src/__tests__/workspace-migration-109-swap-quality-profile-to-glm-5p2.test.ts +281 -0
  433. package/src/__tests__/workspace-migration-110-flip-balanced-profile-to-together.test.ts +167 -0
  434. package/src/__tests__/workspace-migrations-runner.test.ts +55 -0
  435. package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -1
  436. package/src/a2a/__tests__/task-store.test.ts +1 -1
  437. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -1
  438. package/src/acp/__tests__/session-manager-resume.test.ts +22 -11
  439. package/src/acp/__tests__/session-manager-startup.test.ts +1 -1
  440. package/src/acp/__tests__/session-manager.test.ts +72 -1
  441. package/src/acp/index.ts +10 -0
  442. package/src/acp/session-manager.ts +35 -0
  443. package/src/agent/loop.ts +45 -27
  444. package/src/api/index.ts +0 -6
  445. package/src/approvals/AGENTS.md +1 -2
  446. package/src/approvals/guardian-decision-primitive.ts +13 -210
  447. package/src/approvals/guardian-request-resolvers.ts +104 -58
  448. package/src/background-wake/wake-intent-hooks.test.ts +1 -1
  449. package/src/calls/__tests__/inbound-trust-reader.test.ts +110 -0
  450. package/src/calls/__tests__/relay-setup-router.test.ts +88 -62
  451. package/src/calls/inbound-trust-reader.ts +40 -0
  452. package/src/calls/relay-server.ts +65 -23
  453. package/src/calls/relay-setup-router.ts +20 -6
  454. package/src/calls/relay-verification.ts +7 -7
  455. package/src/cli/commands/contacts.ts +6 -24
  456. package/src/cli/commands/db/__tests__/repair.test.ts +15 -6
  457. package/src/cli/commands/db/__tests__/status.test.ts +7 -3
  458. package/src/cli/commands/db/status.ts +212 -33
  459. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +6 -1
  460. package/src/cli/commands/memory/index.ts +2 -0
  461. package/src/cli/commands/memory/memory-retrospective.ts +129 -0
  462. package/src/cli/commands/memory/memory-v3.ts +176 -4
  463. package/src/cli/commands/plugins.ts +268 -11
  464. package/src/cli/lib/__tests__/install-from-github.test.ts +40 -0
  465. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
  466. package/src/cli/lib/__tests__/toggle-plugin.test.ts +158 -0
  467. package/src/cli/lib/install-from-github.ts +47 -6
  468. package/src/cli/lib/plugin-marketplace.ts +11 -0
  469. package/src/cli/lib/plugin-pin-history.ts +257 -0
  470. package/src/cli/lib/toggle-plugin.ts +146 -0
  471. package/src/config/__tests__/sync-gated-profiles.test.ts +2 -2
  472. package/src/config/bundled-skills/app-builder/SKILL.md +15 -33
  473. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +3 -8
  474. package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +64 -37
  475. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +1 -1
  476. package/src/config/bundled-skills/app-builder/references/WIDGETS.md +14 -72
  477. package/src/config/bundled-skills/app-builder/references/examples/README.md +1 -2
  478. package/src/config/bundled-skills/contacts/SKILL.md +7 -12
  479. package/src/config/bundled-skills/messaging/tools/shared.ts +4 -1
  480. package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
  481. package/src/config/bundled-skills/workflows/SKILL.md +4 -3
  482. package/src/config/call-site-defaults.ts +11 -2
  483. package/src/config/feature-flag-registry.json +0 -8
  484. package/src/config/profile-dispatchability.ts +11 -0
  485. package/src/config/schemas/call-site-catalog.ts +7 -0
  486. package/src/config/schemas/llm.ts +2 -0
  487. package/src/config/schemas/memory-lifecycle.ts +5 -3
  488. package/src/config/schemas/timeouts.ts +24 -0
  489. package/src/config/seed-inference-profiles.ts +133 -45
  490. package/src/config/sync-gated-profiles.ts +13 -1
  491. package/src/contacts/contact-store.ts +21 -0
  492. package/src/contacts/member-status.ts +9 -0
  493. package/src/credential-health/credential-health-service.ts +1 -5
  494. package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
  495. package/src/daemon/app-source-watcher.ts +31 -18
  496. package/src/daemon/assistant-attachments.ts +94 -4
  497. package/src/daemon/conversation-agent-loop-handlers.ts +3 -0
  498. package/src/daemon/conversation-agent-loop.ts +9 -36
  499. package/src/daemon/conversation-runtime-assembly.ts +91 -66
  500. package/src/daemon/conversation-tool-setup.ts +20 -63
  501. package/src/daemon/conversation.ts +144 -52
  502. package/src/daemon/event-loop-watchdog.test.ts +85 -0
  503. package/src/daemon/event-loop-watchdog.ts +133 -0
  504. package/src/daemon/external-plugins-bootstrap.ts +26 -80
  505. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +1 -1
  506. package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -1
  507. package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -1
  508. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -1
  509. package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -1
  510. package/src/daemon/handlers/config-channels.ts +32 -18
  511. package/src/daemon/handlers/conversations.ts +7 -0
  512. package/src/daemon/handlers/shared.ts +7 -0
  513. package/src/daemon/lifecycle.ts +16 -3
  514. package/src/daemon/message-types/inbox.ts +0 -6
  515. package/src/daemon/message-types/messages.ts +0 -4
  516. package/src/daemon/message-types/surfaces.ts +18 -8
  517. package/src/daemon/server.ts +0 -4
  518. package/src/daemon/tool-setup-types.ts +0 -7
  519. package/src/daemon/trust-context.ts +6 -0
  520. package/src/daemon/wake-conversation-ops.ts +70 -0
  521. package/src/daemon/workspace-tools-watcher.ts +7 -3
  522. package/src/documents/document-comments-store.test.ts +1 -1
  523. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +1 -1
  524. package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -0
  525. package/src/heartbeat/heartbeat-service.ts +3 -4
  526. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  527. package/src/ipc/__tests__/browser-ipc.test.ts +73 -2
  528. package/src/ipc/__tests__/watcher-ipc.test.ts +59 -39
  529. package/src/ipc/assistant-server.ts +8 -0
  530. package/src/ipc/gateway-client.ts +2 -1
  531. package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +58 -0
  532. package/src/ipc/routes/invite-ipc-routes.ts +66 -0
  533. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  534. package/src/memory/__tests__/activation-session-store.test.ts +1 -1
  535. package/src/memory/__tests__/auto-analysis-guard.test.ts +1 -1
  536. package/src/memory/__tests__/conversation-group-migration.test.ts +1 -1
  537. package/src/memory/__tests__/conversation-queries.test.ts +1 -1
  538. package/src/memory/__tests__/db-async-query.test.ts +1 -1
  539. package/src/memory/__tests__/db-logs-attach.test.ts +110 -0
  540. package/src/memory/__tests__/db-maintenance.test.ts +28 -36
  541. package/src/memory/__tests__/db-memory-attach.test.ts +113 -0
  542. package/src/memory/__tests__/find-analysis-conversation.test.ts +1 -1
  543. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -1
  544. package/src/memory/__tests__/fork-message-copy.test.ts +232 -0
  545. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +3 -0
  546. package/src/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +5 -5
  547. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +8 -6
  548. package/src/memory/__tests__/memory-retrospective-job.test.ts +30 -37
  549. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +69 -66
  550. package/src/memory/__tests__/memory-retrospective-state.test.ts +1 -1
  551. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
  552. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +1 -1
  553. package/src/memory/__tests__/onboarding-events-store.test.ts +1 -1
  554. package/src/memory/__tests__/table-relocation.test.ts +129 -0
  555. package/src/memory/conversation-crud.ts +461 -152
  556. package/src/memory/db-async-query.ts +89 -5
  557. package/src/memory/db-connection.ts +101 -18
  558. package/src/memory/db-init.ts +409 -234
  559. package/src/memory/db-maintenance.ts +43 -38
  560. package/src/memory/db-singleton.ts +45 -19
  561. package/src/memory/fork-message-copy.ts +170 -0
  562. package/src/memory/graph/__tests__/handle-remember-v2.test.ts +92 -0
  563. package/src/memory/graph/bootstrap.test.ts +6 -3
  564. package/src/memory/graph/retriever.test.ts +12 -12
  565. package/src/memory/graph/store.test.ts +15 -25
  566. package/src/memory/graph/store.ts +23 -14
  567. package/src/memory/graph/tool-handlers.ts +34 -5
  568. package/src/memory/graph/tools.ts +5 -2
  569. package/src/memory/indexer.ts +21 -9
  570. package/src/memory/job-handlers/cleanup.ts +10 -3
  571. package/src/memory/job-handlers/embedding.test.ts +4 -4
  572. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +4 -4
  573. package/src/memory/jobs/embed-pkb-file.test.ts +7 -7
  574. package/src/memory/jobs-store.ts +36 -24
  575. package/src/memory/llm-request-log-store.ts +51 -19
  576. package/src/memory/llm-usage-store.ts +31 -1
  577. package/src/memory/memory-retrospective-job.ts +27 -19
  578. package/src/memory/memory-retrospective-startup-cleanup.ts +10 -2
  579. package/src/memory/migrations/{100-core-tables.ts → 000-core-tables.ts} +6 -10
  580. package/src/memory/migrations/104-core-indexes.ts +1 -1
  581. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +189 -196
  582. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +98 -105
  583. package/src/memory/migrations/134-contacts-notes-column.ts +66 -69
  584. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +19 -22
  585. package/src/memory/migrations/136-drop-assistant-id-columns.ts +227 -230
  586. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +204 -209
  587. package/src/memory/migrations/141-rename-verification-table.ts +45 -48
  588. package/src/memory/migrations/142-rename-verification-session-id-column.ts +16 -23
  589. package/src/memory/migrations/143-rename-guardian-verification-values.ts +23 -30
  590. package/src/memory/migrations/144-rename-voice-to-phone.ts +133 -136
  591. package/src/memory/migrations/145-drop-accounts-table.ts +4 -7
  592. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +79 -82
  593. package/src/memory/migrations/148-drop-reminders-table.ts +3 -6
  594. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +71 -78
  595. package/src/memory/migrations/157-invite-contact-id.ts +73 -76
  596. package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +44 -58
  597. package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +36 -43
  598. package/src/memory/migrations/174-rename-thread-starters-table.ts +30 -37
  599. package/src/memory/migrations/176-drop-capability-card-state.ts +17 -22
  600. package/src/memory/migrations/177-create-trace-events-table.ts +23 -28
  601. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +36 -43
  602. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +14 -21
  603. package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +17 -24
  604. package/src/memory/migrations/192-contacts-user-file-column.ts +6 -9
  605. package/src/memory/migrations/193-add-source-type-columns.ts +33 -36
  606. package/src/memory/migrations/194-memory-recall-logs.ts +34 -39
  607. package/src/memory/migrations/196-strip-integration-prefix-from-provider-keys.ts +59 -66
  608. package/src/memory/migrations/199-guardian-request-enrichment-columns.ts +41 -48
  609. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +11 -18
  610. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +76 -83
  611. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +50 -57
  612. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +6 -11
  613. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +4 -9
  614. package/src/memory/migrations/217-conversation-host-access.ts +13 -18
  615. package/src/memory/migrations/220-normalize-user-file-by-principal.ts +86 -93
  616. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +41 -48
  617. package/src/memory/migrations/230-acp-session-history.ts +23 -28
  618. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +58 -62
  619. package/src/memory/migrations/232-activation-state.ts +11 -16
  620. package/src/memory/migrations/233-document-conversations.ts +20 -25
  621. package/src/memory/migrations/234-memory-v2-activation-logs.ts +26 -31
  622. package/src/memory/migrations/235-slack-compaction-watermark.ts +5 -10
  623. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +6 -11
  624. package/src/memory/migrations/237-heartbeat-runs.ts +22 -27
  625. package/src/memory/migrations/239-trace-events-created-at-index.ts +4 -9
  626. package/src/memory/migrations/242-message-bookmarks.ts +17 -22
  627. package/src/memory/migrations/245-memory-retrospective-state.ts +8 -13
  628. package/src/memory/migrations/249-normalize-slack-external-content.ts +37 -41
  629. package/src/memory/migrations/251-a2a-tasks.ts +27 -32
  630. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +12 -17
  631. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +10 -15
  632. package/src/memory/migrations/256-memory-v2-injection-events.ts +70 -74
  633. package/src/memory/migrations/259-conversation-cleaned-at.ts +4 -9
  634. package/src/memory/migrations/260-rename-cleaned-at.ts +11 -16
  635. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +3 -8
  636. package/src/memory/migrations/262-memory-v3-coactivation.ts +21 -26
  637. package/src/memory/migrations/263-memory-v3-auto-edges.ts +14 -19
  638. package/src/memory/migrations/270-schedule-description.ts +7 -12
  639. package/src/memory/migrations/272-acp-session-history-cwd.ts +8 -13
  640. package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +8 -13
  641. package/src/memory/migrations/297-move-llm-request-logs-to-logs-db.ts +111 -0
  642. package/src/memory/migrations/298-move-memory-jobs-to-memory-db.ts +128 -0
  643. package/src/memory/migrations/299-canonical-guardian-deliveries-conversation-index.ts +19 -0
  644. package/src/memory/migrations/__tests__/297-move-llm-request-logs.test.ts +180 -0
  645. package/src/memory/migrations/__tests__/run-migrations.test.ts +333 -7
  646. package/src/memory/migrations/helpers/relocation.ts +227 -0
  647. package/src/memory/migrations/registry.ts +63 -0
  648. package/src/memory/migrations/run-migrations.ts +187 -16
  649. package/src/memory/migrations/validate-migration-state.ts +50 -145
  650. package/src/memory/raw-query.ts +47 -2
  651. package/src/memory/skill-loaded-events-store.test.ts +1 -1
  652. package/src/memory/task-memory-cleanup.ts +62 -41
  653. package/src/memory/tool-executed-events-store.test.ts +1 -1
  654. package/src/memory/turn-trace-store.test.ts +1 -1
  655. package/src/memory/v2/__tests__/backfill-jobs.test.ts +16 -15
  656. package/src/memory/v2/__tests__/harness-compare.test.ts +1 -1
  657. package/src/memory/v2/__tests__/harness-oracle.test.ts +1 -1
  658. package/src/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
  659. package/src/memory/v2/__tests__/sweep-job.test.ts +2 -2
  660. package/src/memory/v3-eval/__tests__/eval-packets.test.ts +38 -0
  661. package/src/memory/v3-eval/__tests__/eval-tally.test.ts +139 -0
  662. package/src/memory/v3-eval/eval-packets.ts +197 -12
  663. package/src/memory/v3-eval/eval-tally.ts +234 -0
  664. package/src/messaging/provider.ts +10 -0
  665. package/src/messaging/providers/gmail/adapter.ts +1 -0
  666. package/src/messaging/providers/gmail/client.ts +14 -0
  667. package/src/messaging/providers/index.ts +1 -1
  668. package/src/messaging/providers/slack/send.test.ts +87 -39
  669. package/src/messaging/providers/slack/send.ts +84 -105
  670. package/src/notifications/README.md +9 -5
  671. package/src/notifications/__tests__/deterministic-checks.test.ts +43 -1
  672. package/src/notifications/adapters/slack.ts +12 -10
  673. package/src/notifications/approval-card-builder.ts +81 -20
  674. package/src/notifications/approval-card-data.ts +8 -5
  675. package/src/notifications/canonical-delivery-recorder.ts +7 -5
  676. package/src/notifications/conversation-candidates.ts +24 -59
  677. package/src/notifications/copy-composer.ts +48 -68
  678. package/src/notifications/deterministic-checks.ts +19 -16
  679. package/src/notifications/emit-signal.ts +29 -1
  680. package/src/notifications/trusted-contact-payloads.ts +70 -0
  681. package/src/oauth/byo-connection.test.ts +9 -0
  682. package/src/oauth/connection-resolver.test.ts +146 -6
  683. package/src/oauth/connection-resolver.ts +132 -5
  684. package/src/oauth/oauth-store.ts +16 -3
  685. package/src/oauth/scope-utils.ts +21 -0
  686. package/src/plugin-api/index.ts +9 -4
  687. package/src/plugin-api/model-profiles.test.ts +123 -0
  688. package/src/plugin-api/model-profiles.ts +5 -1
  689. package/src/plugin-api/vision-support.test.ts +149 -0
  690. package/src/plugin-api/vision-support.ts +78 -0
  691. package/src/plugins/defaults/compaction/window-manager.ts +45 -64
  692. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +13 -4
  693. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +302 -0
  694. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +103 -0
  695. package/src/plugins/defaults/image-fallback/package.json +14 -0
  696. package/src/plugins/defaults/image-fallback/src/caption-cache.ts +49 -0
  697. package/src/plugins/defaults/image-fallback/src/image-persist.ts +59 -0
  698. package/src/plugins/defaults/image-fallback/src/vision-caption.ts +120 -0
  699. package/src/plugins/defaults/index.ts +23 -0
  700. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +14 -1
  701. package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
  702. package/src/plugins/external-plugin-loader.ts +47 -6
  703. package/src/plugins/mtime-cache.ts +772 -0
  704. package/src/plugins/pipeline.ts +7 -2
  705. package/src/plugins/registry.ts +16 -5
  706. package/src/plugins/user-loader.ts +22 -76
  707. package/src/prompts/persona-resolver.ts +29 -11
  708. package/src/prompts/system-prompt.ts +1 -1
  709. package/src/prompts/templates/system-sections.ts +4 -4
  710. package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
  711. package/src/providers/anthropic/client.ts +254 -185
  712. package/src/providers/call-site-routing.ts +10 -0
  713. package/src/providers/gemini/client.ts +43 -0
  714. package/src/providers/inference/adapter-factory.ts +6 -0
  715. package/src/providers/inference/connections.ts +6 -1
  716. package/src/providers/model-catalog.ts +37 -0
  717. package/src/providers/platform-proxy/constants.ts +5 -0
  718. package/src/providers/ratelimit.ts +9 -0
  719. package/src/providers/retry.ts +10 -0
  720. package/src/providers/together/client.ts +35 -0
  721. package/src/providers/types.ts +16 -0
  722. package/src/providers/usage-tracking.ts +7 -0
  723. package/src/runtime/AGENTS.md +9 -1
  724. package/src/runtime/__tests__/agent-wake.test.ts +259 -4
  725. package/src/runtime/__tests__/slack-block-formatting.test.ts +39 -10
  726. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +417 -0
  727. package/src/runtime/actor-trust-resolver.ts +8 -16
  728. package/src/runtime/agent-wake.ts +183 -60
  729. package/src/runtime/channel-reply-delivery.ts +6 -3
  730. package/src/runtime/guardian-decision-types.ts +3 -22
  731. package/src/runtime/http-server.ts +1 -15
  732. package/src/runtime/invite-redemption-service.ts +155 -6
  733. package/src/runtime/invite-service.ts +113 -62
  734. package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +3 -0
  735. package/src/runtime/routes/__tests__/acp-routes.test.ts +1 -1
  736. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -1
  737. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +277 -0
  738. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +140 -0
  739. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +26 -7
  740. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +14 -10
  741. package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +164 -0
  742. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +1 -1
  743. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +1 -1
  744. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +8 -8
  745. package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +1 -1
  746. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +1 -3
  747. package/src/runtime/routes/__tests__/invite-relay-routes.test.ts +240 -0
  748. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +4 -0
  749. package/src/runtime/routes/__tests__/plugins-routes.test.ts +143 -0
  750. package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -1
  751. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +1 -1
  752. package/src/runtime/routes/acp-routes-list.test.ts +4 -0
  753. package/src/runtime/routes/acp-routes.test.ts +5 -6
  754. package/src/runtime/routes/attachment-routes.ts +21 -17
  755. package/src/runtime/routes/browser-routes.ts +19 -1
  756. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -9
  757. package/src/runtime/routes/channel-verification-routes.ts +12 -1
  758. package/src/runtime/routes/contact-routes.ts +275 -164
  759. package/src/runtime/routes/conversation-query-routes.ts +15 -5
  760. package/src/runtime/routes/conversation-routes.ts +24 -3
  761. package/src/runtime/routes/conversation-starter-routes.ts +7 -8
  762. package/src/runtime/routes/guardian-approval-interception.ts +13 -274
  763. package/src/runtime/routes/inbound-message-handler.ts +20 -15
  764. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +285 -0
  765. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +45 -34
  766. package/src/runtime/routes/inbound-stages/admission-policy.ts +20 -5
  767. package/src/runtime/routes/log-export-routes.ts +2 -2
  768. package/src/runtime/routes/memory-eval-routes.ts +92 -0
  769. package/src/runtime/routes/memory-item-routes.test.ts +12 -11
  770. package/src/runtime/routes/migration-routes.ts +51 -40
  771. package/src/runtime/routes/plugins-routes.ts +164 -8
  772. package/src/runtime/routes/schedule-routes.ts +1 -0
  773. package/src/runtime/routes/usage-routes.ts +3 -0
  774. package/src/runtime/routes/work-items-routes.test.ts +1 -1
  775. package/src/runtime/slack-block-formatting.ts +46 -48
  776. package/src/runtime/trust-verdict-consumer.ts +172 -0
  777. package/src/schedule/scheduler.ts +6 -9
  778. package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
  779. package/src/tools/ask-question/ask-question-tool.test.ts +60 -52
  780. package/src/tools/ask-question/ask-question-tool.ts +14 -73
  781. package/src/tools/browser/__tests__/browser-status.test.ts +20 -0
  782. package/src/tools/browser/browser-execution.ts +16 -4
  783. package/src/tools/document/document-comment-tool.test.ts +1 -1
  784. package/src/tools/executor.ts +15 -3
  785. package/src/tools/host-terminal/host-shell.ts +28 -9
  786. package/src/tools/memory/register.test.ts +32 -0
  787. package/src/tools/skills/load.ts +43 -2
  788. package/src/tools/subagent/spawn.ts +4 -10
  789. package/src/tools/terminal/shell.ts +16 -5
  790. package/src/tools/types.ts +1 -0
  791. package/src/util/fs-watcher-error.ts +36 -0
  792. package/src/util/logs-db-path.ts +22 -0
  793. package/src/util/memory-db-path.ts +23 -0
  794. package/src/watcher/providers/gmail.ts +7 -2
  795. package/src/workflows/engine-integration.test.ts +1 -1
  796. package/src/workflows/engine.test.ts +1 -1
  797. package/src/workflows/engine.ts +22 -0
  798. package/src/workflows/fanout-load.test.ts +1 -1
  799. package/src/workflows/journal-store.test.ts +1 -1
  800. package/src/workflows/leaf-runner.test.ts +40 -1
  801. package/src/workflows/leaf-runner.ts +26 -1
  802. package/src/workspace/git-service.ts +144 -29
  803. package/src/workspace/migrations/109-swap-quality-profile-to-glm-5p2.ts +121 -0
  804. package/src/workspace/migrations/110-flip-balanced-profile-to-together.ts +82 -0
  805. package/src/workspace/migrations/registry.ts +4 -0
  806. package/src/workspace/migrations/runner.ts +32 -2
  807. package/src/__tests__/access-request-decision.test.ts +0 -375
  808. package/src/__tests__/guardian-grant-minting.test.ts +0 -607
  809. package/src/__tests__/plugin-source-watcher.test.ts +0 -302
  810. package/src/api/events/turn-profile-auto-routed.ts +0 -28
  811. package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +0 -107
  812. package/src/daemon/plugin-source-watcher.ts +0 -278
  813. package/src/daemon/switch-inference-profile-tool.ts +0 -62
  814. package/src/memory/guardian-approvals.ts +0 -361
  815. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +0 -66
  816. package/src/memory/migrations/038-actor-token-records.ts +0 -45
  817. package/src/memory/migrations/039-actor-refresh-token-records.ts +0 -57
  818. package/src/memory/migrations/103-complex-migrations.ts +0 -23
  819. package/src/memory/migrations/113-late-migrations.ts +0 -30
  820. package/src/memory/migrations/index.ts +0 -301
  821. package/src/runtime/routes/access-request-decision.ts +0 -297
  822. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +0 -963
  823. package/src/runtime/routes/channel-guardian-routes.ts +0 -19
  824. package/src/runtime/routes/guardian-expiry-sweep.ts +0 -132
@@ -3,7 +3,6 @@ import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
3
3
 
4
4
  import { drizzle } from "drizzle-orm/bun-sqlite";
5
5
 
6
- import { removeTestDbFiles } from "./assert-not-live-db.js";
7
6
  import { makeMockLogger } from "./helpers/mock-logger.js";
8
7
 
9
8
  const originalBunTest = process.env.BUN_TEST;
@@ -15,11 +14,9 @@ mock.module("../util/logger.js", () => ({
15
14
  import { _resetDisplayOrderMigrationForTests } from "../memory/conversation-display-order-migration.js";
16
15
  import { _resetGroupMigrationForTests } from "../memory/conversation-group-migration.js";
17
16
  import { getSqliteFrom } from "../memory/db-connection.js";
18
- import { initializeDb } from "../memory/db-init.js";
19
17
  import { migrateAddConversationInferenceProfile } from "../memory/migrations/227-add-conversation-inference-profile.js";
20
18
  import { migrateRenameInferenceProfileSnakeCase } from "../memory/migrations/228-rename-inference-profile-snake-case.js";
21
19
  import * as schema from "../memory/schema.js";
22
- import { getDbPath } from "../util/platform.js";
23
20
  import { resetDbForTesting } from "./db-test-helpers.js";
24
21
 
25
22
  function createTestDb() {
@@ -73,7 +70,6 @@ function resetMigrationTestDb(): void {
73
70
  // again. Otherwise downstream tests hit `no such column: group_id`.
74
71
  _resetGroupMigrationForTests();
75
72
  _resetDisplayOrderMigrationForTests();
76
- removeTestDbFiles(getDbPath());
77
73
  }
78
74
 
79
75
  describe("conversation inference profile migration", () => {
@@ -88,9 +84,13 @@ describe("conversation inference profile migration", () => {
88
84
  });
89
85
 
90
86
  test("fresh DB initialization includes nullable inference_profile column", () => {
91
- initializeDb();
87
+ const db = createTestDb();
88
+ const raw = getSqliteFrom(db);
89
+
90
+ bootstrapPreInferenceProfileConversations(raw);
91
+ migrateAddConversationInferenceProfile(db);
92
+ migrateRenameInferenceProfileSnakeCase(db);
92
93
 
93
- const raw = new Database(getDbPath());
94
94
  const columns = getColumnNames(raw);
95
95
  // Migration 228 renames the camelCase column added by 227 to snake_case to
96
96
  // match the rest of the table.
@@ -106,7 +106,6 @@ describe("conversation inference profile migration", () => {
106
106
 
107
107
  expect(inferenceProfileColumn).toBeDefined();
108
108
  expect(inferenceProfileColumn?.notnull).toBe(0);
109
- raw.close();
110
109
  });
111
110
 
112
111
  test("migration upgrades the previous schema without disturbing existing rows", () => {
@@ -11,7 +11,6 @@ import {
11
11
 
12
12
  import { drizzle } from "drizzle-orm/bun-sqlite";
13
13
 
14
- import { removeTestDbFiles } from "./assert-not-live-db.js";
15
14
  const originalBunTest = process.env.BUN_TEST;
16
15
 
17
16
  mock.module("../util/logger.js", () => ({
@@ -22,10 +21,8 @@ mock.module("../util/logger.js", () => ({
22
21
  }));
23
22
 
24
23
  import { getSqliteFrom } from "../memory/db-connection.js";
25
- import { initializeDb } from "../memory/db-init.js";
26
24
  import { migrateLlmRequestLogProvider } from "../memory/migrations/184-llm-request-log-provider.js";
27
25
  import * as schema from "../memory/schema.js";
28
- import { getDbPath } from "../util/platform.js";
29
26
  import { resetDbForTesting } from "./db-test-helpers.js";
30
27
 
31
28
  function createTestDb() {
@@ -61,12 +58,10 @@ describe("llm_request_logs provider migration", () => {
61
58
  beforeEach(() => {
62
59
  process.env.BUN_TEST = "0";
63
60
  resetDbForTesting();
64
- removeTestDbFiles(getDbPath());
65
61
  });
66
62
 
67
63
  afterEach(() => {
68
64
  resetDbForTesting();
69
- removeTestDbFiles(getDbPath());
70
65
  });
71
66
 
72
67
  afterAll(() => {
@@ -76,21 +71,21 @@ describe("llm_request_logs provider migration", () => {
76
71
  process.env.BUN_TEST = originalBunTest;
77
72
  }
78
73
  resetDbForTesting();
79
- removeTestDbFiles(getDbPath());
80
74
  });
81
75
 
82
76
  test("fresh DB initialization includes llm_request_logs.provider", () => {
83
- initializeDb();
77
+ const db = createTestDb();
78
+ const raw = getSqliteFrom(db);
79
+
80
+ bootstrapPreProviderLlmRequestLogs(raw);
81
+ migrateLlmRequestLogProvider(db);
84
82
 
85
- const raw = new Database(getDbPath());
86
83
  const columns = getColumnInfo(raw);
87
84
 
88
85
  expect(columns.some((column) => column.name === "provider")).toBe(true);
89
86
  expect(columns.find((column) => column.name === "provider")?.notnull).toBe(
90
87
  0,
91
88
  );
92
-
93
- raw.close();
94
89
  });
95
90
 
96
91
  test("migration upgrades the pre-provider schema without disturbing rows", () => {
@@ -16,11 +16,23 @@ import { afterEach, describe, expect, test } from "bun:test";
16
16
 
17
17
  import { drizzle } from "drizzle-orm/bun-sqlite";
18
18
 
19
- import { getSqliteFrom } from "../memory/db-connection.js";
20
- import { downJobDeferrals } from "../memory/migrations/001-job-deferrals.js";
21
- import { downMemoryEntityRelationDedup } from "../memory/migrations/004-entity-relation-dedup.js";
22
- import { downMemoryItemsFingerprintScopeUnique } from "../memory/migrations/005-fingerprint-scope-unique.js";
23
- import { downMemoryItemsScopeSaltedFingerprints } from "../memory/migrations/006-scope-salted-fingerprints.js";
19
+ import { type DrizzleDb, getSqliteFrom } from "../memory/db-connection.js";
20
+ import {
21
+ downJobDeferrals,
22
+ migrateJobDeferrals,
23
+ } from "../memory/migrations/001-job-deferrals.js";
24
+ import {
25
+ downMemoryEntityRelationDedup,
26
+ migrateMemoryEntityRelationDedup,
27
+ } from "../memory/migrations/004-entity-relation-dedup.js";
28
+ import {
29
+ downMemoryItemsFingerprintScopeUnique,
30
+ migrateMemoryItemsFingerprintScopeUnique,
31
+ } from "../memory/migrations/005-fingerprint-scope-unique.js";
32
+ import {
33
+ downMemoryItemsScopeSaltedFingerprints,
34
+ migrateMemoryItemsScopeSaltedFingerprints,
35
+ } from "../memory/migrations/006-scope-salted-fingerprints.js";
24
36
  import { downAssistantIdToSelf } from "../memory/migrations/007-assistant-id-to-self.js";
25
37
  import { downRemoveAssistantIdColumns } from "../memory/migrations/008-remove-assistant-id-columns.js";
26
38
  import { downLlmUsageEventsDropAssistantId } from "../memory/migrations/009-llm-usage-events-drop-assistant-id.js";
@@ -55,18 +67,17 @@ import { migrateDropCapabilityCardStateDown } from "../memory/migrations/176-dro
55
67
  import { migrateBackfillInlineAttachmentsToDiskDown } from "../memory/migrations/180-backfill-inline-attachments-to-disk.js";
56
68
  import { migrateRenameThreadStartersCheckpointsDown } from "../memory/migrations/181-rename-thread-starters-checkpoints.js";
57
69
  import { migrateBackfillAudioAttachmentMimeTypesDown } from "../memory/migrations/191-backfill-audio-attachment-mime-types.js";
70
+ import { migrateLlmUsageAttribution } from "../memory/migrations/235-llm-usage-attribution.js";
58
71
  import {
59
- migrateJobDeferrals,
60
- migrateLlmUsageAttribution,
61
- migrateMemoryEntityRelationDedup,
62
- migrateMemoryItemsFingerprintScopeUnique,
63
- migrateMemoryItemsScopeSaltedFingerprints,
64
72
  MIGRATION_REGISTRY,
65
73
  type MigrationRegistryEntry,
66
74
  type MigrationValidationResult,
75
+ } from "../memory/migrations/registry.js";
76
+ import { runMigrationSteps } from "../memory/migrations/run-migrations.js";
77
+ import {
67
78
  rollbackMemoryMigration,
68
79
  validateMigrationState,
69
- } from "../memory/migrations/index.js";
80
+ } from "../memory/migrations/validate-migration-state.js";
70
81
  import * as schema from "../memory/schema.js";
71
82
 
72
83
  // ---------------------------------------------------------------------------
@@ -525,11 +536,11 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
525
536
 
526
537
  // Insert a "started" checkpoint — simulates mid-migration crash.
527
538
  raw.exec(
528
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('migration_job_deferrals', 'started', ${now})`,
539
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:migrateJobDeferrals', 'started', ${now})`,
529
540
  );
530
541
  // A completed checkpoint should not be flagged.
531
542
  raw.exec(
532
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('migration_memory_entity_relations_dedup_v1', '1', ${now})`,
543
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:migrateMemoryEntityRelationDedup', '1', ${now})`,
533
544
  );
534
545
 
535
546
  // validateMigrationState logs warnings for crashed migrations and returns
@@ -537,9 +548,9 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
537
548
  // than re-deriving the crashed list from the raw DB — this verifies the
538
549
  // function itself detects the crash, not just that the data is present.
539
550
  const result: MigrationValidationResult = validateMigrationState(db);
540
- expect(result.crashed).toContain("migration_job_deferrals");
551
+ expect(result.crashed).toContain("step:migrateJobDeferrals");
541
552
  expect(result.crashed).not.toContain(
542
- "migration_memory_entity_relations_dedup_v1",
553
+ "step:migrateMemoryEntityRelationDedup",
543
554
  );
544
555
  });
545
556
 
@@ -554,11 +565,12 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
554
565
 
555
566
  const now = Date.now();
556
567
 
557
- // Write the child migration (salted fingerprints) but NOT its parent
558
- // (fingerprint_scope_unique). This violates the declared dependsOn.
568
+ // Write the child migration (salted fingerprints) step checkpoint but NOT
569
+ // its parent (fingerprint_scope_unique). This violates the declared
570
+ // dependsOn — the runner records `step:<stepName>` for completed steps.
559
571
  raw.exec(`
560
572
  INSERT INTO memory_checkpoints (key, value, updated_at)
561
- VALUES ('migration_memory_items_scope_salted_fingerprints_v1', '1', ${now})
573
+ VALUES ('step:migrateMemoryItemsScopeSaltedFingerprints', '1', ${now})
562
574
  `);
563
575
 
564
576
  // validateMigrationState throws an IntegrityError on dependency violations
@@ -959,6 +971,7 @@ describe("rollbackMemoryMigration", () => {
959
971
  const testEntries: MigrationRegistryEntry[] = [
960
972
  {
961
973
  key: "test_rollback_v1000",
974
+ stepName: "test_rollback_v1000",
962
975
  version: 1000,
963
976
  description: "test migration v1000",
964
977
  down: () => {
@@ -967,6 +980,7 @@ describe("rollbackMemoryMigration", () => {
967
980
  },
968
981
  {
969
982
  key: "test_rollback_v1001",
983
+ stepName: "test_rollback_v1001",
970
984
  version: 1001,
971
985
  description: "test migration v1001",
972
986
  down: () => {
@@ -975,6 +989,7 @@ describe("rollbackMemoryMigration", () => {
975
989
  },
976
990
  {
977
991
  key: "test_rollback_v1002",
992
+ stepName: "test_rollback_v1002",
978
993
  version: 1002,
979
994
  description: "test migration v1002",
980
995
  down: () => {
@@ -985,10 +1000,10 @@ describe("rollbackMemoryMigration", () => {
985
1000
 
986
1001
  MIGRATION_REGISTRY.push(...testEntries);
987
1002
 
988
- // Simulate all three migrations as completed.
1003
+ // Simulate all three migrations as completed via their step checkpoints.
989
1004
  for (const entry of testEntries) {
990
1005
  raw.exec(
991
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('${entry.key}', '1', ${now})`,
1006
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:${entry.stepName}', '1', ${now})`,
992
1007
  );
993
1008
  }
994
1009
 
@@ -1004,14 +1019,14 @@ describe("rollbackMemoryMigration", () => {
1004
1019
  // Checkpoints for rolled-back migrations should be deleted.
1005
1020
  const cp1001 = raw
1006
1021
  .query(
1007
- `SELECT 1 FROM memory_checkpoints WHERE key = 'test_rollback_v1001'`,
1022
+ `SELECT 1 FROM memory_checkpoints WHERE key = 'step:test_rollback_v1001'`,
1008
1023
  )
1009
1024
  .get();
1010
1025
  expect(cp1001).toBeNull();
1011
1026
 
1012
1027
  const cp1002 = raw
1013
1028
  .query(
1014
- `SELECT 1 FROM memory_checkpoints WHERE key = 'test_rollback_v1002'`,
1029
+ `SELECT 1 FROM memory_checkpoints WHERE key = 'step:test_rollback_v1002'`,
1015
1030
  )
1016
1031
  .get();
1017
1032
  expect(cp1002).toBeNull();
@@ -1019,13 +1034,78 @@ describe("rollbackMemoryMigration", () => {
1019
1034
  // Checkpoint for the migration at target version should still exist.
1020
1035
  const cp1000 = raw
1021
1036
  .query(
1022
- `SELECT value FROM memory_checkpoints WHERE key = 'test_rollback_v1000'`,
1037
+ `SELECT value FROM memory_checkpoints WHERE key = 'step:test_rollback_v1000'`,
1023
1038
  )
1024
1039
  .get() as { value: string } | null;
1025
1040
  expect(cp1000).toBeTruthy();
1026
1041
  expect(cp1000!.value).toBe("1");
1027
1042
  });
1028
1043
 
1044
+ test("clears forward-step checkpoints so a re-upgrade re-applies a rolled-back registry-backed step", async () => {
1045
+ /**
1046
+ * A registry-backed migration that is also a named forward step is tracked
1047
+ * by the runner's `step:` checkpoint in memory_checkpoints. Rolling it back
1048
+ * must clear the step checkpoint too, otherwise the next upgrade skips the
1049
+ * step and never restores the rolled-back schema.
1050
+ */
1051
+ saveRegistry();
1052
+
1053
+ const db = createTestDb();
1054
+ const raw = getRaw(db);
1055
+ bootstrapCheckpointsTable(raw);
1056
+
1057
+ const hasTable = () =>
1058
+ raw
1059
+ .query(
1060
+ `SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'test_step_rollback_data'`,
1061
+ )
1062
+ .get() !== null;
1063
+
1064
+ // GIVEN a registry-backed migration whose forward body is a named step that
1065
+ // creates a table. The step runner records `step:<functionName>` after a
1066
+ // successful run; the registry entry's stepName maps to that key so rollback
1067
+ // can find and clear it.
1068
+ function migrateTestStepRollback(database: DrizzleDb): void {
1069
+ getSqliteFrom(database).exec(
1070
+ `CREATE TABLE IF NOT EXISTS test_step_rollback_data (id TEXT PRIMARY KEY)`,
1071
+ );
1072
+ }
1073
+
1074
+ // AND the migration is registered with a down() that drops that table.
1075
+ MIGRATION_REGISTRY.push({
1076
+ key: "test_step_rollback_v4000",
1077
+ stepName: "migrateTestStepRollback",
1078
+ version: 4000,
1079
+ description: "test step rollback",
1080
+ down: (database) => {
1081
+ getSqliteFrom(database).exec(
1082
+ `DROP TABLE IF EXISTS test_step_rollback_data`,
1083
+ );
1084
+ },
1085
+ });
1086
+
1087
+ // AND the step has run once through the runner, recording the step checkpoint.
1088
+ await runMigrationSteps(db, [migrateTestStepRollback]);
1089
+ expect(hasTable()).toBe(true);
1090
+ expect(
1091
+ raw
1092
+ .query(
1093
+ `SELECT 1 FROM memory_checkpoints WHERE key = 'step:migrateTestStepRollback'`,
1094
+ )
1095
+ .get(),
1096
+ ).toBeTruthy();
1097
+
1098
+ // AND the migration has since been rolled back below its version.
1099
+ rollbackMemoryMigration(db, 3999);
1100
+ expect(hasTable()).toBe(false);
1101
+
1102
+ // WHEN the runner executes the forward steps again on a later upgrade.
1103
+ await runMigrationSteps(db, [migrateTestStepRollback]);
1104
+
1105
+ // THEN the rolled-back step re-applies instead of being skipped.
1106
+ expect(hasTable()).toBe(true);
1107
+ });
1108
+
1029
1109
  test("handles transaction failure in down() — rolls back and preserves checkpoint", () => {
1030
1110
  saveRegistry();
1031
1111
 
@@ -1050,6 +1130,7 @@ describe("rollbackMemoryMigration", () => {
1050
1130
  // but a trigger will force the modification to fail.
1051
1131
  MIGRATION_REGISTRY.push({
1052
1132
  key: "test_fail_down_v3000",
1133
+ stepName: "test_fail_down_v3000",
1053
1134
  version: 3000,
1054
1135
  description: "test migration with failing down()",
1055
1136
  down: (database) => {
@@ -1061,9 +1142,9 @@ describe("rollbackMemoryMigration", () => {
1061
1142
  },
1062
1143
  });
1063
1144
 
1064
- // Mark as completed.
1145
+ // Mark as completed (via step checkpoint).
1065
1146
  raw.exec(
1066
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('test_fail_down_v3000', '1', ${now})`,
1147
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:test_fail_down_v3000', '1', ${now})`,
1067
1148
  );
1068
1149
 
1069
1150
  // Install a trigger to force the down() function to fail.
@@ -1091,7 +1172,7 @@ describe("rollbackMemoryMigration", () => {
1091
1172
  // written before down() was called and is preserved.
1092
1173
  const cp = raw
1093
1174
  .query(
1094
- `SELECT value FROM memory_checkpoints WHERE key = 'test_fail_down_v3000'`,
1175
+ `SELECT value FROM memory_checkpoints WHERE key = 'step:test_fail_down_v3000'`,
1095
1176
  )
1096
1177
  .get() as { value: string } | null;
1097
1178
  expect(cp).toBeTruthy();
@@ -1130,6 +1211,7 @@ describe("rollbackMemoryMigration", () => {
1130
1211
  // wrapped every down() call in BEGIN/COMMIT.
1131
1212
  MIGRATION_REGISTRY.push({
1132
1213
  key: "test_self_txn_down_v3500",
1214
+ stepName: "test_self_txn_down_v3500",
1133
1215
  version: 3500,
1134
1216
  description: "test migration with self-transactional down()",
1135
1217
  down: (database) => {
@@ -1142,9 +1224,9 @@ describe("rollbackMemoryMigration", () => {
1142
1224
  },
1143
1225
  });
1144
1226
 
1145
- // Mark as completed.
1227
+ // Mark as completed (via step checkpoint).
1146
1228
  raw.exec(
1147
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('test_self_txn_down_v3500', '1', ${now})`,
1229
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:test_self_txn_down_v3500', '1', ${now})`,
1148
1230
  );
1149
1231
 
1150
1232
  // This should succeed — no nested transaction error.
@@ -1162,7 +1244,7 @@ describe("rollbackMemoryMigration", () => {
1162
1244
  // Checkpoint should be deleted.
1163
1245
  const cp = raw
1164
1246
  .query(
1165
- `SELECT 1 FROM memory_checkpoints WHERE key = 'test_self_txn_down_v3500'`,
1247
+ `SELECT 1 FROM memory_checkpoints WHERE key = 'step:test_self_txn_down_v3500'`,
1166
1248
  )
1167
1249
  .get();
1168
1250
  expect(cp).toBeNull();
@@ -1183,6 +1265,7 @@ describe("rollbackMemoryMigration", () => {
1183
1265
  MIGRATION_REGISTRY.push(
1184
1266
  {
1185
1267
  key: "test_noop_v4000",
1268
+ stepName: "test_noop_v4000",
1186
1269
  version: 4000,
1187
1270
  description: "test noop v4000",
1188
1271
  down: () => {
@@ -1191,6 +1274,7 @@ describe("rollbackMemoryMigration", () => {
1191
1274
  },
1192
1275
  {
1193
1276
  key: "test_noop_v4001",
1277
+ stepName: "test_noop_v4001",
1194
1278
  version: 4001,
1195
1279
  description: "test noop v4001",
1196
1280
  down: () => {
@@ -1199,12 +1283,12 @@ describe("rollbackMemoryMigration", () => {
1199
1283
  },
1200
1284
  );
1201
1285
 
1202
- // Mark both as completed.
1286
+ // Mark both as completed (via step checkpoints).
1203
1287
  raw.exec(
1204
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('test_noop_v4000', '1', ${now})`,
1288
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:test_noop_v4000', '1', ${now})`,
1205
1289
  );
1206
1290
  raw.exec(
1207
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('test_noop_v4001', '1', ${now})`,
1291
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:test_noop_v4001', '1', ${now})`,
1208
1292
  );
1209
1293
 
1210
1294
  // Roll back to version >= latest applied migration — should be a no-op.
@@ -1216,12 +1300,12 @@ describe("rollbackMemoryMigration", () => {
1216
1300
  // Both checkpoints should remain.
1217
1301
  const cp4000 = raw
1218
1302
  .query(
1219
- `SELECT value FROM memory_checkpoints WHERE key = 'test_noop_v4000'`,
1303
+ `SELECT value FROM memory_checkpoints WHERE key = 'step:test_noop_v4000'`,
1220
1304
  )
1221
1305
  .get() as { value: string } | null;
1222
1306
  const cp4001 = raw
1223
1307
  .query(
1224
- `SELECT value FROM memory_checkpoints WHERE key = 'test_noop_v4001'`,
1308
+ `SELECT value FROM memory_checkpoints WHERE key = 'step:test_noop_v4001'`,
1225
1309
  )
1226
1310
  .get() as { value: string } | null;
1227
1311
  expect(cp4000!.value).toBe("1");
@@ -1251,6 +1335,7 @@ describe("rollbackMemoryMigration", () => {
1251
1335
  MIGRATION_REGISTRY.push(
1252
1336
  {
1253
1337
  key: "test_parent_v5000",
1338
+ stepName: "test_parent_v5000",
1254
1339
  version: 5000,
1255
1340
  description: "test parent migration",
1256
1341
  down: () => {
@@ -1259,6 +1344,7 @@ describe("rollbackMemoryMigration", () => {
1259
1344
  },
1260
1345
  {
1261
1346
  key: "test_child_v5001",
1347
+ stepName: "test_child_v5001",
1262
1348
  version: 5001,
1263
1349
  dependsOn: ["test_parent_v5000"],
1264
1350
  description: "test child migration depending on parent",
@@ -1268,12 +1354,12 @@ describe("rollbackMemoryMigration", () => {
1268
1354
  },
1269
1355
  );
1270
1356
 
1271
- // Both are completed.
1357
+ // Both are completed (via step checkpoints).
1272
1358
  raw.exec(
1273
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('test_parent_v5000', '1', ${now})`,
1359
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:test_parent_v5000', '1', ${now})`,
1274
1360
  );
1275
1361
  raw.exec(
1276
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('test_child_v5001', '1', ${now})`,
1362
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:test_child_v5001', '1', ${now})`,
1277
1363
  );
1278
1364
 
1279
1365
  // Roll back to version 4999 — both should be rolled back, child first.
@@ -1286,10 +1372,14 @@ describe("rollbackMemoryMigration", () => {
1286
1372
 
1287
1373
  // Both checkpoints should be deleted.
1288
1374
  const cpParent = raw
1289
- .query(`SELECT 1 FROM memory_checkpoints WHERE key = 'test_parent_v5000'`)
1375
+ .query(
1376
+ `SELECT 1 FROM memory_checkpoints WHERE key = 'step:test_parent_v5000'`,
1377
+ )
1290
1378
  .get();
1291
1379
  const cpChild = raw
1292
- .query(`SELECT 1 FROM memory_checkpoints WHERE key = 'test_child_v5001'`)
1380
+ .query(
1381
+ `SELECT 1 FROM memory_checkpoints WHERE key = 'step:test_child_v5001'`,
1382
+ )
1293
1383
  .get();
1294
1384
  expect(cpParent).toBeNull();
1295
1385
  expect(cpChild).toBeNull();
@@ -15,7 +15,7 @@ import { getSqlite } from "../memory/db-connection.js";
15
15
  import { initializeDb } from "../memory/db-init.js";
16
16
  import { RouteError } from "../runtime/routes/errors.js";
17
17
 
18
- initializeDb();
18
+ await initializeDb();
19
19
 
20
20
  function resetTestTable(): void {
21
21
  const sqlite = getSqlite();
@@ -306,16 +306,5 @@ describe("schedule_syntax column migration", () => {
306
306
  { id: "legacy-defer", description: "" },
307
307
  { id: "legacy-schedule", description: "Legacy report" },
308
308
  ]);
309
-
310
- raw
311
- .query("UPDATE cron_jobs SET description = ? WHERE id = ?")
312
- .run("", "legacy-schedule");
313
-
314
- migrateScheduleDescription(db);
315
-
316
- const description = raw
317
- .query("SELECT description FROM cron_jobs WHERE id = ?")
318
- .get("legacy-schedule") as { description: string };
319
- expect(description.description).toBe("");
320
309
  });
321
310
  });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Test-only utilities for resetting the assistant DB singleton.
2
+ * Test-only utilities for resetting the assistant DB singletons.
3
3
  *
4
4
  * Replaces the removed `resetDb` export from `db-connection.ts`. Lives
5
5
  * here (not in the source module) because production modules should not
@@ -7,52 +7,69 @@
7
7
  *
8
8
  * No source-module imports
9
9
  * ------------------------
10
- * This file has ZERO imports from `src/`. It accesses the DB singleton's
11
- * state via the shared `globalThis.vellumAssistant.dbSingleton` slot
10
+ * This file has ZERO imports from `src/`. It accesses the DB singletons'
11
+ * state via the shared `globalThis.vellumAssistant.dbSingletons` slots
12
12
  * that `src/memory/db-singleton.ts` also reads/writes. The slot shape
13
13
  * is duplicated here on purpose: keeping this file off the production
14
14
  * import graph is what protects the test preload from a broken
15
15
  * `node_modules` symlink (DB ghost #3). The two declarations MUST stay
16
16
  * in sync — if you change one, change the other.
17
17
  *
18
- * Production code that needs to close + reopen the DB (post-migration,
18
+ * Production code that needs to close + reopen the DBs (post-migration,
19
19
  * post-restore, post-vbundle-import, on shutdown) should use `resetDb()`
20
20
  * from `src/memory/db-connection.ts` instead.
21
21
  */
22
22
 
23
23
  // Mirrors `src/memory/db-singleton.ts`. Duplicated by design — see the
24
24
  // "No source-module imports" section above.
25
+ type DbSlotKey = "main" | "logs" | "memory";
26
+
25
27
  type DbSlot = {
26
28
  db: unknown;
27
29
  closer: (() => void) | null;
28
30
  };
29
31
 
32
+ type DbSlots = Record<DbSlotKey, DbSlot>;
33
+
30
34
  type VellumAssistantNamespace = {
31
- dbSingleton?: DbSlot;
35
+ dbSingletons?: DbSlots;
32
36
  };
33
37
 
34
- function dbSlot(): DbSlot {
38
+ function emptySlot(): DbSlot {
39
+ return { db: null, closer: null };
40
+ }
41
+
42
+ function dbSlots(): DbSlots {
35
43
  const g = globalThis as { vellumAssistant?: VellumAssistantNamespace };
36
44
  const ns = (g.vellumAssistant ??= {});
37
- return (ns.dbSingleton ??= { db: null, closer: null });
45
+ return (ns.dbSingletons ??= {
46
+ main: emptySlot(),
47
+ logs: emptySlot(),
48
+ memory: emptySlot(),
49
+ });
38
50
  }
39
51
 
40
52
  /**
41
- * Close the active DB connection (if any) and drop the singleton.
53
+ * Close every active DB connection (main, logs, memory) and drop the
54
+ * singletons.
42
55
  *
43
- * Used by tests that nuke or replace the DB file mid-run — without this
44
- * reset, subsequent `getDb()` calls return a handle to the now-gone file.
45
- * Idempotent: safe to call when no connection has been opened.
56
+ * Used by tests that nuke or replace a DB file mid-run — without this
57
+ * reset, subsequent `getDb()`/`getLogsDb()`/`getMemoryDb()` calls return a
58
+ * handle to the now-gone file. Idempotent: safe to call when no connection
59
+ * has been opened.
46
60
  */
47
61
  export function resetDbForTesting(): void {
48
- const s = dbSlot();
49
- if (s.closer) {
50
- try {
51
- s.closer();
52
- } catch {
53
- /* best-effort close */
62
+ const slots = dbSlots();
63
+ for (const key of ["main", "logs", "memory"] as const) {
64
+ const s = slots[key];
65
+ if (s.closer) {
66
+ try {
67
+ s.closer();
68
+ } catch {
69
+ /* best-effort close */
70
+ }
54
71
  }
72
+ s.db = null;
73
+ s.closer = null;
55
74
  }
56
- s.db = null;
57
- s.closer = null;
58
75
  }
@@ -35,7 +35,7 @@ import {
35
35
  import { _setDeleteLookupConfigForTests } from "../runtime/routes/inbound-message-handler.js";
36
36
  import { handleChannelInbound } from "./helpers/channel-test-adapter.js";
37
37
 
38
- initializeDb();
38
+ await initializeDb();
39
39
 
40
40
  const TEST_BEARER_TOKEN = "test-token";
41
41
  // Slack `message_deleted` events stamp the deleted message's original author