libre-webui 0.25.0 → 0.27.0

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 (588) hide show
  1. package/README.md +32 -22
  2. package/backend/dist/index.d.ts.map +1 -1
  3. package/backend/dist/index.js +33 -4
  4. package/backend/dist/index.js.map +1 -1
  5. package/backend/dist/middleware/auth.d.ts +7 -0
  6. package/backend/dist/middleware/auth.d.ts.map +1 -1
  7. package/backend/dist/middleware/auth.js +26 -0
  8. package/backend/dist/middleware/auth.js.map +1 -1
  9. package/backend/dist/middleware/index.d.ts +20 -0
  10. package/backend/dist/middleware/index.d.ts.map +1 -1
  11. package/backend/dist/middleware/index.js +105 -2
  12. package/backend/dist/middleware/index.js.map +1 -1
  13. package/backend/dist/models/personaModel.d.ts.map +1 -1
  14. package/backend/dist/models/personaModel.js +2 -0
  15. package/backend/dist/models/personaModel.js.map +1 -1
  16. package/backend/dist/observability/otel.d.ts +40 -0
  17. package/backend/dist/observability/otel.d.ts.map +1 -0
  18. package/backend/dist/observability/otel.js +337 -0
  19. package/backend/dist/observability/otel.js.map +1 -0
  20. package/backend/dist/observability/requestContext.d.ts +14 -0
  21. package/backend/dist/observability/requestContext.d.ts.map +1 -0
  22. package/backend/dist/observability/requestContext.js +21 -0
  23. package/backend/dist/observability/requestContext.js.map +1 -0
  24. package/backend/dist/persistence/chatGenerationTypes.d.ts +9 -0
  25. package/backend/dist/persistence/chatGenerationTypes.d.ts.map +1 -1
  26. package/backend/dist/persistence/extensionTypes.d.ts +13 -0
  27. package/backend/dist/persistence/extensionTypes.d.ts.map +1 -1
  28. package/backend/dist/persistence/extensionTypes.js.map +1 -1
  29. package/backend/dist/persistence/index.d.ts +1 -1
  30. package/backend/dist/persistence/index.d.ts.map +1 -1
  31. package/backend/dist/persistence/index.js.map +1 -1
  32. package/backend/dist/persistence/postgresAgentFoundationMigration.d.ts +9 -0
  33. package/backend/dist/persistence/postgresAgentFoundationMigration.d.ts.map +1 -0
  34. package/backend/dist/persistence/postgresAgentFoundationMigration.js +164 -0
  35. package/backend/dist/persistence/postgresAgentFoundationMigration.js.map +1 -0
  36. package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -1
  37. package/backend/dist/persistence/postgresExtensionRepositories.js +46 -2
  38. package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -1
  39. package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.d.ts +10 -0
  40. package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.d.ts.map +1 -0
  41. package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.js +148 -0
  42. package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.js.map +1 -0
  43. package/backend/dist/persistence/postgresMfaPushRecoveryMigration.d.ts +9 -0
  44. package/backend/dist/persistence/postgresMfaPushRecoveryMigration.d.ts.map +1 -0
  45. package/backend/dist/persistence/postgresMfaPushRecoveryMigration.js +107 -0
  46. package/backend/dist/persistence/postgresMfaPushRecoveryMigration.js.map +1 -0
  47. package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
  48. package/backend/dist/persistence/postgresMigrationRegistry.js +12 -0
  49. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
  50. package/backend/dist/persistence/postgresNotesV2Migration.d.ts +4 -0
  51. package/backend/dist/persistence/postgresNotesV2Migration.d.ts.map +1 -0
  52. package/backend/dist/persistence/postgresNotesV2Migration.js +57 -0
  53. package/backend/dist/persistence/postgresNotesV2Migration.js.map +1 -0
  54. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
  55. package/backend/dist/persistence/postgresResourceRepositories.js +1930 -133
  56. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
  57. package/backend/dist/persistence/postgresSecurityRepositories.d.ts.map +1 -1
  58. package/backend/dist/persistence/postgresSecurityRepositories.js +150 -0
  59. package/backend/dist/persistence/postgresSecurityRepositories.js.map +1 -1
  60. package/backend/dist/persistence/postgresSkillFilesMigration.d.ts +9 -0
  61. package/backend/dist/persistence/postgresSkillFilesMigration.d.ts.map +1 -0
  62. package/backend/dist/persistence/postgresSkillFilesMigration.js +50 -0
  63. package/backend/dist/persistence/postgresSkillFilesMigration.js.map +1 -0
  64. package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts +10 -0
  65. package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts.map +1 -0
  66. package/backend/dist/persistence/postgresTeamCollaborationMigration.js +161 -0
  67. package/backend/dist/persistence/postgresTeamCollaborationMigration.js.map +1 -0
  68. package/backend/dist/persistence/resourceTypes.d.ts +600 -3
  69. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
  70. package/backend/dist/persistence/resourceTypes.js.map +1 -1
  71. package/backend/dist/persistence/securityTypes.d.ts +59 -0
  72. package/backend/dist/persistence/securityTypes.d.ts.map +1 -1
  73. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
  74. package/backend/dist/persistence/sqliteExtensionRepositories.js +26 -4
  75. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
  76. package/backend/dist/persistence/sqliteMigrations.d.ts +10 -0
  77. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
  78. package/backend/dist/persistence/sqliteMigrations.js +1492 -131
  79. package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
  80. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
  81. package/backend/dist/persistence/sqliteResourceRepositories.js +1657 -134
  82. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
  83. package/backend/dist/persistence/sqliteSecurityRepositories.d.ts.map +1 -1
  84. package/backend/dist/persistence/sqliteSecurityRepositories.js +134 -0
  85. package/backend/dist/persistence/sqliteSecurityRepositories.js.map +1 -1
  86. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
  87. package/backend/dist/persistence/sqliteToPostgresMigration.js +302 -3
  88. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
  89. package/backend/dist/platform/jobs/domainJobContracts.d.ts +10 -0
  90. package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -1
  91. package/backend/dist/platform/jobs/domainJobContracts.js +10 -0
  92. package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -1
  93. package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
  94. package/backend/dist/platform/jobs/domainJobHandlers.js +374 -4
  95. package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
  96. package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts.map +1 -1
  97. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js +4 -2
  98. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js.map +1 -1
  99. package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts.map +1 -1
  100. package/backend/dist/platform/jobs/postgresDurableJobWorker.js +4 -2
  101. package/backend/dist/platform/jobs/postgresDurableJobWorker.js.map +1 -1
  102. package/backend/dist/platform/storage/pgVectorStore.d.ts +2 -1
  103. package/backend/dist/platform/storage/pgVectorStore.d.ts.map +1 -1
  104. package/backend/dist/platform/storage/pgVectorStore.js +51 -0
  105. package/backend/dist/platform/storage/pgVectorStore.js.map +1 -1
  106. package/backend/dist/platform/storage/platformDomainRepositories.d.ts +8 -2
  107. package/backend/dist/platform/storage/platformDomainRepositories.d.ts.map +1 -1
  108. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts.map +1 -1
  109. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js +25 -4
  110. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js.map +1 -1
  111. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts +2 -1
  112. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts.map +1 -1
  113. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js +35 -0
  114. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js.map +1 -1
  115. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts.map +1 -1
  116. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js +26 -3
  117. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js.map +1 -1
  118. package/backend/dist/platform/storage/vectorStore.d.ts +14 -0
  119. package/backend/dist/platform/storage/vectorStore.d.ts.map +1 -1
  120. package/backend/dist/platform/storage/vectorStore.js.map +1 -1
  121. package/backend/dist/routes/access.d.ts.map +1 -1
  122. package/backend/dist/routes/access.js +84 -3
  123. package/backend/dist/routes/access.js.map +1 -1
  124. package/backend/dist/routes/auth.d.ts.map +1 -1
  125. package/backend/dist/routes/auth.js +419 -1
  126. package/backend/dist/routes/auth.js.map +1 -1
  127. package/backend/dist/routes/calendar.d.ts.map +1 -1
  128. package/backend/dist/routes/calendar.js +125 -22
  129. package/backend/dist/routes/calendar.js.map +1 -1
  130. package/backend/dist/routes/channels.d.ts +3 -0
  131. package/backend/dist/routes/channels.d.ts.map +1 -0
  132. package/backend/dist/routes/channels.js +447 -0
  133. package/backend/dist/routes/channels.js.map +1 -0
  134. package/backend/dist/routes/chat.d.ts.map +1 -1
  135. package/backend/dist/routes/chat.js +195 -7
  136. package/backend/dist/routes/chat.js.map +1 -1
  137. package/backend/dist/routes/costs.d.ts +3 -0
  138. package/backend/dist/routes/costs.d.ts.map +1 -0
  139. package/backend/dist/routes/costs.js +191 -0
  140. package/backend/dist/routes/costs.js.map +1 -0
  141. package/backend/dist/routes/documents.d.ts.map +1 -1
  142. package/backend/dist/routes/documents.js +68 -21
  143. package/backend/dist/routes/documents.js.map +1 -1
  144. package/backend/dist/routes/evaluations.d.ts +3 -0
  145. package/backend/dist/routes/evaluations.d.ts.map +1 -0
  146. package/backend/dist/routes/evaluations.js +352 -0
  147. package/backend/dist/routes/evaluations.js.map +1 -0
  148. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  149. package/backend/dist/routes/imageGen.js +2 -1
  150. package/backend/dist/routes/imageGen.js.map +1 -1
  151. package/backend/dist/routes/media.d.ts.map +1 -1
  152. package/backend/dist/routes/media.js +228 -7
  153. package/backend/dist/routes/media.js.map +1 -1
  154. package/backend/dist/routes/notes.d.ts.map +1 -1
  155. package/backend/dist/routes/notes.js +149 -36
  156. package/backend/dist/routes/notes.js.map +1 -1
  157. package/backend/dist/routes/notifications.d.ts +3 -0
  158. package/backend/dist/routes/notifications.d.ts.map +1 -0
  159. package/backend/dist/routes/notifications.js +213 -0
  160. package/backend/dist/routes/notifications.js.map +1 -0
  161. package/backend/dist/routes/openaiCompat.d.ts +3 -0
  162. package/backend/dist/routes/openaiCompat.d.ts.map +1 -0
  163. package/backend/dist/routes/openaiCompat.js +314 -0
  164. package/backend/dist/routes/openaiCompat.js.map +1 -0
  165. package/backend/dist/routes/personas.js +1 -1
  166. package/backend/dist/routes/personas.js.map +1 -1
  167. package/backend/dist/routes/prompts.d.ts +3 -0
  168. package/backend/dist/routes/prompts.d.ts.map +1 -0
  169. package/backend/dist/routes/prompts.js +173 -0
  170. package/backend/dist/routes/prompts.js.map +1 -0
  171. package/backend/dist/routes/push.d.ts +3 -0
  172. package/backend/dist/routes/push.d.ts.map +1 -0
  173. package/backend/dist/routes/push.js +105 -0
  174. package/backend/dist/routes/push.js.map +1 -0
  175. package/backend/dist/routes/recovery.d.ts +3 -0
  176. package/backend/dist/routes/recovery.d.ts.map +1 -0
  177. package/backend/dist/routes/recovery.js +83 -0
  178. package/backend/dist/routes/recovery.js.map +1 -0
  179. package/backend/dist/routes/search.d.ts.map +1 -1
  180. package/backend/dist/routes/search.js +29 -1
  181. package/backend/dist/routes/search.js.map +1 -1
  182. package/backend/dist/routes/skills.d.ts +3 -0
  183. package/backend/dist/routes/skills.d.ts.map +1 -0
  184. package/backend/dist/routes/skills.js +246 -0
  185. package/backend/dist/routes/skills.js.map +1 -0
  186. package/backend/dist/routes/stt.d.ts.map +1 -1
  187. package/backend/dist/routes/stt.js +2 -1
  188. package/backend/dist/routes/stt.js.map +1 -1
  189. package/backend/dist/routes/tools.d.ts +3 -0
  190. package/backend/dist/routes/tools.d.ts.map +1 -0
  191. package/backend/dist/routes/tools.js +359 -0
  192. package/backend/dist/routes/tools.js.map +1 -0
  193. package/backend/dist/routes/tts.d.ts.map +1 -1
  194. package/backend/dist/routes/tts.js +63 -8
  195. package/backend/dist/routes/tts.js.map +1 -1
  196. package/backend/dist/routes/users.d.ts.map +1 -1
  197. package/backend/dist/routes/users.js +35 -0
  198. package/backend/dist/routes/users.js.map +1 -1
  199. package/backend/dist/routes/voiceAccess.d.ts +3 -0
  200. package/backend/dist/routes/voiceAccess.d.ts.map +1 -0
  201. package/backend/dist/routes/voiceAccess.js +102 -0
  202. package/backend/dist/routes/voiceAccess.js.map +1 -0
  203. package/backend/dist/services/apiTokenService.d.ts +2 -2
  204. package/backend/dist/services/apiTokenService.d.ts.map +1 -1
  205. package/backend/dist/services/apiTokenService.js +7 -0
  206. package/backend/dist/services/apiTokenService.js.map +1 -1
  207. package/backend/dist/services/authService.d.ts +6 -0
  208. package/backend/dist/services/authService.d.ts.map +1 -1
  209. package/backend/dist/services/authService.js +9 -0
  210. package/backend/dist/services/authService.js.map +1 -1
  211. package/backend/dist/services/authorizationService.d.ts +8 -4
  212. package/backend/dist/services/authorizationService.d.ts.map +1 -1
  213. package/backend/dist/services/authorizationService.js +31 -1
  214. package/backend/dist/services/authorizationService.js.map +1 -1
  215. package/backend/dist/services/automationSchedulerService.d.ts.map +1 -1
  216. package/backend/dist/services/automationSchedulerService.js +40 -3
  217. package/backend/dist/services/automationSchedulerService.js.map +1 -1
  218. package/backend/dist/services/automationService.d.ts +4 -1
  219. package/backend/dist/services/automationService.d.ts.map +1 -1
  220. package/backend/dist/services/automationService.js +25 -2
  221. package/backend/dist/services/automationService.js.map +1 -1
  222. package/backend/dist/services/builtinToolsService.d.ts +20 -0
  223. package/backend/dist/services/builtinToolsService.d.ts.map +1 -0
  224. package/backend/dist/services/builtinToolsService.js +661 -0
  225. package/backend/dist/services/builtinToolsService.js.map +1 -0
  226. package/backend/dist/services/calendarService.d.ts +74 -0
  227. package/backend/dist/services/calendarService.d.ts.map +1 -0
  228. package/backend/dist/services/calendarService.js +339 -0
  229. package/backend/dist/services/calendarService.js.map +1 -0
  230. package/backend/dist/services/channelService.d.ts +195 -0
  231. package/backend/dist/services/channelService.d.ts.map +1 -0
  232. package/backend/dist/services/channelService.js +1057 -0
  233. package/backend/dist/services/channelService.js.map +1 -0
  234. package/backend/dist/services/chatRequestService.d.ts.map +1 -1
  235. package/backend/dist/services/chatRequestService.js +29 -1
  236. package/backend/dist/services/chatRequestService.js.map +1 -1
  237. package/backend/dist/services/chatService.d.ts +61 -1
  238. package/backend/dist/services/chatService.d.ts.map +1 -1
  239. package/backend/dist/services/chatService.js +218 -1
  240. package/backend/dist/services/chatService.js.map +1 -1
  241. package/backend/dist/services/chatToolRuntimeService.d.ts +55 -0
  242. package/backend/dist/services/chatToolRuntimeService.d.ts.map +1 -0
  243. package/backend/dist/services/chatToolRuntimeService.js +389 -0
  244. package/backend/dist/services/chatToolRuntimeService.js.map +1 -0
  245. package/backend/dist/services/costGovernanceService.d.ts +102 -0
  246. package/backend/dist/services/costGovernanceService.d.ts.map +1 -0
  247. package/backend/dist/services/costGovernanceService.js +463 -0
  248. package/backend/dist/services/costGovernanceService.js.map +1 -0
  249. package/backend/dist/services/dataArchiveService.d.ts +6 -0
  250. package/backend/dist/services/dataArchiveService.d.ts.map +1 -1
  251. package/backend/dist/services/dataArchiveService.js +26 -4
  252. package/backend/dist/services/dataArchiveService.js.map +1 -1
  253. package/backend/dist/services/documentMediaExtractionService.d.ts +40 -0
  254. package/backend/dist/services/documentMediaExtractionService.d.ts.map +1 -0
  255. package/backend/dist/services/documentMediaExtractionService.js +157 -0
  256. package/backend/dist/services/documentMediaExtractionService.js.map +1 -0
  257. package/backend/dist/services/documentService.d.ts +64 -1
  258. package/backend/dist/services/documentService.d.ts.map +1 -1
  259. package/backend/dist/services/documentService.js +342 -83
  260. package/backend/dist/services/documentService.js.map +1 -1
  261. package/backend/dist/services/durableChatGenerationService.d.ts +9 -0
  262. package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -1
  263. package/backend/dist/services/durableChatGenerationService.js +152 -11
  264. package/backend/dist/services/durableChatGenerationService.js.map +1 -1
  265. package/backend/dist/services/encryptionService.d.ts +6 -0
  266. package/backend/dist/services/encryptionService.d.ts.map +1 -1
  267. package/backend/dist/services/encryptionService.js +12 -0
  268. package/backend/dist/services/encryptionService.js.map +1 -1
  269. package/backend/dist/services/evaluationService.d.ts +111 -0
  270. package/backend/dist/services/evaluationService.d.ts.map +1 -0
  271. package/backend/dist/services/evaluationService.js +403 -0
  272. package/backend/dist/services/evaluationService.js.map +1 -0
  273. package/backend/dist/services/galleryService.d.ts +6 -0
  274. package/backend/dist/services/galleryService.d.ts.map +1 -1
  275. package/backend/dist/services/galleryService.js +26 -0
  276. package/backend/dist/services/galleryService.js.map +1 -1
  277. package/backend/dist/services/mcpClientService.d.ts +29 -0
  278. package/backend/dist/services/mcpClientService.d.ts.map +1 -0
  279. package/backend/dist/services/mcpClientService.js +189 -0
  280. package/backend/dist/services/mcpClientService.js.map +1 -0
  281. package/backend/dist/services/mfaService.d.ts +64 -0
  282. package/backend/dist/services/mfaService.d.ts.map +1 -0
  283. package/backend/dist/services/mfaService.js +263 -0
  284. package/backend/dist/services/mfaService.js.map +1 -0
  285. package/backend/dist/services/noteService.d.ts +71 -0
  286. package/backend/dist/services/noteService.d.ts.map +1 -0
  287. package/backend/dist/services/noteService.js +397 -0
  288. package/backend/dist/services/noteService.js.map +1 -0
  289. package/backend/dist/services/notificationService.d.ts +60 -0
  290. package/backend/dist/services/notificationService.d.ts.map +1 -0
  291. package/backend/dist/services/notificationService.js +340 -0
  292. package/backend/dist/services/notificationService.js.map +1 -0
  293. package/backend/dist/services/openApiToolService.d.ts +38 -0
  294. package/backend/dist/services/openApiToolService.d.ts.map +1 -0
  295. package/backend/dist/services/openApiToolService.js +254 -0
  296. package/backend/dist/services/openApiToolService.js.map +1 -0
  297. package/backend/dist/services/personaService.d.ts +18 -2
  298. package/backend/dist/services/personaService.d.ts.map +1 -1
  299. package/backend/dist/services/personaService.js +113 -4
  300. package/backend/dist/services/personaService.js.map +1 -1
  301. package/backend/dist/services/pluginImageGenerationService.d.ts +19 -0
  302. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
  303. package/backend/dist/services/pluginImageGenerationService.js +121 -0
  304. package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
  305. package/backend/dist/services/pluginService.d.ts +7 -0
  306. package/backend/dist/services/pluginService.d.ts.map +1 -1
  307. package/backend/dist/services/pluginService.js +8 -2
  308. package/backend/dist/services/pluginService.js.map +1 -1
  309. package/backend/dist/services/preferencesService.d.ts +1 -1
  310. package/backend/dist/services/preferencesService.d.ts.map +1 -1
  311. package/backend/dist/services/preferencesService.js +1 -0
  312. package/backend/dist/services/preferencesService.js.map +1 -1
  313. package/backend/dist/services/promptService.d.ts +74 -0
  314. package/backend/dist/services/promptService.d.ts.map +1 -0
  315. package/backend/dist/services/promptService.js +513 -0
  316. package/backend/dist/services/promptService.js.map +1 -0
  317. package/backend/dist/services/recoveryDrillService.d.ts +57 -0
  318. package/backend/dist/services/recoveryDrillService.d.ts.map +1 -0
  319. package/backend/dist/services/recoveryDrillService.js +363 -0
  320. package/backend/dist/services/recoveryDrillService.js.map +1 -0
  321. package/backend/dist/services/resourceGrantService.d.ts.map +1 -1
  322. package/backend/dist/services/resourceGrantService.js +62 -17
  323. package/backend/dist/services/resourceGrantService.js.map +1 -1
  324. package/backend/dist/services/searchService.d.ts +29 -0
  325. package/backend/dist/services/searchService.d.ts.map +1 -0
  326. package/backend/dist/services/searchService.js +0 -0
  327. package/backend/dist/services/searchService.js.map +1 -0
  328. package/backend/dist/services/securityAuditService.d.ts.map +1 -1
  329. package/backend/dist/services/securityAuditService.js +2 -1
  330. package/backend/dist/services/securityAuditService.js.map +1 -1
  331. package/backend/dist/services/sharedResourceAccess.d.ts +25 -0
  332. package/backend/dist/services/sharedResourceAccess.d.ts.map +1 -0
  333. package/backend/dist/services/sharedResourceAccess.js +59 -0
  334. package/backend/dist/services/sharedResourceAccess.js.map +1 -0
  335. package/backend/dist/services/skillService.d.ts +137 -0
  336. package/backend/dist/services/skillService.d.ts.map +1 -0
  337. package/backend/dist/services/skillService.js +852 -0
  338. package/backend/dist/services/skillService.js.map +1 -0
  339. package/backend/dist/services/toolAccessService.d.ts +9 -0
  340. package/backend/dist/services/toolAccessService.d.ts.map +1 -0
  341. package/backend/dist/services/toolAccessService.js +60 -0
  342. package/backend/dist/services/toolAccessService.js.map +1 -0
  343. package/backend/dist/services/toolApprovalService.d.ts +34 -0
  344. package/backend/dist/services/toolApprovalService.d.ts.map +1 -0
  345. package/backend/dist/services/toolApprovalService.js +188 -0
  346. package/backend/dist/services/toolApprovalService.js.map +1 -0
  347. package/backend/dist/services/toolGatewayService.d.ts +53 -0
  348. package/backend/dist/services/toolGatewayService.d.ts.map +1 -0
  349. package/backend/dist/services/toolGatewayService.js +249 -0
  350. package/backend/dist/services/toolGatewayService.js.map +1 -0
  351. package/backend/dist/services/toolServerService.d.ts +57 -0
  352. package/backend/dist/services/toolServerService.d.ts.map +1 -0
  353. package/backend/dist/services/toolServerService.js +521 -0
  354. package/backend/dist/services/toolServerService.js.map +1 -0
  355. package/backend/dist/services/voiceAccessService.d.ts +10 -0
  356. package/backend/dist/services/voiceAccessService.d.ts.map +1 -0
  357. package/backend/dist/services/voiceAccessService.js +74 -0
  358. package/backend/dist/services/voiceAccessService.js.map +1 -0
  359. package/backend/dist/services/voiceProfileService.d.ts +20 -0
  360. package/backend/dist/services/voiceProfileService.d.ts.map +1 -1
  361. package/backend/dist/services/voiceProfileService.js +60 -0
  362. package/backend/dist/services/voiceProfileService.js.map +1 -1
  363. package/backend/dist/services/webPushService.d.ts +71 -0
  364. package/backend/dist/services/webPushService.d.ts.map +1 -0
  365. package/backend/dist/services/webPushService.js +328 -0
  366. package/backend/dist/services/webPushService.js.map +1 -0
  367. package/backend/dist/services/webauthnService.d.ts +58 -0
  368. package/backend/dist/services/webauthnService.d.ts.map +1 -0
  369. package/backend/dist/services/webauthnService.js +300 -0
  370. package/backend/dist/services/webauthnService.js.map +1 -0
  371. package/backend/dist/storage.d.ts +28 -1
  372. package/backend/dist/storage.d.ts.map +1 -1
  373. package/backend/dist/storage.js +100 -1
  374. package/backend/dist/storage.js.map +1 -1
  375. package/backend/dist/storageMappers.d.ts +2 -2
  376. package/backend/dist/storageMappers.d.ts.map +1 -1
  377. package/backend/dist/storageMappers.js.map +1 -1
  378. package/backend/dist/types/index.d.ts +199 -3
  379. package/backend/dist/types/index.d.ts.map +1 -1
  380. package/backend/dist/types/index.js.map +1 -1
  381. package/backend/dist/types/tools.d.ts +137 -0
  382. package/backend/dist/types/tools.d.ts.map +1 -0
  383. package/backend/dist/types/tools.js +25 -0
  384. package/backend/dist/types/tools.js.map +1 -0
  385. package/backend/dist/utils/chatDocumentContext.d.ts +26 -1
  386. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
  387. package/backend/dist/utils/chatDocumentContext.js +87 -18
  388. package/backend/dist/utils/chatDocumentContext.js.map +1 -1
  389. package/backend/dist/utils/documentExtraction.d.ts +97 -0
  390. package/backend/dist/utils/documentExtraction.d.ts.map +1 -0
  391. package/backend/dist/utils/documentExtraction.js +651 -0
  392. package/backend/dist/utils/documentExtraction.js.map +1 -0
  393. package/backend/dist/utils/hybridRetrieval.d.ts +34 -0
  394. package/backend/dist/utils/hybridRetrieval.d.ts.map +1 -0
  395. package/backend/dist/utils/hybridRetrieval.js +119 -0
  396. package/backend/dist/utils/hybridRetrieval.js.map +1 -0
  397. package/backend/dist/utils/icsCalendar.d.ts +27 -0
  398. package/backend/dist/utils/icsCalendar.d.ts.map +1 -0
  399. package/backend/dist/utils/icsCalendar.js +313 -0
  400. package/backend/dist/utils/icsCalendar.js.map +1 -0
  401. package/backend/dist/utils/imageEditUpload.d.ts +29 -0
  402. package/backend/dist/utils/imageEditUpload.d.ts.map +1 -0
  403. package/backend/dist/utils/imageEditUpload.js +82 -0
  404. package/backend/dist/utils/imageEditUpload.js.map +1 -0
  405. package/backend/dist/utils/logRedaction.d.ts +2 -0
  406. package/backend/dist/utils/logRedaction.d.ts.map +1 -0
  407. package/backend/dist/utils/logRedaction.js +66 -0
  408. package/backend/dist/utils/logRedaction.js.map +1 -0
  409. package/backend/dist/utils/logger.d.ts +3 -0
  410. package/backend/dist/utils/logger.d.ts.map +1 -1
  411. package/backend/dist/utils/logger.js +63 -20
  412. package/backend/dist/utils/logger.js.map +1 -1
  413. package/backend/dist/utils/pluginChatAdapter.d.ts +5 -1
  414. package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
  415. package/backend/dist/utils/pluginChatAdapter.js +83 -0
  416. package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
  417. package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
  418. package/backend/dist/utils/resourceLimits.d.ts +61 -2
  419. package/backend/dist/utils/resourceLimits.d.ts.map +1 -1
  420. package/backend/dist/utils/resourceLimits.js +59 -0
  421. package/backend/dist/utils/resourceLimits.js.map +1 -1
  422. package/backend/dist/utils/toolEgress.d.ts +23 -0
  423. package/backend/dist/utils/toolEgress.d.ts.map +1 -0
  424. package/backend/dist/utils/toolEgress.js +169 -0
  425. package/backend/dist/utils/toolEgress.js.map +1 -0
  426. package/backend/dist/utils/totp.d.ts +19 -0
  427. package/backend/dist/utils/totp.d.ts.map +1 -0
  428. package/backend/dist/utils/totp.js +117 -0
  429. package/backend/dist/utils/totp.js.map +1 -0
  430. package/backend/dist/utils/webauthn.d.ts +43 -0
  431. package/backend/dist/utils/webauthn.d.ts.map +1 -0
  432. package/backend/dist/utils/webauthn.js +294 -0
  433. package/backend/dist/utils/webauthn.js.map +1 -0
  434. package/backend/dist/utils/websocketMessages.d.ts +6 -0
  435. package/backend/dist/utils/websocketMessages.d.ts.map +1 -1
  436. package/backend/dist/utils/websocketMessages.js +8 -0
  437. package/backend/dist/utils/websocketMessages.js.map +1 -1
  438. package/backend/dist/utils/zipArchive.d.ts +32 -0
  439. package/backend/dist/utils/zipArchive.d.ts.map +1 -0
  440. package/backend/dist/utils/zipArchive.js +171 -0
  441. package/backend/dist/utils/zipArchive.js.map +1 -0
  442. package/backend/dist/websocketServer.d.ts.map +1 -1
  443. package/backend/dist/websocketServer.js +142 -35
  444. package/backend/dist/websocketServer.js.map +1 -1
  445. package/backend/package.json +1 -1
  446. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  447. package/frontend/dist/assets/index-DBAf_VaS.js +47 -0
  448. package/frontend/dist/assets/index-kn_Axjts.css +1 -0
  449. package/frontend/dist/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  450. package/frontend/dist/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
  451. package/frontend/dist/fonts/jetbrains-mono.css +24 -0
  452. package/frontend/dist/index.html +27 -20
  453. package/frontend/dist/js/ArtifactContainer-C9zNtCay.js +1 -0
  454. package/frontend/dist/js/{ArtifactDemoPage-BeNs3gHp.js → ArtifactDemoPage-C-EBFBCt.js} +1 -1
  455. package/frontend/dist/js/ArtifactSandboxFrame-CTA1j_d1.js +111 -0
  456. package/frontend/dist/js/ArtifactSlideOutPanel-BOENbOiv.js +1 -0
  457. package/frontend/dist/js/AutomationsPage-C58MQ4te.js +1 -0
  458. package/frontend/dist/js/{Button-BPf_pOxH.js → Button-C0r3J9G_.js} +1 -1
  459. package/frontend/dist/js/CalendarPage-BcdAZ292.js +1 -0
  460. package/frontend/dist/js/ChannelsPage-DPr9Yajs.js +1 -0
  461. package/frontend/dist/js/ChatPage-DsbB748s.js +14 -0
  462. package/frontend/dist/js/EvaluationsPage-FWIJu2fI.js +2 -0
  463. package/frontend/dist/js/FirstTimeSetup-Cy-w6xko.js +1 -0
  464. package/frontend/dist/js/GalleryPage-DDAtxM-x.js +1 -0
  465. package/frontend/dist/js/HomePage-DLKwmE7n.js +1 -0
  466. package/frontend/dist/js/LibreClawPage-vKOj-9w9.js +1 -0
  467. package/frontend/dist/js/{ModelManagerModals-DcLGYN3l.js → ModelManagerModals-BY5TK38_.js} +1 -1
  468. package/frontend/dist/js/ModelSelector-CoCS6MZ9.js +1 -0
  469. package/frontend/dist/js/NotesPage-BElIpXgA.js +3 -0
  470. package/frontend/dist/js/OptimizedSyntaxHighlighter-xgyE3dRA.js +1 -0
  471. package/frontend/dist/js/PersonasPage-P40jVbfU.js +13 -0
  472. package/frontend/dist/js/PluginUsagePage-CKUEPCJN.js +1 -0
  473. package/frontend/dist/js/RichMessageContent-Bm2WaEGi.js +3 -0
  474. package/frontend/dist/js/SettingsModal-DxSGzx9A.js +19 -0
  475. package/frontend/dist/js/{SettingsToggle-woG_WebF.js → SettingsToggle-BIVyfGjl.js} +1 -1
  476. package/frontend/dist/js/SystemPage-BT07dTMT.js +1 -0
  477. package/frontend/dist/js/UserManagementPage-B9Vz5cm3.js +1 -0
  478. package/frontend/dist/js/WorkPage-qoN_e_jK.js +6 -0
  479. package/frontend/dist/js/api-D7Ff5M2Q.js +14 -0
  480. package/frontend/dist/js/appStore-DmV5wqDz.js +2 -0
  481. package/frontend/dist/js/ar-YHHTVP8f.js +2 -0
  482. package/frontend/dist/js/artifactHtml-DDmfpcB0.js +41 -0
  483. package/frontend/dist/js/{authStore-DbMdvNgJ.js → authStore-BYW8-kP6.js} +3 -3
  484. package/frontend/dist/js/{babel-BsYoxD-7.js → babel-DSqqk5kt.js} +1 -1
  485. package/frontend/dist/js/bn-C8VTxBVl.js +2 -0
  486. package/frontend/dist/js/chatStore-D-NTlArO.js +3 -0
  487. package/frontend/dist/js/{config-DSOYQ9a3.js → config-BqZ5304Q.js} +1 -1
  488. package/frontend/dist/js/cs-CCngB5fC.js +2 -0
  489. package/frontend/dist/js/da-CM2PP2ma.js +2 -0
  490. package/frontend/dist/js/de-BqVkD-dw.js +2 -0
  491. package/frontend/dist/js/es-BtWsWBjZ.js +2 -0
  492. package/frontend/dist/js/{estree-BcnBcOAx.js → estree-DPkpBuOU.js} +3 -3
  493. package/frontend/dist/js/evaluationsApi-Dnf2dTd-.js +1 -0
  494. package/frontend/dist/js/fr-C68w9abT.js +2 -0
  495. package/frontend/dist/js/hi-DtBlcyXZ.js +2 -0
  496. package/frontend/dist/js/{html-DkY55Jys.js → html-BpGUXG8E.js} +2 -2
  497. package/frontend/dist/js/id-BWzIu8tn.js +2 -0
  498. package/frontend/dist/js/is-yeFwu4dJ.js +2 -0
  499. package/frontend/dist/js/it-AxEMG8Jg.js +2 -0
  500. package/frontend/dist/js/ja-B-VyokB8.js +2 -0
  501. package/frontend/dist/js/ko-CvwzYr9k.js +2 -0
  502. package/frontend/dist/js/{markdown-IZSI9DXw.js → markdown-DCBRWJSK.js} +3 -3
  503. package/frontend/dist/js/markdown-core-BK7WVOb7.js +32 -0
  504. package/frontend/dist/js/{markdown-math-DK846gXU.js → markdown-math-e1ByS3KY.js} +5 -5
  505. package/frontend/dist/js/messageCodeStyles-BQwf7sSz.js +2 -0
  506. package/frontend/dist/js/ms-BhEwb4b7.js +2 -0
  507. package/frontend/dist/js/nl-Dq-QRx1L.js +2 -0
  508. package/frontend/dist/js/pl-BNEy8mQm.js +2 -0
  509. package/frontend/dist/js/{postcss-BJ0okz7n.js → postcss-Bg15EcFE.js} +1 -1
  510. package/frontend/dist/js/pt-_3Jl3FdY.js +2 -0
  511. package/frontend/dist/js/{react-vendor-C5yShNlM.js → react-vendor-BG_HPV6X.js} +1 -1
  512. package/frontend/dist/js/router-vendor-CbexJIsv.js +1 -0
  513. package/frontend/dist/js/ru-IhQiJ8ta.js +2 -0
  514. package/frontend/dist/js/{standalone-Csw3jfJ_.js → standalone-BFrK0R2A.js} +3 -3
  515. package/frontend/dist/js/sv-DWunXUNz.js +2 -0
  516. package/frontend/dist/js/{syntax-highlight-3EEX6CGL.js → syntax-highlight-P2zo9o06.js} +4 -4
  517. package/frontend/dist/js/th-DVnW2yyh.js +2 -0
  518. package/frontend/dist/js/tr-Do8CFmhR.js +2 -0
  519. package/frontend/dist/js/{typescript-CnF4UVx7.js → typescript-DYVyvmm_.js} +1 -1
  520. package/frontend/dist/js/ui-db9meqAB.js +2 -0
  521. package/frontend/dist/js/ui-vendor-C0DZ8-Cm.js +177 -0
  522. package/frontend/dist/js/uk-BNPKIZga.js +2 -0
  523. package/frontend/dist/js/{useTranslation-Bho4HCyg.js → useTranslation-5b5UhAc9.js} +1 -1
  524. package/frontend/dist/js/{utils-D9W1Lnkn.js → utils-BGrdX9ie.js} +1 -1
  525. package/frontend/dist/js/{utils-vendor-DWh39_3x.js → utils-vendor-9bQ62WeD.js} +1 -1
  526. package/frontend/dist/js/vi-CZMFo9je.js +2 -0
  527. package/frontend/dist/js/{workApi-C3uy9EDT.js → workApi-CcprMH_1.js} +3 -3
  528. package/frontend/dist/js/{yaml-DzT5hBSH.js → yaml-DUeWcOOH.js} +2 -2
  529. package/frontend/dist/js/zh-Pg0881v0.js +2 -0
  530. package/frontend/dist/manifest.webmanifest +32 -0
  531. package/frontend/dist/sw.js +125 -0
  532. package/package.json +2 -2
  533. package/plugins/openai.json +52 -9
  534. package/frontend/dist/assets/index-6o-Hc2wS.js +0 -41
  535. package/frontend/dist/assets/index-D-pM957b.css +0 -1
  536. package/frontend/dist/js/ArtifactContainer-CpUi6ekF.js +0 -1
  537. package/frontend/dist/js/ArtifactSandboxFrame-qsj_Y3LV.js +0 -151
  538. package/frontend/dist/js/ArtifactSlideOutPanel-CSFRluWA.js +0 -1
  539. package/frontend/dist/js/AutomationsPage-KUeWoZNv.js +0 -1
  540. package/frontend/dist/js/CalendarPage-D9I972w8.js +0 -1
  541. package/frontend/dist/js/ChatPage-CmBx4oAL.js +0 -16
  542. package/frontend/dist/js/FirstTimeSetup-Df0YJni3.js +0 -1
  543. package/frontend/dist/js/GalleryPage-bLCrdJN_.js +0 -1
  544. package/frontend/dist/js/HomePage-Uc6PEg-U.js +0 -1
  545. package/frontend/dist/js/LibreClawPage-CG63DHg1.js +0 -1
  546. package/frontend/dist/js/ModelSelector-yxJC64rM.js +0 -1
  547. package/frontend/dist/js/ModelsPage-1R_TxgmJ.js +0 -2
  548. package/frontend/dist/js/NotesPage-L65j5HoW.js +0 -1
  549. package/frontend/dist/js/OptimizedSyntaxHighlighter-Dz7D1LPB.js +0 -1
  550. package/frontend/dist/js/PersonasPage-CKeBpHIH.js +0 -13
  551. package/frontend/dist/js/PluginUsagePage-BX1SKMbW.js +0 -1
  552. package/frontend/dist/js/RichMessageContent-DiySVYGB.js +0 -3
  553. package/frontend/dist/js/SettingsModal-68SG1uZ2.js +0 -1
  554. package/frontend/dist/js/SystemPage-CytpZiQV.js +0 -1
  555. package/frontend/dist/js/UserManagementPage-BzJBvZiS.js +0 -1
  556. package/frontend/dist/js/WorkPage-C8gr0QJe.js +0 -6
  557. package/frontend/dist/js/api-BDtqBtqw.js +0 -14
  558. package/frontend/dist/js/appStore-0JnCUlEq.js +0 -2
  559. package/frontend/dist/js/ar-CSpi37Gr.js +0 -2
  560. package/frontend/dist/js/bn-CyH1BeDD.js +0 -2
  561. package/frontend/dist/js/chatStore-CHQ2uINS.js +0 -3
  562. package/frontend/dist/js/cs-Cv2NfRK5.js +0 -2
  563. package/frontend/dist/js/da-D6D6IvPK.js +0 -2
  564. package/frontend/dist/js/de-BNoJJTrT.js +0 -2
  565. package/frontend/dist/js/es-kzo9C7q_.js +0 -2
  566. package/frontend/dist/js/fr-CjHYvJRp.js +0 -2
  567. package/frontend/dist/js/hi-BU98AdCQ.js +0 -2
  568. package/frontend/dist/js/id-CpdedejX.js +0 -2
  569. package/frontend/dist/js/is-Cp5dDWBH.js +0 -2
  570. package/frontend/dist/js/it-CuH_cK4U.js +0 -2
  571. package/frontend/dist/js/ja-BWXXXiHn.js +0 -2
  572. package/frontend/dist/js/ko-DQgv2M1t.js +0 -2
  573. package/frontend/dist/js/markdown-core-BmPPZiuD.js +0 -31
  574. package/frontend/dist/js/messageCodeStyles-BFNR9Wv6.js +0 -2
  575. package/frontend/dist/js/ms-DCcRoIcX.js +0 -2
  576. package/frontend/dist/js/nl-CbKR1_EU.js +0 -2
  577. package/frontend/dist/js/pl-CRyJZccn.js +0 -2
  578. package/frontend/dist/js/pt-BXYmHFGH.js +0 -2
  579. package/frontend/dist/js/router-vendor-DGFGM3EP.js +0 -1
  580. package/frontend/dist/js/ru-M9SyZG4b.js +0 -2
  581. package/frontend/dist/js/sv-DJ486LTU.js +0 -2
  582. package/frontend/dist/js/th-Ch7gKtZv.js +0 -2
  583. package/frontend/dist/js/tr-ClehWhSC.js +0 -2
  584. package/frontend/dist/js/ui-CC-K19wO.js +0 -2
  585. package/frontend/dist/js/ui-vendor-B1UgO3vd.js +0 -177
  586. package/frontend/dist/js/uk-BqAd5zHF.js +0 -2
  587. package/frontend/dist/js/vi-D9gjlDVB.js +0 -2
  588. package/frontend/dist/js/zh-DKTyHkiR.js +0 -2
