@vellumai/assistant 0.5.5 → 0.5.7

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 (382) hide show
  1. package/.env.example +16 -2
  2. package/ARCHITECTURE.md +6 -75
  3. package/Dockerfile +4 -5
  4. package/README.md +0 -2
  5. package/bun.lock +0 -414
  6. package/docs/architecture/keychain-broker.md +45 -240
  7. package/docs/architecture/security.md +0 -17
  8. package/docs/credential-execution-service.md +2 -2
  9. package/node_modules/@vellumai/ces-contracts/package.json +1 -0
  10. package/node_modules/@vellumai/ces-contracts/src/rpc.ts +119 -0
  11. package/node_modules/@vellumai/credential-storage/package.json +1 -0
  12. package/node_modules/@vellumai/egress-proxy/package.json +1 -0
  13. package/package.json +2 -3
  14. package/src/__tests__/actor-token-service.test.ts +1 -2
  15. package/src/__tests__/assistant-feature-flags-integration.test.ts +30 -29
  16. package/src/__tests__/browser-skill-endstate.test.ts +6 -5
  17. package/src/__tests__/btw-routes.test.ts +0 -39
  18. package/src/__tests__/call-domain.test.ts +0 -128
  19. package/src/__tests__/ces-rpc-credential-backend.test.ts +199 -0
  20. package/src/__tests__/channel-approval-routes.test.ts +0 -5
  21. package/src/__tests__/channel-readiness-service.test.ts +1 -60
  22. package/src/__tests__/checker.test.ts +4 -2
  23. package/src/__tests__/cli-command-risk-guard.test.ts +112 -0
  24. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  25. package/src/__tests__/config-schema.test.ts +3 -3
  26. package/src/__tests__/context-window-manager.test.ts +78 -0
  27. package/src/__tests__/conversation-attention-telegram.test.ts +0 -5
  28. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  29. package/src/__tests__/conversation-skill-tools.test.ts +0 -54
  30. package/src/__tests__/conversation-title-service.test.ts +117 -1
  31. package/src/__tests__/credential-execution-feature-gates.test.ts +28 -14
  32. package/src/__tests__/credential-execution-managed-contract.test.ts +33 -18
  33. package/src/__tests__/credential-security-e2e.test.ts +0 -66
  34. package/src/__tests__/credential-security-invariants.test.ts +4 -45
  35. package/src/__tests__/credentials-cli.test.ts +78 -0
  36. package/src/__tests__/db-migration-rollback.test.ts +2015 -1
  37. package/src/__tests__/docker-signing-key-bootstrap.test.ts +98 -0
  38. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +6 -4
  39. package/src/__tests__/guardian-routing-state.test.ts +0 -5
  40. package/src/__tests__/host-shell-tool.test.ts +6 -7
  41. package/src/__tests__/http-user-message-parity.test.ts +3 -103
  42. package/src/__tests__/inbound-invite-redemption.test.ts +0 -4
  43. package/src/__tests__/inline-skill-load-permissions.test.ts +6 -8
  44. package/src/__tests__/intent-routing.test.ts +0 -13
  45. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +178 -0
  46. package/src/__tests__/keychain-broker-client.test.ts +161 -22
  47. package/src/__tests__/memory-jobs-worker-backoff.test.ts +150 -0
  48. package/src/__tests__/memory-regressions.test.ts +8 -30
  49. package/src/__tests__/migration-export-http.test.ts +2 -2
  50. package/src/__tests__/migration-import-commit-http.test.ts +2 -2
  51. package/src/__tests__/migration-import-preflight-http.test.ts +2 -2
  52. package/src/__tests__/migration-validate-http.test.ts +2 -2
  53. package/src/__tests__/non-member-access-request.test.ts +0 -5
  54. package/src/__tests__/notification-decision-fallback.test.ts +4 -0
  55. package/src/__tests__/notification-decision-identity.test.ts +4 -0
  56. package/src/__tests__/permission-types.test.ts +1 -0
  57. package/src/__tests__/provider-managed-proxy-integration.test.ts +5 -6
  58. package/src/__tests__/qdrant-manager.test.ts +28 -2
  59. package/src/__tests__/registry.test.ts +0 -6
  60. package/src/__tests__/require-fresh-approval.test.ts +4 -0
  61. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -4
  62. package/src/__tests__/secret-routes-managed-proxy.test.ts +0 -4
  63. package/src/__tests__/secure-keys.test.ts +83 -263
  64. package/src/__tests__/shell-identity.test.ts +96 -6
  65. package/src/__tests__/skill-feature-flags-integration.test.ts +22 -14
  66. package/src/__tests__/skill-feature-flags.test.ts +46 -45
  67. package/src/__tests__/skill-load-feature-flag.test.ts +7 -10
  68. package/src/__tests__/skill-load-inline-command.test.ts +8 -12
  69. package/src/__tests__/skill-load-inline-includes.test.ts +6 -10
  70. package/src/__tests__/skill-load-tool.test.ts +0 -2
  71. package/src/__tests__/skill-projection-feature-flag.test.ts +33 -29
  72. package/src/__tests__/skills.test.ts +0 -2
  73. package/src/__tests__/slack-inbound-verification.test.ts +0 -4
  74. package/src/__tests__/suggestion-routes.test.ts +1 -32
  75. package/src/__tests__/system-prompt.test.ts +0 -1
  76. package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -0
  77. package/src/__tests__/tool-executor-shell-integration.test.ts +5 -3
  78. package/src/__tests__/tool-executor.test.ts +4 -0
  79. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -5
  80. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -4
  81. package/src/__tests__/update-bulletin.test.ts +0 -2
  82. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +6 -9
  83. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -6
  84. package/src/__tests__/workspace-migration-015-migrate-credentials-to-keychain.test.ts +252 -0
  85. package/src/__tests__/workspace-migration-016-migrate-credentials-from-keychain.test.ts +218 -0
  86. package/src/__tests__/workspace-migration-down-functions.test.ts +1009 -0
  87. package/src/__tests__/workspace-migrations-runner.test.ts +114 -0
  88. package/src/calls/audio-store.test.ts +97 -0
  89. package/src/calls/audio-store.ts +205 -0
  90. package/src/calls/call-controller.ts +85 -7
  91. package/src/calls/call-domain.ts +3 -0
  92. package/src/calls/call-store.ts +10 -3
  93. package/src/calls/fish-audio-client.ts +117 -0
  94. package/src/calls/relay-server.ts +27 -0
  95. package/src/calls/twilio-routes.ts +2 -1
  96. package/src/calls/types.ts +1 -0
  97. package/src/calls/voice-ingress-preflight.ts +0 -42
  98. package/src/calls/voice-quality.ts +26 -5
  99. package/src/calls/voice-session-bridge.ts +6 -12
  100. package/src/cli/commands/config.ts +1 -4
  101. package/src/cli/commands/conversations.ts +0 -18
  102. package/src/cli/commands/credentials.ts +34 -4
  103. package/src/cli/commands/oauth/index.ts +7 -0
  104. package/src/cli/commands/oauth/platform.ts +179 -0
  105. package/src/cli/commands/platform.ts +3 -3
  106. package/src/config/assistant-feature-flags.ts +186 -5
  107. package/src/config/bundled-skills/messaging/SKILL.md +5 -5
  108. package/src/config/bundled-skills/phone-calls/TOOLS.json +4 -0
  109. package/src/config/bundled-skills/settings/TOOLS.json +2 -2
  110. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +42 -0
  111. package/src/config/bundled-tool-registry.ts +1 -11
  112. package/src/config/env-registry.ts +1 -1
  113. package/src/config/env.ts +16 -16
  114. package/src/config/feature-flag-registry.json +48 -16
  115. package/src/config/loader.ts +98 -31
  116. package/src/config/schema.ts +4 -25
  117. package/src/config/schemas/calls.ts +13 -0
  118. package/src/config/schemas/fish-audio.ts +39 -0
  119. package/src/config/schemas/memory.ts +0 -4
  120. package/src/config/schemas/platform.ts +1 -1
  121. package/src/config/schemas/security.ts +4 -4
  122. package/src/config/types.ts +0 -1
  123. package/src/contacts/contact-store.ts +39 -0
  124. package/src/contacts/types.ts +2 -0
  125. package/src/context/window-manager.ts +53 -2
  126. package/src/credential-execution/approval-bridge.ts +1 -0
  127. package/src/credential-execution/executable-discovery.ts +28 -4
  128. package/src/credential-execution/feature-gates.ts +16 -0
  129. package/src/credential-execution/process-manager.ts +38 -0
  130. package/src/daemon/assistant-attachments.ts +9 -0
  131. package/src/daemon/config-watcher.ts +6 -4
  132. package/src/daemon/conversation-agent-loop.ts +0 -60
  133. package/src/daemon/conversation-memory.ts +0 -117
  134. package/src/daemon/conversation-runtime-assembly.ts +0 -2
  135. package/src/daemon/conversation-tool-setup.ts +0 -105
  136. package/src/daemon/conversation.ts +10 -1
  137. package/src/daemon/handlers/config-vercel.ts +92 -0
  138. package/src/daemon/handlers/conversations.ts +0 -11
  139. package/src/daemon/handlers/skills.ts +2 -15
  140. package/src/daemon/install-symlink.ts +195 -0
  141. package/src/daemon/lifecycle.ts +229 -96
  142. package/src/daemon/message-types/conversations.ts +3 -4
  143. package/src/daemon/message-types/diagnostics.ts +3 -22
  144. package/src/daemon/message-types/messages.ts +0 -2
  145. package/src/daemon/message-types/upgrades.ts +8 -0
  146. package/src/daemon/server.ts +30 -92
  147. package/src/events/domain-events.ts +2 -1
  148. package/src/followups/followup-store.ts +5 -2
  149. package/src/inbound/platform-callback-registration.ts +3 -3
  150. package/src/instrument.ts +8 -5
  151. package/src/memory/conversation-crud.ts +0 -236
  152. package/src/memory/conversation-title-service.ts +76 -11
  153. package/src/memory/db-init.ts +15 -11
  154. package/src/memory/indexer.ts +15 -106
  155. package/src/memory/items-extractor.ts +15 -1
  156. package/src/memory/job-handlers/conversation-starters.ts +4 -1
  157. package/src/memory/job-handlers/embedding.ts +0 -79
  158. package/src/memory/job-utils.ts +1 -1
  159. package/src/memory/jobs-store.ts +30 -13
  160. package/src/memory/jobs-worker.ts +31 -27
  161. package/src/memory/migrations/001-job-deferrals.ts +19 -0
  162. package/src/memory/migrations/004-entity-relation-dedup.ts +10 -0
  163. package/src/memory/migrations/005-fingerprint-scope-unique.ts +76 -0
  164. package/src/memory/migrations/006-scope-salted-fingerprints.ts +50 -0
  165. package/src/memory/migrations/007-assistant-id-to-self.ts +10 -0
  166. package/src/memory/migrations/008-remove-assistant-id-columns.ts +34 -0
  167. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +26 -0
  168. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +10 -0
  169. package/src/memory/migrations/015-drop-active-search-index.ts +17 -0
  170. package/src/memory/migrations/019-notification-tables-schema-migration.ts +12 -0
  171. package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +121 -0
  172. package/src/memory/migrations/024-embedding-vector-blob.ts +74 -0
  173. package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +82 -0
  174. package/src/memory/migrations/036-normalize-phone-identities.ts +11 -0
  175. package/src/memory/migrations/116-messages-fts.ts +106 -1
  176. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +52 -0
  177. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +77 -0
  178. package/src/memory/migrations/134-contacts-notes-column.ts +13 -0
  179. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +20 -0
  180. package/src/memory/migrations/136-drop-assistant-id-columns.ts +52 -0
  181. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +13 -0
  182. package/src/memory/migrations/141-rename-verification-table.ts +54 -0
  183. package/src/memory/migrations/142-rename-verification-session-id-column.ts +25 -0
  184. package/src/memory/migrations/143-rename-guardian-verification-values.ts +35 -0
  185. package/src/memory/migrations/144-rename-voice-to-phone.ts +136 -0
  186. package/src/memory/migrations/145-drop-accounts-table.ts +32 -0
  187. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +14 -1
  188. package/src/memory/migrations/148-drop-reminders-table.ts +35 -1
  189. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +69 -1
  190. package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +290 -0
  191. package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +51 -1
  192. package/src/memory/migrations/174-rename-thread-starters-table.ts +47 -1
  193. package/src/memory/migrations/176-drop-capability-card-state.ts +13 -0
  194. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +16 -0
  195. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +28 -1
  196. package/src/memory/migrations/189-drop-simplified-memory.ts +42 -0
  197. package/src/memory/migrations/190-call-session-skip-disclosure.ts +15 -0
  198. package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +64 -0
  199. package/src/memory/migrations/192-contacts-user-file-column.ts +15 -0
  200. package/src/memory/migrations/index.ts +5 -3
  201. package/src/memory/migrations/registry.ts +90 -0
  202. package/src/memory/migrations/validate-migration-state.ts +137 -11
  203. package/src/memory/qdrant-circuit-breaker.ts +9 -0
  204. package/src/memory/qdrant-client.ts +4 -6
  205. package/src/memory/qdrant-manager.ts +64 -7
  206. package/src/memory/schema/calls.ts +1 -0
  207. package/src/memory/schema/contacts.ts +1 -0
  208. package/src/memory/schema/conversations.ts +0 -3
  209. package/src/memory/schema/index.ts +0 -2
  210. package/src/messaging/draft-store.ts +2 -2
  211. package/src/notifications/decision-engine.ts +4 -1
  212. package/src/oauth/connection-resolver.ts +6 -4
  213. package/src/permissions/checker.ts +0 -38
  214. package/src/permissions/defaults.ts +3 -3
  215. package/src/permissions/shell-identity.ts +76 -22
  216. package/src/permissions/trust-client.ts +2 -13
  217. package/src/permissions/trust-store.ts +8 -3
  218. package/src/permissions/types.ts +4 -2
  219. package/src/platform/client.ts +35 -7
  220. package/src/prompts/persona-resolver.ts +138 -0
  221. package/src/prompts/system-prompt.ts +36 -4
  222. package/src/prompts/templates/users/default.md +1 -0
  223. package/src/providers/registry.ts +27 -40
  224. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  225. package/src/runtime/auth/__tests__/external-assistant-id.test.ts +13 -68
  226. package/src/runtime/auth/external-assistant-id.ts +13 -59
  227. package/src/runtime/auth/route-policy.ts +29 -1
  228. package/src/runtime/auth/token-service.ts +53 -15
  229. package/src/runtime/channel-readiness-service.ts +1 -16
  230. package/src/runtime/http-server.ts +29 -2
  231. package/src/runtime/middleware/error-handler.ts +1 -9
  232. package/src/runtime/routes/audio-routes.ts +40 -0
  233. package/src/runtime/routes/btw-routes.ts +0 -17
  234. package/src/runtime/routes/conversation-management-routes.ts +0 -36
  235. package/src/runtime/routes/conversation-query-routes.ts +106 -2
  236. package/src/runtime/routes/conversation-routes.ts +4 -43
  237. package/src/runtime/routes/diagnostics-routes.ts +1 -477
  238. package/src/runtime/routes/identity-routes.ts +18 -29
  239. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -33
  240. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
  241. package/src/runtime/routes/integrations/vercel.ts +89 -0
  242. package/src/runtime/routes/log-export-routes.ts +5 -0
  243. package/src/runtime/routes/memory-item-routes.test.ts +221 -3
  244. package/src/runtime/routes/memory-item-routes.ts +144 -4
  245. package/src/runtime/routes/migration-rollback-routes.ts +209 -0
  246. package/src/runtime/routes/migration-routes.ts +17 -1
  247. package/src/runtime/routes/notification-routes.ts +58 -0
  248. package/src/runtime/routes/schedule-routes.ts +65 -0
  249. package/src/runtime/routes/settings-routes.ts +41 -1
  250. package/src/runtime/routes/tts-routes.ts +86 -0
  251. package/src/runtime/routes/upgrade-broadcast-routes.ts +175 -0
  252. package/src/runtime/routes/workspace-commit-routes.ts +62 -0
  253. package/src/runtime/routes/workspace-routes.test.ts +22 -1
  254. package/src/runtime/routes/workspace-routes.ts +1 -1
  255. package/src/runtime/routes/workspace-utils.ts +86 -2
  256. package/src/schedule/schedule-store.ts +0 -21
  257. package/src/security/ces-credential-client.ts +59 -22
  258. package/src/security/ces-rpc-credential-backend.ts +85 -0
  259. package/src/security/credential-backend.ts +12 -88
  260. package/src/security/keychain-broker-client.ts +10 -2
  261. package/src/security/secure-keys.ts +94 -113
  262. package/src/skills/catalog-install.ts +13 -7
  263. package/src/skills/inline-command-render.ts +5 -1
  264. package/src/skills/inline-command-runner.ts +30 -2
  265. package/src/telemetry/usage-telemetry-reporter.ts +4 -2
  266. package/src/tools/calls/call-start.ts +1 -0
  267. package/src/tools/executor.ts +0 -4
  268. package/src/tools/memory/handlers.ts +1 -129
  269. package/src/tools/network/script-proxy/session-manager.ts +19 -4
  270. package/src/tools/network/web-fetch.ts +3 -1
  271. package/src/tools/permission-checker.ts +18 -0
  272. package/src/tools/skills/execute.ts +1 -1
  273. package/src/tools/skills/load.ts +9 -2
  274. package/src/tools/types.ts +0 -8
  275. package/src/util/errors.ts +0 -12
  276. package/src/util/platform.ts +8 -55
  277. package/src/util/xml.ts +8 -0
  278. package/src/workspace/git-service.ts +5 -2
  279. package/src/workspace/heartbeat-service.ts +5 -24
  280. package/src/workspace/migrations/001-avatar-rename.ts +15 -0
  281. package/src/workspace/migrations/003-seed-device-id.ts +17 -1
  282. package/src/workspace/migrations/004-extract-collect-usage-data.ts +33 -0
  283. package/src/workspace/migrations/005-add-send-diagnostics.ts +3 -0
  284. package/src/workspace/migrations/006-services-config.ts +49 -0
  285. package/src/workspace/migrations/007-web-search-provider-rename.ts +27 -0
  286. package/src/workspace/migrations/008-voice-timeout-and-max-steps.ts +3 -0
  287. package/src/workspace/migrations/009-backfill-conversation-disk-view.ts +4 -0
  288. package/src/workspace/migrations/010-app-dir-rename.ts +78 -0
  289. package/src/workspace/migrations/011-backfill-installation-id.ts +11 -0
  290. package/src/workspace/migrations/012-rename-conversation-disk-view-dirs.ts +44 -0
  291. package/src/workspace/migrations/013-repair-conversation-disk-view.ts +5 -0
  292. package/src/workspace/migrations/015-migrate-credentials-to-keychain.ts +153 -0
  293. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +156 -0
  294. package/src/workspace/migrations/016-migrate-credentials-from-keychain.ts +150 -0
  295. package/src/workspace/migrations/017-seed-persona-dirs.ts +95 -0
  296. package/src/workspace/migrations/migrate-to-workspace-volume.ts +23 -1
  297. package/src/workspace/migrations/registry.ts +8 -0
  298. package/src/workspace/migrations/runner.ts +106 -2
  299. package/src/workspace/migrations/types.ts +4 -0
  300. package/src/__tests__/archive-recall.test.ts +0 -560
  301. package/src/__tests__/claude-code-skill-regression.test.ts +0 -206
  302. package/src/__tests__/claude-code-tool-profiles.test.ts +0 -99
  303. package/src/__tests__/conversation-memory-dirty-tail.test.ts +0 -150
  304. package/src/__tests__/conversation-switch-memory-reduction.test.ts +0 -474
  305. package/src/__tests__/db-memory-archive-migration.test.ts +0 -372
  306. package/src/__tests__/db-memory-brief-state-migration.test.ts +0 -213
  307. package/src/__tests__/db-memory-reducer-checkpoints.test.ts +0 -273
  308. package/src/__tests__/diagnostics-export.test.ts +0 -288
  309. package/src/__tests__/local-gateway-health.test.ts +0 -209
  310. package/src/__tests__/memory-brief-open-loops.test.ts +0 -530
  311. package/src/__tests__/memory-brief-time.test.ts +0 -285
  312. package/src/__tests__/memory-brief-wrapper.test.ts +0 -311
  313. package/src/__tests__/memory-chunk-archive.test.ts +0 -400
  314. package/src/__tests__/memory-chunk-dual-write.test.ts +0 -453
  315. package/src/__tests__/memory-episode-archive.test.ts +0 -370
  316. package/src/__tests__/memory-episode-dual-write.test.ts +0 -626
  317. package/src/__tests__/memory-observation-archive.test.ts +0 -375
  318. package/src/__tests__/memory-observation-dual-write.test.ts +0 -318
  319. package/src/__tests__/memory-reducer-job.test.ts +0 -538
  320. package/src/__tests__/memory-reducer-scheduling.test.ts +0 -473
  321. package/src/__tests__/memory-reducer-store.test.ts +0 -728
  322. package/src/__tests__/memory-reducer-types.test.ts +0 -707
  323. package/src/__tests__/memory-reducer.test.ts +0 -704
  324. package/src/__tests__/memory-simplified-config.test.ts +0 -281
  325. package/src/__tests__/secret-ingress-handler.test.ts +0 -120
  326. package/src/__tests__/simplified-memory-e2e.test.ts +0 -666
  327. package/src/__tests__/simplified-memory-runtime.test.ts +0 -616
  328. package/src/__tests__/swarm-conversation-integration.test.ts +0 -358
  329. package/src/__tests__/swarm-dag-pathological.test.ts +0 -547
  330. package/src/__tests__/swarm-orchestrator.test.ts +0 -463
  331. package/src/__tests__/swarm-plan-validator.test.ts +0 -384
  332. package/src/__tests__/swarm-recursion.test.ts +0 -197
  333. package/src/__tests__/swarm-router-planner.test.ts +0 -234
  334. package/src/__tests__/swarm-tool.test.ts +0 -185
  335. package/src/__tests__/swarm-worker-backend.test.ts +0 -144
  336. package/src/__tests__/swarm-worker-runner.test.ts +0 -288
  337. package/src/commands/__tests__/cc-command-registry.test.ts +0 -396
  338. package/src/commands/cc-command-registry.ts +0 -248
  339. package/src/config/bundled-skills/claude-code/SKILL.md +0 -53
  340. package/src/config/bundled-skills/claude-code/TOOLS.json +0 -47
  341. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +0 -12
  342. package/src/config/bundled-skills/orchestration/SKILL.md +0 -33
  343. package/src/config/bundled-skills/orchestration/TOOLS.json +0 -35
  344. package/src/config/bundled-skills/orchestration/tools/swarm-delegate.ts +0 -12
  345. package/src/config/schemas/memory-simplified.ts +0 -101
  346. package/src/config/schemas/swarm.ts +0 -82
  347. package/src/logfire.ts +0 -135
  348. package/src/memory/archive-recall.ts +0 -516
  349. package/src/memory/archive-store.ts +0 -400
  350. package/src/memory/brief-formatting.ts +0 -33
  351. package/src/memory/brief-open-loops.ts +0 -266
  352. package/src/memory/brief-time.ts +0 -162
  353. package/src/memory/brief.ts +0 -75
  354. package/src/memory/job-handlers/backfill-simplified-memory.ts +0 -462
  355. package/src/memory/job-handlers/reduce-conversation-memory.ts +0 -229
  356. package/src/memory/migrations/185-memory-brief-state.ts +0 -52
  357. package/src/memory/migrations/186-memory-archive.ts +0 -109
  358. package/src/memory/migrations/187-memory-reducer-checkpoints.ts +0 -19
  359. package/src/memory/reducer-scheduler.ts +0 -242
  360. package/src/memory/reducer-store.ts +0 -271
  361. package/src/memory/reducer-types.ts +0 -106
  362. package/src/memory/reducer.ts +0 -467
  363. package/src/memory/schema/memory-archive.ts +0 -121
  364. package/src/memory/schema/memory-brief.ts +0 -55
  365. package/src/runtime/local-gateway-health.ts +0 -275
  366. package/src/security/secret-ingress.ts +0 -68
  367. package/src/swarm/backend-claude-code.ts +0 -225
  368. package/src/swarm/checkpoint.ts +0 -137
  369. package/src/swarm/graph-utils.ts +0 -53
  370. package/src/swarm/index.ts +0 -55
  371. package/src/swarm/limits.ts +0 -66
  372. package/src/swarm/orchestrator.ts +0 -424
  373. package/src/swarm/plan-validator.ts +0 -117
  374. package/src/swarm/router-planner.ts +0 -162
  375. package/src/swarm/router-prompts.ts +0 -39
  376. package/src/swarm/synthesizer.ts +0 -81
  377. package/src/swarm/types.ts +0 -72
  378. package/src/swarm/worker-backend.ts +0 -131
  379. package/src/swarm/worker-prompts.ts +0 -80
  380. package/src/swarm/worker-runner.ts +0 -170
  381. package/src/tools/claude-code/claude-code.ts +0 -610
  382. package/src/tools/swarm/delegate.ts +0 -205
