libre-webui 0.24.1 → 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 (543) hide show
  1. package/README.md +36 -15
  2. package/backend/dist/index.d.ts.map +1 -1
  3. package/backend/dist/index.js +35 -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 +12 -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/postgresPersonalAutomationsMigration.d.ts +8 -0
  51. package/backend/dist/persistence/postgresPersonalAutomationsMigration.d.ts.map +1 -0
  52. package/backend/dist/persistence/postgresPersonalAutomationsMigration.js +98 -0
  53. package/backend/dist/persistence/postgresPersonalAutomationsMigration.js.map +1 -0
  54. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
  55. package/backend/dist/persistence/postgresResourceRepositories.js +1972 -63
  56. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
  57. package/backend/dist/persistence/postgresSkillFilesMigration.d.ts +9 -0
  58. package/backend/dist/persistence/postgresSkillFilesMigration.d.ts.map +1 -0
  59. package/backend/dist/persistence/postgresSkillFilesMigration.js +50 -0
  60. package/backend/dist/persistence/postgresSkillFilesMigration.js.map +1 -0
  61. package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts +10 -0
  62. package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts.map +1 -0
  63. package/backend/dist/persistence/postgresTeamCollaborationMigration.js +161 -0
  64. package/backend/dist/persistence/postgresTeamCollaborationMigration.js.map +1 -0
  65. package/backend/dist/persistence/resourceTypes.d.ts +622 -3
  66. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
  67. package/backend/dist/persistence/resourceTypes.js.map +1 -1
  68. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
  69. package/backend/dist/persistence/sqliteExtensionRepositories.js +26 -4
  70. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
  71. package/backend/dist/persistence/sqliteMigrations.d.ts +10 -0
  72. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
  73. package/backend/dist/persistence/sqliteMigrations.js +1396 -48
  74. package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
  75. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
  76. package/backend/dist/persistence/sqliteResourceRepositories.js +1680 -58
  77. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
  78. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
  79. package/backend/dist/persistence/sqliteToPostgresMigration.js +297 -2
  80. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
  81. package/backend/dist/platform/jobs/domainJobContracts.d.ts +11 -0
  82. package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -1
  83. package/backend/dist/platform/jobs/domainJobContracts.js +11 -0
  84. package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -1
  85. package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
  86. package/backend/dist/platform/jobs/domainJobHandlers.js +409 -2
  87. package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
  88. package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts.map +1 -1
  89. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js +4 -2
  90. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js.map +1 -1
  91. package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts.map +1 -1
  92. package/backend/dist/platform/jobs/postgresDurableJobWorker.js +4 -2
  93. package/backend/dist/platform/jobs/postgresDurableJobWorker.js.map +1 -1
  94. package/backend/dist/platform/storage/pgVectorStore.d.ts +2 -1
  95. package/backend/dist/platform/storage/pgVectorStore.d.ts.map +1 -1
  96. package/backend/dist/platform/storage/pgVectorStore.js +51 -0
  97. package/backend/dist/platform/storage/pgVectorStore.js.map +1 -1
  98. package/backend/dist/platform/storage/platformDomainRepositories.d.ts +8 -2
  99. package/backend/dist/platform/storage/platformDomainRepositories.d.ts.map +1 -1
  100. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts.map +1 -1
  101. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js +25 -4
  102. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js.map +1 -1
  103. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts +2 -1
  104. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts.map +1 -1
  105. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js +35 -0
  106. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js.map +1 -1
  107. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts.map +1 -1
  108. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js +26 -3
  109. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js.map +1 -1
  110. package/backend/dist/platform/storage/vectorStore.d.ts +14 -0
  111. package/backend/dist/platform/storage/vectorStore.d.ts.map +1 -1
  112. package/backend/dist/platform/storage/vectorStore.js.map +1 -1
  113. package/backend/dist/routes/access.d.ts.map +1 -1
  114. package/backend/dist/routes/access.js +84 -3
  115. package/backend/dist/routes/access.js.map +1 -1
  116. package/backend/dist/routes/automations.d.ts +3 -0
  117. package/backend/dist/routes/automations.d.ts.map +1 -0
  118. package/backend/dist/routes/automations.js +232 -0
  119. package/backend/dist/routes/automations.js.map +1 -0
  120. package/backend/dist/routes/calendar.d.ts +3 -0
  121. package/backend/dist/routes/calendar.d.ts.map +1 -0
  122. package/backend/dist/routes/calendar.js +309 -0
  123. package/backend/dist/routes/calendar.js.map +1 -0
  124. package/backend/dist/routes/channels.d.ts +3 -0
  125. package/backend/dist/routes/channels.d.ts.map +1 -0
  126. package/backend/dist/routes/channels.js +447 -0
  127. package/backend/dist/routes/channels.js.map +1 -0
  128. package/backend/dist/routes/chat.d.ts.map +1 -1
  129. package/backend/dist/routes/chat.js +237 -10
  130. package/backend/dist/routes/chat.js.map +1 -1
  131. package/backend/dist/routes/costs.d.ts +3 -0
  132. package/backend/dist/routes/costs.d.ts.map +1 -0
  133. package/backend/dist/routes/costs.js +191 -0
  134. package/backend/dist/routes/costs.js.map +1 -0
  135. package/backend/dist/routes/documents.d.ts.map +1 -1
  136. package/backend/dist/routes/documents.js +64 -21
  137. package/backend/dist/routes/documents.js.map +1 -1
  138. package/backend/dist/routes/evaluations.d.ts +3 -0
  139. package/backend/dist/routes/evaluations.d.ts.map +1 -0
  140. package/backend/dist/routes/evaluations.js +352 -0
  141. package/backend/dist/routes/evaluations.js.map +1 -0
  142. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  143. package/backend/dist/routes/imageGen.js +2 -1
  144. package/backend/dist/routes/imageGen.js.map +1 -1
  145. package/backend/dist/routes/media.d.ts.map +1 -1
  146. package/backend/dist/routes/media.js +228 -7
  147. package/backend/dist/routes/media.js.map +1 -1
  148. package/backend/dist/routes/notes.d.ts.map +1 -1
  149. package/backend/dist/routes/notes.js +149 -36
  150. package/backend/dist/routes/notes.js.map +1 -1
  151. package/backend/dist/routes/notifications.d.ts +3 -0
  152. package/backend/dist/routes/notifications.d.ts.map +1 -0
  153. package/backend/dist/routes/notifications.js +213 -0
  154. package/backend/dist/routes/notifications.js.map +1 -0
  155. package/backend/dist/routes/ollama.d.ts.map +1 -1
  156. package/backend/dist/routes/ollama.js +4 -1
  157. package/backend/dist/routes/ollama.js.map +1 -1
  158. package/backend/dist/routes/openaiCompat.d.ts +3 -0
  159. package/backend/dist/routes/openaiCompat.d.ts.map +1 -0
  160. package/backend/dist/routes/openaiCompat.js +314 -0
  161. package/backend/dist/routes/openaiCompat.js.map +1 -0
  162. package/backend/dist/routes/personas.js +1 -1
  163. package/backend/dist/routes/personas.js.map +1 -1
  164. package/backend/dist/routes/prompts.d.ts +3 -0
  165. package/backend/dist/routes/prompts.d.ts.map +1 -0
  166. package/backend/dist/routes/prompts.js +173 -0
  167. package/backend/dist/routes/prompts.js.map +1 -0
  168. package/backend/dist/routes/search.d.ts.map +1 -1
  169. package/backend/dist/routes/search.js +34 -4
  170. package/backend/dist/routes/search.js.map +1 -1
  171. package/backend/dist/routes/skills.d.ts +3 -0
  172. package/backend/dist/routes/skills.d.ts.map +1 -0
  173. package/backend/dist/routes/skills.js +246 -0
  174. package/backend/dist/routes/skills.js.map +1 -0
  175. package/backend/dist/routes/stt.d.ts.map +1 -1
  176. package/backend/dist/routes/stt.js +2 -1
  177. package/backend/dist/routes/stt.js.map +1 -1
  178. package/backend/dist/routes/tools.d.ts +3 -0
  179. package/backend/dist/routes/tools.d.ts.map +1 -0
  180. package/backend/dist/routes/tools.js +359 -0
  181. package/backend/dist/routes/tools.js.map +1 -0
  182. package/backend/dist/routes/tts.d.ts.map +1 -1
  183. package/backend/dist/routes/tts.js +63 -8
  184. package/backend/dist/routes/tts.js.map +1 -1
  185. package/backend/dist/routes/voiceAccess.d.ts +3 -0
  186. package/backend/dist/routes/voiceAccess.d.ts.map +1 -0
  187. package/backend/dist/routes/voiceAccess.js +102 -0
  188. package/backend/dist/routes/voiceAccess.js.map +1 -0
  189. package/backend/dist/services/apiTokenService.d.ts +2 -2
  190. package/backend/dist/services/apiTokenService.d.ts.map +1 -1
  191. package/backend/dist/services/apiTokenService.js +7 -0
  192. package/backend/dist/services/apiTokenService.js.map +1 -1
  193. package/backend/dist/services/authorizationService.d.ts +8 -4
  194. package/backend/dist/services/authorizationService.d.ts.map +1 -1
  195. package/backend/dist/services/authorizationService.js +31 -1
  196. package/backend/dist/services/authorizationService.js.map +1 -1
  197. package/backend/dist/services/automationSchedulerService.d.ts +28 -0
  198. package/backend/dist/services/automationSchedulerService.d.ts.map +1 -0
  199. package/backend/dist/services/automationSchedulerService.js +221 -0
  200. package/backend/dist/services/automationSchedulerService.js.map +1 -0
  201. package/backend/dist/services/automationService.d.ts +56 -0
  202. package/backend/dist/services/automationService.d.ts.map +1 -0
  203. package/backend/dist/services/automationService.js +247 -0
  204. package/backend/dist/services/automationService.js.map +1 -0
  205. package/backend/dist/services/builtinToolsService.d.ts +20 -0
  206. package/backend/dist/services/builtinToolsService.d.ts.map +1 -0
  207. package/backend/dist/services/builtinToolsService.js +661 -0
  208. package/backend/dist/services/builtinToolsService.js.map +1 -0
  209. package/backend/dist/services/calendarService.d.ts +74 -0
  210. package/backend/dist/services/calendarService.d.ts.map +1 -0
  211. package/backend/dist/services/calendarService.js +339 -0
  212. package/backend/dist/services/calendarService.js.map +1 -0
  213. package/backend/dist/services/channelService.d.ts +195 -0
  214. package/backend/dist/services/channelService.d.ts.map +1 -0
  215. package/backend/dist/services/channelService.js +1057 -0
  216. package/backend/dist/services/channelService.js.map +1 -0
  217. package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
  218. package/backend/dist/services/chatGenerationService.js +7 -1
  219. package/backend/dist/services/chatGenerationService.js.map +1 -1
  220. package/backend/dist/services/chatRequestService.d.ts.map +1 -1
  221. package/backend/dist/services/chatRequestService.js +29 -1
  222. package/backend/dist/services/chatRequestService.js.map +1 -1
  223. package/backend/dist/services/chatService.d.ts +62 -1
  224. package/backend/dist/services/chatService.d.ts.map +1 -1
  225. package/backend/dist/services/chatService.js +242 -1
  226. package/backend/dist/services/chatService.js.map +1 -1
  227. package/backend/dist/services/chatToolRuntimeService.d.ts +55 -0
  228. package/backend/dist/services/chatToolRuntimeService.d.ts.map +1 -0
  229. package/backend/dist/services/chatToolRuntimeService.js +389 -0
  230. package/backend/dist/services/chatToolRuntimeService.js.map +1 -0
  231. package/backend/dist/services/costGovernanceService.d.ts +102 -0
  232. package/backend/dist/services/costGovernanceService.d.ts.map +1 -0
  233. package/backend/dist/services/costGovernanceService.js +463 -0
  234. package/backend/dist/services/costGovernanceService.js.map +1 -0
  235. package/backend/dist/services/dataArchiveService.d.ts +6 -0
  236. package/backend/dist/services/dataArchiveService.d.ts.map +1 -1
  237. package/backend/dist/services/dataArchiveService.js +23 -4
  238. package/backend/dist/services/dataArchiveService.js.map +1 -1
  239. package/backend/dist/services/documentService.d.ts +58 -1
  240. package/backend/dist/services/documentService.d.ts.map +1 -1
  241. package/backend/dist/services/documentService.js +289 -84
  242. package/backend/dist/services/documentService.js.map +1 -1
  243. package/backend/dist/services/durableChatGenerationService.d.ts +9 -0
  244. package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -1
  245. package/backend/dist/services/durableChatGenerationService.js +160 -13
  246. package/backend/dist/services/durableChatGenerationService.js.map +1 -1
  247. package/backend/dist/services/evaluationService.d.ts +111 -0
  248. package/backend/dist/services/evaluationService.d.ts.map +1 -0
  249. package/backend/dist/services/evaluationService.js +403 -0
  250. package/backend/dist/services/evaluationService.js.map +1 -0
  251. package/backend/dist/services/galleryService.d.ts +6 -0
  252. package/backend/dist/services/galleryService.d.ts.map +1 -1
  253. package/backend/dist/services/galleryService.js +26 -0
  254. package/backend/dist/services/galleryService.js.map +1 -1
  255. package/backend/dist/services/mcpClientService.d.ts +29 -0
  256. package/backend/dist/services/mcpClientService.d.ts.map +1 -0
  257. package/backend/dist/services/mcpClientService.js +189 -0
  258. package/backend/dist/services/mcpClientService.js.map +1 -0
  259. package/backend/dist/services/noteService.d.ts +71 -0
  260. package/backend/dist/services/noteService.d.ts.map +1 -0
  261. package/backend/dist/services/noteService.js +397 -0
  262. package/backend/dist/services/noteService.js.map +1 -0
  263. package/backend/dist/services/notificationService.d.ts +55 -0
  264. package/backend/dist/services/notificationService.d.ts.map +1 -0
  265. package/backend/dist/services/notificationService.js +308 -0
  266. package/backend/dist/services/notificationService.js.map +1 -0
  267. package/backend/dist/services/ollamaService.d.ts.map +1 -1
  268. package/backend/dist/services/ollamaService.js +3 -1
  269. package/backend/dist/services/ollamaService.js.map +1 -1
  270. package/backend/dist/services/openApiToolService.d.ts +38 -0
  271. package/backend/dist/services/openApiToolService.d.ts.map +1 -0
  272. package/backend/dist/services/openApiToolService.js +254 -0
  273. package/backend/dist/services/openApiToolService.js.map +1 -0
  274. package/backend/dist/services/personaService.d.ts +18 -2
  275. package/backend/dist/services/personaService.d.ts.map +1 -1
  276. package/backend/dist/services/personaService.js +113 -4
  277. package/backend/dist/services/personaService.js.map +1 -1
  278. package/backend/dist/services/pluginImageGenerationService.d.ts +19 -0
  279. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
  280. package/backend/dist/services/pluginImageGenerationService.js +121 -0
  281. package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
  282. package/backend/dist/services/pluginService.d.ts +7 -0
  283. package/backend/dist/services/pluginService.d.ts.map +1 -1
  284. package/backend/dist/services/pluginService.js +8 -2
  285. package/backend/dist/services/pluginService.js.map +1 -1
  286. package/backend/dist/services/promptService.d.ts +74 -0
  287. package/backend/dist/services/promptService.d.ts.map +1 -0
  288. package/backend/dist/services/promptService.js +513 -0
  289. package/backend/dist/services/promptService.js.map +1 -0
  290. package/backend/dist/services/resourceGrantService.d.ts.map +1 -1
  291. package/backend/dist/services/resourceGrantService.js +62 -17
  292. package/backend/dist/services/resourceGrantService.js.map +1 -1
  293. package/backend/dist/services/searchService.d.ts +29 -0
  294. package/backend/dist/services/searchService.d.ts.map +1 -0
  295. package/backend/dist/services/searchService.js +0 -0
  296. package/backend/dist/services/searchService.js.map +1 -0
  297. package/backend/dist/services/securityAuditService.d.ts.map +1 -1
  298. package/backend/dist/services/securityAuditService.js +2 -1
  299. package/backend/dist/services/securityAuditService.js.map +1 -1
  300. package/backend/dist/services/sharedResourceAccess.d.ts +25 -0
  301. package/backend/dist/services/sharedResourceAccess.d.ts.map +1 -0
  302. package/backend/dist/services/sharedResourceAccess.js +59 -0
  303. package/backend/dist/services/sharedResourceAccess.js.map +1 -0
  304. package/backend/dist/services/skillService.d.ts +137 -0
  305. package/backend/dist/services/skillService.d.ts.map +1 -0
  306. package/backend/dist/services/skillService.js +852 -0
  307. package/backend/dist/services/skillService.js.map +1 -0
  308. package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
  309. package/backend/dist/services/titleGenerationService.js +5 -1
  310. package/backend/dist/services/titleGenerationService.js.map +1 -1
  311. package/backend/dist/services/toolAccessService.d.ts +9 -0
  312. package/backend/dist/services/toolAccessService.d.ts.map +1 -0
  313. package/backend/dist/services/toolAccessService.js +60 -0
  314. package/backend/dist/services/toolAccessService.js.map +1 -0
  315. package/backend/dist/services/toolApprovalService.d.ts +34 -0
  316. package/backend/dist/services/toolApprovalService.d.ts.map +1 -0
  317. package/backend/dist/services/toolApprovalService.js +188 -0
  318. package/backend/dist/services/toolApprovalService.js.map +1 -0
  319. package/backend/dist/services/toolGatewayService.d.ts +53 -0
  320. package/backend/dist/services/toolGatewayService.d.ts.map +1 -0
  321. package/backend/dist/services/toolGatewayService.js +249 -0
  322. package/backend/dist/services/toolGatewayService.js.map +1 -0
  323. package/backend/dist/services/toolServerService.d.ts +57 -0
  324. package/backend/dist/services/toolServerService.d.ts.map +1 -0
  325. package/backend/dist/services/toolServerService.js +521 -0
  326. package/backend/dist/services/toolServerService.js.map +1 -0
  327. package/backend/dist/services/voiceAccessService.d.ts +10 -0
  328. package/backend/dist/services/voiceAccessService.d.ts.map +1 -0
  329. package/backend/dist/services/voiceAccessService.js +74 -0
  330. package/backend/dist/services/voiceAccessService.js.map +1 -0
  331. package/backend/dist/services/voiceProfileService.d.ts +20 -0
  332. package/backend/dist/services/voiceProfileService.d.ts.map +1 -1
  333. package/backend/dist/services/voiceProfileService.js +60 -0
  334. package/backend/dist/services/voiceProfileService.js.map +1 -1
  335. package/backend/dist/services/webSearchPlanService.d.ts +18 -0
  336. package/backend/dist/services/webSearchPlanService.d.ts.map +1 -0
  337. package/backend/dist/services/webSearchPlanService.js +160 -0
  338. package/backend/dist/services/webSearchPlanService.js.map +1 -0
  339. package/backend/dist/services/webSearchService.d.ts +9 -3
  340. package/backend/dist/services/webSearchService.d.ts.map +1 -1
  341. package/backend/dist/services/webSearchService.js +8 -2
  342. package/backend/dist/services/webSearchService.js.map +1 -1
  343. package/backend/dist/storage.d.ts +34 -1
  344. package/backend/dist/storage.d.ts.map +1 -1
  345. package/backend/dist/storage.js +164 -1
  346. package/backend/dist/storage.js.map +1 -1
  347. package/backend/dist/storageMappers.d.ts +2 -2
  348. package/backend/dist/storageMappers.d.ts.map +1 -1
  349. package/backend/dist/storageMappers.js.map +1 -1
  350. package/backend/dist/types/index.d.ts +269 -2
  351. package/backend/dist/types/index.d.ts.map +1 -1
  352. package/backend/dist/types/index.js.map +1 -1
  353. package/backend/dist/types/tools.d.ts +137 -0
  354. package/backend/dist/types/tools.d.ts.map +1 -0
  355. package/backend/dist/types/tools.js +25 -0
  356. package/backend/dist/types/tools.js.map +1 -0
  357. package/backend/dist/utils/automationSchedule.d.ts +26 -0
  358. package/backend/dist/utils/automationSchedule.d.ts.map +1 -0
  359. package/backend/dist/utils/automationSchedule.js +231 -0
  360. package/backend/dist/utils/automationSchedule.js.map +1 -0
  361. package/backend/dist/utils/chatDocumentContext.d.ts +26 -1
  362. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
  363. package/backend/dist/utils/chatDocumentContext.js +87 -18
  364. package/backend/dist/utils/chatDocumentContext.js.map +1 -1
  365. package/backend/dist/utils/documentExtraction.d.ts +69 -0
  366. package/backend/dist/utils/documentExtraction.d.ts.map +1 -0
  367. package/backend/dist/utils/documentExtraction.js +545 -0
  368. package/backend/dist/utils/documentExtraction.js.map +1 -0
  369. package/backend/dist/utils/hybridRetrieval.d.ts +34 -0
  370. package/backend/dist/utils/hybridRetrieval.d.ts.map +1 -0
  371. package/backend/dist/utils/hybridRetrieval.js +119 -0
  372. package/backend/dist/utils/hybridRetrieval.js.map +1 -0
  373. package/backend/dist/utils/icsCalendar.d.ts +27 -0
  374. package/backend/dist/utils/icsCalendar.d.ts.map +1 -0
  375. package/backend/dist/utils/icsCalendar.js +313 -0
  376. package/backend/dist/utils/icsCalendar.js.map +1 -0
  377. package/backend/dist/utils/imageEditUpload.d.ts +29 -0
  378. package/backend/dist/utils/imageEditUpload.d.ts.map +1 -0
  379. package/backend/dist/utils/imageEditUpload.js +82 -0
  380. package/backend/dist/utils/imageEditUpload.js.map +1 -0
  381. package/backend/dist/utils/logRedaction.d.ts +2 -0
  382. package/backend/dist/utils/logRedaction.d.ts.map +1 -0
  383. package/backend/dist/utils/logRedaction.js +66 -0
  384. package/backend/dist/utils/logRedaction.js.map +1 -0
  385. package/backend/dist/utils/logger.d.ts +3 -0
  386. package/backend/dist/utils/logger.d.ts.map +1 -1
  387. package/backend/dist/utils/logger.js +63 -20
  388. package/backend/dist/utils/logger.js.map +1 -1
  389. package/backend/dist/utils/pluginChatAdapter.d.ts +5 -1
  390. package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
  391. package/backend/dist/utils/pluginChatAdapter.js +83 -0
  392. package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
  393. package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
  394. package/backend/dist/utils/resourceLimits.d.ts +68 -2
  395. package/backend/dist/utils/resourceLimits.d.ts.map +1 -1
  396. package/backend/dist/utils/resourceLimits.js +66 -0
  397. package/backend/dist/utils/resourceLimits.js.map +1 -1
  398. package/backend/dist/utils/toolEgress.d.ts +22 -0
  399. package/backend/dist/utils/toolEgress.d.ts.map +1 -0
  400. package/backend/dist/utils/toolEgress.js +157 -0
  401. package/backend/dist/utils/toolEgress.js.map +1 -0
  402. package/backend/dist/utils/websocketMessages.d.ts +6 -0
  403. package/backend/dist/utils/websocketMessages.d.ts.map +1 -1
  404. package/backend/dist/utils/websocketMessages.js +8 -0
  405. package/backend/dist/utils/websocketMessages.js.map +1 -1
  406. package/backend/dist/utils/zipArchive.d.ts +32 -0
  407. package/backend/dist/utils/zipArchive.d.ts.map +1 -0
  408. package/backend/dist/utils/zipArchive.js +171 -0
  409. package/backend/dist/utils/zipArchive.js.map +1 -0
  410. package/backend/dist/websocketServer.d.ts.map +1 -1
  411. package/backend/dist/websocketServer.js +150 -37
  412. package/backend/dist/websocketServer.js.map +1 -1
  413. package/backend/package.json +1 -1
  414. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  415. package/frontend/dist/assets/index-BPsH9FII.js +80 -0
  416. package/frontend/dist/assets/index-BtXF0Oxa.css +1 -0
  417. package/frontend/dist/index.html +18 -18
  418. package/frontend/dist/js/{ArtifactContainer-B-hs0F5K.js → ArtifactContainer-CIoFoMv8.js} +1 -1
  419. package/frontend/dist/js/{ArtifactDemoPage-QFtJw-u4.js → ArtifactDemoPage-D0JEIAbZ.js} +1 -1
  420. package/frontend/dist/js/{ArtifactSandboxFrame-S9g_q47-.js → ArtifactSandboxFrame-REazyIrx.js} +2 -2
  421. package/frontend/dist/js/ArtifactSlideOutPanel-A-i94ghF.js +1 -0
  422. package/frontend/dist/js/AutomationsPage-Dow_lbIf.js +1 -0
  423. package/frontend/dist/js/{Button-BPf_pOxH.js → Button-C0r3J9G_.js} +1 -1
  424. package/frontend/dist/js/CalendarPage-DLjasZOd.js +1 -0
  425. package/frontend/dist/js/ChannelsPage-C8hvTD7J.js +1 -0
  426. package/frontend/dist/js/ChatPage-BAgBHUES.js +16 -0
  427. package/frontend/dist/js/EvaluationsPage-Bm8FRoeX.js +2 -0
  428. package/frontend/dist/js/FirstTimeSetup-BxJapNul.js +1 -0
  429. package/frontend/dist/js/GalleryPage-DHz9DkK7.js +1 -0
  430. package/frontend/dist/js/HomePage-BqNy-FWX.js +1 -0
  431. package/frontend/dist/js/LibreClawPage-BDzDILjY.js +1 -0
  432. package/frontend/dist/js/{ModelManagerModals-DBmm_slu.js → ModelManagerModals-DX9eT5r2.js} +1 -1
  433. package/frontend/dist/js/ModelSelector-ol8mK2ja.js +1 -0
  434. package/frontend/dist/js/NotesPage-DzHEx2O4.js +3 -0
  435. package/frontend/dist/js/{OptimizedSyntaxHighlighter-Dz7D1LPB.js → OptimizedSyntaxHighlighter-CZNPwN0i.js} +1 -1
  436. package/frontend/dist/js/PersonasPage-M_WKH2a9.js +13 -0
  437. package/frontend/dist/js/PluginUsagePage-Ctoka6JZ.js +1 -0
  438. package/frontend/dist/js/RichMessageContent-BqgafH4p.js +3 -0
  439. package/frontend/dist/js/SettingsModal-R9EDadAV.js +19 -0
  440. package/frontend/dist/js/{SettingsToggle-woG_WebF.js → SettingsToggle-BIVyfGjl.js} +1 -1
  441. package/frontend/dist/js/{SystemPage-Xr7XJv8c.js → SystemPage-aOkrSuY7.js} +1 -1
  442. package/frontend/dist/js/UserManagementPage-BOuaX3ay.js +1 -0
  443. package/frontend/dist/js/WorkPage-DxZISerQ.js +6 -0
  444. package/frontend/dist/js/api-6bSMtSNh.js +14 -0
  445. package/frontend/dist/js/{appStore-DXlmTjIC.js → appStore-CdObhQBb.js} +2 -2
  446. package/frontend/dist/js/ar-DT_VLBO3.js +2 -0
  447. package/frontend/dist/js/{authStore-B97lJ5Ee.js → authStore-DbqqrfZv.js} +3 -3
  448. package/frontend/dist/js/{babel-D24oDI9y.js → babel-DSqqk5kt.js} +1 -1
  449. package/frontend/dist/js/bn-BrvEqhGA.js +2 -0
  450. package/frontend/dist/js/calendarDates-Co3o_05Y.js +1 -0
  451. package/frontend/dist/js/chatStore-DbZPJNsu.js +3 -0
  452. package/frontend/dist/js/{config-CmEh9o8U.js → config-8KdgjtEx.js} +1 -1
  453. package/frontend/dist/js/cs-BthnM_YI.js +2 -0
  454. package/frontend/dist/js/da-DCth-6_j.js +2 -0
  455. package/frontend/dist/js/de-BBWt0gJ_.js +2 -0
  456. package/frontend/dist/js/es-DuslOPqM.js +2 -0
  457. package/frontend/dist/js/{estree-CZO8RS52.js → estree-BU5-LV_1.js} +7 -7
  458. package/frontend/dist/js/evaluationsApi-CwZJsgeG.js +1 -0
  459. package/frontend/dist/js/fr-DZAeg46S.js +2 -0
  460. package/frontend/dist/js/hi-ijDSiY77.js +2 -0
  461. package/frontend/dist/js/{html-C31pxhBG.js → html-DeoAy2bo.js} +10 -10
  462. package/frontend/dist/js/id-BS6qS0oq.js +2 -0
  463. package/frontend/dist/js/is-CO2PMDte.js +2 -0
  464. package/frontend/dist/js/it-ChhxT4hs.js +2 -0
  465. package/frontend/dist/js/ja-cyeqUeJN.js +2 -0
  466. package/frontend/dist/js/ko-CfqHTLXj.js +2 -0
  467. package/frontend/dist/js/{markdown-C1CEqXpL.js → markdown-DOLsYkBY.js} +6 -6
  468. package/frontend/dist/js/markdown-core-BK7WVOb7.js +32 -0
  469. package/frontend/dist/js/{markdown-math-DK846gXU.js → markdown-math-e1ByS3KY.js} +5 -5
  470. package/frontend/dist/js/{messageCodeStyles-BqQ6kOSU.js → messageCodeStyles-DhVgizF-.js} +2 -2
  471. package/frontend/dist/js/ms-DZ5pACe1.js +2 -0
  472. package/frontend/dist/js/nl-BsRsnOVp.js +2 -0
  473. package/frontend/dist/js/pl-DXSTAW4M.js +2 -0
  474. package/frontend/dist/js/{postcss-Bx9CTcIc.js → postcss-Bg15EcFE.js} +1 -1
  475. package/frontend/dist/js/pt-DmDx0JxB.js +2 -0
  476. package/frontend/dist/js/{react-vendor-C5yShNlM.js → react-vendor-BG_HPV6X.js} +1 -1
  477. package/frontend/dist/js/router-vendor-CbexJIsv.js +1 -0
  478. package/frontend/dist/js/ru-d2g8EWfY.js +2 -0
  479. package/frontend/dist/js/{standalone-Dz0pkxn0.js → standalone-BO5pzI8_.js} +5 -5
  480. package/frontend/dist/js/sv-CIhYUTVQ.js +2 -0
  481. package/frontend/dist/js/{syntax-highlight-3EEX6CGL.js → syntax-highlight-DcR9Vhb7.js} +3 -3
  482. package/frontend/dist/js/th-B3wSxanB.js +2 -0
  483. package/frontend/dist/js/tr-R4UGgPOY.js +2 -0
  484. package/frontend/dist/js/{typescript-DeXPhp90.js → typescript-6GJ8APmn.js} +2 -2
  485. package/frontend/dist/js/ui-CV0LYmkM.js +2 -0
  486. package/frontend/dist/js/ui-vendor-CWjIBW-z.js +177 -0
  487. package/frontend/dist/js/uk-BzUF4Vkt.js +2 -0
  488. package/frontend/dist/js/{useTranslation-Bho4HCyg.js → useTranslation-5b5UhAc9.js} +1 -1
  489. package/frontend/dist/js/{utils-D9W1Lnkn.js → utils-BGrdX9ie.js} +1 -1
  490. package/frontend/dist/js/{utils-vendor-DWh39_3x.js → utils-vendor-9bQ62WeD.js} +1 -1
  491. package/frontend/dist/js/vi-CKc6Fg4h.js +2 -0
  492. package/frontend/dist/js/{workApi-C4QtuhcE.js → workApi-BruWTlHM.js} +2 -2
  493. package/frontend/dist/js/{yaml-DioTxVLA.js → yaml-DUeWcOOH.js} +5 -5
  494. package/frontend/dist/js/zh-CXL-kDe8.js +2 -0
  495. package/package.json +2 -2
  496. package/plugins/openai.json +52 -9
  497. package/frontend/dist/assets/index-CDQ12KBq.js +0 -34
  498. package/frontend/dist/assets/index-DkFWzmFD.css +0 -1
  499. package/frontend/dist/js/ArtifactSlideOutPanel-D0UOo8RW.js +0 -1
  500. package/frontend/dist/js/ChatPage-fdd8500b.js +0 -23
  501. package/frontend/dist/js/FirstTimeSetup-BTjafGOq.js +0 -1
  502. package/frontend/dist/js/GalleryPage-hR9AJ6b-.js +0 -1
  503. package/frontend/dist/js/HomePage-JvTzq-Pp.js +0 -1
  504. package/frontend/dist/js/LibreClawPage-CLJvtXft.js +0 -1
  505. package/frontend/dist/js/ModelSelector-A-viVFEc.js +0 -1
  506. package/frontend/dist/js/ModelsPage-C4Rm-TZF.js +0 -2
  507. package/frontend/dist/js/NotesPage-C7bPU_KF.js +0 -1
  508. package/frontend/dist/js/PersonasPage-DpvxbFzv.js +0 -13
  509. package/frontend/dist/js/PluginUsagePage-laF-M2X9.js +0 -1
  510. package/frontend/dist/js/RichMessageContent-D0mK9vRA.js +0 -3
  511. package/frontend/dist/js/SettingsModal-DNEQ5sTt.js +0 -1
  512. package/frontend/dist/js/UserManagementPage-DGmbGTC2.js +0 -1
  513. package/frontend/dist/js/WorkPage-DNKFD9gS.js +0 -6
  514. package/frontend/dist/js/api-DGVZHSkS.js +0 -14
  515. package/frontend/dist/js/ar-DW79oSyN.js +0 -2
  516. package/frontend/dist/js/bn-BEAmE7VH.js +0 -2
  517. package/frontend/dist/js/chatStore-zilBUd1p.js +0 -3
  518. package/frontend/dist/js/cs-irpRMzRo.js +0 -2
  519. package/frontend/dist/js/da-cgilTVxc.js +0 -2
  520. package/frontend/dist/js/de-BU-eH3gU.js +0 -2
  521. package/frontend/dist/js/es-B2LRpZ0p.js +0 -2
  522. package/frontend/dist/js/fr-Cd5JM-oQ.js +0 -2
  523. package/frontend/dist/js/hi-CvOhdtiK.js +0 -2
  524. package/frontend/dist/js/id-BtRK5nR_.js +0 -2
  525. package/frontend/dist/js/is-CnEqwgRF.js +0 -2
  526. package/frontend/dist/js/it-CI6WjId6.js +0 -2
  527. package/frontend/dist/js/ja-B6gFOHi6.js +0 -2
  528. package/frontend/dist/js/ko-DuAhnmMf.js +0 -2
  529. package/frontend/dist/js/markdown-core-BmPPZiuD.js +0 -31
  530. package/frontend/dist/js/ms-C8BIP7MZ.js +0 -2
  531. package/frontend/dist/js/nl-DnEdspER.js +0 -2
  532. package/frontend/dist/js/pl-Ddyyvbse.js +0 -2
  533. package/frontend/dist/js/pt-BYuzm70F.js +0 -2
  534. package/frontend/dist/js/router-vendor-CbPDks39.js +0 -1
  535. package/frontend/dist/js/ru-CmSPFxPX.js +0 -2
  536. package/frontend/dist/js/sv-Dd6SQ9f1.js +0 -2
  537. package/frontend/dist/js/th-CpH8745B.js +0 -2
  538. package/frontend/dist/js/tr-DuVD75iJ.js +0 -2
  539. package/frontend/dist/js/ui-CO0DPqrI.js +0 -2
  540. package/frontend/dist/js/ui-vendor-mqjSfAaS.js +0 -177
  541. package/frontend/dist/js/uk-B0MU-M8k.js +0 -2
  542. package/frontend/dist/js/vi-BLmFNp_z.js +0 -2
  543. package/frontend/dist/js/zh-BQu0TLhw.js +0 -2
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Recurrence math for calendar events and automations. All computation uses
3
+ * the server's local timezone; wall-clock trigger times stay stable across
4
+ * DST because candidates are built from local date components, which the
5
+ * Date constructor renormalizes.
6
+ */
7
+ import type { AutomationTrigger } from '../types/index.js';
8
+ export declare class InvalidTriggerError extends Error {
9
+ constructor(message: string);
10
+ }
11
+ /** Validate untrusted input into a well-formed trigger list. */
12
+ export declare function validateTriggers(value: unknown, maximum?: number): AutomationTrigger[];
13
+ /**
14
+ * The first occurrence of a trigger strictly after `after`, or null when the
15
+ * trigger is exhausted. The strictly-after invariant is what prevents a fired
16
+ * occurrence from firing again.
17
+ */
18
+ export declare function nextOccurrence(trigger: AutomationTrigger, after: number): number | null;
19
+ /** The earliest next occurrence across all triggers, or null when exhausted. */
20
+ export declare function nextRunAt(triggers: readonly AutomationTrigger[], after: number): number | null;
21
+ /**
22
+ * Every occurrence in [from, to), ascending, capped. Used to project
23
+ * recurring calendar events and upcoming automation runs onto a date range.
24
+ */
25
+ export declare function occurrencesBetween(triggers: readonly AutomationTrigger[], from: number, to: number, cap?: number): number[];
26
+ //# sourceMappingURL=automationSchedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automationSchedule.d.ts","sourceRoot":"","sources":["../../src/utils/automationSchedule.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAmB3D,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,OAAO,SAAI,GACV,iBAAiB,EAAE,CAoHrB;AAqBD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CA8Ef;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CACvB,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EACtC,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CASf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EACtC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,GAAG,SAAM,GACR,MAAM,EAAE,CAYV"}
@@ -0,0 +1,231 @@
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 DAY_MS = 24 * 60 * 60 * 1000;
18
+ const TRIGGER_KINDS = [
19
+ 'once',
20
+ 'hourly',
21
+ 'daily',
22
+ 'weekly',
23
+ 'monthly',
24
+ 'yearly',
25
+ ];
26
+ const isInt = (value, min, max) => typeof value === 'number' &&
27
+ Number.isSafeInteger(value) &&
28
+ value >= min &&
29
+ value <= max;
30
+ export class InvalidTriggerError extends Error {
31
+ constructor(message) {
32
+ super(message);
33
+ this.name = 'InvalidTriggerError';
34
+ }
35
+ }
36
+ /** Validate untrusted input into a well-formed trigger list. */
37
+ export function validateTriggers(value, maximum = 5) {
38
+ if (!Array.isArray(value) || value.length === 0) {
39
+ throw new InvalidTriggerError('At least one trigger is required');
40
+ }
41
+ if (value.length > maximum) {
42
+ throw new InvalidTriggerError(`At most ${maximum} triggers are allowed`);
43
+ }
44
+ return value.map(item => {
45
+ if (typeof item !== 'object' || item === null) {
46
+ throw new InvalidTriggerError('Each trigger must be an object');
47
+ }
48
+ const trigger = item;
49
+ switch (trigger.kind) {
50
+ case 'once': {
51
+ if (!isInt(trigger.at, 0, 8.64e15)) {
52
+ throw new InvalidTriggerError('A once trigger needs an epoch-ms "at" time');
53
+ }
54
+ return { kind: 'once', at: trigger.at };
55
+ }
56
+ case 'hourly': {
57
+ if (!isInt(trigger.minute, 0, 59)) {
58
+ throw new InvalidTriggerError('An hourly trigger needs a minute between 0 and 59');
59
+ }
60
+ const bounds = {};
61
+ if (trigger.startHour !== undefined) {
62
+ if (!isInt(trigger.startHour, 0, 23)) {
63
+ throw new InvalidTriggerError('startHour must be 0-23');
64
+ }
65
+ bounds.startHour = trigger.startHour;
66
+ }
67
+ if (trigger.endHour !== undefined) {
68
+ if (!isInt(trigger.endHour, 0, 23)) {
69
+ throw new InvalidTriggerError('endHour must be 0-23');
70
+ }
71
+ bounds.endHour = trigger.endHour;
72
+ }
73
+ if (bounds.startHour !== undefined &&
74
+ bounds.endHour !== undefined &&
75
+ bounds.endHour < bounds.startHour) {
76
+ throw new InvalidTriggerError('endHour must not precede startHour');
77
+ }
78
+ return { kind: 'hourly', minute: trigger.minute, ...bounds };
79
+ }
80
+ case 'daily': {
81
+ if (!isInt(trigger.hour, 0, 23) || !isInt(trigger.minute, 0, 59)) {
82
+ throw new InvalidTriggerError('A daily trigger needs an hour (0-23) and minute (0-59)');
83
+ }
84
+ return { kind: 'daily', hour: trigger.hour, minute: trigger.minute };
85
+ }
86
+ case 'weekly': {
87
+ if (!isInt(trigger.dayOfWeek, 0, 6) ||
88
+ !isInt(trigger.hour, 0, 23) ||
89
+ !isInt(trigger.minute, 0, 59)) {
90
+ throw new InvalidTriggerError('A weekly trigger needs dayOfWeek (0-6), hour, and minute');
91
+ }
92
+ return {
93
+ kind: 'weekly',
94
+ dayOfWeek: trigger.dayOfWeek,
95
+ hour: trigger.hour,
96
+ minute: trigger.minute,
97
+ };
98
+ }
99
+ case 'monthly': {
100
+ if (!isInt(trigger.dayOfMonth, 1, 31) ||
101
+ !isInt(trigger.hour, 0, 23) ||
102
+ !isInt(trigger.minute, 0, 59)) {
103
+ throw new InvalidTriggerError('A monthly trigger needs dayOfMonth (1-31), hour, and minute');
104
+ }
105
+ return {
106
+ kind: 'monthly',
107
+ dayOfMonth: trigger.dayOfMonth,
108
+ hour: trigger.hour,
109
+ minute: trigger.minute,
110
+ };
111
+ }
112
+ case 'yearly': {
113
+ if (!isInt(trigger.month, 1, 12) ||
114
+ !isInt(trigger.dayOfMonth, 1, 31) ||
115
+ !isInt(trigger.hour, 0, 23) ||
116
+ !isInt(trigger.minute, 0, 59)) {
117
+ throw new InvalidTriggerError('A yearly trigger needs month (1-12), dayOfMonth, hour, and minute');
118
+ }
119
+ return {
120
+ kind: 'yearly',
121
+ month: trigger.month,
122
+ dayOfMonth: trigger.dayOfMonth,
123
+ hour: trigger.hour,
124
+ minute: trigger.minute,
125
+ };
126
+ }
127
+ default:
128
+ throw new InvalidTriggerError(`Unknown trigger kind; expected one of ${TRIGGER_KINDS.join(', ')}`);
129
+ }
130
+ });
131
+ }
132
+ const daysInMonth = (year, monthIndex) => new Date(year, monthIndex + 1, 0).getDate();
133
+ const atLocalTime = (base, dayOffset, hour, minute) => new Date(base.getFullYear(), base.getMonth(), base.getDate() + dayOffset, hour, minute, 0, 0).getTime();
134
+ /**
135
+ * The first occurrence of a trigger strictly after `after`, or null when the
136
+ * trigger is exhausted. The strictly-after invariant is what prevents a fired
137
+ * occurrence from firing again.
138
+ */
139
+ export function nextOccurrence(trigger, after) {
140
+ const base = new Date(after);
141
+ switch (trigger.kind) {
142
+ case 'once':
143
+ return trigger.at > after ? trigger.at : null;
144
+ case 'hourly': {
145
+ const start = trigger.startHour ?? 0;
146
+ const end = trigger.endHour ?? 23;
147
+ for (let offset = 0; offset <= 1; offset += 1) {
148
+ const day = new Date(after + offset * DAY_MS);
149
+ const firstHour = offset === 0 ? 0 : start;
150
+ for (let hour = firstHour; hour <= 23; hour += 1) {
151
+ if (hour < start || hour > end)
152
+ continue;
153
+ const candidate = atLocalTime(day, 0, hour, trigger.minute);
154
+ if (candidate > after)
155
+ return candidate;
156
+ }
157
+ }
158
+ return null;
159
+ }
160
+ case 'daily': {
161
+ for (let offset = 0; offset <= 1; offset += 1) {
162
+ const candidate = atLocalTime(base, offset, trigger.hour, trigger.minute);
163
+ if (candidate > after)
164
+ return candidate;
165
+ }
166
+ return null;
167
+ }
168
+ case 'weekly': {
169
+ const todayDow = base.getDay();
170
+ let offset = (trigger.dayOfWeek - todayDow + 7) % 7;
171
+ let candidate = atLocalTime(base, offset, trigger.hour, trigger.minute);
172
+ if (candidate <= after) {
173
+ offset += 7;
174
+ candidate = atLocalTime(base, offset, trigger.hour, trigger.minute);
175
+ }
176
+ return candidate;
177
+ }
178
+ case 'monthly': {
179
+ for (let monthOffset = 0; monthOffset <= 1; monthOffset += 1) {
180
+ const year = base.getFullYear();
181
+ const month = base.getMonth() + monthOffset;
182
+ const day = Math.min(trigger.dayOfMonth, daysInMonth(year, month));
183
+ const candidate = new Date(year, month, day, trigger.hour, trigger.minute, 0, 0).getTime();
184
+ if (candidate > after)
185
+ return candidate;
186
+ }
187
+ return null;
188
+ }
189
+ case 'yearly': {
190
+ for (let yearOffset = 0; yearOffset <= 1; yearOffset += 1) {
191
+ const year = base.getFullYear() + yearOffset;
192
+ const monthIndex = trigger.month - 1;
193
+ const day = Math.min(trigger.dayOfMonth, daysInMonth(year, monthIndex));
194
+ const candidate = new Date(year, monthIndex, day, trigger.hour, trigger.minute, 0, 0).getTime();
195
+ if (candidate > after)
196
+ return candidate;
197
+ }
198
+ return null;
199
+ }
200
+ }
201
+ }
202
+ /** The earliest next occurrence across all triggers, or null when exhausted. */
203
+ export function nextRunAt(triggers, after) {
204
+ let earliest = null;
205
+ for (const trigger of triggers) {
206
+ const candidate = nextOccurrence(trigger, after);
207
+ if (candidate !== null && (earliest === null || candidate < earliest)) {
208
+ earliest = candidate;
209
+ }
210
+ }
211
+ return earliest;
212
+ }
213
+ /**
214
+ * Every occurrence in [from, to), ascending, capped. Used to project
215
+ * recurring calendar events and upcoming automation runs onto a date range.
216
+ */
217
+ export function occurrencesBetween(triggers, from, to, cap = 500) {
218
+ const occurrences = new Set();
219
+ for (const trigger of triggers) {
220
+ let cursor = from - 1;
221
+ while (occurrences.size < cap) {
222
+ const candidate = nextOccurrence(trigger, cursor);
223
+ if (candidate === null || candidate >= to)
224
+ break;
225
+ occurrences.add(candidate);
226
+ cursor = candidate;
227
+ }
228
+ }
229
+ return [...occurrences].sort((left, right) => left - right);
230
+ }
231
+ //# sourceMappingURL=automationSchedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automationSchedule.js","sourceRoot":"","sources":["../../src/utils/automationSchedule.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,39 @@
1
+ /** One cited excerpt of a source document. */
2
+ export interface ChatDocumentCitation {
3
+ chunkIndex: number;
4
+ /** Human-readable source location (page/slide/sheet/section). */
5
+ location?: string;
6
+ /** Retrieval score of this excerpt within the query's ranking. */
7
+ score?: number;
8
+ }
1
9
  export interface ChatDocumentSource {
2
10
  id: string;
3
11
  filename: string;
12
+ /** Present in retrieval mode: which excerpts contributed, best first. */
13
+ citations?: ChatDocumentCitation[];
14
+ /** True when the document's full content entered context. */
15
+ full?: boolean;
4
16
  }
