libre-webui 0.25.0 → 0.26.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 (510) hide show
  1. package/README.md +32 -22
  2. package/backend/dist/index.d.ts.map +1 -1
  3. package/backend/dist/index.js +26 -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/postgresMigrationRegistry.d.ts.map +1 -1
  44. package/backend/dist/persistence/postgresMigrationRegistry.js +10 -0
  45. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
  46. package/backend/dist/persistence/postgresNotesV2Migration.d.ts +4 -0
  47. package/backend/dist/persistence/postgresNotesV2Migration.d.ts.map +1 -0
  48. package/backend/dist/persistence/postgresNotesV2Migration.js +57 -0
  49. package/backend/dist/persistence/postgresNotesV2Migration.js.map +1 -0
  50. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
  51. package/backend/dist/persistence/postgresResourceRepositories.js +1646 -11
  52. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
  53. package/backend/dist/persistence/postgresSkillFilesMigration.d.ts +9 -0
  54. package/backend/dist/persistence/postgresSkillFilesMigration.d.ts.map +1 -0
  55. package/backend/dist/persistence/postgresSkillFilesMigration.js +50 -0
  56. package/backend/dist/persistence/postgresSkillFilesMigration.js.map +1 -0
  57. package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts +10 -0
  58. package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts.map +1 -0
  59. package/backend/dist/persistence/postgresTeamCollaborationMigration.js +161 -0
  60. package/backend/dist/persistence/postgresTeamCollaborationMigration.js.map +1 -0
  61. package/backend/dist/persistence/resourceTypes.d.ts +541 -3
  62. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
  63. package/backend/dist/persistence/resourceTypes.js.map +1 -1
  64. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
  65. package/backend/dist/persistence/sqliteExtensionRepositories.js +26 -4
  66. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
  67. package/backend/dist/persistence/sqliteMigrations.d.ts +9 -0
  68. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
  69. package/backend/dist/persistence/sqliteMigrations.js +1196 -29
  70. package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
  71. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
  72. package/backend/dist/persistence/sqliteResourceRepositories.js +1523 -134
  73. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
  74. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
  75. package/backend/dist/persistence/sqliteToPostgresMigration.js +257 -3
  76. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
  77. package/backend/dist/platform/jobs/domainJobContracts.d.ts +8 -0
  78. package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -1
  79. package/backend/dist/platform/jobs/domainJobContracts.js +8 -0
  80. package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -1
  81. package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
  82. package/backend/dist/platform/jobs/domainJobHandlers.js +310 -3
  83. package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
  84. package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts.map +1 -1
  85. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js +4 -2
  86. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js.map +1 -1
  87. package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts.map +1 -1
  88. package/backend/dist/platform/jobs/postgresDurableJobWorker.js +4 -2
  89. package/backend/dist/platform/jobs/postgresDurableJobWorker.js.map +1 -1
  90. package/backend/dist/platform/storage/pgVectorStore.d.ts +2 -1
  91. package/backend/dist/platform/storage/pgVectorStore.d.ts.map +1 -1
  92. package/backend/dist/platform/storage/pgVectorStore.js +51 -0
  93. package/backend/dist/platform/storage/pgVectorStore.js.map +1 -1
  94. package/backend/dist/platform/storage/platformDomainRepositories.d.ts +8 -2
  95. package/backend/dist/platform/storage/platformDomainRepositories.d.ts.map +1 -1
  96. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts.map +1 -1
  97. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js +25 -4
  98. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js.map +1 -1
  99. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts +2 -1
  100. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts.map +1 -1
  101. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js +35 -0
  102. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js.map +1 -1
  103. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts.map +1 -1
  104. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js +26 -3
  105. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js.map +1 -1
  106. package/backend/dist/platform/storage/vectorStore.d.ts +14 -0
  107. package/backend/dist/platform/storage/vectorStore.d.ts.map +1 -1
  108. package/backend/dist/platform/storage/vectorStore.js.map +1 -1
  109. package/backend/dist/routes/access.d.ts.map +1 -1
  110. package/backend/dist/routes/access.js +84 -3
  111. package/backend/dist/routes/access.js.map +1 -1
  112. package/backend/dist/routes/calendar.d.ts.map +1 -1
  113. package/backend/dist/routes/calendar.js +125 -22
  114. package/backend/dist/routes/calendar.js.map +1 -1
  115. package/backend/dist/routes/channels.d.ts +3 -0
  116. package/backend/dist/routes/channels.d.ts.map +1 -0
  117. package/backend/dist/routes/channels.js +447 -0
  118. package/backend/dist/routes/channels.js.map +1 -0
  119. package/backend/dist/routes/chat.d.ts.map +1 -1
  120. package/backend/dist/routes/chat.js +195 -7
  121. package/backend/dist/routes/chat.js.map +1 -1
  122. package/backend/dist/routes/costs.d.ts +3 -0
  123. package/backend/dist/routes/costs.d.ts.map +1 -0
  124. package/backend/dist/routes/costs.js +191 -0
  125. package/backend/dist/routes/costs.js.map +1 -0
  126. package/backend/dist/routes/documents.d.ts.map +1 -1
  127. package/backend/dist/routes/documents.js +64 -21
  128. package/backend/dist/routes/documents.js.map +1 -1
  129. package/backend/dist/routes/evaluations.d.ts +3 -0
  130. package/backend/dist/routes/evaluations.d.ts.map +1 -0
  131. package/backend/dist/routes/evaluations.js +352 -0
  132. package/backend/dist/routes/evaluations.js.map +1 -0
  133. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  134. package/backend/dist/routes/imageGen.js +2 -1
  135. package/backend/dist/routes/imageGen.js.map +1 -1
  136. package/backend/dist/routes/media.d.ts.map +1 -1
  137. package/backend/dist/routes/media.js +228 -7
  138. package/backend/dist/routes/media.js.map +1 -1
  139. package/backend/dist/routes/notes.d.ts.map +1 -1
  140. package/backend/dist/routes/notes.js +149 -36
  141. package/backend/dist/routes/notes.js.map +1 -1
  142. package/backend/dist/routes/notifications.d.ts +3 -0
  143. package/backend/dist/routes/notifications.d.ts.map +1 -0
  144. package/backend/dist/routes/notifications.js +213 -0
  145. package/backend/dist/routes/notifications.js.map +1 -0
  146. package/backend/dist/routes/openaiCompat.d.ts +3 -0
  147. package/backend/dist/routes/openaiCompat.d.ts.map +1 -0
  148. package/backend/dist/routes/openaiCompat.js +314 -0
  149. package/backend/dist/routes/openaiCompat.js.map +1 -0
  150. package/backend/dist/routes/personas.js +1 -1
  151. package/backend/dist/routes/personas.js.map +1 -1
  152. package/backend/dist/routes/prompts.d.ts +3 -0
  153. package/backend/dist/routes/prompts.d.ts.map +1 -0
  154. package/backend/dist/routes/prompts.js +173 -0
  155. package/backend/dist/routes/prompts.js.map +1 -0
  156. package/backend/dist/routes/search.d.ts.map +1 -1
  157. package/backend/dist/routes/search.js +29 -1
  158. package/backend/dist/routes/search.js.map +1 -1
  159. package/backend/dist/routes/skills.d.ts +3 -0
  160. package/backend/dist/routes/skills.d.ts.map +1 -0
  161. package/backend/dist/routes/skills.js +246 -0
  162. package/backend/dist/routes/skills.js.map +1 -0
  163. package/backend/dist/routes/stt.d.ts.map +1 -1
  164. package/backend/dist/routes/stt.js +2 -1
  165. package/backend/dist/routes/stt.js.map +1 -1
  166. package/backend/dist/routes/tools.d.ts +3 -0
  167. package/backend/dist/routes/tools.d.ts.map +1 -0
  168. package/backend/dist/routes/tools.js +359 -0
  169. package/backend/dist/routes/tools.js.map +1 -0
  170. package/backend/dist/routes/tts.d.ts.map +1 -1
  171. package/backend/dist/routes/tts.js +63 -8
  172. package/backend/dist/routes/tts.js.map +1 -1
  173. package/backend/dist/routes/voiceAccess.d.ts +3 -0
  174. package/backend/dist/routes/voiceAccess.d.ts.map +1 -0
  175. package/backend/dist/routes/voiceAccess.js +102 -0
  176. package/backend/dist/routes/voiceAccess.js.map +1 -0
  177. package/backend/dist/services/apiTokenService.d.ts +2 -2
  178. package/backend/dist/services/apiTokenService.d.ts.map +1 -1
  179. package/backend/dist/services/apiTokenService.js +7 -0
  180. package/backend/dist/services/apiTokenService.js.map +1 -1
  181. package/backend/dist/services/authorizationService.d.ts +8 -4
  182. package/backend/dist/services/authorizationService.d.ts.map +1 -1
  183. package/backend/dist/services/authorizationService.js +31 -1
  184. package/backend/dist/services/authorizationService.js.map +1 -1
  185. package/backend/dist/services/automationSchedulerService.d.ts.map +1 -1
  186. package/backend/dist/services/automationSchedulerService.js +33 -3
  187. package/backend/dist/services/automationSchedulerService.js.map +1 -1
  188. package/backend/dist/services/automationService.d.ts +4 -1
  189. package/backend/dist/services/automationService.d.ts.map +1 -1
  190. package/backend/dist/services/automationService.js +25 -2
  191. package/backend/dist/services/automationService.js.map +1 -1
  192. package/backend/dist/services/builtinToolsService.d.ts +20 -0
  193. package/backend/dist/services/builtinToolsService.d.ts.map +1 -0
  194. package/backend/dist/services/builtinToolsService.js +661 -0
  195. package/backend/dist/services/builtinToolsService.js.map +1 -0
  196. package/backend/dist/services/calendarService.d.ts +74 -0
  197. package/backend/dist/services/calendarService.d.ts.map +1 -0
  198. package/backend/dist/services/calendarService.js +339 -0
  199. package/backend/dist/services/calendarService.js.map +1 -0
  200. package/backend/dist/services/channelService.d.ts +195 -0
  201. package/backend/dist/services/channelService.d.ts.map +1 -0
  202. package/backend/dist/services/channelService.js +1057 -0
  203. package/backend/dist/services/channelService.js.map +1 -0
  204. package/backend/dist/services/chatRequestService.d.ts.map +1 -1
  205. package/backend/dist/services/chatRequestService.js +29 -1
  206. package/backend/dist/services/chatRequestService.js.map +1 -1
  207. package/backend/dist/services/chatService.d.ts +61 -1
  208. package/backend/dist/services/chatService.d.ts.map +1 -1
  209. package/backend/dist/services/chatService.js +218 -1
  210. package/backend/dist/services/chatService.js.map +1 -1
  211. package/backend/dist/services/chatToolRuntimeService.d.ts +55 -0
  212. package/backend/dist/services/chatToolRuntimeService.d.ts.map +1 -0
  213. package/backend/dist/services/chatToolRuntimeService.js +389 -0
  214. package/backend/dist/services/chatToolRuntimeService.js.map +1 -0
  215. package/backend/dist/services/costGovernanceService.d.ts +102 -0
  216. package/backend/dist/services/costGovernanceService.d.ts.map +1 -0
  217. package/backend/dist/services/costGovernanceService.js +463 -0
  218. package/backend/dist/services/costGovernanceService.js.map +1 -0
  219. package/backend/dist/services/dataArchiveService.d.ts +6 -0
  220. package/backend/dist/services/dataArchiveService.d.ts.map +1 -1
  221. package/backend/dist/services/dataArchiveService.js +23 -4
  222. package/backend/dist/services/dataArchiveService.js.map +1 -1
  223. package/backend/dist/services/documentService.d.ts +58 -1
  224. package/backend/dist/services/documentService.d.ts.map +1 -1
  225. package/backend/dist/services/documentService.js +289 -84
  226. package/backend/dist/services/documentService.js.map +1 -1
  227. package/backend/dist/services/durableChatGenerationService.d.ts +9 -0
  228. package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -1
  229. package/backend/dist/services/durableChatGenerationService.js +152 -11
  230. package/backend/dist/services/durableChatGenerationService.js.map +1 -1
  231. package/backend/dist/services/evaluationService.d.ts +111 -0
  232. package/backend/dist/services/evaluationService.d.ts.map +1 -0
  233. package/backend/dist/services/evaluationService.js +403 -0
  234. package/backend/dist/services/evaluationService.js.map +1 -0
  235. package/backend/dist/services/galleryService.d.ts +6 -0
  236. package/backend/dist/services/galleryService.d.ts.map +1 -1
  237. package/backend/dist/services/galleryService.js +26 -0
  238. package/backend/dist/services/galleryService.js.map +1 -1
  239. package/backend/dist/services/mcpClientService.d.ts +29 -0
  240. package/backend/dist/services/mcpClientService.d.ts.map +1 -0
  241. package/backend/dist/services/mcpClientService.js +189 -0
  242. package/backend/dist/services/mcpClientService.js.map +1 -0
  243. package/backend/dist/services/noteService.d.ts +71 -0
  244. package/backend/dist/services/noteService.d.ts.map +1 -0
  245. package/backend/dist/services/noteService.js +397 -0
  246. package/backend/dist/services/noteService.js.map +1 -0
  247. package/backend/dist/services/notificationService.d.ts +55 -0
  248. package/backend/dist/services/notificationService.d.ts.map +1 -0
  249. package/backend/dist/services/notificationService.js +308 -0
  250. package/backend/dist/services/notificationService.js.map +1 -0
  251. package/backend/dist/services/openApiToolService.d.ts +38 -0
  252. package/backend/dist/services/openApiToolService.d.ts.map +1 -0
  253. package/backend/dist/services/openApiToolService.js +254 -0
  254. package/backend/dist/services/openApiToolService.js.map +1 -0
  255. package/backend/dist/services/personaService.d.ts +18 -2
  256. package/backend/dist/services/personaService.d.ts.map +1 -1
  257. package/backend/dist/services/personaService.js +113 -4
  258. package/backend/dist/services/personaService.js.map +1 -1
  259. package/backend/dist/services/pluginImageGenerationService.d.ts +19 -0
  260. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
  261. package/backend/dist/services/pluginImageGenerationService.js +121 -0
  262. package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
  263. package/backend/dist/services/pluginService.d.ts +7 -0
  264. package/backend/dist/services/pluginService.d.ts.map +1 -1
  265. package/backend/dist/services/pluginService.js +8 -2
  266. package/backend/dist/services/pluginService.js.map +1 -1
  267. package/backend/dist/services/promptService.d.ts +74 -0
  268. package/backend/dist/services/promptService.d.ts.map +1 -0
  269. package/backend/dist/services/promptService.js +513 -0
  270. package/backend/dist/services/promptService.js.map +1 -0
  271. package/backend/dist/services/resourceGrantService.d.ts.map +1 -1
  272. package/backend/dist/services/resourceGrantService.js +62 -17
  273. package/backend/dist/services/resourceGrantService.js.map +1 -1
  274. package/backend/dist/services/searchService.d.ts +29 -0
  275. package/backend/dist/services/searchService.d.ts.map +1 -0
  276. package/backend/dist/services/searchService.js +0 -0
  277. package/backend/dist/services/searchService.js.map +1 -0
  278. package/backend/dist/services/securityAuditService.d.ts.map +1 -1
  279. package/backend/dist/services/securityAuditService.js +2 -1
  280. package/backend/dist/services/securityAuditService.js.map +1 -1
  281. package/backend/dist/services/sharedResourceAccess.d.ts +25 -0
  282. package/backend/dist/services/sharedResourceAccess.d.ts.map +1 -0
  283. package/backend/dist/services/sharedResourceAccess.js +59 -0
  284. package/backend/dist/services/sharedResourceAccess.js.map +1 -0
  285. package/backend/dist/services/skillService.d.ts +137 -0
  286. package/backend/dist/services/skillService.d.ts.map +1 -0
  287. package/backend/dist/services/skillService.js +852 -0
  288. package/backend/dist/services/skillService.js.map +1 -0
  289. package/backend/dist/services/toolAccessService.d.ts +9 -0
  290. package/backend/dist/services/toolAccessService.d.ts.map +1 -0
  291. package/backend/dist/services/toolAccessService.js +60 -0
  292. package/backend/dist/services/toolAccessService.js.map +1 -0
  293. package/backend/dist/services/toolApprovalService.d.ts +34 -0
  294. package/backend/dist/services/toolApprovalService.d.ts.map +1 -0
  295. package/backend/dist/services/toolApprovalService.js +188 -0
  296. package/backend/dist/services/toolApprovalService.js.map +1 -0
  297. package/backend/dist/services/toolGatewayService.d.ts +53 -0
  298. package/backend/dist/services/toolGatewayService.d.ts.map +1 -0
  299. package/backend/dist/services/toolGatewayService.js +249 -0
  300. package/backend/dist/services/toolGatewayService.js.map +1 -0
  301. package/backend/dist/services/toolServerService.d.ts +57 -0
  302. package/backend/dist/services/toolServerService.d.ts.map +1 -0
  303. package/backend/dist/services/toolServerService.js +521 -0
  304. package/backend/dist/services/toolServerService.js.map +1 -0
  305. package/backend/dist/services/voiceAccessService.d.ts +10 -0
  306. package/backend/dist/services/voiceAccessService.d.ts.map +1 -0
  307. package/backend/dist/services/voiceAccessService.js +74 -0
  308. package/backend/dist/services/voiceAccessService.js.map +1 -0
  309. package/backend/dist/services/voiceProfileService.d.ts +20 -0
  310. package/backend/dist/services/voiceProfileService.d.ts.map +1 -1
  311. package/backend/dist/services/voiceProfileService.js +60 -0
  312. package/backend/dist/services/voiceProfileService.js.map +1 -1
  313. package/backend/dist/storage.d.ts +28 -1
  314. package/backend/dist/storage.d.ts.map +1 -1
  315. package/backend/dist/storage.js +100 -1
  316. package/backend/dist/storage.js.map +1 -1
  317. package/backend/dist/storageMappers.d.ts +2 -2
  318. package/backend/dist/storageMappers.d.ts.map +1 -1
  319. package/backend/dist/storageMappers.js.map +1 -1
  320. package/backend/dist/types/index.d.ts +197 -2
  321. package/backend/dist/types/index.d.ts.map +1 -1
  322. package/backend/dist/types/index.js.map +1 -1
  323. package/backend/dist/types/tools.d.ts +137 -0
  324. package/backend/dist/types/tools.d.ts.map +1 -0
  325. package/backend/dist/types/tools.js +25 -0
  326. package/backend/dist/types/tools.js.map +1 -0
  327. package/backend/dist/utils/chatDocumentContext.d.ts +26 -1
  328. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
  329. package/backend/dist/utils/chatDocumentContext.js +87 -18
  330. package/backend/dist/utils/chatDocumentContext.js.map +1 -1
  331. package/backend/dist/utils/documentExtraction.d.ts +69 -0
  332. package/backend/dist/utils/documentExtraction.d.ts.map +1 -0
  333. package/backend/dist/utils/documentExtraction.js +545 -0
  334. package/backend/dist/utils/documentExtraction.js.map +1 -0
  335. package/backend/dist/utils/hybridRetrieval.d.ts +34 -0
  336. package/backend/dist/utils/hybridRetrieval.d.ts.map +1 -0
  337. package/backend/dist/utils/hybridRetrieval.js +119 -0
  338. package/backend/dist/utils/hybridRetrieval.js.map +1 -0
  339. package/backend/dist/utils/icsCalendar.d.ts +27 -0
  340. package/backend/dist/utils/icsCalendar.d.ts.map +1 -0
  341. package/backend/dist/utils/icsCalendar.js +313 -0
  342. package/backend/dist/utils/icsCalendar.js.map +1 -0
  343. package/backend/dist/utils/imageEditUpload.d.ts +29 -0
  344. package/backend/dist/utils/imageEditUpload.d.ts.map +1 -0
  345. package/backend/dist/utils/imageEditUpload.js +82 -0
  346. package/backend/dist/utils/imageEditUpload.js.map +1 -0
  347. package/backend/dist/utils/logRedaction.d.ts +2 -0
  348. package/backend/dist/utils/logRedaction.d.ts.map +1 -0
  349. package/backend/dist/utils/logRedaction.js +66 -0
  350. package/backend/dist/utils/logRedaction.js.map +1 -0
  351. package/backend/dist/utils/logger.d.ts +3 -0
  352. package/backend/dist/utils/logger.d.ts.map +1 -1
  353. package/backend/dist/utils/logger.js +63 -20
  354. package/backend/dist/utils/logger.js.map +1 -1
  355. package/backend/dist/utils/pluginChatAdapter.d.ts +5 -1
  356. package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
  357. package/backend/dist/utils/pluginChatAdapter.js +83 -0
  358. package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
  359. package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
  360. package/backend/dist/utils/resourceLimits.d.ts +61 -2
  361. package/backend/dist/utils/resourceLimits.d.ts.map +1 -1
  362. package/backend/dist/utils/resourceLimits.js +59 -0
  363. package/backend/dist/utils/resourceLimits.js.map +1 -1
  364. package/backend/dist/utils/toolEgress.d.ts +22 -0
  365. package/backend/dist/utils/toolEgress.d.ts.map +1 -0
  366. package/backend/dist/utils/toolEgress.js +157 -0
  367. package/backend/dist/utils/toolEgress.js.map +1 -0
  368. package/backend/dist/utils/websocketMessages.d.ts +6 -0
  369. package/backend/dist/utils/websocketMessages.d.ts.map +1 -1
  370. package/backend/dist/utils/websocketMessages.js +8 -0
  371. package/backend/dist/utils/websocketMessages.js.map +1 -1
  372. package/backend/dist/utils/zipArchive.d.ts +32 -0
  373. package/backend/dist/utils/zipArchive.d.ts.map +1 -0
  374. package/backend/dist/utils/zipArchive.js +171 -0
  375. package/backend/dist/utils/zipArchive.js.map +1 -0
  376. package/backend/dist/websocketServer.d.ts.map +1 -1
  377. package/backend/dist/websocketServer.js +142 -35
  378. package/backend/dist/websocketServer.js.map +1 -1
  379. package/backend/package.json +1 -1
  380. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  381. package/frontend/dist/assets/index-BPsH9FII.js +80 -0
  382. package/frontend/dist/assets/index-BtXF0Oxa.css +1 -0
  383. package/frontend/dist/index.html +18 -18
  384. package/frontend/dist/js/{ArtifactContainer-CpUi6ekF.js → ArtifactContainer-CIoFoMv8.js} +1 -1
  385. package/frontend/dist/js/{ArtifactDemoPage-BeNs3gHp.js → ArtifactDemoPage-D0JEIAbZ.js} +1 -1
  386. package/frontend/dist/js/{ArtifactSandboxFrame-qsj_Y3LV.js → ArtifactSandboxFrame-REazyIrx.js} +2 -2
  387. package/frontend/dist/js/ArtifactSlideOutPanel-A-i94ghF.js +1 -0
  388. package/frontend/dist/js/AutomationsPage-Dow_lbIf.js +1 -0
  389. package/frontend/dist/js/{Button-BPf_pOxH.js → Button-C0r3J9G_.js} +1 -1
  390. package/frontend/dist/js/CalendarPage-DLjasZOd.js +1 -0
  391. package/frontend/dist/js/ChannelsPage-C8hvTD7J.js +1 -0
  392. package/frontend/dist/js/ChatPage-BAgBHUES.js +16 -0
  393. package/frontend/dist/js/EvaluationsPage-Bm8FRoeX.js +2 -0
  394. package/frontend/dist/js/{FirstTimeSetup-Df0YJni3.js → FirstTimeSetup-BxJapNul.js} +1 -1
  395. package/frontend/dist/js/GalleryPage-DHz9DkK7.js +1 -0
  396. package/frontend/dist/js/HomePage-BqNy-FWX.js +1 -0
  397. package/frontend/dist/js/LibreClawPage-BDzDILjY.js +1 -0
  398. package/frontend/dist/js/{ModelManagerModals-DcLGYN3l.js → ModelManagerModals-DX9eT5r2.js} +1 -1
  399. package/frontend/dist/js/ModelSelector-ol8mK2ja.js +1 -0
  400. package/frontend/dist/js/NotesPage-DzHEx2O4.js +3 -0
  401. package/frontend/dist/js/{OptimizedSyntaxHighlighter-Dz7D1LPB.js → OptimizedSyntaxHighlighter-CZNPwN0i.js} +1 -1
  402. package/frontend/dist/js/PersonasPage-M_WKH2a9.js +13 -0
  403. package/frontend/dist/js/PluginUsagePage-Ctoka6JZ.js +1 -0
  404. package/frontend/dist/js/RichMessageContent-BqgafH4p.js +3 -0
  405. package/frontend/dist/js/SettingsModal-R9EDadAV.js +19 -0
  406. package/frontend/dist/js/{SettingsToggle-woG_WebF.js → SettingsToggle-BIVyfGjl.js} +1 -1
  407. package/frontend/dist/js/SystemPage-aOkrSuY7.js +1 -0
  408. package/frontend/dist/js/UserManagementPage-BOuaX3ay.js +1 -0
  409. package/frontend/dist/js/WorkPage-DxZISerQ.js +6 -0
  410. package/frontend/dist/js/api-6bSMtSNh.js +14 -0
  411. package/frontend/dist/js/{appStore-0JnCUlEq.js → appStore-CdObhQBb.js} +2 -2
  412. package/frontend/dist/js/ar-DT_VLBO3.js +2 -0
  413. package/frontend/dist/js/{authStore-DbMdvNgJ.js → authStore-DbqqrfZv.js} +3 -3
  414. package/frontend/dist/js/{babel-BsYoxD-7.js → babel-DSqqk5kt.js} +1 -1
  415. package/frontend/dist/js/bn-BrvEqhGA.js +2 -0
  416. package/frontend/dist/js/chatStore-DbZPJNsu.js +3 -0
  417. package/frontend/dist/js/{config-DSOYQ9a3.js → config-8KdgjtEx.js} +1 -1
  418. package/frontend/dist/js/cs-BthnM_YI.js +2 -0
  419. package/frontend/dist/js/da-DCth-6_j.js +2 -0
  420. package/frontend/dist/js/de-BBWt0gJ_.js +2 -0
  421. package/frontend/dist/js/es-DuslOPqM.js +2 -0
  422. package/frontend/dist/js/{estree-BcnBcOAx.js → estree-BU5-LV_1.js} +3 -3
  423. package/frontend/dist/js/evaluationsApi-CwZJsgeG.js +1 -0
  424. package/frontend/dist/js/fr-DZAeg46S.js +2 -0
  425. package/frontend/dist/js/hi-ijDSiY77.js +2 -0
  426. package/frontend/dist/js/{html-DkY55Jys.js → html-DeoAy2bo.js} +2 -2
  427. package/frontend/dist/js/id-BS6qS0oq.js +2 -0
  428. package/frontend/dist/js/is-CO2PMDte.js +2 -0
  429. package/frontend/dist/js/it-ChhxT4hs.js +2 -0
  430. package/frontend/dist/js/ja-cyeqUeJN.js +2 -0
  431. package/frontend/dist/js/ko-CfqHTLXj.js +2 -0
  432. package/frontend/dist/js/{markdown-IZSI9DXw.js → markdown-DOLsYkBY.js} +3 -3
  433. package/frontend/dist/js/markdown-core-BK7WVOb7.js +32 -0
  434. package/frontend/dist/js/{markdown-math-DK846gXU.js → markdown-math-e1ByS3KY.js} +5 -5
  435. package/frontend/dist/js/{messageCodeStyles-BFNR9Wv6.js → messageCodeStyles-DhVgizF-.js} +2 -2
  436. package/frontend/dist/js/ms-DZ5pACe1.js +2 -0
  437. package/frontend/dist/js/nl-BsRsnOVp.js +2 -0
  438. package/frontend/dist/js/pl-DXSTAW4M.js +2 -0
  439. package/frontend/dist/js/{postcss-BJ0okz7n.js → postcss-Bg15EcFE.js} +1 -1
  440. package/frontend/dist/js/pt-DmDx0JxB.js +2 -0
  441. package/frontend/dist/js/{react-vendor-C5yShNlM.js → react-vendor-BG_HPV6X.js} +1 -1
  442. package/frontend/dist/js/router-vendor-CbexJIsv.js +1 -0
  443. package/frontend/dist/js/ru-d2g8EWfY.js +2 -0
  444. package/frontend/dist/js/{standalone-Csw3jfJ_.js → standalone-BO5pzI8_.js} +3 -3
  445. package/frontend/dist/js/sv-CIhYUTVQ.js +2 -0
  446. package/frontend/dist/js/{syntax-highlight-3EEX6CGL.js → syntax-highlight-DcR9Vhb7.js} +3 -3
  447. package/frontend/dist/js/th-B3wSxanB.js +2 -0
  448. package/frontend/dist/js/tr-R4UGgPOY.js +2 -0
  449. package/frontend/dist/js/{typescript-CnF4UVx7.js → typescript-6GJ8APmn.js} +1 -1
  450. package/frontend/dist/js/ui-CV0LYmkM.js +2 -0
  451. package/frontend/dist/js/ui-vendor-CWjIBW-z.js +177 -0
  452. package/frontend/dist/js/uk-BzUF4Vkt.js +2 -0
  453. package/frontend/dist/js/{useTranslation-Bho4HCyg.js → useTranslation-5b5UhAc9.js} +1 -1
  454. package/frontend/dist/js/{utils-D9W1Lnkn.js → utils-BGrdX9ie.js} +1 -1
  455. package/frontend/dist/js/{utils-vendor-DWh39_3x.js → utils-vendor-9bQ62WeD.js} +1 -1
  456. package/frontend/dist/js/vi-CKc6Fg4h.js +2 -0
  457. package/frontend/dist/js/{workApi-C3uy9EDT.js → workApi-BruWTlHM.js} +3 -3
  458. package/frontend/dist/js/{yaml-DzT5hBSH.js → yaml-DUeWcOOH.js} +2 -2
  459. package/frontend/dist/js/zh-CXL-kDe8.js +2 -0
  460. package/package.json +2 -2
  461. package/plugins/openai.json +52 -9
  462. package/frontend/dist/assets/index-6o-Hc2wS.js +0 -41
  463. package/frontend/dist/assets/index-D-pM957b.css +0 -1
  464. package/frontend/dist/js/ArtifactSlideOutPanel-CSFRluWA.js +0 -1
  465. package/frontend/dist/js/AutomationsPage-KUeWoZNv.js +0 -1
  466. package/frontend/dist/js/CalendarPage-D9I972w8.js +0 -1
  467. package/frontend/dist/js/ChatPage-CmBx4oAL.js +0 -16
  468. package/frontend/dist/js/GalleryPage-bLCrdJN_.js +0 -1
  469. package/frontend/dist/js/HomePage-Uc6PEg-U.js +0 -1
  470. package/frontend/dist/js/LibreClawPage-CG63DHg1.js +0 -1
  471. package/frontend/dist/js/ModelSelector-yxJC64rM.js +0 -1
  472. package/frontend/dist/js/ModelsPage-1R_TxgmJ.js +0 -2
  473. package/frontend/dist/js/NotesPage-L65j5HoW.js +0 -1
  474. package/frontend/dist/js/PersonasPage-CKeBpHIH.js +0 -13
  475. package/frontend/dist/js/PluginUsagePage-BX1SKMbW.js +0 -1
  476. package/frontend/dist/js/RichMessageContent-DiySVYGB.js +0 -3
  477. package/frontend/dist/js/SettingsModal-68SG1uZ2.js +0 -1
  478. package/frontend/dist/js/SystemPage-CytpZiQV.js +0 -1
  479. package/frontend/dist/js/UserManagementPage-BzJBvZiS.js +0 -1
  480. package/frontend/dist/js/WorkPage-C8gr0QJe.js +0 -6
  481. package/frontend/dist/js/api-BDtqBtqw.js +0 -14
  482. package/frontend/dist/js/ar-CSpi37Gr.js +0 -2
  483. package/frontend/dist/js/bn-CyH1BeDD.js +0 -2
  484. package/frontend/dist/js/chatStore-CHQ2uINS.js +0 -3
  485. package/frontend/dist/js/cs-Cv2NfRK5.js +0 -2
  486. package/frontend/dist/js/da-D6D6IvPK.js +0 -2
  487. package/frontend/dist/js/de-BNoJJTrT.js +0 -2
  488. package/frontend/dist/js/es-kzo9C7q_.js +0 -2
  489. package/frontend/dist/js/fr-CjHYvJRp.js +0 -2
  490. package/frontend/dist/js/hi-BU98AdCQ.js +0 -2
  491. package/frontend/dist/js/id-CpdedejX.js +0 -2
  492. package/frontend/dist/js/is-Cp5dDWBH.js +0 -2
  493. package/frontend/dist/js/it-CuH_cK4U.js +0 -2
  494. package/frontend/dist/js/ja-BWXXXiHn.js +0 -2
  495. package/frontend/dist/js/ko-DQgv2M1t.js +0 -2
  496. package/frontend/dist/js/markdown-core-BmPPZiuD.js +0 -31
  497. package/frontend/dist/js/ms-DCcRoIcX.js +0 -2
  498. package/frontend/dist/js/nl-CbKR1_EU.js +0 -2
  499. package/frontend/dist/js/pl-CRyJZccn.js +0 -2
  500. package/frontend/dist/js/pt-BXYmHFGH.js +0 -2
  501. package/frontend/dist/js/router-vendor-DGFGM3EP.js +0 -1
  502. package/frontend/dist/js/ru-M9SyZG4b.js +0 -2
  503. package/frontend/dist/js/sv-DJ486LTU.js +0 -2
  504. package/frontend/dist/js/th-Ch7gKtZv.js +0 -2
  505. package/frontend/dist/js/tr-ClehWhSC.js +0 -2
  506. package/frontend/dist/js/ui-CC-K19wO.js +0 -2
  507. package/frontend/dist/js/ui-vendor-B1UgO3vd.js +0 -177
  508. package/frontend/dist/js/uk-BqAd5zHF.js +0 -2
  509. package/frontend/dist/js/vi-D9gjlDVB.js +0 -2
  510. package/frontend/dist/js/zh-DKTyHkiR.js +0 -2