@@ -745,6 +745,319 @@ const PERSONAL_AUTOMATIONS_REQUIRED_SCHEMA = {
745
745
  'created_at',
746
746
  ],
747
747
  };
748
+ const AGENT_FOUNDATION_REQUIRED_SCHEMA = {
749
+ personas: ['bindings'],
750
+ tool_servers: [
751
+ 'id',
752
+ 'user_id',
753
+ 'name',
754
+ 'description',
755
+ 'kind',
756
+ 'base_url',
757
+ 'spec',
758
+ 'spec_digest',
759
+ 'spec_revision',
760
+ 'auth_mode',
761
+ 'auth_header',
762
+ 'access_mode',
763
+ 'enabled',
764
+ 'timeout_ms',
765
+ 'max_response_bytes',
766
+ 'created_at',
767
+ 'updated_at',
768
+ ],
769
+ tool_server_tools: [
770
+ 'id',
771
+ 'server_id',
772
+ 'name',
773
+ 'description',
774
+ 'params_schema',
775
+ 'detail',
776
+ 'side_effect',
777
+ 'enabled',
778
+ 'created_at',
779
+ 'updated_at',
780
+ ],
781
+ tool_server_credentials: [
782
+ 'id',
783
+ 'server_id',
784
+ 'user_id',
785
+ 'secret',
786
+ 'created_at',
787
+ 'updated_at',
788
+ ],
789
+ tool_approvals: [
790
+ 'id',
791
+ 'user_id',
792
+ 'session_id',
793
+ 'server_id',
794
+ 'tool_name',
795
+ 'call_id',
796
+ 'arguments_digest',
797
+ 'scope',
798
+ 'status',
799
+ 'created_at',
800
+ 'resolved_at',
801
+ 'expires_at',
802
+ ],
803
+ prompts: [
804
+ 'id',
805
+ 'user_id',
806
+ 'slug',
807
+ 'title',
808
+ 'description',
809
+ 'content',
810
+ 'variables',
811
+ 'tags',
812
+ 'version',
813
+ 'created_at',
814
+ 'updated_at',
815
+ ],
816
+ prompt_versions: [
817
+ 'id',
818
+ 'prompt_id',
819
+ 'version',
820
+ 'content',
821
+ 'variables',
822
+ 'created_at',
823
+ ],
824
+ skills: [
825
+ 'id',
826
+ 'user_id',
827
+ 'slug',
828
+ 'name',
829
+ 'description',
830
+ 'instructions',
831
+ 'enabled',
832
+ 'version',
833
+ 'created_at',
834
+ 'updated_at',
835
+ ],
836
+ skill_versions: ['id', 'skill_id', 'version', 'instructions', 'created_at'],
837
+ };
838
+ const SKILL_FILES_REQUIRED_SCHEMA = {
839
+ skill_files: [
840
+ 'id',
841
+ 'skill_id',
842
+ 'path',
843
+ 'content',
844
+ 'size',
845
+ 'created_at',
846
+ 'updated_at',
847
+ ],
848
+ };
849
+ const NOTES_V2_REQUIRED_SCHEMA = {
850
+ notes: ['pinned'],
851
+ note_revisions: ['id', 'note_id', 'title', 'content', 'created_at'],
852
+ note_attachments: [
853
+ 'id',
854
+ 'note_id',
855
+ 'blob_id',
856
+ 'filename',
857
+ 'content_type',
858
+ 'size',
859
+ 'created_at',
860
+ ],
861
+ };
862
+ const TEAM_COLLABORATION_REQUIRED_SCHEMA = {
863
+ calendar_events: [
864
+ 'calendar_id',
865
+ 'reminder_minutes',
866
+ 'last_reminded_occurrence',
867
+ ],
868
+ calendars: ['id', 'user_id', 'name', 'color', 'created_at', 'updated_at'],
869
+ channels: [
870
+ 'id',
871
+ 'type',
872
+ 'name',
873
+ 'description',
874
+ 'dm_key',
875
+ 'created_by',
876
+ 'created_at',
877
+ 'updated_at',
878
+ 'archived_at',
879
+ ],
880
+ channel_members: [
881
+ 'channel_id',
882
+ 'user_id',
883
+ 'role',
884
+ 'joined_at',
885
+ 'last_read_at',
886
+ ],
887
+ channel_messages: [
888
+ 'id',
889
+ 'channel_id',
890
+ 'user_id',
891
+ 'parent_id',
892
+ 'author_kind',
893
+ 'model',
894
+ 'content',
895
+ 'metadata',
896
+ 'created_at',
897
+ 'updated_at',
898
+ 'edited_at',
899
+ 'deleted_at',
900
+ 'pinned_at',
901
+ 'pinned_by',
902
+ ],
903
+ channel_reactions: ['id', 'message_id', 'user_id', 'emoji', 'created_at'],
904
+ channel_attachments: [
905
+ 'id',
906
+ 'message_id',
907
+ 'channel_id',
908
+ 'blob_id',
909
+ 'filename',
910
+ 'content_type',
911
+ 'size',
912
+ 'created_by',
913
+ 'created_at',
914
+ ],
915
+ notifications: [
916
+ 'id',
917
+ 'user_id',
918
+ 'type',
919
+ 'title',
920
+ 'body',
921
+ 'href',
922
+ 'source_key',
923
+ 'created_at',
924
+ 'read_at',
925
+ ],
926
+ webhook_targets: [
927
+ 'id',
928
+ 'name',
929
+ 'url',
930
+ 'secret',
931
+ 'events',
932
+ 'enabled',
933
+ 'created_by',
934
+ 'created_at',
935
+ 'updated_at',
936
+ ],
937
+ };
938
+ const MEDIA_ENTERPRISE_OPS_REQUIRED_SCHEMA = {
939
+ voice_profiles: [
940
+ 'consent_expires_at',
941
+ 'revoked_at',
942
+ 'transfer_count',
943
+ 'last_transfer_at',
944
+ ],
945
+ model_tariffs: [
946
+ 'id',
947
+ 'plugin_id',
948
+ 'model',
949
+ 'input_per_million',
950
+ 'output_per_million',
951
+ 'unit_price',
952
+ 'currency',
953
+ 'effective_from',
954
+ 'created_by',
955
+ 'created_at',
956
+ ],
957
+ usage_budgets: [
958
+ 'id',
959
+ 'name',
960
+ 'principal_type',
961
+ 'principal_id',
962
+ 'period',
963
+ 'amount_usd',
964
+ 'mode',
965
+ 'created_by',
966
+ 'created_at',
967
+ 'updated_at',
968
+ ],
969
+ message_feedback: [
970
+ 'id',
971
+ 'user_id',
972
+ 'session_id',
973
+ 'message_id',
974
+ 'rating',
975
+ 'tags',
976
+ 'comment',
977
+ 'model',
978
+ 'plugin_id',
979
+ 'snapshot',
980
+ 'created_at',
981
+ 'updated_at',
982
+ ],
983
+ arena_votes: [
984
+ 'id',
985
+ 'user_id',
986
+ 'compare_group',
987
+ 'model_a',
988
+ 'model_b',
989
+ 'winner',
990
+ 'created_at',
991
+ ],
992
+ eval_sets: [
993
+ 'id',
994
+ 'user_id',
995
+ 'name',
996
+ 'description',
997
+ 'items',
998
+ 'created_at',
999
+ 'updated_at',
1000
+ ],
1001
+ eval_runs: [
1002
+ 'id',
1003
+ 'set_id',
1004
+ 'user_id',
1005
+ 'label',
1006
+ 'plugin_id',
1007
+ 'model',
1008
+ 'status',
1009
+ 'results',
1010
+ 'error',
1011
+ 'created_at',
1012
+ 'updated_at',
1013
+ 'completed_at',
1014
+ ],
1015
+ };
1016
+ const MFA_PUSH_RECOVERY_REQUIRED_SCHEMA = {
1017
+ user_mfa: [
1018
+ 'user_id',
1019
+ 'totp_secret',
1020
+ 'activated_at',
1021
+ 'last_used_step',
1022
+ 'created_at',
1023
+ 'updated_at',
1024
+ ],
1025
+ mfa_recovery_codes: ['id', 'user_id', 'code_lookup', 'created_at', 'used_at'],
1026
+ webauthn_credentials: [
1027
+ 'id',
1028
+ 'user_id',
1029
+ 'credential_lookup',
1030
+ 'credential_data',
1031
+ 'name',
1032
+ 'sign_count',
1033
+ 'created_at',
1034
+ 'last_used_at',
1035
+ ],
1036
+ push_subscriptions: [
1037
+ 'id',
1038
+ 'user_id',
1039
+ 'session_id',
1040
+ 'endpoint_lookup',
1041
+ 'subscription',
1042
+ 'user_agent',
1043
+ 'created_at',
1044
+ 'last_used_at',
1045
+ ],
1046
+ recovery_drills: [
1047
+ 'id',
1048
+ 'status',
1049
+ 'origin',
1050
+ 'started_at',
1051
+ 'finished_at',
1052
+ 'snapshot_bytes',
1053
+ 'rpo_seconds',
1054
+ 'restore_ms',
1055
+ 'error',
1056
+ 'report',
1057
+ 'created_by',
1058
+ 'created_at',
1059
+ ],
1060
+ };
748
1061
  export const IDENTITY_EMAIL_LOOKUP_SCHEMA_SQL = `
749
1062
  ALTER TABLE users ADD COLUMN email_lookup TEXT;
750
1063
  CREATE UNIQUE INDEX idx_users_email_lookup
@@ -1016,83 +1329,577 @@ export const PERSONAL_AUTOMATIONS_SCHEMA_SQL = `
1016
1329
  CREATE INDEX IF NOT EXISTS idx_automation_runs_owner_time
