libre-webui 0.21.2 → 0.22.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 (946) hide show
  1. package/README.md +308 -328
  2. package/backend/dist/cli/migrateSqliteToPostgres.d.ts +2 -0
  3. package/backend/dist/cli/migrateSqliteToPostgres.d.ts.map +1 -0
  4. package/backend/dist/cli/migrateSqliteToPostgres.js +113 -0
  5. package/backend/dist/cli/migrateSqliteToPostgres.js.map +1 -0
  6. package/backend/dist/cli/recoveryBackup.d.ts +3 -0
  7. package/backend/dist/cli/recoveryBackup.d.ts.map +1 -0
  8. package/backend/dist/cli/recoveryBackup.js +251 -0
  9. package/backend/dist/cli/recoveryBackup.js.map +1 -0
  10. package/backend/dist/cli/recoveryInventory.d.ts +2 -0
  11. package/backend/dist/cli/recoveryInventory.d.ts.map +1 -0
  12. package/backend/dist/cli/recoveryInventory.js +109 -0
  13. package/backend/dist/cli/recoveryInventory.js.map +1 -0
  14. package/backend/dist/db.d.ts +27 -0
  15. package/backend/dist/db.d.ts.map +1 -1
  16. package/backend/dist/db.js +333 -16
  17. package/backend/dist/db.js.map +1 -1
  18. package/backend/dist/env.d.ts.map +1 -1
  19. package/backend/dist/env.js +12 -2
  20. package/backend/dist/env.js.map +1 -1
  21. package/backend/dist/index.d.ts.map +1 -1
  22. package/backend/dist/index.js +235 -47
  23. package/backend/dist/index.js.map +1 -1
  24. package/backend/dist/main.d.ts +2 -0
  25. package/backend/dist/main.d.ts.map +1 -0
  26. package/backend/dist/main.js +137 -0
  27. package/backend/dist/main.js.map +1 -0
  28. package/backend/dist/middleware/auth.d.ts.map +1 -1
  29. package/backend/dist/middleware/auth.js +7 -3
  30. package/backend/dist/middleware/auth.js.map +1 -1
  31. package/backend/dist/middleware/chatCancellationAdmission.d.ts +7 -0
  32. package/backend/dist/middleware/chatCancellationAdmission.d.ts.map +1 -0
  33. package/backend/dist/middleware/chatCancellationAdmission.js +17 -0
  34. package/backend/dist/middleware/chatCancellationAdmission.js.map +1 -0
  35. package/backend/dist/middleware/coordinatedRateLimit.d.ts +18 -0
  36. package/backend/dist/middleware/coordinatedRateLimit.d.ts.map +1 -0
  37. package/backend/dist/middleware/coordinatedRateLimit.js +52 -0
  38. package/backend/dist/middleware/coordinatedRateLimit.js.map +1 -0
  39. package/backend/dist/middleware/sharedRateLimit.d.ts +26 -0
  40. package/backend/dist/middleware/sharedRateLimit.d.ts.map +1 -0
  41. package/backend/dist/middleware/sharedRateLimit.js +99 -0
  42. package/backend/dist/middleware/sharedRateLimit.js.map +1 -0
  43. package/backend/dist/models/personaModel.d.ts +1 -26
  44. package/backend/dist/models/personaModel.d.ts.map +1 -1
  45. package/backend/dist/models/personaModel.js +54 -247
  46. package/backend/dist/models/personaModel.js.map +1 -1
  47. package/backend/dist/models/userModel.d.ts +23 -66
  48. package/backend/dist/models/userModel.d.ts.map +1 -1
  49. package/backend/dist/models/userModel.js +110 -187
  50. package/backend/dist/models/userModel.js.map +1 -1
  51. package/backend/dist/persistence/chatGenerationTypes.d.ts +24 -0
  52. package/backend/dist/persistence/chatGenerationTypes.d.ts.map +1 -0
  53. package/backend/dist/persistence/chatGenerationTypes.js +7 -0
  54. package/backend/dist/persistence/chatGenerationTypes.js.map +1 -0
  55. package/backend/dist/persistence/extensionTypes.d.ts +185 -0
  56. package/backend/dist/persistence/extensionTypes.d.ts.map +1 -0
  57. package/backend/dist/persistence/extensionTypes.js +13 -0
  58. package/backend/dist/persistence/extensionTypes.js.map +1 -0
  59. package/backend/dist/persistence/identityDeletionTypes.d.ts +16 -0
  60. package/backend/dist/persistence/identityDeletionTypes.d.ts.map +1 -0
  61. package/backend/dist/persistence/identityDeletionTypes.js +7 -0
  62. package/backend/dist/persistence/identityDeletionTypes.js.map +1 -0
  63. package/backend/dist/persistence/index.d.ts +48 -0
  64. package/backend/dist/persistence/index.d.ts.map +1 -0
  65. package/backend/dist/persistence/index.js +159 -0
  66. package/backend/dist/persistence/index.js.map +1 -0
  67. package/backend/dist/persistence/postgresConfig.d.ts +32 -0
  68. package/backend/dist/persistence/postgresConfig.d.ts.map +1 -0
  69. package/backend/dist/persistence/postgresConfig.js +91 -0
  70. package/backend/dist/persistence/postgresConfig.js.map +1 -0
  71. package/backend/dist/persistence/postgresCoreMigration.d.ts +8 -0
  72. package/backend/dist/persistence/postgresCoreMigration.d.ts.map +1 -0
  73. package/backend/dist/persistence/postgresCoreMigration.js +179 -0
  74. package/backend/dist/persistence/postgresCoreMigration.js.map +1 -0
  75. package/backend/dist/persistence/postgresDatabase.d.ts +40 -0
  76. package/backend/dist/persistence/postgresDatabase.d.ts.map +1 -0
  77. package/backend/dist/persistence/postgresDatabase.js +148 -0
  78. package/backend/dist/persistence/postgresDatabase.js.map +1 -0
  79. package/backend/dist/persistence/postgresExtensionMigration.d.ts +4 -0
  80. package/backend/dist/persistence/postgresExtensionMigration.d.ts.map +1 -0
  81. package/backend/dist/persistence/postgresExtensionMigration.js +143 -0
  82. package/backend/dist/persistence/postgresExtensionMigration.js.map +1 -0
  83. package/backend/dist/persistence/postgresExtensionRepositories.d.ts +6 -0
  84. package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -0
  85. package/backend/dist/persistence/postgresExtensionRepositories.js +550 -0
  86. package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -0
  87. package/backend/dist/persistence/postgresImportState.d.ts +9 -0
  88. package/backend/dist/persistence/postgresImportState.d.ts.map +1 -0
  89. package/backend/dist/persistence/postgresImportState.js +64 -0
  90. package/backend/dist/persistence/postgresImportState.js.map +1 -0
  91. package/backend/dist/persistence/postgresMigrationRegistry.d.ts +4 -0
  92. package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -0
  93. package/backend/dist/persistence/postgresMigrationRegistry.js +33 -0
  94. package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -0
  95. package/backend/dist/persistence/postgresMigrationTypes.d.ts +24 -0
  96. package/backend/dist/persistence/postgresMigrationTypes.d.ts.map +1 -0
  97. package/backend/dist/persistence/postgresMigrationTypes.js +7 -0
  98. package/backend/dist/persistence/postgresMigrationTypes.js.map +1 -0
  99. package/backend/dist/persistence/postgresMigrations.d.ts +15 -0
  100. package/backend/dist/persistence/postgresMigrations.d.ts.map +1 -0
  101. package/backend/dist/persistence/postgresMigrations.js +333 -0
  102. package/backend/dist/persistence/postgresMigrations.js.map +1 -0
  103. package/backend/dist/persistence/postgresPersistence.d.ts +17 -0
  104. package/backend/dist/persistence/postgresPersistence.d.ts.map +1 -0
  105. package/backend/dist/persistence/postgresPersistence.js +332 -0
  106. package/backend/dist/persistence/postgresPersistence.js.map +1 -0
  107. package/backend/dist/persistence/postgresPluginDefinitionMigration.d.ts +4 -0
  108. package/backend/dist/persistence/postgresPluginDefinitionMigration.d.ts.map +1 -0
  109. package/backend/dist/persistence/postgresPluginDefinitionMigration.js +40 -0
  110. package/backend/dist/persistence/postgresPluginDefinitionMigration.js.map +1 -0
  111. package/backend/dist/persistence/postgresResourceRepositories.d.ts +7 -0
  112. package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -0
  113. package/backend/dist/persistence/postgresResourceRepositories.js +776 -0
  114. package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -0
  115. package/backend/dist/persistence/postgresSchemaInspector.d.ts +14 -0
  116. package/backend/dist/persistence/postgresSchemaInspector.d.ts.map +1 -0
  117. package/backend/dist/persistence/postgresSchemaInspector.js +817 -0
  118. package/backend/dist/persistence/postgresSchemaInspector.js.map +1 -0
  119. package/backend/dist/persistence/resourceTypes.d.ts +207 -0
  120. package/backend/dist/persistence/resourceTypes.d.ts.map +1 -0
  121. package/backend/dist/persistence/resourceTypes.js +38 -0
  122. package/backend/dist/persistence/resourceTypes.js.map +1 -0
  123. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts +4 -0
  124. package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -0
  125. package/backend/dist/persistence/sqliteExtensionRepositories.js +494 -0
  126. package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -0
  127. package/backend/dist/persistence/sqliteMigrations.d.ts +93 -0
  128. package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -0
  129. package/backend/dist/persistence/sqliteMigrations.js +2232 -0
  130. package/backend/dist/persistence/sqliteMigrations.js.map +1 -0
  131. package/backend/dist/persistence/sqlitePersistence.d.ts +23 -0
  132. package/backend/dist/persistence/sqlitePersistence.d.ts.map +1 -0
  133. package/backend/dist/persistence/sqlitePersistence.js +596 -0
  134. package/backend/dist/persistence/sqlitePersistence.js.map +1 -0
  135. package/backend/dist/persistence/sqliteResourceRepositories.d.ts +4 -0
  136. package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -0
  137. package/backend/dist/persistence/sqliteResourceRepositories.js +663 -0
  138. package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -0
  139. package/backend/dist/persistence/sqliteSyncExecutor.d.ts +5 -0
  140. package/backend/dist/persistence/sqliteSyncExecutor.d.ts.map +1 -0
  141. package/backend/dist/persistence/sqliteSyncExecutor.js +19 -0
  142. package/backend/dist/persistence/sqliteSyncExecutor.js.map +1 -0
  143. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts +80 -0
  144. package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -0
  145. package/backend/dist/persistence/sqliteToPostgresMigration.js +1543 -0
  146. package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -0
  147. package/backend/dist/persistence/types.d.ts +131 -0
  148. package/backend/dist/persistence/types.d.ts.map +1 -0
  149. package/backend/dist/persistence/types.js +18 -0
  150. package/backend/dist/persistence/types.js.map +1 -0
  151. package/backend/dist/persistence/voiceProfileNameLookup.d.ts +9 -0
  152. package/backend/dist/persistence/voiceProfileNameLookup.d.ts.map +1 -0
  153. package/backend/dist/persistence/voiceProfileNameLookup.js +15 -0
  154. package/backend/dist/persistence/voiceProfileNameLookup.js.map +1 -0
  155. package/backend/dist/platform/coordination/index.d.ts +7 -0
  156. package/backend/dist/platform/coordination/index.d.ts.map +1 -0
  157. package/backend/dist/platform/coordination/index.js +24 -0
  158. package/backend/dist/platform/coordination/index.js.map +1 -0
  159. package/backend/dist/platform/coordination/localCoordinator.d.ts +49 -0
  160. package/backend/dist/platform/coordination/localCoordinator.d.ts.map +1 -0
  161. package/backend/dist/platform/coordination/localCoordinator.js +380 -0
  162. package/backend/dist/platform/coordination/localCoordinator.js.map +1 -0
  163. package/backend/dist/platform/coordination/redisCoordinator.d.ts +83 -0
  164. package/backend/dist/platform/coordination/redisCoordinator.d.ts.map +1 -0
  165. package/backend/dist/platform/coordination/redisCoordinator.js +726 -0
  166. package/backend/dist/platform/coordination/redisCoordinator.js.map +1 -0
  167. package/backend/dist/platform/coordination/service.d.ts +11 -0
  168. package/backend/dist/platform/coordination/service.d.ts.map +1 -0
  169. package/backend/dist/platform/coordination/service.js +55 -0
  170. package/backend/dist/platform/coordination/service.js.map +1 -0
  171. package/backend/dist/platform/coordination/sharedAdmission.d.ts +53 -0
  172. package/backend/dist/platform/coordination/sharedAdmission.d.ts.map +1 -0
  173. package/backend/dist/platform/coordination/sharedAdmission.js +194 -0
  174. package/backend/dist/platform/coordination/sharedAdmission.js.map +1 -0
  175. package/backend/dist/platform/coordination/types.d.ts +76 -0
  176. package/backend/dist/platform/coordination/types.d.ts.map +1 -0
  177. package/backend/dist/platform/coordination/types.js +32 -0
  178. package/backend/dist/platform/coordination/types.js.map +1 -0
  179. package/backend/dist/platform/events/durableEventGateway.d.ts +54 -0
  180. package/backend/dist/platform/events/durableEventGateway.d.ts.map +1 -0
  181. package/backend/dist/platform/events/durableEventGateway.js +262 -0
  182. package/backend/dist/platform/events/durableEventGateway.js.map +1 -0
  183. package/backend/dist/platform/events/index.d.ts +3 -0
  184. package/backend/dist/platform/events/index.d.ts.map +1 -0
  185. package/backend/dist/platform/events/index.js +8 -0
  186. package/backend/dist/platform/events/index.js.map +1 -0
  187. package/backend/dist/platform/events/service.d.ts +8 -0
  188. package/backend/dist/platform/events/service.d.ts.map +1 -0
  189. package/backend/dist/platform/events/service.js +25 -0
  190. package/backend/dist/platform/events/service.js.map +1 -0
  191. package/backend/dist/platform/jobs/chatGenerationEnqueuer.d.ts +3 -0
  192. package/backend/dist/platform/jobs/chatGenerationEnqueuer.d.ts.map +1 -0
  193. package/backend/dist/platform/jobs/chatGenerationEnqueuer.js +55 -0
  194. package/backend/dist/platform/jobs/chatGenerationEnqueuer.js.map +1 -0
  195. package/backend/dist/platform/jobs/documentIngestionEnqueuer.d.ts +3 -0
  196. package/backend/dist/platform/jobs/documentIngestionEnqueuer.d.ts.map +1 -0
  197. package/backend/dist/platform/jobs/documentIngestionEnqueuer.js +38 -0
  198. package/backend/dist/platform/jobs/documentIngestionEnqueuer.js.map +1 -0
  199. package/backend/dist/platform/jobs/domainJobContracts.d.ts +30 -0
  200. package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -0
  201. package/backend/dist/platform/jobs/domainJobContracts.js +53 -0
  202. package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -0
  203. package/backend/dist/platform/jobs/domainJobHandlers.d.ts +11 -0
  204. package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -0
  205. package/backend/dist/platform/jobs/domainJobHandlers.js +612 -0
  206. package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -0
  207. package/backend/dist/platform/jobs/durableEventIdentity.d.ts +8 -0
  208. package/backend/dist/platform/jobs/durableEventIdentity.d.ts.map +1 -0
  209. package/backend/dist/platform/jobs/durableEventIdentity.js +33 -0
  210. package/backend/dist/platform/jobs/durableEventIdentity.js.map +1 -0
  211. package/backend/dist/platform/jobs/durableJobRuntime.d.ts +57 -0
  212. package/backend/dist/platform/jobs/durableJobRuntime.d.ts.map +1 -0
  213. package/backend/dist/platform/jobs/durableJobRuntime.js +131 -0
  214. package/backend/dist/platform/jobs/durableJobRuntime.js.map +1 -0
  215. package/backend/dist/platform/jobs/durableJobRuntimeBackend.d.ts +28 -0
  216. package/backend/dist/platform/jobs/durableJobRuntimeBackend.d.ts.map +1 -0
  217. package/backend/dist/platform/jobs/durableJobRuntimeBackend.js +62 -0
  218. package/backend/dist/platform/jobs/durableJobRuntimeBackend.js.map +1 -0
  219. package/backend/dist/platform/jobs/durableJobService.d.ts +85 -0
  220. package/backend/dist/platform/jobs/durableJobService.d.ts.map +1 -0
  221. package/backend/dist/platform/jobs/durableJobService.js +726 -0
  222. package/backend/dist/platform/jobs/durableJobService.js.map +1 -0
  223. package/backend/dist/platform/jobs/durableJobTypes.d.ts +195 -0
  224. package/backend/dist/platform/jobs/durableJobTypes.d.ts.map +1 -0
  225. package/backend/dist/platform/jobs/durableJobTypes.js +72 -0
  226. package/backend/dist/platform/jobs/durableJobTypes.js.map +1 -0
  227. package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts +87 -0
  228. package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts.map +1 -0
  229. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js +429 -0
  230. package/backend/dist/platform/jobs/embeddedDurableJobWorker.js.map +1 -0
  231. package/backend/dist/platform/jobs/identityDeletionEnqueuer.d.ts +3 -0
  232. package/backend/dist/platform/jobs/identityDeletionEnqueuer.d.ts.map +1 -0
  233. package/backend/dist/platform/jobs/identityDeletionEnqueuer.js +36 -0
  234. package/backend/dist/platform/jobs/identityDeletionEnqueuer.js.map +1 -0
  235. package/backend/dist/platform/jobs/index.d.ts +18 -0
  236. package/backend/dist/platform/jobs/index.d.ts.map +1 -0
  237. package/backend/dist/platform/jobs/index.js +34 -0
  238. package/backend/dist/platform/jobs/index.js.map +1 -0
  239. package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.d.ts +4 -0
  240. package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.d.ts.map +1 -0
  241. package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.js +25 -0
  242. package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.js.map +1 -0
  243. package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.d.ts +4 -0
  244. package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.d.ts.map +1 -0
  245. package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.js +23 -0
  246. package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.js.map +1 -0
  247. package/backend/dist/platform/jobs/postgresDurableJobMigration.d.ts +11 -0
  248. package/backend/dist/platform/jobs/postgresDurableJobMigration.d.ts.map +1 -0
  249. package/backend/dist/platform/jobs/postgresDurableJobMigration.js +106 -0
  250. package/backend/dist/platform/jobs/postgresDurableJobMigration.js.map +1 -0
  251. package/backend/dist/platform/jobs/postgresDurableJobRepository.d.ts +88 -0
  252. package/backend/dist/platform/jobs/postgresDurableJobRepository.d.ts.map +1 -0
  253. package/backend/dist/platform/jobs/postgresDurableJobRepository.js +1185 -0
  254. package/backend/dist/platform/jobs/postgresDurableJobRepository.js.map +1 -0
  255. package/backend/dist/platform/jobs/postgresDurableJobService.d.ts +86 -0
  256. package/backend/dist/platform/jobs/postgresDurableJobService.d.ts.map +1 -0
  257. package/backend/dist/platform/jobs/postgresDurableJobService.js +696 -0
  258. package/backend/dist/platform/jobs/postgresDurableJobService.js.map +1 -0
  259. package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts +53 -0
  260. package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts.map +1 -0
  261. package/backend/dist/platform/jobs/postgresDurableJobWorker.js +393 -0
  262. package/backend/dist/platform/jobs/postgresDurableJobWorker.js.map +1 -0
  263. package/backend/dist/platform/jobs/resourceDeletionEnqueuer.d.ts +3 -0
  264. package/backend/dist/platform/jobs/resourceDeletionEnqueuer.d.ts.map +1 -0
  265. package/backend/dist/platform/jobs/resourceDeletionEnqueuer.js +43 -0
  266. package/backend/dist/platform/jobs/resourceDeletionEnqueuer.js.map +1 -0
  267. package/backend/dist/platform/jobs/sqliteDurableJobRepository.d.ts +166 -0
  268. package/backend/dist/platform/jobs/sqliteDurableJobRepository.d.ts.map +1 -0
  269. package/backend/dist/platform/jobs/sqliteDurableJobRepository.js +1008 -0
  270. package/backend/dist/platform/jobs/sqliteDurableJobRepository.js.map +1 -0
  271. package/backend/dist/platform/jobs/videoGenerationEnqueuer.d.ts +4 -0
  272. package/backend/dist/platform/jobs/videoGenerationEnqueuer.d.ts.map +1 -0
  273. package/backend/dist/platform/jobs/videoGenerationEnqueuer.js +46 -0
  274. package/backend/dist/platform/jobs/videoGenerationEnqueuer.js.map +1 -0
  275. package/backend/dist/platform/jobs/workExecutionEnqueuer.d.ts +3 -0
  276. package/backend/dist/platform/jobs/workExecutionEnqueuer.d.ts.map +1 -0
  277. package/backend/dist/platform/jobs/workExecutionEnqueuer.js +38 -0
  278. package/backend/dist/platform/jobs/workExecutionEnqueuer.js.map +1 -0
  279. package/backend/dist/platform/ollamaRuntimeConfig.d.ts +40 -0
  280. package/backend/dist/platform/ollamaRuntimeConfig.d.ts.map +1 -0
  281. package/backend/dist/platform/ollamaRuntimeConfig.js +72 -0
  282. package/backend/dist/platform/ollamaRuntimeConfig.js.map +1 -0
  283. package/backend/dist/platform/recovery/backupArchive.d.ts +120 -0
  284. package/backend/dist/platform/recovery/backupArchive.d.ts.map +1 -0
  285. package/backend/dist/platform/recovery/backupArchive.js +842 -0
  286. package/backend/dist/platform/recovery/backupArchive.js.map +1 -0
  287. package/backend/dist/platform/recovery/index.d.ts +3 -0
  288. package/backend/dist/platform/recovery/index.d.ts.map +1 -0
  289. package/backend/dist/platform/recovery/index.js +8 -0
  290. package/backend/dist/platform/recovery/index.js.map +1 -0
  291. package/backend/dist/platform/recovery/teamBackupArchive.d.ts +98 -0
  292. package/backend/dist/platform/recovery/teamBackupArchive.d.ts.map +1 -0
  293. package/backend/dist/platform/recovery/teamBackupArchive.js +1203 -0
  294. package/backend/dist/platform/recovery/teamBackupArchive.js.map +1 -0
  295. package/backend/dist/platform/runtimeConfig.d.ts +70 -0
  296. package/backend/dist/platform/runtimeConfig.d.ts.map +1 -0
  297. package/backend/dist/platform/runtimeConfig.js +205 -0
  298. package/backend/dist/platform/runtimeConfig.js.map +1 -0
  299. package/backend/dist/platform/storage/aesGcmKeyring.d.ts +26 -0
  300. package/backend/dist/platform/storage/aesGcmKeyring.d.ts.map +1 -0
  301. package/backend/dist/platform/storage/aesGcmKeyring.js +135 -0
  302. package/backend/dist/platform/storage/aesGcmKeyring.js.map +1 -0
  303. package/backend/dist/platform/storage/blobReferenceRepository.d.ts +36 -0
  304. package/backend/dist/platform/storage/blobReferenceRepository.d.ts.map +1 -0
  305. package/backend/dist/platform/storage/blobReferenceRepository.js +117 -0
  306. package/backend/dist/platform/storage/blobReferenceRepository.js.map +1 -0
  307. package/backend/dist/platform/storage/blobStore.d.ts +111 -0
  308. package/backend/dist/platform/storage/blobStore.d.ts.map +1 -0
  309. package/backend/dist/platform/storage/blobStore.js +46 -0
  310. package/backend/dist/platform/storage/blobStore.js.map +1 -0
  311. package/backend/dist/platform/storage/documentVectorIndex.d.ts +44 -0
  312. package/backend/dist/platform/storage/documentVectorIndex.d.ts.map +1 -0
  313. package/backend/dist/platform/storage/documentVectorIndex.js +110 -0
  314. package/backend/dist/platform/storage/documentVectorIndex.js.map +1 -0
  315. package/backend/dist/platform/storage/durableBlobQuotaPolicy.d.ts +82 -0
  316. package/backend/dist/platform/storage/durableBlobQuotaPolicy.d.ts.map +1 -0
  317. package/backend/dist/platform/storage/durableBlobQuotaPolicy.js +583 -0
  318. package/backend/dist/platform/storage/durableBlobQuotaPolicy.js.map +1 -0
  319. package/backend/dist/platform/storage/index.d.ts +19 -0
  320. package/backend/dist/platform/storage/index.d.ts.map +1 -0
  321. package/backend/dist/platform/storage/index.js +35 -0
  322. package/backend/dist/platform/storage/index.js.map +1 -0
  323. package/backend/dist/platform/storage/localEncryptedBlobStore.d.ts +120 -0
  324. package/backend/dist/platform/storage/localEncryptedBlobStore.d.ts.map +1 -0
  325. package/backend/dist/platform/storage/localEncryptedBlobStore.js +1205 -0
  326. package/backend/dist/platform/storage/localEncryptedBlobStore.js.map +1 -0
  327. package/backend/dist/platform/storage/personaMemoryIndexing.d.ts +12 -0
  328. package/backend/dist/platform/storage/personaMemoryIndexing.d.ts.map +1 -0
  329. package/backend/dist/platform/storage/personaMemoryIndexing.js +25 -0
  330. package/backend/dist/platform/storage/personaMemoryIndexing.js.map +1 -0
  331. package/backend/dist/platform/storage/pgVectorStore.d.ts +37 -0
  332. package/backend/dist/platform/storage/pgVectorStore.d.ts.map +1 -0
  333. package/backend/dist/platform/storage/pgVectorStore.js +493 -0
  334. package/backend/dist/platform/storage/pgVectorStore.js.map +1 -0
  335. package/backend/dist/platform/storage/platformDomainRepositories.d.ts +244 -0
  336. package/backend/dist/platform/storage/platformDomainRepositories.d.ts.map +1 -0
  337. package/backend/dist/platform/storage/platformDomainRepositories.js +7 -0
  338. package/backend/dist/platform/storage/platformDomainRepositories.js.map +1 -0
  339. package/backend/dist/platform/storage/platformStorageRuntime.d.ts +35 -0
  340. package/backend/dist/platform/storage/platformStorageRuntime.d.ts.map +1 -0
  341. package/backend/dist/platform/storage/platformStorageRuntime.js +299 -0
  342. package/backend/dist/platform/storage/platformStorageRuntime.js.map +1 -0
  343. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts +4 -0
  344. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts.map +1 -0
  345. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js +1017 -0
  346. package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js.map +1 -0
  347. package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.d.ts +4 -0
  348. package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.d.ts.map +1 -0
  349. package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.js +40 -0
  350. package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.js.map +1 -0
  351. package/backend/dist/platform/storage/resourceContentCleanup.d.ts +29 -0
  352. package/backend/dist/platform/storage/resourceContentCleanup.d.ts.map +1 -0
  353. package/backend/dist/platform/storage/resourceContentCleanup.js +100 -0
  354. package/backend/dist/platform/storage/resourceContentCleanup.js.map +1 -0
  355. package/backend/dist/platform/storage/resourceDeletionLifecycle.d.ts +14 -0
  356. package/backend/dist/platform/storage/resourceDeletionLifecycle.d.ts.map +1 -0
  357. package/backend/dist/platform/storage/resourceDeletionLifecycle.js +31 -0
  358. package/backend/dist/platform/storage/resourceDeletionLifecycle.js.map +1 -0
  359. package/backend/dist/platform/storage/s3EncryptedBlobStore.d.ts +140 -0
  360. package/backend/dist/platform/storage/s3EncryptedBlobStore.d.ts.map +1 -0
  361. package/backend/dist/platform/storage/s3EncryptedBlobStore.js +1309 -0
  362. package/backend/dist/platform/storage/s3EncryptedBlobStore.js.map +1 -0
  363. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts +71 -0
  364. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts.map +1 -0
  365. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js +766 -0
  366. package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js.map +1 -0
  367. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts +4 -0
  368. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts.map +1 -0
  369. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js +1037 -0
  370. package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js.map +1 -0
  371. package/backend/dist/platform/storage/sqliteToTeamStorageMigration.d.ts +25 -0
  372. package/backend/dist/platform/storage/sqliteToTeamStorageMigration.d.ts.map +1 -0
  373. package/backend/dist/platform/storage/sqliteToTeamStorageMigration.js +1292 -0
  374. package/backend/dist/platform/storage/sqliteToTeamStorageMigration.js.map +1 -0
  375. package/backend/dist/platform/storage/storageFactory.d.ts +81 -0
  376. package/backend/dist/platform/storage/storageFactory.d.ts.map +1 -0
  377. package/backend/dist/platform/storage/storageFactory.js +518 -0
  378. package/backend/dist/platform/storage/storageFactory.js.map +1 -0
  379. package/backend/dist/platform/storage/storageSchemaContracts.d.ts +22 -0
  380. package/backend/dist/platform/storage/storageSchemaContracts.d.ts.map +1 -0
  381. package/backend/dist/platform/storage/storageSchemaContracts.js +299 -0
  382. package/backend/dist/platform/storage/storageSchemaContracts.js.map +1 -0
  383. package/backend/dist/platform/storage/vectorStore.d.ts +117 -0
  384. package/backend/dist/platform/storage/vectorStore.d.ts.map +1 -0
  385. package/backend/dist/platform/storage/vectorStore.js +40 -0
  386. package/backend/dist/platform/storage/vectorStore.js.map +1 -0
  387. package/backend/dist/platform/workPersistence/index.d.ts +9 -0
  388. package/backend/dist/platform/workPersistence/index.d.ts.map +1 -0
  389. package/backend/dist/platform/workPersistence/index.js +14 -0
  390. package/backend/dist/platform/workPersistence/index.js.map +1 -0
  391. package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.d.ts +9 -0
  392. package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.d.ts.map +1 -0
  393. package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.js +47 -0
  394. package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.js.map +1 -0
  395. package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.d.ts +3 -0
  396. package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.d.ts.map +1 -0
  397. package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.js +28 -0
  398. package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.js.map +1 -0
  399. package/backend/dist/platform/workPersistence/postgresWorkMigration.d.ts +3 -0
  400. package/backend/dist/platform/workPersistence/postgresWorkMigration.d.ts.map +1 -0
  401. package/backend/dist/platform/workPersistence/postgresWorkMigration.js +101 -0
  402. package/backend/dist/platform/workPersistence/postgresWorkMigration.js.map +1 -0
  403. package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts +79 -0
  404. package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts.map +1 -0
  405. package/backend/dist/platform/workPersistence/postgresWorkPersistence.js +521 -0
  406. package/backend/dist/platform/workPersistence/postgresWorkPersistence.js.map +1 -0
  407. package/backend/dist/platform/workPersistence/service.d.ts +6 -0
  408. package/backend/dist/platform/workPersistence/service.d.ts.map +1 -0
  409. package/backend/dist/platform/workPersistence/service.js +27 -0
  410. package/backend/dist/platform/workPersistence/service.js.map +1 -0
  411. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts +77 -0
  412. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts.map +1 -0
  413. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js +463 -0
  414. package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js.map +1 -0
  415. package/backend/dist/platform/workPersistence/types.d.ts +159 -0
  416. package/backend/dist/platform/workPersistence/types.d.ts.map +1 -0
  417. package/backend/dist/platform/workPersistence/types.js +13 -0
  418. package/backend/dist/platform/workPersistence/types.js.map +1 -0
  419. package/backend/dist/platform/workPersistence/workExecutionTypes.d.ts +13 -0
  420. package/backend/dist/platform/workPersistence/workExecutionTypes.d.ts.map +1 -0
  421. package/backend/dist/platform/workPersistence/workExecutionTypes.js +7 -0
  422. package/backend/dist/platform/workPersistence/workExecutionTypes.js.map +1 -0
  423. package/backend/dist/platform/workPersistence/workMessageContentCodec.d.ts +8 -0
  424. package/backend/dist/platform/workPersistence/workMessageContentCodec.d.ts.map +1 -0
  425. package/backend/dist/platform/workPersistence/workMessageContentCodec.js +25 -0
  426. package/backend/dist/platform/workPersistence/workMessageContentCodec.js.map +1 -0
  427. package/backend/dist/platform/workPersistence/workTextSafety.d.ts +3 -0
  428. package/backend/dist/platform/workPersistence/workTextSafety.d.ts.map +1 -0
  429. package/backend/dist/platform/workPersistence/workTextSafety.js +8 -0
  430. package/backend/dist/platform/workPersistence/workTextSafety.js.map +1 -0
  431. package/backend/dist/routes/agentCli.js +1 -1
  432. package/backend/dist/routes/agentCli.js.map +1 -1
  433. package/backend/dist/routes/artifacts.d.ts.map +1 -1
  434. package/backend/dist/routes/artifacts.js +2 -1
  435. package/backend/dist/routes/artifacts.js.map +1 -1
  436. package/backend/dist/routes/auth.d.ts.map +1 -1
  437. package/backend/dist/routes/auth.js +64 -18
  438. package/backend/dist/routes/auth.js.map +1 -1
  439. package/backend/dist/routes/chat.d.ts.map +1 -1
  440. package/backend/dist/routes/chat.js +519 -85
  441. package/backend/dist/routes/chat.js.map +1 -1
  442. package/backend/dist/routes/documents.d.ts.map +1 -1
  443. package/backend/dist/routes/documents.js +136 -28
  444. package/backend/dist/routes/documents.js.map +1 -1
  445. package/backend/dist/routes/embeddings.d.ts.map +1 -1
  446. package/backend/dist/routes/embeddings.js +2 -1
  447. package/backend/dist/routes/embeddings.js.map +1 -1
  448. package/backend/dist/routes/health.d.ts +3 -0
  449. package/backend/dist/routes/health.d.ts.map +1 -0
  450. package/backend/dist/routes/health.js +52 -0
  451. package/backend/dist/routes/health.js.map +1 -0
  452. package/backend/dist/routes/huggingfaceHub.d.ts.map +1 -1
  453. package/backend/dist/routes/huggingfaceHub.js +2 -1
  454. package/backend/dist/routes/huggingfaceHub.js.map +1 -1
  455. package/backend/dist/routes/imageGen.d.ts.map +1 -1
  456. package/backend/dist/routes/imageGen.js +42 -10
  457. package/backend/dist/routes/imageGen.js.map +1 -1
  458. package/backend/dist/routes/jobs.d.ts +3 -0
  459. package/backend/dist/routes/jobs.d.ts.map +1 -0
  460. package/backend/dist/routes/jobs.js +117 -0
  461. package/backend/dist/routes/jobs.js.map +1 -0
  462. package/backend/dist/routes/libreClaw.d.ts.map +1 -1
  463. package/backend/dist/routes/libreClaw.js +10 -7
  464. package/backend/dist/routes/libreClaw.js.map +1 -1
  465. package/backend/dist/routes/media.d.ts.map +1 -1
  466. package/backend/dist/routes/media.js +523 -77
  467. package/backend/dist/routes/media.js.map +1 -1
  468. package/backend/dist/routes/notes.d.ts.map +1 -1
  469. package/backend/dist/routes/notes.js +21 -21
  470. package/backend/dist/routes/notes.js.map +1 -1
  471. package/backend/dist/routes/ollama.d.ts.map +1 -1
  472. package/backend/dist/routes/ollama.js +40 -12
  473. package/backend/dist/routes/ollama.js.map +1 -1
  474. package/backend/dist/routes/personas.d.ts.map +1 -1
  475. package/backend/dist/routes/personas.js +4 -2
  476. package/backend/dist/routes/personas.js.map +1 -1
  477. package/backend/dist/routes/plugins.d.ts.map +1 -1
  478. package/backend/dist/routes/plugins.js +79 -51
  479. package/backend/dist/routes/plugins.js.map +1 -1
  480. package/backend/dist/routes/preferences.d.ts.map +1 -1
  481. package/backend/dist/routes/preferences.js +290 -25
  482. package/backend/dist/routes/preferences.js.map +1 -1
  483. package/backend/dist/routes/search.d.ts.map +1 -1
  484. package/backend/dist/routes/search.js +23 -14
  485. package/backend/dist/routes/search.js.map +1 -1
  486. package/backend/dist/routes/stt.d.ts +9 -0
  487. package/backend/dist/routes/stt.d.ts.map +1 -0
  488. package/backend/dist/routes/stt.js +217 -0
  489. package/backend/dist/routes/stt.js.map +1 -0
  490. package/backend/dist/routes/systemDiagnostics.d.ts.map +1 -1
  491. package/backend/dist/routes/systemDiagnostics.js +2 -1
  492. package/backend/dist/routes/systemDiagnostics.js.map +1 -1
  493. package/backend/dist/routes/tts.d.ts.map +1 -1
  494. package/backend/dist/routes/tts.js +577 -28
  495. package/backend/dist/routes/tts.js.map +1 -1
  496. package/backend/dist/routes/users.d.ts.map +1 -1
  497. package/backend/dist/routes/users.js +16 -25
  498. package/backend/dist/routes/users.js.map +1 -1
  499. package/backend/dist/routes/work.d.ts.map +1 -1
  500. package/backend/dist/routes/work.js +167 -113
  501. package/backend/dist/routes/work.js.map +1 -1
  502. package/backend/dist/services/agentAccessService.d.ts +2 -2
  503. package/backend/dist/services/agentAccessService.d.ts.map +1 -1
  504. package/backend/dist/services/agentAccessService.js +5 -14
  505. package/backend/dist/services/agentAccessService.js.map +1 -1
  506. package/backend/dist/services/agentCliService.d.ts +3 -2
  507. package/backend/dist/services/agentCliService.d.ts.map +1 -1
  508. package/backend/dist/services/agentCliService.js +44 -16
  509. package/backend/dist/services/agentCliService.js.map +1 -1
  510. package/backend/dist/services/assistantCompletionService.d.ts +2 -1
  511. package/backend/dist/services/assistantCompletionService.d.ts.map +1 -1
  512. package/backend/dist/services/assistantCompletionService.js +7 -3
  513. package/backend/dist/services/assistantCompletionService.js.map +1 -1
  514. package/backend/dist/services/authService.d.ts +7 -2
  515. package/backend/dist/services/authService.d.ts.map +1 -1
  516. package/backend/dist/services/authService.js +23 -10
  517. package/backend/dist/services/authService.js.map +1 -1
  518. package/backend/dist/services/chatGenerationService.d.ts +5 -4
  519. package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
  520. package/backend/dist/services/chatGenerationService.js +23 -17
  521. package/backend/dist/services/chatGenerationService.js.map +1 -1
  522. package/backend/dist/services/chatRequestService.d.ts +4 -3
  523. package/backend/dist/services/chatRequestService.d.ts.map +1 -1
  524. package/backend/dist/services/chatRequestService.js +3 -3
  525. package/backend/dist/services/chatRequestService.js.map +1 -1
  526. package/backend/dist/services/chatService.d.ts +66 -16
  527. package/backend/dist/services/chatService.d.ts.map +1 -1
  528. package/backend/dist/services/chatService.js +402 -111
  529. package/backend/dist/services/chatService.js.map +1 -1
  530. package/backend/dist/services/codexOAuthService.d.ts +2 -2
  531. package/backend/dist/services/codexOAuthService.d.ts.map +1 -1
  532. package/backend/dist/services/codexOAuthService.js +63 -7
  533. package/backend/dist/services/codexOAuthService.js.map +1 -1
  534. package/backend/dist/services/dataArchiveService.d.ts +88 -0
  535. package/backend/dist/services/dataArchiveService.d.ts.map +1 -0
  536. package/backend/dist/services/dataArchiveService.js +1027 -0
  537. package/backend/dist/services/dataArchiveService.js.map +1 -0
  538. package/backend/dist/services/documentService.d.ts +67 -14
  539. package/backend/dist/services/documentService.d.ts.map +1 -1
  540. package/backend/dist/services/documentService.js +938 -193
  541. package/backend/dist/services/documentService.js.map +1 -1
  542. package/backend/dist/services/durableChatCompletion.d.ts +16 -0
  543. package/backend/dist/services/durableChatCompletion.d.ts.map +1 -0
  544. package/backend/dist/services/durableChatCompletion.js +34 -0
  545. package/backend/dist/services/durableChatCompletion.js.map +1 -0
  546. package/backend/dist/services/durableChatGenerationService.d.ts +19 -0
  547. package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -0
  548. package/backend/dist/services/durableChatGenerationService.js +341 -0
  549. package/backend/dist/services/durableChatGenerationService.js.map +1 -0
  550. package/backend/dist/services/embeddingService.d.ts +1 -1
  551. package/backend/dist/services/embeddingService.d.ts.map +1 -1
  552. package/backend/dist/services/embeddingService.js +16 -13
  553. package/backend/dist/services/embeddingService.js.map +1 -1
  554. package/backend/dist/services/encryptionService.d.ts +28 -1
  555. package/backend/dist/services/encryptionService.d.ts.map +1 -1
  556. package/backend/dist/services/encryptionService.js +131 -51
  557. package/backend/dist/services/encryptionService.js.map +1 -1
  558. package/backend/dist/services/followUpService.d.ts +1 -1
  559. package/backend/dist/services/followUpService.d.ts.map +1 -1
  560. package/backend/dist/services/followUpService.js +1 -1
  561. package/backend/dist/services/followUpService.js.map +1 -1
  562. package/backend/dist/services/galleryService.d.ts +38 -37
  563. package/backend/dist/services/galleryService.d.ts.map +1 -1
  564. package/backend/dist/services/galleryService.js +356 -251
  565. package/backend/dist/services/galleryService.js.map +1 -1
  566. package/backend/dist/services/healthService.d.ts +65 -0
  567. package/backend/dist/services/healthService.d.ts.map +1 -0
  568. package/backend/dist/services/healthService.js +379 -0
  569. package/backend/dist/services/healthService.js.map +1 -0
  570. package/backend/dist/services/legacyCiphertextIntegrity.d.ts +40 -0
  571. package/backend/dist/services/legacyCiphertextIntegrity.d.ts.map +1 -0
  572. package/backend/dist/services/legacyCiphertextIntegrity.js +406 -0
  573. package/backend/dist/services/legacyCiphertextIntegrity.js.map +1 -0
  574. package/backend/dist/services/mediaGenerationJobService.d.ts +27 -5
  575. package/backend/dist/services/mediaGenerationJobService.d.ts.map +1 -1
  576. package/backend/dist/services/mediaGenerationJobService.js +185 -55
  577. package/backend/dist/services/mediaGenerationJobService.js.map +1 -1
  578. package/backend/dist/services/memoryService.d.ts +7 -83
  579. package/backend/dist/services/memoryService.d.ts.map +1 -1
  580. package/backend/dist/services/memoryService.js +428 -573
  581. package/backend/dist/services/memoryService.js.map +1 -1
  582. package/backend/dist/services/memoryUtils.d.ts.map +1 -1
  583. package/backend/dist/services/memoryUtils.js +8 -1
  584. package/backend/dist/services/memoryUtils.js.map +1 -1
  585. package/backend/dist/services/modelAccessService.d.ts +3 -3
  586. package/backend/dist/services/modelAccessService.d.ts.map +1 -1
  587. package/backend/dist/services/modelAccessService.js +8 -16
  588. package/backend/dist/services/modelAccessService.js.map +1 -1
  589. package/backend/dist/services/mutationEngineService.d.ts +0 -7
  590. package/backend/dist/services/mutationEngineService.d.ts.map +1 -1
  591. package/backend/dist/services/mutationEngineService.js +7 -78
  592. package/backend/dist/services/mutationEngineService.js.map +1 -1
  593. package/backend/dist/services/ollamaService.d.ts +4 -4
  594. package/backend/dist/services/ollamaService.d.ts.map +1 -1
  595. package/backend/dist/services/ollamaService.js +97 -34
  596. package/backend/dist/services/ollamaService.js.map +1 -1
  597. package/backend/dist/services/personaService.d.ts.map +1 -1
  598. package/backend/dist/services/personaService.js +19 -54
  599. package/backend/dist/services/personaService.js.map +1 -1
  600. package/backend/dist/services/pluginActivationService.d.ts +6 -5
  601. package/backend/dist/services/pluginActivationService.d.ts.map +1 -1
  602. package/backend/dist/services/pluginActivationService.js +36 -76
  603. package/backend/dist/services/pluginActivationService.js.map +1 -1
  604. package/backend/dist/services/pluginAudioGenerationService.d.ts +11 -6
  605. package/backend/dist/services/pluginAudioGenerationService.d.ts.map +1 -1
  606. package/backend/dist/services/pluginAudioGenerationService.js +74 -16
  607. package/backend/dist/services/pluginAudioGenerationService.js.map +1 -1
  608. package/backend/dist/services/pluginCacheInvalidation.d.ts +38 -0
  609. package/backend/dist/services/pluginCacheInvalidation.d.ts.map +1 -0
  610. package/backend/dist/services/pluginCacheInvalidation.js +198 -0
  611. package/backend/dist/services/pluginCacheInvalidation.js.map +1 -0
  612. package/backend/dist/services/pluginCapabilityRegistryService.d.ts +3 -3
  613. package/backend/dist/services/pluginCapabilityRegistryService.d.ts.map +1 -1
  614. package/backend/dist/services/pluginCapabilityRegistryService.js +11 -7
  615. package/backend/dist/services/pluginCapabilityRegistryService.js.map +1 -1
  616. package/backend/dist/services/pluginCredentialsService.d.ts +9 -8
  617. package/backend/dist/services/pluginCredentialsService.d.ts.map +1 -1
  618. package/backend/dist/services/pluginCredentialsService.js +48 -89
  619. package/backend/dist/services/pluginCredentialsService.js.map +1 -1
  620. package/backend/dist/services/pluginEmbeddingService.d.ts +8 -7
  621. package/backend/dist/services/pluginEmbeddingService.d.ts.map +1 -1
  622. package/backend/dist/services/pluginEmbeddingService.js +13 -11
  623. package/backend/dist/services/pluginEmbeddingService.js.map +1 -1
  624. package/backend/dist/services/pluginImageGenerationService.d.ts +10 -8
  625. package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
  626. package/backend/dist/services/pluginImageGenerationService.js +119 -14
  627. package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
  628. package/backend/dist/services/pluginSTTService.d.ts +47 -0
  629. package/backend/dist/services/pluginSTTService.d.ts.map +1 -0
  630. package/backend/dist/services/pluginSTTService.js +199 -0
  631. package/backend/dist/services/pluginSTTService.js.map +1 -0
  632. package/backend/dist/services/pluginService.d.ts +94 -40
  633. package/backend/dist/services/pluginService.d.ts.map +1 -1
  634. package/backend/dist/services/pluginService.js +799 -274
  635. package/backend/dist/services/pluginService.js.map +1 -1
  636. package/backend/dist/services/pluginTTSService.d.ts +26 -8
  637. package/backend/dist/services/pluginTTSService.d.ts.map +1 -1
  638. package/backend/dist/services/pluginTTSService.js +277 -25
  639. package/backend/dist/services/pluginTTSService.js.map +1 -1
  640. package/backend/dist/services/pluginUsageService.d.ts +4 -4
  641. package/backend/dist/services/pluginUsageService.d.ts.map +1 -1
  642. package/backend/dist/services/pluginUsageService.js +44 -93
  643. package/backend/dist/services/pluginUsageService.js.map +1 -1
  644. package/backend/dist/services/pluginVariablesService.d.ts +14 -7
  645. package/backend/dist/services/pluginVariablesService.d.ts.map +1 -1
  646. package/backend/dist/services/pluginVariablesService.js +116 -81
  647. package/backend/dist/services/pluginVariablesService.js.map +1 -1
  648. package/backend/dist/services/pluginVideoGenerationService.d.ts +19 -8
  649. package/backend/dist/services/pluginVideoGenerationService.d.ts.map +1 -1
  650. package/backend/dist/services/pluginVideoGenerationService.js +116 -20
  651. package/backend/dist/services/pluginVideoGenerationService.js.map +1 -1
  652. package/backend/dist/services/preferencesService.d.ts +31 -21
  653. package/backend/dist/services/preferencesService.d.ts.map +1 -1
  654. package/backend/dist/services/preferencesService.js +104 -102
  655. package/backend/dist/services/preferencesService.js.map +1 -1
  656. package/backend/dist/services/recoveryInventoryService.d.ts +244 -0
  657. package/backend/dist/services/recoveryInventoryService.d.ts.map +1 -0
  658. package/backend/dist/services/recoveryInventoryService.js +1436 -0
  659. package/backend/dist/services/recoveryInventoryService.js.map +1 -0
  660. package/backend/dist/services/simpleGitHubOAuth.js +3 -3
  661. package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
  662. package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -1
  663. package/backend/dist/services/simpleHuggingFaceOAuth.js +3 -3
  664. package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -1
  665. package/backend/dist/services/systemDiagnosticsService.d.ts.map +1 -1
  666. package/backend/dist/services/systemDiagnosticsService.js +2 -2
  667. package/backend/dist/services/systemDiagnosticsService.js.map +1 -1
  668. package/backend/dist/services/systemSettingsService.d.ts +5 -0
  669. package/backend/dist/services/systemSettingsService.d.ts.map +1 -0
  670. package/backend/dist/services/systemSettingsService.js +24 -0
  671. package/backend/dist/services/systemSettingsService.js.map +1 -0
  672. package/backend/dist/services/titleGenerationService.d.ts +1 -1
  673. package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
  674. package/backend/dist/services/titleGenerationService.js +15 -4
  675. package/backend/dist/services/titleGenerationService.js.map +1 -1
  676. package/backend/dist/services/voiceProfileService.d.ts +44 -0
  677. package/backend/dist/services/voiceProfileService.d.ts.map +1 -0
  678. package/backend/dist/services/voiceProfileService.js +195 -0
  679. package/backend/dist/services/voiceProfileService.js.map +1 -0
  680. package/backend/dist/services/webSearchService.d.ts +7 -7
  681. package/backend/dist/services/webSearchService.d.ts.map +1 -1
  682. package/backend/dist/services/webSearchService.js +40 -35
  683. package/backend/dist/services/webSearchService.js.map +1 -1
  684. package/backend/dist/services/websocketTicketService.d.ts +39 -0
  685. package/backend/dist/services/websocketTicketService.d.ts.map +1 -0
  686. package/backend/dist/services/websocketTicketService.js +183 -0
  687. package/backend/dist/services/websocketTicketService.js.map +1 -0
  688. package/backend/dist/services/workAccessService.d.ts +3 -3
  689. package/backend/dist/services/workAccessService.d.ts.map +1 -1
  690. package/backend/dist/services/workAccessService.js +8 -16
  691. package/backend/dist/services/workAccessService.js.map +1 -1
  692. package/backend/dist/services/workAdminService.d.ts +3 -3
  693. package/backend/dist/services/workAdminService.d.ts.map +1 -1
  694. package/backend/dist/services/workAdminService.js +4 -4
  695. package/backend/dist/services/workAdminService.js.map +1 -1
  696. package/backend/dist/services/workAgentService.d.ts +25 -1
  697. package/backend/dist/services/workAgentService.d.ts.map +1 -1
  698. package/backend/dist/services/workAgentService.js +294 -126
  699. package/backend/dist/services/workAgentService.js.map +1 -1
  700. package/backend/dist/services/workEventService.d.ts +15 -2
  701. package/backend/dist/services/workEventService.d.ts.map +1 -1
  702. package/backend/dist/services/workEventService.js +201 -3
  703. package/backend/dist/services/workEventService.js.map +1 -1
  704. package/backend/dist/services/workKubernetesDriver.d.ts +8 -7
  705. package/backend/dist/services/workKubernetesDriver.d.ts.map +1 -1
  706. package/backend/dist/services/workKubernetesDriver.js +65 -21
  707. package/backend/dist/services/workKubernetesDriver.js.map +1 -1
  708. package/backend/dist/services/workModelProviderService.d.ts +2 -2
  709. package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
  710. package/backend/dist/services/workModelProviderService.js +38 -34
  711. package/backend/dist/services/workModelProviderService.js.map +1 -1
  712. package/backend/dist/services/workPolicyService.d.ts +7 -7
  713. package/backend/dist/services/workPolicyService.d.ts.map +1 -1
  714. package/backend/dist/services/workPolicyService.js +50 -51
  715. package/backend/dist/services/workPolicyService.js.map +1 -1
  716. package/backend/dist/services/workPreviewProxyService.d.ts +8 -8
  717. package/backend/dist/services/workPreviewProxyService.d.ts.map +1 -1
  718. package/backend/dist/services/workPreviewProxyService.js +47 -44
  719. package/backend/dist/services/workPreviewProxyService.js.map +1 -1
  720. package/backend/dist/services/workRuntimeDriver.d.ts +21 -18
  721. package/backend/dist/services/workRuntimeDriver.d.ts.map +1 -1
  722. package/backend/dist/services/workRuntimeDriver.js +69 -20
  723. package/backend/dist/services/workRuntimeDriver.js.map +1 -1
  724. package/backend/dist/services/workRuntimeService.d.ts +18 -13
  725. package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
  726. package/backend/dist/services/workRuntimeService.js +438 -194
  727. package/backend/dist/services/workRuntimeService.js.map +1 -1
  728. package/backend/dist/services/workRuntimeShared.d.ts +2 -0
  729. package/backend/dist/services/workRuntimeShared.d.ts.map +1 -1
  730. package/backend/dist/services/workRuntimeShared.js.map +1 -1
  731. package/backend/dist/services/workTaskService.d.ts +42 -36
  732. package/backend/dist/services/workTaskService.d.ts.map +1 -1
  733. package/backend/dist/services/workTaskService.js +445 -350
  734. package/backend/dist/services/workTaskService.js.map +1 -1
  735. package/backend/dist/services/workTerminalService.d.ts +1 -1
  736. package/backend/dist/services/workTerminalService.d.ts.map +1 -1
  737. package/backend/dist/services/workTerminalService.js +33 -6
  738. package/backend/dist/services/workTerminalService.js.map +1 -1
  739. package/backend/dist/storage.d.ts +72 -40
  740. package/backend/dist/storage.d.ts.map +1 -1
  741. package/backend/dist/storage.js +312 -660
  742. package/backend/dist/storage.js.map +1 -1
  743. package/backend/dist/types/index.d.ts +28 -0
  744. package/backend/dist/types/index.d.ts.map +1 -1
  745. package/backend/dist/types/index.js.map +1 -1
  746. package/backend/dist/types/work.d.ts +7 -2
  747. package/backend/dist/types/work.d.ts.map +1 -1
  748. package/backend/dist/utils/chatCancellation.d.ts +48 -0
  749. package/backend/dist/utils/chatCancellation.d.ts.map +1 -0
  750. package/backend/dist/utils/chatCancellation.js +152 -0
  751. package/backend/dist/utils/chatCancellation.js.map +1 -0
  752. package/backend/dist/utils/chatDocumentContext.d.ts +1 -1
  753. package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
  754. package/backend/dist/utils/chatDocumentContext.js +11 -5
  755. package/backend/dist/utils/chatDocumentContext.js.map +1 -1
  756. package/backend/dist/utils/chatStreamCoalescer.d.ts +15 -0
  757. package/backend/dist/utils/chatStreamCoalescer.d.ts.map +1 -0
  758. package/backend/dist/utils/chatStreamCoalescer.js +59 -0
  759. package/backend/dist/utils/chatStreamCoalescer.js.map +1 -0
  760. package/backend/dist/utils/dataDirectory.d.ts +49 -0
  761. package/backend/dist/utils/dataDirectory.d.ts.map +1 -0
  762. package/backend/dist/utils/dataDirectory.js +291 -0
  763. package/backend/dist/utils/dataDirectory.js.map +1 -0
  764. package/backend/dist/utils/generationUtils.d.ts.map +1 -1
  765. package/backend/dist/utils/generationUtils.js +18 -6
  766. package/backend/dist/utils/generationUtils.js.map +1 -1
  767. package/backend/dist/utils/jwt.d.ts.map +1 -1
  768. package/backend/dist/utils/jwt.js +2 -3
  769. package/backend/dist/utils/jwt.js.map +1 -1
  770. package/backend/dist/utils/ollamaModelDefaults.d.ts.map +1 -1
  771. package/backend/dist/utils/ollamaModelDefaults.js +2 -7
  772. package/backend/dist/utils/ollamaModelDefaults.js.map +1 -1
  773. package/backend/dist/utils/ollamaStreaming.d.ts +2 -1
  774. package/backend/dist/utils/ollamaStreaming.d.ts.map +1 -1
  775. package/backend/dist/utils/ollamaStreaming.js +49 -11
  776. package/backend/dist/utils/ollamaStreaming.js.map +1 -1
  777. package/backend/dist/utils/pluginConnectionVariables.d.ts.map +1 -1
  778. package/backend/dist/utils/pluginConnectionVariables.js +11 -3
  779. package/backend/dist/utils/pluginConnectionVariables.js.map +1 -1
  780. package/backend/dist/utils/pluginDefinitionTrust.d.ts.map +1 -1
  781. package/backend/dist/utils/pluginDefinitionTrust.js +4 -3
  782. package/backend/dist/utils/pluginDefinitionTrust.js.map +1 -1
  783. package/backend/dist/utils/pluginStreaming.d.ts +2 -1
  784. package/backend/dist/utils/pluginStreaming.d.ts.map +1 -1
  785. package/backend/dist/utils/pluginStreaming.js +5 -1
  786. package/backend/dist/utils/pluginStreaming.js.map +1 -1
  787. package/backend/dist/utils/pluginUpload.d.ts +1 -0
  788. package/backend/dist/utils/pluginUpload.d.ts.map +1 -1
  789. package/backend/dist/utils/pluginUpload.js +9 -2
  790. package/backend/dist/utils/pluginUpload.js.map +1 -1
  791. package/backend/dist/utils/pluginValidation.d.ts.map +1 -1
  792. package/backend/dist/utils/pluginValidation.js +29 -1
  793. package/backend/dist/utils/pluginValidation.js.map +1 -1
  794. package/backend/dist/utils/sttAudioUpload.d.ts +24 -0
  795. package/backend/dist/utils/sttAudioUpload.d.ts.map +1 -0
  796. package/backend/dist/utils/sttAudioUpload.js +500 -0
  797. package/backend/dist/utils/sttAudioUpload.js.map +1 -0
  798. package/backend/dist/utils/ttsVoiceCloneUpload.d.ts +34 -0
  799. package/backend/dist/utils/ttsVoiceCloneUpload.d.ts.map +1 -0
  800. package/backend/dist/utils/ttsVoiceCloneUpload.js +224 -0
  801. package/backend/dist/utils/ttsVoiceCloneUpload.js.map +1 -0
  802. package/backend/dist/utils/websocketMessages.d.ts +2 -1
  803. package/backend/dist/utils/websocketMessages.d.ts.map +1 -1
  804. package/backend/dist/utils/websocketMessages.js +16 -2
  805. package/backend/dist/utils/websocketMessages.js.map +1 -1
  806. package/backend/dist/websocketServer.d.ts +4 -1
  807. package/backend/dist/websocketServer.d.ts.map +1 -1
  808. package/backend/dist/websocketServer.js +290 -44
  809. package/backend/dist/websocketServer.js.map +1 -1
  810. package/backend/dist/workTerminalServer.d.ts +9 -0
  811. package/backend/dist/workTerminalServer.d.ts.map +1 -1
  812. package/backend/dist/workTerminalServer.js +221 -52
  813. package/backend/dist/workTerminalServer.js.map +1 -1
  814. package/backend/dist/worker.d.ts +2 -0
  815. package/backend/dist/worker.d.ts.map +1 -0
  816. package/backend/dist/worker.js +250 -0
  817. package/backend/dist/worker.js.map +1 -0
  818. package/backend/package.json +19 -9
  819. package/bin/cli.js +126 -99
  820. package/bin/runtime-paths.js +108 -0
  821. package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
  822. package/frontend/dist/artifact-runtime/framer-motion.js +5 -5
  823. package/frontend/dist/artifact-runtime/lucide-react.js +1 -1
  824. package/frontend/dist/assets/index-CUhEG7E2.js +33 -0
  825. package/frontend/dist/assets/index-kxtZQLV6.css +1 -0
  826. package/frontend/dist/assets/{markdown-math-ClQbWekD.css → markdown-math-ClTedVi7.css} +1 -1
  827. package/frontend/dist/index.html +36 -18
  828. package/frontend/dist/js/{ArtifactContainer-C_UdeK4k.js → ArtifactContainer-BTEDhBnv.js} +1 -1
  829. package/frontend/dist/js/{ArtifactDemoPage-D3AuvuR5.js → ArtifactDemoPage-B0gN3YTl.js} +1 -1
  830. package/frontend/dist/js/{ArtifactSandboxFrame-BiXl9iGD.js → ArtifactSandboxFrame-CLBXQkZs.js} +3 -3
  831. package/frontend/dist/js/{ArtifactSlideOutPanel-CvgS3sfQ.js → ArtifactSlideOutPanel-CfqHPFdE.js} +1 -1
  832. package/frontend/dist/js/{Button-DcBM7gdH.js → Button-BV44cTnj.js} +1 -1
  833. package/frontend/dist/js/ChatPage-DIkAXZWA.js +23 -0
  834. package/frontend/dist/js/{FirstTimeSetup-B9742i3H.js → FirstTimeSetup-B8phXGNA.js} +1 -1
  835. package/frontend/dist/js/GalleryPage-W4uI043I.js +1 -0
  836. package/frontend/dist/js/HomePage-DlxehbyO.js +1 -0
  837. package/frontend/dist/js/{LibreClawPage-Ds6pqEyk.js → LibreClawPage-CgD0_G_F.js} +1 -1
  838. package/frontend/dist/js/{ModelManagerModals-BBNg2fxs.js → ModelManagerModals-D7jIT3v1.js} +1 -1
  839. package/frontend/dist/js/{ModelSelector-CJfJYwxh.js → ModelSelector-BYxJU1UV.js} +1 -1
  840. package/frontend/dist/js/ModelsPage-C4XdCKP5.js +2 -0
  841. package/frontend/dist/js/NotesPage-CDECOl4V.js +1 -0
  842. package/frontend/dist/js/{OptimizedSyntaxHighlighter-CWYUn9Oe.js → OptimizedSyntaxHighlighter-XwqZEoTf.js} +1 -1
  843. package/frontend/dist/js/{PersonasPage-CbQVv9OM.js → PersonasPage-CjSLPrgS.js} +2 -2
  844. package/frontend/dist/js/PluginUsagePage-DJOXJuH4.js +1 -0
  845. package/frontend/dist/js/RichMessageContent-Debeh6bi.js +3 -0
  846. package/frontend/dist/js/SettingsModal-cUqAeYUP.js +1 -0
  847. package/frontend/dist/js/{SettingsToggle-Uz2jvV64.js → SettingsToggle-WTa0rgvY.js} +1 -1
  848. package/frontend/dist/js/{SystemPage-CIBDZTWB.js → SystemPage-DxPw0GS7.js} +1 -1
  849. package/frontend/dist/js/UserManagementPage-CEdYFe_Z.js +1 -0
  850. package/frontend/dist/js/WorkPage-DDVeuG_9.js +6 -0
  851. package/frontend/dist/js/api-IzobHGND.js +14 -0
  852. package/frontend/dist/js/appStore-DKwC2vgn.js +2 -0
  853. package/frontend/dist/js/ar-xTSvTq05.js +2 -0
  854. package/frontend/dist/js/authStore-OaTuapL7.js +4 -0
  855. package/frontend/dist/js/{babel-CmENXdZw.js → babel-D24oDI9y.js} +1 -1
  856. package/frontend/dist/js/bn-iYAsohEA.js +2 -0
  857. package/frontend/dist/js/chatStore-DXGUVLXD.js +3 -0
  858. package/frontend/dist/js/{config-CV8L89A5.js → config-DPEEuTAe.js} +1 -1
  859. package/frontend/dist/js/cs-YBHN88Hb.js +2 -0
  860. package/frontend/dist/js/da-D7qlLy_k.js +2 -0
  861. package/frontend/dist/js/de-DV671k2c.js +2 -0
  862. package/frontend/dist/js/es-kyBgzNq-.js +2 -0
  863. package/frontend/dist/js/{estree-Lx6fK8Ug.js → estree-ChwJsD2w.js} +1 -1
  864. package/frontend/dist/js/fr-Cw1vut7I.js +2 -0
  865. package/frontend/dist/js/hi-DWEFC024.js +2 -0
  866. package/frontend/dist/js/{html-Dx5reqmV.js → html-DFrVjciF.js} +1 -1
  867. package/frontend/dist/js/id-DlMHjjy0.js +2 -0
  868. package/frontend/dist/js/is-B9E_a7dG.js +2 -0
  869. package/frontend/dist/js/it-DawmVbLC.js +2 -0
  870. package/frontend/dist/js/ja-DmVvwY3W.js +2 -0
  871. package/frontend/dist/js/ko-DzOPpkVs.js +2 -0
  872. package/frontend/dist/js/{markdown-Bd5G8zQB.js → markdown-FLLx7b67.js} +1 -1
  873. package/frontend/dist/js/markdown-core-BmPPZiuD.js +31 -0
  874. package/frontend/dist/js/{markdown-math-B7FlYsmr.js → markdown-math-mH7AZ_mb.js} +6 -6
  875. package/frontend/dist/js/{messageCodeStyles-CUWSpffv.js → messageCodeStyles-CBkkZY4n.js} +1 -1
  876. package/frontend/dist/js/ms-DpsaOPht.js +2 -0
  877. package/frontend/dist/js/nl-B1d8W22n.js +2 -0
  878. package/frontend/dist/js/pl-nCncRVgt.js +2 -0
  879. package/frontend/dist/js/{postcss-B5WIGhAY.js → postcss-Bx9CTcIc.js} +1 -1
  880. package/frontend/dist/js/pt-DHw8fGuu.js +2 -0
  881. package/frontend/dist/js/{react-vendor-DPNXrO-8.js → react-vendor-C5yShNlM.js} +1 -1
  882. package/frontend/dist/js/{router-vendor-Ca9zqOqT.js → router-vendor-CbPDks39.js} +1 -1
  883. package/frontend/dist/js/ru-Derl_YP_.js +2 -0
  884. package/frontend/dist/js/{standalone-DLNXiOUi.js → standalone-i8-5bg5p.js} +1 -1
  885. package/frontend/dist/js/sv-pJAfBVo0.js +2 -0
  886. package/frontend/dist/js/{syntax-highlight-Ca9bHsaz.js → syntax-highlight-3EEX6CGL.js} +3 -3
  887. package/frontend/dist/js/th-C_7fIGnk.js +2 -0
  888. package/frontend/dist/js/tr-CPqsJvaP.js +2 -0
  889. package/frontend/dist/js/{typescript-YKxslwSt.js → typescript-CQ3x-Uni.js} +1 -1
  890. package/frontend/dist/js/{ui-Dw6jDKxN.js → ui-BHhR3Vok.js} +2 -2
  891. package/frontend/dist/js/ui-vendor-D3Ahl1x5.js +177 -0
  892. package/frontend/dist/js/uk-3o8P_kFi.js +2 -0
  893. package/frontend/dist/js/{useTranslation-t1quV8ce.js → useTranslation-C3ei3mJq.js} +1 -1
  894. package/frontend/dist/js/{utils-iKndEgla.js → utils-CuC1beTY.js} +1 -1
  895. package/frontend/dist/js/{utils-vendor-1zob7nK9.js → utils-vendor-BBa8OxtB.js} +1 -1
  896. package/frontend/dist/js/vi-Dv6N7OVD.js +2 -0
  897. package/frontend/dist/js/{workApi-LrQmhNxb.js → workApi-Czu69yWS.js} +2 -2
  898. package/frontend/dist/js/{yaml-QD4znPfZ.js → yaml-DioTxVLA.js} +1 -1
  899. package/frontend/dist/js/zh-qg5iqtPi.js +2 -0
  900. package/package.json +16 -5
  901. package/plugins/huggingface.json +12 -3
  902. package/plugins/llama-cpp.json +18 -6
  903. package/plugins/longcat-audiodit.json +114 -0
  904. package/plugins/openai.json +18 -0
  905. package/frontend/dist/assets/index-CN7wpzUO.js +0 -26
  906. package/frontend/dist/assets/index-Dqkx5o2y.css +0 -1
  907. package/frontend/dist/js/ChatPage-DBEi-FSO.js +0 -16
  908. package/frontend/dist/js/GalleryPage-BL0x_xl7.js +0 -1
  909. package/frontend/dist/js/HomePage-Ukn2Y-BG.js +0 -1
  910. package/frontend/dist/js/ModelsPage-CDPJM-LA.js +0 -2
  911. package/frontend/dist/js/NotesPage-DJ-_MSI1.js +0 -1
  912. package/frontend/dist/js/PluginUsagePage-D69rQvFl.js +0 -1
  913. package/frontend/dist/js/RichMessageContent-DfuCu6PB.js +0 -3
  914. package/frontend/dist/js/SettingsModal-D87lWSx4.js +0 -1
  915. package/frontend/dist/js/UserManagementPage-DzMnFKDG.js +0 -1
  916. package/frontend/dist/js/WorkPage-D84JNdjS.js +0 -6
  917. package/frontend/dist/js/api-DhmVEJr2.js +0 -14
  918. package/frontend/dist/js/appStore-BsqeY2tS.js +0 -2
  919. package/frontend/dist/js/ar-BgCHB9_9.js +0 -2
  920. package/frontend/dist/js/authStore-DanfaPdm.js +0 -4
  921. package/frontend/dist/js/bn-Cr8_opuR.js +0 -2
  922. package/frontend/dist/js/chatStore-C25ywAXQ.js +0 -3
  923. package/frontend/dist/js/cs-Bb9gXpfH.js +0 -2
  924. package/frontend/dist/js/da-JfdGHjAw.js +0 -2
  925. package/frontend/dist/js/de-CczkCOVx.js +0 -2
  926. package/frontend/dist/js/es-n_0cjhn7.js +0 -2
  927. package/frontend/dist/js/fr-Pno128cn.js +0 -2
  928. package/frontend/dist/js/hi-DBCdcL4p.js +0 -2
  929. package/frontend/dist/js/id-85QDk-wA.js +0 -2
  930. package/frontend/dist/js/is-9MuKmBft.js +0 -2
  931. package/frontend/dist/js/it-C5mz9I3H.js +0 -2
  932. package/frontend/dist/js/ja-Cu90QTBd.js +0 -2
  933. package/frontend/dist/js/ko-CSdgcMgq.js +0 -2
  934. package/frontend/dist/js/markdown-core-DHnR5Hw8.js +0 -16
  935. package/frontend/dist/js/ms-IQMi6HBU.js +0 -2
  936. package/frontend/dist/js/nl-BwpdTgvn.js +0 -2
  937. package/frontend/dist/js/pl-zq8ctKrQ.js +0 -2
  938. package/frontend/dist/js/pt-BIQu7dBu.js +0 -2
  939. package/frontend/dist/js/ru-BT5-Z0F9.js +0 -2
  940. package/frontend/dist/js/sv-B1_q6-Uj.js +0 -2
  941. package/frontend/dist/js/th-BiLLwq0A.js +0 -2
  942. package/frontend/dist/js/tr-NZbkkeKs.js +0 -2
  943. package/frontend/dist/js/ui-vendor-xUzKqAXI.js +0 -177
  944. package/frontend/dist/js/uk-CGu1pg-F.js +0 -2
  945. package/frontend/dist/js/vi-ClvH5JZg.js +0 -2
  946. package/frontend/dist/js/zh-Jgjy3uAG.js +0 -2
