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