1017
1330
  ON automation_runs(user_id, scheduled_for);
1018
1331
  `;
1019
- const REQUIRED_SCHEMA = {
1020
- ...LEGACY_REQUIRED_SCHEMA,
1021
- users: [
1022
- ...LEGACY_REQUIRED_SCHEMA.users,
1023
- ...IDENTITY_EMAIL_LOOKUP_REQUIRED_SCHEMA.users,
1024
- ],
1025
- voice_profiles: [
1026
- ...LEGACY_REQUIRED_SCHEMA.voice_profiles,
1027
- ...VOICE_PROFILE_NAME_LOOKUP_REQUIRED_SCHEMA.voice_profiles,
1028
- ],
1029
- ...PLATFORM_VECTOR_REQUIRED_SCHEMA,
1030
- ...DURABLE_JOBS_EVENTS_REQUIRED_SCHEMA,
1031
- ...BLOB_REFERENCE_REQUIRED_SCHEMA,
1032
- ...PLUGIN_DEFINITION_REQUIRED_SCHEMA,
1033
- };
1034
- const LEGACY_ADDITIVE_COLUMNS = {
1035
- users: ['avatar', 'account_status', 'approved_at', 'approved_by'],
1036
- personas: ['embedding_model', 'memory_settings', 'mutation_settings'],
1037
- sessions: [
1038
- 'persona_id',
1039
- 'provider_type',
1040
- 'provider_id',
1041
- 'archived',
1042
- 'settings',
1043
- 'folder_id',
1044
- 'pinned',
1045
- ],
1046
- session_messages: [
1047
- 'thinking',
1048
- 'model',
1049
- 'provider_metadata',
1050
- 'images',
1051
- 'statistics',
1052
- 'artifacts',
1053
- 'parent_id',
1054
- 'branch_index',
1055
- 'is_active',
1056
- 'rating',
1057
- ],
1058
- documents: ['file_type', 'size', 'session_id', 'collection_id'],
1059
- plugin_credentials: ['routing_auth_fingerprint'],
1060
- plugin_definition_approvals: ['source_path'],
1061
- generated_images: ['kind', 'plugin_id', 'mime_type', 'metadata'],
1062
- voice_profiles: ['routing_fingerprint'],
1063
- work_tasks: ['provider_type', 'provider_id', 'host_path', 'policy_id'],
1064
- work_runs: ['provider_type', 'provider_id'],
1065
- persona_memories: [
1066
- 'memory_type',
1067
- 'access_count',
1068
- 'last_accessed',
1069
- 'decay_factor',
1070
- 'consolidated_from',
1071
- ],
1072
- };
1073
- const LEGACY_BOOTSTRAP_CORE_TABLES = [
1074
- 'users',
1075
- 'sessions',
1076
- 'session_messages',
1077
- 'documents',
1078
- 'document_chunks',
1079
- 'user_preferences',
1080
- 'system_settings',
1081
- 'personas',
1082
- ];
1083
- const addColumnIfMissing = (database, table, column, definition) => {
1084
- const columns = database
1085
- .prepare(`PRAGMA table_info(${table})`)
1086
- .all();
1087
- if (!columns.some(item => item.name === column)) {
1088
- database.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
1089
- }
1090
- };
1091
- const ensurePersonaPersistence = (database) => {
1092
- database.exec(`
1093
- CREATE TABLE IF NOT EXISTS persona_memories (
1094
- id TEXT PRIMARY KEY,
1095
- user_id TEXT NOT NULL,
1332
+ export const AGENT_FOUNDATION_TABLES_SQL = `
1333
+ CREATE TABLE IF NOT EXISTS tool_servers (
1334
+ id TEXT PRIMARY KEY,
1335
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1336
+ name TEXT NOT NULL,
1337
+ description TEXT,
1338
+ kind TEXT NOT NULL CHECK (kind IN ('openapi', 'mcp')),
1339
+ base_url TEXT NOT NULL,
1340
+ spec TEXT,
1341
+ spec_digest TEXT,
1342
+ spec_revision INTEGER NOT NULL DEFAULT 1,
1343
+ auth_mode TEXT NOT NULL CHECK (auth_mode IN ('none', 'bearer', 'header')),
1344
+ auth_header TEXT,
1345
+ access_mode TEXT NOT NULL
1346
+ CHECK (access_mode IN ('admins-only', 'all-users', 'granted')),
1347
+ enabled INTEGER NOT NULL DEFAULT 1,
1348
+ timeout_ms INTEGER NOT NULL,
1349
+ max_response_bytes INTEGER NOT NULL,
1350
+ created_at INTEGER NOT NULL,
1351
+ updated_at INTEGER NOT NULL
1352
+ );
1353
+
1354
+ CREATE INDEX IF NOT EXISTS idx_tool_servers_updated
1355
+ ON tool_servers(updated_at);
1356
+
1357
+ CREATE TABLE IF NOT EXISTS tool_server_tools (
1358
+ id TEXT PRIMARY KEY,
1359
+ server_id TEXT NOT NULL REFERENCES tool_servers(id) ON DELETE CASCADE,
1360
+ name TEXT NOT NULL,
1361
+ description TEXT,
1362
+ params_schema TEXT,
1363
+ detail TEXT,
1364
+ side_effect INTEGER NOT NULL DEFAULT 1,
1365
+ enabled INTEGER NOT NULL DEFAULT 1,
1366
+ created_at INTEGER NOT NULL,
1367
+ updated_at INTEGER NOT NULL,
1368
+ UNIQUE (server_id, name)
1369
+ );
1370
+
1371
+ CREATE TABLE IF NOT EXISTS tool_server_credentials (
1372
+ id TEXT PRIMARY KEY,
1373
+ server_id TEXT NOT NULL REFERENCES tool_servers(id) ON DELETE CASCADE,
1374
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1375
+ secret TEXT NOT NULL,
1376
+ created_at INTEGER NOT NULL,
1377
+ updated_at INTEGER NOT NULL,
1378
+ UNIQUE (server_id, user_id)
1379
+ );
1380
+
1381
+ CREATE TABLE IF NOT EXISTS tool_approvals (
1382
+ id TEXT PRIMARY KEY,
1383
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1384
+ session_id TEXT REFERENCES sessions(id) ON DELETE CASCADE,
1385
+ server_id TEXT REFERENCES tool_servers(id) ON DELETE CASCADE,
1386
+ tool_name TEXT NOT NULL,
1387
+ call_id TEXT,
1388
+ arguments_digest TEXT,
1389
+ scope TEXT NOT NULL CHECK (scope IN ('once', 'session', 'always')),
1390
+ status TEXT NOT NULL
1391
+ CHECK (status IN ('pending', 'approved', 'denied', 'expired')),
1392
+ created_at INTEGER NOT NULL,
1393
+ resolved_at INTEGER,
1394
+ expires_at INTEGER
1395
+ );
1396
+
1397
+ CREATE INDEX IF NOT EXISTS idx_tool_approvals_owner
1398
+ ON tool_approvals(user_id, status, created_at);
1399
+
1400
+ CREATE TABLE IF NOT EXISTS prompts (
1401
+ id TEXT PRIMARY KEY,
1402
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1403
+ slug TEXT NOT NULL,
1404
+ title TEXT NOT NULL,
1405
+ description TEXT,
1406
+ content TEXT NOT NULL,
1407
+ variables TEXT,
1408
+ tags TEXT,
1409
+ version INTEGER NOT NULL DEFAULT 1,
1410
+ created_at INTEGER NOT NULL,
1411
+ updated_at INTEGER NOT NULL,
1412
+ UNIQUE (user_id, slug)
1413
+ );
1414
+
1415
+ CREATE INDEX IF NOT EXISTS idx_prompts_owner
1416
+ ON prompts(user_id, updated_at);
1417
+
1418
+ CREATE TABLE IF NOT EXISTS prompt_versions (
1419
+ id TEXT PRIMARY KEY,
1420
+ prompt_id TEXT NOT NULL REFERENCES prompts(id) ON DELETE CASCADE,
1421
+ version INTEGER NOT NULL,
1422
+ content TEXT NOT NULL,
1423
+ variables TEXT,
1424
+ created_at INTEGER NOT NULL,
1425
+ UNIQUE (prompt_id, version)
1426
+ );
1427
+
1428
+ CREATE TABLE IF NOT EXISTS skills (
1429
+ id TEXT PRIMARY KEY,
1430
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1431
+ slug TEXT NOT NULL,
1432
+ name TEXT NOT NULL,
1433
+ description TEXT NOT NULL,
1434
+ instructions TEXT NOT NULL,
1435
+ enabled INTEGER NOT NULL DEFAULT 1,
1436
+ version INTEGER NOT NULL DEFAULT 1,
1437
+ created_at INTEGER NOT NULL,
1438
+ updated_at INTEGER NOT NULL,
1439
+ UNIQUE (user_id, slug)
1440
+ );
1441
+
1442
+ CREATE INDEX IF NOT EXISTS idx_skills_owner
1443
+ ON skills(user_id, updated_at);
1444
+
1445
+ CREATE TABLE IF NOT EXISTS skill_versions (
1446
+ id TEXT PRIMARY KEY,
1447
+ skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
1448
+ version INTEGER NOT NULL,
1449
+ instructions TEXT NOT NULL,
1450
+ created_at INTEGER NOT NULL,
1451
+ UNIQUE (skill_id, version)
1452
+ );
1453
+ `;
1454
+ export const AGENT_FOUNDATION_SCHEMA_SQL = `
1455
+ ALTER TABLE personas ADD COLUMN bindings TEXT;
1456
+ ${AGENT_FOUNDATION_TABLES_SQL}`;
1457
+ export const SKILL_FILES_SCHEMA_SQL = `
1458
+ CREATE TABLE IF NOT EXISTS skill_files (
1459
+ id TEXT PRIMARY KEY,
1460
+ skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
1461
+ path TEXT NOT NULL,
1462
+ content TEXT NOT NULL,
1463
+ size INTEGER NOT NULL,
1464
+ created_at INTEGER NOT NULL,
1465
+ updated_at INTEGER NOT NULL,
1466
+ UNIQUE (skill_id, path)
1467
+ );
1468
+
1469
+ CREATE INDEX IF NOT EXISTS idx_skill_files_skill
1470
+ ON skill_files(skill_id);
1471
+ `;
1472
+ export const NOTES_V2_TABLES_SQL = `
1473
+ CREATE TABLE IF NOT EXISTS note_revisions (
1474
+ id TEXT PRIMARY KEY,
1475
+ note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
1476
+ title TEXT NOT NULL,
1477
+ content TEXT NOT NULL,
1478
+ created_at INTEGER NOT NULL
1479
+ );
1480
+
1481
+ CREATE INDEX IF NOT EXISTS idx_note_revisions_note
1482
+ ON note_revisions(note_id, created_at);
1483
+
1484
+ CREATE TABLE IF NOT EXISTS note_attachments (
1485
+ id TEXT PRIMARY KEY,
1486
+ note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
1487
+ blob_id TEXT NOT NULL,
1488
+ filename TEXT NOT NULL,
1489
+ content_type TEXT NOT NULL,
1490
+ size INTEGER NOT NULL,
1491
+ created_at INTEGER NOT NULL
1492
+ );
1493
+
1494
+ CREATE INDEX IF NOT EXISTS idx_note_attachments_note
1495
+ ON note_attachments(note_id);
1496
+ `;
1497
+ export const NOTES_V2_SCHEMA_SQL = `
1498
+ ALTER TABLE notes ADD COLUMN pinned INTEGER DEFAULT 0;
1499
+
1500
+ CREATE TABLE IF NOT EXISTS note_revisions (
1501
+ id TEXT PRIMARY KEY,
1502
+ note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
1503
+ title TEXT NOT NULL,
1504
+ content TEXT NOT NULL,
1505
+ created_at INTEGER NOT NULL
1506
+ );
1507
+
1508
+ CREATE INDEX IF NOT EXISTS idx_note_revisions_note
1509
+ ON note_revisions(note_id, created_at);
1510
+
1511
+ CREATE TABLE IF NOT EXISTS note_attachments (
1512
+ id TEXT PRIMARY KEY,
1513
+ note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
1514
+ blob_id TEXT NOT NULL,
1515
+ filename TEXT NOT NULL,
1516
+ content_type TEXT NOT NULL,
1517
+ size INTEGER NOT NULL,
1518
+ created_at INTEGER NOT NULL
1519
+ );
1520
+
1521
+ CREATE INDEX IF NOT EXISTS idx_note_attachments_note
1522
+ ON note_attachments(note_id);
1523
+ `;
1524
+ export const TEAM_COLLABORATION_TABLES_SQL = `
1525
+ CREATE INDEX IF NOT EXISTS idx_calendar_scoped_events
1526
+ ON calendar_events(calendar_id)
1527
+ WHERE calendar_id IS NOT NULL;
1528
+
1529
+ CREATE TABLE IF NOT EXISTS calendars (
1530
+ id TEXT PRIMARY KEY,
1531
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1532
+ name TEXT NOT NULL,
1533
+ color TEXT,
1534
+ created_at INTEGER NOT NULL,
1535
+ updated_at INTEGER NOT NULL
1536
+ );
1537
+
1538
+ CREATE INDEX IF NOT EXISTS idx_calendars_owner
1539
+ ON calendars(user_id, updated_at);
1540
+
1541
+ CREATE TABLE IF NOT EXISTS channels (
1542
+ id TEXT PRIMARY KEY,
1543
+ type TEXT NOT NULL CHECK (type IN ('public', 'private', 'dm')),
1544
+ name TEXT NOT NULL,
1545
+ description TEXT,
1546
+ dm_key TEXT,
1547
+ created_by TEXT,
1548
+ created_at INTEGER NOT NULL,
1549
+ updated_at INTEGER NOT NULL,
1550
+ archived_at INTEGER
1551
+ );
1552
+
1553
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_channels_dm_key
1554
+ ON channels(dm_key)
1555
+ WHERE dm_key IS NOT NULL;
1556
+
1557
+ CREATE TABLE IF NOT EXISTS channel_members (
1558
+ channel_id TEXT NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
1559
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1560
+ role TEXT NOT NULL CHECK (role IN ('owner', 'member')),
1561
+ joined_at INTEGER NOT NULL,
1562
+ last_read_at INTEGER NOT NULL DEFAULT 0,
1563
+ PRIMARY KEY (channel_id, user_id)
1564
+ );
1565
+
1566
+ CREATE INDEX IF NOT EXISTS idx_channel_members_user
1567
+ ON channel_members(user_id);
1568
+
1569
+ CREATE TABLE IF NOT EXISTS channel_messages (
1570
+ id TEXT PRIMARY KEY,
1571
+ channel_id TEXT NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
1572
+ user_id TEXT,
1573
+ parent_id TEXT,
1574
+ author_kind TEXT NOT NULL DEFAULT 'user' CHECK (author_kind IN ('user', 'model')),
1575
+ model TEXT,
1576
+ content TEXT NOT NULL,
1577
+ metadata TEXT,
1578
+ created_at INTEGER NOT NULL,
1579
+ updated_at INTEGER NOT NULL,
1580
+ edited_at INTEGER,
1581
+ deleted_at INTEGER,
1582
+ pinned_at INTEGER,
1583
+ pinned_by TEXT
1584
+ );
1585
+
1586
+ CREATE INDEX IF NOT EXISTS idx_channel_messages_timeline
1587
+ ON channel_messages(channel_id, created_at, id);
1588
+
1589
+ CREATE INDEX IF NOT EXISTS idx_channel_messages_thread
1590
+ ON channel_messages(parent_id)
1591
+ WHERE parent_id IS NOT NULL;
1592
+
1593
+ CREATE TABLE IF NOT EXISTS channel_reactions (
1594
+ id TEXT PRIMARY KEY,
1595
+ message_id TEXT NOT NULL REFERENCES channel_messages(id) ON DELETE CASCADE,
1596
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1597
+ emoji TEXT NOT NULL,
1598
+ created_at INTEGER NOT NULL,
1599
+ UNIQUE (message_id, user_id, emoji)
1600
+ );
1601
+
1602
+ CREATE TABLE IF NOT EXISTS channel_attachments (
1603
+ id TEXT PRIMARY KEY,
1604
+ message_id TEXT NOT NULL REFERENCES channel_messages(id) ON DELETE CASCADE,
1605
+ channel_id TEXT NOT NULL,
1606
+ blob_id TEXT NOT NULL,
1607
+ filename TEXT NOT NULL,
1608
+ content_type TEXT NOT NULL,
1609
+ size INTEGER NOT NULL,
1610
+ created_by TEXT,
1611
+ created_at INTEGER NOT NULL
1612
+ );
1613
+
1614
+ CREATE INDEX IF NOT EXISTS idx_channel_attachments_message
1615
+ ON channel_attachments(message_id);
1616
+
1617
+ CREATE TABLE IF NOT EXISTS notifications (
1618
+ id TEXT PRIMARY KEY,
1619
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1620
+ type TEXT NOT NULL,
1621
+ title TEXT NOT NULL,
1622
+ body TEXT,
1623
+ href TEXT,
1624
+ source_key TEXT,
1625
+ created_at INTEGER NOT NULL,
1626
+ read_at INTEGER
1627
+ );
1628
+
1629
+ CREATE INDEX IF NOT EXISTS idx_notifications_user
1630
+ ON notifications(user_id, created_at);
1631
+
1632
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_notifications_dedupe
1633
+ ON notifications(user_id, source_key)
1634
+ WHERE source_key IS NOT NULL;
1635
+
1636
+ CREATE TABLE IF NOT EXISTS webhook_targets (
1637
+ id TEXT PRIMARY KEY,
1638
+ name TEXT NOT NULL,
1639
+ url TEXT NOT NULL,
1640
+ secret TEXT,
1641
+ events TEXT NOT NULL,
1642
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
1643
+ created_by TEXT,
1644
+ created_at INTEGER NOT NULL,
1645
+ updated_at INTEGER NOT NULL
1646
+ );
1647
+ `;
1648
+ export const TEAM_COLLABORATION_SCHEMA_SQL = `
1649
+ ALTER TABLE calendar_events ADD COLUMN calendar_id TEXT;
1650
+ ALTER TABLE calendar_events ADD COLUMN reminder_minutes INTEGER;
1651
+ ALTER TABLE calendar_events ADD COLUMN last_reminded_occurrence INTEGER;
1652
+ ${TEAM_COLLABORATION_TABLES_SQL}`;
1653
+ export const MEDIA_ENTERPRISE_OPS_TABLES_SQL = `
1654
+ CREATE TABLE IF NOT EXISTS model_tariffs (
1655
+ id TEXT PRIMARY KEY,
1656
+ plugin_id TEXT NOT NULL,
1657
+ model TEXT,
1658
+ input_per_million REAL,
1659
+ output_per_million REAL,
1660
+ unit_price REAL,
1661
+ currency TEXT NOT NULL DEFAULT 'USD',
1662
+ effective_from INTEGER NOT NULL,
1663
+ created_by TEXT,
1664
+ created_at INTEGER NOT NULL
1665
+ );
1666
+
1667
+ CREATE INDEX IF NOT EXISTS idx_model_tariffs_lookup
1668
+ ON model_tariffs(plugin_id, model, effective_from);
1669
+
1670
+ CREATE TABLE IF NOT EXISTS usage_budgets (
1671
+ id TEXT PRIMARY KEY,
1672
+ name TEXT NOT NULL,
1673
+ principal_type TEXT NOT NULL CHECK (principal_type IN ('instance', 'user', 'group')),
1674
+ principal_id TEXT,
1675
+ period TEXT NOT NULL CHECK (period IN ('daily', 'weekly', 'monthly')),
1676
+ amount_usd REAL NOT NULL,
1677
+ mode TEXT NOT NULL CHECK (mode IN ('observe', 'soft', 'hard')),
1678
+ created_by TEXT,
1679
+ created_at INTEGER NOT NULL,
1680
+ updated_at INTEGER NOT NULL
1681
+ );
1682
+
1683
+ CREATE INDEX IF NOT EXISTS idx_usage_budgets_principal
1684
+ ON usage_budgets(principal_type, principal_id);
1685
+
1686
+ CREATE TABLE IF NOT EXISTS message_feedback (
1687
+ id TEXT PRIMARY KEY,
1688
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1689
+ session_id TEXT NOT NULL,
1690
+ message_id TEXT NOT NULL,
1691
+ rating INTEGER NOT NULL CHECK (rating IN (-1, 1)),
1692
+ tags TEXT,
1693
+ comment TEXT,
1694
+ model TEXT,
1695
+ plugin_id TEXT,
1696
+ snapshot TEXT,
1697
+ created_at INTEGER NOT NULL,
1698
+ updated_at INTEGER NOT NULL,
1699
+ UNIQUE (user_id, message_id)
1700
+ );
1701
+
1702
+ CREATE INDEX IF NOT EXISTS idx_message_feedback_owner
1703
+ ON message_feedback(user_id, created_at);
1704
+
1705
+ CREATE TABLE IF NOT EXISTS arena_votes (
1706
+ id TEXT PRIMARY KEY,
1707
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1708
+ compare_group TEXT NOT NULL,
1709
+ model_a TEXT NOT NULL,
1710
+ model_b TEXT NOT NULL,
1711
+ winner TEXT NOT NULL CHECK (winner IN ('a', 'b', 'tie', 'both-bad')),
1712
+ created_at INTEGER NOT NULL,
1713
+ UNIQUE (user_id, compare_group)
1714
+ );
1715
+
1716
+ CREATE INDEX IF NOT EXISTS idx_arena_votes_order
1717
+ ON arena_votes(created_at, id);
1718
+
1719
+ CREATE TABLE IF NOT EXISTS eval_sets (
1720
+ id TEXT PRIMARY KEY,
1721
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1722
+ name TEXT NOT NULL,
1723
+ description TEXT,
1724
+ items TEXT NOT NULL,
1725
+ created_at INTEGER NOT NULL,
1726
+ updated_at INTEGER NOT NULL
1727
+ );
1728
+
1729
+ CREATE INDEX IF NOT EXISTS idx_eval_sets_owner
1730
+ ON eval_sets(user_id, updated_at);
1731
+
1732
+ CREATE TABLE IF NOT EXISTS eval_runs (
1733
+ id TEXT PRIMARY KEY,
1734
+ set_id TEXT NOT NULL REFERENCES eval_sets(id) ON DELETE CASCADE,
1735
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1736
+ label TEXT,
1737
+ plugin_id TEXT,
1738
+ model TEXT NOT NULL,
1739
+ status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'completed', 'failed', 'cancelled')),
1740
+ results TEXT,
1741
+ error TEXT,
1742
+ created_at INTEGER NOT NULL,
1743
+ updated_at INTEGER NOT NULL,
1744
+ completed_at INTEGER
1745
+ );
1746
+
1747
+ CREATE INDEX IF NOT EXISTS idx_eval_runs_owner
1748
+ ON eval_runs(user_id, created_at);
1749
+
1750
+ CREATE INDEX IF NOT EXISTS idx_eval_runs_parent
1751
+ ON eval_runs(set_id);
1752
+ `;
1753
+ export const MEDIA_ENTERPRISE_OPS_SCHEMA_SQL = `
1754
+ ALTER TABLE voice_profiles ADD COLUMN consent_expires_at INTEGER;
1755
+ ALTER TABLE voice_profiles ADD COLUMN revoked_at INTEGER;
1756
+ ALTER TABLE voice_profiles ADD COLUMN transfer_count INTEGER NOT NULL DEFAULT 0;
1757
+ ALTER TABLE voice_profiles ADD COLUMN last_transfer_at INTEGER;
1758
+ ${MEDIA_ENTERPRISE_OPS_TABLES_SQL}`;
1759
+ export const MFA_PUSH_RECOVERY_TABLES_SQL = `
1760
+ CREATE TABLE IF NOT EXISTS user_mfa (
1761
+ user_id TEXT PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE,
1762
+ totp_secret TEXT NOT NULL,
1763
+ activated_at INTEGER,
1764
+ last_used_step INTEGER,
1765
+ created_at INTEGER NOT NULL,
1766
+ updated_at INTEGER NOT NULL
1767
+ );
1768
+
1769
+ CREATE TABLE IF NOT EXISTS mfa_recovery_codes (
1770
+ id TEXT PRIMARY KEY,
1771
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1772
+ code_lookup TEXT NOT NULL UNIQUE,
1773
+ created_at INTEGER NOT NULL,
1774
+ used_at INTEGER
1775
+ );
1776
+
1777
+ CREATE INDEX IF NOT EXISTS idx_mfa_recovery_codes_user
1778
+ ON mfa_recovery_codes(user_id);
1779
+
1780
+ CREATE TABLE IF NOT EXISTS webauthn_credentials (
1781
+ id TEXT PRIMARY KEY,
1782
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1783
+ credential_lookup TEXT NOT NULL UNIQUE,
1784
+ credential_data TEXT NOT NULL,
1785
+ name TEXT,
1786
+ sign_count INTEGER NOT NULL DEFAULT 0,
1787
+ created_at INTEGER NOT NULL,
1788
+ last_used_at INTEGER
1789
+ );
1790
+
1791
+ CREATE INDEX IF NOT EXISTS idx_webauthn_credentials_user
1792
+ ON webauthn_credentials(user_id);
1793
+
1794
+ CREATE TABLE IF NOT EXISTS push_subscriptions (
1795
+ id TEXT PRIMARY KEY,
1796
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1797
+ session_id TEXT,
1798
+ endpoint_lookup TEXT NOT NULL UNIQUE,
1799
+ subscription TEXT NOT NULL,
1800
+ user_agent TEXT,
1801
+ created_at INTEGER NOT NULL,
1802
+ last_used_at INTEGER
1803
+ );
1804
+
1805
+ CREATE INDEX IF NOT EXISTS idx_push_subscriptions_user
1806
+ ON push_subscriptions(user_id);
1807
+
1808
+ CREATE TABLE IF NOT EXISTS recovery_drills (
1809
+ id TEXT PRIMARY KEY,
1810
+ status TEXT NOT NULL CHECK (status IN ('running', 'passed', 'failed')),
1811
+ origin TEXT NOT NULL CHECK (origin IN ('scheduled', 'manual')),
1812
+ started_at INTEGER NOT NULL,
1813
+ finished_at INTEGER,
1814
+ snapshot_bytes INTEGER,
1815
+ rpo_seconds INTEGER,
1816
+ restore_ms INTEGER,
1817
+ error TEXT,
1818
+ report TEXT,
1819
+ created_by TEXT,
1820
+ created_at INTEGER NOT NULL
1821
+ );
1822
+
1823
+ CREATE INDEX IF NOT EXISTS idx_recovery_drills_started
1824
+ ON recovery_drills(started_at);
1825
+ `;
1826
+ const REQUIRED_SCHEMA = {
1827
+ ...LEGACY_REQUIRED_SCHEMA,
1828
+ users: [
1829
+ ...LEGACY_REQUIRED_SCHEMA.users,
1830
+ ...IDENTITY_EMAIL_LOOKUP_REQUIRED_SCHEMA.users,
1831
+ ],
1832
+ voice_profiles: [
1833
+ ...LEGACY_REQUIRED_SCHEMA.voice_profiles,
1834
+ ...VOICE_PROFILE_NAME_LOOKUP_REQUIRED_SCHEMA.voice_profiles,
1835
+ ],
1836
+ ...PLATFORM_VECTOR_REQUIRED_SCHEMA,
1837
+ ...DURABLE_JOBS_EVENTS_REQUIRED_SCHEMA,
1838
+ ...BLOB_REFERENCE_REQUIRED_SCHEMA,
1839
+ ...PLUGIN_DEFINITION_REQUIRED_SCHEMA,
1840
+ };
1841
+ const LEGACY_ADDITIVE_COLUMNS = {
1842
+ users: ['avatar', 'account_status', 'approved_at', 'approved_by'],
1843
+ personas: ['embedding_model', 'memory_settings', 'mutation_settings'],
1844
+ sessions: [
1845
+ 'persona_id',
1846
+ 'provider_type',
1847
+ 'provider_id',
1848
+ 'archived',
1849
+ 'settings',
1850
+ 'folder_id',
1851
+ 'pinned',
1852
+ ],
1853
+ session_messages: [
1854
+ 'thinking',
1855
+ 'model',
1856
+ 'provider_metadata',
1857
+ 'images',
1858
+ 'statistics',
1859
+ 'artifacts',
1860
+ 'parent_id',
1861
+ 'branch_index',
1862
+ 'is_active',
1863
+ 'rating',
1864
+ ],
1865
+ documents: ['file_type', 'size', 'session_id', 'collection_id'],
1866
+ plugin_credentials: ['routing_auth_fingerprint'],
1867
+ plugin_definition_approvals: ['source_path'],
1868
+ generated_images: ['kind', 'plugin_id', 'mime_type', 'metadata'],
1869
+ voice_profiles: ['routing_fingerprint'],
1870
+ work_tasks: ['provider_type', 'provider_id', 'host_path', 'policy_id'],
1871
+ work_runs: ['provider_type', 'provider_id'],
1872
+ persona_memories: [
1873
+ 'memory_type',
1874
+ 'access_count',
1875
+ 'last_accessed',
1876
+ 'decay_factor',
1877
+ 'consolidated_from',
1878
+ ],
1879
+ };
1880
+ const LEGACY_BOOTSTRAP_CORE_TABLES = [
1881
+ 'users',
1882
+ 'sessions',
1883
+ 'session_messages',
1884
+ 'documents',
1885
+ 'document_chunks',
1886
+ 'user_preferences',
1887
+ 'system_settings',
1888
+ 'personas',
1889
+ ];
1890
+ const addColumnIfMissing = (database, table, column, definition) => {
1891
+ const columns = database
1892
+ .prepare(`PRAGMA table_info(${table})`)
1893
+ .all();
1894
+ if (!columns.some(item => item.name === column)) {
1895
+ database.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
1896
+ }
1897
+ };
1898
+ const ensurePersonaPersistence = (database) => {
1899
+ database.exec(`
1900
+ CREATE TABLE IF NOT EXISTS persona_memories (
1901
+ id TEXT PRIMARY KEY,
1902
+ user_id TEXT NOT NULL,
1096
1903
  persona_id TEXT NOT NULL,
1097
1904
  content TEXT NOT NULL,
1098
1905
  embedding BLOB,
@@ -1187,6 +1994,36 @@ const REQUIRED_PRIMARY_KEYS = {
1187
1994
  calendar_events: ['id'],
1188
1995
  automations: ['id'],
1189
1996
  automation_runs: ['id'],
1997
+ tool_servers: ['id'],
1998
+ tool_server_tools: ['id'],
1999
+ tool_server_credentials: ['id'],
2000
+ tool_approvals: ['id'],
2001
+ prompts: ['id'],
2002
+ prompt_versions: ['id'],
2003
+ skills: ['id'],
2004
+ skill_versions: ['id'],
2005
+ skill_files: ['id'],
2006
+ note_revisions: ['id'],
2007
+ note_attachments: ['id'],
2008
+ calendars: ['id'],
2009
+ channels: ['id'],
2010
+ channel_members: ['channel_id', 'user_id'],
2011
+ channel_messages: ['id'],
2012
+ channel_reactions: ['id'],
2013
+ channel_attachments: ['id'],
2014
+ notifications: ['id'],
2015
+ webhook_targets: ['id'],
2016
+ model_tariffs: ['id'],
2017
+ usage_budgets: ['id'],
2018
+ message_feedback: ['id'],
2019
+ arena_votes: ['id'],
2020
+ eval_sets: ['id'],
2021
+ eval_runs: ['id'],
2022
+ user_mfa: ['user_id'],
2023
+ mfa_recovery_codes: ['id'],
2024
+ webauthn_credentials: ['id'],
2025
+ push_subscriptions: ['id'],
2026
+ recovery_drills: ['id'],
1190
2027
  };
1191
2028
  const REQUIRED_UNIQUE_KEYS = {
1192
2029
  [MIGRATION_TABLE]: [['name']],
@@ -1206,171 +2043,386 @@ const REQUIRED_UNIQUE_KEYS = {
1206
2043
  ['resource_type', 'resource_id', 'principal_type', 'principal_id'],
1207
2044
  ],
1208
2045
  api_tokens: [['token_hash']],
2046
+ tool_server_tools: [['server_id', 'name']],
2047
+ tool_server_credentials: [['server_id', 'user_id']],
2048
+ prompts: [['user_id', 'slug']],
2049
+ prompt_versions: [['prompt_id', 'version']],
2050
+ skills: [['user_id', 'slug']],
2051
+ skill_versions: [['skill_id', 'version']],
2052
+ skill_files: [['skill_id', 'path']],
2053
+ message_feedback: [['user_id', 'message_id']],
2054
+ arena_votes: [['user_id', 'compare_group']],
2055
+ mfa_recovery_codes: [['code_lookup']],
2056
+ webauthn_credentials: [['credential_lookup']],
2057
+ push_subscriptions: [['endpoint_lookup']],
1209
2058
  };
1210
2059
  const REQUIRED_FOREIGN_KEYS = [
1211
2060
  {
1212
- table: 'sessions',
2061
+ table: 'sessions',
2062
+ columns: ['user_id'],
2063
+ referencedTable: 'users',
2064
+ referencedColumns: ['id'],
2065
+ onDelete: 'CASCADE',
2066
+ },
2067
+ {
2068
+ table: 'session_messages',
2069
+ columns: ['session_id'],
2070
+ referencedTable: 'sessions',
2071
+ referencedColumns: ['id'],
2072
+ onDelete: 'CASCADE',
2073
+ },
2074
+ {
2075
+ table: 'plugin_credentials',
2076
+ columns: ['user_id'],
2077
+ referencedTable: 'users',
2078
+ referencedColumns: ['id'],
2079
+ onDelete: 'CASCADE',
2080
+ },
2081
+ {
2082
+ table: 'work_tasks',
2083
+ columns: ['user_id'],
2084
+ referencedTable: 'users',
2085
+ referencedColumns: ['id'],
2086
+ onDelete: 'CASCADE',
2087
+ },
2088
+ {
2089
+ table: 'work_runs',
2090
+ columns: ['task_id'],
2091
+ referencedTable: 'work_tasks',
2092
+ referencedColumns: ['id'],
2093
+ onDelete: 'CASCADE',
2094
+ },
2095
+ {
2096
+ table: 'work_messages',
2097
+ columns: ['task_id'],
2098
+ referencedTable: 'work_tasks',
2099
+ referencedColumns: ['id'],
2100
+ onDelete: 'CASCADE',
2101
+ },
2102
+ {
2103
+ table: 'work_messages',
2104
+ columns: ['run_id'],
2105
+ referencedTable: 'work_runs',
2106
+ referencedColumns: ['id'],
2107
+ onDelete: 'SET NULL',
2108
+ },
2109
+ {
2110
+ table: 'persona_memories',
2111
+ columns: ['user_id'],
2112
+ referencedTable: 'users',
2113
+ referencedColumns: ['id'],
2114
+ onDelete: 'CASCADE',
2115
+ },
2116
+ {
2117
+ table: 'persona_memories',
2118
+ columns: ['persona_id'],
2119
+ referencedTable: 'personas',
2120
+ referencedColumns: ['id'],
2121
+ onDelete: 'CASCADE',
2122
+ },
2123
+ {
2124
+ table: 'persona_states',
2125
+ columns: ['persona_id'],
2126
+ referencedTable: 'personas',
2127
+ referencedColumns: ['id'],
2128
+ onDelete: 'CASCADE',
2129
+ },
2130
+ {
2131
+ table: 'platform_vector_acl',
2132
+ columns: ['namespace', 'owner_user_id', 'vector_id'],
2133
+ referencedTable: 'platform_vector_entries',
2134
+ referencedColumns: ['namespace', 'owner_user_id', 'id'],
2135
+ onDelete: 'CASCADE',
2136
+ },
2137
+ {
2138
+ table: 'platform_vector_attributes',
2139
+ columns: ['namespace', 'owner_user_id', 'vector_id'],
2140
+ referencedTable: 'platform_vector_entries',
2141
+ referencedColumns: ['namespace', 'owner_user_id', 'id'],
2142
+ onDelete: 'CASCADE',
2143
+ },
2144
+ {
2145
+ table: 'platform_job_attempts',
2146
+ columns: ['job_id'],
2147
+ referencedTable: 'platform_jobs',
2148
+ referencedColumns: ['id'],
2149
+ onDelete: 'CASCADE',
2150
+ },
2151
+ {
2152
+ table: 'platform_events',
2153
+ columns: ['stream_id'],
2154
+ referencedTable: 'platform_event_stream_heads',
2155
+ referencedColumns: ['stream_id'],
2156
+ onDelete: 'CASCADE',
2157
+ },
2158
+ {
2159
+ table: 'user_group_members',
2160
+ columns: ['group_id'],
2161
+ referencedTable: 'user_groups',
2162
+ referencedColumns: ['id'],
2163
+ onDelete: 'CASCADE',
2164
+ },
2165
+ {
2166
+ table: 'user_group_members',
2167
+ columns: ['user_id'],
2168
+ referencedTable: 'users',
2169
+ referencedColumns: ['id'],
2170
+ onDelete: 'CASCADE',
2171
+ },
2172
+ {
2173
+ table: 'resource_grants',
2174
+ columns: ['owner_user_id'],
2175
+ referencedTable: 'users',
2176
+ referencedColumns: ['id'],
2177
+ onDelete: 'CASCADE',
2178
+ },
2179
+ {
2180
+ table: 'auth_sessions',
1213
2181
  columns: ['user_id'],
1214
2182
  referencedTable: 'users',
1215
2183
  referencedColumns: ['id'],
1216
2184
  onDelete: 'CASCADE',
1217
2185
  },
1218
2186
  {
1219
- table: 'session_messages',
1220
- columns: ['session_id'],
1221
- referencedTable: 'sessions',
2187
+ table: 'api_tokens',
2188
+ columns: ['user_id'],
2189
+ referencedTable: 'users',
1222
2190
  referencedColumns: ['id'],
1223
2191
  onDelete: 'CASCADE',
1224
2192
  },
1225
2193
  {
1226
- table: 'plugin_credentials',
2194
+ table: 'oauth_identities',
1227
2195
  columns: ['user_id'],
1228
2196
  referencedTable: 'users',
1229
2197
  referencedColumns: ['id'],
1230
2198
  onDelete: 'CASCADE',
1231
2199
  },
1232
2200
  {
1233
- table: 'work_tasks',
2201
+ table: 'calendar_events',
1234
2202
  columns: ['user_id'],
1235
2203
  referencedTable: 'users',
1236
2204
  referencedColumns: ['id'],
1237
2205
  onDelete: 'CASCADE',
1238
2206
  },
1239
2207
  {
1240
- table: 'work_runs',
1241
- columns: ['task_id'],
1242
- referencedTable: 'work_tasks',
2208
+ table: 'automations',
2209
+ columns: ['user_id'],
2210
+ referencedTable: 'users',
1243
2211
  referencedColumns: ['id'],
1244
2212
  onDelete: 'CASCADE',
1245
2213
  },
1246
2214
  {
1247
- table: 'work_messages',
1248
- columns: ['task_id'],
1249
- referencedTable: 'work_tasks',
2215
+ table: 'automation_runs',
2216
+ columns: ['automation_id'],
2217
+ referencedTable: 'automations',
1250
2218
  referencedColumns: ['id'],
1251
2219
  onDelete: 'CASCADE',
1252
2220
  },
1253
2221
  {
1254
- table: 'work_messages',
1255
- columns: ['run_id'],
1256
- referencedTable: 'work_runs',
2222
+ table: 'automation_runs',
2223
+ columns: ['user_id'],
2224
+ referencedTable: 'users',
1257
2225
  referencedColumns: ['id'],
1258
- onDelete: 'SET NULL',
2226
+ onDelete: 'CASCADE',
1259
2227
  },
1260
2228
  {
1261
- table: 'persona_memories',
2229
+ table: 'tool_servers',
1262
2230
  columns: ['user_id'],
1263
2231
  referencedTable: 'users',
1264
2232
  referencedColumns: ['id'],
1265
2233
  onDelete: 'CASCADE',
1266
2234
  },
1267
2235
  {
1268
- table: 'persona_memories',
1269
- columns: ['persona_id'],
1270
- referencedTable: 'personas',
2236
+ table: 'tool_server_tools',
2237
+ columns: ['server_id'],
2238
+ referencedTable: 'tool_servers',
1271
2239
  referencedColumns: ['id'],
1272
2240
  onDelete: 'CASCADE',
1273
2241
  },
1274
2242
  {
1275
- table: 'persona_states',
1276
- columns: ['persona_id'],
1277
- referencedTable: 'personas',
2243
+ table: 'tool_server_credentials',
2244
+ columns: ['server_id'],
2245
+ referencedTable: 'tool_servers',
1278
2246
  referencedColumns: ['id'],
1279
2247
  onDelete: 'CASCADE',
1280
2248
  },
1281
2249
  {
1282
- table: 'platform_vector_acl',
1283
- columns: ['namespace', 'owner_user_id', 'vector_id'],
1284
- referencedTable: 'platform_vector_entries',
1285
- referencedColumns: ['namespace', 'owner_user_id', 'id'],
2250
+ table: 'tool_server_credentials',
2251
+ columns: ['user_id'],
2252
+ referencedTable: 'users',
2253
+ referencedColumns: ['id'],
1286
2254
  onDelete: 'CASCADE',
1287
2255
  },
1288
2256
  {
1289
- table: 'platform_vector_attributes',
1290
- columns: ['namespace', 'owner_user_id', 'vector_id'],
1291
- referencedTable: 'platform_vector_entries',
1292
- referencedColumns: ['namespace', 'owner_user_id', 'id'],
2257
+ table: 'tool_approvals',
2258
+ columns: ['user_id'],
2259
+ referencedTable: 'users',
2260
+ referencedColumns: ['id'],
1293
2261
  onDelete: 'CASCADE',
1294
2262
  },
1295
2263
  {
1296
- table: 'platform_job_attempts',
1297
- columns: ['job_id'],
1298
- referencedTable: 'platform_jobs',
2264
+ table: 'tool_approvals',
2265
+ columns: ['session_id'],
2266
+ referencedTable: 'sessions',
1299
2267
  referencedColumns: ['id'],
1300
2268
  onDelete: 'CASCADE',
1301
2269
  },
1302
2270
  {
1303
- table: 'platform_events',
1304
- columns: ['stream_id'],
1305
- referencedTable: 'platform_event_stream_heads',
1306
- referencedColumns: ['stream_id'],
2271
+ table: 'prompts',
2272
+ columns: ['user_id'],
2273
+ referencedTable: 'users',
2274
+ referencedColumns: ['id'],
1307
2275
  onDelete: 'CASCADE',
1308
2276
  },
1309
2277
  {
1310
- table: 'user_group_members',
1311
- columns: ['group_id'],
1312
- referencedTable: 'user_groups',
2278
+ table: 'prompt_versions',
2279
+ columns: ['prompt_id'],
2280
+ referencedTable: 'prompts',
1313
2281
  referencedColumns: ['id'],
1314
2282
  onDelete: 'CASCADE',
1315
2283
  },
1316
2284
  {
1317
- table: 'user_group_members',
2285
+ table: 'skills',
1318
2286
  columns: ['user_id'],
1319
2287
  referencedTable: 'users',
1320
2288
  referencedColumns: ['id'],
1321
2289
  onDelete: 'CASCADE',
1322
2290
  },
1323
2291
  {
1324
- table: 'resource_grants',
1325
- columns: ['owner_user_id'],
2292
+ table: 'skill_versions',
2293
+ columns: ['skill_id'],
2294
+ referencedTable: 'skills',
2295
+ referencedColumns: ['id'],
2296
+ onDelete: 'CASCADE',
2297
+ },
2298
+ {
2299
+ table: 'skill_files',
2300
+ columns: ['skill_id'],
2301
+ referencedTable: 'skills',
2302
+ referencedColumns: ['id'],
2303
+ onDelete: 'CASCADE',
2304
+ },
2305
+ {
2306
+ table: 'note_revisions',
2307
+ columns: ['note_id'],
2308
+ referencedTable: 'notes',
2309
+ referencedColumns: ['id'],
2310
+ onDelete: 'CASCADE',
2311
+ },
2312
+ {
2313
+ table: 'note_attachments',
2314
+ columns: ['note_id'],
2315
+ referencedTable: 'notes',
2316
+ referencedColumns: ['id'],
2317
+ onDelete: 'CASCADE',
2318
+ },
2319
+ {
2320
+ table: 'calendars',
2321
+ columns: ['user_id'],
1326
2322
  referencedTable: 'users',
1327
2323
  referencedColumns: ['id'],
1328
2324
  onDelete: 'CASCADE',
1329
2325
  },
1330
2326
  {
1331
- table: 'auth_sessions',
2327
+ table: 'channel_members',
2328
+ columns: ['channel_id'],
2329
+ referencedTable: 'channels',
2330
+ referencedColumns: ['id'],
2331
+ onDelete: 'CASCADE',
2332
+ },
2333
+ {
2334
+ table: 'channel_members',
1332
2335
  columns: ['user_id'],
1333
2336
  referencedTable: 'users',
1334
2337
  referencedColumns: ['id'],
1335
2338
  onDelete: 'CASCADE',
1336
2339
  },
1337
2340
  {
1338
- table: 'api_tokens',
2341
+ table: 'channel_messages',
2342
+ columns: ['channel_id'],
2343
+ referencedTable: 'channels',
2344
+ referencedColumns: ['id'],
2345
+ onDelete: 'CASCADE',
2346
+ },
2347
+ {
2348
+ table: 'channel_reactions',
2349
+ columns: ['message_id'],
2350
+ referencedTable: 'channel_messages',
2351
+ referencedColumns: ['id'],
2352
+ onDelete: 'CASCADE',
2353
+ },
2354
+ {
2355
+ table: 'channel_attachments',
2356
+ columns: ['message_id'],
2357
+ referencedTable: 'channel_messages',
2358
+ referencedColumns: ['id'],
2359
+ onDelete: 'CASCADE',
2360
+ },
2361
+ {
2362
+ table: 'notifications',
1339
2363
  columns: ['user_id'],
1340
2364
  referencedTable: 'users',
1341
2365
  referencedColumns: ['id'],
1342
2366
  onDelete: 'CASCADE',
1343
2367
  },
1344
2368
  {
1345
- table: 'oauth_identities',
2369
+ table: 'message_feedback',
1346
2370
  columns: ['user_id'],
1347
2371
  referencedTable: 'users',
1348
2372
  referencedColumns: ['id'],
1349
2373
  onDelete: 'CASCADE',
1350
2374
  },
1351
2375
  {
1352
- table: 'calendar_events',
2376
+ table: 'arena_votes',
1353
2377
  columns: ['user_id'],
1354
2378
  referencedTable: 'users',
1355
2379
  referencedColumns: ['id'],
1356
2380
  onDelete: 'CASCADE',
1357
2381
  },
1358
2382
  {
1359
- table: 'automations',
2383
+ table: 'eval_sets',
1360
2384
  columns: ['user_id'],
1361
2385
  referencedTable: 'users',
1362
2386
  referencedColumns: ['id'],
1363
2387
  onDelete: 'CASCADE',
1364
2388
  },
1365
2389
  {
1366
- table: 'automation_runs',
1367
- columns: ['automation_id'],
1368
- referencedTable: 'automations',
2390
+ table: 'eval_runs',
2391
+ columns: ['user_id'],
2392
+ referencedTable: 'users',
1369
2393
  referencedColumns: ['id'],
1370
2394
  onDelete: 'CASCADE',
1371
2395
  },
1372
2396
  {
1373
- table: 'automation_runs',
2397
+ table: 'eval_runs',
2398
+ columns: ['set_id'],
2399
+ referencedTable: 'eval_sets',
2400
+ referencedColumns: ['id'],
2401
+ onDelete: 'CASCADE',
2402
+ },
2403
+ {
2404
+ table: 'user_mfa',
2405
+ columns: ['user_id'],
2406
+ referencedTable: 'users',
2407
+ referencedColumns: ['id'],
2408
+ onDelete: 'CASCADE',
2409
+ },
2410
+ {
2411
+ table: 'mfa_recovery_codes',
2412
+ columns: ['user_id'],
2413
+ referencedTable: 'users',
2414
+ referencedColumns: ['id'],
2415
+ onDelete: 'CASCADE',
2416
+ },
2417
+ {
2418
+ table: 'webauthn_credentials',
2419
+ columns: ['user_id'],
2420
+ referencedTable: 'users',
2421
+ referencedColumns: ['id'],
2422
+ onDelete: 'CASCADE',
2423
+ },
2424
+ {
2425
+ table: 'push_subscriptions',
1374
2426
  columns: ['user_id'],
1375
2427
  referencedTable: 'users',
1376
2428
  referencedColumns: ['id'],
@@ -1598,6 +2650,146 @@ const REQUIRED_INDEXES = [
1598
2650
  table: 'automation_runs',
1599
2651
  columns: ['user_id', 'scheduled_for'],
1600
2652
  },
2653
+ {
2654
+ name: 'idx_tool_servers_updated',
2655
+ table: 'tool_servers',
2656
+ columns: ['updated_at'],
2657
+ },
2658
+ {
2659
+ name: 'idx_tool_approvals_owner',
2660
+ table: 'tool_approvals',
2661
+ columns: ['user_id', 'status', 'created_at'],
2662
+ },
2663
+ {
2664
+ name: 'idx_prompts_owner',
2665
+ table: 'prompts',
2666
+ columns: ['user_id', 'updated_at'],
2667
+ },
2668
+ {
2669
+ name: 'idx_skills_owner',
2670
+ table: 'skills',
2671
+ columns: ['user_id', 'updated_at'],
2672
+ },
2673
+ {
2674
+ name: 'idx_skill_files_skill',
2675
+ table: 'skill_files',
2676
+ columns: ['skill_id'],
2677
+ },
2678
+ {
2679
+ name: 'idx_note_revisions_note',
2680
+ table: 'note_revisions',
2681
+ columns: ['note_id', 'created_at'],
2682
+ },
2683
+ {
2684
+ name: 'idx_note_attachments_note',
2685
+ table: 'note_attachments',
2686
+ columns: ['note_id'],
2687
+ },
2688
+ {
2689
+ name: 'idx_calendar_scoped_events',
2690
+ table: 'calendar_events',
2691
+ columns: ['calendar_id'],
2692
+ sqlFragment: 'WHERE calendar_id IS NOT NULL',
2693
+ },
2694
+ {
2695
+ name: 'idx_calendars_owner',
2696
+ table: 'calendars',
2697
+ columns: ['user_id', 'updated_at'],
2698
+ },
2699
+ {
2700
+ name: 'idx_channels_dm_key',
2701
+ table: 'channels',
2702
+ columns: ['dm_key'],
2703
+ unique: true,
2704
+ sqlFragment: 'WHERE dm_key IS NOT NULL',
2705
+ },
2706
+ {
2707
+ name: 'idx_channel_members_user',
2708
+ table: 'channel_members',
2709
+ columns: ['user_id'],
2710
+ },
2711
+ {
2712
+ name: 'idx_channel_messages_timeline',
2713
+ table: 'channel_messages',
2714
+ columns: ['channel_id', 'created_at', 'id'],
2715
+ },
2716
+ {
2717
+ name: 'idx_channel_messages_thread',
2718
+ table: 'channel_messages',
2719
+ columns: ['parent_id'],
2720
+ },
2721
+ {
2722
+ name: 'idx_channel_attachments_message',
2723
+ table: 'channel_attachments',
2724
+ columns: ['message_id'],
2725
+ },
2726
+ {
2727
+ name: 'idx_notifications_user',
2728
+ table: 'notifications',
2729
+ columns: ['user_id', 'created_at'],
2730
+ },
2731
+ {
2732
+ name: 'idx_notifications_dedupe',
2733
+ table: 'notifications',
2734
+ columns: ['user_id', 'source_key'],
2735
+ unique: true,
2736
+ sqlFragment: 'WHERE source_key IS NOT NULL',
2737
+ },
2738
+ {
2739
+ name: 'idx_model_tariffs_lookup',
2740
+ table: 'model_tariffs',
2741
+ columns: ['plugin_id', 'model', 'effective_from'],
2742
+ },
2743
+ {
2744
+ name: 'idx_usage_budgets_principal',
2745
+ table: 'usage_budgets',
2746
+ columns: ['principal_type', 'principal_id'],
2747
+ },
2748
+ {
2749
+ name: 'idx_message_feedback_owner',
2750
+ table: 'message_feedback',
2751
+ columns: ['user_id', 'created_at'],
2752
+ },
2753
+ {
2754
+ name: 'idx_arena_votes_order',
2755
+ table: 'arena_votes',
2756
+ columns: ['created_at', 'id'],
2757
+ },
2758
+ {
2759
+ name: 'idx_eval_sets_owner',
2760
+ table: 'eval_sets',
2761
+ columns: ['user_id', 'updated_at'],
2762
+ },
2763
+ {
2764
+ name: 'idx_eval_runs_owner',
2765
+ table: 'eval_runs',
2766
+ columns: ['user_id', 'created_at'],
2767
+ },
2768
+ {
2769
+ name: 'idx_eval_runs_parent',
2770
+ table: 'eval_runs',
2771
+ columns: ['set_id'],
2772
+ },
2773
+ {
2774
+ name: 'idx_mfa_recovery_codes_user',
2775
+ table: 'mfa_recovery_codes',
2776
+ columns: ['user_id'],
2777
+ },
2778
+ {
2779
+ name: 'idx_webauthn_credentials_user',
2780
+ table: 'webauthn_credentials',
2781
+ columns: ['user_id'],
2782
+ },
2783
+ {
2784
+ name: 'idx_push_subscriptions_user',
2785
+ table: 'push_subscriptions',
2786
+ columns: ['user_id'],
2787
+ },
2788
+ {
2789
+ name: 'idx_recovery_drills_started',
2790
+ table: 'recovery_drills',
2791
+ columns: ['started_at'],
2792
+ },
1601
2793
  ];
1602
2794
  const REQUIRED_TABLE_SQL_FRAGMENTS = {
1603
2795
  platform_vector_entries: ['CHECK(dimensions > 0)'],
@@ -1634,6 +2826,37 @@ const REQUIRED_TABLE_SQL_FRAGMENTS = {
1634
2826
  "permission IN ('read', 'write', 'admin')",
1635
2827
  ],
1636
2828
  security_audit_events: ["result IN ('success', 'denied', 'failure')"],
2829
+ tool_servers: [
2830
+ "kind IN ('openapi', 'mcp')",
2831
+ "auth_mode IN ('none', 'bearer', 'header')",
2832
+ "access_mode IN ('admins-only', 'all-users', 'granted')",
2833
+ ],
2834
+ tool_approvals: [
2835
+ "scope IN ('once', 'session', 'always')",
2836
+ "status IN ('pending', 'approved', 'denied', 'expired')",
2837
+ ],
2838
+ channels: ["type IN ('public', 'private', 'dm')"],
2839
+ channel_members: ["role IN ('owner', 'member')"],
2840
+ channel_messages: ["author_kind IN ('user', 'model')"],
2841
+ channel_reactions: ['UNIQUE (message_id, user_id, emoji)'],
2842
+ webhook_targets: ['enabled IN (0, 1)'],
2843
+ usage_budgets: [
2844
+ "principal_type IN ('instance', 'user', 'group')",
2845
+ "period IN ('daily', 'weekly', 'monthly')",
2846
+ "mode IN ('observe', 'soft', 'hard')",
2847
+ ],
2848
+ message_feedback: ['rating IN (-1, 1)', 'UNIQUE (user_id, message_id)'],
2849
+ arena_votes: [
2850
+ "winner IN ('a', 'b', 'tie', 'both-bad')",
2851
+ 'UNIQUE (user_id, compare_group)',
2852
+ ],
2853
+ eval_runs: [
2854
+ "status IN ('queued', 'running', 'completed', 'failed', 'cancelled')",
2855
+ ],
2856
+ recovery_drills: [
2857
+ "status IN ('running', 'passed', 'failed')",
2858
+ "origin IN ('scheduled', 'manual')",
2859
+ ],
1637
2860
  };
1638
2861
  const quoteIdentifier = (identifier) => `"${identifier.replace(/"/g, '""')}"`;
1639
2862
  const normalizeSql = (sql) => sql
@@ -1855,6 +3078,10 @@ const collectMissingSchema = (database) => [
1855
3078
  ...collectMissingResourceDeletionLifecycleSchema(database),
1856
3079
  ...collectMissingTrustFoundationSchema(database),
1857
3080
  ...collectMissingPersonalAutomationsSchema(database),
3081
+ ...collectMissingAgentFoundationSchema(database),
3082
+ ...collectMissingSkillFilesSchema(database),
3083
+ ...collectMissingNotesV2Schema(database),
3084
+ ...collectMissingTeamCollaborationSchema(database),
1858
3085
  ];
1859
3086
  const collectMissingMigrationLedgerSchema = (database) => [
1860
3087
  ...collectMissingColumns(database, {
@@ -1866,7 +3093,8 @@ const collectMissingLegacySchema = (database) => [
1866
3093
  ...collectMissingColumns(database, LEGACY_REQUIRED_SCHEMA),
1867
3094
  ...collectMissingStructuralInvariants(database).filter(item => !item.includes('platform_') &&
1868
3095
  !item.includes('idx_users_email_lookup') &&
1869
- !item.includes('idx_voice_profiles_name_lookup')),
3096
+ !item.includes('idx_voice_profiles_name_lookup') &&
3097
+ !item.includes('idx_calendar_scoped_events')),
1870
3098
  ];
1871
3099
  const collectMissingIdentityEmailLookupSchema = (database) => [
1872
3100
  ...collectMissingColumns(database, IDENTITY_EMAIL_LOOKUP_REQUIRED_SCHEMA),
@@ -1921,6 +3149,46 @@ const collectMissingPersonalAutomationsSchema = (database) => [
1921
3149
  item.includes('automations') ||
1922
3150
  item.includes('automation_runs')),
1923
3151
  ];
3152
+ const collectMissingAgentFoundationSchema = (database) => [
3153
+ ...collectMissingColumns(database, AGENT_FOUNDATION_REQUIRED_SCHEMA),
3154
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('tool_server') ||
3155
+ item.includes('tool_approvals') ||
3156
+ item.includes('prompt') ||
3157
+ item.includes('skill')),
3158
+ ];
3159
+ const collectMissingSkillFilesSchema = (database) => [
3160
+ ...collectMissingColumns(database, SKILL_FILES_REQUIRED_SCHEMA),
3161
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('skill_files')),
3162
+ ];
3163
+ const collectMissingNotesV2Schema = (database) => [
3164
+ ...collectMissingColumns(database, NOTES_V2_REQUIRED_SCHEMA),
3165
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('note_revisions') || item.includes('note_attachments')),
3166
+ ];
3167
+ const collectMissingTeamCollaborationSchema = (database) => [
3168
+ ...collectMissingColumns(database, TEAM_COLLABORATION_REQUIRED_SCHEMA),
3169
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('channel') ||
3170
+ item.includes('notifications') ||
3171
+ item.includes('webhook_targets') ||
3172
+ item.includes('calendars') ||
3173
+ item.includes('idx_calendar_scoped_events')),
3174
+ ];
3175
+ const collectMissingMediaEnterpriseOpsSchema = (database) => [
3176
+ ...collectMissingColumns(database, MEDIA_ENTERPRISE_OPS_REQUIRED_SCHEMA),
3177
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('model_tariffs') ||
3178
+ item.includes('usage_budgets') ||
3179
+ item.includes('message_feedback') ||
3180
+ item.includes('arena_votes') ||
3181
+ item.includes('eval_sets') ||
3182
+ item.includes('eval_runs')),
3183
+ ];
3184
+ const collectMissingMfaPushRecoverySchema = (database) => [
3185
+ ...collectMissingColumns(database, MFA_PUSH_RECOVERY_REQUIRED_SCHEMA),
3186
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('user_mfa') ||
3187
+ item.includes('mfa_recovery_codes') ||
3188
+ item.includes('webauthn_credentials') ||
3189
+ item.includes('push_subscriptions') ||
3190
+ item.includes('recovery_drills')),
3191
+ ];
1924
3192
  const collectMissingIdentityAccountRetirementSchema = (database) => {
1925
3193
  const row = database
1926
3194
  .prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'users'")
@@ -1959,6 +3227,12 @@ function collectMissingSchemaAtVersion(database, version) {
1959
3227
  : []),
1960
3228
  ...(version >= 14 ? collectMissingTrustFoundationSchema(database) : []),
1961
3229
  ...(version >= 15 ? collectMissingPersonalAutomationsSchema(database) : []),
3230
+ ...(version >= 16 ? collectMissingAgentFoundationSchema(database) : []),
3231
+ ...(version >= 17 ? collectMissingSkillFilesSchema(database) : []),
3232
+ ...(version >= 18 ? collectMissingNotesV2Schema(database) : []),
3233
+ ...(version >= 19 ? collectMissingTeamCollaborationSchema(database) : []),
3234
+ ...(version >= 20 ? collectMissingMediaEnterpriseOpsSchema(database) : []),
3235
+ ...(version >= 21 ? collectMissingMfaPushRecoverySchema(database) : []),
1962
3236
  ];
