@vellumai/assistant 0.10.2-dev.202606250318.5e7cfb0 → 0.10.2

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 (430) hide show
  1. package/bun.lock +0 -20
  2. package/docs/workspace-tools.md +33 -42
  3. package/eslint-rules/cli-no-daemon-internals.js +0 -6
  4. package/node_modules/@vellumai/gateway-client/src/__tests__/trust-verdict-contract.test.ts +0 -31
  5. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +0 -44
  6. package/node_modules/@vellumai/gateway-client/src/index.ts +0 -14
  7. package/node_modules/@vellumai/gateway-client/src/trust-verdict-contract.ts +0 -17
  8. package/node_modules/@vellumai/service-contracts/package.json +0 -1
  9. package/node_modules/@vellumai/service-contracts/src/index.ts +0 -1
  10. package/openapi.yaml +0 -155
  11. package/package.json +1 -4
  12. package/scripts/test.sh +15 -36
  13. package/src/__tests__/actor-token-service.test.ts +14 -36
  14. package/src/__tests__/agent-loop-override-profile.test.ts +0 -1
  15. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -2
  16. package/src/__tests__/agent-wake-override-profile.test.ts +0 -2
  17. package/src/__tests__/annotate-activity-metadata.test.ts +0 -2
  18. package/src/__tests__/annotate-risk-options.test.ts +0 -2
  19. package/src/__tests__/approval-cascade.test.ts +0 -2
  20. package/src/__tests__/assistant-attachments.test.ts +0 -42
  21. package/src/__tests__/background-workers-disk-pressure.test.ts +0 -2
  22. package/src/__tests__/btw-routes.test.ts +0 -2
  23. package/src/__tests__/build-persisted-content.test.ts +0 -2
  24. package/src/__tests__/call-controller.test.ts +0 -19
  25. package/src/__tests__/channel-guardian.test.ts +58 -94
  26. package/src/__tests__/channel-reply-delivery.test.ts +0 -2
  27. package/src/__tests__/compaction-events.test.ts +0 -2
  28. package/src/__tests__/compaction.benchmark.test.ts +0 -2
  29. package/src/__tests__/compactor-call-site-logging.test.ts +0 -2
  30. package/src/__tests__/compactor-low-watermark-cut.test.ts +0 -2
  31. package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -2
  32. package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -2
  33. package/src/__tests__/compactor-web-search-strip.test.ts +0 -2
  34. package/src/__tests__/config-loader-backfill.test.ts +10 -123
  35. package/src/__tests__/config-schema.test.ts +0 -1
  36. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +29 -31
  37. package/src/__tests__/contacts-relay-reads.test.ts +15 -13
  38. package/src/__tests__/conversation-abort-tool-results.test.ts +0 -2
  39. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +0 -2
  40. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +0 -2
  41. package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -2
  42. package/src/__tests__/conversation-agent-loop.test.ts +0 -134
  43. package/src/__tests__/conversation-analysis-routes.test.ts +0 -2
  44. package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -2
  45. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -2
  46. package/src/__tests__/conversation-history-web-search.test.ts +0 -2
  47. package/src/__tests__/conversation-load-history-repair.test.ts +0 -2
  48. package/src/__tests__/conversation-load-history-stripped.test.ts +0 -2
  49. package/src/__tests__/conversation-pairing.test.ts +0 -2
  50. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -2
  51. package/src/__tests__/conversation-process-callsite.test.ts +0 -2
  52. package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -2
  53. package/src/__tests__/conversation-queue.test.ts +0 -91
  54. package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -14
  55. package/src/__tests__/conversation-routes-slash-commands.test.ts +0 -14
  56. package/src/__tests__/conversation-slash-queue.test.ts +0 -2
  57. package/src/__tests__/conversation-slash-unknown.test.ts +0 -2
  58. package/src/__tests__/conversation-speed-override.test.ts +0 -2
  59. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -29
  60. package/src/__tests__/conversation-title-service.test.ts +0 -2
  61. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -47
  62. package/src/__tests__/conversation-usage.test.ts +0 -2
  63. package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -2
  64. package/src/__tests__/conversation-workspace-injection.test.ts +0 -2
  65. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -2
  66. package/src/__tests__/credential-security-invariants.test.ts +1 -1
  67. package/src/__tests__/db-migration-rollback.test.ts +171 -205
  68. package/src/__tests__/db-test-helpers.ts +4 -5
  69. package/src/__tests__/deterministic-verification-control-plane.test.ts +2 -4
  70. package/src/__tests__/disk-pressure-guard.test.ts +0 -41
  71. package/src/__tests__/dm-persistence.test.ts +0 -2
  72. package/src/__tests__/emit-signal-routing-intent.test.ts +5 -10
  73. package/src/__tests__/events-dev-bypass-actor.test.ts +1 -7
  74. package/src/__tests__/exploration-drift-hook.test.ts +2 -3
  75. package/src/__tests__/filing-service.test.ts +0 -2
  76. package/src/__tests__/guardian-binding-drift-heal.test.ts +10 -75
  77. package/src/__tests__/guardian-dispatch.test.ts +1 -95
  78. package/src/__tests__/guardian-outbound-http.test.ts +0 -13
  79. package/src/__tests__/heartbeat-disk-pressure.test.ts +0 -2
  80. package/src/__tests__/heartbeat-service.test.ts +0 -2
  81. package/src/__tests__/helpers/channel-test-adapter.ts +7 -1
  82. package/src/__tests__/host-app-control-routes.test.ts +30 -24
  83. package/src/__tests__/host-bash-routes.test.ts +41 -31
  84. package/src/__tests__/host-browser-routes.test.ts +32 -26
  85. package/src/__tests__/host-cu-routes-targeted.test.ts +33 -25
  86. package/src/__tests__/host-file-routes-targeted.test.ts +52 -40
  87. package/src/__tests__/host-transfer-routes-targeted.test.ts +43 -31
  88. package/src/__tests__/http-user-message-parity.test.ts +8 -290
  89. package/src/__tests__/inbound-invite-redemption.test.ts +0 -28
  90. package/src/__tests__/inbound-slack-persistence.test.ts +0 -2
  91. package/src/__tests__/invite-redemption-service.test.ts +0 -198
  92. package/src/__tests__/llm-context-normalization.test.ts +0 -105
  93. package/src/__tests__/llm-request-log-error-payload.test.ts +9 -71
  94. package/src/__tests__/llm-usage-store.test.ts +0 -25
  95. package/src/__tests__/mcp-health-check.test.ts +1 -2
  96. package/src/__tests__/media-stream-server-integration.test.ts +0 -127
  97. package/src/__tests__/memory-retrieval-hook.test.ts +0 -2
  98. package/src/__tests__/messaging-send-tool.test.ts +0 -2
  99. package/src/__tests__/migration-import-from-url.test.ts +2 -2
  100. package/src/__tests__/mtime-cache.test.ts +5 -146
  101. package/src/__tests__/native-web-search.test.ts +0 -2
  102. package/src/__tests__/non-member-access-request.test.ts +17 -189
  103. package/src/__tests__/notification-broadcaster.test.ts +0 -4
  104. package/src/__tests__/notification-decision-recipient-context.test.ts +32 -33
  105. package/src/__tests__/notification-deep-link.test.ts +0 -6
  106. package/src/__tests__/notification-guardian-path.test.ts +0 -19
  107. package/src/__tests__/openai-provider.test.ts +12 -22
  108. package/src/__tests__/openai-responses-provider.test.ts +2 -12
  109. package/src/__tests__/outbound-slack-persistence.test.ts +0 -2
  110. package/src/__tests__/pending-interactions-resolved-event.test.ts +4 -7
  111. package/src/__tests__/persistence-secret-redaction.test.ts +0 -2
  112. package/src/__tests__/plugin-bootstrap.test.ts +73 -3
  113. package/src/__tests__/plugin-route-contribution.test.ts +17 -4
  114. package/src/__tests__/plugin-tool-contribution.test.ts +18 -3
  115. package/src/__tests__/plugin-types.test.ts +2 -0
  116. package/src/__tests__/process-message-background-slack.test.ts +0 -2
  117. package/src/__tests__/process-message-display-content.test.ts +0 -2
  118. package/src/__tests__/provider-error-scenarios.test.ts +4 -5
  119. package/src/__tests__/provider-usage-tracking.test.ts +0 -39
  120. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +0 -2
  121. package/src/__tests__/registry.test.ts +1 -4
  122. package/src/__tests__/relay-server.test.ts +25 -694
  123. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -0
  124. package/src/__tests__/secret-ingress-http.test.ts +0 -14
  125. package/src/__tests__/send-endpoint-busy.test.ts +8 -30
  126. package/src/__tests__/skills.test.ts +0 -44
  127. package/src/__tests__/slack-inbound-verification.test.ts +2 -47
  128. package/src/__tests__/stt-hints.test.ts +13 -44
  129. package/src/__tests__/subagent-detail.test.ts +0 -27
  130. package/src/__tests__/subagent-disposal.test.ts +0 -65
  131. package/src/__tests__/subagent-notify-parent.test.ts +0 -2
  132. package/src/__tests__/subagent-role-registry.test.ts +2 -7
  133. package/src/__tests__/subagent-spawn-tool-fork.test.ts +0 -2
  134. package/src/__tests__/subagent-tools.test.ts +0 -2
  135. package/src/__tests__/suggestion-routes.test.ts +0 -2
  136. package/src/__tests__/title-generate-hook.test.ts +0 -2
  137. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -2
  138. package/src/__tests__/tool-executor.test.ts +11 -16
  139. package/src/__tests__/tool-preview-lifecycle.test.ts +0 -2
  140. package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -2
  141. package/src/__tests__/tool-start-timestamp.test.ts +0 -2
  142. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +10 -10
  143. package/src/__tests__/twilio-routes.test.ts +0 -96
  144. package/src/__tests__/ui-file-upload-surface.test.ts +0 -86
  145. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  146. package/src/__tests__/voice-invite-redemption.test.ts +0 -33
  147. package/src/__tests__/web-search-backend-failure.test.ts +0 -2
  148. package/src/__tests__/workspace-migration-remove-hooks.test.ts +35 -14
  149. package/src/__tests__/workspace-tool-loader.test.ts +2 -195
  150. package/src/__tests__/workspace-tools-watcher-flag.test.ts +70 -0
  151. package/src/agent/loop.ts +0 -56
  152. package/src/api/index.ts +1 -19
  153. package/src/api/responses/llm-request-log-entry.ts +0 -29
  154. package/src/api/responses/subagent-detail.ts +0 -17
  155. package/src/api/surfaces.ts +3 -39
  156. package/src/approvals/guardian-request-resolvers.ts +11 -1
  157. package/src/calls/__tests__/relay-setup-router.test.ts +4 -262
  158. package/src/calls/call-domain.ts +3 -3
  159. package/src/calls/guardian-dispatch.ts +8 -10
  160. package/src/calls/inbound-trust-reader.ts +1 -17
  161. package/src/calls/media-stream-server.ts +0 -21
  162. package/src/calls/relay-server.ts +50 -167
  163. package/src/calls/relay-setup-router.ts +7 -37
  164. package/src/calls/relay-verification.ts +4 -4
  165. package/src/calls/stt-hints.ts +12 -9
  166. package/src/calls/twilio-routes.ts +4 -14
  167. package/src/channels/types.ts +20 -10
  168. package/src/cli/commands/__tests__/cache.test.ts +1 -8
  169. package/src/cli/commands/cache.ts +181 -194
  170. package/src/cli/commands/db/__tests__/repair.test.ts +5 -6
  171. package/src/cli/commands/db/status.ts +1 -37
  172. package/src/cli/commands/mcp.ts +218 -252
  173. package/src/cli/commands/memory/index.ts +0 -2
  174. package/src/cli/commands/plugins.ts +3 -75
  175. package/src/cli/lib/__tests__/install-from-github.test.ts +0 -102
  176. package/src/cli/lib/__tests__/list-installed-plugins.test.ts +1 -160
  177. package/src/cli/lib/list-installed-plugins.ts +1 -179
  178. package/src/config/__tests__/sync-gated-profiles.test.ts +3 -11
  179. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +17 -27
  180. package/src/config/bundled-skills/contacts/tools/contact-search.ts +3 -13
  181. package/src/config/bundled-skills/subagent/SKILL.md +1 -1
  182. package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
  183. package/src/config/feature-flag-registry.json +13 -5
  184. package/src/config/loader.ts +5 -38
  185. package/src/config/schemas/__tests__/memory-v3.test.ts +0 -1
  186. package/src/config/schemas/memory-lifecycle.ts +0 -12
  187. package/src/config/schemas/memory-v3.ts +0 -7
  188. package/src/config/schemas/memory.ts +0 -4
  189. package/src/config/schemas/timeouts.ts +0 -8
  190. package/src/config/seed-inference-profiles.ts +11 -21
  191. package/src/config/skills.ts +5 -27
  192. package/src/config/sync-gated-profiles.ts +13 -12
  193. package/src/contacts/contacts-write.ts +0 -3
  194. package/src/daemon/assistant-attachments.ts +4 -27
  195. package/src/daemon/conversation-agent-loop.ts +0 -28
  196. package/src/daemon/conversation-process.ts +16 -35
  197. package/src/daemon/conversation-surfaces.ts +38 -111
  198. package/src/daemon/conversation-tool-setup.ts +16 -50
  199. package/src/daemon/conversation.ts +1 -13
  200. package/src/daemon/disk-pressure-guard.ts +2 -12
  201. package/src/daemon/event-loop-watchdog.ts +1 -28
  202. package/src/daemon/external-plugins-bootstrap.ts +34 -4
  203. package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -25
  204. package/src/daemon/handlers/config-a2a.ts +14 -6
  205. package/src/daemon/handlers/config-channels.ts +22 -78
  206. package/src/daemon/handlers/conversations.ts +0 -77
  207. package/src/daemon/lifecycle.ts +0 -4
  208. package/src/daemon/mcp-reload-service.ts +0 -10
  209. package/src/daemon/memory-v2-startup.test.ts +0 -72
  210. package/src/daemon/memory-v2-startup.ts +19 -87
  211. package/src/daemon/message-types/conversations.ts +0 -2
  212. package/src/daemon/message-types/surfaces.ts +12 -12
  213. package/src/daemon/server.ts +4 -0
  214. package/src/daemon/shutdown-handlers.ts +0 -20
  215. package/src/daemon/tool-setup-types.ts +0 -9
  216. package/src/daemon/workspace-tools-watcher.ts +328 -0
  217. package/src/ipc/__tests__/clients-list-ipc.test.ts +1 -1
  218. package/src/ipc/assistant-server.ts +2 -2
  219. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
  220. package/src/mcp/client.ts +1 -15
  221. package/src/mcp/mcp-auth-orchestrator.ts +1 -6
  222. package/src/mcp/mcp-oauth-provider.ts +8 -19
  223. package/src/memory/__tests__/memory-retrospective-job.test.ts +0 -8
  224. package/src/memory/conversation-crud.ts +0 -38
  225. package/src/memory/db-connection.ts +3 -22
  226. package/src/memory/db-init.ts +502 -36
  227. package/src/memory/db-singleton.ts +4 -6
  228. package/src/memory/jobs-worker.ts +0 -58
  229. package/src/memory/llm-request-log-store.ts +1 -26
  230. package/src/memory/llm-usage-store.ts +20 -48
  231. package/src/memory/memory-retrospective-job.ts +8 -9
  232. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +56 -130
  233. package/src/memory/migrations/__tests__/run-migrations.test.ts +2 -2
  234. package/src/memory/migrations/registry.ts +573 -0
  235. package/src/memory/migrations/run-migrations.ts +6 -90
  236. package/src/memory/migrations/validate-migration-state.ts +66 -101
  237. package/src/memory/schema/conversations.ts +0 -9
  238. package/src/memory/schema/infrastructure.ts +0 -20
  239. package/src/memory/v2/__tests__/cli-command-store.test.ts +0 -25
  240. package/src/memory/v2/__tests__/skill-store.test.ts +0 -80
  241. package/src/memory/v2/cli-command-store.ts +38 -75
  242. package/src/memory/v2/prompts/consolidation.ts +82 -13
  243. package/src/memory/v2/prompts/router.ts +93 -21
  244. package/src/memory/v2/skill-store.ts +31 -68
  245. package/src/notifications/__tests__/broadcaster.test.ts +8 -16
  246. package/src/notifications/__tests__/decision-engine.test.ts +9 -78
  247. package/src/notifications/broadcaster.ts +1 -8
  248. package/src/notifications/decision-engine.ts +7 -15
  249. package/src/notifications/destination-resolver.ts +24 -68
  250. package/src/notifications/emit-signal.ts +14 -39
  251. package/src/permissions/question-prompter.test.ts +1 -1
  252. package/src/permissions/question-prompter.ts +4 -7
  253. package/src/plugin-api/index.ts +6 -6
  254. package/src/plugin-api/types.ts +5 -3
  255. package/src/plugin-api/vision-support.test.ts +4 -28
  256. package/src/plugin-api/vision-support.ts +31 -66
  257. package/src/plugins/defaults/advisor/__tests__/consult.test.ts +0 -161
  258. package/src/plugins/defaults/advisor/consult.ts +6 -110
  259. package/src/plugins/defaults/advisor/steering.ts +2 -14
  260. package/src/plugins/defaults/advisor/tools/advisor.ts +5 -32
  261. package/src/plugins/defaults/exploration-drift/hooks/post-tool-use.ts +1 -2
  262. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +7 -47
  263. package/src/plugins/defaults/image-fallback/hooks/post-tool-use.ts +11 -10
  264. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +20 -12
  265. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +11 -42
  266. package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +3 -33
  267. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +4 -48
  268. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +8 -4
  269. package/src/plugins/defaults/memory-v3-shadow/injector.ts +15 -43
  270. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +2 -11
  271. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +13 -77
  272. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +11 -12
  273. package/src/plugins/mtime-cache.ts +291 -76
  274. package/src/plugins/pipeline.ts +13 -111
  275. package/src/plugins/types.ts +2 -0
  276. package/src/providers/anthropic/client.ts +0 -5
  277. package/src/providers/call-site-routing.ts +0 -4
  278. package/src/providers/model-catalog.ts +0 -16
  279. package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
  280. package/src/providers/openai/chat-completions-provider.ts +83 -37
  281. package/src/providers/openai/responses-provider.ts +46 -50
  282. package/src/providers/openrouter/client.ts +0 -5
  283. package/src/providers/provider-send-message.ts +0 -4
  284. package/src/providers/ratelimit.ts +0 -4
  285. package/src/providers/retry.ts +0 -4
  286. package/src/providers/types.ts +0 -9
  287. package/src/providers/usage-tracking.ts +0 -4
  288. package/src/runtime/__tests__/trust-verdict-consumer.test.ts +3 -335
  289. package/src/runtime/access-request-helper.ts +39 -19
  290. package/src/runtime/actor-trust-resolver.ts +2 -2
  291. package/src/runtime/assistant-event-hub.ts +1 -1
  292. package/src/runtime/assistant-stream-state.ts +2 -9
  293. package/src/runtime/auth/require-bound-guardian.ts +11 -21
  294. package/src/runtime/channel-verification-service.ts +31 -56
  295. package/src/runtime/confirmation-request-guardian-bridge.ts +3 -3
  296. package/src/runtime/guardian-vellum-migration.ts +7 -66
  297. package/src/runtime/invite-redemption-service.ts +187 -198
  298. package/src/runtime/local-actor-identity.ts +11 -76
  299. package/src/runtime/pending-interactions.ts +1 -11
  300. package/src/runtime/routes/__tests__/channel-verification-revoke.test.ts +5 -56
  301. package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +1 -1
  302. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +0 -187
  303. package/src/runtime/routes/browser-routes.ts +1 -1
  304. package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +5 -13
  305. package/src/runtime/routes/channel-verification-routes.ts +3 -3
  306. package/src/runtime/routes/contact-routes.ts +32 -8
  307. package/src/runtime/routes/conversation-cli-routes.ts +5 -4
  308. package/src/runtime/routes/conversation-list-routes.ts +7 -4
  309. package/src/runtime/routes/conversation-query-routes.ts +0 -72
  310. package/src/runtime/routes/conversation-routes.ts +85 -84
  311. package/src/runtime/routes/events-routes.ts +2 -2
  312. package/src/runtime/routes/global-search-routes.ts +1 -3
  313. package/src/runtime/routes/guardian-action-routes.ts +5 -4
  314. package/src/runtime/routes/host-app-control-routes.ts +4 -5
  315. package/src/runtime/routes/host-bash-routes.ts +4 -5
  316. package/src/runtime/routes/host-browser-routes.ts +11 -9
  317. package/src/runtime/routes/host-cu-routes.ts +4 -5
  318. package/src/runtime/routes/host-file-routes.ts +4 -5
  319. package/src/runtime/routes/host-transfer-routes.ts +6 -6
  320. package/src/runtime/routes/http-adapter.ts +1 -1
  321. package/src/runtime/routes/identity-routes.ts +2 -3
  322. package/src/runtime/routes/inbound-message-handler.ts +5 -5
  323. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +5 -97
  324. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +49 -61
  325. package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -16
  326. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +7 -7
  327. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +8 -21
  328. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +3 -14
  329. package/src/runtime/routes/index.ts +0 -2
  330. package/src/runtime/routes/llm-context-normalization.ts +0 -83
  331. package/src/runtime/routes/mcp-auth-routes.ts +19 -171
  332. package/src/runtime/routes/migration-rollback-routes.ts +3 -4
  333. package/src/runtime/routes/migration-routes.ts +1 -4
  334. package/src/runtime/routes/subagents-routes.ts +0 -5
  335. package/src/runtime/routes/surface-action-routes.ts +56 -42
  336. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -1
  337. package/src/runtime/services/conversation-serializer.ts +9 -7
  338. package/src/runtime/tool-grant-request-helper.ts +3 -3
  339. package/src/runtime/trust-verdict-consumer.ts +9 -85
  340. package/src/runtime/verification-outbound-actions.ts +18 -18
  341. package/src/signals/user-message.ts +0 -16
  342. package/src/subagent/manager.ts +0 -9
  343. package/src/subagent/types.ts +3 -3
  344. package/src/telemetry/types.ts +1 -34
  345. package/src/telemetry/usage-telemetry-reporter.test.ts +2 -3
  346. package/src/telemetry/usage-telemetry-reporter.ts +3 -87
  347. package/src/tools/ask-question/ask-question-tool.test.ts +0 -29
  348. package/src/tools/ask-question/ask-question-tool.ts +0 -13
  349. package/src/tools/executor.ts +4 -4
  350. package/src/tools/registry.ts +0 -18
  351. package/src/tools/shared/filesystem/path-policy.ts +5 -12
  352. package/src/tools/tool-approval-handler.ts +1 -1
  353. package/src/tools/tool-defaults.ts +2 -9
  354. package/src/tools/tool-manifest.ts +0 -3
  355. package/src/tools/types.ts +2 -17
  356. package/src/tools/workspace-tools/loader.ts +244 -348
  357. package/src/util/errors.ts +1 -26
  358. package/src/util/platform.ts +0 -5
  359. package/src/workflows/library.test.ts +0 -140
  360. package/src/workflows/library.ts +28 -82
  361. package/src/workspace/migrations/017-seed-persona-dirs.ts +34 -3
  362. package/src/workspace/migrations/019-scope-journal-to-guardian.ts +24 -3
  363. package/src/workspace/migrations/048-remove-workspace-hooks.ts +66 -14
  364. package/src/workspace/migrations/registry.ts +0 -2
  365. package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-delivery-contract.test.ts +0 -91
  366. package/node_modules/@vellumai/gateway-client/src/guardian-delivery-contract.ts +0 -48
  367. package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +0 -28
  368. package/node_modules/@vellumai/service-contracts/src/channels.ts +0 -41
  369. package/src/__tests__/code-search-tool.test.ts +0 -585
  370. package/src/__tests__/guardian-expiry-notifier.test.ts +0 -282
  371. package/src/__tests__/mcp-config-secret-boundary.test.ts +0 -390
  372. package/src/__tests__/plugin-pipeline.test.ts +0 -96
  373. package/src/__tests__/sse-actor-principal-guardian-source.test.ts +0 -102
  374. package/src/__tests__/steer-on-enqueue-question.test.ts +0 -181
  375. package/src/__tests__/workspace-migration-111-prune-seeded-callsite-defaults.test.ts +0 -208
  376. package/src/agent/loop-exclusive-tool.test.ts +0 -150
  377. package/src/api/constants/sse-replay.ts +0 -41
  378. package/src/api/events/conversation-notice.ts +0 -26
  379. package/src/approvals/guardian-channel-delivery.ts +0 -30
  380. package/src/approvals/guardian-expiry-notifier.ts +0 -148
  381. package/src/cli/commands/memory/__tests__/worker.test.ts +0 -302
  382. package/src/cli/commands/memory/worker.ts +0 -175
  383. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -143
  384. package/src/config/prune-seeded-callsite-defaults.ts +0 -110
  385. package/src/contacts/__tests__/contacts-write-revoke-relay.test.ts +0 -129
  386. package/src/contacts/__tests__/guardian-delivery-reader.test.ts +0 -312
  387. package/src/contacts/__tests__/member-write-relay.test.ts +0 -202
  388. package/src/contacts/guardian-delivery-reader.ts +0 -223
  389. package/src/contacts/member-write-relay.ts +0 -189
  390. package/src/daemon/conversation-notices.ts +0 -60
  391. package/src/daemon/handlers/__tests__/config-channels.test.ts +0 -225
  392. package/src/hooks/hook-loader.ts +0 -341
  393. package/src/mcp/mcp-header-store.ts +0 -134
  394. package/src/memory/__tests__/301-create-watchdog-events.test.ts +0 -110
  395. package/src/memory/__tests__/prompt-override.test.ts +0 -192
  396. package/src/memory/__tests__/watchdog-events-store.test.ts +0 -161
  397. package/src/memory/migrations/300-add-processing-started-at.ts +0 -30
  398. package/src/memory/migrations/301-create-watchdog-events.ts +0 -45
  399. package/src/memory/migrations/__tests__/209-strip-thinking-from-consolidated.test.ts +0 -224
  400. package/src/memory/prompt-override.ts +0 -129
  401. package/src/memory/steps.ts +0 -573
  402. package/src/memory/watchdog-events-store.ts +0 -87
  403. package/src/memory/worker-control.ts +0 -118
  404. package/src/memory/worker-process.ts +0 -72
  405. package/src/notifications/__tests__/connected-channels.test.ts +0 -114
  406. package/src/notifications/__tests__/destination-resolver.test.ts +0 -256
  407. package/src/onboarding/checkin-event.test.ts +0 -222
  408. package/src/onboarding/checkin-event.ts +0 -321
  409. package/src/onboarding/schedule-checkin.ts +0 -190
  410. package/src/plugins/defaults/advisor/__tests__/context-pack-gating.test.ts +0 -106
  411. package/src/plugins/defaults/advisor/__tests__/context-pack.test.ts +0 -60
  412. package/src/plugins/defaults/advisor/context-pack.ts +0 -288
  413. package/src/plugins/defaults/memory-v3-shadow/pool-select.test.ts +0 -146
  414. package/src/plugins/surface-import.ts +0 -121
  415. package/src/providers/openai/__tests__/api-error-normalization.test.ts +0 -321
  416. package/src/providers/openai/api-error-normalization.ts +0 -270
  417. package/src/runtime/__tests__/channel-verification-service.test.ts +0 -133
  418. package/src/runtime/__tests__/guardian-vellum-migration.test.ts +0 -181
  419. package/src/runtime/__tests__/is-guardian-bound-for-channel.test.ts +0 -66
  420. package/src/runtime/__tests__/local-principal-trust.test.ts +0 -164
  421. package/src/runtime/anchored-guardian.test.ts +0 -156
  422. package/src/runtime/anchored-guardian.ts +0 -135
  423. package/src/runtime/auth/__tests__/require-bound-guardian.test.ts +0 -99
  424. package/src/runtime/local-principal-trust.ts +0 -52
  425. package/src/runtime/routes/__tests__/contact-routes.test.ts +0 -212
  426. package/src/runtime/routes/__tests__/global-search-routes.test.ts +0 -93
  427. package/src/runtime/routes/onboarding-checkin-routes.ts +0 -86
  428. package/src/tools/filesystem/search.ts +0 -543
  429. package/src/util/telemetry-db-path.ts +0 -24
  430. package/src/workspace/migrations/111-prune-seeded-callsite-defaults.ts +0 -134