@@ -745,6 +745,274 @@ 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
+ };
748
1016
  export const IDENTITY_EMAIL_LOOKUP_SCHEMA_SQL = `
749
1017
  ALTER TABLE users ADD COLUMN email_lookup TEXT;
750
1018
  CREATE UNIQUE INDEX idx_users_email_lookup
@@ -976,46 +1244,473 @@ export const PERSONAL_AUTOMATIONS_SCHEMA_SQL = `
976
1244
  id TEXT PRIMARY KEY,
977
1245
  user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
978
1246
  name TEXT NOT NULL,
979
- instructions TEXT NOT NULL,
980
- triggers TEXT NOT NULL,
981
- provider TEXT,
982
- model TEXT,
983
- notify TEXT NOT NULL CHECK (notify IN ('app', 'off')),
984
- status TEXT NOT NULL CHECK (status IN ('active', 'paused')),
985
- next_run_at INTEGER,
986
- last_run_at INTEGER,
1247
+ instructions TEXT NOT NULL,
1248
+ triggers TEXT NOT NULL,
1249
+ provider TEXT,
1250
+ model TEXT,
1251
+ notify TEXT NOT NULL CHECK (notify IN ('app', 'off')),
1252
+ status TEXT NOT NULL CHECK (status IN ('active', 'paused')),
1253
+ next_run_at INTEGER,
1254
+ last_run_at INTEGER,
1255
+ created_at INTEGER NOT NULL,
1256
+ updated_at INTEGER NOT NULL
1257
+ );
1258
+
1259
+ CREATE INDEX IF NOT EXISTS idx_automations_owner
1260
+ ON automations(user_id, updated_at);
1261
+
1262
+ CREATE INDEX IF NOT EXISTS idx_automations_due
1263
+ ON automations(status, next_run_at);
1264
+
1265
+ CREATE TABLE IF NOT EXISTS automation_runs (
1266
+ id TEXT PRIMARY KEY,
1267
+ automation_id TEXT NOT NULL REFERENCES automations(id) ON DELETE CASCADE,
1268
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1269
+ scheduled_for INTEGER NOT NULL,
1270
+ started_at INTEGER,
1271
+ finished_at INTEGER,
1272
+ status TEXT NOT NULL
1273
+ CHECK (status IN ('queued', 'running', 'succeeded', 'failed')),
1274
+ session_id TEXT,
1275
+ assistant_message_id TEXT,
1276
+ error TEXT,
1277
+ seen_at INTEGER,
1278
+ created_at INTEGER NOT NULL
1279
+ );
1280
+
1281
+ CREATE INDEX IF NOT EXISTS idx_automation_runs_automation
1282
+ ON automation_runs(automation_id, scheduled_for);
1283
+
1284
+ CREATE INDEX IF NOT EXISTS idx_automation_runs_owner_time
1285
+ ON automation_runs(user_id, scheduled_for);
1286
+ `;
1287
+ export const AGENT_FOUNDATION_TABLES_SQL = `
1288
+ CREATE TABLE IF NOT EXISTS tool_servers (
1289
+ id TEXT PRIMARY KEY,
1290
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1291
+ name TEXT NOT NULL,
1292
+ description TEXT,
1293
+ kind TEXT NOT NULL CHECK (kind IN ('openapi', 'mcp')),
1294
+ base_url TEXT NOT NULL,
1295
+ spec TEXT,
1296
+ spec_digest TEXT,
1297
+ spec_revision INTEGER NOT NULL DEFAULT 1,
1298
+ auth_mode TEXT NOT NULL CHECK (auth_mode IN ('none', 'bearer', 'header')),
1299
+ auth_header TEXT,
1300
+ access_mode TEXT NOT NULL
1301
+ CHECK (access_mode IN ('admins-only', 'all-users', 'granted')),
1302
+ enabled INTEGER NOT NULL DEFAULT 1,
1303
+ timeout_ms INTEGER NOT NULL,
1304
+ max_response_bytes INTEGER NOT NULL,
1305
+ created_at INTEGER NOT NULL,
1306
+ updated_at INTEGER NOT NULL
1307
+ );
1308
+
1309
+ CREATE INDEX IF NOT EXISTS idx_tool_servers_updated
1310
+ ON tool_servers(updated_at);
1311
+
1312
+ CREATE TABLE IF NOT EXISTS tool_server_tools (
1313
+ id TEXT PRIMARY KEY,
1314
+ server_id TEXT NOT NULL REFERENCES tool_servers(id) ON DELETE CASCADE,
1315
+ name TEXT NOT NULL,
1316
+ description TEXT,
1317
+ params_schema TEXT,
1318
+ detail TEXT,
1319
+ side_effect INTEGER NOT NULL DEFAULT 1,
1320
+ enabled INTEGER NOT NULL DEFAULT 1,
1321
+ created_at INTEGER NOT NULL,
1322
+ updated_at INTEGER NOT NULL,
1323
+ UNIQUE (server_id, name)
1324
+ );
1325
+
1326
+ CREATE TABLE IF NOT EXISTS tool_server_credentials (
1327
+ id TEXT PRIMARY KEY,
1328
+ server_id TEXT NOT NULL REFERENCES tool_servers(id) ON DELETE CASCADE,
1329
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1330
+ secret TEXT NOT NULL,
1331
+ created_at INTEGER NOT NULL,
1332
+ updated_at INTEGER NOT NULL,
1333
+ UNIQUE (server_id, user_id)
1334
+ );
1335
+
1336
+ CREATE TABLE IF NOT EXISTS tool_approvals (
1337
+ id TEXT PRIMARY KEY,
1338
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1339
+ session_id TEXT REFERENCES sessions(id) ON DELETE CASCADE,
1340
+ server_id TEXT REFERENCES tool_servers(id) ON DELETE CASCADE,
1341
+ tool_name TEXT NOT NULL,
1342
+ call_id TEXT,
1343
+ arguments_digest TEXT,
1344
+ scope TEXT NOT NULL CHECK (scope IN ('once', 'session', 'always')),
1345
+ status TEXT NOT NULL
1346
+ CHECK (status IN ('pending', 'approved', 'denied', 'expired')),
1347
+ created_at INTEGER NOT NULL,
1348
+ resolved_at INTEGER,
1349
+ expires_at INTEGER
1350
+ );
1351
+
1352
+ CREATE INDEX IF NOT EXISTS idx_tool_approvals_owner
1353
+ ON tool_approvals(user_id, status, created_at);
1354
+
1355
+ CREATE TABLE IF NOT EXISTS prompts (
1356
+ id TEXT PRIMARY KEY,
1357
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1358
+ slug TEXT NOT NULL,
1359
+ title TEXT NOT NULL,
1360
+ description TEXT,
1361
+ content TEXT NOT NULL,
1362
+ variables TEXT,
1363
+ tags TEXT,
1364
+ version INTEGER NOT NULL DEFAULT 1,
1365
+ created_at INTEGER NOT NULL,
1366
+ updated_at INTEGER NOT NULL,
1367
+ UNIQUE (user_id, slug)
1368
+ );
1369
+
1370
+ CREATE INDEX IF NOT EXISTS idx_prompts_owner
1371
+ ON prompts(user_id, updated_at);
1372
+
1373
+ CREATE TABLE IF NOT EXISTS prompt_versions (
1374
+ id TEXT PRIMARY KEY,
1375
+ prompt_id TEXT NOT NULL REFERENCES prompts(id) ON DELETE CASCADE,
1376
+ version INTEGER NOT NULL,
1377
+ content TEXT NOT NULL,
1378
+ variables TEXT,
1379
+ created_at INTEGER NOT NULL,
1380
+ UNIQUE (prompt_id, version)
1381
+ );
1382
+
1383
+ CREATE TABLE IF NOT EXISTS skills (
1384
+ id TEXT PRIMARY KEY,
1385
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1386
+ slug TEXT NOT NULL,
1387
+ name TEXT NOT NULL,
1388
+ description TEXT NOT NULL,
1389
+ instructions TEXT NOT NULL,
1390
+ enabled INTEGER NOT NULL DEFAULT 1,
1391
+ version INTEGER NOT NULL DEFAULT 1,
1392
+ created_at INTEGER NOT NULL,
1393
+ updated_at INTEGER NOT NULL,
1394
+ UNIQUE (user_id, slug)
1395
+ );
1396
+
1397
+ CREATE INDEX IF NOT EXISTS idx_skills_owner
1398
+ ON skills(user_id, updated_at);
1399
+
1400
+ CREATE TABLE IF NOT EXISTS skill_versions (
1401
+ id TEXT PRIMARY KEY,
1402
+ skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
1403
+ version INTEGER NOT NULL,
1404
+ instructions TEXT NOT NULL,
1405
+ created_at INTEGER NOT NULL,
1406
+ UNIQUE (skill_id, version)
1407
+ );
1408
+ `;
1409
+ export const AGENT_FOUNDATION_SCHEMA_SQL = `
1410
+ ALTER TABLE personas ADD COLUMN bindings TEXT;
1411
+ ${AGENT_FOUNDATION_TABLES_SQL}`;
1412
+ export const SKILL_FILES_SCHEMA_SQL = `
1413
+ CREATE TABLE IF NOT EXISTS skill_files (
1414
+ id TEXT PRIMARY KEY,
1415
+ skill_id TEXT NOT NULL REFERENCES skills(id) ON DELETE CASCADE,
1416
+ path TEXT NOT NULL,
1417
+ content TEXT NOT NULL,
1418
+ size INTEGER NOT NULL,
1419
+ created_at INTEGER NOT NULL,
1420
+ updated_at INTEGER NOT NULL,
1421
+ UNIQUE (skill_id, path)
1422
+ );
1423
+
1424
+ CREATE INDEX IF NOT EXISTS idx_skill_files_skill
1425
+ ON skill_files(skill_id);
1426
+ `;
1427
+ export const NOTES_V2_TABLES_SQL = `
1428
+ CREATE TABLE IF NOT EXISTS note_revisions (
1429
+ id TEXT PRIMARY KEY,
1430
+ note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
1431
+ title TEXT NOT NULL,
1432
+ content TEXT NOT NULL,
1433
+ created_at INTEGER NOT NULL
1434
+ );
1435
+
1436
+ CREATE INDEX IF NOT EXISTS idx_note_revisions_note
1437
+ ON note_revisions(note_id, created_at);
1438
+
1439
+ CREATE TABLE IF NOT EXISTS note_attachments (
1440
+ id TEXT PRIMARY KEY,
1441
+ note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
1442
+ blob_id TEXT NOT NULL,
1443
+ filename TEXT NOT NULL,
1444
+ content_type TEXT NOT NULL,
1445
+ size INTEGER NOT NULL,
1446
+ created_at INTEGER NOT NULL
1447
+ );
1448
+
1449
+ CREATE INDEX IF NOT EXISTS idx_note_attachments_note
1450
+ ON note_attachments(note_id);
1451
+ `;
1452
+ export const NOTES_V2_SCHEMA_SQL = `
1453
+ ALTER TABLE notes ADD COLUMN pinned INTEGER DEFAULT 0;
1454
+
1455
+ CREATE TABLE IF NOT EXISTS note_revisions (
1456
+ id TEXT PRIMARY KEY,
1457
+ note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
1458
+ title TEXT NOT NULL,
1459
+ content TEXT NOT NULL,
1460
+ created_at INTEGER NOT NULL
1461
+ );
1462
+
1463
+ CREATE INDEX IF NOT EXISTS idx_note_revisions_note
1464
+ ON note_revisions(note_id, created_at);
1465
+
1466
+ CREATE TABLE IF NOT EXISTS note_attachments (
1467
+ id TEXT PRIMARY KEY,
1468
+ note_id TEXT NOT NULL REFERENCES notes(id) ON DELETE CASCADE,
1469
+ blob_id TEXT NOT NULL,
1470
+ filename TEXT NOT NULL,
1471
+ content_type TEXT NOT NULL,
1472
+ size INTEGER NOT NULL,
1473
+ created_at INTEGER NOT NULL
1474
+ );
1475
+
1476
+ CREATE INDEX IF NOT EXISTS idx_note_attachments_note
1477
+ ON note_attachments(note_id);
1478
+ `;
1479
+ export const TEAM_COLLABORATION_TABLES_SQL = `
1480
+ CREATE INDEX IF NOT EXISTS idx_calendar_scoped_events
1481
+ ON calendar_events(calendar_id)
1482
+ WHERE calendar_id IS NOT NULL;
1483
+
1484
+ CREATE TABLE IF NOT EXISTS calendars (
1485
+ id TEXT PRIMARY KEY,
1486
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1487
+ name TEXT NOT NULL,
1488
+ color TEXT,
1489
+ created_at INTEGER NOT NULL,
1490
+ updated_at INTEGER NOT NULL
1491
+ );
1492
+
1493
+ CREATE INDEX IF NOT EXISTS idx_calendars_owner
1494
+ ON calendars(user_id, updated_at);
1495
+
1496
+ CREATE TABLE IF NOT EXISTS channels (
1497
+ id TEXT PRIMARY KEY,
1498
+ type TEXT NOT NULL CHECK (type IN ('public', 'private', 'dm')),
1499
+ name TEXT NOT NULL,
1500
+ description TEXT,
1501
+ dm_key TEXT,
1502
+ created_by TEXT,
1503
+ created_at INTEGER NOT NULL,
1504
+ updated_at INTEGER NOT NULL,
1505
+ archived_at INTEGER
1506
+ );
1507
+
1508
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_channels_dm_key
1509
+ ON channels(dm_key)
1510
+ WHERE dm_key IS NOT NULL;
1511
+
1512
+ CREATE TABLE IF NOT EXISTS channel_members (
1513
+ channel_id TEXT NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
1514
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1515
+ role TEXT NOT NULL CHECK (role IN ('owner', 'member')),
1516
+ joined_at INTEGER NOT NULL,
1517
+ last_read_at INTEGER NOT NULL DEFAULT 0,
1518
+ PRIMARY KEY (channel_id, user_id)
1519
+ );
1520
+
1521
+ CREATE INDEX IF NOT EXISTS idx_channel_members_user
1522
+ ON channel_members(user_id);
1523
+
1524
+ CREATE TABLE IF NOT EXISTS channel_messages (
1525
+ id TEXT PRIMARY KEY,
1526
+ channel_id TEXT NOT NULL REFERENCES channels(id) ON DELETE CASCADE,
1527
+ user_id TEXT,
1528
+ parent_id TEXT,
1529
+ author_kind TEXT NOT NULL DEFAULT 'user' CHECK (author_kind IN ('user', 'model')),
1530
+ model TEXT,
1531
+ content TEXT NOT NULL,
1532
+ metadata TEXT,
1533
+ created_at INTEGER NOT NULL,
1534
+ updated_at INTEGER NOT NULL,
1535
+ edited_at INTEGER,
1536
+ deleted_at INTEGER,
1537
+ pinned_at INTEGER,
1538
+ pinned_by TEXT
1539
+ );
1540
+
1541
+ CREATE INDEX IF NOT EXISTS idx_channel_messages_timeline
1542
+ ON channel_messages(channel_id, created_at, id);
1543
+
1544
+ CREATE INDEX IF NOT EXISTS idx_channel_messages_thread
1545
+ ON channel_messages(parent_id)
1546
+ WHERE parent_id IS NOT NULL;
1547
+
1548
+ CREATE TABLE IF NOT EXISTS channel_reactions (
1549
+ id TEXT PRIMARY KEY,
1550
+ message_id TEXT NOT NULL REFERENCES channel_messages(id) ON DELETE CASCADE,
1551
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1552
+ emoji TEXT NOT NULL,
1553
+ created_at INTEGER NOT NULL,
1554
+ UNIQUE (message_id, user_id, emoji)
1555
+ );
1556
+
1557
+ CREATE TABLE IF NOT EXISTS channel_attachments (
1558
+ id TEXT PRIMARY KEY,
1559
+ message_id TEXT NOT NULL REFERENCES channel_messages(id) ON DELETE CASCADE,
1560
+ channel_id TEXT NOT NULL,
1561
+ blob_id TEXT NOT NULL,
1562
+ filename TEXT NOT NULL,
1563
+ content_type TEXT NOT NULL,
1564
+ size INTEGER NOT NULL,
1565
+ created_by TEXT,
1566
+ created_at INTEGER NOT NULL
1567
+ );
1568
+
1569
+ CREATE INDEX IF NOT EXISTS idx_channel_attachments_message
1570
+ ON channel_attachments(message_id);
1571
+
1572
+ CREATE TABLE IF NOT EXISTS notifications (
1573
+ id TEXT PRIMARY KEY,
1574
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1575
+ type TEXT NOT NULL,
1576
+ title TEXT NOT NULL,
1577
+ body TEXT,
1578
+ href TEXT,
1579
+ source_key TEXT,
1580
+ created_at INTEGER NOT NULL,
1581
+ read_at INTEGER
1582
+ );
1583
+
1584
+ CREATE INDEX IF NOT EXISTS idx_notifications_user
1585
+ ON notifications(user_id, created_at);
1586
+
1587
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_notifications_dedupe
1588
+ ON notifications(user_id, source_key)
1589
+ WHERE source_key IS NOT NULL;
1590
+
1591
+ CREATE TABLE IF NOT EXISTS webhook_targets (
1592
+ id TEXT PRIMARY KEY,
1593
+ name TEXT NOT NULL,
1594
+ url TEXT NOT NULL,
1595
+ secret TEXT,
1596
+ events TEXT NOT NULL,
1597
+ enabled INTEGER NOT NULL DEFAULT 1 CHECK (enabled IN (0, 1)),
1598
+ created_by TEXT,
1599
+ created_at INTEGER NOT NULL,
1600
+ updated_at INTEGER NOT NULL
1601
+ );
1602
+ `;
1603
+ export const TEAM_COLLABORATION_SCHEMA_SQL = `
1604
+ ALTER TABLE calendar_events ADD COLUMN calendar_id TEXT;
1605
+ ALTER TABLE calendar_events ADD COLUMN reminder_minutes INTEGER;
1606
+ ALTER TABLE calendar_events ADD COLUMN last_reminded_occurrence INTEGER;
1607
+ ${TEAM_COLLABORATION_TABLES_SQL}`;
1608
+ export const MEDIA_ENTERPRISE_OPS_TABLES_SQL = `
1609
+ CREATE TABLE IF NOT EXISTS model_tariffs (
1610
+ id TEXT PRIMARY KEY,
1611
+ plugin_id TEXT NOT NULL,
1612
+ model TEXT,
1613
+ input_per_million REAL,
1614
+ output_per_million REAL,
1615
+ unit_price REAL,
1616
+ currency TEXT NOT NULL DEFAULT 'USD',
1617
+ effective_from INTEGER NOT NULL,
1618
+ created_by TEXT,
1619
+ created_at INTEGER NOT NULL
1620
+ );
1621
+
1622
+ CREATE INDEX IF NOT EXISTS idx_model_tariffs_lookup
1623
+ ON model_tariffs(plugin_id, model, effective_from);
1624
+
1625
+ CREATE TABLE IF NOT EXISTS usage_budgets (
1626
+ id TEXT PRIMARY KEY,
1627
+ name TEXT NOT NULL,
1628
+ principal_type TEXT NOT NULL CHECK (principal_type IN ('instance', 'user', 'group')),
1629
+ principal_id TEXT,
1630
+ period TEXT NOT NULL CHECK (period IN ('daily', 'weekly', 'monthly')),
1631
+ amount_usd REAL NOT NULL,
1632
+ mode TEXT NOT NULL CHECK (mode IN ('observe', 'soft', 'hard')),
1633
+ created_by TEXT,
1634
+ created_at INTEGER NOT NULL,
1635
+ updated_at INTEGER NOT NULL
1636
+ );
1637
+
1638
+ CREATE INDEX IF NOT EXISTS idx_usage_budgets_principal
1639
+ ON usage_budgets(principal_type, principal_id);
1640
+
1641
+ CREATE TABLE IF NOT EXISTS message_feedback (
1642
+ id TEXT PRIMARY KEY,
1643
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1644
+ session_id TEXT NOT NULL,
1645
+ message_id TEXT NOT NULL,
1646
+ rating INTEGER NOT NULL CHECK (rating IN (-1, 1)),
1647
+ tags TEXT,
1648
+ comment TEXT,
1649
+ model TEXT,
1650
+ plugin_id TEXT,
1651
+ snapshot TEXT,
1652
+ created_at INTEGER NOT NULL,
1653
+ updated_at INTEGER NOT NULL,
1654
+ UNIQUE (user_id, message_id)
1655
+ );
1656
+
1657
+ CREATE INDEX IF NOT EXISTS idx_message_feedback_owner
1658
+ ON message_feedback(user_id, created_at);
1659
+
1660
+ CREATE TABLE IF NOT EXISTS arena_votes (
1661
+ id TEXT PRIMARY KEY,
1662
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1663
+ compare_group TEXT NOT NULL,
1664
+ model_a TEXT NOT NULL,
1665
+ model_b TEXT NOT NULL,
1666
+ winner TEXT NOT NULL CHECK (winner IN ('a', 'b', 'tie', 'both-bad')),
1667
+ created_at INTEGER NOT NULL,
1668
+ UNIQUE (user_id, compare_group)
1669
+ );
1670
+
1671
+ CREATE INDEX IF NOT EXISTS idx_arena_votes_order
1672
+ ON arena_votes(created_at, id);
1673
+
1674
+ CREATE TABLE IF NOT EXISTS eval_sets (
1675
+ id TEXT PRIMARY KEY,
1676
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1677
+ name TEXT NOT NULL,
1678
+ description TEXT,
1679
+ items TEXT NOT NULL,
987
1680
  created_at INTEGER NOT NULL,
988
1681
  updated_at INTEGER NOT NULL
989
1682
  );