1963
3237
  }
1964
3238
  const collectMissingLegacyBootstrapSchema = (database) => {
@@ -2009,6 +3283,12 @@ const DURABLE_EVENT_REPLAY_INDEX_MIGRATION_CHECKSUM = '7d6b769ceadd08791c77ac5c5
2009
3283
  const TRUST_FOUNDATION_MIGRATION_CHECKSUM = 'c5a73245de3cd3e37db8877c8457c975d789f98c1c71ae1e4fc891ba09e8de5a';
2010
3284
  const LEGACY_DURABLE_EVENT_REPLAY_INDEX_MIGRATION_CHECKSUM = 'DURABLE_EVENT_REPLAY_INDEX_CHECKSUM_TO_FREEZE';
2011
3285
  const PERSONAL_AUTOMATIONS_MIGRATION_CHECKSUM = '5bfb4a1789480a3cacc09c5a4359a4e77b82b0edafa80f6d78cde73e57ddc70b';
3286
+ const AGENT_FOUNDATION_MIGRATION_CHECKSUM = '7e3a346fae66c073aac800aa45847999a4300b2f17eb3eaf9ed6351e891e2941';
3287
+ const SKILL_FILES_MIGRATION_CHECKSUM = '584e1f9bca79eb5974f997088636d74d7f2c1e5fd816fcd0f6cf74ec30aea161';
3288
+ const NOTES_V2_MIGRATION_CHECKSUM = '05a6758ab2b2a54f9097a5d5604a2bd57e085f1dd16816b5dc96d1eb7a41a399';
3289
+ const TEAM_COLLABORATION_MIGRATION_CHECKSUM = '1cf021c941cfd9207a82e794e58d7553ae24a35b3f8f8a84bb4a0e06d0d77443';
3290
+ const MEDIA_ENTERPRISE_OPS_MIGRATION_CHECKSUM = 'c6bc6d98518f7a279ad7109cfdfcd8a75fbf7e3e157c50bca98142b50ac0f38b';
3291
+ const MFA_PUSH_RECOVERY_MIGRATION_CHECKSUM = '9b2cdc08d2316877af091587113c749aed4b224d6ee12e72626b830da5447005';
2012
3292
  const MIGRATIONS = [
2013
3293
  {
2014
3294
  version: 1,
@@ -2231,6 +3511,87 @@ const MIGRATIONS = [
2231
3511
  }
2232
3512
  },
2233
3513
  },
3514
+ {
3515
+ version: 16,
3516
+ name: 'agent-foundation',
3517
+ checksum: AGENT_FOUNDATION_MIGRATION_CHECKSUM,
3518
+ apply(database) {
3519
+ addColumnIfMissing(database, 'personas', 'bindings', 'TEXT');
3520
+ database.exec(AGENT_FOUNDATION_TABLES_SQL);
3521
+ const missing = collectMissingAgentFoundationSchema(database);
3522
+ if (missing.length > 0) {
3523
+ throw new Error(`SQLite agent foundation schema is incomplete; missing ${missing.join(', ')}`);
3524
+ }
3525
+ },
3526
+ },
3527
+ {
3528
+ version: 17,
3529
+ name: 'skill-files',
3530
+ checksum: SKILL_FILES_MIGRATION_CHECKSUM,
3531
+ apply(database) {
3532
+ database.exec(SKILL_FILES_SCHEMA_SQL);
3533
+ const missing = collectMissingSkillFilesSchema(database);
3534
+ if (missing.length > 0) {
3535
+ throw new Error(`SQLite skill files schema is incomplete; missing ${missing.join(', ')}`);
3536
+ }
3537
+ },
3538
+ },
3539
+ {
3540
+ version: 18,
3541
+ name: 'notes-v2',
3542
+ checksum: NOTES_V2_MIGRATION_CHECKSUM,
3543
+ apply(database) {
3544
+ addColumnIfMissing(database, 'notes', 'pinned', 'INTEGER DEFAULT 0');
3545
+ database.exec(NOTES_V2_TABLES_SQL);
3546
+ const missing = collectMissingNotesV2Schema(database);
3547
+ if (missing.length > 0) {
3548
+ throw new Error(`SQLite notes v2 schema is incomplete; missing ${missing.join(', ')}`);
3549
+ }
3550
+ },
3551
+ },
3552
+ {
3553
+ version: 19,
3554
+ name: 'team-collaboration',
3555
+ checksum: TEAM_COLLABORATION_MIGRATION_CHECKSUM,
3556
+ apply(database) {
3557
+ addColumnIfMissing(database, 'calendar_events', 'calendar_id', 'TEXT');
3558
+ addColumnIfMissing(database, 'calendar_events', 'reminder_minutes', 'INTEGER');
3559
+ addColumnIfMissing(database, 'calendar_events', 'last_reminded_occurrence', 'INTEGER');
3560
+ database.exec(TEAM_COLLABORATION_TABLES_SQL);
3561
+ const missing = collectMissingTeamCollaborationSchema(database);
3562
+ if (missing.length > 0) {
3563
+ throw new Error(`SQLite team collaboration schema is incomplete; missing ${missing.join(', ')}`);
3564
+ }
3565
+ },
3566
+ },
3567
+ {
3568
+ version: 20,
3569
+ name: 'media-enterprise-ops',
3570
+ checksum: MEDIA_ENTERPRISE_OPS_MIGRATION_CHECKSUM,
3571
+ apply(database) {
3572
+ addColumnIfMissing(database, 'voice_profiles', 'consent_expires_at', 'INTEGER');
3573
+ addColumnIfMissing(database, 'voice_profiles', 'revoked_at', 'INTEGER');
3574
+ addColumnIfMissing(database, 'voice_profiles', 'transfer_count', 'INTEGER NOT NULL DEFAULT 0');
3575
+ addColumnIfMissing(database, 'voice_profiles', 'last_transfer_at', 'INTEGER');
3576
+ database.exec(MEDIA_ENTERPRISE_OPS_TABLES_SQL);
3577
+ const missing = collectMissingMediaEnterpriseOpsSchema(database);
3578
+ if (missing.length > 0) {
3579
+ throw new Error(`SQLite media enterprise ops schema is incomplete; missing ${missing.join(', ')}`);
3580
+ }
3581
+ },
3582
+ },
3583
+ {
3584
+ version: 21,
3585
+ name: 'mfa-push-recovery',
3586
+ checksum: MFA_PUSH_RECOVERY_MIGRATION_CHECKSUM,
3587
+ apply(database) {
3588
+ database.exec(MFA_PUSH_RECOVERY_TABLES_SQL);
3589
+ const missing = collectMissingMfaPushRecoverySchema(database);
3590
+ if (missing.length > 0) {
3591
+ throw new Error(`SQLite mfa/push/recovery schema is incomplete; missing ${missing.join(', ')}`);
3592
+ }
3593
+ },
3594
+ },
2234
3595
  ];
2235
3596
  /**
2236
3597
  * Whether a pending migration needs foreign-key enforcement suspended before