@@ -0,0 +1,153 @@
1
+ import { getLogger } from "../../util/logger.js";
2
+ import type { WorkspaceMigration } from "./types.js";
3
+
4
+ const log = getLogger("workspace-migrations");
5
+
6
+ const BROKER_WAIT_INTERVAL_MS = 500;
7
+ const BROKER_WAIT_MAX_ATTEMPTS = 10; // 5 seconds total
8
+
9
+ export const migrateCredentialsToKeychainMigration: WorkspaceMigration = {
10
+ id: "015-migrate-credentials-to-keychain",
11
+ description:
12
+ "Copy encrypted store credentials to keychain for single-backend migration",
13
+
14
+ async down(_workspaceDir: string): Promise<void> {
15
+ // Reverse: copy credentials from keychain back to encrypted store.
16
+ // Mirrors the forward logic of 016-migrate-credentials-from-keychain.
17
+ if (
18
+ process.env.VELLUM_DESKTOP_APP !== "1" ||
19
+ process.env.VELLUM_DEV === "1"
20
+ ) {
21
+ return;
22
+ }
23
+
24
+ const { createBrokerClient } =
25
+ await import("../../security/keychain-broker-client.js");
26
+ const client = createBrokerClient();
27
+
28
+ let brokerAvailable = false;
29
+ for (let i = 0; i < BROKER_WAIT_MAX_ATTEMPTS; i++) {
30
+ if (client.isAvailable()) {
31
+ brokerAvailable = true;
32
+ break;
33
+ }
34
+ await new Promise((r) => setTimeout(r, BROKER_WAIT_INTERVAL_MS));
35
+ }
36
+
37
+ if (!brokerAvailable) {
38
+ throw new Error(
39
+ "Keychain broker not available after waiting — credential rollback " +
40
+ "will be retried on next startup",
41
+ );
42
+ }
43
+
44
+ const { setKey } = await import("../../security/encrypted-store.js");
45
+
46
+ const accounts = await client.list();
47
+ if (accounts.length === 0) return;
48
+
49
+ let rolledBackCount = 0;
50
+ let failedCount = 0;
51
+
52
+ for (const account of accounts) {
53
+ const result = await client.get(account);
54
+ if (!result || !result.found || result.value === undefined) {
55
+ log.warn(
56
+ { account },
57
+ "Failed to read key from keychain during rollback — skipping",
58
+ );
59
+ failedCount++;
60
+ continue;
61
+ }
62
+
63
+ const written = setKey(account, result.value);
64
+ if (written) {
65
+ await client.del(account);
66
+ rolledBackCount++;
67
+ } else {
68
+ log.warn(
69
+ { account },
70
+ "Failed to write key to encrypted store during rollback — skipping",
71
+ );
72
+ failedCount++;
73
+ }
74
+ }
75
+
76
+ log.info(
77
+ { rolledBackCount, failedCount },
78
+ "Credential rollback from keychain to encrypted store complete",
79
+ );
80
+ },
81
+
82
+ async run(_workspaceDir: string): Promise<void> {
83
+ // Only run on mac production builds (desktop app, non-dev).
84
+ if (
85
+ process.env.VELLUM_DESKTOP_APP !== "1" ||
86
+ process.env.VELLUM_DEV === "1"
87
+ ) {
88
+ return;
89
+ }
90
+
91
+ const { createBrokerClient } =
92
+ await import("../../security/keychain-broker-client.js");
93
+ const client = createBrokerClient();
94
+
95
+ // Wait for the broker to become available (up to 5 seconds), matching
96
+ // the retry strategy in secure-keys.ts waitForBrokerAvailability().
97
+ let brokerAvailable = false;
98
+ for (let i = 0; i < BROKER_WAIT_MAX_ATTEMPTS; i++) {
99
+ if (client.isAvailable()) {
100
+ brokerAvailable = true;
101
+ break;
102
+ }
103
+ await new Promise((r) => setTimeout(r, BROKER_WAIT_INTERVAL_MS));
104
+ }
105
+
106
+ if (!brokerAvailable) {
107
+ throw new Error(
108
+ "Keychain broker not available after waiting — credential migration " +
109
+ "will be retried on next startup",
110
+ );
111
+ }
112
+
113
+ const { listKeys, getKey, deleteKey } =
114
+ await import("../../security/encrypted-store.js");
115
+
116
+ const accounts = listKeys();
117
+ if (accounts.length === 0) {
118
+ return;
119
+ }
120
+
121
+ let migratedCount = 0;
122
+ let failedCount = 0;
123
+
124
+ for (const account of accounts) {
125
+ const value = getKey(account);
126
+ if (value === undefined) {
127
+ log.warn(
128
+ { account },
129
+ "Failed to read key from encrypted store — skipping",
130
+ );
131
+ failedCount++;
132
+ continue;
133
+ }
134
+
135
+ const result = await client.set(account, value);
136
+ if (result.status === "ok") {
137
+ deleteKey(account);
138
+ migratedCount++;
139
+ } else {
140
+ log.warn(
141
+ { account, status: result.status },
142
+ "Failed to write key to keychain — skipping",
143
+ );
144
+ failedCount++;
145
+ }
146
+ }
147
+
148
+ log.info(
149
+ { migratedCount, failedCount },
150
+ "Credential migration to keychain complete",
151
+ );
152
+ },
153
+ };
@@ -0,0 +1,156 @@
1
+ import {
2
+ chmodSync,
3
+ existsSync,
4
+ mkdirSync,
5
+ readFileSync,
6
+ renameSync,
7
+ unlinkSync,
8
+ writeFileSync,
9
+ } from "node:fs";
10
+ import { join } from "node:path";
11
+
12
+ import { getRootDir } from "../../util/platform.js";
13
+ import type { WorkspaceMigration } from "./types.js";
14
+
15
+ export const extractFeatureFlagsToProtectedMigration: WorkspaceMigration = {
16
+ id: "016-extract-feature-flags-to-protected",
17
+ description:
18
+ "Move assistantFeatureFlagValues from config.json to ~/.vellum/protected/feature-flags.json",
19
+
20
+ down(workspaceDir: string): void {
21
+ // Reverse: read feature flags from protected directory and write them
22
+ // back to config.json as assistantFeatureFlagValues.
23
+ const protectedDir = join(getRootDir(), "protected");
24
+ const featureFlagsPath = join(protectedDir, "feature-flags.json");
25
+
26
+ if (!existsSync(featureFlagsPath)) return;
27
+
28
+ let flagValues: Record<string, boolean>;
29
+ try {
30
+ const raw = JSON.parse(readFileSync(featureFlagsPath, "utf-8"));
31
+ if (
32
+ !raw ||
33
+ raw.version !== 1 ||
34
+ !raw.values ||
35
+ typeof raw.values !== "object"
36
+ ) {
37
+ return;
38
+ }
39
+ flagValues = raw.values;
40
+ } catch {
41
+ return; // Malformed file — skip
42
+ }
43
+
44
+ if (Object.keys(flagValues).length === 0) return;
45
+
46
+ // Read config.json and restore assistantFeatureFlagValues
47
+ const configPath = join(workspaceDir, "config.json");
48
+ let config: Record<string, unknown> = {};
49
+ if (existsSync(configPath)) {
50
+ try {
51
+ const raw = JSON.parse(readFileSync(configPath, "utf-8"));
52
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
53
+ config = raw as Record<string, unknown>;
54
+ }
55
+ } catch {
56
+ // Malformed config — start with empty object
57
+ }
58
+ }
59
+
60
+ // Merge into existing assistantFeatureFlagValues if present
61
+ const existing = (config.assistantFeatureFlagValues ?? {}) as Record<
62
+ string,
63
+ boolean
64
+ >;
65
+ config.assistantFeatureFlagValues = { ...existing, ...flagValues };
66
+
67
+ const tmpConfigPath = configPath + ".tmp";
68
+ writeFileSync(
69
+ tmpConfigPath,
70
+ JSON.stringify(config, null, 2) + "\n",
71
+ "utf-8",
72
+ );
73
+ renameSync(tmpConfigPath, configPath);
74
+
75
+ // Remove the protected feature-flags file
76
+ try {
77
+ unlinkSync(featureFlagsPath);
78
+ } catch {
79
+ // Best-effort cleanup
80
+ }
81
+ },
82
+
83
+ run(workspaceDir: string): void {
84
+ const configPath = join(workspaceDir, "config.json");
85
+ if (!existsSync(configPath)) return;
86
+
87
+ let config: Record<string, unknown>;
88
+ try {
89
+ const raw = JSON.parse(readFileSync(configPath, "utf-8"));
90
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) return;
91
+ config = raw as Record<string, unknown>;
92
+ } catch {
93
+ return; // Malformed config — skip
94
+ }
95
+
96
+ const flagValues = config.assistantFeatureFlagValues as
97
+ | Record<string, boolean>
98
+ | undefined;
99
+ if (
100
+ !flagValues ||
101
+ typeof flagValues !== "object" ||
102
+ Object.keys(flagValues).length === 0
103
+ ) {
104
+ return; // Nothing to migrate
105
+ }
106
+
107
+ // Write feature flags to protected directory
108
+ const protectedDir = join(getRootDir(), "protected");
109
+ mkdirSync(protectedDir, { recursive: true });
110
+
111
+ const featureFlagsPath = join(protectedDir, "feature-flags.json");
112
+
113
+ // Read existing feature-flags.json if present (may have been written by
114
+ // the gateway in a rolling deployment) so we merge rather than overwrite.
115
+ let existingValues: Record<string, boolean> = {};
116
+ if (existsSync(featureFlagsPath)) {
117
+ try {
118
+ const existing = JSON.parse(readFileSync(featureFlagsPath, "utf-8"));
119
+ if (
120
+ existing.version === 1 &&
121
+ existing.values &&
122
+ typeof existing.values === "object"
123
+ ) {
124
+ existingValues = existing.values;
125
+ }
126
+ } catch {
127
+ // Malformed file — start fresh
128
+ }
129
+ }
130
+
131
+ // Merge: config values take precedence, existing keys preserved
132
+ const mergedValues = { ...existingValues, ...flagValues };
133
+
134
+ const featureFlagsContent = JSON.stringify(
135
+ { version: 1, values: mergedValues },
136
+ null,
137
+ 2,
138
+ );
139
+
140
+ const tmpFeatureFlagsPath = featureFlagsPath + ".tmp";
141
+ writeFileSync(tmpFeatureFlagsPath, featureFlagsContent + "\n", "utf-8");
142
+ chmodSync(tmpFeatureFlagsPath, 0o600);
143
+ renameSync(tmpFeatureFlagsPath, featureFlagsPath);
144
+
145
+ // Remove assistantFeatureFlagValues from config.json
146
+ delete config.assistantFeatureFlagValues;
147
+
148
+ const tmpConfigPath = configPath + ".tmp";
149
+ writeFileSync(
150
+ tmpConfigPath,
151
+ JSON.stringify(config, null, 2) + "\n",
152
+ "utf-8",
153
+ );
154
+ renameSync(tmpConfigPath, configPath);
155
+ },
156
+ };
@@ -0,0 +1,150 @@
1
+ import { getLogger } from "../../util/logger.js";
2
+ import type { WorkspaceMigration } from "./types.js";
3
+
4
+ const log = getLogger("workspace-migrations");
5
+
6
+ const BROKER_WAIT_INTERVAL_MS = 500;
7
+ const BROKER_WAIT_MAX_ATTEMPTS = 10; // 5 seconds total
8
+
9
+ export const migrateCredentialsFromKeychainMigration: WorkspaceMigration = {
10
+ id: "016-migrate-credentials-from-keychain",
11
+ description:
12
+ "Copy keychain credentials back to encrypted store for CES unification",
13
+
14
+ async down(_workspaceDir: string): Promise<void> {
15
+ // Reverse: copy credentials from encrypted store back to keychain.
16
+ // Mirrors the forward logic of 015-migrate-credentials-to-keychain.
17
+ if (
18
+ process.env.VELLUM_DESKTOP_APP !== "1" ||
19
+ process.env.VELLUM_DEV === "1"
20
+ ) {
21
+ return;
22
+ }
23
+
24
+ const { createBrokerClient } =
25
+ await import("../../security/keychain-broker-client.js");
26
+ const client = createBrokerClient();
27
+
28
+ let brokerAvailable = false;
29
+ for (let i = 0; i < BROKER_WAIT_MAX_ATTEMPTS; i++) {
30
+ if (client.isAvailable()) {
31
+ brokerAvailable = true;
32
+ break;
33
+ }
34
+ await new Promise((r) => setTimeout(r, BROKER_WAIT_INTERVAL_MS));
35
+ }
36
+
37
+ if (!brokerAvailable) {
38
+ throw new Error(
39
+ "Keychain broker not available after waiting — credential rollback " +
40
+ "will be retried on next startup",
41
+ );
42
+ }
43
+
44
+ const { listKeys, getKey, deleteKey } =
45
+ await import("../../security/encrypted-store.js");
46
+
47
+ const accounts = listKeys();
48
+ if (accounts.length === 0) return;
49
+
50
+ let rolledBackCount = 0;
51
+ let failedCount = 0;
52
+
53
+ for (const account of accounts) {
54
+ const value = getKey(account);
55
+ if (value === undefined) {
56
+ log.warn(
57
+ { account },
58
+ "Failed to read key from encrypted store during rollback — skipping",
59
+ );
60
+ failedCount++;
61
+ continue;
62
+ }
63
+
64
+ const result = await client.set(account, value);
65
+ if (result.status === "ok") {
66
+ deleteKey(account);
67
+ rolledBackCount++;
68
+ } else {
69
+ log.warn(
70
+ { account, status: result.status },
71
+ "Failed to write key to keychain during rollback — skipping",
72
+ );
73
+ failedCount++;
74
+ }
75
+ }
76
+
77
+ log.info(
78
+ { rolledBackCount, failedCount },
79
+ "Credential rollback from encrypted store to keychain complete",
80
+ );
81
+ },
82
+
83
+ async run(_workspaceDir: string): Promise<void> {
84
+ // Only run on mac production builds (desktop app, non-dev).
85
+ if (
86
+ process.env.VELLUM_DESKTOP_APP !== "1" ||
87
+ process.env.VELLUM_DEV === "1"
88
+ ) {
89
+ return;
90
+ }
91
+
92
+ const { createBrokerClient } =
93
+ await import("../../security/keychain-broker-client.js");
94
+ const client = createBrokerClient();
95
+
96
+ // Wait for the broker to become available (up to 5 seconds), matching
97
+ // the retry strategy in secure-keys.ts waitForBrokerAvailability().
98
+ let brokerAvailable = false;
99
+ for (let i = 0; i < BROKER_WAIT_MAX_ATTEMPTS; i++) {
100
+ if (client.isAvailable()) {
101
+ brokerAvailable = true;
102
+ break;
103
+ }
104
+ await new Promise((r) => setTimeout(r, BROKER_WAIT_INTERVAL_MS));
105
+ }
106
+
107
+ if (!brokerAvailable) {
108
+ // Unlike migration 015, we return silently here. If the broker is not
109
+ // available, credentials may already be in the encrypted store from
110
+ // before migration 015 ran, or from a non-desktop environment.
111
+ return;
112
+ }
113
+
114
+ const { setKey } = await import("../../security/encrypted-store.js");
115
+
116
+ const accounts = await client.list();
117
+ if (accounts.length === 0) {
118
+ return;
119
+ }
120
+
121
+ let migratedCount = 0;
122
+ let failedCount = 0;
123
+
124
+ for (const account of accounts) {
125
+ const result = await client.get(account);
126
+ if (!result || !result.found || result.value === undefined) {
127
+ log.warn({ account }, "Failed to read key from keychain — skipping");
128
+ failedCount++;
129
+ continue;
130
+ }
131
+
132
+ const written = setKey(account, result.value);
133
+ if (written) {
134
+ await client.del(account);
135
+ migratedCount++;
136
+ } else {
137
+ log.warn(
138
+ { account },
139
+ "Failed to write key to encrypted store — skipping",
140
+ );
141
+ failedCount++;
142
+ }
143
+ }
144
+
145
+ log.info(
146
+ { migratedCount, failedCount },
147
+ "Credential migration from keychain complete",
148
+ );
149
+ },
150
+ };
@@ -0,0 +1,95 @@
1
+ import {
2
+ copyFileSync,
3
+ existsSync,
4
+ mkdirSync,
5
+ readdirSync,
6
+ readFileSync,
7
+ rmdirSync,
8
+ } from "node:fs";
9
+ import { join } from "node:path";
10
+
11
+ import { eq } from "drizzle-orm";
12
+
13
+ import { generateUserFileSlug } from "../../contacts/contact-store.js";
14
+ import { getDb } from "../../memory/db.js";
15
+ import { contacts } from "../../memory/schema/contacts.js";
16
+ import {
17
+ isTemplateContent,
18
+ stripCommentLines,
19
+ } from "../../prompts/system-prompt.js";
20
+ import type { WorkspaceMigration } from "./types.js";
21
+
22
+ export const seedPersonaDirsMigration: WorkspaceMigration = {
23
+ id: "017-seed-persona-dirs",
24
+ description:
25
+ "Create users/ and channels/ persona directories and migrate customized USER.md",
26
+
27
+ down(workspaceDir: string): void {
28
+ // Remove the seeded persona directories only if they are empty.
29
+ // We don't delete user-created content — only clean up the empty
30
+ // directories that the forward migration created.
31
+ const usersDir = join(workspaceDir, "users");
32
+ const channelsDir = join(workspaceDir, "channels");
33
+
34
+ for (const dir of [usersDir, channelsDir]) {
35
+ if (!existsSync(dir)) continue;
36
+ try {
37
+ const entries = readdirSync(dir);
38
+ if (entries.length === 0) {
39
+ rmdirSync(dir);
40
+ }
41
+ } catch {
42
+ // Best-effort: skip if we can't read or remove
43
+ }
44
+ }
45
+ },
46
+
47
+ run(workspaceDir: string): void {
48
+ // Create persona directories
49
+ mkdirSync(join(workspaceDir, "users"), { recursive: true });
50
+ mkdirSync(join(workspaceDir, "channels"), { recursive: true });
51
+
52
+ // Check if USER.md exists and has been customized
53
+ const userMdPath = join(workspaceDir, "USER.md");
54
+ if (!existsSync(userMdPath)) return;
55
+
56
+ const rawContent = readFileSync(userMdPath, "utf-8");
57
+ const content = stripCommentLines(rawContent);
58
+ if (!content) return;
59
+
60
+ // Skip if the content is the unmodified template
61
+ if (isTemplateContent(content, "USER.md")) return;
62
+
63
+ // Determine destination filename based on guardian contact
64
+ let destFilename = "guardian.md";
65
+ try {
66
+ const db = getDb();
67
+ const guardian = db
68
+ .select()
69
+ .from(contacts)
70
+ .where(eq(contacts.role, "guardian"))
71
+ .limit(1)
72
+ .get();
73
+
74
+ if (guardian) {
75
+ if (guardian.userFile) {
76
+ destFilename = guardian.userFile;
77
+ } else {
78
+ const slug = generateUserFileSlug(guardian.displayName);
79
+ db.update(contacts)
80
+ .set({ userFile: slug })
81
+ .where(eq(contacts.id, guardian.id))
82
+ .run();
83
+ destFilename = slug;
84
+ }
85
+ }
86
+ } catch {
87
+ // DB might not be initialized yet — fall back to guardian.md
88
+ }
89
+
90
+ const destPath = join(workspaceDir, "users", destFilename);
91
+ if (!existsSync(destPath)) {
92
+ copyFileSync(userMdPath, destPath);
93
+ }
94
+ },
95
+ };
@@ -14,7 +14,13 @@
14
14
  * - Skips if the old workspace directory doesn't exist or is empty.