@@ -14,25 +14,222 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
+ import crypto from 'node:crypto';
18
+ import { Readable } from 'node:stream';
17
19
  import { v4 as uuidv4 } from 'uuid';
18
20
  import storageService from '../storage.js';
19
- import embeddingService from './embeddingService.js';
21
+ import { configurePlatformStorageRuntime, getPlatformStorageRuntime, } from '../platform/storage/index.js';
22
+ import { MAX_VECTOR_RECORDS_PER_UPSERT, MAX_VECTOR_RESOURCE_INDEX_ENTRIES, } from '../platform/storage/vectorStore.js';
23
+ import { aggregateDocumentIndexRevision, createDocumentIndexMetadata, DOCUMENT_CHUNKER_VERSION, DOCUMENT_INDEX_METADATA_KEY, DOCUMENT_VECTOR_NAMESPACE, DOCUMENT_VECTOR_VERSION, documentChunkSourceRevision as sourceRevision, documentEmbeddingDimensions as embeddingDimensions, documentIndexMatchesSpec, embeddedDocumentChunks as embeddedChunks, readDocumentIndexMetadata as readDocumentIndexMetadataValue, } from '../platform/storage/documentVectorIndex.js';
24
+ import { getCoordinator } from '../platform/coordination/service.js';
25
+ import { DOCUMENT_INGEST_IDEMPOTENCY_SCOPE } from '../platform/jobs/domainJobContracts.js';
26
+ import { transactionalDocumentIngestionEnqueuer } from '../platform/jobs/documentIngestionEnqueuer.js';
27
+ import { getDurableJobRuntime } from '../platform/jobs/durableJobRuntime.js';
28
+ import { transactionalResourceDeletionEnqueuer } from '../platform/jobs/resourceDeletionEnqueuer.js';
20
29
  import preferencesService from './preferencesService.js';
