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
@@ -0,0 +1,119 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Lexical scoring and rank fusion for hybrid document retrieval.
19
+ *
20
+ * Chunk text is encrypted at rest in both storage dialects, so Libre keeps
21
+ * lexical scoring in-process instead of building an on-disk full-text index
22
+ * that would persist plaintext tokens next to the ciphertext. BM25 runs over
23
+ * the ACL-scoped candidate set the caller already loaded, and reciprocal-rank
24
+ * fusion merges that ranking with the vector ranking. Document-frequency
25
+ * statistics are computed per query over the candidate corpus, which keeps
26
+ * scores comparable inside one search and requires no maintained state.
27
+ */
28
+ const BM25_K1 = 1.2;
29
+ const BM25_B = 0.75;
30
+ export const RRF_K = 60;
31
+ const WORD_PATTERN = /[\p{L}\p{N}]+/gu;
32
+ /** Unicode-aware tokens, lowercased, single characters dropped. */
33
+ export const tokenizeForRetrieval = (text) => {
34
+ const tokens = [];
35
+ for (const match of text.toLowerCase().matchAll(WORD_PATTERN)) {
36
+ if (match[0].length > 1)
37
+ tokens.push(match[0]);
38
+ }
39
+ return tokens;
40
+ };
41
+ /**
42
+ * Okapi BM25 over one candidate set. Returns only candidates with a
43
+ * positive score, best first, ties broken by id for deterministic output.
44
+ */
45
+ export const scoreCandidatesBm25 = (query, candidates, options = {}) => {
46
+ const queryTerms = [...new Set(tokenizeForRetrieval(query))];
47
+ if (queryTerms.length === 0 || candidates.length === 0)
48
+ return [];
49
+ const queryWords = options.requireQueryWordMatch
50
+ ? query
51
+ .split(/\s+/)
52
+ .map(word => tokenizeForRetrieval(word))
53
+ .filter(subtokens => subtokens.length > 0)
54
+ : [];
55
+ const termFrequencies = [];
56
+ const lengths = [];
57
+ const documentFrequency = new Map();
58
+ for (const candidate of candidates) {
59
+ const tokens = tokenizeForRetrieval(candidate.text);
60
+ const frequency = new Map();
61
+ for (const token of tokens) {
62
+ frequency.set(token, (frequency.get(token) ?? 0) + 1);
63
+ }
64
+ termFrequencies.push(frequency);
65
+ lengths.push(tokens.length);
66
+ for (const term of queryTerms) {
67
+ if (frequency.has(term)) {
68
+ documentFrequency.set(term, (documentFrequency.get(term) ?? 0) + 1);
69
+ }
70
+ }
71
+ }
72
+ const totalLength = lengths.reduce((sum, length) => sum + length, 0);
73
+ const averageLength = totalLength > 0 ? totalLength / candidates.length : 1;
74
+ const scored = [];
75
+ for (let index = 0; index < candidates.length; index += 1) {
76
+ const frequency = termFrequencies[index];
77
+ const length = lengths[index];
78
+ let score = 0;
79
+ let matchedTerms = 0;
80
+ for (const term of queryTerms) {
81
+ const termFrequency = frequency.get(term);
82
+ if (!termFrequency)
83
+ continue;
84
+ matchedTerms += 1;
85
+ const matching = documentFrequency.get(term) ?? 0;
86
+ const idf = Math.log(1 + (candidates.length - matching + 0.5) / (matching + 0.5));
87
+ score +=
88
+ (idf * (termFrequency * (BM25_K1 + 1))) /
89
+ (termFrequency +
90
+ BM25_K1 * (1 - BM25_B + (BM25_B * length) / averageLength));
91
+ }
92
+ if (queryWords.length > 0 && matchedTerms > 0) {
93
+ const matchesWholeWord = queryWords.some(subtokens => subtokens.every(subtoken => frequency.has(subtoken)));
94
+ if (!matchesWholeWord)
95
+ continue;
96
+ }
97
+ if (score > 0)
98
+ scored.push({ id: candidates[index].id, score });
99
+ }
100
+ return scored.sort((left, right) => right.score - left.score || left.id.localeCompare(right.id));
101
+ };
102
+ /**
103
+ * Reciprocal-rank fusion of independently ranked id lists. An id absent
104
+ * from a list simply contributes nothing for that list; ids appearing in
105
+ * several lists accumulate. Best first, ties broken by id.
106
+ */
107
+ export const reciprocalRankFusion = (rankedLists, k = RRF_K) => {
108
+ const scores = new Map();
109
+ for (const list of rankedLists) {
110
+ for (let rank = 0; rank < list.length; rank += 1) {
111
+ const id = list[rank];
112
+ scores.set(id, (scores.get(id) ?? 0) + 1 / (k + rank + 1));
113
+ }
114
+ }
115
+ return [...scores.entries()]
116
+ .map(([id, score]) => ({ id, score }))
117
+ .sort((left, right) => right.score - left.score || left.id.localeCompare(right.id));
118
+ };
119
+ //# sourceMappingURL=hybridRetrieval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybridRetrieval.js","sourceRoot":"","sources":["../../src/utils/hybridRetrieval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Minimal, dependency-free iCalendar (RFC 5545) support for calendar
3
+ * import/export. The exporter emits UTC timestamps and maps the native
4
+ * recurrence union onto basic RRULEs; the importer accepts the common
5
+ * subset (UTC or floating DTSTART/DTEND, DATE values, simple FREQ rules)
6
+ * and reports what it skipped rather than guessing. Interval, COUNT,
7
+ * UNTIL, and EXDATE are deliberately out of scope for now.
8
+ */
9
+ import type { AutomationTrigger, CalendarEvent } from '../types/index.js';
10
+ export declare const serializeCalendarToIcs: (calendarName: string, events: readonly CalendarEvent[]) => string;
11
+ export interface ParsedIcsEvent {
12
+ title: string;
13
+ notes?: string;
14
+ startAt: number;
15
+ endAt?: number;
16
+ allDay: boolean;
17
+ recurrence?: AutomationTrigger;
18
+ reminderMinutes?: number;
19
+ /** Property names the parser understood but could not preserve. */
20
+ dropped: string[];
21
+ }
22
+ export interface IcsParseResult {
23
+ events: ParsedIcsEvent[];
24
+ skipped: number;
25
+ }
26
+ export declare const parseIcsCalendar: (source: string, maximumEvents: number) => IcsParseResult;
27
+ //# sourceMappingURL=icsCalendar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icsCalendar.d.ts","sourceRoot":"","sources":["../../src/utils/icsCalendar.ts"],"names":[],"mappings":"AAiBA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAsJ1E,eAAO,MAAM,sBAAsB,iBACnB,MAAM,UACZ,SAAS,aAAa,EAAE,KAC/B,MAwCF,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AA+DD,eAAO,MAAM,gBAAgB,WACnB,MAAM,iBACC,MAAM,KACpB,cA6FF,CAAC"}
@@ -0,0 +1,313 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ const pad = (value, width = 2) => String(value).padStart(width, '0');
18
+ const toUtcStamp = (epochMs) => {
19
+ const date = new Date(epochMs);
20
+ return (`${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1)}` +
21
+ `${pad(date.getUTCDate())}T${pad(date.getUTCHours())}` +
22
+ `${pad(date.getUTCMinutes())}${pad(date.getUTCSeconds())}Z`);
23
+ };
24
+ const toDateStamp = (epochMs) => {
25
+ const date = new Date(epochMs);
26
+ return `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}`;
27
+ };
28
+ const escapeText = (value) => value
29
+ .replace(/\\/g, '\\\\')
30
+ .replace(/;/g, '\\;')
31
+ .replace(/,/g, '\\,')
32
+ .replace(/\r?\n/g, '\\n');
33
+ const unescapeText = (value) => value
34
+ .replace(/\\n/gi, '\n')
35
+ .replace(/\\,/g, ',')
36
+ .replace(/\\;/g, ';')
37
+ .replace(/\\\\/g, '\\');
38
+ /** RFC 5545 line folding at 75 octets. */
39
+ const foldLine = (line) => {
40
+ if (Buffer.byteLength(line, 'utf8') <= 75)
41
+ return line;
42
+ const parts = [];
43
+ let current = '';
44
+ for (const character of line) {
45
+ if (Buffer.byteLength(current + character, 'utf8') > 74) {
46
+ parts.push(current);
47
+ current = character;
48
+ }
49
+ else {
50
+ current += character;
51
+ }
52
+ }
53
+ if (current)
54
+ parts.push(current);
55
+ return parts.join('\r\n ');
56
+ };
57
+ const WEEKDAYS = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];
58
+ const recurrenceToRrule = (recurrence) => {
59
+ switch (recurrence.kind) {
60
+ case 'once':
61
+ return undefined;
62
+ case 'hourly':
63
+ return 'FREQ=HOURLY';
64
+ case 'daily':
65
+ return 'FREQ=DAILY';
66
+ case 'weekly':
67
+ return `FREQ=WEEKLY;BYDAY=${WEEKDAYS[recurrence.dayOfWeek] ?? 'MO'}`;
68
+ case 'monthly':
69
+ return `FREQ=MONTHLY;BYMONTHDAY=${recurrence.dayOfMonth}`;
70
+ case 'yearly':
71
+ return (`FREQ=YEARLY;BYMONTH=${recurrence.month + 1};` +
72
+ `BYMONTHDAY=${recurrence.dayOfMonth}`);
73
+ }
74
+ };
75
+ /**
76
+ * Maps a simple RRULE back onto the native recurrence union using the
77
+ * event's own start for the time-of-day fields. Unsupported rules return
78
+ * undefined so the caller can import the event without recurrence.
79
+ */
80
+ const rruleToRecurrence = (rrule, startAt) => {
81
+ const fields = new Map();
82
+ for (const part of rrule.split(';')) {
83
+ const separator = part.indexOf('=');
84
+ if (separator > 0) {
85
+ fields.set(part.slice(0, separator).toUpperCase(), part.slice(separator + 1).toUpperCase());
86
+ }
87
+ }
88
+ // Interval/count/until change occurrence math; refuse rather than drift.
89
+ if ((fields.has('INTERVAL') && fields.get('INTERVAL') !== '1') ||
90
+ fields.has('COUNT') ||
91
+ fields.has('UNTIL')) {
92
+ return undefined;
93
+ }
94
+ const start = new Date(startAt);
95
+ const hour = start.getHours();
96
+ const minute = start.getMinutes();
97
+ switch (fields.get('FREQ')) {
98
+ case 'HOURLY':
99
+ return { kind: 'hourly', minute };
100
+ case 'DAILY':
101
+ return { kind: 'daily', hour, minute };
102
+ case 'WEEKLY': {
103
+ const byDay = fields.get('BYDAY');
104
+ const dayOfWeek = byDay
105
+ ? WEEKDAYS.indexOf(byDay.slice(0, 2))
106
+ : start.getDay();
107
+ if (byDay && (byDay.includes(',') || dayOfWeek === -1))
108
+ return undefined;
109
+ return {
110
+ kind: 'weekly',
111
+ dayOfWeek: dayOfWeek === -1 ? start.getDay() : dayOfWeek,
112
+ hour,
113
+ minute,
114
+ };
115
+ }
116
+ case 'MONTHLY': {
117
+ const dayOfMonth = Number(fields.get('BYMONTHDAY') ?? start.getDate());
118
+ if (!Number.isSafeInteger(dayOfMonth) || dayOfMonth < 1) {
119
+ return undefined;
120
+ }
121
+ return { kind: 'monthly', dayOfMonth, hour, minute };
122
+ }
123
+ case 'YEARLY': {
124
+ const month = fields.has('BYMONTH')
125
+ ? Number(fields.get('BYMONTH')) - 1
126
+ : start.getMonth();
127
+ const dayOfMonth = Number(fields.get('BYMONTHDAY') ?? start.getDate());
128
+ if (!Number.isSafeInteger(month) ||
129
+ month < 0 ||
130
+ month > 11 ||
131
+ !Number.isSafeInteger(dayOfMonth) ||
132
+ dayOfMonth < 1) {
133
+ return undefined;
134
+ }
135
+ return { kind: 'yearly', month, dayOfMonth, hour, minute };
136
+ }
137
+ default:
138
+ return undefined;
139
+ }
140
+ };
141
+ export const serializeCalendarToIcs = (calendarName, events) => {
142
+ const lines = [
143
+ 'BEGIN:VCALENDAR',
144
+ 'VERSION:2.0',
145
+ 'PRODID:-//Libre WebUI//Calendar//EN',
146
+ `X-WR-CALNAME:${escapeText(calendarName)}`,
147
+ ];
148
+ for (const event of events) {
149
+ lines.push('BEGIN:VEVENT');
150
+ lines.push(`UID:${escapeText(event.id)}@libre-webui`);
151
+ lines.push(`DTSTAMP:${toUtcStamp(event.updatedAt)}`);
152
+ if (event.allDay) {
153
+ lines.push(`DTSTART;VALUE=DATE:${toDateStamp(event.startAt)}`);
154
+ if (event.endAt !== undefined) {
155
+ lines.push(`DTEND;VALUE=DATE:${toDateStamp(event.endAt)}`);
156
+ }
157
+ }
158
+ else {
159
+ lines.push(`DTSTART:${toUtcStamp(event.startAt)}`);
160
+ if (event.endAt !== undefined) {
161
+ lines.push(`DTEND:${toUtcStamp(event.endAt)}`);
162
+ }
163
+ }
164
+ lines.push(`SUMMARY:${escapeText(event.title)}`);
165
+ if (event.notes) {
166
+ lines.push(`DESCRIPTION:${escapeText(event.notes)}`);
167
+ }
168
+ if (event.recurrence) {
169
+ const rrule = recurrenceToRrule(event.recurrence);
170
+ if (rrule)
171
+ lines.push(`RRULE:${rrule}`);
172
+ }
173
+ if (event.reminderMinutes !== undefined) {
174
+ lines.push('BEGIN:VALARM');
175
+ lines.push('ACTION:DISPLAY');
176
+ lines.push(`TRIGGER:-PT${event.reminderMinutes}M`);
177
+ lines.push('END:VALARM');
178
+ }
179
+ lines.push('END:VEVENT');
180
+ }
181
+ lines.push('END:VCALENDAR');
182
+ return lines.map(foldLine).join('\r\n') + '\r\n';
183
+ };
184
+ const parseStamp = (raw, parameters) => {
185
+ const isDate = /VALUE=DATE(?:;|$)/i.test(parameters) || /^\d{8}$/.test(raw);
186
+ if (isDate) {
187
+ const match = /^(\d{4})(\d{2})(\d{2})$/.exec(raw);
188
+ if (!match)
189
+ return undefined;
190
+ return {
191
+ epochMs: new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3])).getTime(),
192
+ allDay: true,
193
+ };
194
+ }
195
+ const match = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(Z?)$/.exec(raw);
196
+ if (!match)
197
+ return undefined;
198
+ const [, year, month, day, hour, minute, second, zulu] = match;
199
+ const epochMs = zulu
200
+ ? Date.UTC(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second))
201
+ : new Date(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second)).getTime();
202
+ return { epochMs, allDay: false };
203
+ };
204
+ const parseAlarmMinutes = (block) => {
205
+ for (const line of block) {
206
+ const match = /^TRIGGER[^:]*:-PT(?:(\d+)H)?(?:(\d+)M)?/i.exec(line);
207
+ if (match) {
208
+ const hours = Number(match[1] ?? 0);
209
+ const minutes = Number(match[2] ?? 0);
210
+ const total = hours * 60 + minutes;
211
+ if (total > 0)
212
+ return total;
213
+ }
214
+ }
215
+ return undefined;
216
+ };
217
+ /** Unfold RFC 5545 continuation lines and split into logical lines. */
218
+ const logicalLines = (source) => source
219
+ .replace(/\r\n[ \t]/g, '')
220
+ .replace(/\n[ \t]/g, '')
221
+ .split(/\r?\n/)
222
+ .filter(Boolean);
223
+ export const parseIcsCalendar = (source, maximumEvents) => {
224
+ const lines = logicalLines(source);
225
+ const events = [];
226
+ let skipped = 0;
227
+ let index = 0;
228
+ while (index < lines.length) {
229
+ if (lines[index].toUpperCase() !== 'BEGIN:VEVENT') {
230
+ index += 1;
231
+ continue;
232
+ }
233
+ const block = [];
234
+ index += 1;
235
+ while (index < lines.length &&
236
+ lines[index].toUpperCase() !== 'END:VEVENT') {
237
+ block.push(lines[index]);
238
+ index += 1;
239
+ }
240
+ index += 1;
241
+ if (events.length >= maximumEvents) {
242
+ skipped += 1;
243
+ continue;
244
+ }
245
+ const properties = new Map();
246
+ const alarm = [];
247
+ let inAlarm = false;
248
+ for (const line of block) {
249
+ const upper = line.toUpperCase();
250
+ if (upper === 'BEGIN:VALARM') {
251
+ inAlarm = true;
252
+ continue;
253
+ }
254
+ if (upper === 'END:VALARM') {
255
+ inAlarm = false;
256
+ continue;
257
+ }
258
+ if (inAlarm) {
259
+ alarm.push(line);
260
+ continue;
261
+ }
262
+ const separator = line.indexOf(':');
263
+ if (separator <= 0)
264
+ continue;
265
+ const nameAndParameters = line.slice(0, separator);
266
+ const parameterSplit = nameAndParameters.indexOf(';');
267
+ const name = (parameterSplit === -1
268
+ ? nameAndParameters
269
+ : nameAndParameters.slice(0, parameterSplit)).toUpperCase();
270
+ const parameters = parameterSplit === -1
271
+ ? ''
272
+ : nameAndParameters.slice(parameterSplit + 1);
273
+ if (!properties.has(name)) {
274
+ properties.set(name, { parameters, value: line.slice(separator + 1) });
275
+ }
276
+ }
277
+ const start = properties.get('DTSTART');
278
+ const parsedStart = start
279
+ ? parseStamp(start.value, start.parameters)
280
+ : undefined;
281
+ if (!parsedStart) {
282
+ skipped += 1;
283
+ continue;
284
+ }
285
+ const end = properties.get('DTEND');
286
+ const parsedEnd = end ? parseStamp(end.value, end.parameters) : undefined;
287
+ const dropped = [];
288
+ let recurrence;
289
+ const rrule = properties.get('RRULE');
290
+ if (rrule) {
291
+ recurrence = rruleToRecurrence(rrule.value, parsedStart.epochMs);
292
+ if (!recurrence)
293
+ dropped.push('RRULE');
294
+ }
295
+ if (properties.has('EXDATE'))
296
+ dropped.push('EXDATE');
297
+ const reminderMinutes = parseAlarmMinutes(alarm);
298
+ events.push({
299
+ title: unescapeText(properties.get('SUMMARY')?.value ?? 'Untitled event'),
300
+ ...(properties.get('DESCRIPTION')
301
+ ? { notes: unescapeText(properties.get('DESCRIPTION').value) }
302
+ : {}),
303
+ startAt: parsedStart.epochMs,
304
+ ...(parsedEnd ? { endAt: parsedEnd.epochMs } : {}),
305
+ allDay: parsedStart.allDay,
306
+ ...(recurrence ? { recurrence } : {}),
307
+ ...(reminderMinutes !== undefined ? { reminderMinutes } : {}),
308
+ dropped,
309
+ });
310
+ }
311
+ return { events, skipped };
312
+ };
313
+ //# sourceMappingURL=icsCalendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icsCalendar.js","sourceRoot":"","sources":["../../src/utils/icsCalendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Image-edit upload validation (IMAGE-01). Every reference image and mask
3
+ * is checked against declared MIME, sniffed magic bytes, and byte ceilings
4
+ * before anything reaches a provider. PNG is the interoperable default —
5
+ * masks must carry an alpha channel, which only PNG guarantees here.
6
+ */
7
+ export declare const IMAGE_EDIT_GLOBAL_MAX_IMAGE_BYTES: number;
8
+ export declare const IMAGE_EDIT_GLOBAL_MAX_REFERENCE_IMAGES = 4;
9
+ export type ImageEditFormat = 'png' | 'jpeg' | 'webp';
10
+ export declare class ImageEditUploadError extends Error {
11
+ readonly code: 'missing_file' | 'unsupported_mime_type' | 'signature_mismatch' | 'file_too_large' | 'too_many_images';
12
+ constructor(code: 'missing_file' | 'unsupported_mime_type' | 'signature_mismatch' | 'file_too_large' | 'too_many_images', message: string);
13
+ }
14
+ export declare const detectImageEditFormat: (buffer: Buffer) => ImageEditFormat | null;
15
+ export interface ValidatedImageEditInput {
16
+ buffer: Buffer;
17
+ mimeType: string;
18
+ filename: string;
19
+ }
20
+ export declare const validateImageEditUpload: (file: {
21
+ buffer: Buffer;
22
+ mimetype?: string;
23
+ size: number;
24
+ }, options: {
25
+ allowedMimeTypes?: string[];
26
+ maxBytes?: number;
27
+ filename: string;
28
+ }) => ValidatedImageEditInput;
29
+ //# sourceMappingURL=imageEditUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageEditUpload.d.ts","sourceRoot":"","sources":["../../src/utils/imageEditUpload.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AAEH,eAAO,MAAM,iCAAiC,QAAmB,CAAC;AAClE,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAQtD,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,IAAI,EACT,cAAc,GACd,uBAAuB,GACvB,oBAAoB,GACpB,gBAAgB,GAChB,iBAAiB;IANvB,YACW,IAAI,EACT,cAAc,GACd,uBAAuB,GACvB,oBAAoB,GACpB,gBAAgB,GAChB,iBAAiB,EACrB,OAAO,EAAE,MAAM,EAIhB;CACF;AAED,eAAO,MAAM,qBAAqB,WACxB,MAAM,KACb,eAAe,GAAG,IAoBpB,CAAC;AAIF,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,uBAAuB,SAC5B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,WAChD;IACP,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,KACA,uBA2CF,CAAC"}
@@ -0,0 +1,82 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Image-edit upload validation (IMAGE-01). Every reference image and mask
19
+ * is checked against declared MIME, sniffed magic bytes, and byte ceilings
20
+ * before anything reaches a provider. PNG is the interoperable default —
21
+ * masks must carry an alpha channel, which only PNG guarantees here.
22
+ */
23
+ export const IMAGE_EDIT_GLOBAL_MAX_IMAGE_BYTES = 10 * 1024 * 1024;
24
+ export const IMAGE_EDIT_GLOBAL_MAX_REFERENCE_IMAGES = 4;
25
+ const FORMAT_MIME = {
26
+ png: 'image/png',
27
+ jpeg: 'image/jpeg',
28
+ webp: 'image/webp',
29
+ };
30
+ export class ImageEditUploadError extends Error {
31
+ constructor(code, message) {
32
+ super(message);
33
+ this.code = code;
34
+ this.name = 'ImageEditUploadError';
35
+ }
36
+ }
37
+ export const detectImageEditFormat = (buffer) => {
38
+ if (buffer.length >= 8 && buffer.subarray(0, 4).equals(PNG_MAGIC)) {
39
+ return 'png';
40
+ }
41
+ if (buffer.length >= 3 &&
42
+ buffer[0] === 0xff &&
43
+ buffer[1] === 0xd8 &&
44
+ buffer[2] === 0xff) {
45
+ return 'jpeg';
46
+ }
47
+ if (buffer.length >= 12 &&
48
+ buffer.subarray(0, 4).toString('ascii') === 'RIFF' &&
49
+ buffer.subarray(8, 12).toString('ascii') === 'WEBP') {
50
+ return 'webp';
51
+ }
52
+ return null;
53
+ };
54
+ const PNG_MAGIC = Buffer.from([0x89, 0x50, 0x4e, 0x47]);
55
+ export const validateImageEditUpload = (file, options) => {
56
+ if (!file || !file.buffer || file.buffer.length === 0) {
57
+ throw new ImageEditUploadError('missing_file', 'An image file is required');
58
+ }
59
+ const maxBytes = Math.min(options.maxBytes ?? IMAGE_EDIT_GLOBAL_MAX_IMAGE_BYTES, IMAGE_EDIT_GLOBAL_MAX_IMAGE_BYTES);
60
+ if (file.buffer.length > maxBytes) {
61
+ throw new ImageEditUploadError('file_too_large', `Image inputs are limited to ${maxBytes} bytes`);
62
+ }
63
+ const format = detectImageEditFormat(file.buffer);
64
+ if (!format) {
65
+ throw new ImageEditUploadError('signature_mismatch', 'Image content is not a recognized PNG, JPEG, or WebP file');
66
+ }
67
+ const sniffedMime = FORMAT_MIME[format];
68
+ const declared = file.mimetype?.toLowerCase().split(';')[0]?.trim();
69
+ if (declared && declared !== sniffedMime) {
70
+ throw new ImageEditUploadError('signature_mismatch', 'Image content does not match its declared MIME type');
71
+ }
72
+ const allowed = (options.allowedMimeTypes?.length ? options.allowedMimeTypes : ['image/png']).map(value => value.toLowerCase());
73
+ if (!allowed.includes(sniffedMime)) {
74
+ throw new ImageEditUploadError('unsupported_mime_type', `This model accepts only: ${allowed.join(', ')}`);
75
+ }
76
+ return {
77
+ buffer: file.buffer,
78
+ mimeType: sniffedMime,
79
+ filename: options.filename,
80
+ };
81
+ };
82
+ //# sourceMappingURL=imageEditUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageEditUpload.js","sourceRoot":"","sources":["../../src/utils/imageEditUpload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const redactLogFields: (value: unknown, depth?: number) => unknown;
2
+ //# sourceMappingURL=logRedaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logRedaction.d.ts","sourceRoot":"","sources":["../../src/utils/logRedaction.ts"],"names":[],"mappings":"AA6BA,eAAO,MAAM,eAAe,UAAW,OAAO,qBAAc,OAoC3D,CAAC"}