@vellumai/assistant 0.5.16 → 0.6.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 (592) hide show
  1. package/AGENTS.md +4 -0
  2. package/ARCHITECTURE.md +69 -16
  3. package/Dockerfile +2 -5
  4. package/bun.lock +6 -2
  5. package/docker-entrypoint.sh +32 -1
  6. package/docs/architecture/integrations.md +1 -1
  7. package/docs/architecture/memory.md +21 -24
  8. package/knip.json +2 -1
  9. package/openapi.yaml +1198 -83
  10. package/package.json +5 -1
  11. package/src/__tests__/actor-token-service.test.ts +68 -0
  12. package/src/__tests__/agent-loop.test.ts +0 -32
  13. package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
  14. package/src/__tests__/anthropic-provider.test.ts +217 -98
  15. package/src/__tests__/app-compiler.test.ts +120 -0
  16. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  17. package/src/__tests__/app-executors.test.ts +47 -1
  18. package/src/__tests__/app-source-watcher.test.ts +159 -0
  19. package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
  20. package/src/__tests__/call-conversation-messages.test.ts +2 -6
  21. package/src/__tests__/call-domain.test.ts +2 -6
  22. package/src/__tests__/call-pointer-messages.test.ts +2 -14
  23. package/src/__tests__/call-recovery.test.ts +2 -6
  24. package/src/__tests__/call-routes-http.test.ts +2 -6
  25. package/src/__tests__/call-store.test.ts +2 -6
  26. package/src/__tests__/cancel-resolves-conversation-key.test.ts +2 -6
  27. package/src/__tests__/canonical-guardian-store.test.ts +2 -6
  28. package/src/__tests__/channel-delivery-store.test.ts +2 -6
  29. package/src/__tests__/channel-retry-sweep.test.ts +2 -6
  30. package/src/__tests__/checker.test.ts +63 -9
  31. package/src/__tests__/clawhub.test.ts +54 -24
  32. package/src/__tests__/cli-command-risk-guard.test.ts +14 -0
  33. package/src/__tests__/config-schema.test.ts +6 -1
  34. package/src/__tests__/config-set-platform-guard.test.ts +302 -0
  35. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -6
  36. package/src/__tests__/contacts-tools.test.ts +31 -0
  37. package/src/__tests__/context-overflow-reducer.test.ts +86 -0
  38. package/src/__tests__/context-token-estimator.test.ts +175 -10
  39. package/src/__tests__/conversation-agent-loop-overflow.test.ts +13 -6
  40. package/src/__tests__/conversation-agent-loop.test.ts +13 -51
  41. package/src/__tests__/conversation-attachments.test.ts +2 -6
  42. package/src/__tests__/conversation-attention-store.test.ts +2 -6
  43. package/src/__tests__/conversation-clear-safety.test.ts +2 -6
  44. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +4 -10
  45. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -6
  46. package/src/__tests__/conversation-disk-view.test.ts +2 -6
  47. package/src/__tests__/conversation-error.test.ts +33 -2
  48. package/src/__tests__/conversation-fork-crud.test.ts +2 -6
  49. package/src/__tests__/conversation-history-web-search.test.ts +6 -1
  50. package/src/__tests__/conversation-load-history-repair.test.ts +5 -1
  51. package/src/__tests__/conversation-media-retry.test.ts +91 -0
  52. package/src/__tests__/conversation-runtime-assembly.test.ts +653 -832
  53. package/src/__tests__/conversation-runtime-workspace.test.ts +1 -93
  54. package/src/__tests__/conversation-starter-routes.test.ts +20 -11
  55. package/src/__tests__/conversation-store.test.ts +2 -6
  56. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +17 -4
  57. package/src/__tests__/conversation-usage.test.ts +2 -6
  58. package/src/__tests__/conversation-wipe.test.ts +13 -414
  59. package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -12
  60. package/src/__tests__/conversation-workspace-injection.test.ts +25 -26
  61. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
  62. package/src/__tests__/copy-composer-tc-templates.test.ts +335 -0
  63. package/src/__tests__/credential-execution-feature-gates.test.ts +3 -3
  64. package/src/__tests__/credential-execution-shell-lockdown.test.ts +2 -2
  65. package/src/__tests__/credential-security-e2e.test.ts +2 -0
  66. package/src/__tests__/date-context.test.ts +76 -210
  67. package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -1
  68. package/src/__tests__/file-list-tool.test.ts +219 -0
  69. package/src/__tests__/first-greeting.test.ts +1 -1
  70. package/src/__tests__/followup-tools.test.ts +2 -6
  71. package/src/__tests__/graph-extraction-event-date.test.ts +186 -0
  72. package/src/__tests__/guardian-action-conversation-turn.test.ts +2 -6
  73. package/src/__tests__/guardian-action-followup-executor.test.ts +2 -6
  74. package/src/__tests__/guardian-action-followup-store.test.ts +2 -6
  75. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +2 -6
  76. package/src/__tests__/guardian-action-late-reply.test.ts +2 -6
  77. package/src/__tests__/guardian-action-store.test.ts +2 -6
  78. package/src/__tests__/guardian-binding-drift-heal.test.ts +2 -6
  79. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +8 -8
  80. package/src/__tests__/guardian-dispatch.test.ts +2 -6
  81. package/src/__tests__/guardian-grant-minting.test.ts +2 -14
  82. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +2 -6
  83. package/src/__tests__/guardian-routing-invariants.test.ts +192 -6
  84. package/src/__tests__/guardian-routing-state.test.ts +2 -6
  85. package/src/__tests__/guardian-verification-voice-binding.test.ts +2 -6
  86. package/src/__tests__/heartbeat-service.test.ts +180 -3
  87. package/src/__tests__/identity-routes.test.ts +328 -0
  88. package/src/__tests__/inbound-invite-redemption.test.ts +2 -6
  89. package/src/__tests__/injection-block.test.ts +178 -0
  90. package/src/__tests__/install-meta.test.ts +506 -0
  91. package/src/__tests__/install-skill-routing.test.ts +293 -0
  92. package/src/__tests__/invite-redemption-service.test.ts +2 -6
  93. package/src/__tests__/invite-routes-http.test.ts +2 -6
  94. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +17 -28
  95. package/src/__tests__/list-messages-attachments.test.ts +2 -6
  96. package/src/__tests__/list-messages-tool-merge.test.ts +300 -0
  97. package/src/__tests__/llm-context-normalization.test.ts +18 -18
  98. package/src/__tests__/llm-context-route-provider.test.ts +103 -6
  99. package/src/__tests__/llm-request-log-turn-query.test.ts +164 -6
  100. package/src/__tests__/llm-usage-store.test.ts +2 -6
  101. package/src/__tests__/log-export-workspace.test.ts +74 -111
  102. package/src/__tests__/managed-store.test.ts +38 -11
  103. package/src/__tests__/mcp-abort-signal.test.ts +5 -0
  104. package/src/__tests__/mcp-client-auth.test.ts +5 -0
  105. package/src/__tests__/memory-jobs-worker-backoff.test.ts +2 -8
  106. package/src/__tests__/memory-recall-log-store.test.ts +134 -6
  107. package/src/__tests__/memory-upsert-concurrency.test.ts +4 -112
  108. package/src/__tests__/migration-export-streaming.test.ts +304 -0
  109. package/src/__tests__/migration-import-commit-http.test.ts +11 -10
  110. package/src/__tests__/mock-fetch.ts +87 -0
  111. package/src/__tests__/non-member-access-request.test.ts +2 -6
  112. package/src/__tests__/notification-decision-recipient-context.test.ts +282 -0
  113. package/src/__tests__/notification-guardian-path.test.ts +2 -6
  114. package/src/__tests__/oauth-cli.test.ts +364 -2
  115. package/src/__tests__/oauth2-gateway-transport.test.ts +18 -3
  116. package/src/__tests__/onboarding-template-contract.test.ts +62 -14
  117. package/src/__tests__/outlook-attachments.test.ts +301 -0
  118. package/src/__tests__/outlook-automation-tools.test.ts +425 -0
  119. package/src/__tests__/outlook-categories.test.ts +212 -0
  120. package/src/__tests__/outlook-client-automation.test.ts +246 -0
  121. package/src/__tests__/outlook-compose-tools.test.ts +325 -0
  122. package/src/__tests__/outlook-declutter-tools.test.ts +585 -0
  123. package/src/__tests__/outlook-email-watcher.test.ts +322 -0
  124. package/src/__tests__/outlook-follow-up.test.ts +196 -0
  125. package/src/__tests__/outlook-messaging-provider.test.ts +498 -3
  126. package/src/__tests__/outlook-trash.test.ts +77 -0
  127. package/src/__tests__/outlook-unsubscribe.test.ts +250 -0
  128. package/src/__tests__/parser.test.ts +32 -0
  129. package/src/__tests__/permission-checker-host-gate.test.ts +452 -0
  130. package/src/__tests__/permission-controls-v2-flag.test.ts +55 -0
  131. package/src/__tests__/permission-mode-sse.test.ts +418 -0
  132. package/src/__tests__/permission-mode-store.test.ts +277 -0
  133. package/src/__tests__/permission-mode.test.ts +101 -0
  134. package/src/__tests__/platform-bash-auto-approve.test.ts +359 -0
  135. package/src/__tests__/platform-callback-registration.test.ts +4 -4
  136. package/src/__tests__/playbook-execution.test.ts +76 -80
  137. package/src/__tests__/playbook-tools.test.ts +5 -7
  138. package/src/__tests__/profiler-routes.test.ts +502 -0
  139. package/src/__tests__/profiler-run-store.test.ts +441 -0
  140. package/src/__tests__/provider-error-scenarios.test.ts +21 -0
  141. package/src/__tests__/proxy-approval-callback.test.ts +4 -75
  142. package/src/__tests__/rebuild-index-graph-nodes.test.ts +273 -0
  143. package/src/__tests__/registry.test.ts +3 -3
  144. package/src/__tests__/require-fresh-approval.test.ts +64 -2
  145. package/src/__tests__/runtime-events-sse-parity.test.ts +2 -6
  146. package/src/__tests__/runtime-events-sse.test.ts +2 -6
  147. package/src/__tests__/sandbox-host-parity.test.ts +5 -4
  148. package/src/__tests__/schedule-store.test.ts +2 -6
  149. package/src/__tests__/schedule-tools.test.ts +2 -6
  150. package/src/__tests__/scheduler-recurrence.test.ts +1 -5
  151. package/src/__tests__/scheduler-reuse-conversation.test.ts +368 -0
  152. package/src/__tests__/scoped-approval-grants.test.ts +2 -6
  153. package/src/__tests__/scoped-grant-security-matrix.test.ts +2 -6
  154. package/src/__tests__/scrub-corrupted-image-attachments.test.ts +278 -0
  155. package/src/__tests__/search-skills-unified.test.ts +422 -0
  156. package/src/__tests__/secret-onetime-send.test.ts +2 -0
  157. package/src/__tests__/send-endpoint-busy.test.ts +44 -9
  158. package/src/__tests__/sequence-store.test.ts +2 -6
  159. package/src/__tests__/server-history-render.test.ts +2 -6
  160. package/src/__tests__/set-permission-mode.test.ts +274 -0
  161. package/src/__tests__/skill-feature-flags-integration.test.ts +38 -31
  162. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  163. package/src/__tests__/skill-load-feature-flag.test.ts +23 -11
  164. package/src/__tests__/skill-memory.test.ts +2 -741
  165. package/src/__tests__/skills-uninstall.test.ts +2 -2
  166. package/src/__tests__/skills.test.ts +1 -1
  167. package/src/__tests__/slack-inbound-verification.test.ts +2 -6
  168. package/src/__tests__/strip-memory-injections.test.ts +187 -0
  169. package/src/__tests__/subagent-detail.test.ts +84 -0
  170. package/src/__tests__/subagent-disposal.test.ts +308 -0
  171. package/src/__tests__/subagent-manager-notify.test.ts +19 -10
  172. package/src/__tests__/subagent-notify-parent.test.ts +390 -0
  173. package/src/__tests__/subagent-role-registry.test.ts +108 -0
  174. package/src/__tests__/subagent-tool-filtering.test.ts +71 -0
  175. package/src/__tests__/subagent-tools.test.ts +464 -4
  176. package/src/__tests__/system-prompt-ask-mode.test.ts +139 -0
  177. package/src/__tests__/task-compiler.test.ts +2 -6
  178. package/src/__tests__/task-management-tools.test.ts +2 -6
  179. package/src/__tests__/task-memory-cleanup.test.ts +185 -241
  180. package/src/__tests__/task-runner.test.ts +2 -6
  181. package/src/__tests__/task-scheduler.test.ts +2 -6
  182. package/src/__tests__/terminal-tools.test.ts +17 -27
  183. package/src/__tests__/test-preload.ts +7 -0
  184. package/src/__tests__/tool-approval-handler.test.ts +2 -6
  185. package/src/__tests__/tool-executor.test.ts +4 -26
  186. package/src/__tests__/tool-grant-request-escalation.test.ts +2 -6
  187. package/src/__tests__/tool-side-effects-slack-dm.test.ts +277 -0
  188. package/src/__tests__/top-level-renderer.test.ts +10 -13
  189. package/src/__tests__/trust-store.test.ts +1 -1
  190. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +2 -6
  191. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +118 -8
  192. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -6
  193. package/src/__tests__/trusted-contact-verification.test.ts +2 -6
  194. package/src/__tests__/turn-boundary-resolution.test.ts +2 -6
  195. package/src/__tests__/usage-cache-backfill-migration.test.ts +1 -6
  196. package/src/__tests__/usage-routes.test.ts +2 -6
  197. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  198. package/src/__tests__/voice-invite-redemption.test.ts +2 -6
  199. package/src/__tests__/voice-scoped-grant-consumer.test.ts +2 -6
  200. package/src/__tests__/voice-session-bridge.test.ts +2 -6
  201. package/src/__tests__/volume-security-guard.test.ts +2 -0
  202. package/src/__tests__/workspace-lifecycle.test.ts +29 -1
  203. package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +2 -6
  204. package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +2 -6
  205. package/src/__tests__/workspace-migration-026-backfill-install-meta.test.ts +558 -0
  206. package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +387 -0
  207. package/src/__tests__/workspace-policy.test.ts +1 -1
  208. package/src/agent/attachments.ts +7 -2
  209. package/src/agent/image-optimize.ts +165 -0
  210. package/src/agent/loop.ts +7 -15
  211. package/src/approvals/guardian-request-resolvers.ts +24 -0
  212. package/src/avatar/traits-png-sync.ts +3 -3
  213. package/src/bundler/app-compiler.ts +179 -2
  214. package/src/bundler/package-resolver.ts +3 -5
  215. package/src/cli/__tests__/notifications.test.ts +1 -2
  216. package/src/cli/__tests__/run-assistant-command.ts +29 -0
  217. package/src/cli/commands/__tests__/email-download.test.ts +245 -0
  218. package/src/cli/commands/__tests__/email-list.test.ts +192 -0
  219. package/src/cli/commands/__tests__/email-register.test.ts +186 -0
  220. package/src/cli/commands/__tests__/email-send.test.ts +291 -0
  221. package/src/cli/commands/__tests__/email-status.test.ts +181 -0
  222. package/src/cli/commands/__tests__/email-unregister.test.ts +139 -0
  223. package/src/cli/commands/__tests__/routes.test.ts +562 -0
  224. package/src/cli/commands/avatar.ts +3 -3
  225. package/src/cli/commands/config.ts +26 -13
  226. package/src/cli/commands/conversations.ts +1 -8
  227. package/src/cli/commands/doctor.ts +2 -2
  228. package/src/cli/commands/email.ts +584 -835
  229. package/src/cli/commands/memory.ts +37 -84
  230. package/src/cli/commands/notifications.ts +7 -2
  231. package/src/cli/commands/oauth/__tests__/connect.test.ts +2 -2
  232. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +2 -2
  233. package/src/cli/commands/oauth/__tests__/mode.test.ts +8 -1
  234. package/src/cli/commands/oauth/__tests__/status.test.ts +2 -2
  235. package/src/cli/commands/oauth/connect.ts +25 -11
  236. package/src/cli/commands/oauth/mode.ts +7 -0
  237. package/src/cli/commands/oauth/shared.ts +39 -3
  238. package/src/cli/commands/platform/__tests__/connect.test.ts +1 -1
  239. package/src/cli/commands/platform/__tests__/disconnect.test.ts +1 -1
  240. package/src/cli/commands/platform/__tests__/status.test.ts +5 -5
  241. package/src/cli/commands/platform/index.ts +16 -16
  242. package/src/cli/commands/routes.ts +396 -0
  243. package/src/cli/commands/skills.ts +218 -36
  244. package/src/cli/commands/trust.ts +2 -2
  245. package/src/cli/lib/daemon-credential-client.ts +2 -3
  246. package/src/cli/program.ts +2 -0
  247. package/src/cli.ts +1 -120
  248. package/src/config/bundled-skills/acp/TOOLS.json +1 -1
  249. package/src/config/bundled-skills/app-builder/SKILL.md +4 -1
  250. package/src/config/bundled-skills/contacts/SKILL.md +0 -1
  251. package/src/config/bundled-skills/contacts/TOOLS.json +0 -8
  252. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -4
  253. package/src/config/bundled-skills/gmail/SKILL.md +4 -12
  254. package/src/config/bundled-skills/google-calendar/SKILL.md +1 -9
  255. package/src/config/bundled-skills/messaging/SKILL.md +17 -18
  256. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +40 -33
  257. package/src/config/bundled-skills/outlook/SKILL.md +189 -0
  258. package/src/config/bundled-skills/outlook/TOOLS.json +530 -0
  259. package/src/config/bundled-skills/outlook/tools/outlook-attachments.ts +85 -0
  260. package/src/config/bundled-skills/outlook/tools/outlook-categories.ts +77 -0
  261. package/src/config/bundled-skills/outlook/tools/outlook-draft.ts +84 -0
  262. package/src/config/bundled-skills/outlook/tools/outlook-follow-up.ts +94 -0
  263. package/src/config/bundled-skills/outlook/tools/outlook-forward.ts +49 -0
  264. package/src/config/bundled-skills/outlook/tools/outlook-outreach-scan.ts +237 -0
  265. package/src/config/bundled-skills/outlook/tools/outlook-rules.ts +161 -0
  266. package/src/config/bundled-skills/outlook/tools/outlook-send-draft.ts +32 -0
  267. package/src/config/bundled-skills/outlook/tools/outlook-sender-digest.ts +272 -0
  268. package/src/config/bundled-skills/outlook/tools/outlook-trash.ts +29 -0
  269. package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +129 -0
  270. package/src/config/bundled-skills/outlook/tools/outlook-vacation.ts +87 -0
  271. package/src/config/bundled-skills/outlook/tools/shared.ts +20 -0
  272. package/src/config/bundled-skills/outlook-calendar/SKILL.md +51 -0
  273. package/src/config/bundled-skills/outlook-calendar/TOOLS.json +221 -0
  274. package/src/config/bundled-skills/outlook-calendar/calendar-client.ts +252 -0
  275. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-check-availability.ts +53 -0
  276. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-create-event.ts +74 -0
  277. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-get-event.ts +18 -0
  278. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-list-events.ts +46 -0
  279. package/src/config/bundled-skills/outlook-calendar/tools/outlook-calendar-rsvp.ts +36 -0
  280. package/src/config/bundled-skills/outlook-calendar/tools/shared.ts +17 -0
  281. package/src/config/bundled-skills/outlook-calendar/types.ts +120 -0
  282. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +47 -40
  283. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +16 -29
  284. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +16 -18
  285. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +39 -47
  286. package/src/config/bundled-skills/schedule/SKILL.md +22 -2
  287. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  288. package/src/config/bundled-skills/settings/tools/avatar-get.ts +3 -13
  289. package/src/config/bundled-skills/settings/tools/avatar-remove.ts +2 -4
  290. package/src/config/bundled-skills/settings/tools/avatar-update.ts +5 -2
  291. package/src/config/bundled-skills/slack/SKILL.md +3 -7
  292. package/src/config/bundled-skills/subagent/SKILL.md +43 -3
  293. package/src/config/bundled-skills/subagent/TOOLS.json +29 -4
  294. package/src/config/bundled-tool-registry.ts +56 -4
  295. package/src/config/env-registry.ts +78 -8
  296. package/src/config/feature-flag-registry.json +38 -125
  297. package/src/config/schema.ts +8 -0
  298. package/src/config/schemas/filing.ts +51 -0
  299. package/src/config/schemas/heartbeat.ts +15 -12
  300. package/src/config/schemas/memory-lifecycle.ts +12 -0
  301. package/src/config/schemas/platform.ts +8 -0
  302. package/src/config/schemas/security.ts +14 -0
  303. package/src/config/schemas/timeouts.ts +1 -1
  304. package/src/config/skills.ts +18 -7
  305. package/src/context/token-estimator.ts +25 -18
  306. package/src/context/window-manager.ts +6 -2
  307. package/src/credential-execution/process-manager.ts +3 -1
  308. package/src/daemon/app-source-watcher.ts +93 -0
  309. package/src/daemon/config-watcher.ts +79 -1
  310. package/src/daemon/context-overflow-reducer.ts +46 -2
  311. package/src/daemon/conversation-agent-loop-handlers.ts +143 -82
  312. package/src/daemon/conversation-agent-loop.ts +236 -108
  313. package/src/daemon/conversation-error.ts +31 -8
  314. package/src/daemon/conversation-history.ts +4 -19
  315. package/src/daemon/conversation-lifecycle.ts +36 -9
  316. package/src/daemon/conversation-media-retry.ts +85 -7
  317. package/src/daemon/conversation-notifiers.ts +4 -1
  318. package/src/daemon/conversation-process.ts +13 -7
  319. package/src/daemon/conversation-runtime-assembly.ts +305 -306
  320. package/src/daemon/conversation-tool-setup.ts +44 -14
  321. package/src/daemon/conversation-workspace.ts +1 -2
  322. package/src/daemon/conversation.ts +59 -2
  323. package/src/daemon/daemon-control.ts +8 -2
  324. package/src/daemon/date-context.ts +26 -53
  325. package/src/daemon/first-greeting.ts +1 -1
  326. package/src/daemon/handlers/conversations.ts +4 -7
  327. package/src/daemon/handlers/shared.test.ts +143 -0
  328. package/src/daemon/handlers/shared.ts +85 -17
  329. package/src/daemon/handlers/skills.ts +416 -209
  330. package/src/daemon/lifecycle.ts +212 -131
  331. package/src/daemon/main.ts +5 -1
  332. package/src/daemon/message-types/conversations.ts +29 -7
  333. package/src/daemon/message-types/messages.ts +12 -2
  334. package/src/daemon/message-types/schedules.ts +1 -0
  335. package/src/daemon/message-types/settings.ts +6 -0
  336. package/src/daemon/message-types/skills.ts +97 -36
  337. package/src/daemon/profiler-run-store.ts +557 -0
  338. package/src/daemon/providers-setup.ts +5 -0
  339. package/src/daemon/server.ts +100 -11
  340. package/src/daemon/shutdown-handlers.ts +5 -0
  341. package/src/daemon/tool-side-effects.ts +50 -8
  342. package/src/export/transcript-formatter.ts +148 -0
  343. package/src/filing/filing-service.ts +228 -0
  344. package/src/heartbeat/heartbeat-service.ts +97 -7
  345. package/src/hooks/cli.ts +2 -2
  346. package/src/hooks/runner.ts +15 -38
  347. package/src/inbound/platform-callback-registration.ts +14 -14
  348. package/src/mcp/client.ts +6 -0
  349. package/src/mcp/mcp-oauth-provider.ts +149 -27
  350. package/src/memory/admin.ts +42 -75
  351. package/src/memory/app-store.ts +69 -0
  352. package/src/memory/conversation-bootstrap.ts +3 -1
  353. package/src/memory/conversation-crud.ts +211 -288
  354. package/src/memory/conversation-group-migration.ts +157 -0
  355. package/src/memory/conversation-queries.ts +61 -13
  356. package/src/memory/conversation-title-service.ts +1 -0
  357. package/src/memory/db-init.ts +194 -361
  358. package/src/memory/embed.ts +73 -0
  359. package/src/memory/embedding-backend.ts +8 -14
  360. package/src/memory/embedding-runtime-manager.ts +12 -114
  361. package/src/memory/fingerprint.ts +2 -2
  362. package/src/memory/graph/bootstrap.ts +521 -0
  363. package/src/memory/graph/capability-seed.ts +449 -0
  364. package/src/memory/graph/consolidation.ts +725 -0
  365. package/src/memory/graph/conversation-graph-memory.ts +659 -0
  366. package/src/memory/graph/decay.test.ts +208 -0
  367. package/src/memory/graph/decay.ts +195 -0
  368. package/src/memory/graph/extraction-job.ts +74 -0
  369. package/src/memory/graph/extraction.test.ts +936 -0
  370. package/src/memory/graph/extraction.ts +1297 -0
  371. package/src/memory/graph/graph-memory-state-store.ts +37 -0
  372. package/src/memory/graph/graph-search.ts +280 -0
  373. package/src/memory/graph/image-ref-utils.ts +29 -0
  374. package/src/memory/graph/injection.test.ts +513 -0
  375. package/src/memory/graph/injection.ts +469 -0
  376. package/src/memory/graph/inspect.ts +543 -0
  377. package/src/memory/graph/narrative.ts +267 -0
  378. package/src/memory/graph/pattern-scan.ts +269 -0
  379. package/src/memory/graph/retriever.ts +1111 -0
  380. package/src/memory/graph/scoring.test.ts +548 -0
  381. package/src/memory/graph/scoring.ts +232 -0
  382. package/src/memory/graph/serendipity.ts +65 -0
  383. package/src/memory/graph/store.test.ts +1098 -0
  384. package/src/memory/graph/store.ts +838 -0
  385. package/src/memory/graph/tool-handlers.ts +301 -0
  386. package/src/memory/graph/tools.ts +97 -0
  387. package/src/memory/graph/triggers.test.ts +487 -0
  388. package/src/memory/graph/triggers.ts +223 -0
  389. package/src/memory/graph/types.ts +295 -0
  390. package/src/memory/group-crud.ts +191 -0
  391. package/src/memory/indexer.ts +37 -19
  392. package/src/memory/job-handlers/cleanup.ts +32 -42
  393. package/src/memory/job-handlers/conversation-starters.ts +91 -53
  394. package/src/memory/job-handlers/embedding.ts +5 -31
  395. package/src/memory/job-handlers/index-maintenance.ts +23 -11
  396. package/src/memory/job-handlers/summarization.ts +32 -17
  397. package/src/memory/job-utils.ts +1 -1
  398. package/src/memory/jobs-store.ts +21 -31
  399. package/src/memory/jobs-worker.ts +180 -129
  400. package/src/memory/llm-request-log-store.ts +96 -12
  401. package/src/memory/memory-recall-log-store.ts +49 -5
  402. package/src/memory/message-content.ts +1 -0
  403. package/src/memory/migrations/202-memory-graph-tables.ts +130 -0
  404. package/src/memory/migrations/203-drop-memory-items-tables.ts +55 -0
  405. package/src/memory/migrations/204-rename-memory-graph-type-values.ts +46 -0
  406. package/src/memory/migrations/205-memory-graph-image-refs.ts +11 -0
  407. package/src/memory/migrations/206-memory-graph-node-edits.ts +19 -0
  408. package/src/memory/migrations/206-scrub-corrupted-image-attachments.ts +131 -0
  409. package/src/memory/migrations/207-conversation-graph-memory-state.ts +20 -0
  410. package/src/memory/migrations/208-conversations-last-message-at.ts +35 -0
  411. package/src/memory/migrations/209-strip-thinking-from-consolidated.ts +85 -0
  412. package/src/memory/migrations/210-schedule-reuse-conversation.ts +13 -0
  413. package/src/memory/migrations/211-memory-recall-logs-query-context.ts +21 -0
  414. package/src/memory/migrations/212-llm-request-logs-created-at-index.ts +19 -0
  415. package/src/memory/migrations/index.ts +12 -0
  416. package/src/memory/migrations/registry.ts +16 -0
  417. package/src/memory/qdrant-client.ts +44 -17
  418. package/src/memory/schema/conversations.ts +14 -0
  419. package/src/memory/schema/index.ts +1 -0
  420. package/src/memory/schema/infrastructure.ts +8 -1
  421. package/src/memory/schema/memory-core.ts +0 -51
  422. package/src/memory/schema/memory-graph.ts +154 -0
  423. package/src/memory/search/semantic.ts +47 -91
  424. package/src/memory/task-memory-cleanup.ts +58 -61
  425. package/src/messaging/providers/outlook/adapter.ts +8 -1
  426. package/src/messaging/providers/outlook/client.ts +299 -0
  427. package/src/messaging/providers/outlook/types.ts +118 -0
  428. package/src/notifications/adapters/macos.ts +1 -0
  429. package/src/notifications/copy-composer.ts +95 -0
  430. package/src/notifications/decision-engine.ts +35 -0
  431. package/src/notifications/signal.ts +16 -0
  432. package/src/oauth/seed-providers.ts +2 -1
  433. package/src/permissions/checker.ts +36 -4
  434. package/src/permissions/defaults.ts +4 -4
  435. package/src/permissions/permission-mode-store.ts +180 -0
  436. package/src/permissions/permission-mode.ts +31 -0
  437. package/src/permissions/workspace-policy.ts +10 -1
  438. package/src/playbooks/playbook-compiler.ts +19 -18
  439. package/src/playbooks/types.ts +4 -3
  440. package/src/prompts/system-prompt.ts +62 -36
  441. package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +100 -0
  442. package/src/prompts/templates/BOOTSTRAP.md +70 -165
  443. package/src/prompts/templates/HEARTBEAT.md +3 -1
  444. package/src/prompts/templates/SOUL.md +25 -4
  445. package/src/prompts/templates/UPDATES.md +8 -0
  446. package/src/providers/anthropic/client.ts +136 -220
  447. package/src/providers/gemini/client.ts +1 -1
  448. package/src/providers/openai/client.ts +1 -1
  449. package/src/providers/registry.ts +1 -1
  450. package/src/providers/retry.ts +19 -3
  451. package/src/runtime/actor-trust-resolver.ts +5 -1
  452. package/src/runtime/auth/route-policy.ts +30 -0
  453. package/src/runtime/guardian-reply-router.ts +5 -1
  454. package/src/runtime/http-server.ts +55 -5
  455. package/src/runtime/http-types.ts +12 -1
  456. package/src/runtime/middleware/auth.ts +20 -0
  457. package/src/runtime/migrations/vbundle-builder.ts +389 -3
  458. package/src/runtime/migrations/vbundle-importer.ts +8 -6
  459. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +378 -0
  460. package/src/runtime/routes/app-management-routes.ts +1 -11
  461. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +26 -0
  462. package/src/runtime/routes/archive-utils.ts +29 -0
  463. package/src/runtime/routes/attachment-routes.test.ts +106 -0
  464. package/src/runtime/routes/attachment-routes.ts +106 -16
  465. package/src/runtime/routes/avatar-routes.ts +2 -9
  466. package/src/runtime/routes/brain-graph-routes.ts +21 -22
  467. package/src/runtime/routes/btw-routes.ts +22 -1
  468. package/src/runtime/routes/conversation-analysis-routes.ts +173 -0
  469. package/src/runtime/routes/conversation-management-routes.ts +3 -14
  470. package/src/runtime/routes/conversation-query-routes.ts +49 -3
  471. package/src/runtime/routes/conversation-routes.ts +264 -44
  472. package/src/runtime/routes/conversation-starter-routes.ts +2 -2
  473. package/src/runtime/routes/debug-routes.ts +1 -1
  474. package/src/runtime/routes/global-search-routes.ts +21 -19
  475. package/src/runtime/routes/group-routes.ts +207 -0
  476. package/src/runtime/routes/guardian-action-routes.ts +21 -10
  477. package/src/runtime/routes/guardian-bootstrap-routes.ts +23 -19
  478. package/src/runtime/routes/heartbeat-routes.ts +4 -10
  479. package/src/runtime/routes/identity-routes.ts +53 -18
  480. package/src/runtime/routes/inbound-message-handler.ts +19 -0
  481. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +292 -0
  482. package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +207 -0
  483. package/src/runtime/routes/llm-context-normalization.ts +14 -10
  484. package/src/runtime/routes/log-export-routes.ts +23 -275
  485. package/src/runtime/routes/memory-item-routes.test.ts +170 -247
  486. package/src/runtime/routes/memory-item-routes.ts +341 -388
  487. package/src/runtime/routes/migration-routes.ts +18 -7
  488. package/src/runtime/routes/profiler-routes.ts +350 -0
  489. package/src/runtime/routes/schedule-routes.ts +28 -11
  490. package/src/runtime/routes/settings-routes.ts +95 -8
  491. package/src/runtime/routes/skills-routes.ts +103 -37
  492. package/src/runtime/routes/subagents-routes.ts +28 -7
  493. package/src/runtime/routes/user-route-dispatcher.ts +223 -0
  494. package/src/runtime/routes/user-routes.ts +41 -0
  495. package/src/runtime/routes/work-items-routes.test.ts +2 -6
  496. package/src/runtime/routes/workspace-routes.ts +0 -1
  497. package/src/schedule/schedule-store.ts +30 -0
  498. package/src/schedule/scheduler.ts +52 -18
  499. package/src/security/oauth2.ts +1 -1
  500. package/src/security/secure-keys.ts +4 -8
  501. package/src/shared/provider-env-vars.ts +19 -0
  502. package/src/skills/catalog-cache.ts +5 -0
  503. package/src/skills/catalog-install.ts +25 -16
  504. package/src/skills/clawhub.ts +134 -154
  505. package/src/skills/install-meta.ts +208 -0
  506. package/src/skills/managed-store.ts +29 -18
  507. package/src/skills/skill-memory.ts +12 -229
  508. package/src/skills/skillssh-registry.ts +19 -17
  509. package/src/subagent/index.ts +13 -3
  510. package/src/subagent/manager.ts +308 -29
  511. package/src/subagent/types.ts +68 -0
  512. package/src/tasks/task-runner.ts +7 -5
  513. package/src/telemetry/usage-telemetry-reporter.test.ts +3 -5
  514. package/src/tools/apps/executors.ts +29 -4
  515. package/src/tools/browser/runtime-check.ts +3 -1
  516. package/src/tools/filesystem/list.ts +93 -0
  517. package/src/tools/memory/register.ts +63 -46
  518. package/src/tools/permission-checker.ts +85 -1
  519. package/src/tools/registry.ts +4 -0
  520. package/src/tools/schedule/create.ts +3 -0
  521. package/src/tools/schedule/list.ts +1 -0
  522. package/src/tools/schedule/update.ts +6 -0
  523. package/src/tools/shared/filesystem/errors.ts +5 -0
  524. package/src/tools/shared/filesystem/file-ops-service.ts +90 -2
  525. package/src/tools/shared/filesystem/image-read.ts +22 -85
  526. package/src/tools/shared/filesystem/types.ts +17 -0
  527. package/src/tools/shared/shell-output.ts +31 -2
  528. package/src/tools/subagent/abort.ts +12 -2
  529. package/src/tools/subagent/message.ts +9 -2
  530. package/src/tools/subagent/notify-parent.ts +79 -0
  531. package/src/tools/subagent/read.ts +29 -8
  532. package/src/tools/subagent/resolve.ts +21 -0
  533. package/src/tools/subagent/spawn.ts +2 -0
  534. package/src/tools/subagent/status.ts +11 -1
  535. package/src/tools/system/avatar-generator.ts +3 -3
  536. package/src/tools/system/register.ts +23 -0
  537. package/src/tools/system/set-permission-mode.ts +103 -0
  538. package/src/tools/terminal/parser.ts +30 -5
  539. package/src/tools/terminal/safe-env.ts +17 -1
  540. package/src/tools/tool-manifest.ts +9 -3
  541. package/src/tools/types.ts +2 -0
  542. package/src/util/browser.ts +25 -10
  543. package/src/util/bun-runtime.ts +172 -0
  544. package/src/util/logger.ts +1 -1
  545. package/src/util/platform.ts +50 -17
  546. package/src/watcher/providers/outlook-calendar.ts +343 -0
  547. package/src/watcher/providers/outlook.ts +198 -0
  548. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +2 -2
  549. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +2 -2
  550. package/src/workspace/migrations/025-remove-oauth-app-setup-skills.ts +76 -0
  551. package/src/workspace/migrations/026-backfill-install-meta.ts +325 -0
  552. package/src/workspace/migrations/027-remove-orphaned-optimized-images-cache.ts +42 -0
  553. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +270 -0
  554. package/src/workspace/migrations/029-seed-pkb.ts +84 -0
  555. package/src/workspace/migrations/registry.ts +10 -0
  556. package/src/workspace/top-level-renderer.ts +5 -9
  557. package/src/__tests__/cli-memory.test.ts +0 -372
  558. package/src/__tests__/clipboard.test.ts +0 -88
  559. package/src/__tests__/context-memory-e2e.test.ts +0 -415
  560. package/src/__tests__/journal-context.test.ts +0 -268
  561. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -297
  562. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -459
  563. package/src/__tests__/memory-query-builder.test.ts +0 -59
  564. package/src/__tests__/memory-recall-quality.test.ts +0 -1046
  565. package/src/__tests__/memory-regressions.experimental.test.ts +0 -629
  566. package/src/__tests__/memory-regressions.test.ts +0 -3696
  567. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -295
  568. package/src/cli/cli-memory.ts +0 -176
  569. package/src/daemon/conversation-memory.ts +0 -207
  570. package/src/memory/conversation-starters-cadence.ts +0 -74
  571. package/src/memory/items-extractor.ts +0 -860
  572. package/src/memory/job-handlers/batch-extraction.ts +0 -753
  573. package/src/memory/job-handlers/extraction.ts +0 -40
  574. package/src/memory/job-handlers/journal-carry-forward.test.ts +0 -355
  575. package/src/memory/job-handlers/journal-carry-forward.ts +0 -255
  576. package/src/memory/journal-memory.ts +0 -224
  577. package/src/memory/query-builder.ts +0 -47
  578. package/src/memory/query-expansion.ts +0 -83
  579. package/src/memory/retriever.test.ts +0 -1592
  580. package/src/memory/retriever.ts +0 -1331
  581. package/src/memory/search/formatting.test.ts +0 -140
  582. package/src/memory/search/formatting.ts +0 -262
  583. package/src/memory/search/mmr.ts +0 -139
  584. package/src/memory/search/ranking.ts +0 -15
  585. package/src/memory/search/staleness.ts +0 -40
  586. package/src/memory/search/tier-classifier.ts +0 -18
  587. package/src/memory/search/types.ts +0 -121
  588. package/src/prompts/journal-context.ts +0 -154
  589. package/src/tools/memory/definitions.ts +0 -69
  590. package/src/tools/memory/handlers.test.ts +0 -562
  591. package/src/tools/memory/handlers.ts +0 -434
  592. package/src/util/clipboard.ts +0 -34