5
17
  export interface ChatDocumentContext {
6
18
  documentContext: string;
7
19
  enhancedContent: string;
8
20
  hasRelevantContext: boolean;
9
- /** Documents that actually contributed chunks, deduplicated, best first. */
21
+ /** Documents that actually contributed, deduplicated, best first. */
10
22
  sources: ChatDocumentSource[];
23
+ /** How document context was assembled for this turn. */
24
+ mode: 'retrieval' | 'full';
25
+ /** Set when full-document mode was requested but exceeded the guard. */
26
+ fullContextSkipped?: {
27
+ estimatedTokens: number;
28
+ maxTokens: number;
29
+ };
11
30
  }
31
+ /**
32
+ * Full-document mode sends entire extracted sources instead of retrieved
33
+ * excerpts, so it needs a hard token guard. Deliberately conservative:
34
+ * most local models run 8k-128k contexts.
35
+ */
36
+ export declare const fullDocumentContextMaxTokens: () => number;
12
37
  export declare const EMPTY_CHAT_DOCUMENT_CONTEXT: (message: string) => ChatDocumentContext;
13
38
  export declare function buildChatDocumentContext(message: string, sessionId: string, userId: string, signal?: AbortSignal): Promise<ChatDocumentContext>;
14
39
  //# sourceMappingURL=chatDocumentContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatDocumentContext.d.ts","sourceRoot":"","sources":["../../src/utils/chatDocumentContext.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,4EAA4E;IAC5E,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,2BAA2B,YAC7B,MAAM,KACd,mBAKD,CAAC;AAEH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC,CA6D9B"}