990
1683
 
991
- CREATE INDEX IF NOT EXISTS idx_automations_owner
992
- ON automations(user_id, updated_at);
993
-
994
- CREATE INDEX IF NOT EXISTS idx_automations_due
995
- ON automations(status, next_run_at);
1684
+ CREATE INDEX IF NOT EXISTS idx_eval_sets_owner
1685
+ ON eval_sets(user_id, updated_at);
996
1686
 
997
- CREATE TABLE IF NOT EXISTS automation_runs (
1687
+ CREATE TABLE IF NOT EXISTS eval_runs (
998
1688
  id TEXT PRIMARY KEY,
999
- automation_id TEXT NOT NULL REFERENCES automations(id) ON DELETE CASCADE,
1689
+ set_id TEXT NOT NULL REFERENCES eval_sets(id) ON DELETE CASCADE,
1000
1690
  user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
1001
- scheduled_for INTEGER NOT NULL,
1002
- started_at INTEGER,
1003
- finished_at INTEGER,
1004
- status TEXT NOT NULL
1005
- CHECK (status IN ('queued', 'running', 'succeeded', 'failed')),
1006
- session_id TEXT,
1007
- assistant_message_id TEXT,
1691
+ label TEXT,
1692
+ plugin_id TEXT,
1693
+ model TEXT NOT NULL,
1694
+ status TEXT NOT NULL CHECK (status IN ('queued', 'running', 'completed', 'failed', 'cancelled')),
1695
+ results TEXT,
1008
1696
  error TEXT,
1009
- seen_at INTEGER,
1010
- created_at INTEGER NOT NULL
1697
+ created_at INTEGER NOT NULL,
1698
+ updated_at INTEGER NOT NULL,
1699
+ completed_at INTEGER
1011
1700
  );
1012
1701
 
1013
- CREATE INDEX IF NOT EXISTS idx_automation_runs_automation
1014
- ON automation_runs(automation_id, scheduled_for);
1702
+ CREATE INDEX IF NOT EXISTS idx_eval_runs_owner
1703
+ ON eval_runs(user_id, created_at);
1015
1704
 
1016
- CREATE INDEX IF NOT EXISTS idx_automation_runs_owner_time
1017
- ON automation_runs(user_id, scheduled_for);
1705
+ CREATE INDEX IF NOT EXISTS idx_eval_runs_parent
1706
+ ON eval_runs(set_id);
1018
1707
  `;
1708
+ export const MEDIA_ENTERPRISE_OPS_SCHEMA_SQL = `
1709
+ ALTER TABLE voice_profiles ADD COLUMN consent_expires_at INTEGER;
1710
+ ALTER TABLE voice_profiles ADD COLUMN revoked_at INTEGER;
1711
+ ALTER TABLE voice_profiles ADD COLUMN transfer_count INTEGER NOT NULL DEFAULT 0;
1712
+ ALTER TABLE voice_profiles ADD COLUMN last_transfer_at INTEGER;
1713
+ ${MEDIA_ENTERPRISE_OPS_TABLES_SQL}`;
1019
1714
  const REQUIRED_SCHEMA = {
1020
1715
  ...LEGACY_REQUIRED_SCHEMA,
1021
1716
  users: [
@@ -1187,6 +1882,31 @@ const REQUIRED_PRIMARY_KEYS = {
1187
1882
  calendar_events: ['id'],
1188
1883
  automations: ['id'],
1189
1884
  automation_runs: ['id'],
1885
+ tool_servers: ['id'],
1886
+ tool_server_tools: ['id'],
1887
+ tool_server_credentials: ['id'],
1888
+ tool_approvals: ['id'],
1889
+ prompts: ['id'],
1890
+ prompt_versions: ['id'],
1891
+ skills: ['id'],
1892
+ skill_versions: ['id'],
1893
+ skill_files: ['id'],
1894
+ note_revisions: ['id'],
1895
+ note_attachments: ['id'],
1896
+ calendars: ['id'],
1897
+ channels: ['id'],
1898
+ channel_members: ['channel_id', 'user_id'],
1899
+ channel_messages: ['id'],
1900
+ channel_reactions: ['id'],
1901
+ channel_attachments: ['id'],
1902
+ notifications: ['id'],
1903
+ webhook_targets: ['id'],
1904
+ model_tariffs: ['id'],
1905
+ usage_budgets: ['id'],
1906
+ message_feedback: ['id'],
1907
+ arena_votes: ['id'],
1908
+ eval_sets: ['id'],
1909
+ eval_runs: ['id'],
1190
1910
  };
1191
1911
  const REQUIRED_UNIQUE_KEYS = {
1192
1912
  [MIGRATION_TABLE]: [['name']],
@@ -1206,6 +1926,15 @@ const REQUIRED_UNIQUE_KEYS = {
1206
1926
  ['resource_type', 'resource_id', 'principal_type', 'principal_id'],
1207
1927
  ],
1208
1928
  api_tokens: [['token_hash']],
1929
+ tool_server_tools: [['server_id', 'name']],
1930
+ tool_server_credentials: [['server_id', 'user_id']],
1931
+ prompts: [['user_id', 'slug']],
1932
+ prompt_versions: [['prompt_id', 'version']],
1933
+ skills: [['user_id', 'slug']],
1934
+ skill_versions: [['skill_id', 'version']],
1935
+ skill_files: [['skill_id', 'path']],
1936
+ message_feedback: [['user_id', 'message_id']],
1937
+ arena_votes: [['user_id', 'compare_group']],
1209
1938
  };
1210
1939
  const REQUIRED_FOREIGN_KEYS = [
1211
1940
  {
@@ -1376,6 +2105,181 @@ const REQUIRED_FOREIGN_KEYS = [
1376
2105
  referencedColumns: ['id'],
1377
2106
  onDelete: 'CASCADE',
1378
2107
  },
2108
+ {
2109
+ table: 'tool_servers',
2110
+ columns: ['user_id'],
2111
+ referencedTable: 'users',
2112
+ referencedColumns: ['id'],
2113
+ onDelete: 'CASCADE',
2114
+ },
2115
+ {
2116
+ table: 'tool_server_tools',
2117
+ columns: ['server_id'],
2118
+ referencedTable: 'tool_servers',
2119
+ referencedColumns: ['id'],
2120
+ onDelete: 'CASCADE',
2121
+ },
2122
+ {
2123
+ table: 'tool_server_credentials',
2124
+ columns: ['server_id'],
2125
+ referencedTable: 'tool_servers',
2126
+ referencedColumns: ['id'],
2127
+ onDelete: 'CASCADE',
2128
+ },
2129
+ {
2130
+ table: 'tool_server_credentials',
2131
+ columns: ['user_id'],
2132
+ referencedTable: 'users',
2133
+ referencedColumns: ['id'],
2134
+ onDelete: 'CASCADE',
2135
+ },
2136
+ {
2137
+ table: 'tool_approvals',
2138
+ columns: ['user_id'],
2139
+ referencedTable: 'users',
2140
+ referencedColumns: ['id'],
2141
+ onDelete: 'CASCADE',
2142
+ },
2143
+ {
2144
+ table: 'tool_approvals',
2145
+ columns: ['session_id'],
2146
+ referencedTable: 'sessions',
2147
+ referencedColumns: ['id'],
2148
+ onDelete: 'CASCADE',
2149
+ },
2150
+ {
2151
+ table: 'prompts',
2152
+ columns: ['user_id'],
2153
+ referencedTable: 'users',
2154
+ referencedColumns: ['id'],
2155
+ onDelete: 'CASCADE',
2156
+ },
2157
+ {
2158
+ table: 'prompt_versions',
2159
+ columns: ['prompt_id'],
2160
+ referencedTable: 'prompts',
2161
+ referencedColumns: ['id'],
2162
+ onDelete: 'CASCADE',
2163
+ },
2164
+ {
2165
+ table: 'skills',
2166
+ columns: ['user_id'],
2167
+ referencedTable: 'users',
2168
+ referencedColumns: ['id'],
2169
+ onDelete: 'CASCADE',
2170
+ },
2171
+ {
2172
+ table: 'skill_versions',
2173
+ columns: ['skill_id'],
2174
+ referencedTable: 'skills',
2175
+ referencedColumns: ['id'],
2176
+ onDelete: 'CASCADE',
2177
+ },
2178
+ {
2179
+ table: 'skill_files',
2180
+ columns: ['skill_id'],
2181
+ referencedTable: 'skills',
2182
+ referencedColumns: ['id'],
2183
+ onDelete: 'CASCADE',
2184
+ },
2185
+ {
2186
+ table: 'note_revisions',
2187
+ columns: ['note_id'],
2188
+ referencedTable: 'notes',
2189
+ referencedColumns: ['id'],
2190
+ onDelete: 'CASCADE',
2191
+ },
2192
+ {
2193
+ table: 'note_attachments',
2194
+ columns: ['note_id'],
2195
+ referencedTable: 'notes',
2196
+ referencedColumns: ['id'],
2197
+ onDelete: 'CASCADE',
2198
+ },
2199
+ {
2200
+ table: 'calendars',
2201
+ columns: ['user_id'],
2202
+ referencedTable: 'users',
2203
+ referencedColumns: ['id'],
2204
+ onDelete: 'CASCADE',
2205
+ },
2206
+ {
2207
+ table: 'channel_members',
2208
+ columns: ['channel_id'],
2209
+ referencedTable: 'channels',
2210
+ referencedColumns: ['id'],
2211
+ onDelete: 'CASCADE',
2212
+ },
2213
+ {
2214
+ table: 'channel_members',
2215
+ columns: ['user_id'],
2216
+ referencedTable: 'users',
2217
+ referencedColumns: ['id'],
2218
+ onDelete: 'CASCADE',
2219
+ },
2220
+ {
2221
+ table: 'channel_messages',
2222
+ columns: ['channel_id'],
2223
+ referencedTable: 'channels',
2224
+ referencedColumns: ['id'],
2225
+ onDelete: 'CASCADE',
2226
+ },
2227
+ {
2228
+ table: 'channel_reactions',
2229
+ columns: ['message_id'],
2230
+ referencedTable: 'channel_messages',
2231
+ referencedColumns: ['id'],
2232
+ onDelete: 'CASCADE',
2233
+ },
2234
+ {
2235
+ table: 'channel_attachments',
2236
+ columns: ['message_id'],
2237
+ referencedTable: 'channel_messages',
2238
+ referencedColumns: ['id'],
2239
+ onDelete: 'CASCADE',
2240
+ },
2241
+ {
2242
+ table: 'notifications',
2243
+ columns: ['user_id'],
2244
+ referencedTable: 'users',
2245
+ referencedColumns: ['id'],
2246
+ onDelete: 'CASCADE',
2247
+ },
2248
+ {
2249
+ table: 'message_feedback',
2250
+ columns: ['user_id'],
2251
+ referencedTable: 'users',
2252
+ referencedColumns: ['id'],
2253
+ onDelete: 'CASCADE',
2254
+ },
2255
+ {
2256
+ table: 'arena_votes',
2257
+ columns: ['user_id'],
2258
+ referencedTable: 'users',
2259
+ referencedColumns: ['id'],
2260
+ onDelete: 'CASCADE',
2261
+ },
2262
+ {
2263
+ table: 'eval_sets',
2264
+ columns: ['user_id'],
2265
+ referencedTable: 'users',
2266
+ referencedColumns: ['id'],
2267
+ onDelete: 'CASCADE',
2268
+ },
2269
+ {
2270
+ table: 'eval_runs',
2271
+ columns: ['user_id'],
2272
+ referencedTable: 'users',
2273
+ referencedColumns: ['id'],
2274
+ onDelete: 'CASCADE',
2275
+ },
2276
+ {
2277
+ table: 'eval_runs',
2278
+ columns: ['set_id'],
2279
+ referencedTable: 'eval_sets',
2280
+ referencedColumns: ['id'],
2281
+ onDelete: 'CASCADE',
2282
+ },
1379
2283
  ];
1380
2284
  const REQUIRED_INDEXES = [
1381
2285
  {
@@ -1598,6 +2502,126 @@ const REQUIRED_INDEXES = [
1598
2502
  table: 'automation_runs',
1599
2503
  columns: ['user_id', 'scheduled_for'],
1600
2504
  },
2505
+ {
2506
+ name: 'idx_tool_servers_updated',
2507
+ table: 'tool_servers',
2508
+ columns: ['updated_at'],
2509
+ },
2510
+ {
2511
+ name: 'idx_tool_approvals_owner',
2512
+ table: 'tool_approvals',
2513
+ columns: ['user_id', 'status', 'created_at'],
2514
+ },
2515
+ {
2516
+ name: 'idx_prompts_owner',
2517
+ table: 'prompts',
2518
+ columns: ['user_id', 'updated_at'],
2519
+ },
2520
+ {
2521
+ name: 'idx_skills_owner',
2522
+ table: 'skills',
2523
+ columns: ['user_id', 'updated_at'],
2524
+ },
2525
+ {
2526
+ name: 'idx_skill_files_skill',
2527
+ table: 'skill_files',
2528
+ columns: ['skill_id'],
2529
+ },
2530
+ {
2531
+ name: 'idx_note_revisions_note',
2532
+ table: 'note_revisions',
2533
+ columns: ['note_id', 'created_at'],
2534
+ },
2535
+ {
2536
+ name: 'idx_note_attachments_note',
2537
+ table: 'note_attachments',
2538
+ columns: ['note_id'],
2539
+ },
2540
+ {
2541
+ name: 'idx_calendar_scoped_events',
2542
+ table: 'calendar_events',
2543
+ columns: ['calendar_id'],
2544
+ sqlFragment: 'WHERE calendar_id IS NOT NULL',
2545
+ },
2546
+ {
2547
+ name: 'idx_calendars_owner',
2548
+ table: 'calendars',
2549
+ columns: ['user_id', 'updated_at'],
2550
+ },
2551
+ {
2552
+ name: 'idx_channels_dm_key',
2553
+ table: 'channels',
2554
+ columns: ['dm_key'],
2555
+ unique: true,
2556
+ sqlFragment: 'WHERE dm_key IS NOT NULL',
2557
+ },
2558
+ {
2559
+ name: 'idx_channel_members_user',
2560
+ table: 'channel_members',
2561
+ columns: ['user_id'],
2562
+ },
2563
+ {
2564
+ name: 'idx_channel_messages_timeline',
2565
+ table: 'channel_messages',
2566
+ columns: ['channel_id', 'created_at', 'id'],
2567
+ },
2568
+ {
2569
+ name: 'idx_channel_messages_thread',
2570
+ table: 'channel_messages',
2571
+ columns: ['parent_id'],
2572
+ },
2573
+ {
2574
+ name: 'idx_channel_attachments_message',
2575
+ table: 'channel_attachments',
2576
+ columns: ['message_id'],
2577
+ },
2578
+ {
2579
+ name: 'idx_notifications_user',
2580
+ table: 'notifications',
2581
+ columns: ['user_id', 'created_at'],
2582
+ },
2583
+ {
2584
+ name: 'idx_notifications_dedupe',
2585
+ table: 'notifications',
2586
+ columns: ['user_id', 'source_key'],
2587
+ unique: true,
2588
+ sqlFragment: 'WHERE source_key IS NOT NULL',
2589
+ },
2590
+ {
2591
+ name: 'idx_model_tariffs_lookup',
2592
+ table: 'model_tariffs',
2593
+ columns: ['plugin_id', 'model', 'effective_from'],
2594
+ },
2595
+ {
2596
+ name: 'idx_usage_budgets_principal',
2597
+ table: 'usage_budgets',
2598
+ columns: ['principal_type', 'principal_id'],
2599
+ },
2600
+ {
2601
+ name: 'idx_message_feedback_owner',
2602
+ table: 'message_feedback',
2603
+ columns: ['user_id', 'created_at'],
2604
+ },
2605
+ {
2606
+ name: 'idx_arena_votes_order',
2607
+ table: 'arena_votes',
2608
+ columns: ['created_at', 'id'],
2609
+ },
2610
+ {
2611
+ name: 'idx_eval_sets_owner',
2612
+ table: 'eval_sets',
2613
+ columns: ['user_id', 'updated_at'],
2614
+ },
2615
+ {
2616
+ name: 'idx_eval_runs_owner',
2617
+ table: 'eval_runs',
2618
+ columns: ['user_id', 'created_at'],
2619
+ },
2620
+ {
2621
+ name: 'idx_eval_runs_parent',
2622
+ table: 'eval_runs',
2623
+ columns: ['set_id'],
2624
+ },
1601
2625
  ];
1602
2626
  const REQUIRED_TABLE_SQL_FRAGMENTS = {
1603
2627
  platform_vector_entries: ['CHECK(dimensions > 0)'],
@@ -1634,6 +2658,33 @@ const REQUIRED_TABLE_SQL_FRAGMENTS = {
1634
2658
  "permission IN ('read', 'write', 'admin')",
1635
2659
  ],
1636
2660
  security_audit_events: ["result IN ('success', 'denied', 'failure')"],
2661
+ tool_servers: [
2662
+ "kind IN ('openapi', 'mcp')",
2663
+ "auth_mode IN ('none', 'bearer', 'header')",
2664
+ "access_mode IN ('admins-only', 'all-users', 'granted')",
2665
+ ],
2666
+ tool_approvals: [
2667
+ "scope IN ('once', 'session', 'always')",
2668
+ "status IN ('pending', 'approved', 'denied', 'expired')",
2669
+ ],
2670
+ channels: ["type IN ('public', 'private', 'dm')"],
2671
+ channel_members: ["role IN ('owner', 'member')"],
2672
+ channel_messages: ["author_kind IN ('user', 'model')"],
2673
+ channel_reactions: ['UNIQUE (message_id, user_id, emoji)'],
2674
+ webhook_targets: ['enabled IN (0, 1)'],
2675
+ usage_budgets: [
2676
+ "principal_type IN ('instance', 'user', 'group')",
2677
+ "period IN ('daily', 'weekly', 'monthly')",
2678
+ "mode IN ('observe', 'soft', 'hard')",
2679
+ ],
2680
+ message_feedback: ['rating IN (-1, 1)', 'UNIQUE (user_id, message_id)'],
2681
+ arena_votes: [
2682
+ "winner IN ('a', 'b', 'tie', 'both-bad')",
2683
+ 'UNIQUE (user_id, compare_group)',
2684
+ ],
2685
+ eval_runs: [
2686
+ "status IN ('queued', 'running', 'completed', 'failed', 'cancelled')",
2687
+ ],
1637
2688
  };
1638
2689
  const quoteIdentifier = (identifier) => `"${identifier.replace(/"/g, '""')}"`;