@@ -12,7 +12,7 @@
12
12
 
13
13
  import { createHash } from "node:crypto";
14
14
  import { Database } from "bun:sqlite";
15
- import { describe, expect, test } from "bun:test";
15
+ import { afterEach, describe, expect, test } from "bun:test";
16
16
 
17
17
  import { drizzle } from "drizzle-orm/bun-sqlite";
18
18
 
@@ -69,16 +69,16 @@ import { migrateRenameThreadStartersCheckpointsDown } from "../memory/migrations
69
69
  import { migrateBackfillAudioAttachmentMimeTypesDown } from "../memory/migrations/191-backfill-audio-attachment-mime-types.js";
70
70
  import { migrateLlmUsageAttribution } from "../memory/migrations/235-llm-usage-attribution.js";
71
71
  import {
72
- type MigrationStep,
73
- runMigrationSteps,
74
- } from "../memory/migrations/run-migrations.js";
75
- import {
72
+ MIGRATION_REGISTRY,
73
+ type MigrationRegistryEntry,
76
74
  type MigrationValidationResult,
75
+ } from "../memory/migrations/registry.js";
76
+ import { runMigrationSteps } from "../memory/migrations/run-migrations.js";
77
+ import {
77
78
  rollbackMemoryMigration,
78
79
  validateMigrationState,
79
80
  } from "../memory/migrations/validate-migration-state.js";