21
30
  import { createLogger } from '../utils/logger.js';
31
+ import { throwIfChatGenerationCancelled } from '../utils/chatCancellation.js';
22
32
  const logger = createLogger('documents');
23
- // Utility functions for vector operations
24
- const cosineSimilarity = (a, b) => {
25
- if (a.length !== b.length)
26
- return 0;
27
- let dotProduct = 0;
28
- let normA = 0;
29
- let normB = 0;
30
- for (let i = 0; i < a.length; i++) {
31
- dotProduct += a[i] * b[i];
32
- normA += a[i] * a[i];
33
- normB += b[i] * b[i];
34
- }
35
- return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
33
+ const DOCUMENT_BLOB_PURPOSE = 'document.source';
34
+ const DOCUMENT_POST_VECTOR_FAULT_MARKER = 'LIBRE_DOCUMENT_POST_VECTOR_KILL';
35
+ const DOCUMENT_RESOURCE_LEASE_WAIT_MS = 15000;
36
+ const MAX_VECTOR_RESOURCE_FILTERS = 100;
37
+ export class DocumentResourceBusyError extends Error {
38
+ constructor() {
39
+ super('Document indexing is already in progress; retry shortly');
40
+ this.name = 'DocumentResourceBusyError';
41
+ }
42
+ }
43
+ export class DocumentChunkLimitError extends Error {
44
+ constructor(chunks) {
45
+ super(`Document produces ${chunks} chunks; the maximum is ${MAX_VECTOR_RESOURCE_INDEX_ENTRIES}. Increase the embedding chunk size or remove excessive paragraph breaks.`);
46
+ this.chunks = chunks;
47
+ this.name = 'DocumentChunkLimitError';
48
+ }
49
+ }
50
+ class DocumentIndexSupersededError extends Error {
51
+ constructor() {
52
+ super('Document disappeared while its vector index was being published');
53
+ this.name = 'DocumentIndexSupersededError';
54
+ }
55
+ }
56
+ const resourceLeaseTtlMs = () => {
57
+ const value = Number.parseInt(process.env.RESOURCE_LEASE_TTL_MS ?? '30000', 10);
58
+ if (!Number.isSafeInteger(value) || value < 5000 || value > 300000) {
59
+ throw new Error('RESOURCE_LEASE_TTL_MS must be between 5000 and 300000 milliseconds');
60
+ }
61
+ return value;
62
+ };
63
+ const waitForLeaseRetry = (milliseconds, signal) => new Promise((resolve, reject) => {
64
+ if (signal?.aborted) {
65
+ reject(signal.reason ?? new Error('Document indexing was cancelled'));
66
+ return;
67
+ }
68
+ let timer;
69
+ const abort = () => {
70
+ clearTimeout(timer);
71
+ reject(signal?.reason ?? new Error('Document indexing was cancelled'));
72
+ };
73
+ timer = setTimeout(() => {
74
+ signal?.removeEventListener('abort', abort);
75
+ resolve();
76
+ }, milliseconds);
77
+ signal?.addEventListener('abort', abort, { once: true });
78
+ });
79
+ const acquireDocumentResourceLease = async (userId, documentId, signal, waitMs = DOCUMENT_RESOURCE_LEASE_WAIT_MS) => {
80
+ const coordinator = getCoordinator();
81
+ const ttlMs = resourceLeaseTtlMs();
82
+ const deadline = Date.now() + waitMs;
83
+ let lease = null;
84
+ do {
85
+ if (signal?.aborted)
86
+ throw signal.reason;
87
+ lease = await coordinator.acquireLease(`resource:${userId}:document:${documentId}`, ttlMs);
88
+ if (lease)
89
+ break;
90
+ if (Date.now() >= deadline)
91
+ throw new DocumentResourceBusyError();
92
+ await waitForLeaseRetry(25, signal);
93
+ } while (!lease);
94
+ let closed = false;
95
+ let lost = false;
96
+ let renewal;
97
+ const scheduleRenewal = () => {
98
+ if (closed || lost)
99
+ return;
100
+ renewal = setTimeout(async () => {
101
+ try {
102
+ if (!(await lease.extend(ttlMs)))
103
+ lost = true;
104
+ }
105
+ catch {
106
+ lost = true;
107
+ }
108
+ scheduleRenewal();
109
+ }, Math.max(1000, Math.floor(ttlMs / 3)));
110
+ renewal.unref?.();
111
+ };
112
+ scheduleRenewal();
113
+ return {
114
+ async assertHeld() {
115
+ if (signal?.aborted)
116
+ throw signal.reason;
117
+ if (closed || lost)
118
+ throw new DocumentResourceBusyError();
119
+ try {
120
+ if (await lease.extend(ttlMs))
121
+ return;
122
+ }
123
+ catch {
124
+ // Report the same safe error for expiry and coordinator outages.
125
+ }
126
+ lost = true;
127
+ throw new DocumentResourceBusyError();
128
+ },
129
+ async release() {
130
+ if (closed)
131
+ return false;
132
+ closed = true;
133
+ if (renewal)
134
+ clearTimeout(renewal);
135
+ return lease.release();
136
+ },
137
+ };
138
+ };
139
+ const deterministicDocumentChunkId = (documentId, chunkIndex, content) => {
140
+ const digest = crypto
141
+ .createHash('sha256')
142
+ .update('libre-document-chunk-v1\u0000')
143
+ .update(documentId)
144
+ .update('\u0000')
145
+ .update(String(chunkIndex))
146
+ .update('\u0000')
147
+ .update(content, 'utf8')
148
+ .digest();
149
+ // Preserve the familiar UUID shape while deriving the identity from source
150
+ // state. Retries therefore overwrite the same SQL/vector record.
151
+ digest[6] = (digest[6] & 0x0f) | 0x50;
152
+ digest[8] = (digest[8] & 0x3f) | 0x80;
153
+ const hex = digest.subarray(0, 16).toString('hex');
154
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
155
+ };
156
+ const readDocumentIndexMetadata = (document) => readDocumentIndexMetadataValue(document.metadata);
157
+ const hasValidDocumentIndexMetadata = (document) => readDocumentIndexMetadata(document) !== undefined;
158
+ const exactLocalDocumentIndexProbe = (document, chunks, userId, spec) => {
159
+ const metadata = readDocumentIndexMetadata(document);
160
+ if (!documentIndexMatchesSpec(metadata, spec) ||
161
+ metadata.dimensions === null) {
162
+ return undefined;
163
+ }
164
+ const embedded = embeddedChunks(chunks);
165
+ if (embedded.length === 0 || embedded.length !== chunks.length) {
166
+ return undefined;
167
+ }
168
+ if (embeddingDimensions(embedded) !== metadata.dimensions ||
169
+ aggregateDocumentIndexRevision(embedded, spec) !==
170
+ metadata.aggregateRevision) {
171
+ return undefined;
172
+ }
173
+ return {
174
+ actor: { userId },
175
+ namespace: DOCUMENT_VECTOR_NAMESPACE,
176
+ resourceId: document.id,
177
+ model: spec.model,
178
+ dimensions: metadata.dimensions,
179
+ version: spec.version,
180
+ entries: embedded.map(chunk => ({
181
+ id: chunk.id,
182
+ sourceRevision: sourceRevision(chunk),
183
+ })),
184
+ };
185
+ };
186
+ const withDocumentIndexMetadata = (document, chunks, spec) => {
187
+ const metadata = createDocumentIndexMetadata(chunks, spec);
188
+ return {
189
+ ...document,
190
+ metadata: {
191
+ ...(document.metadata ?? {}),
192
+ [DOCUMENT_INDEX_METADATA_KEY]: metadata,
193
+ },
194
+ };
195
+ };
196
+ const delayAfterVectorUpsertForRecoveryDrill = async (document, attemptCount, signal) => {
197
+ if (process.env.LIBRE_ENABLE_TEST_FAULT_INJECTION !== 'true' ||
198
+ attemptCount !== 1 ||
199
+ !document.content?.includes(DOCUMENT_POST_VECTOR_FAULT_MARKER)) {
200
+ return;
201
+ }
202
+ const delayMs = Number.parseInt(process.env.LIBRE_TEST_FAULT_DELAY_MS ?? '60000', 10);
203
+ if (!Number.isSafeInteger(delayMs) || delayMs < 1 || delayMs > 300000) {
204
+ throw new Error('Invalid recovery-drill fault delay');
205
+ }
206
+ await new Promise((resolve, reject) => {
207
+ if (signal?.aborted) {
208
+ reject(signal.reason ?? new Error('Document ingestion was cancelled'));
209
+ return;
210
+ }
211
+ let settled = false;
212
+ let timer;
213
+ const finish = (error) => {
214
+ if (settled)
215
+ return;
216
+ settled = true;
217
+ clearTimeout(timer);
218
+ signal?.removeEventListener('abort', abort);
219
+ if (error === undefined)
220
+ resolve();
221
+ else
222
+ reject(error);
223
+ };
224
+ const abort = () => finish(signal?.reason ?? new Error('Document ingestion was cancelled'));
225
+ timer = setTimeout(finish, delayMs);
226
+ timer.unref?.();
227
+ signal?.addEventListener('abort', abort, { once: true });
228
+ });
229
+ };
230
+ /** Installed by team-mode bootstrap so all replicas share S3 and PGVector. */
231
+ export const configureDocumentPlatformStorage = (storage) => {
232
+ configurePlatformStorageRuntime(storage);
36
233
  };
37
234
  // Lazy load pdfjs-dist legacy build for Node.js
38
235
  let pdfjsLib = null;
@@ -51,85 +248,177 @@ const getPdfjsLib = async () => {
51
248
  }
52
249
  return pdfjsLib;
53
250
  };