1639
2690
  const normalizeSql = (sql) => sql
@@ -1855,6 +2906,10 @@ const collectMissingSchema = (database) => [
1855
2906
  ...collectMissingResourceDeletionLifecycleSchema(database),
1856
2907
  ...collectMissingTrustFoundationSchema(database),
1857
2908
  ...collectMissingPersonalAutomationsSchema(database),
2909
+ ...collectMissingAgentFoundationSchema(database),
2910
+ ...collectMissingSkillFilesSchema(database),
2911
+ ...collectMissingNotesV2Schema(database),
2912
+ ...collectMissingTeamCollaborationSchema(database),
1858
2913
  ];
1859
2914
  const collectMissingMigrationLedgerSchema = (database) => [
1860
2915
  ...collectMissingColumns(database, {
@@ -1866,7 +2921,8 @@ const collectMissingLegacySchema = (database) => [
1866
2921
  ...collectMissingColumns(database, LEGACY_REQUIRED_SCHEMA),
1867
2922
  ...collectMissingStructuralInvariants(database).filter(item => !item.includes('platform_') &&
1868
2923
  !item.includes('idx_users_email_lookup') &&
1869
- !item.includes('idx_voice_profiles_name_lookup')),
2924
+ !item.includes('idx_voice_profiles_name_lookup') &&
2925
+ !item.includes('idx_calendar_scoped_events')),
1870
2926
  ];
1871
2927
  const collectMissingIdentityEmailLookupSchema = (database) => [
1872
2928
  ...collectMissingColumns(database, IDENTITY_EMAIL_LOOKUP_REQUIRED_SCHEMA),
@@ -1921,6 +2977,38 @@ const collectMissingPersonalAutomationsSchema = (database) => [
1921
2977
  item.includes('automations') ||
1922
2978
  item.includes('automation_runs')),
1923
2979
  ];
2980
+ const collectMissingAgentFoundationSchema = (database) => [
2981
+ ...collectMissingColumns(database, AGENT_FOUNDATION_REQUIRED_SCHEMA),
2982
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('tool_server') ||
2983
+ item.includes('tool_approvals') ||
2984
+ item.includes('prompt') ||
2985
+ item.includes('skill')),
2986
+ ];
2987
+ const collectMissingSkillFilesSchema = (database) => [
2988
+ ...collectMissingColumns(database, SKILL_FILES_REQUIRED_SCHEMA),
2989
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('skill_files')),
2990
+ ];
2991
+ const collectMissingNotesV2Schema = (database) => [
2992
+ ...collectMissingColumns(database, NOTES_V2_REQUIRED_SCHEMA),
2993
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('note_revisions') || item.includes('note_attachments')),
2994
+ ];
2995
+ const collectMissingTeamCollaborationSchema = (database) => [
2996
+ ...collectMissingColumns(database, TEAM_COLLABORATION_REQUIRED_SCHEMA),
2997
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('channel') ||
2998
+ item.includes('notifications') ||
2999
+ item.includes('webhook_targets') ||
3000
+ item.includes('calendars') ||
3001
+ item.includes('idx_calendar_scoped_events')),
3002
+ ];
3003
+ const collectMissingMediaEnterpriseOpsSchema = (database) => [
3004
+ ...collectMissingColumns(database, MEDIA_ENTERPRISE_OPS_REQUIRED_SCHEMA),
3005
+ ...collectMissingStructuralInvariants(database).filter(item => item.includes('model_tariffs') ||
3006
+ item.includes('usage_budgets') ||
3007
+ item.includes('message_feedback') ||
3008
+ item.includes('arena_votes') ||
3009
+ item.includes('eval_sets') ||
3010
+ item.includes('eval_runs')),
3011
+ ];
1924
3012
  const collectMissingIdentityAccountRetirementSchema = (database) => {
1925
3013
  const row = database
1926
3014
  .prepare("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'users'")
@@ -1959,6 +3047,11 @@ function collectMissingSchemaAtVersion(database, version) {
1959
3047
  : []),
1960
3048
  ...(version >= 14 ? collectMissingTrustFoundationSchema(database) : []),
1961
3049
  ...(version >= 15 ? collectMissingPersonalAutomationsSchema(database) : []),
3050
+ ...(version >= 16 ? collectMissingAgentFoundationSchema(database) : []),
3051
+ ...(version >= 17 ? collectMissingSkillFilesSchema(database) : []),
3052
+ ...(version >= 18 ? collectMissingNotesV2Schema(database) : []),
3053
+ ...(version >= 19 ? collectMissingTeamCollaborationSchema(database) : []),
3054
+ ...(version >= 20 ? collectMissingMediaEnterpriseOpsSchema(database) : []),
1962
3055
  ];