80
81
  import * as schema from "../memory/schema.js";
81
- import { migrationSteps } from "../memory/steps.js";
82
82
 
83
83
  // ---------------------------------------------------------------------------
84
84
  // Helpers
@@ -547,7 +547,7 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
547
547
  // structured diagnostic data. Assert directly on the returned result rather
548
548
  // than re-deriving the crashed list from the raw DB — this verifies the
549
549
  // function itself detects the crash, not just that the data is present.
550
- const result: MigrationValidationResult = validateMigrationState(db, migrationSteps);
550
+ const result: MigrationValidationResult = validateMigrationState(db);
551
551
  expect(result.crashed).toContain("step:migrateJobDeferrals");
552
552
  expect(result.crashed).not.toContain(
553
553
  "step:migrateMemoryEntityRelationDedup",
@@ -575,24 +575,22 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
575
575
 
576
576
  // validateMigrationState throws an IntegrityError on dependency violations
577
577
  // to block daemon startup with an inconsistent schema.
578
- expect(() => validateMigrationState(db, migrationSteps)).toThrow(
578
+ expect(() => validateMigrationState(db)).toThrow(
579
579
  "Migration dependency violations detected",
580
580
  );
581
- expect(() => validateMigrationState(db, migrationSteps)).toThrow(
582
- "migrateMemoryItemsFingerprintScopeUnique",
581
+ expect(() => validateMigrationState(db)).toThrow(
582
+ "migration_memory_items_fingerprint_scope_unique_v1",
583
583
  );
584
584
 
585
- // Sanity-check: confirm the steps list also declares this dependency, so
586
- // the violation detection is grounded in real schema intent.
587
- const saltedStep = migrationSteps.find(
588
- (s) => typeof s !== "function" && s.name === "migrateMemoryItemsScopeSaltedFingerprints",
585
+ // Sanity-check: confirm the registry also declares this dependency, so the
586
+ // violation detection is grounded in real schema intent.
587
+ const saltedEntry = MIGRATION_REGISTRY.find(
588
+ (e) => e.key === "migration_memory_items_scope_salted_fingerprints_v1",
589
+ );
590
+ expect(saltedEntry).toBeTruthy();
591
+ expect(saltedEntry!.dependsOn).toContain(
592
+ "migration_memory_items_fingerprint_scope_unique_v1",
589
593
  );
590
- expect(saltedStep).toBeTruthy();
591
- if (saltedStep && typeof saltedStep !== "function") {
592
- expect(saltedStep.dependsOn).toContain(
593
- "migrateMemoryItemsFingerprintScopeUnique",
594
- );
595
- }
596
594
  });
597
595
 
598
596
  test("validateMigrationState: no checkpoints table is handled gracefully", () => {
@@ -601,7 +599,7 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
601
599
  const db = createTestDb();
602
600
  // Deliberately do NOT create memory_checkpoints.
603
601
 
604
- expect(() => validateMigrationState(db, migrationSteps)).not.toThrow();
602
+ expect(() => validateMigrationState(db)).not.toThrow();
605
603
  });
606
604
 
607
605
  test("migrateMemoryItemsFingerprintScopeUnique: old schema with UNIQUE on fingerprint is migrated", () => {
@@ -861,40 +859,26 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
861
859
  }
862
860
  });
863
861
 
864
- test("migrationSteps: rollback versions are strictly monotonically increasing", () => {
865
- // Steps ordering invariant: every rollback entry's version must be strictly
866
- // greater than the previous rollback entry across the full steps list. A
867
- // violation here would mean the rollback ordering guarantees documented in
868
- // the migration comments cannot be relied upon.
869
- const rollbackVersions: number[] = [];
870
- for (const step of migrationSteps) {
871
- if (typeof step === "function") continue;
872
- if (!step.rollback) continue;
873
- for (const entry of step.rollback) {
874
- rollbackVersions.push(entry.version);
875
- }
876
- }
877
- rollbackVersions.sort((a, b) => a - b);
878
- for (let i = 1; i < rollbackVersions.length; i++) {
879
- const prev = rollbackVersions[i - 1];
880
- const curr = rollbackVersions[i];
881
- expect(curr).toBeGreaterThan(prev);
862
+ test("MIGRATION_REGISTRY: version numbers are strictly monotonically increasing", () => {
863
+ // Registry ordering invariant: each entry's version must be strictly greater
864
+ // than the previous one. A violation here would mean the ordering guarantees
865
+ // documented in the migration comments cannot be relied upon.
866
+ for (let i = 1; i < MIGRATION_REGISTRY.length; i++) {
867
+ const prev = MIGRATION_REGISTRY[i - 1];
868
+ const curr = MIGRATION_REGISTRY[i];
869
+ expect(curr.version).toBeGreaterThan(prev.version);
882
870
  }
883
871
  });
884
872
 
885
- test("migrationSteps: all dependsOn references point to existing step names", () => {
886
- // Schema drift guard: if a migration declares a dependency on a step name
887
- // that doesn't exist in the steps list, the dependency check in
888
- // validateMigrationState can never be satisfied. This test ensures all
889
- // declared dependencies are valid.
890
- const allNames = new Set(
891
- migrationSteps.map((s) => (typeof s === "function" ? s.name : s.name)),
892
- );
893
- for (const step of migrationSteps) {
894
- if (typeof step === "function") continue;
895
- if (!step.dependsOn) continue;
896
- for (const dep of step.dependsOn) {
897
- expect(allNames.has(dep)).toBe(true);
873
+ test("MIGRATION_REGISTRY: all dependsOn references point to existing registry keys", () => {
874
+ // Schema drift guard: if a migration declares a dependency on a key that
875
+ // doesn't exist in the registry, the dependency check in validateMigrationState
876
+ // can never be satisfied. This test ensures all declared dependencies are valid.
877
+ const allKeys = new Set(MIGRATION_REGISTRY.map((e) => e.key));
878
+ for (const entry of MIGRATION_REGISTRY) {
879
+ if (!entry.dependsOn) continue;
880
+ for (const dep of entry.dependsOn) {
881
+ expect(allKeys.has(dep)).toBe(true);
898
882
  }
899
883
  }
900
884
  });
@@ -954,7 +938,26 @@ describe("schema-drift recovery: migration handles unexpected schema state", ()
954
938
  // ---------------------------------------------------------------------------
955
939
 
956
940
  describe("rollbackMemoryMigration", () => {
941
+ // Track test entries pushed onto MIGRATION_REGISTRY so we can restore after
942
+ // each test. This avoids polluting the real registry across test runs.
943
+ let registrySnapshot: MigrationRegistryEntry[];
944
+
945
+ function saveRegistry() {
946
+ registrySnapshot = [...MIGRATION_REGISTRY];
947
+ }
948
+
949
+ function restoreRegistry() {
950
+ MIGRATION_REGISTRY.length = 0;
951
+ MIGRATION_REGISTRY.push(...registrySnapshot);
952
+ }
953
+
954
+ afterEach(() => {
955
+ restoreRegistry();
956
+ });
957
+
957
958
  test("rolls back checkpoint-tracked migrations in reverse version order", () => {
959
+ saveRegistry();
960
+
958
961
  const db = createTestDb();
959
962
  const raw = getRaw(db);
960
963
  bootstrapCheckpointsTable(raw);
@@ -965,58 +968,47 @@ describe("rollbackMemoryMigration", () => {
965
968
  const now = Date.now();
966
969
 
967
970
  // Use very high version numbers to avoid colliding with real registry entries.
968
- const testSteps: MigrationStep[] = [
971
+ const testEntries: MigrationRegistryEntry[] = [
969
972
  {
970
- name: "test_rollback_v1000",
971
- run: () => {},
972
- rollback: [
973
- {
974
- version: 1000,
975
- description: "test migration v1000",
976
- down: () => {
977
- downCalls.push("test_rollback_v1000");
978
- },
979
- },
980
- ],
973
+ key: "test_rollback_v1000",
974
+ stepName: "test_rollback_v1000",
975
+ version: 1000,
976
+ description: "test migration v1000",
977
+ down: () => {
978
+ downCalls.push("test_rollback_v1000");
979
+ },
981
980
  },
982
981
  {
983
- name: "test_rollback_v1001",
984
- run: () => {},
985
- rollback: [
986
- {
987
- version: 1001,
988
- description: "test migration v1001",
989
- down: () => {
990
- downCalls.push("test_rollback_v1001");
991
- },
992
- },
993
- ],
982
+ key: "test_rollback_v1001",
983
+ stepName: "test_rollback_v1001",
984
+ version: 1001,
985
+ description: "test migration v1001",
986
+ down: () => {
987
+ downCalls.push("test_rollback_v1001");
988
+ },
994
989
  },
995
990
  {
996
- name: "test_rollback_v1002",
997
- run: () => {},
998
- rollback: [
999
- {
1000
- version: 1002,
1001
- description: "test migration v1002",
1002
- down: () => {
1003
- downCalls.push("test_rollback_v1002");
1004
- },
1005
- },
1006
- ],
991
+ key: "test_rollback_v1002",
992
+ stepName: "test_rollback_v1002",
993
+ version: 1002,
994
+ description: "test migration v1002",
995
+ down: () => {
996
+ downCalls.push("test_rollback_v1002");
997
+ },
1007
998
  },
1008
999
  ];
1009
1000
 
1001
+ MIGRATION_REGISTRY.push(...testEntries);
1002
+
1010
1003
  // Simulate all three migrations as completed via their step checkpoints.
1011
- for (const entry of testSteps) {
1012
- if (typeof entry === "function") continue;
1004
+ for (const entry of testEntries) {
1013
1005
  raw.exec(
1014
- `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:${entry.name}', '1', ${now})`,
1006
+ `INSERT INTO memory_checkpoints (key, value, updated_at) VALUES ('step:${entry.stepName}', '1', ${now})`,
1015
1007
  );
1016
1008
  }
1017
1009
 
1018
1010
  // Roll back to version 1000 — should roll back v1002 and v1001 (version > 1000).
1019
- const rolledBack = rollbackMemoryMigration(db, 1000, testSteps);
1011
+ const rolledBack = rollbackMemoryMigration(db, 1000);
1020
1012
 
1021
1013
  // Verify returned keys.
1022
1014
  expect(rolledBack).toEqual(["test_rollback_v1002", "test_rollback_v1001"]);
@@ -1056,6 +1048,8 @@ describe("rollbackMemoryMigration", () => {
1056
1048
  * must clear the step checkpoint too, otherwise the next upgrade skips the
1057
1049
  * step and never restores the rolled-back schema.
1058
1050
  */
1051
+ saveRegistry();
1052
+
1059
1053
  const db = createTestDb();
1060
1054
  const raw = getRaw(db);
1061
1055
  bootstrapCheckpointsTable(raw);
@@ -1069,7 +1063,7 @@ describe("rollbackMemoryMigration", () => {
1069
1063
 
1070
1064
  // GIVEN a registry-backed migration whose forward body is a named step that
1071
1065
  // creates a table. The step runner records `step:<functionName>` after a
1072
- // successful run; the step's rollback entry maps to that key so rollback
1066
+ // successful run; the registry entry's stepName maps to that key so rollback
1073
1067
  // can find and clear it.
1074
1068
  function migrateTestStepRollback(database: DrizzleDb): void {
1075
1069
  getSqliteFrom(database).exec(
@@ -1077,25 +1071,18 @@ describe("rollbackMemoryMigration", () => {
1077
1071
  );
1078
1072
  }
1079
1073
 
1080
- // The test step carries rollback metadata so rollbackMemoryMigration can
1081
- // find it in the steps list.
1082
- const testSteps: MigrationStep[] = [
1083
- {
1084
- name: "migrateTestStepRollback",
1085
- run: migrateTestStepRollback,
1086
- rollback: [
1087
- {
1088
- version: 4000,
1089
- description: "test step rollback",
1090
- down: (database) => {
1091
- getSqliteFrom(database).exec(
1092
- `DROP TABLE IF EXISTS test_step_rollback_data`,
1093
- );
1094
- },
1095
- },
1096
- ],
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
+ );
1097
1084
  },
1098
- ];
1085
+ });
1099
1086
 
1100
1087
  // AND the step has run once through the runner, recording the step checkpoint.
1101
1088
  await runMigrationSteps(db, [migrateTestStepRollback]);
@@ -1109,7 +1096,7 @@ describe("rollbackMemoryMigration", () => {
1109
1096
  ).toBeTruthy();
1110
1097
 
1111
1098
  // AND the migration has since been rolled back below its version.
1112
- rollbackMemoryMigration(db, 3999, testSteps);
1099
+ rollbackMemoryMigration(db, 3999);
1113
1100
  expect(hasTable()).toBe(false);
1114
1101
 
1115
1102
  // WHEN the runner executes the forward steps again on a later upgrade.
@@ -1120,6 +1107,8 @@ describe("rollbackMemoryMigration", () => {
1120
1107
  });
1121
1108
 
1122
1109
  test("handles transaction failure in down() — rolls back and preserves checkpoint", () => {
1110
+ saveRegistry();
1111
+
1123
1112
  const db = createTestDb();
1124
1113
  const raw = getRaw(db);
1125
1114
  bootstrapCheckpointsTable(raw);
@@ -1137,27 +1126,21 @@ describe("rollbackMemoryMigration", () => {
1137
1126
  `INSERT INTO test_rollback_data (id, value) VALUES ('row-1', 'original')`,
1138
1127
  );
1139
1128
 
1140
- // The test step carries rollback metadata so rollbackMemoryMigration can
1141
- // find it in the steps list.
1142
- const testSteps: MigrationStep[] = [
1143
- {
1144
- name: "test_fail_down_v3000",
1145
- run: () => {},
1146
- rollback: [
1147
- {
1148
- version: 3000,
1149
- description: "test migration with failing down()",
1150
- down: (database) => {
1151
- const sqlite = getSqliteFrom(database);
1152
- // This UPDATE will trigger our failure trigger.
1153
- sqlite.exec(
1154
- `UPDATE test_rollback_data SET value = 'rolled-back' WHERE id = 'row-1'`,
1155
- );
1156
- },
1157
- },
1158
- ],
1129
+ // Register a migration whose down() modifies test_rollback_data,
1130
+ // but a trigger will force the modification to fail.
1131
+ MIGRATION_REGISTRY.push({
1132
+ key: "test_fail_down_v3000",
1133
+ stepName: "test_fail_down_v3000",
1134
+ version: 3000,
1135
+ description: "test migration with failing down()",
1136
+ down: (database) => {
1137
+ const sqlite = getSqliteFrom(database);
1138
+ // This UPDATE will trigger our failure trigger.
1139
+ sqlite.exec(
1140
+ `UPDATE test_rollback_data SET value = 'rolled-back' WHERE id = 'row-1'`,
1141
+ );
1159
1142
  },
1160
- ];
1143
+ });
1161
1144
 
1162
1145
  // Mark as completed (via step checkpoint).
1163
1146
  raw.exec(
@@ -1175,7 +1158,7 @@ describe("rollbackMemoryMigration", () => {
1175
1158
  // Rollback should throw because down() fails.
1176
1159
  let threw = false;
1177
1160
  try {
1178
- rollbackMemoryMigration(db, 2999, testSteps);
1161
+ rollbackMemoryMigration(db, 2999);
1179
1162
  } catch {
1180
1163
  threw = true;
1181
1164
  }
@@ -1204,6 +1187,8 @@ describe("rollbackMemoryMigration", () => {
1204
1187
  });
1205
1188
 
1206
1189
  test("down() with its own BEGIN/COMMIT succeeds without nested-transaction errors", () => {
1190
+ saveRegistry();
1191
+
1207
1192
  const db = createTestDb();
1208
1193
  const raw = getRaw(db);
1209
1194
  bootstrapCheckpointsTable(raw);
@@ -1221,30 +1206,23 @@ describe("rollbackMemoryMigration", () => {
1221
1206
  `INSERT INTO test_self_txn_data (id, value) VALUES ('row-1', 'migrated')`,
1222
1207
  );
1223
1208
 
1224
- // The test step carries rollback metadata so rollbackMemoryMigration can
1225
- // find it in the steps list. The down() manages its own transaction —
1209
+ // Register a migration whose down() manages its own transaction —
1226
1210
  // this previously caused nested-transaction errors when rollbackMemoryMigration
1227
1211
  // wrapped every down() call in BEGIN/COMMIT.
1228
- const testSteps: MigrationStep[] = [
1229
- {
1230
- name: "test_self_txn_down_v3500",
1231
- run: () => {},
1232
- rollback: [
1233
- {
1234
- version: 3500,
1235
- description: "test migration with self-transactional down()",
1236
- down: (database) => {
1237
- const sqlite = getSqliteFrom(database);
1238
- sqlite.exec("BEGIN");
1239
- sqlite.exec(
1240
- `UPDATE test_self_txn_data SET value = 'original' WHERE id = 'row-1'`,
1241
- );
1242
- sqlite.exec("COMMIT");
1243
- },
1244
- },
1245
- ],
1212
+ MIGRATION_REGISTRY.push({
1213
+ key: "test_self_txn_down_v3500",
1214
+ stepName: "test_self_txn_down_v3500",
1215
+ version: 3500,
1216
+ description: "test migration with self-transactional down()",
1217
+ down: (database) => {
1218
+ const sqlite = getSqliteFrom(database);
1219
+ sqlite.exec("BEGIN");
1220
+ sqlite.exec(
1221
+ `UPDATE test_self_txn_data SET value = 'original' WHERE id = 'row-1'`,
1222
+ );
1223
+ sqlite.exec("COMMIT");
1246
1224
  },
1247
- ];
1225
+ });
1248
1226
 
1249
1227
  // Mark as completed (via step checkpoint).
1250
1228
  raw.exec(
@@ -1252,7 +1230,7 @@ describe("rollbackMemoryMigration", () => {
1252
1230
  );
1253
1231
 
1254
1232
  // This should succeed — no nested transaction error.
1255
- const rolledBack = rollbackMemoryMigration(db, 3499, testSteps);
1233
+ const rolledBack = rollbackMemoryMigration(db, 3499);
1256
1234
 
1257
1235
  expect(rolledBack).toEqual(["test_self_txn_down_v3500"]);
1258
1236
 
@@ -1273,43 +1251,37 @@ describe("rollbackMemoryMigration", () => {
1273
1251
  });
1274
1252
 
1275
1253
  test("no-op when already at target version", () => {
1254
+ saveRegistry();
1255
+
1276
1256
  const db = createTestDb();
1277
1257
  const raw = getRaw(db);
1278
1258
  bootstrapCheckpointsTable(raw);
1279
1259
 
1280
1260
  const now = Date.now();
1281
1261
 
1282
- // Test steps with rollback metadata — they should NOT have down() called.
1262
+ // Register entries with down functions — they should NOT be called.
1283
1263
  const downCalls: string[] = [];
1284
1264
 
1285
- const testSteps: MigrationStep[] = [
1265
+ MIGRATION_REGISTRY.push(
1286
1266
  {
1287
- name: "test_noop_v4000",
1288
- run: () => {},
1289
- rollback: [
1290
- {
1291
- version: 4000,
1292
- description: "test noop v4000",
1293
- down: () => {
1294
- downCalls.push("test_noop_v4000");
1295
- },
1296
- },
1297
- ],
1267
+ key: "test_noop_v4000",
1268
+ stepName: "test_noop_v4000",
1269
+ version: 4000,
1270
+ description: "test noop v4000",
1271
+ down: () => {
1272
+ downCalls.push("test_noop_v4000");
1273
+ },
1298
1274
  },
1299
1275
  {
1300
- name: "test_noop_v4001",
1301
- run: () => {},
1302
- rollback: [
1303
- {
1304
- version: 4001,
1305
- description: "test noop v4001",
1306
- down: () => {
1307
- downCalls.push("test_noop_v4001");
1308
- },
1309
- },
1310
- ],
1276
+ key: "test_noop_v4001",
1277
+ stepName: "test_noop_v4001",
1278
+ version: 4001,
1279
+ description: "test noop v4001",
1280
+ down: () => {
1281
+ downCalls.push("test_noop_v4001");
1282
+ },
1311
1283
  },
1312
- ];
1284
+ );
1313
1285
 
1314
1286
  // Mark both as completed (via step checkpoints).
1315
1287
  raw.exec(
@@ -1320,7 +1292,7 @@ describe("rollbackMemoryMigration", () => {
1320
1292
  );
1321
1293
 
1322
1294
  // Roll back to version >= latest applied migration — should be a no-op.
1323
- const rolledBack = rollbackMemoryMigration(db, 4001, testSteps);
1295
+ const rolledBack = rollbackMemoryMigration(db, 4001);
1324
1296
 
1325
1297
  expect(rolledBack).toEqual([]);
1326
1298
  expect(downCalls).toEqual([]);
@@ -1340,12 +1312,14 @@ describe("rollbackMemoryMigration", () => {
1340
1312
  expect(cp4001!.value).toBe("1");
1341
1313
 
1342
1314
  // Also verify with a target version greater than the latest.
1343
- const rolledBack2 = rollbackMemoryMigration(db, 9999, testSteps);
1315
+ const rolledBack2 = rollbackMemoryMigration(db, 9999);
1344
1316
  expect(rolledBack2).toEqual([]);
1345
1317
  expect(downCalls).toEqual([]);
1346
1318
  });
1347
1319
 
1348
1320
  test("respects dependency ordering on rollback (children rolled back before parents)", () => {
1321
+ saveRegistry();
1322
+
1349
1323
  const db = createTestDb();
1350
1324
  const raw = getRaw(db);
1351
1325
  bootstrapCheckpointsTable(raw);
@@ -1358,35 +1332,27 @@ describe("rollbackMemoryMigration", () => {
1358
1332
  // Since the child has a higher version number, rolling back in reverse
1359
1333
  // version order means the child (v5001) is rolled back BEFORE the parent
1360
1334
  // (v5000), which is the correct dependency-safe ordering.
1361
- const testSteps: MigrationStep[] = [
1335
+ MIGRATION_REGISTRY.push(
1362
1336
  {
1363
- name: "test_parent_v5000",
1364
- run: () => {},
1365
- rollback: [
1366
- {
1367
- version: 5000,
1368
- description: "test parent migration",
1369
- down: () => {
1370
- downCalls.push("test_parent_v5000");
1371
- },
1372
- },
1373
- ],
1337
+ key: "test_parent_v5000",
1338
+ stepName: "test_parent_v5000",
1339
+ version: 5000,
1340
+ description: "test parent migration",
1341
+ down: () => {
1342
+ downCalls.push("test_parent_v5000");
1343
+ },
1374
1344
  },
1375
1345
  {
1376
- name: "test_child_v5001",
1377
- run: () => {},
1346
+ key: "test_child_v5001",
1347
+ stepName: "test_child_v5001",
1348
+ version: 5001,
1378
1349
  dependsOn: ["test_parent_v5000"],
1379
- rollback: [
1380
- {
1381
- version: 5001,
1382
- description: "test child migration depending on parent",
1383
- down: () => {
1384
- downCalls.push("test_child_v5001");
1385
- },
1386
- },
1387
- ],
1350
+ description: "test child migration depending on parent",
1351
+ down: () => {
1352
+ downCalls.push("test_child_v5001");
1353
+ },
1388
1354
  },
1389
- ];
1355
+ );
1390
1356
 
1391
1357
  // Both are completed (via step checkpoints).
1392
1358
  raw.exec(
@@ -1397,7 +1363,7 @@ describe("rollbackMemoryMigration", () => {
1397
1363
  );
1398
1364
 
1399
1365
  // Roll back to version 4999 — both should be rolled back, child first.
1400
- const rolledBack = rollbackMemoryMigration(db, 4999, testSteps);
1366
+ const rolledBack = rollbackMemoryMigration(db, 4999);
1401
1367
 
1402
1368
  expect(rolledBack).toEqual(["test_child_v5001", "test_parent_v5000"]);
1403
1369
 
@@ -22,7 +22,7 @@
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" | "telemetry";
25
+ type DbSlotKey = "main" | "logs" | "memory";
26
26
 
27
27
  type DbSlot = {
28
28
  db: unknown;
@@ -46,13 +46,12 @@ function dbSlots(): DbSlots {
46
46
  main: emptySlot(),
47
47
  logs: emptySlot(),
48
48
  memory: emptySlot(),
49
- telemetry: emptySlot(),
50
49
  });
51
50
  }
52
51
 
53
52
  /**
54
- * Close every active DB connection (main, logs, memory, telemetry) and drop
55
- * the singletons.
53
+ * Close every active DB connection (main, logs, memory) and drop the
54
+ * singletons.
56
55
  *
57
56
  * Used by tests that nuke or replace a DB file mid-run — without this
58
57
  * reset, subsequent `getDb()`/`getLogsDb()`/`getMemoryDb()` calls return a
@@ -61,7 +60,7 @@ function dbSlots(): DbSlots {
61
60
  */
62
61
  export function resetDbForTesting(): void {
63
62
  const slots = dbSlots();
64
- for (const key of ["main", "logs", "memory", "telemetry"] as const) {
63
+ for (const key of ["main", "logs", "memory"] as const) {
65
64
  const s = slots[key];
66
65
  if (s.closer) {
67
66
  try {
@@ -173,11 +173,9 @@ describe("TwiML parameter propagation", () => {
173
173
  // ---------------------------------------------------------------------------
174
174
 
175
175
  describe("Call session mode metadata", () => {
176
- // Cold DB init runs every migration; give it headroom over Bun's 5s default
177
- // hook timeout so a loaded CI runner doesn't trip it.
178
176
  beforeEach(async () => {
179
177
  await initializeDb();
180
- }, 30_000);
178
+ });
181
179
 
182
180
  test("createCallSession persists callMode and verificationSessionId", async () => {
183
181
  // Dynamic import to avoid circular dependency issues
@@ -239,7 +237,7 @@ describe("Call session mode metadata", () => {
239
237
  describe("Verification control messages are deterministic (guard)", () => {
240
238
  beforeEach(async () => {
241
239
  await initializeDb();
242
- }, 30_000);
240
+ });
243
241
 
244
242
  test("handleChannelInbound does not call processMessage for /start gv_<token> bootstrap commands", async () => {
245
243
  const { createHash, randomBytes } = await import("node:crypto");