54
- class DocumentService {
55
- constructor() {
56
- this.documents = new Map();
57
- this.chunks = new Map();
58
- this.loadDocuments();
59
- this.loadChunks();
251
+ const extractDocumentContent = async (fileBuffer, mimeType, signal) => {
252
+ if (signal?.aborted)
253
+ throw signal.reason;
254
+ if (mimeType === 'text/plain') {
255
+ return { content: fileBuffer.toString('utf8'), fileType: 'txt' };
60
256
  }
61
- loadDocuments() {
62
- try {
63
- const documentsArray = storageService.getAllDocuments();
64
- this.documents = new Map(documentsArray.map(doc => [doc.id, doc]));
65
- logger.debug(`Loaded ${documentsArray.length} documents from storage`);
257
+ if (mimeType !== 'application/pdf') {
258
+ throw new Error(`Unsupported file type: ${mimeType}`);
259
+ }
260
+ const pdfLib = await getPdfjsLib();
261
+ const pdfDocument = await pdfLib.getDocument({
262
+ data: new Uint8Array(fileBuffer),
263
+ }).promise;
264
+ let textContent = '';
265
+ for (let pageNum = 1; pageNum <= pdfDocument.numPages; pageNum += 1) {
266
+ if (signal?.aborted)
267
+ throw signal.reason;
268
+ const page = await pdfDocument.getPage(pageNum);
269
+ const pageText = await page.getTextContent();
270
+ textContent += `${pageText.items
271
+ .map(item => ('str' in item ? item.str : ''))
272
+ .join(' ')}\n\n`;
273
+ }
274
+ return { content: textContent.trim(), fileType: 'pdf' };
275
+ };
276
+ export class DocumentService {
277
+ async captureEmbeddingExecutionSpec(userId) {
278
+ const settings = (await preferencesService.getPreferences(userId))
279
+ .embeddingSettings;
280
+ const model = settings.model.trim();
281
+ if (!model || Buffer.byteLength(model, 'utf8') > 256) {
282
+ throw new Error('Embedding model must contain 1-256 bytes');
66
283
  }
67
- catch (error) {
68
- logger.error('Failed to load documents:', error);
284
+ if (!Number.isSafeInteger(settings.chunkSize) ||
285
+ settings.chunkSize < 1 ||
286
+ settings.chunkSize > 1000000) {
287
+ throw new Error('Embedding chunk size must be between 1 and 1000000');
288
+ }
289
+ if (!Number.isSafeInteger(settings.chunkOverlap) ||
290
+ settings.chunkOverlap < 0 ||
291
+ settings.chunkOverlap >= settings.chunkSize) {
292
+ throw new Error('Embedding chunk overlap must be non-negative and smaller than the chunk size');
69
293
  }
294
+ if (!Number.isFinite(settings.similarityThreshold) ||
295
+ settings.similarityThreshold < -1 ||
296
+ settings.similarityThreshold > 1) {
297
+ throw new Error('Embedding similarity threshold must be between -1 and 1');
298
+ }
299
+ return Object.freeze({
300
+ enabled: settings.enabled === true,
301
+ model,
302
+ version: DOCUMENT_VECTOR_VERSION,
303
+ chunkerVersion: DOCUMENT_CHUNKER_VERSION,
304
+ chunkSize: settings.chunkSize,
305
+ chunkOverlap: settings.chunkOverlap,
306
+ similarityThreshold: settings.similarityThreshold,
307
+ });
70
308
  }
71
- loadChunks() {
72
- try {
73
- // Load chunks for all documents
74
- const documentsArray = Array.from(this.documents.values());
75
- for (const doc of documentsArray) {
76
- const chunks = storageService.getDocumentChunks(doc.id);
77
- if (chunks.length > 0) {
78
- this.chunks.set(doc.id, chunks);
79
- }
309
+ async assertDocumentIndexAuthoritative(documentId, userId, aggregateRevision, expectedSource) {
310
+ const platform = getPlatformStorageRuntime();
311
+ const [document, reserved] = await Promise.all([
312
+ platform.domains.documents.findByOwner(documentId, userId),
313
+ platform.domains.resourceDeletions.isReserved('document', documentId),
314
+ ]);
315
+ if (!document || reserved)
316
+ throw new DocumentIndexSupersededError();
317
+ if (aggregateRevision) {
318
+ const metadata = readDocumentIndexMetadata(document);
319
+ if (metadata?.aggregateRevision !== aggregateRevision) {
320
+ throw new DocumentIndexSupersededError();
80
321
  }
81
- logger.debug(`Loaded chunks for ${this.chunks.size} documents from storage`);
82
322
  }
83
- catch (error) {
84
- logger.error('Failed to load document chunks:', error);
323
+ if (expectedSource &&
324
+ ((document.content ?? null) !== expectedSource.content ||
325
+ (document.fileType ?? null) !== expectedSource.fileType)) {
326
+ throw new DocumentIndexSupersededError();
85
327
  }
328
+ return document;
86
329
  }
87
- saveDocuments() {
88
- // This method is no longer needed as we save documents individually
89
- // through the storage service
90
- }
91
- saveChunks() {
92
- // This method is no longer needed as we save chunks individually
93
- // through the storage service
94
- }
95
- async processDocument(fileName, fileBuffer, mimeType, userId, sessionId) {
330
+ /**
331
+ * Persist the private source and publish extraction in the same SQL
332
+ * transaction as the document placeholder. The object write is compensated
333
+ * if the SQL transaction cannot commit.
334
+ */
335
+ async queueDocumentProcessing(fileName, fileBuffer, mimeType, userId, sessionId, signal) {
336
+ if (mimeType !== 'text/plain' && mimeType !== 'application/pdf') {
337
+ throw new Error(`Unsupported file type: ${mimeType}`);
338
+ }
339
+ if (signal?.aborted)
340
+ throw signal.reason;
96
341
  const documentId = uuidv4();
97
- let content = '';
98
- let fileType;
342
+ const now = Date.now();
343
+ const document = {
344
+ id: documentId,
345
+ filename: fileName,
346
+ content: '',
347
+ fileType: mimeType === 'application/pdf' ? 'pdf' : 'txt',
348
+ size: fileBuffer.length,
349
+ ...(sessionId ? { sessionId } : {}),
350
+ uploadedAt: now,
351
+ createdAt: now,
352
+ metadata: { processingStatus: 'queued' },
353
+ };
354
+ const platform = getPlatformStorageRuntime();
355
+ const sourceBlob = await platform.blobStore.put({
356
+ ownerUserId: userId,
357
+ purpose: DOCUMENT_BLOB_PURPOSE,
358
+ contentType: mimeType,
359
+ originalFilename: fileName,
360
+ expectedSize: fileBuffer.length,
361
+ metadata: { resourceType: 'document', resourceId: documentId },
362
+ source: Readable.from(fileBuffer),
363
+ ...(signal ? { signal } : {}),
364
+ });
99
365
  try {
100
- if (mimeType === 'application/pdf') {
101
- try {
102
- const pdfLib = await getPdfjsLib();
103
- // Convert Buffer to Uint8Array for pdfjs-dist compatibility
104
- const uint8Array = new Uint8Array(fileBuffer);
105
- const pdfDocument = await pdfLib.getDocument({ data: uint8Array })
106
- .promise;
107
- const numPages = pdfDocument.numPages;
108
- let textContent = '';
109
- for (let pageNum = 1; pageNum <= numPages; pageNum++) {
110
- const page = await pdfDocument.getPage(pageNum);
111
- const pageText = await page.getTextContent();
112
- const pageContent = pageText.items
113
- .map(item => ('str' in item ? item.str : ''))
114
- .join(' ');
115
- textContent += pageContent + '\n\n';
116
- }
117
- content = textContent.trim();
118
- fileType = 'pdf';
366
+ await platform.domains.documents.upsertWithBlobAndEnqueue(document, userId, {
367
+ blobId: sourceBlob.id,
368
+ ownerUserId: userId,
369
+ resourceType: 'document',
370
+ resourceId: documentId,
371
+ purpose: DOCUMENT_BLOB_PURPOSE,
372
+ createdAt: Date.parse(sourceBlob.createdAt) || now,
373
+ }, transactionalDocumentIngestionEnqueuer);
374
+ }
375
+ catch (error) {
376
+ // A PostgreSQL COMMIT can succeed even when its acknowledgement is
377
+ // lost. Resolve that unknown outcome from authoritative state before
378
+ // compensating the already-durable blob; deleting first would leave a
379
+ // committed document/reference/job pointing at a missing object.
380
+ try {
381
+ const [publishedDocument, publishedReference, publishedJob] = await Promise.all([
382
+ platform.domains.documents.findByOwner(documentId, userId),
383
+ platform.blobReferences.find('document', documentId, DOCUMENT_BLOB_PURPOSE),
384
+ getDurableJobRuntime().service.getByIdempotency(userId, DOCUMENT_INGEST_IDEMPOTENCY_SCOPE, documentId),
385
+ ]);
386
+ const committed = publishedDocument !== undefined &&
387
+ publishedReference?.blobId === sourceBlob.id &&
388
+ publishedReference.ownerUserId === userId &&
389
+ publishedJob != null;
390
+ if (committed && publishedJob) {
391
+ return { document, jobId: publishedJob.id };
119
392
  }
120
- catch (pdfError) {
121
- logger.error('PDF parsing error:', pdfError);
122
- throw new Error(`Failed to parse PDF: ${pdfError instanceof Error ? pdfError.message : 'Unknown PDF error'}`);
393
+ const safelyAbsent = publishedDocument === undefined &&
394
+ publishedReference === undefined &&
395
+ publishedJob == null;
396
+ if (!safelyAbsent) {
397
+ throw new Error('Document ingestion publish outcome is inconsistent; the source blob was retained for recovery');
123
398
  }
124
399
  }
125
- else if (mimeType === 'text/plain') {
126
- content = fileBuffer.toString('utf-8');
127
- fileType = 'txt';
128
- }
129
- else {
130
- throw new Error(`Unsupported file type: ${mimeType}`);
400
+ catch (resolutionError) {
401
+ logger.error('Document ingestion publish failed and its outcome could not be resolved', error, resolutionError);
402
+ throw new Error('Could not resolve the document ingestion transaction outcome; the source blob was retained for recovery');
131
403
  }
132
- const document = {
404
+ await platform.blobStore
405
+ .delete({ id: sourceBlob.id, ownerUserId: userId })
406
+ .catch(cleanupError => {
407
+ logger.warn('Document source cleanup failed after a rolled-back publish; lifecycle reconciliation will retry it', cleanupError);
408
+ });
409
+ throw error;
410
+ }
411
+ const job = await getDurableJobRuntime().service.getByIdempotency(userId, DOCUMENT_INGEST_IDEMPOTENCY_SCOPE, documentId);
412
+ if (!job) {
413
+ throw new Error('Document ingestion transaction did not publish its job');
414
+ }
415
+ return { document, jobId: job.id };
416
+ }
417
+ async processDocument(fileName, fileBuffer, mimeType, userId, sessionId) {
418
+ const documentId = uuidv4();
419
+ try {
420
+ const { content, fileType } = await extractDocumentContent(fileBuffer, mimeType);
421
+ let document = {
133
422
  id: documentId,
134
423
  filename: fileName,
135
424
  content,
@@ -138,15 +427,53 @@ class DocumentService {
138
427
  sessionId,
139
428
  uploadedAt: Date.now(),
140
429
  };
141
- // Process the document into chunks
142
- const chunks = this.chunkDocument(document, userId);
430
+ const spec = await this.captureEmbeddingExecutionSpec(userId);
431
+ // Process the document into chunks under one immutable execution spec.
432
+ const chunks = this.chunkDocument(document, spec);
143
433
  // Generate embeddings for chunks if enabled
144
- const chunksWithEmbeddings = await this.generateEmbeddingsForChunks(chunks, userId);
145
- // Store document and chunks
146
- this.documents.set(documentId, document);
147
- this.chunks.set(documentId, chunksWithEmbeddings);
148
- storageService.saveDocument(document, userId);
149
- storageService.saveDocumentChunks(documentId, chunksWithEmbeddings);
434
+ const chunksWithEmbeddings = await this.generateEmbeddingsForChunks(chunks, userId, spec);
435
+ document = withDocumentIndexMetadata(document, chunksWithEmbeddings, spec);
436
+ const platform = getPlatformStorageRuntime();
437
+ const sourceBlob = await platform.blobStore.put({
438
+ ownerUserId: userId,
439
+ purpose: DOCUMENT_BLOB_PURPOSE,
440
+ contentType: mimeType,
441
+ originalFilename: fileName,
442
+ expectedSize: fileBuffer.length,
443
+ metadata: { resourceType: 'document', resourceId: documentId },
444
+ source: Readable.from(fileBuffer),
445
+ });
446
+ try {
447
+ await storageService.saveDocument(document, userId);
448
+ await storageService.saveDocumentChunks(documentId, chunksWithEmbeddings);
449
+ await platform.blobReferences.attach({
450
+ blobId: sourceBlob.id,
451
+ ownerUserId: userId,
452
+ resourceType: 'document',
453
+ resourceId: documentId,
454
+ purpose: DOCUMENT_BLOB_PURPOSE,
455
+ createdAt: Date.now(),
456
+ });
457
+ await this.indexDocumentChunks(document, chunksWithEmbeddings, userId, spec);
458
+ }
459
+ catch (error) {
460
+ await platform.vectorStore
461
+ .delete({
462
+ actor: { userId },
463
+ namespace: DOCUMENT_VECTOR_NAMESPACE,
464
+ resourceId: documentId,
465
+ })
466
+ .catch(() => undefined);
467
+ await platform.blobReferences
468
+ .detach('document', documentId, DOCUMENT_BLOB_PURPOSE)
469
+ .catch(() => undefined);
470
+ await platform.blobStore
471
+ .delete({ id: sourceBlob.id, ownerUserId: userId })
472
+ .catch(() => undefined);
473
+ await storageService.deleteDocumentChunks(documentId);
474
+ await storageService.deleteDocument(documentId, userId);
475
+ throw error;
476
+ }
150
477
  logger.debug(`Processed ${fileType.toUpperCase()} document: ${fileName} (${chunksWithEmbeddings.length} chunks)`);
151
478
  return document;
152
479
  }
@@ -155,11 +482,16 @@ class DocumentService {
155
482
  throw new Error(`Failed to process document: ${error instanceof Error ? error.message : 'Unknown error'}`);
156
483
  }
157
484
  }
158
- chunkDocument(document, userId) {
485
+ chunkDocument(document, spec) {
159
486
  const chunks = [];
160
- const preferences = preferencesService.getPreferences(userId);
161
- const chunkSize = preferences.embeddingSettings?.chunkSize || 1000; // characters per chunk
162
- const overlap = preferences.embeddingSettings?.chunkOverlap || 200; // character overlap between chunks
487
+ const appendChunk = (chunk) => {
488
+ if (chunks.length >= MAX_VECTOR_RESOURCE_INDEX_ENTRIES) {
489
+ throw new DocumentChunkLimitError(chunks.length + 1);
490
+ }
491
+ chunks.push(chunk);
492
+ };
493
+ const chunkSize = spec.chunkSize;
494
+ const overlap = spec.chunkOverlap;
163
495
  const text = document.content?.trim();
164
496
  if (!text)
165
497
  return chunks;
@@ -180,10 +512,11 @@ class DocumentService {
180
512
  if (currentChunk.trim()) {
181
513
  const chunkStart = currentOffset - currentChunk.length;
182
514
  const chunkEnd = currentOffset;
183
- chunks.push({
184
- id: uuidv4(),
515
+ const content = currentChunk.trim();
516
+ appendChunk({
517
+ id: deterministicDocumentChunkId(document.id, chunkIndex, content),
185
518
  documentId: document.id,
186
- content: currentChunk.trim(),
519
+ content,
187
520
  chunkIndex: chunkIndex++,
188
521
  startChar: Math.max(0, chunkStart),
189
522
  endChar: chunkEnd,
@@ -191,8 +524,12 @@ class DocumentService {
191
524
  }
192
525
  // Start new chunk with overlap from previous chunk
193
526
  const words = currentChunk.split(' ');
194
- const overlapWords = words.slice(-calculateOverlapWordCount(overlap));
195
- currentChunk = overlapWords.join(' ') + '\n\n' + paragraphText;
527
+ const overlapWordCount = calculateOverlapWordCount(overlap);
528
+ const overlapWords = overlapWordCount === 0 ? [] : words.slice(-overlapWordCount);
529
+ currentChunk =
530
+ overlapWords.length === 0
531
+ ? paragraphText
532
+ : `${overlapWords.join(' ')}\n\n${paragraphText}`;
196
533
  currentOffset += paragraphText.length + 2; // +2 for \n\n
197
534
  }
198
535
  else {
@@ -211,10 +548,11 @@ class DocumentService {
211
548
  if (currentChunk.trim()) {
212
549
  const chunkStart = currentOffset - currentChunk.length;
213
550
  const chunkEnd = currentOffset;
214
- chunks.push({
215
- id: uuidv4(),
551
+ const content = currentChunk.trim();
552
+ appendChunk({
553
+ id: deterministicDocumentChunkId(document.id, chunkIndex, content),
216
554
  documentId: document.id,
217
- content: currentChunk.trim(),
555
+ content,
218
556
  chunkIndex: chunkIndex,
219
557
  startChar: Math.max(0, chunkStart),
220
558
  endChar: chunkEnd,
@@ -222,100 +560,317 @@ class DocumentService {
222
560
  }
223
561
  return chunks;
224
562
  }
225
- async generateEmbeddingForText(text, userId) {
563
+ async generateEmbeddingForText(text, userId, spec, signal) {
226
564
  try {
227
- const preferences = preferencesService.getPreferences(userId);
228
- if (!preferences.embeddingSettings.enabled) {
565
+ if (!spec.enabled)
229
566
  return null;
230
- }
567
+ // Provider/plugin construction is stateful and must happen only after
568
+ // the selected persistence backend has completed bootstrap.
569
+ const { default: embeddingService } = await import('./embeddingService.js');
231
570
  const response = await embeddingService.generateEmbeddings({
232
- model: preferences.embeddingSettings.model,
571
+ model: spec.model,
233
572
  input: text,
234
- }, userId);
573
+ }, userId, signal);
235
574
  return response.embeddings[0] || null;
236
575
  }
237
576
  catch (error) {
577
+ if (signal?.aborted)
578
+ throw error;
238
579
  logger.error('Failed to generate embedding:', error);
239
580
  return null;
240
581
  }
241
582
  }
242
- async generateEmbeddingsForChunks(chunks, userId) {
243
- const preferences = preferencesService.getPreferences(userId);
244
- if (!preferences.embeddingSettings.enabled) {
583
+ async generateEmbeddingsForChunks(chunks, userId, spec, signal, assertSideEffectAllowed) {
584
+ if (!spec.enabled)
245
585
  return chunks;
246
- }
247
586
  logger.debug(`Generating embeddings for ${chunks.length} chunks...`);
248
587
  const chunksWithEmbeddings = [];
249
588
  for (const chunk of chunks) {
250
- const embedding = await this.generateEmbeddingForText(chunk.content, userId);
589
+ await assertSideEffectAllowed?.();
590
+ const embedding = await this.generateEmbeddingForText(chunk.content, userId, spec, signal);
591
+ if (!embedding) {
592
+ throw new Error('Embedding generation returned no vector');
593
+ }
251
594
  chunksWithEmbeddings.push({
252
595
  ...chunk,
253
- embedding: embedding || undefined,
596
+ embedding,
254
597
  });
255
598
  }
599
+ embeddingDimensions(embeddedChunks(chunksWithEmbeddings));
256
600
  logger.debug(`Generated embeddings for ${chunksWithEmbeddings.filter(c => c.embedding).length} chunks`);
257
601
  return chunksWithEmbeddings;
258
602
  }
259
- // Method to regenerate embeddings for all existing documents
260
- async regenerateAllEmbeddings(userId) {
261
- const preferences = preferencesService.getPreferences(userId);
262
- if (!preferences.embeddingSettings.enabled) {
603
+ /**
604
+ * Older solo databases stored inline vectors without recording which model
605
+ * produced them. Presence is therefore only an upgrade signal: rebuild the
606
+ * authoritative document from text under today's immutable execution spec,
607
+ * and never copy or relabel the legacy payload.
608
+ */
609
+ async upgradeLegacyDocumentIndex(document, userId, spec, signal) {
610
+ const platform = getPlatformStorageRuntime();
611
+ if (platform.dialect !== 'sqlite' ||
612
+ hasValidDocumentIndexMetadata(document) ||
613
+ !document.content?.trim()) {
614
+ return undefined;
615
+ }
616
+ const legacy = await platform.domains.documents.inspectLegacyChunkEmbeddings(document.id, userId);
617
+ if (!legacy.present)
618
+ return undefined;
619
+ let lease;
620
+ try {
621
+ lease = await acquireDocumentResourceLease(userId, document.id, signal, 0);
622
+ await lease.assertHeld();
623
+ const current = await this.assertDocumentIndexAuthoritative(document.id, userId);
624
+ if (hasValidDocumentIndexMetadata(current)) {
625
+ return {
626
+ document: current,
627
+ chunks: await this.loadDocumentChunks(current.id),
628
+ };
629
+ }
630
+ if (!current.content?.trim())
631
+ return undefined;
632
+ const currentLegacy = await platform.domains.documents.inspectLegacyChunkEmbeddings(current.id, userId);
633
+ if (!currentLegacy.present)
634
+ return undefined;
635
+ if (!currentLegacy.authenticated) {
636
+ logger.warn(`Legacy inline embeddings for document ${current.id} failed authentication; rebuilding from authoritative text`);
637
+ }
638
+ const chunks = this.chunkDocument(current, spec);
639
+ if (chunks.length === 0) {
640
+ logger.debug(`Legacy document ${current.id} has no authoritative text to reindex`);
641
+ return undefined;
642
+ }
643
+ const embedded = await this.generateEmbeddingsForChunks(chunks, userId, spec, signal, () => lease.assertHeld());
644
+ await lease.assertHeld();
645
+ const latest = await this.assertDocumentIndexAuthoritative(current.id, userId, undefined, {
646
+ content: current.content ?? null,
647
+ fileType: current.fileType ?? null,
648
+ });
649
+ if (hasValidDocumentIndexMetadata(latest)) {
650
+ throw new DocumentIndexSupersededError();
651
+ }
652
+ const published = withDocumentIndexMetadata(latest, embedded, spec);
653
+ const embeddingIndex = readDocumentIndexMetadata(published);
654
+ if (!embeddingIndex) {
655
+ throw new Error('Document embedding index metadata is invalid');
656
+ }
657
+ const completed = await platform.domains.documents.publishEmbeddingIndex(current.id, userId, {
658
+ content: current.content ?? null,
659
+ fileType: current.fileType ?? null,
660
+ }, embeddingIndex, embedded);
661
+ if (!completed)
662
+ throw new DocumentIndexSupersededError();
663
+ await lease.assertHeld();
664
+ const authoritative = await this.assertDocumentIndexAuthoritative(current.id, userId, embeddingIndex.aggregateRevision, {
665
+ content: current.content ?? null,
666
+ fileType: current.fileType ?? null,
667
+ });
668
+ await this.indexDocumentChunks(authoritative, embedded, userId, spec, 1, signal, () => lease.assertHeld());
669
+ return { document: authoritative, chunks: embedded };
670
+ }
671
+ catch (error) {
672
+ if (signal?.aborted)
673
+ throw error;
674
+ if (!(error instanceof DocumentResourceBusyError) &&
675
+ !(error instanceof DocumentIndexSupersededError)) {
676
+ logger.warn(`Could not upgrade legacy document embeddings for ${document.id}; keyword fallback remains available`, error);
677
+ }
678
+ return undefined;
679
+ }
680
+ finally {
681
+ await lease?.release().catch(() => false);
682
+ }
683
+ }
684
+ /**
685
+ * Rebuild every document under one immutable preference snapshot. Each
686
+ * resource uses the same renewable coordinator lease as ingestion/deletion,
687
+ * while the relational delete is still allowed to publish its tombstone.
688
+ * The final authoritative check then removes any vector recreated after that
689
+ * tombstone committed.
690
+ */
691
+ async regenerateAllEmbeddings(userId, signal) {
692
+ const spec = await this.captureEmbeddingExecutionSpec(userId);
693
+ const documents = await storageService.getAllDocuments(userId);
694
+ const result = {
695
+ documentsTotal: documents.length,
696
+ documentsRegenerated: 0,
697
+ documentsSkipped: 0,
698
+ chunksTotal: 0,
699
+ chunksEmbedded: 0,
700
+ model: spec.model,
701
+ version: spec.version,
702
+ };
703
+ if (!spec.enabled) {
704
+ result.documentsSkipped = documents.length;
263
705
  logger.debug('Embeddings are disabled, skipping regeneration');
264
- return;
706
+ return result;
265
707
  }
266
708
  logger.debug('Starting to regenerate embeddings for all documents...');
267
- let processedChunks = 0;
268
- let totalChunks = 0;
269
- for (const document of storageService.getAllDocuments(userId)) {
270
- const documentId = document.id;
271
- const chunks = this.loadDocumentChunks(documentId);
272
- totalChunks += chunks.length;
273
- const chunksWithEmbeddings = await this.generateEmbeddingsForChunks(chunks, userId);
274
- this.chunks.set(documentId, chunksWithEmbeddings);
275
- storageService.saveDocumentChunks(documentId, chunksWithEmbeddings);
276
- processedChunks += chunksWithEmbeddings.filter(c => c.embedding).length;
709
+ for (const listedDocument of documents) {
710
+ if (signal?.aborted)
711
+ throw signal.reason;
712
+ let lease;
713
+ try {
714
+ lease = await acquireDocumentResourceLease(userId, listedDocument.id, signal);
715
+ }
716
+ catch (error) {
717
+ if (error instanceof DocumentResourceBusyError) {
718
+ result.documentsSkipped += 1;
719
+ continue;
720
+ }
721
+ throw error;
722
+ }
723
+ try {
724
+ await lease.assertHeld();
725
+ const current = await this.assertDocumentIndexAuthoritative(listedDocument.id, userId);
726
+ const chunks = this.chunkDocument(current, spec);
727
+ result.chunksTotal += chunks.length;
728
+ const embedded = await this.generateEmbeddingsForChunks(chunks, userId, spec, signal, () => lease.assertHeld());
729
+ await lease.assertHeld();
730
+ const latest = await this.assertDocumentIndexAuthoritative(current.id, userId);
731
+ if (latest.content !== current.content ||
732
+ latest.fileType !== current.fileType) {
733
+ throw new DocumentIndexSupersededError();
734
+ }
735
+ // Preserve routing/metadata changes published while embedding work was
736
+ // in flight. The repository merges only embeddingIndex and chunks
737
+ // under its row/write lock, so an acknowledged collection/session
738
+ // change can never be replaced by this stale service snapshot.
739
+ const published = withDocumentIndexMetadata(latest, embedded, spec);
740
+ const embeddingIndex = readDocumentIndexMetadata(published);
741
+ if (!embeddingIndex) {
742
+ throw new Error('Document embedding index metadata is invalid');
743
+ }
744
+ const completed = await getPlatformStorageRuntime().domains.documents.publishEmbeddingIndex(current.id, userId, {
745
+ content: current.content ?? null,
746
+ fileType: current.fileType ?? null,
747
+ }, embeddingIndex, embedded);
748
+ if (!completed)
749
+ throw new DocumentIndexSupersededError();
750
+ await lease.assertHeld();
751
+ const authoritativePublished = await this.assertDocumentIndexAuthoritative(current.id, userId, embeddingIndex.aggregateRevision, {
752
+ content: current.content ?? null,
753
+ fileType: current.fileType ?? null,
754
+ });
755
+ await this.indexDocumentChunks(authoritativePublished, embedded, userId, spec, 1, signal, () => lease.assertHeld());
756
+ result.documentsRegenerated += 1;
757
+ result.chunksEmbedded += embedded.length;
758
+ }
759
+ catch (error) {
760
+ if (error instanceof DocumentIndexSupersededError) {
761
+ result.documentsSkipped += 1;
762
+ continue;
763
+ }
764
+ throw error;
765
+ }
766
+ finally {
767
+ await lease.release().catch(() => false);
768
+ }
277
769
  }
278
- logger.debug(`Regenerated embeddings for ${processedChunks}/${totalChunks} chunks`);
770
+ logger.debug(`Regenerated embeddings for ${result.chunksEmbedded}/${result.chunksTotal} chunks`);
771
+ return result;
772
+ }
773
+ /** Durable extraction/embedding handler entrypoint for an existing source. */
774
+ async reprocessDocument(documentId, userId, signal, assertSideEffectAllowed, attemptCount = 1) {
775
+ const spec = await this.captureEmbeddingExecutionSpec(userId);
776
+ const current = await this.getDocument(documentId, userId);
777
+ if (!current)
778
+ throw new Error('Document not found');
779
+ const source = await this.openDocumentSource(documentId, userId, undefined, signal);
780
+ if (!source)
781
+ throw new Error('Document source is unavailable');
782
+ const buffers = [];
783
+ let size = 0;
784
+ for await (const chunk of source.body) {
785
+ if (signal?.aborted)
786
+ throw signal.reason;
787
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
788
+ size += buffer.length;
789
+ if (size > 10 * 1024 * 1024) {
790
+ throw new Error('Document source exceeds the extraction limit');
791
+ }
792
+ buffers.push(buffer);
793
+ }
794
+ const extracted = await extractDocumentContent(Buffer.concat(buffers, size), source.descriptor.contentType, signal);
795
+ let document = {
796
+ ...current,
797
+ content: extracted.content,
798
+ fileType: extracted.fileType,
799
+ size,
800
+ };
801
+ const chunks = this.chunkDocument(document, spec);
802
+ const embedded = await this.generateEmbeddingsForChunks(chunks, userId, spec, signal, assertSideEffectAllowed);
803
+ document.metadata = {
804
+ ...(document.metadata ?? {}),
805
+ processingStatus: 'completed',
806
+ processedAt: Date.now(),
807
+ };
808
+ document = withDocumentIndexMetadata(document, embedded, spec);
809
+ await assertSideEffectAllowed?.();
810
+ const completed = await getPlatformStorageRuntime().domains.documents.completeIngestion(document, userId, embedded);
811
+ if (!completed)
812
+ throw new Error('Document was deleted during ingestion');
813
+ await assertSideEffectAllowed?.();
814
+ await this.indexDocumentChunks(document, embedded, userId, spec, attemptCount, signal, assertSideEffectAllowed);
815
+ return {
816
+ chunks: embedded.length,
817
+ embedded: embedded.filter(chunk => chunk.embedding?.length).length,
818
+ };
279
819
  }
280
820
  // Method to get embedding model information
281
821
  async getEmbeddingModelInfo(userId) {
282
- const preferences = preferencesService.getPreferences(userId);
822
+ const spec = await this.captureEmbeddingExecutionSpec(userId);
283
823
  let chunksWithEmbeddings = 0;
284
824
  let totalChunks = 0;
285
- for (const document of storageService.getAllDocuments(userId)) {
286
- const chunks = this.loadDocumentChunks(document.id);
825
+ for (const document of await storageService.getAllDocuments(userId)) {
826
+ const chunks = await this.loadDocumentChunks(document.id);
287
827
  totalChunks += chunks.length;
288
828
  chunksWithEmbeddings += chunks.filter(c => c.embedding).length;
289
829
  }
290
830
  return {
291
- available: preferences.embeddingSettings.enabled,
292
- model: preferences.embeddingSettings.model,
831
+ available: spec.enabled,
832
+ model: spec.model,
293
833
  chunksWithEmbeddings,
294
834
  totalChunks,
295
835
  };
296
836
  }
297
- getDocument(documentId, userId) {
837
+ async getDocument(documentId, userId) {
298
838
  return storageService.getDocument(documentId, userId);
299
839
  }
300
- getDocuments(userId, sessionId) {
301
- const allDocs = storageService.getAllDocuments(userId);
840
+ async getDocuments(userId, sessionId) {
841
+ const allDocs = await storageService.getAllDocuments(userId);
302
842
  if (sessionId) {
303
843
  return allDocs.filter(doc => doc.sessionId === sessionId);
304
844
  }
305
845
  return allDocs.sort((a, b) => b.uploadedAt - a.uploadedAt);
306
846
  }
307
- getDocumentChunks(documentId, userId) {
308
- if (!this.getDocument(documentId, userId))
847
+ async getDocumentChunks(documentId, userId) {
848
+ if (!(await this.getDocument(documentId, userId)))
309
849
  return [];
310
850
  return this.loadDocumentChunks(documentId);
311
851
  }
312
- deleteDocument(documentId, userId) {
313
- if (!this.getDocument(documentId, userId))
852
+ async openDocumentSource(documentId, userId, range, signal) {
853
+ if (!(await this.getDocument(documentId, userId)))
854
+ return undefined;
855
+ const platform = getPlatformStorageRuntime();
856
+ const reference = await platform.blobReferences.find('document', documentId, DOCUMENT_BLOB_PURPOSE);
857
+ if (!reference || reference.ownerUserId !== userId)
858
+ return undefined;
859
+ return platform.blobStore.open({
860
+ id: reference.blobId,
861
+ ownerUserId: userId,
862
+ ...(range ? { range } : {}),
863
+ ...(signal ? { signal } : {}),
864
+ });
865
+ }
866
+ async deleteDocument(documentId, userId) {
867
+ if (!(await this.getDocument(documentId, userId)))
868
+ return false;
869
+ const platform = getPlatformStorageRuntime();
870
+ const relationalDeleted = await platform.domains.documents.deleteAndEnqueue(documentId, userId, transactionalResourceDeletionEnqueuer);
871
+ if (!relationalDeleted)
314
872
  return false;
315
- const deleted = this.documents.delete(documentId);
316
- this.chunks.delete(documentId);
317
- storageService.deleteDocumentChunks(documentId);
318
- return storageService.deleteDocument(documentId, userId) || deleted;
873
+ return true;
319
874
  }
320
875
  /**
321
876
  * A document is searchable for a chat when it belongs to that session or
@@ -337,74 +892,263 @@ class DocumentService {
337
892
  document.collectionId &&
338
893
  collectionIds.includes(document.collectionId));
339
894
  }
895
+ async indexDocumentChunks(document, chunks, userId, spec, attemptCount = 1, signal, assertSideEffectAllowed) {
896
+ const executionSpec = spec ?? (await this.captureEmbeddingExecutionSpec(userId));
897
+ const embedded = embeddedChunks(chunks);
898
+ embeddingDimensions(embedded);
899
+ const platform = getPlatformStorageRuntime();
900
+ const revisions = embedded.map(sourceRevision);
901
+ const aggregateRevision = aggregateDocumentIndexRevision(embedded, executionSpec);
902
+ const publishedMetadata = readDocumentIndexMetadata(document);
903
+ if (publishedMetadata &&
904
+ publishedMetadata.aggregateRevision !== aggregateRevision) {
905
+ throw new Error('Document index metadata does not match its embeddings');
906
+ }
907
+ const expectedRevision = publishedMetadata?.aggregateRevision;
908
+ const expectedSource = {
909
+ content: document.content ?? null,
910
+ fileType: document.fileType ?? null,
911
+ };
912
+ await assertSideEffectAllowed?.();
913
+ await this.assertDocumentIndexAuthoritative(document.id, userId, expectedRevision, expectedSource);
914
+ let mutated = false;
915
+ try {
916
+ // Replace the resource index rather than only upserting the latest IDs.
917
+ // Deterministic chunk IDs make a crash after upsert retry-safe, while this
918
+ // deletion removes records from older document revisions.
919
+ await platform.vectorStore.delete({
920
+ actor: { userId },
921
+ namespace: DOCUMENT_VECTOR_NAMESPACE,
922
+ resourceId: document.id,
923
+ });
924
+ mutated = true;
925
+ await assertSideEffectAllowed?.();
926
+ await this.assertDocumentIndexAuthoritative(document.id, userId, expectedRevision, expectedSource);
927
+ for (let offset = 0; offset < embedded.length; offset += MAX_VECTOR_RECORDS_PER_UPSERT) {
928
+ await assertSideEffectAllowed?.();
929
+ await this.assertDocumentIndexAuthoritative(document.id, userId, expectedRevision, expectedSource);
930
+ const batch = embedded.slice(offset, offset + MAX_VECTOR_RECORDS_PER_UPSERT);
931
+ await platform.vectorStore.upsert({
932
+ actor: { userId },
933
+ records: batch.map((chunk, index) => ({
934
+ namespace: DOCUMENT_VECTOR_NAMESPACE,
935
+ id: chunk.id,
936
+ ownerUserId: userId,
937
+ resourceId: document.id,
938
+ model: executionSpec.model,
939
+ dimensions: chunk.embedding.length,
940
+ version: executionSpec.version,
941
+ sourceRevision: revisions[offset + index],
942
+ embedding: chunk.embedding,
943
+ attributes: {
944
+ chunkIndex: String(chunk.chunkIndex),
945
+ ...(document.sessionId ? { sessionId: document.sessionId } : {}),
946
+ ...(document.collectionId
947
+ ? { collectionId: document.collectionId }
948
+ : {}),
949
+ },
950
+ })),
951
+ });
952
+ await assertSideEffectAllowed?.();
953
+ await this.assertDocumentIndexAuthoritative(document.id, userId, expectedRevision, expectedSource);
954
+ }
955
+ await delayAfterVectorUpsertForRecoveryDrill(document, attemptCount, signal);
956
+ await assertSideEffectAllowed?.();
957
+ await this.assertDocumentIndexAuthoritative(document.id, userId, expectedRevision, expectedSource);
958
+ }
959
+ catch (error) {
960
+ if (mutated) {
961
+ await platform.vectorStore
962
+ .delete({
963
+ actor: { userId },
964
+ namespace: DOCUMENT_VECTOR_NAMESPACE,
965
+ resourceId: document.id,
966
+ })
967
+ .catch(cleanupError => {
968
+ logger.error('Failed to compensate a superseded document vector publication', cleanupError);
969
+ return 0;
970
+ });
971
+ }
972
+ throw error;
973
+ }
974
+ }
340
975
  // Enhanced search with semantic similarity using embeddings
341
- async searchDocuments(query, userId, sessionId, limit = 5, collectionIds) {
342
- const preferences = preferencesService.getPreferences(userId);
976
+ async searchDocuments(query, userId, sessionId, limit = 5, collectionIds, signal) {
977
+ const spec = await this.captureEmbeddingExecutionSpec(userId);
343
978
  // Use semantic search if embeddings are enabled
344
- if (preferences.embeddingSettings.enabled) {
345
- return this.semanticSearchDocuments(query, userId, sessionId, limit, collectionIds);
979
+ if (spec.enabled) {
980
+ return this.semanticSearchDocuments(query, userId, sessionId, limit, collectionIds, spec, signal);
346
981
  }
347
982
  // Fall back to keyword search
348
- return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds);
983
+ return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds, signal);
349
984
  }
350
- async semanticSearchDocuments(query, userId, sessionId, limit = 5, collectionIds) {
985
+ async semanticSearchDocuments(query, userId, sessionId, limit = 5, collectionIds, spec, signal) {
351
986
  try {
987
+ const executionSpec = spec ?? (await this.captureEmbeddingExecutionSpec(userId));
352
988
  // Generate embedding for the query
353
- const queryEmbedding = await this.generateEmbeddingForText(query, userId);
989
+ const queryEmbedding = await this.generateEmbeddingForText(query, userId, executionSpec, signal);
354
990
  if (!queryEmbedding) {
355
991
  logger.warn('Failed to generate query embedding, falling back to keyword search');
356
- return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds);
357
- }
358
- const preferences = preferencesService.getPreferences(userId);
359
- const results = [];
360
- // Chunks without embeddings (uploaded while embeddings were off, or
361
- // whose embedding generation failed) would otherwise be invisible to
362
- // semantic search forever — exactly the "only my first document is
363
- // used" failure. They compete through keyword scoring instead.
992
+ return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds, signal);
993
+ }
994
+ const documents = (await storageService.getAllDocuments(userId)).filter(document => this.documentInScope(document, sessionId, collectionIds));
995
+ const platform = getPlatformStorageRuntime();
996
+ const chunksById = new Map();
364
997
  const unembedded = [];
365
- for (const document of storageService.getAllDocuments(userId)) {
366
- const documentChunks = this.loadDocumentChunks(document.id);
367
- if (!this.documentInScope(document, sessionId, collectionIds))
368
- continue;
369
- for (const chunk of documentChunks) {
370
- if (!chunk.embedding) {
371
- unembedded.push({ chunk, document });
372
- continue;
998
+ for (const document of documents) {
999
+ throwIfChatGenerationCancelled(signal);
1000
+ let searchableDocument = document;
1001
+ let documentChunks = await this.loadDocumentChunks(document.id);
1002
+ throwIfChatGenerationCancelled(signal);
1003
+ if (platform.dialect === 'sqlite' &&
1004
+ !hasValidDocumentIndexMetadata(searchableDocument)) {
1005
+ const upgraded = await this.upgradeLegacyDocumentIndex(searchableDocument, userId, executionSpec, signal);
1006
+ if (upgraded) {
1007
+ searchableDocument = upgraded.document;
1008
+ documentChunks = upgraded.chunks;
373
1009
  }
374
- const similarity = cosineSimilarity(queryEmbedding, chunk.embedding);
375
- // Only include chunks above similarity threshold
376
- if (similarity >= preferences.embeddingSettings.similarityThreshold) {
377
- results.push({ chunk, similarity, document });
1010
+ else {
1011
+ // A failed vector publication may still have durably published
1012
+ // current inline chunks. Reload so the exact-index repair below
1013
+ // can finish it in this same read; provider/busy failures retain
1014
+ // the original legacy chunks for keyword fallback.
1015
+ const latest = await platform.domains.documents.findByOwner(document.id, userId);
1016
+ if (!latest)
1017
+ continue;
1018
+ searchableDocument = latest;
1019
+ documentChunks = await this.loadDocumentChunks(latest.id);
378
1020
  }
379
1021
  }
1022
+ // SQLite may contain relationally published embeddings from a prior
1023
+ // process while its local vector table still needs publication. Only
1024
+ // publish a revision whose immutable model metadata proves it belongs
1025
+ // to this query spec, and serialize that mutation with regeneration
1026
+ // and deletion cleanup through the shared document resource lease.
1027
+ // PostgreSQL/team reads never mutate PGVector.
1028
+ const publishedIndex = readDocumentIndexMetadata(searchableDocument);
1029
+ const canProveCurrentEmbeddingModel = documentIndexMatchesSpec(publishedIndex, executionSpec);
1030
+ const localIndexProbe = platform.dialect === 'sqlite'
1031
+ ? exactLocalDocumentIndexProbe(searchableDocument, documentChunks, userId, executionSpec)
1032
+ : undefined;
1033
+ let localIndexReady = localIndexProbe !== undefined &&
1034
+ (await platform.vectorStore.hasExactResourceIndex(localIndexProbe));
1035
+ const needsLazyPublication = localIndexProbe !== undefined && !localIndexReady;
1036
+ if (platform.dialect === 'sqlite' &&
1037
+ localIndexProbe !== undefined &&
1038
+ needsLazyPublication) {
1039
+ let lease;
1040
+ try {
1041
+ lease = await acquireDocumentResourceLease(userId, document.id, signal, 0);
1042
+ await lease.assertHeld();
1043
+ const latest = await this.assertDocumentIndexAuthoritative(document.id, userId, publishedIndex.aggregateRevision);
1044
+ const latestChunks = await this.loadDocumentChunks(document.id);
1045
+ const latestProbe = exactLocalDocumentIndexProbe(latest, latestChunks, userId, executionSpec);
1046
+ if (!latestProbe)
1047
+ throw new DocumentIndexSupersededError();
1048
+ const latestIndexReady = await platform.vectorStore.hasExactResourceIndex(latestProbe);
1049
+ if (!latestIndexReady) {
1050
+ await this.indexDocumentChunks(latest, latestChunks, userId, executionSpec, 1, signal, () => lease.assertHeld());
1051
+ }
1052
+ localIndexReady = true;
1053
+ searchableDocument = latest;
1054
+ documentChunks = latestChunks;
1055
+ }
1056
+ catch (error) {
1057
+ if (!(error instanceof DocumentResourceBusyError) &&
1058
+ !(error instanceof DocumentIndexSupersededError)) {
1059
+ throw error;
1060
+ }
1061
+ // A writer owns the resource or replaced/deleted this revision.
1062
+ // Skip the optional lazy publication; keyword fallback remains
1063
+ // available and the next query reloads authoritative state.
1064
+ }
1065
+ finally {
1066
+ await lease?.release().catch(() => false);
1067
+ }
1068
+ }
1069
+ for (const chunk of documentChunks) {
1070
+ // PostgreSQL deliberately keeps embeddings only in PGVector, so a
1071
+ // relational chunk without an `embedding` property can still be the
1072
+ // authoritative content for a vector hit. Always make every current
1073
+ // relational chunk available for hit hydration. Metadata tells us
1074
+ // whether an absent inline embedding means "stored externally" or
1075
+ // whether this chunk genuinely needs keyword fallback.
1076
+ chunksById.set(chunk.id, {
1077
+ chunk,
1078
+ document: searchableDocument,
1079
+ });
1080
+ const indexedForSemanticQuery = canProveCurrentEmbeddingModel &&
1081
+ publishedIndex !== undefined &&
1082
+ publishedIndex.dimensions !== null &&
1083
+ (platform.dialect === 'postgres' || localIndexReady);
1084
+ if (!indexedForSemanticQuery) {
1085
+ unembedded.push({ chunk, document: searchableDocument });
1086
+ }
1087
+ }
1088
+ }
1089
+ const resourceIds = documents.map(document => document.id);
1090
+ const hits = [];
1091
+ for (let offset = 0; offset < resourceIds.length; offset += MAX_VECTOR_RESOURCE_FILTERS) {
1092
+ throwIfChatGenerationCancelled(signal);
1093
+ hits.push(...(await platform.vectorStore.query({
1094
+ actor: { userId },
1095
+ namespace: DOCUMENT_VECTOR_NAMESPACE,
1096
+ model: executionSpec.model,
1097
+ dimensions: queryEmbedding.length,
1098
+ version: executionSpec.version,
1099
+ embedding: queryEmbedding,
1100
+ limit,
1101
+ minScore: executionSpec.similarityThreshold,
1102
+ resourceIds: resourceIds.slice(offset, offset + MAX_VECTOR_RESOURCE_FILTERS),
1103
+ })));
1104
+ throwIfChatGenerationCancelled(signal);
1105
+ }
1106
+ hits.sort((left, right) => right.score - left.score ||
1107
+ left.ownerUserId.localeCompare(right.ownerUserId) ||
1108
+ left.id.localeCompare(right.id));
1109
+ const top = [];
1110
+ const selectedChunkIds = new Set();
1111
+ for (const hit of hits) {
1112
+ if (top.length >= limit)
1113
+ break;
1114
+ const match = chunksById.get(hit.id);
1115
+ if (!match ||
1116
+ match.document.id !== hit.resourceId ||
1117
+ sourceRevision(match.chunk) !== hit.sourceRevision ||
1118
+ selectedChunkIds.has(match.chunk.id)) {
1119
+ continue;
1120
+ }
1121
+ top.push({
1122
+ ...match.chunk,
1123
+ filename: match.document.filename,
1124
+ });
1125
+ selectedChunkIds.add(match.chunk.id);
380
1126
  }
381
- const top = results
382
- .sort((a, b) => b.similarity - a.similarity)
383
- .slice(0, limit)
384
- .map(result => ({
385
- ...result.chunk,
386
- filename: result.document.filename, // Add filename for context
387
- }));
388
1127
  if (top.length < limit && unembedded.length > 0) {
389
1128
  const scored = this.scoreChunksByKeywords(query, unembedded);
390
1129
  for (const entry of scored) {
391
1130
  if (top.length >= limit)
392
1131
  break;
1132
+ if (selectedChunkIds.has(entry.chunk.id))
1133
+ continue;
393
1134
  top.push({
394
1135
  ...entry.chunk,
395
1136
  filename: entry.document.filename,
396
1137
  });
1138
+ selectedChunkIds.add(entry.chunk.id);
397
1139
  }
398
1140
  }
399
1141
  if (top.length > 0)
400
1142
  return top;
401
1143
  // Nothing cleared the similarity threshold: keyword search is a
402
1144
  // better answer than an empty context.
403
- return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds);
1145
+ return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds, signal);
404
1146
  }
405
1147
  catch (error) {
1148
+ if (signal?.aborted)
1149
+ throw error;
406
1150
  logger.error('Semantic search failed, falling back to keyword search:', error);
407
- return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds);
1151
+ return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds, signal);
408
1152
  }
409
1153
  }
410
1154
  /** Term-frequency scores for a set of chunks, best first. */
@@ -427,16 +1171,20 @@ class DocumentService {
427
1171
  }
428
1172
  return scored.sort((a, b) => b.score - a.score);
429
1173
  }
430
- keywordSearchDocuments(query, userId, sessionId, limit = 5, collectionIds) {
1174
+ async keywordSearchDocuments(query, userId, sessionId, limit = 5, collectionIds, signal) {
431
1175
  const candidates = [];
432
- for (const document of storageService.getAllDocuments(userId)) {
433
- const documentChunks = this.loadDocumentChunks(document.id);
1176
+ throwIfChatGenerationCancelled(signal);
1177
+ for (const document of await storageService.getAllDocuments(userId)) {
1178
+ throwIfChatGenerationCancelled(signal);
1179
+ const documentChunks = await this.loadDocumentChunks(document.id);
1180
+ throwIfChatGenerationCancelled(signal);
434
1181
  if (!this.documentInScope(document, sessionId, collectionIds))
435
1182
  continue;
436
1183
  for (const chunk of documentChunks) {
437
1184
  candidates.push({ chunk, document });
438
1185
  }
439
1186
  }
1187
+ throwIfChatGenerationCancelled(signal);
440
1188
  const results = this.scoreChunksByKeywords(query, candidates);
441
1189
  return results.slice(0, limit).map(result => ({
442
1190
  ...result.chunk,
@@ -452,12 +1200,10 @@ class DocumentService {
452
1200
  });
453
1201
  }
454
1202
  // Restore a document from import (used during data import)
455
- restoreDocument(document, userId) {
1203
+ async restoreDocument(document, userId) {
456
1204
  try {
457
- // Add to memory
458
- this.documents.set(document.id, document);
459
1205
  // Save to storage
460
- storageService.saveDocument(document, userId);
1206
+ await storageService.saveDocument(document, userId);
461
1207
  // If there are any chunks with this document, they'll be handled separately
462
1208
  logger.debug(`Restored document: ${document.filename} (${document.id})`);
463
1209
  }
@@ -466,13 +1212,12 @@ class DocumentService {
466
1212
  throw new Error(`Failed to restore document: ${error instanceof Error ? error.message : 'Unknown error'}`);
467
1213
  }
468
1214
  }
469
- loadDocumentChunks(documentId) {
470
- const cached = this.chunks.get(documentId);
471
- if (cached)
472
- return cached;
473
- const chunks = storageService.getDocumentChunks(documentId);
474
- this.chunks.set(documentId, chunks);
475
- return chunks;
1215
+ async loadDocumentChunks(documentId) {
1216
+ // Relational storage is authoritative. In team mode another replica's
1217
+ // durable worker can complete or replace chunks after this process first
1218
+ // observes a queued document; caching [] (or an older revision) forever
1219
+ // makes that completion invisible and can drive a stale vector backfill.
1220
+ return storageService.getDocumentChunks(documentId);
476
1221
  }
477
1222
  }
478
1223
  export default new DocumentService();