15
15
  */
16
16
 
17
- import { cpSync, existsSync, readdirSync, writeFileSync } from "node:fs";
17
+ import {
18
+ cpSync,
19
+ existsSync,
20
+ readdirSync,
21
+ unlinkSync,
22
+ writeFileSync,
23
+ } from "node:fs";
18
24
  import { join } from "node:path";
19
25
 
20
26
  import {
@@ -30,6 +36,22 @@ export const migrateToWorkspaceVolumeMigration: WorkspaceMigration = {
30
36
  description:
31
37
  "Copy workspace data from old /data/.vellum/workspace to new WORKSPACE_DIR volume on first boot",
32
38
 
39
+ down(workspaceDir: string): void {
40
+ // This migration copies data between volumes. Actually reversing the copy
41
+ // (deleting data from the workspace volume) is dangerous and could cause
42
+ // data loss. Instead, we just remove the sentinel file so the migration
43
+ // will re-run and re-evaluate on next startup.
44
+ const sentinelPath = join(workspaceDir, SENTINEL_FILENAME);
45
+ if (existsSync(sentinelPath)) {
46
+ try {
47
+ unlinkSync(sentinelPath);
48
+ } catch {
49
+ // Best-effort — the migration runner's checkpoint removal will
50
+ // also ensure the migration re-runs.
51
+ }
52
+ }
53
+ },
54
+
33
55
  run(workspaceDir: string): void {
34
56
  const workspaceDirOverride = getWorkspaceDirOverride();
35
57
 
@@ -10,6 +10,10 @@ import { appDirRenameMigration } from "./010-app-dir-rename.js";
10
10
  import { backfillInstallationIdMigration } from "./011-backfill-installation-id.js";
11
11
  import { renameConversationDiskViewDirsMigration } from "./012-rename-conversation-disk-view-dirs.js";
12
12
  import { repairConversationDiskViewMigration } from "./013-repair-conversation-disk-view.js";
13
+ import { migrateCredentialsToKeychainMigration } from "./015-migrate-credentials-to-keychain.js";
14
+ import { extractFeatureFlagsToProtectedMigration } from "./016-extract-feature-flags-to-protected.js";
15
+ import { migrateCredentialsFromKeychainMigration } from "./016-migrate-credentials-from-keychain.js";
16
+ import { seedPersonaDirsMigration } from "./017-seed-persona-dirs.js";
13
17
  import { migrateToWorkspaceVolumeMigration } from "./migrate-to-workspace-volume.js";
14
18
  import type { WorkspaceMigration } from "./types.js";
15
19
 
@@ -31,4 +35,8 @@ export const WORKSPACE_MIGRATIONS: WorkspaceMigration[] = [
31
35
  renameConversationDiskViewDirsMigration,
32
36
  repairConversationDiskViewMigration,
33
37
  migrateToWorkspaceVolumeMigration,
38
+ migrateCredentialsToKeychainMigration,
39
+ migrateCredentialsFromKeychainMigration,
40
+ seedPersonaDirsMigration,
41
+ extractFeatureFlagsToProtectedMigration,
34
42
  ];