1
+ {"version":3,"file":"chatDocumentContext.d.ts","sourceRoot":"","sources":["../../src/utils/chatDocumentContext.ts"],"names":[],"mappings":"AAsBA,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACnC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qEAAqE;IACrE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,wDAAwD;IACxD,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,wEAAwE;IACxE,kBAAkB,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,QAAO,MAU/C,CAAC;AAEF,eAAO,MAAM,2BAA2B,YAC7B,MAAM,KACd,mBAMD,CAAC;AA6DH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAkF9B"}
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
6
  * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at:
7
+ * You may obtain a copy of the License at
8
8
  *
9
9
  * http://www.apache.org/licenses/LICENSE-2.0
10
10
  *
@@ -15,48 +15,115 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  import documentService from '../services/documentService.js';
18
+ import { estimateTextTokens } from '../services/contextCompactionService.js';
18
19
  import storageService from '../storage.js';
19
20
  import { throwIfChatGenerationCancelled } from './chatCancellation.js';
21
+ /**
22
+ * Full-document mode sends entire extracted sources instead of retrieved
23
+ * excerpts, so it needs a hard token guard. Deliberately conservative:
24
+ * most local models run 8k-128k contexts.
25
+ */
26
+ export const fullDocumentContextMaxTokens = () => {
27
+ const raw = process.env.FULL_DOCUMENT_CONTEXT_MAX_TOKENS;
28
+ if (raw === undefined)
29
+ return 32000;
30
+ const value = Number.parseInt(raw, 10);
31
+ if (!Number.isSafeInteger(value) || value < 1000 || value > 2000000) {
32
+ throw new Error('FULL_DOCUMENT_CONTEXT_MAX_TOKENS must be between 1000 and 2000000');
33
+ }
34
+ return value;
35
+ };
20
36
  export const EMPTY_CHAT_DOCUMENT_CONTEXT = (message) => ({
21
37
  documentContext: '',
22
38
  enhancedContent: message,
23
39
  hasRelevantContext: false,
24
40
  sources: [],
41
+ mode: 'retrieval',
25
42
  });