@@ -9,8 +9,10 @@ import {
9
9
  import { tmpdir } from "node:os";
10
10
  import { dirname, join } from "node:path";
11
11
 
12
+ import { getLogger } from "../util/logger.js";
12
13
  import { ensureDataDir, getDbPath } from "../util/platform.js";
13
14
  import { getDb, getSqlite } from "./db-connection.js";
15
+ import { migrateToolCreatedItems } from "./graph/bootstrap.js";
14
16
  import {
15
17
  addCoreColumns,
16
18
  createActorRefreshTokenRecordsTable,
@@ -56,7 +58,11 @@ import {
56
58
  migrateContactsRolePrincipal,
57
59
  migrateContactsUserFileColumn,
58
60
  migrateConversationForkLineage,
61
+ migrateConversationsLastMessageAt,
59
62
  migrateConversationsThreadTypeIndex,
63
+ migrateCreateConversationGraphMemoryState,
64
+ migrateCreateMemoryGraphNodeEdits,
65
+ migrateCreateMemoryGraphTables,
60
66
  migrateCreateMemoryRecallLogs,
61
67
  migrateCreateThreadStartersTable,
62
68
  migrateCreateTraceEventsTable,
@@ -69,6 +75,7 @@ import {
69
75
  migrateDropEntityTables,
70
76
  migrateDropLegacyMemberGuardianTables,
71
77
  migrateDropLoopbackPortColumn,
78
+ migrateDropMemoryItemsTables,
72
79
  migrateDropMemorySegmentFts,
73
80
  migrateDropOrphanedMediaTables,
74
81
  migrateDropRemindersTable,
@@ -91,7 +98,10 @@ import {
91
98
  migrateInviteContactId,
92
99
  migrateLlmRequestLogMessageId,
93
100
  migrateLlmRequestLogProvider,
101
+ migrateLlmRequestLogsCreatedAtIndex,
102
+ migrateMemoryGraphImageRefs,
94
103
  migrateMemoryItemSupersession,
104
+ migrateMemoryRecallLogsQueryContext,
95
105
  migrateMessagesConversationCreatedAtIndex,
96
106
  migrateMessagesFtsBackfill,
97
107
  migrateNormalizePhoneIdentities,
@@ -111,6 +121,7 @@ import {
111
121
  migrateRenameGmailProviderKeyToGoogle,
112
122
  migrateRenameGuardianVerificationValues,
113
123
  migrateRenameInboxThreadStateTable,
124
+ migrateRenameMemoryGraphTypeValues,
114
125
  migrateRenameNotificationThreadColumns,
115
126
  migrateRenameSequenceEnrollmentsThreadIdColumn,
116
127
  migrateRenameSequenceStepsReplyKey,
@@ -122,8 +133,11 @@ import {
122
133
  migrateRenameVoiceToPhone,
123
134
  migrateScheduleOneShotRouting,
124
135
  migrateScheduleQuietFlag,
136
+ migrateScheduleReuseConversation,
125
137
  migrateSchemaIndexesAndColumns,
138
+ migrateScrubCorruptedImageAttachments,
126
139
  migrateStripIntegrationPrefixFromProviderKeys,
140
+ migrateStripThinkingFromConsolidated,
127
141
  migrateUsageDashboardIndexes,
128
142
  migrateUsageLlmCallCount,
129
143
  migrateVoiceInviteColumns,
@@ -139,8 +153,8 @@ import {
139
153
  // ---------------------------------------------------------------------------
140
154
 
141
155
  function getTemplateDbPath(): string {
142
- // Hash this file + all migration files so the template auto-invalidates
143
- // when any migration changes.
156
+ // Hash this file + all migration files + bootstrap migration so the template
157
+ // auto-invalidates when any migration changes.
144
158
  const thisFile = new URL(import.meta.url).pathname;
145
159
  const hash = createHash("md5");
146
160
  hash.update(readFileSync(thisFile, "utf-8"));
@@ -150,6 +164,12 @@ function getTemplateDbPath(): string {
150
164
  hash.update(readFileSync(join(migrationsDir, name), "utf-8"));
151
165
  }
152
166
  }
167
+ // Include the bootstrap migration (migrateToolCreatedItems) which also runs
168
+ // during initializeDb but lives outside the migrations/ directory.
169
+ const bootstrapFile = join(dirname(thisFile), "graph", "bootstrap.ts");
170
+ if (existsSync(bootstrapFile)) {
171
+ hash.update(readFileSync(bootstrapFile, "utf-8"));
172
+ }
153
173
  return join(
154
174
  tmpdir(),
155
175
  `vellum-test-db-template-${hash.digest("hex").slice(0, 12)}.db`,
@@ -187,369 +207,182 @@ export function initializeDb(): void {
187
207
  return;
188
208
  }
189
209
 
210
+ const log = getLogger("db-init");
190
211
  const database = getDb();
191
212
 
192
- // 1. Create core tables (conversations, messages, memory, etc.)
193
- createCoreTables(database);
194
-
195
- // 1b. Clear any stalled 'started' checkpoints left by previous crashes
196
- // so the affected migrations can re-run from scratch.
197
- recoverCrashedMigrations(database);
198
-
199
- // 2. Create watchers, logs, entities, FTS, and conversation keys
200
- createWatchersAndLogsTables(database);
201
-
202
- // 3. ALTER TABLE ADD COLUMN migrations for core tables
203
- addCoreColumns(database);
204
-
205
- // 4. Complex multi-step migrations (dedup, FK fixes, assistant_id normalization)
206
- runComplexMigrations(database);
207
-
208
- // 5. Indexes for core tables + attachment dedup
209
- createCoreIndexes(database);
210
-
211
- // 6. Contacts and triage
212
- createContactsAndTriageTables(database);
213
-
214
- // 7. Call sessions (outgoing AI phone calls)
215
- createCallSessionsTables(database);
216
-
217
- // 7b. Call session mode/metadata for deterministic flow selection
218
- migrateCallSessionMode(database);
219
-
220
- // 8. Follow-ups
221
- createFollowupsTables(database);
222
-
223
- // 9. Tasks and work items
224
- createTasksAndWorkItemsTables(database);
225
-
226
- // 10. External conversation bindings
227
- createExternalConversationBindingsTables(database);
228
-
229
- // 11. Channel guardian
230
- createChannelGuardianTables(database);
231
-
232
- // 11b. Guardian verification session columns (outbound identity binding)
233
- migrateGuardianVerificationSessions(database);
234
-
235
- // 11c. Guardian bootstrap token hash column (Telegram deep-link flow)
236
- migrateGuardianBootstrapToken(database);
237
-
238
- // 11d. Guardian verification purpose discriminator (guardian vs trusted_contact)
239
- migrateGuardianVerificationPurpose(database);
240
-
241
- // 12. Media assets
242
- createMediaAssetsTables(database);
243
-
244
- // 13. Assistant inbox
245
- createAssistantInboxTables(database);
246
-
247
- // 14. Late-stage migrations (guardian actions, FTS backfill, index migrations)
248
- runLateMigrations(database);
249
-
250
- // 14b. Track per-segment delivery progress for split channel replies
251
- migrateChannelInboundDeliveredSegments(database);
252
-
253
- // 14c. Guardian action follow-up lifecycle columns (timeout reason, late answers)
254
- migrateGuardianActionFollowup(database);
255
-
256
- // 14c2. Guardian action tool-approval metadata columns (tool_name, input_digest)
257
- migrateGuardianActionToolMetadata(database);
258
-
259
- // 14c3. Guardian action supersession metadata (superseded_by_request_id, superseded_at) + session lookup index
260
- migrateGuardianActionSupersession(database);
261
-
262
- // 14d. Index on conversations.conversation_type for frequent WHERE filters
263
- migrateConversationsThreadTypeIndex(database);
264
-
265
- // 14e. Index on guardian_action_deliveries.destination_conversation_id for conversation-based lookups
266
- migrateGuardianDeliveryConversationIndex(database);
267
-
268
- // 15. Notification system
269
- createNotificationTables(database);
270
-
271
- // 16. Sequences (multi-step outreach)
272
- createSequenceTables(database);
273
-
274
- // 17. Messages FTS (full-text search over message content)
275
- createMessagesFts(database);
276
- migrateMessagesFtsBackfill(database);
277
-
278
- // 18. Conversation attention (seen-state tracking)
279
- createConversationAttentionTables(database);
280
-
281
- // 19. Reminder routing metadata (routing_intent + routing_hints_json columns)
282
- migrateReminderRoutingIntent(database);
283
-
284
- // 20. Schema indexes, columns, and constraints
285
- migrateSchemaIndexesAndColumns(database);
286
-
287
- // 21. Rebuild tables to add ON DELETE CASCADE to FK constraints
288
- migrateFkCascadeRebuilds(database);
289
-
290
- // 22. Scoped approval grants (channel-agnostic one-time-use grants)
291
- createScopedApprovalGrantsTable(database);
292
-
293
- // 23. Conversation decision audit columns on notification_deliveries
294
- migrateNotificationDeliveryThreadDecision(database);
295
-
296
- // 24. Canonical guardian requests and deliveries (unified cross-source guardian domain)
297
- createCanonicalGuardianTables(database);
298
-
299
- // 24b. Add requester_chat_id to canonical_guardian_requests (chat ID != user ID on some channels)
300
- migrateCanonicalGuardianRequesterChatId(database);
301
-
302
- // 24c. Composite index on canonical_guardian_deliveries(destination_channel, destination_chat_id) for chat-based lookups
303
- migrateCanonicalGuardianDeliveriesDestinationIndex(database);
304
-
305
- // 25. Normalize phone-like identity fields to E.164 across guardian and ingress tables
306
- migrateNormalizePhoneIdentities(database);
307
-
308
- // 26. Voice invite columns on assistant_ingress_invites
309
- migrateVoiceInviteColumns(database);
310
-
311
- // 27. Voice invite display metadata (friend_name, guardian_name) for personalized prompts
312
- migrateVoiceInviteDisplayMetadata(database);
313
-
314
- // 27b. 6-digit invite code hash column for non-voice channel invite redemption
315
- migrateInviteCodeHashColumn(database);
316
-
317
- // 28. Actor token records (hash-only actor token persistence)
318
- createActorTokenRecordsTable(database);
319
-
320
- // 28b. Actor refresh token records (rotating refresh tokens with family tracking)
321
- createActorRefreshTokenRecordsTable(database);
322
-
323
- // 29. Guardian principal ID columns on channel_guardian_bindings and canonical_guardian_requests
324
- migrateGuardianPrincipalIdColumns(database);
325
-
326
- // 30. Backfill guardianPrincipalId for existing bindings and requests, expire unresolvable pending requests
327
- migrateBackfillGuardianPrincipalId(database);
328
-
329
- // 31. Enforce NOT NULL on channel_guardian_bindings.guardian_principal_id
330
- migrateGuardianPrincipalIdNotNull(database);
331
-
332
- // 32. Add role and principal_id columns to contacts table
333
- migrateContactsRolePrincipal(database);
334
-
335
- // 33. Add verification and access-control columns to contact_channels
336
- migrateContactChannelsAccessFields(database);
337
-
338
- // 34. Composite index on (type, external_chat_id) for contact channel lookups
339
- migrateContactChannelsTypeChatIdIndex(database);
340
-
341
- // 35. Safety-sync remaining legacy data then drop assistant_ingress_members and channel_guardian_bindings
342
- migrateDropLegacyMemberGuardianTables(database);
343
-
344
- // 36. Add assistant_id to contacts for per-assistant guardian scoping
345
- migrateContactsAssistantId(database);
346
-
347
- // 37. Add contact_type to contacts and assistant_contact_metadata table
348
- migrateAssistantContactMetadata(database);
349
-
350
- // 38. Consolidate contact metadata columns into single notes field
351
- migrateContactsNotesColumn(database);
352
-
353
- // 39. Backfill contact interaction stats from channel lastSeenAt
354
- migrateBackfillContactInteractionStats(database);
355
-
356
- // 40. Drop assistant_id columns from all 16 daemon tables
357
- migrateDropAssistantIdColumns(database);
358
-
359
- // 41. Indexes on llm_usage_events for usage dashboard time-range and breakdown queries
360
- migrateUsageDashboardIndexes(database);
361
-
362
- // 42. (skipped) migrateReorderUsageDashboardIndexes — superseded by 43 which drops
363
- // all composite indexes that 42 would create, so running it is wasted work.
364
-
365
- // 43. Drop all composite usage indexes — they don't eliminate temp B-trees for GROUP BY
366
- migrateDropUsageCompositeIndexes(database);
367
-
368
- // 44. Backfill historical Anthropic usage rows from request-log truth before dashboard reads
369
- migrateBackfillUsageCacheAccounting(database);
370
-
371
- // 45. Rename channel_guardian_verification_challenges → channel_verification_sessions
372
- migrateRenameVerificationTable(database);
373
-
374
- // 46. Rename guardian_verification_session_id → verification_session_id in call_sessions
375
- migrateRenameVerificationSessionIdColumn(database);
376
-
377
- // 47. Rename persisted guardian_verification call_mode and event_type values
378
- migrateRenameGuardianVerificationValues(database);
379
-
380
- // 48. Rename stored "voice" channel values to "phone" across all channel text columns
381
- migrateRenameVoiceToPhone(database);
382
-
383
- // 49. Drop the unused legacy accounts table after removing account_manage
384
- migrateDropAccountsTable(database);
385
-
386
- // 50. Extend cron_jobs table with one-shot and routing support
387
- migrateScheduleOneShotRouting(database);
388
-
389
- // 51. Migrate existing reminders into cron_jobs as one-shot schedules
390
- migrateRemindersToSchedules(database);
391
-
392
- // 52. Drop the legacy reminders table after data migration
393
- migrateDropRemindersTable(database);
394
-
395
- // 53. OAuth provider/app/connection tables
396
- createOAuthTables(database);
397
-
398
- // 54. Add explicit client_secret_credential_path to oauth_apps
399
- migrateOAuthAppsClientSecretPath(database);
400
-
401
- // 55. Add ping_url column to oauth_providers
402
- migrateOAuthProvidersPingUrl(database);
403
-
404
- // 56. Add supersession tracking columns and override confidence to memory_items
405
- migrateMemoryItemSupersession(database);
406
-
407
- // 56b. Drop unused entity tables (entity search replaced by hybrid search on item statements)
408
- migrateDropEntityTables(database);
409
-
410
- // 57. Drop memory_segment_fts virtual table and triggers (replaced by Qdrant hybrid search)
411
- migrateDropMemorySegmentFts(database);
412
-
413
- // 58. Drop memory_item_conflicts table (conflict resolution system removed)
414
- migrateDropConflicts(database);
415
-
416
- // 59. Add invite metadata columns to call_sessions for outbound invite call routing
417
- migrateCallSessionInviteMetadata(database);
418
-
419
- // 60. Add required contact_id to assistant_ingress_invites and clean up legacy rows
420
- migrateInviteContactId(database);
421
-
422
- // 61. Add interaction_count and last_interaction columns to contact_channels
423
- migrateChannelInteractionColumns(database);
424
-
425
- // 62. Drop interaction_count and last_interaction columns from contacts (now derived from channels)
426
- migrateDropContactInteractionColumns(database);
427
-
428
- // 63. Drop loopback_port column from oauth_providers (moved to code-side behavior registry)
429
- migrateDropLoopbackPortColumn(database);
430
-
431
- // 64. Drop orphaned media tables (CREATE TABLE removed in #16739, clean up existing databases)
432
- migrateDropOrphanedMediaTables(database);
433
-
434
- // 65. Convert guardian timestamps from ISO 8601 text to epoch ms integers
435
- migrateGuardianTimestampsEpochMs(database);
436
-
437
- // 66. Rename assistant_inbox_thread_state → assistant_inbox_conversation_state
438
- migrateRenameInboxThreadStateTable(database);
439
-
440
- // 67. Rename thread_type → conversation_type in conversations table
441
- migrateRenameConversationTypeColumn(database);
442
-
443
- // 68. Rename notification_deliveries thread columns → conversation columns
444
- migrateRenameNotificationThreadColumns(database);
445
-
446
- // 69. Rename followups.thread_id → conversation_id
447
- migrateRenameFollowupsThreadIdColumn(database);
448
-
449
- // 70. Rename sequence_enrollments.thread_id → conversation_id
450
- migrateRenameSequenceEnrollmentsThreadIdColumn(database);
451
-
452
- // 71. Rename replyToThread → replyInSameConversation in sequence steps JSON blobs
453
- migrateRenameSequenceStepsReplyKey(database);
454
-
455
- // 72. Rename integration:gmail → integration:google across OAuth tables
456
- migrateRenameGmailProviderKeyToGoogle(database);
457
-
458
- // 73. Create thread_starters table for personalized empty-thread suggestions (renamed in migration 77)
459
- migrateCreateThreadStartersTable(database);
460
-
461
- // 74. Add capability card columns to thread_starters + category relevance table
462
- migrateCapabilityCardColumns(database);
463
-
464
- // 75. Rename created_by_session_id → source_conversation_id in verification sessions and invites
465
- migrateRenameCreatedBySessionIdColumns(database);
466
-
467
- // 76. Rename source_session_id → source_context_id in notification_events
468
- migrateRenameSourceSessionIdColumn(database);
469
-
470
- // 77. Rename thread_starters → conversation_starters table and indexes
471
- migrateRenameThreadStartersTable(database);
472
-
473
- // 77b. Rename checkpoint keys from thread_starters: → conversation_starters: prefix
474
- migrateRenameThreadStartersCheckpoints(database);
475
-
476
- // 78. Lifecycle events table for app_open / hatch telemetry
477
- createLifecycleEventsTable(database);
478
-
479
- // 79. Remove deleted capability-card state while keeping conversation starter chips
480
- migrateDropCapabilityCardState(database);
481
-
482
- // 80. Trace events table for persistent trace/activity storage across sessions
483
- migrateCreateTraceEventsTable(database);
484
-
485
- // 81. Add managed_service_config_key column to oauth_providers
486
- migrateOAuthProvidersManagedServiceConfigKey(database);
487
-
488
- // 81b. Add display metadata columns to oauth_providers (display_name, description, dashboard_url, etc.)
489
- migrateOAuthProvidersDisplayMetadata(database);
490
-
491
- // 82. Add message_id column to llm_request_logs for per-message LLM context lookup
492
- migrateLlmRequestLogMessageId(database);
493
-
494
- // 82b. Add provider column to llm_request_logs for runtime provider lookup
495
- migrateLlmRequestLogProvider(database);
496
-
497
- // 83. Backfill existing inline (base64-in-DB) attachments to on-disk storage
498
- migrateBackfillInlineAttachmentsToDisk(database);
499
-
500
- // 84. Add nullable conversation fork lineage columns and parent lookup index
501
- migrateConversationForkLineage(database);
502
-
503
- // 85. Add quiet flag to schedule jobs
504
- migrateScheduleQuietFlag(database);
505
-
506
- // 86. Drop simplified-memory tables and reducer checkpoint columns
507
- migrateDropSimplifiedMemory(database);
508
-
509
- // 87. Add skip_disclosure column to call_sessions for per-call disclosure control
510
- migrateCallSessionSkipDisclosure(database);
511
-
512
- // 88. Backfill correct MIME types for audio attachments stored as application/octet-stream
513
- migrateBackfillAudioAttachmentMimeTypes(database);
514
-
515
- // 89. Add user_file column to contacts for per-user persona file mapping
516
- migrateContactsUserFileColumn(database);
517
-
518
- // 90. Add source_type and source_message_role columns to memory_items
519
- migrateAddSourceTypeColumns(database);
520
-
521
- // 91. Memory recall logs table for inspector memory tab
522
- migrateCreateMemoryRecallLogs(database);
523
-
524
- // 92. Add ping_method, ping_headers, ping_body columns to oauth_providers
525
- migrateOAuthProvidersPingConfig(database);
526
-
527
- // 93. Strip `integration:` prefix from provider_key across OAuth tables
528
- migrateStripIntegrationPrefixFromProviderKeys(database);
529
-
530
- // 94. Composite index on messages(conversation_id, created_at) for paginated history queries
531
- migrateMessagesConversationCreatedAtIndex(database);
532
-
533
- // 95. Add behavioral config columns to oauth_providers (loopback port, injection templates, setup metadata, identity verification)
534
- migrateOAuthProvidersBehaviorColumns(database);
535
-
536
- // 96. Drop the setup_skill_id column from oauth_providers (concept removed)
537
- migrateDropSetupSkillIdColumn(database);
538
-
539
- // 97. Add enrichment columns to canonical_guardian_requests for guardian approval UX
540
- migrateGuardianRequestEnrichmentColumns(database);
541
-
542
- // 98. Add llm_call_count column to llm_usage_events for accurate LLM call counting
543
- migrateUsageLlmCallCount(database);
544
-
545
- // 99. Add feature_flag column to oauth_providers for feature-flag gating
546
- migrateOAuthProvidersFeatureFlag(database);
213
+ // Every migration step, in execution order. Each function accepts a
214
+ // DrizzleDb and is identified by its .name.
215
+ const migrationSteps = [
216
+ createCoreTables,
217
+ recoverCrashedMigrations,
218
+ createWatchersAndLogsTables,
219
+ addCoreColumns,
220
+ runComplexMigrations,
221
+ createCoreIndexes,
222
+ createContactsAndTriageTables,
223
+ createCallSessionsTables,
224
+ migrateCallSessionMode,
225
+ createFollowupsTables,
226
+ createTasksAndWorkItemsTables,
227
+ createExternalConversationBindingsTables,
228
+ createChannelGuardianTables,
229
+ migrateGuardianVerificationSessions,
230
+ migrateGuardianBootstrapToken,
231
+ migrateGuardianVerificationPurpose,
232
+ createMediaAssetsTables,
233
+ createAssistantInboxTables,
234
+ runLateMigrations,
235
+ migrateChannelInboundDeliveredSegments,
236
+ migrateGuardianActionFollowup,
237
+ migrateGuardianActionToolMetadata,
238
+ migrateGuardianActionSupersession,
239
+ migrateConversationsThreadTypeIndex,
240
+ migrateGuardianDeliveryConversationIndex,
241
+ createNotificationTables,
242
+ createSequenceTables,
243
+ createMessagesFts,
244
+ migrateMessagesFtsBackfill,
245
+ createConversationAttentionTables,
246
+ migrateReminderRoutingIntent,
247
+ migrateSchemaIndexesAndColumns,
248
+ migrateFkCascadeRebuilds,
249
+ createScopedApprovalGrantsTable,
250
+ migrateNotificationDeliveryThreadDecision,
251
+ createCanonicalGuardianTables,
252
+ migrateCanonicalGuardianRequesterChatId,
253
+ migrateCanonicalGuardianDeliveriesDestinationIndex,
254
+ migrateNormalizePhoneIdentities,
255
+ migrateVoiceInviteColumns,
256
+ migrateVoiceInviteDisplayMetadata,
257
+ migrateInviteCodeHashColumn,
258
+ createActorTokenRecordsTable,
259
+ createActorRefreshTokenRecordsTable,
260
+ migrateGuardianPrincipalIdColumns,
261
+ migrateBackfillGuardianPrincipalId,
262
+ migrateGuardianPrincipalIdNotNull,
263
+ migrateContactsRolePrincipal,
264
+ migrateContactChannelsAccessFields,
265
+ migrateContactChannelsTypeChatIdIndex,
266
+ migrateDropLegacyMemberGuardianTables,
267
+ migrateContactsAssistantId,
268
+ migrateAssistantContactMetadata,
269
+ migrateContactsNotesColumn,
270
+ migrateBackfillContactInteractionStats,
271
+ migrateDropAssistantIdColumns,
272
+ migrateUsageDashboardIndexes,
273
+ // 42. (skipped) migrateReorderUsageDashboardIndexes — superseded by 43
274
+ migrateDropUsageCompositeIndexes,
275
+ migrateBackfillUsageCacheAccounting,
276
+ migrateRenameVerificationTable,
277
+ migrateRenameVerificationSessionIdColumn,
278
+ migrateRenameGuardianVerificationValues,
279
+ migrateRenameVoiceToPhone,
280
+ migrateDropAccountsTable,
281
+ migrateScheduleOneShotRouting,
282
+ migrateRemindersToSchedules,
283
+ migrateDropRemindersTable,
284
+ createOAuthTables,
285
+ migrateOAuthAppsClientSecretPath,
286
+ migrateOAuthProvidersPingUrl,
287
+ migrateMemoryItemSupersession,
288
+ migrateDropEntityTables,
289
+ migrateDropMemorySegmentFts,
290
+ migrateDropConflicts,
291
+ migrateCallSessionInviteMetadata,
292
+ migrateInviteContactId,
293
+ migrateChannelInteractionColumns,
294
+ migrateDropContactInteractionColumns,
295
+ migrateDropLoopbackPortColumn,
296
+ migrateDropOrphanedMediaTables,
297
+ migrateGuardianTimestampsEpochMs,
298
+ migrateRenameInboxThreadStateTable,
299
+ migrateRenameConversationTypeColumn,
300
+ migrateRenameNotificationThreadColumns,
301
+ migrateRenameFollowupsThreadIdColumn,
302
+ migrateRenameSequenceEnrollmentsThreadIdColumn,
303
+ migrateRenameSequenceStepsReplyKey,
304
+ migrateRenameGmailProviderKeyToGoogle,
305
+ migrateCreateThreadStartersTable,
306
+ migrateCapabilityCardColumns,
307
+ migrateRenameCreatedBySessionIdColumns,
308
+ migrateRenameSourceSessionIdColumn,
309
+ migrateRenameThreadStartersTable,
310
+ migrateRenameThreadStartersCheckpoints,
311
+ createLifecycleEventsTable,
312
+ migrateDropCapabilityCardState,
313
+ migrateCreateTraceEventsTable,
314
+ migrateOAuthProvidersManagedServiceConfigKey,
315
+ migrateOAuthProvidersDisplayMetadata,
316
+ migrateLlmRequestLogMessageId,
317
+ migrateLlmRequestLogProvider,
318
+ migrateBackfillInlineAttachmentsToDisk,
319
+ migrateConversationForkLineage,
320
+ migrateScheduleQuietFlag,
321
+ migrateDropSimplifiedMemory,
322
+ migrateCallSessionSkipDisclosure,
323
+ migrateBackfillAudioAttachmentMimeTypes,
324
+ migrateContactsUserFileColumn,
325
+ migrateAddSourceTypeColumns,
326
+ migrateCreateMemoryRecallLogs,
327
+ migrateOAuthProvidersPingConfig,
328
+ migrateStripIntegrationPrefixFromProviderKeys,
329
+ migrateMessagesConversationCreatedAtIndex,
330
+ migrateOAuthProvidersBehaviorColumns,
331
+ migrateDropSetupSkillIdColumn,
332
+ migrateGuardianRequestEnrichmentColumns,
333
+ migrateUsageLlmCallCount,
334
+ migrateOAuthProvidersFeatureFlag,
335
+ migrateDropCallbackTransportColumn,
336
+ migrateCreateMemoryGraphTables,
337
+ // 101a. Add nullable image_refs column — must run before migrateToolCreatedItems
338
+ // which inserts rows into memory_graph_nodes including the image_refs column.
339
+ migrateMemoryGraphImageRefs,
340
+ // 101b. Migrate tool-created items from legacy memory_items → graph nodes.
341
+ // Must run before migrateDropMemoryItemsTables so data is preserved.
342
+ function migrateToolCreatedItemsStep() {
343
+ migrateToolCreatedItems();
344
+ },
345
+ migrateDropMemoryItemsTables,
346
+ migrateRenameMemoryGraphTypeValues,
347
+ migrateCreateMemoryGraphNodeEdits,
348
+ migrateScrubCorruptedImageAttachments,
349
+ migrateCreateConversationGraphMemoryState,
350
+ migrateConversationsLastMessageAt,
351
+ migrateStripThinkingFromConsolidated,
352
+ migrateScheduleReuseConversation,
353
+ migrateMemoryRecallLogsQueryContext,
354
+ migrateLlmRequestLogsCreatedAtIndex,
355
+ ];
356
+
357
+ // Run each migration step, catching and logging individual failures so one
358
+ // broken migration doesn't prevent independent later ones from succeeding.
359
+ const failures: string[] = [];
360
+ for (const step of migrationSteps) {
361
+ try {
362
+ log.debug({ migration: step.name }, `Starting migration: ${step.name}`);
363
+ step(database);
364
+ log.debug({ migration: step.name }, `Migration succeeded: ${step.name}`);
365
+ } catch (err) {
366
+ failures.push(step.name);
367
+ log.error(
368
+ { err, migration: step.name },
369
+ `Migration failed: ${step.name}`,
370
+ );
371
+ }
372
+ }
547
373
 
548
- // 100. Drop the vestigial callback_transport column from oauth_providers
549
- // (transport is now chosen per-flow via the callbackTransport option, not per-provider)
550
- migrateDropCallbackTransportColumn(database);
374
+ if (failures.length > 0) {
375
+ log.error(
376
+ { failedMigrations: failures, count: failures.length },
377
+ `DB initialization completed with ${failures.length} failed migration(s)`,
378
+ );
379
+ }
551
380
 
552
- validateMigrationState(database);
381
+ try {
382
+ validateMigrationState(database);
383
+ } catch (err) {
384
+ log.error({ err }, "validateMigrationState failed");
385
+ }
553
386
 
554
387
  if (process.env.BUN_TEST === "1") {
555
388
  saveTemplate();