1963
3056
  }
1964
3057
  const collectMissingLegacyBootstrapSchema = (database) => {
@@ -2009,6 +3102,11 @@ const DURABLE_EVENT_REPLAY_INDEX_MIGRATION_CHECKSUM = '7d6b769ceadd08791c77ac5c5
2009
3102
  const TRUST_FOUNDATION_MIGRATION_CHECKSUM = 'c5a73245de3cd3e37db8877c8457c975d789f98c1c71ae1e4fc891ba09e8de5a';
2010
3103
  const LEGACY_DURABLE_EVENT_REPLAY_INDEX_MIGRATION_CHECKSUM = 'DURABLE_EVENT_REPLAY_INDEX_CHECKSUM_TO_FREEZE';
2011
3104
  const PERSONAL_AUTOMATIONS_MIGRATION_CHECKSUM = '5bfb4a1789480a3cacc09c5a4359a4e77b82b0edafa80f6d78cde73e57ddc70b';
3105
+ const AGENT_FOUNDATION_MIGRATION_CHECKSUM = '7e3a346fae66c073aac800aa45847999a4300b2f17eb3eaf9ed6351e891e2941';
3106
+ const SKILL_FILES_MIGRATION_CHECKSUM = '584e1f9bca79eb5974f997088636d74d7f2c1e5fd816fcd0f6cf74ec30aea161';
3107
+ const NOTES_V2_MIGRATION_CHECKSUM = '05a6758ab2b2a54f9097a5d5604a2bd57e085f1dd16816b5dc96d1eb7a41a399';
3108
+ const TEAM_COLLABORATION_MIGRATION_CHECKSUM = '1cf021c941cfd9207a82e794e58d7553ae24a35b3f8f8a84bb4a0e06d0d77443';
3109
+ const MEDIA_ENTERPRISE_OPS_MIGRATION_CHECKSUM = 'c6bc6d98518f7a279ad7109cfdfcd8a75fbf7e3e157c50bca98142b50ac0f38b';
2012
3110
  const MIGRATIONS = [
2013
3111
  {
2014
3112
  version: 1,
@@ -2231,6 +3329,75 @@ const MIGRATIONS = [
2231
3329
  }
2232
3330
  },
2233
3331
  },
3332
+ {
3333
+ version: 16,
3334
+ name: 'agent-foundation',
3335
+ checksum: AGENT_FOUNDATION_MIGRATION_CHECKSUM,
3336
+ apply(database) {
3337
+ addColumnIfMissing(database, 'personas', 'bindings', 'TEXT');
3338
+ database.exec(AGENT_FOUNDATION_TABLES_SQL);
3339
+ const missing = collectMissingAgentFoundationSchema(database);
3340
+ if (missing.length > 0) {
3341
+ throw new Error(`SQLite agent foundation schema is incomplete; missing ${missing.join(', ')}`);
3342
+ }
3343
+ },
3344
+ },
3345
+ {
3346
+ version: 17,
3347
+ name: 'skill-files',
3348
+ checksum: SKILL_FILES_MIGRATION_CHECKSUM,
3349
+ apply(database) {
3350
+ database.exec(SKILL_FILES_SCHEMA_SQL);
3351
+ const missing = collectMissingSkillFilesSchema(database);
3352
+ if (missing.length > 0) {
3353
+ throw new Error(`SQLite skill files schema is incomplete; missing ${missing.join(', ')}`);
3354
+ }
3355
+ },
3356
+ },
3357
+ {
3358
+ version: 18,
3359
+ name: 'notes-v2',
3360
+ checksum: NOTES_V2_MIGRATION_CHECKSUM,
3361
+ apply(database) {
3362
+ addColumnIfMissing(database, 'notes', 'pinned', 'INTEGER DEFAULT 0');
3363
+ database.exec(NOTES_V2_TABLES_SQL);
3364
+ const missing = collectMissingNotesV2Schema(database);
3365
+ if (missing.length > 0) {
3366
+ throw new Error(`SQLite notes v2 schema is incomplete; missing ${missing.join(', ')}`);
3367
+ }
3368
+ },
3369
+ },
3370
+ {
3371
+ version: 19,
3372
+ name: 'team-collaboration',
3373
+ checksum: TEAM_COLLABORATION_MIGRATION_CHECKSUM,
3374
+ apply(database) {
3375
+ addColumnIfMissing(database, 'calendar_events', 'calendar_id', 'TEXT');
3376
+ addColumnIfMissing(database, 'calendar_events', 'reminder_minutes', 'INTEGER');
3377
+ addColumnIfMissing(database, 'calendar_events', 'last_reminded_occurrence', 'INTEGER');
3378
+ database.exec(TEAM_COLLABORATION_TABLES_SQL);
3379
+ const missing = collectMissingTeamCollaborationSchema(database);
3380
+ if (missing.length > 0) {
3381
+ throw new Error(`SQLite team collaboration schema is incomplete; missing ${missing.join(', ')}`);
3382
+ }
3383
+ },
3384
+ },
3385
+ {
3386
+ version: 20,
3387
+ name: 'media-enterprise-ops',
3388
+ checksum: MEDIA_ENTERPRISE_OPS_MIGRATION_CHECKSUM,
3389
+ apply(database) {
3390
+ addColumnIfMissing(database, 'voice_profiles', 'consent_expires_at', 'INTEGER');
3391
+ addColumnIfMissing(database, 'voice_profiles', 'revoked_at', 'INTEGER');
3392
+ addColumnIfMissing(database, 'voice_profiles', 'transfer_count', 'INTEGER NOT NULL DEFAULT 0');
3393
+ addColumnIfMissing(database, 'voice_profiles', 'last_transfer_at', 'INTEGER');
3394
+ database.exec(MEDIA_ENTERPRISE_OPS_TABLES_SQL);
3395
+ const missing = collectMissingMediaEnterpriseOpsSchema(database);
3396
+ if (missing.length > 0) {
3397
+ throw new Error(`SQLite media enterprise ops schema is incomplete; missing ${missing.join(', ')}`);
3398
+ }
3399
+ },
3400
+ },
2234
3401
  ];
2235
3402
  /**
2236
3403
  * Whether a pending migration needs foreign-key enforcement suspended before