43
+ const buildFullDocumentContext = async (message, sessionId, userId, knowledgeCollectionIds, signal) => {
44
+ const documents = (await documentService.getDocumentsInScope(userId, sessionId, knowledgeCollectionIds)).filter(document => (document.content ?? '').trim().length > 0);
45
+ throwIfChatGenerationCancelled(signal);
46
+ if (documents.length === 0) {
47
+ return { context: EMPTY_CHAT_DOCUMENT_CONTEXT(message) };
48
+ }
49
+ const maxTokens = fullDocumentContextMaxTokens();
50
+ const estimatedTokens = documents.reduce((total, document) => total + estimateTextTokens(document.content ?? ''), 0);
51
+ if (estimatedTokens > maxTokens) {
52
+ // Too large to send whole: fall back to retrieval, but tell the caller
53
+ // so the client can explain why full mode did not apply.
54
+ return { skipped: { estimatedTokens, maxTokens } };
55
+ }
56
+ const documentContext = '\n\n--- ATTACHED DOCUMENTS (full content) ---\n' +
57
+ documents
58
+ .map(document => `Document: ${document.filename}\n${document.content ?? ''}\n`)
59
+ .join('\n---\n') +
60
+ '\n--- END DOCUMENTS ---\n\n';
61
+ return {
62
+ context: {
63
+ documentContext,
64
+ enhancedContent: `${documentContext}User question: ${message}`,
65
+ hasRelevantContext: true,
66
+ sources: documents.map(document => ({
67
+ id: document.id,
68
+ filename: document.filename,
69
+ full: true,
70
+ })),
71
+ mode: 'full',
72
+ },
73
+ };
74
+ };
26
75
  export async function buildChatDocumentContext(message, sessionId, userId, signal) {
27
76
  throwIfChatGenerationCancelled(signal);
28
77
  // Documents from knowledge collections attached to this chat join the
29
78
  // session's own uploads and the user's standing uploads in the
30
- // searchable scope. searchDocuments picks semantic or keyword retrieval
79
+ // searchable scope. searchDocuments picks hybrid or keyword retrieval
31
80
  // by the embedding settings, so retrieval works either way.
32
- const knowledgeCollectionIds = (await storageService.getSession(sessionId, userId))?.settings?.knowledgeCollectionIds;
81
+ const settings = (await storageService.getSession(sessionId, userId))
82
+ ?.settings;
83
+ const knowledgeCollectionIds = settings?.knowledgeCollectionIds;
84
+ throwIfChatGenerationCancelled(signal);
85
+ let fullContextSkipped;
86
+ if (settings?.fullDocumentContext === true) {
87
+ const outcome = await buildFullDocumentContext(message, sessionId, userId, knowledgeCollectionIds, signal);
88
+ if (outcome.context)
89
+ return outcome.context;
90
+ fullContextSkipped = outcome.skipped;
91
+ }
33
92
  throwIfChatGenerationCancelled(signal);
34
93
  const relevantDocuments = await documentService.searchDocuments(message, userId, sessionId, 5, knowledgeCollectionIds, signal);
35
94
  throwIfChatGenerationCancelled(signal);
36
95
  if (relevantDocuments.length === 0) {
37
- return EMPTY_CHAT_DOCUMENT_CONTEXT(message);
96
+ return {
97
+ ...EMPTY_CHAT_DOCUMENT_CONTEXT(message),
98
+ ...(fullContextSkipped ? { fullContextSkipped } : {}),
99
+ };
38
100
  }
39
- const documentsMap = new Map();
40
- const sources = [];
101
+ const sourcesById = new Map();
41
102
  for (const chunk of relevantDocuments) {
42
103
  throwIfChatGenerationCancelled(signal);
43
- if (!documentsMap.has(chunk.documentId)) {
44
- const document = await documentService.getDocument(chunk.documentId, userId);
45
- throwIfChatGenerationCancelled(signal);
46
- documentsMap.set(chunk.documentId, document);
47
- sources.push({
104
+ let source = sourcesById.get(chunk.documentId);
105
+ if (!source) {
106
+ source = {
48
107
  id: chunk.documentId,
49
- filename: document?.filename || 'Unknown Document',
50
- });
108
+ filename: chunk.filename || 'Unknown Document',
109
+ citations: [],
110
+ };
111
+ sourcesById.set(chunk.documentId, source);
51
112
  }
113
+ source.citations.push({
114
+ chunkIndex: chunk.chunkIndex,
115
+ ...(chunk.location ? { location: chunk.location } : {}),
116
+ ...(chunk.score !== undefined ? { score: chunk.score } : {}),
117
+ });
52
118
  }
53
- throwIfChatGenerationCancelled(signal);
54
119
  const documentContext = '\n\n--- RELEVANT DOCUMENTS ---\n' +
55
120
  relevantDocuments
56
121
  .map((chunk, index) => {
57
- const doc = documentsMap.get(chunk.documentId);
58
- const docTitle = doc ? doc.filename : 'Unknown Document';
59
- return `Document ${index + 1}: ${docTitle} (chunk ${chunk.chunkIndex + 1})\n${chunk.content}\n`;
122
+ const docTitle = chunk.filename || 'Unknown Document';
123
+ const where = chunk.location
124
+ ? `chunk ${chunk.chunkIndex + 1}, ${chunk.location}`
125
+ : `chunk ${chunk.chunkIndex + 1}`;
126
+ return `Document ${index + 1}: ${docTitle} (${where})\n${chunk.content}\n`;
60
127
  })
61
128
  .join('\n---\n') +
62
129
  '\n--- END DOCUMENTS ---\n\n';
@@ -64,7 +131,9 @@ export async function buildChatDocumentContext(message, sessionId, userId, signa
64
131
  documentContext,
65
132
  enhancedContent: `${documentContext}User question: ${message}`,
66
133
  hasRelevantContext: true,
67
- sources,
134
+ sources: [...sourcesById.values()],
135
+ mode: 'retrieval',
136
+ ...(fullContextSkipped ? { fullContextSkipped } : {}),
68
137
  };
69
138
  }
70
139
  //# sourceMappingURL=chatDocumentContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatDocumentContext.js","sourceRoot":"","sources":["../../src/utils/chatDocumentContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,eAAe,MAAM,gCAAgC,CAAC;AAC7D,OAAO,cAAc,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAevE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAe,EACM,EAAE,CAAC,CAAC;IACzB,eAAe,EAAE,EAAE;IACnB,eAAe,EAAE,OAAO;IACxB,kBAAkB,EAAE,KAAK;IACzB,OAAO,EAAE,EAAE;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAe,EACf,SAAiB,EACjB,MAAc,EACd,MAAoB;IAEpB,8BAA8B,CAAC,MAAM,CAAC,CAAC;IACvC,sEAAsE;IACtE,+DAA+D;IAC/D,wEAAwE;IACxE,4DAA4D;IAC5D,MAAM,sBAAsB,GAAG,CAC7B,MAAM,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CACnD,EAAE,QAAQ,EAAE,sBAAsB,CAAC;IACpC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,iBAAiB,GAAG,MAAM,eAAe,CAAC,eAAe,CAC7D,OAAO,EACP,MAAM,EACN,SAAS,EACT,CAAC,EACD,sBAAsB,EACtB,MAAM,CACP,CAAC;IACF,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,8BAA8B,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,WAAW,CAChD,KAAK,CAAC,UAAU,EAChB,MAAM,CACP,CAAC;YACF,8BAA8B,CAAC,MAAM,CAAC,CAAC;YACvC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,KAAK,CAAC,UAAU;gBACpB,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,kBAAkB;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,eAAe,GACnB,kCAAkC;QAClC,iBAAiB;aACd,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC;YACzD,OAAO,YAAY,KAAK,GAAG,CAAC,KAAK,QAAQ,WAAW,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,KAAK,CAAC,OAAO,IAAI,CAAC;QAClG,CAAC,CAAC;aACD,IAAI,CAAC,SAAS,CAAC;QAClB,6BAA6B,CAAC;IAEhC,OAAO;QACL,eAAe;QACf,eAAe,EAAE,GAAG,eAAe,kBAAkB,OAAO,EAAE;QAC9D,kBAAkB,EAAE,IAAI;QACxB,OAAO;KACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"chatDocumentContext.js","sourceRoot":"","sources":["../../src/utils/chatDocumentContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { DocumentFileType } from '../types/index.js';
2
+ /**
3
+ * Document extraction for knowledge ingestion.
4
+ *
5
+ * Every supported upload type resolves to one canonical `DocumentFileType`
6
+ * and one extractor that returns plain text plus an optional segment map.
7
+ * Segments record where pages, slides, sheets, and Markdown sections start
8
+ * and end inside the extracted text, so retrieval can cite an exact source
9
+ * location without a second parse of the original file.
10
+ *
11
+ * OOXML formats are unpacked with the in-repo bounded ZIP reader and a
12
+ * narrow text-run scan of the document XML; the goal is faithful text for
13
+ * retrieval, not layout fidelity. Images/OCR and audio transcription are
14
+ * deliberately not extracted here — they are documented boundaries until an
15
+ * OCR engine and a default speech-to-text route exist.
16
+ */
17
+ export type { DocumentFileType } from '../types/index.js';
18
+ export interface DocumentSegment {
19
+ kind: 'page' | 'slide' | 'sheet' | 'section';
20
+ label: string;
21
+ startChar: number;
22
+ endChar: number;
23
+ }
24
+ export interface ExtractedDocumentContent {
25
+ content: string;
26
+ segments: DocumentSegment[];
27
+ }
28
+ export declare class DocumentExtractionError extends Error {
29
+ constructor(message: string);
30
+ }
31
+ export declare const SUPPORTED_DOCUMENT_EXTENSIONS: readonly string[];
32
+ export declare const SUPPORTED_DOCUMENT_MIME_TYPES: readonly string[];
33
+ /**
34
+ * Resolves the canonical file type for an upload. The extension decides
35
+ * first because browsers report unreliable MIME types for Markdown, code,
36
+ * and OOXML files; the declared MIME type is the fallback for extensionless
37
+ * names. Returns null when neither identifies a supported type.
38
+ */
39
+ export declare const resolveDocumentFileType: (fileName: string, mimeType: string) => DocumentFileType | null;
40
+ /** Validates a stored document metadata segment map. */
41
+ export declare const readDocumentSegments: (metadata: Record<string, unknown> | undefined) => DocumentSegment[];
42
+ /**
43
+ * Human-readable location of a chunk inside its source, chosen as the
44
+ * segment with the greatest overlap of the chunk's character range.
45
+ * Offsets are approximate (chunking trims whitespace), so overlap rather
46
+ * than containment decides.
47
+ */
48
+ export declare const resolveSegmentLabel: (segments: readonly DocumentSegment[], startChar: number, endChar: number) => string | undefined;
49
+ export interface PdfExtractionApi {
50
+ getDocument(options: {
51
+ data: Uint8Array;
52
+ }): {
53
+ promise: Promise<{
54
+ numPages: number;
55
+ getPage(pageNumber: number): Promise<{
56
+ getTextContent(): Promise<{
57
+ items: unknown[];
58
+ }>;
59
+ }>;
60
+ }>;
61
+ };
62
+ }
63
+ export interface DocumentExtractionOptions {
64
+ signal?: AbortSignal;
65
+ /** Lazily loaded pdfjs module; required only for PDF extraction. */
66
+ pdfLib?: PdfExtractionApi;
67
+ }
68
+ export declare const extractDocumentContentByType: (buffer: Buffer, fileType: DocumentFileType, options?: DocumentExtractionOptions) => Promise<ExtractedDocumentContent>;
69
+ //# sourceMappingURL=documentExtraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentExtraction.d.ts","sourceRoot":"","sources":["../../src/utils/documentExtraction.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AA0GD,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAE1D,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAEzD,CAAC;AASH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,aACxB,MAAM,YACN,MAAM,KACf,gBAAgB,GAAG,IAerB,CAAC;AAIF,wDAAwD;AACxD,eAAO,MAAM,oBAAoB,aACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAC5C,eAAe,EA0BjB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,aACpB,SAAS,eAAe,EAAE,aACzB,MAAM,WACR,MAAM,KACd,MAAM,GAAG,SAqBX,CAAC;AAsSF,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG;QAC1C,OAAO,EAAE,OAAO,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;gBACnC,cAAc,IAAI,OAAO,CAAC;oBAAE,KAAK,EAAE,OAAO,EAAE,CAAA;iBAAE,CAAC,CAAC;aACjD,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;CACH;AAgDD,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oEAAoE;IACpE,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,eAAO,MAAM,4BAA4B,WAC/B,MAAM,YACJ,gBAAgB,YACjB,yBAAyB,KACjC,OAAO,CAAC,wBAAwB,CA4BlC,CAAC"}