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
@@ -15,11 +15,13 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  import { v4 as uuidv4 } from 'uuid';
18
- import { getDatabase } from '../db.js';
18
+ import { getWorkPersistence, replaceWorkTextNul, WorkPersistenceError, } from '../platform/workPersistence/index.js';
19
+ import { transactionalWorkExecutionEnqueuer } from '../platform/jobs/workExecutionEnqueuer.js';
20
+ import { WORK_EXECUTE_IDEMPOTENCY_SCOPE, WORK_EXECUTE_JOB_TYPE, } from '../platform/jobs/domainJobContracts.js';
21
+ import { getDurableJobRuntime } from '../platform/jobs/durableJobRuntime.js';
19
22
  import { createLogger } from '../utils/logger.js';
23
+ import { getCoordinator } from '../platform/coordination/service.js';
20
24
  const logger = createLogger('services:work-task');
21
- const ACTIVE_RUN_STATUSES = ['queued', 'preparing', 'running'];
22
- const ACTIVE_PREVIEW_STATUSES = ['starting', 'running'];
23
25
  export const WORK_MESSAGE_PAGE_SIZE = 200;
24
26
  export const WORK_MESSAGE_MAX_BYTES = 100000;
25
27
  export const WORK_MESSAGE_METADATA_MAX_BYTES = 100000;
@@ -45,100 +47,284 @@ export class WorkTaskService {
45
47
  this.retiringTasks = new Set();
46
48
  this.networkPolicyChanges = new Set();
47
49
  }
48
- createTaskWithRun(userId, message, model, networkEnabled, provider = { providerType: 'ollama' }, hostPath, policyId) {
49
- this.assertUserIsActive(userId);
50
+ async resolveExecutionPublication(expectedTask, expectedRun, expectedMessage, taskMayPreexist = false) {
51
+ try {
52
+ const persistence = getWorkPersistence();
53
+ const [task, run, messages, job] = await Promise.all([
54
+ persistence.findTask(expectedTask.id, expectedTask.user_id),
55
+ persistence.findRun(expectedRun.id),
56
+ persistence.listMessages({ taskId: expectedTask.id, mode: 'all' }),
57
+ getDurableJobRuntime().service.getByIdempotency(expectedTask.user_id, WORK_EXECUTE_IDEMPOTENCY_SCOPE, expectedRun.id),
58
+ ]);
59
+ const message = messages.find(row => row.id === expectedMessage.id);
60
+ if (!run && !message && !job && (taskMayPreexist || !task)) {
61
+ return 'absent';
62
+ }
63
+ const exactTask = task?.id === expectedTask.id &&
64
+ task.user_id === expectedTask.user_id &&
65
+ task.title === expectedTask.title &&
66
+ task.model === expectedTask.model &&
67
+ task.provider_type === expectedTask.provider_type &&
68
+ task.provider_id === expectedTask.provider_id &&
69
+ task.network_enabled === expectedTask.network_enabled &&
70
+ task.volume_name === expectedTask.volume_name &&
71
+ task.container_name === expectedTask.container_name &&
72
+ task.host_path === expectedTask.host_path &&
73
+ task.policy_id === expectedTask.policy_id &&
74
+ task.created_at === expectedTask.created_at;
75
+ const exactRun = run?.id === expectedRun.id &&
76
+ run.task_id === expectedRun.task_id &&
77
+ run.model === expectedRun.model &&
78
+ run.provider_type === expectedRun.provider_type &&
79
+ run.provider_id === expectedRun.provider_id &&
80
+ run.created_at === expectedRun.created_at;
81
+ const exactMessage = message?.id === expectedMessage.id &&
82
+ message.task_id === expectedMessage.task_id &&
83
+ message.run_id === expectedMessage.run_id &&
84
+ message.role === expectedMessage.role &&
85
+ message.kind === expectedMessage.kind &&
86
+ message.content === expectedMessage.content &&
87
+ message.metadata === expectedMessage.metadata &&
88
+ message.created_at === expectedMessage.created_at;
89
+ const exactJob = job?.jobType === WORK_EXECUTE_JOB_TYPE &&
90
+ job.actorUserId === expectedTask.user_id;
91
+ return exactTask && exactRun && exactMessage && exactJob
92
+ ? 'committed'
93
+ : 'ambiguous';
94
+ }
95
+ catch {
96
+ return 'ambiguous';
97
+ }
98
+ }
99
+ async withUserLifecycleLease(userId, operation) {
100
+ const coordinator = getCoordinator();
101
+ const deadline = Date.now() + 10000;
102
+ let lease = await coordinator.acquireLease(`work-user-lifecycle:${userId}`, 60000);
103
+ while (!lease && Date.now() < deadline) {
104
+ await new Promise(resolve => setTimeout(resolve, 25));
105
+ lease = await coordinator.acquireLease(`work-user-lifecycle:${userId}`, 60000);
106
+ }
107
+ if (!lease) {
108
+ throw new WorkConflictError('This user already has a Work lifecycle operation in progress.');
109
+ }
110
+ let closed = false;
111
+ let leaseLost = false;
112
+ let renewalTimer;
113
+ const leaseLostError = () => new WorkConflictError('The shared Work lifecycle lease was lost.');
114
+ const markLost = () => {
115
+ leaseLost = true;
116
+ };
117
+ const assertHeld = async () => {
118
+ if (closed || leaseLost)
119
+ throw leaseLostError();
120
+ try {
121
+ if (await lease.extend(60000))
122
+ return;
123
+ }
124
+ catch {
125
+ // Report expiry and coordination outages through one safe fence.
126
+ }
127
+ markLost();
128
+ throw leaseLostError();
129
+ };
130
+ const renew = async () => {
131
+ if (closed)
132
+ return;
133
+ try {
134
+ if (!(await lease.extend(60000)))
135
+ markLost();
136
+ }
137
+ catch {
138
+ markLost();
139
+ }
140
+ if (!closed && !leaseLost)
141
+ renewalTimer = setTimeout(renew, 20000);
142
+ };
143
+ renewalTimer = setTimeout(renew, 20000);
144
+ try {
145
+ await assertHeld();
146
+ const result = await operation(assertHeld);
147
+ return result;
148
+ }
149
+ finally {
150
+ closed = true;
151
+ if (renewalTimer)
152
+ clearTimeout(renewalTimer);
153
+ await lease.release().catch(() => false);
154
+ }
155
+ }
156
+ async createTaskWithRun(userId, message, model, networkEnabled, provider = { providerType: 'ollama' }, hostPath, policyId) {
157
+ return this.withUserLifecycleLease(userId, assertHeld => this.createTaskWithRunWithLeaseHeld(userId, message, model, networkEnabled, provider, hostPath, policyId, assertHeld));
158
+ }
159
+ async createTaskWithRunWithLeaseHeld(userId, message, model, networkEnabled, provider, hostPath, policyId, assertHeld = async () => undefined) {
160
+ await this.assertUserIsActive(userId);
50
161
  const selectedProvider = normalizeProvider(provider);
51
- const db = getDatabase();
52
162
  const taskId = uuidv4();
53
163
  const runId = uuidv4();
54
164
  const messageId = uuidv4();
55
165
  const compactId = taskId.replace(/-/g, '');
56
166
  const now = Date.now();
57
167
  const title = deriveTitle(message);
58
- const transaction = db.transaction(() => {
59
- this.assertTaskAdmission(userId);
60
- this.assertRuntimeAdmission(userId);
61
- db.prepare(`INSERT INTO work_tasks (
62
- id, user_id, title, model, provider_type, provider_id, status,
63
- network_enabled, volume_name, container_name, host_path, policy_id,
64
- preview_status, created_at, updated_at
65
- ) VALUES (?, ?, ?, ?, ?, ?, 'preparing', ?, ?, ?, ?, ?, 'stopped', ?, ?)`).run(taskId, userId, title, model, selectedProvider.providerType, selectedProvider.providerId || null, networkEnabled ? 1 : 0, `libre-work-${compactId}`, `libre-work-${compactId}`, hostPath || null, policyId || null, now, now);
66
- db.prepare(`INSERT INTO work_runs (
67
- id, task_id, model, provider_type, provider_id, status, created_at
68
- ) VALUES (?, ?, ?, ?, ?, 'queued', ?)`).run(runId, taskId, model, selectedProvider.providerType, selectedProvider.providerId || null, now);
69
- db.prepare(`INSERT INTO work_messages (
70
- id, task_id, run_id, role, kind, content, message_index, created_at
71
- ) VALUES (?, ?, ?, 'user', 'message', ?, 0, ?)`).run(messageId, taskId, runId, message, now);
72
- });
73
- transaction();
168
+ const selectedModel = cleanRequired(model);
169
+ const taskRow = {
170
+ id: taskId,
171
+ user_id: userId,
172
+ title,
173
+ model: selectedModel,
174
+ provider_type: selectedProvider.providerType,
175
+ provider_id: selectedProvider.providerId || null,
176
+ status: 'preparing',
177
+ network_enabled: networkEnabled ? 1 : 0,
178
+ volume_name: `libre-work-${compactId}`,
179
+ container_name: `libre-work-${compactId}`,
180
+ host_path: hostPath || null,
181
+ policy_id: policyId || null,
182
+ preview_url: null,
183
+ preview_status: 'stopped',
184
+ preview_upstream_host: null,
185
+ preview_upstream_port: null,
186
+ created_at: now,
187
+ updated_at: now,
188
+ };
189
+ const runRow = {
190
+ id: runId,
191
+ task_id: taskId,
192
+ model: selectedModel,
193
+ provider_type: selectedProvider.providerType,
194
+ provider_id: selectedProvider.providerId || null,
195
+ status: 'queued',
196
+ error: null,
197
+ created_at: now,
198
+ started_at: null,
199
+ finished_at: null,
200
+ };
201
+ const messageRow = {
202
+ id: messageId,
203
+ task_id: taskId,
204
+ run_id: runId,
205
+ role: 'user',
206
+ kind: 'message',
207
+ content: message,
208
+ metadata: null,
209
+ message_index: 0,
210
+ created_at: now,
211
+ };
212
+ try {
213
+ await assertHeld();
214
+ await getWorkPersistence().createTaskWithRun({
215
+ task: taskRow,
216
+ run: runRow,
217
+ message: messageRow,
218
+ limits: workAdmissionLimits,
219
+ }, transactionalWorkExecutionEnqueuer, assertHeld);
220
+ }
221
+ catch (error) {
222
+ const outcome = await this.resolveExecutionPublication(taskRow, runRow, messageRow);
223
+ if (outcome === 'committed') {
224
+ return this.requireTaskDetail(taskId, userId);
225
+ }
226
+ if (outcome === 'ambiguous') {
227
+ throw new WorkConflictError('The Work task publication outcome is ambiguous. Reload before retrying.');
228
+ }
229
+ throw translatePersistenceError(error);
230
+ }
74
231
  return this.requireTaskDetail(taskId, userId);
75
232
  }
76
- createRun(taskId, userId, message, model, provider) {
77
- const task = this.requireMutableTaskRecord(taskId, userId);
78
- if (this.getActiveRun(taskId)) {
233
+ async createRun(taskId, userId, message, model, provider) {
234
+ return this.withUserLifecycleLease(userId, assertHeld => this.createRunWithLeaseHeld(taskId, userId, message, model, provider, assertHeld));
235
+ }
236
+ async createRunWithLeaseHeld(taskId, userId, message, model, provider, assertHeld = async () => undefined) {
237
+ const task = await this.requireMutableTaskRecord(taskId, userId);
238
+ if (await this.getActiveRun(taskId)) {
79
239
  throw new WorkConflictError('This Work task already has an active run.');
80
240
  }
81
- const db = getDatabase();
82
241
  const runId = uuidv4();
83
242
  const messageId = uuidv4();
84
- const selectedModel = model?.trim() || task.model;
243
+ const selectedModel = model === undefined ? task.model : cleanRequired(model);
85
244
  const selectedProvider = normalizeProvider(provider || {
86
245
  providerType: task.providerType,
87
246
  providerId: task.providerId,
88
247
  });
89
248
  const now = Date.now();
90
- const transaction = db.transaction(() => {
91
- if (this.getActiveRun(taskId)) {
92
- throw new WorkConflictError('This Work task already has an active run.');
249
+ const runRow = {
250
+ id: runId,
251
+ task_id: taskId,
252
+ model: selectedModel,
253
+ provider_type: selectedProvider.providerType,
254
+ provider_id: selectedProvider.providerId || null,
255
+ status: 'queued',
256
+ error: null,
257
+ created_at: now,
258
+ started_at: null,
259
+ finished_at: null,
260
+ };
261
+ const messageRow = {
262
+ id: messageId,
263
+ task_id: taskId,
264
+ run_id: runId,
265
+ role: 'user',
266
+ kind: 'message',
267
+ content: message,
268
+ metadata: null,
269
+ message_index: 0,
270
+ created_at: now,
271
+ };
272
+ try {
273
+ await assertHeld();
274
+ await getWorkPersistence().createRun({
275
+ taskId,
276
+ userId,
277
+ run: runRow,
278
+ message: messageRow,
279
+ limits: workAdmissionLimits,
280
+ }, transactionalWorkExecutionEnqueuer, assertHeld);
281
+ }
282
+ catch (error) {
283
+ const expectedTask = {
284
+ id: task.id,
285
+ user_id: task.userId,
286
+ title: task.title,
287
+ model: selectedModel,
288
+ provider_type: selectedProvider.providerType,
289
+ provider_id: selectedProvider.providerId || null,
290
+ status: 'preparing',
291
+ network_enabled: task.networkEnabled ? 1 : 0,
292
+ volume_name: task.volumeName,
293
+ container_name: task.containerName,
294
+ host_path: task.hostPath || null,
295
+ policy_id: task.policyId || null,
296
+ preview_url: task.previewUrl || null,
297
+ preview_status: task.previewStatus,
298
+ preview_upstream_host: task.previewUpstreamHost || null,
299
+ preview_upstream_port: task.previewUpstreamPort || null,
300
+ created_at: task.createdAt,
301
+ updated_at: task.updatedAt,
302
+ };
303
+ const outcome = await this.resolveExecutionPublication(expectedTask, runRow, messageRow, true);
304
+ if (outcome === 'committed') {
305
+ return this.requireTaskDetail(taskId, userId);
93
306
  }
94
- if (ACTIVE_PREVIEW_STATUSES.includes(task.previewStatus)) {
95
- throw new WorkConflictError('Stop this Work task preview before starting another run.');
307
+ if (outcome === 'ambiguous') {
308
+ throw new WorkConflictError('The Work run publication outcome is ambiguous. Reload before retrying.');
96
309
  }
97
- this.assertRuntimeAdmission(userId, taskId);
98
- const nextIndex = this.nextMessageIndex(taskId);
99
- db.prepare(`INSERT INTO work_runs (
100
- id, task_id, model, provider_type, provider_id, status, created_at
101
- ) VALUES (?, ?, ?, ?, ?, 'queued', ?)`).run(runId, taskId, selectedModel, selectedProvider.providerType, selectedProvider.providerId || null, now);
102
- db.prepare(`INSERT INTO work_messages (
103
- id, task_id, run_id, role, kind, content, message_index, created_at
104
- ) VALUES (?, ?, ?, 'user', 'message', ?, ?, ?)`).run(messageId, taskId, runId, message, nextIndex, now);
105
- db.prepare(`UPDATE work_tasks
106
- SET model = ?, provider_type = ?, provider_id = ?,
107
- status = 'preparing', updated_at = ?
108
- WHERE id = ?`).run(selectedModel, selectedProvider.providerType, selectedProvider.providerId || null, now, taskId);
109
- });
110
- transaction();
310
+ throw translatePersistenceError(error);
311
+ }
111
312
  return this.requireTaskDetail(taskId, userId);
112
313
  }
113
- listTasks(userId) {
114
- const rows = getDatabase()
115
- .prepare(`SELECT * FROM work_tasks
116
- WHERE user_id = ?
117
- ORDER BY updated_at DESC`)
118
- .all(userId);
119
- return rows.map(row => this.summaryFromRow(row));
120
- }
121
- listTaskRecords(userId) {
122
- const rows = getDatabase()
123
- .prepare(`SELECT * FROM work_tasks
124
- WHERE user_id = ?
125
- ORDER BY created_at ASC`)
126
- .all(userId);
314
+ async listTasks(userId) {
315
+ const rows = await getWorkPersistence().listTasks(userId);
316
+ return Promise.all(rows.map(row => this.summaryFromRow(row)));
317
+ }
318
+ async listTaskRecords(userId) {
319
+ const rows = await getWorkPersistence().listTaskRecords(userId);
127
320
  return rows.map(mapTaskRecord);
128
321
  }
129
- listAllTaskRecords() {
130
- return getDatabase()
131
- .prepare('SELECT * FROM work_tasks ORDER BY created_at ASC')
132
- .all().map(mapTaskRecord);
322
+ async listAllTaskRecords() {
323
+ return (await getWorkPersistence().listTaskRecords()).map(mapTaskRecord);
133
324
  }
134
325
  /** Every task with its owner's username, for the admin overview. */
135
- listAllTasksWithOwner() {
136
- const rows = getDatabase()
137
- .prepare(`SELECT work_tasks.*, users.username AS owner_username
138
- FROM work_tasks
139
- JOIN users ON users.id = work_tasks.user_id
140
- ORDER BY work_tasks.updated_at DESC`)
141
- .all();
326
+ async listAllTasksWithOwner() {
327
+ const rows = await getWorkPersistence().listTasksWithOwners();
142
328
  return rows.map(row => ({
143
329
  record: mapTaskRecord(row),
144
330
  ownerUsername: row.owner_username,
@@ -153,11 +339,11 @@ export class WorkTaskService {
153
339
  releaseUserRetirement(userId) {
154
340
  this.retiringUsers.delete(userId);
155
341
  }
156
- beginTaskRetirement(taskId, userId, allowRetiringUser = false) {
342
+ async beginTaskRetirement(taskId, userId, allowRetiringUser = false) {
157
343
  if (!allowRetiringUser) {
158
- this.assertUserIsActive(userId);
344
+ await this.assertUserIsActive(userId);
159
345
  }
160
- const task = this.requireTaskRecord(taskId, userId);
346
+ const task = await this.requireTaskRecord(taskId, userId);
161
347
  this.assertNetworkPolicyStable(taskId);
162
348
  if (this.retiringTasks.has(taskId)) {
163
349
  throw new WorkConflictError('This Work task is already being deleted.');
@@ -171,24 +357,21 @@ export class WorkTaskService {
171
357
  finalizeTaskRetirement(taskId) {
172
358
  this.retiringTasks.delete(taskId);
173
359
  }
174
- requireMutableTaskRecord(taskId, userId) {
175
- this.assertUserIsActive(userId);
176
- const task = this.requireTaskRecord(taskId, userId);
360
+ async requireMutableTaskRecord(taskId, userId) {
361
+ await this.assertUserIsActive(userId);
362
+ const task = await this.requireTaskRecord(taskId, userId);
177
363
  this.assertTaskIsActive(taskId);
178
364
  this.assertNetworkPolicyStable(taskId);
179
365
  return task;
180
366
  }
181
- assertTaskMutationAllowed(taskId, userId) {
182
- this.requireMutableTaskRecord(taskId, userId);
367
+ async assertTaskMutationAllowed(taskId, userId) {
368
+ await this.requireMutableTaskRecord(taskId, userId);
183
369
  }
184
- assertUserIsActive(userId) {
370
+ async assertUserIsActive(userId) {
185
371
  if (this.retiringUsers.has(userId)) {
186
372
  throw new WorkConflictError('This user is being deleted.');
187
373
  }
188
- const current = getDatabase()
189
- .prepare('SELECT role FROM users WHERE id = ?')
190
- .get(userId);
191
- if (current?.role !== 'admin') {
374
+ if (!(await getWorkPersistence().userCanUseWork(userId))) {
192
375
  throw new WorkForbiddenError();
193
376
  }
194
377
  }
@@ -202,9 +385,9 @@ export class WorkTaskService {
202
385
  throw new WorkConflictError('This Work task network policy is being changed.');
203
386
  }
204
387
  }
205
- beginNetworkPolicyChange(taskId, userId) {
206
- const task = this.requireMutableTaskRecord(taskId, userId);
207
- if (this.getActiveRun(taskId)) {
388
+ async beginNetworkPolicyChange(taskId, userId) {
389
+ const task = await this.requireMutableTaskRecord(taskId, userId);
390
+ if (await this.getActiveRun(taskId)) {
208
391
  throw new WorkConflictError('Network access cannot be changed during an active run.');
209
392
  }
210
393
  this.networkPolicyChanges.add(taskId);
@@ -213,47 +396,48 @@ export class WorkTaskService {
213
396
  releaseNetworkPolicyChange(taskId) {
214
397
  this.networkPolicyChanges.delete(taskId);
215
398
  }
216
- beginPreview(taskId, userId, allowActiveRun = false) {
217
- const transaction = getDatabase().transaction(() => {
218
- const task = this.requireMutableTaskRecord(taskId, userId);
219
- const activeRun = this.getActiveRun(taskId);
220
- if (activeRun && !allowActiveRun) {
221
- throw new WorkConflictError('Wait for the active Work run to finish before starting a preview.');
222
- }
223
- this.assertRuntimeAdmission(userId, taskId);
224
- if (!ACTIVE_PREVIEW_STATUSES.includes(task.previewStatus)) {
225
- this.updatePreview(taskId, 'starting');
226
- }
227
- });
228
- transaction();
399
+ async beginPreview(taskId, userId, allowActiveRun = false) {
400
+ await this.requireMutableTaskRecord(taskId, userId);
401
+ try {
402
+ await getWorkPersistence().beginPreview({
403
+ taskId,
404
+ userId,
405
+ allowActiveRun,
406
+ limits: workAdmissionLimits,
407
+ updatedAt: Date.now(),
408
+ });
409
+ }
410
+ catch (error) {
411
+ throw translatePersistenceError(error, true);
412
+ }
229
413
  }
230
- getTaskDetail(taskId, userId) {
231
- const row = this.getTaskRow(taskId, userId);
414
+ async getTaskDetail(taskId, userId) {
415
+ const row = await getWorkPersistence().findTask(taskId, userId);
232
416
  return row ? this.detailFromRow(row) : undefined;
233
417
  }
234
- requireTaskDetail(taskId, userId) {
235
- const task = this.getTaskDetail(taskId, userId);
418
+ async requireTaskDetail(taskId, userId) {
419
+ const task = await this.getTaskDetail(taskId, userId);
236
420
  if (!task) {
237
421
  throw new WorkNotFoundError();
238
422
  }
239
423
  return task;
240
424
  }
241
- getTaskRecord(taskId, userId) {
242
- const row = this.getTaskRow(taskId, userId);
425
+ async getTaskRecord(taskId, userId) {
426
+ const row = await getWorkPersistence().findTask(taskId, userId);
243
427
  return row ? mapTaskRecord(row) : undefined;
244
428
  }
245
- requireTaskRecord(taskId, userId) {
246
- const task = this.getTaskRecord(taskId, userId);
429
+ async requireTaskRecord(taskId, userId) {
430
+ const task = await this.getTaskRecord(taskId, userId);
247
431
  if (!task) {
248
432
  throw new WorkNotFoundError();
249
433
  }
250
434
  return task;
251
435
  }
252
- updateTask(taskId, userId, updates) {
253
- const task = this.requireMutableTaskRecord(taskId, userId);
436
+ async updateTask(taskId, userId, updates) {
437
+ const task = await this.requireMutableTaskRecord(taskId, userId);
254
438
  if (updates.networkEnabled !== undefined &&
255
439
  updates.networkEnabled !== task.networkEnabled &&
256
- this.getActiveRun(taskId)) {
440
+ (await this.getActiveRun(taskId))) {
257
441
  throw new WorkConflictError('Network access cannot be changed during an active run.');
258
442
  }
259
443
  const title = updates.title === undefined ? task.title : cleanTitle(updates.title);
@@ -267,23 +451,32 @@ export class WorkTaskService {
267
451
  : updates.providerId,
268
452
  });
269
453
  const networkEnabled = updates.networkEnabled ?? task.networkEnabled;
270
- getDatabase()
271
- .prepare(`UPDATE work_tasks
272
- SET title = ?, model = ?, provider_type = ?, provider_id = ?,
273
- network_enabled = ?, updated_at = ?
274
- WHERE id = ? AND user_id = ?`)
275
- .run(title, model, provider.providerType, provider.providerId || null, networkEnabled ? 1 : 0, Date.now(), taskId, userId);
454
+ try {
455
+ await getWorkPersistence().updateTask({
456
+ taskId,
457
+ userId,
458
+ title,
459
+ model,
460
+ providerType: provider.providerType,
461
+ providerId: provider.providerId || null,
462
+ networkEnabled,
463
+ updatedAt: Date.now(),
464
+ });
465
+ }
466
+ catch (error) {
467
+ throw translatePersistenceError(error);
468
+ }
276
469
  return this.requireTaskDetail(taskId, userId);
277
470
  }
278
- commitNetworkChange(taskId, userId, updates) {
279
- this.assertUserIsActive(userId);
280
- const task = this.requireTaskRecord(taskId, userId);
471
+ async commitNetworkChange(taskId, userId, updates) {
472
+ await this.assertUserIsActive(userId);
473
+ const task = await this.requireTaskRecord(taskId, userId);
281
474
  this.assertTaskIsActive(taskId);
282
475
  if (!this.networkPolicyChanges.has(taskId)) {
283
476
  throw new WorkConflictError('This Work task has no active network policy change.');
284
477
  }
285
478
  if (updates.networkEnabled !== task.networkEnabled &&
286
- this.getActiveRun(taskId)) {
479
+ (await this.getActiveRun(taskId))) {
287
480
  throw new WorkConflictError('Network access cannot be changed during an active run.');
288
481
  }
289
482
  const title = updates.title === undefined ? task.title : cleanTitle(updates.title);
@@ -296,86 +489,45 @@ export class WorkTaskService {
296
489
  ? task.providerId
297
490
  : updates.providerId,
298
491
  });
299
- const networkChanged = updates.networkEnabled !== task.networkEnabled;
300
- getDatabase()
301
- .prepare(`UPDATE work_tasks
302
- SET title = ?, model = ?, provider_type = ?, provider_id = ?,
303
- network_enabled = ?,
304
- preview_status = CASE
305
- WHEN ? = 1 THEN 'stopped'
306
- ELSE preview_status
307
- END,
308
- preview_url = CASE
309
- WHEN ? = 1 THEN NULL
310
- ELSE preview_url
311
- END,
312
- updated_at = ?
313
- WHERE id = ? AND user_id = ?`)
314
- .run(title, model, provider.providerType, provider.providerId || null, updates.networkEnabled ? 1 : 0, networkChanged ? 1 : 0, networkChanged ? 1 : 0, Date.now(), taskId, userId);
315
- }
316
- assertTaskAdmission(userId) {
317
- const counts = getDatabase()
318
- .prepare(`SELECT
319
- COUNT(*) AS total,
320
- COALESCE(SUM(CASE WHEN user_id = ? THEN 1 ELSE 0 END), 0) AS per_user
321
- FROM work_tasks`)
322
- .get(userId);
323
- if (counts.per_user >= workAdmissionLimits.maxTasksPerUser) {
324
- throw new WorkAdmissionError(`This administrator already has the maximum of ${workAdmissionLimits.maxTasksPerUser} Work tasks.`, 'WORK_USER_TASK_LIMIT');
325
- }
326
- if (counts.total >= workAdmissionLimits.maxTasksGlobal) {
327
- throw new WorkAdmissionError(`This Libre WebUI instance already has the maximum of ${workAdmissionLimits.maxTasksGlobal} Work tasks.`, 'WORK_GLOBAL_TASK_LIMIT');
328
- }
329
- }
330
- assertRuntimeAdmission(userId, taskId) {
331
- const activeRunPlaceholders = ACTIVE_RUN_STATUSES.map(() => '?').join(', ');
332
- const activePreviewPlaceholders = ACTIVE_PREVIEW_STATUSES.map(() => '?').join(', ');
333
- const counts = getDatabase()
334
- .prepare(`WITH active_tasks AS (
335
- SELECT DISTINCT work_tasks.id AS task_id, work_tasks.user_id
336
- FROM work_tasks
337
- JOIN work_runs ON work_runs.task_id = work_tasks.id
338
- WHERE work_runs.status IN (${activeRunPlaceholders})
339
- UNION
340
- SELECT id AS task_id, user_id
341
- FROM work_tasks
342
- WHERE preview_status IN (${activePreviewPlaceholders})
343
- )
344
- SELECT
345
- COUNT(*) AS total,
346
- COALESCE(SUM(CASE WHEN user_id = ? THEN 1 ELSE 0 END), 0) AS per_user
347
- FROM active_tasks
348
- WHERE ? IS NULL OR task_id != ?`)
349
- .get(...ACTIVE_RUN_STATUSES, ...ACTIVE_PREVIEW_STATUSES, userId, taskId || null, taskId || null);
350
- if (counts.per_user >= workAdmissionLimits.maxActiveRuntimesPerUser) {
351
- throw new WorkAdmissionError(`This administrator already has ${workAdmissionLimits.maxActiveRuntimesPerUser} active Work runtime(s). Wait for a run or preview to stop.`, 'WORK_USER_RUNTIME_LIMIT');
352
- }
353
- if (counts.total >= workAdmissionLimits.maxActiveRuntimesGlobal) {
354
- throw new WorkAdmissionError(`This Libre WebUI instance already has ${workAdmissionLimits.maxActiveRuntimesGlobal} active Work runtime(s). Wait for a run or preview to stop.`, 'WORK_GLOBAL_RUNTIME_LIMIT');
355
- }
356
- }
357
- deleteTask(taskId, userId) {
358
- const task = this.requireTaskRecord(taskId, userId);
359
- const result = getDatabase()
360
- .prepare('DELETE FROM work_tasks WHERE id = ? AND user_id = ?')
361
- .run(taskId, userId);
362
- if (!result.changes) {
492
+ try {
493
+ await getWorkPersistence().updateTask({
494
+ taskId,
495
+ userId,
496
+ title,
497
+ model,
498
+ providerType: provider.providerType,
499
+ providerId: provider.providerId || null,
500
+ networkEnabled: updates.networkEnabled,
501
+ updatedAt: Date.now(),
502
+ requireNetworkChangeLease: true,
503
+ });
504
+ }
505
+ catch (error) {
506
+ throw translatePersistenceError(error);
507
+ }
508
+ }
509
+ async deleteTask(taskId, userId) {
510
+ const task = await this.requireTaskRecord(taskId, userId);
511
+ if (!(await getWorkPersistence().deleteTask(taskId, userId))) {
363
512
  throw new WorkNotFoundError();
364
513
  }
365
514
  return task;
366
515
  }
367
- addMessage(taskId, runId, role, kind, content, metadata) {
368
- const db = getDatabase();
516
+ async addMessage(taskId, runId, role, kind, content, metadata) {
369
517
  const id = uuidv4();
370
518
  const createdAt = Date.now();
371
- const messageIndex = this.nextMessageIndex(taskId);
372
519
  const boundedContent = boundUtf8(content, WORK_MESSAGE_MAX_BYTES);
373
520
  const serializedMetadata = serializeMetadata(metadata);
374
- db.prepare(`INSERT INTO work_messages (
375
- id, task_id, run_id, role, kind, content, metadata,
376
- message_index, created_at
377
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, taskId, runId || null, role, kind, boundedContent, serializedMetadata || null, messageIndex, createdAt);
378
- this.touchTask(taskId);
521
+ const messageIndex = await getWorkPersistence().insertMessage({
522
+ id,
523
+ task_id: taskId,
524
+ run_id: runId || null,
525
+ role,
526
+ kind,
527
+ content: boundedContent,
528
+ metadata: serializedMetadata || null,
529
+ created_at: createdAt,
530
+ });
379
531
  return {
380
532
  id,
381
533
  taskId,
@@ -388,28 +540,20 @@ export class WorkTaskService {
388
540
  createdAt,
389
541
  };
390
542
  }
391
- getMessages(taskId) {
392
- const rows = getDatabase()
393
- .prepare(`SELECT id, task_id, run_id, message_index, role, kind, content,
394
- metadata, created_at
395
- FROM work_messages
396
- WHERE task_id = ? AND kind <> 'provider_state'
397
- ORDER BY message_index ASC`)
398
- .all(taskId);
543
+ async getMessages(taskId) {
544
+ const rows = await getWorkPersistence().listMessages({
545
+ taskId,
546
+ mode: 'all',
547
+ });
399
548
  return rows.map(mapMessage);
400
549
  }
401
- getRecentConversationMessages(taskId, limit = 30) {
550
+ async getRecentConversationMessages(taskId, limit = 30) {
402
551
  const boundedLimit = Math.min(30, Math.max(1, Math.trunc(limit)));
403
- const rows = getDatabase()
404
- .prepare(`SELECT id, task_id, run_id, message_index, role, kind, content,
405
- metadata, created_at
406
- FROM work_messages
407
- WHERE task_id = ?
408
- AND kind = 'message'
409
- AND role IN ('user', 'assistant')
410
- ORDER BY message_index DESC
411
- LIMIT ?`)
412
- .all(taskId, boundedLimit);
552
+ const rows = await getWorkPersistence().listMessages({
553
+ taskId,
554
+ mode: 'conversation',
555
+ limit: boundedLimit,
556
+ });
413
557
  const selected = [];
414
558
  let selectedBytes = 0;
415
559
  for (const row of rows) {
@@ -425,22 +569,14 @@ export class WorkTaskService {
425
569
  }
426
570
  return selected.reverse().map(mapMessage);
427
571
  }
428
- getRecentModelContextMessages(taskId, limit = 30) {
572
+ async getRecentModelContextMessages(taskId, limit = 30) {
429
573
  const boundedLimit = Math.min(30, Math.max(1, Math.trunc(limit)));
430
574
  const rowLimit = boundedLimit * 6;
431
- const rows = getDatabase()
432
- .prepare(`SELECT id, task_id, run_id, message_index, role, kind, content,
433
- metadata, created_at
434
- FROM work_messages
435
- WHERE task_id = ?
436
- AND (
437
- (kind = 'message' AND role IN ('user', 'assistant'))
438
- OR (kind = 'provider_state' AND role = 'assistant')
439
- OR (kind = 'tool_result' AND role = 'tool')
440
- )
441
- ORDER BY message_index DESC
442
- LIMIT ?`)
443
- .all(taskId, rowLimit);
575
+ const rows = await getWorkPersistence().listMessages({
576
+ taskId,
577
+ mode: 'model-context',
578
+ limit: rowLimit,
579
+ });
444
580
  const selected = [];
445
581
  let selectedBytes = 0;
446
582
  for (const row of rows) {
@@ -461,26 +597,14 @@ export class WorkTaskService {
461
597
  }
462
598
  return chronological.map(mapMessage);
463
599
  }
464
- getMessagePage(taskId, before, limit = WORK_MESSAGE_PAGE_SIZE) {
600
+ async getMessagePage(taskId, before, limit = WORK_MESSAGE_PAGE_SIZE) {
465
601
  const pageSize = Math.min(WORK_MESSAGE_PAGE_SIZE, Math.max(1, Math.trunc(limit)));
466
- const rows = (before === undefined
467
- ? getDatabase()
468
- .prepare(`SELECT id, task_id, run_id, message_index, role, kind, content,
469
- metadata, created_at
470
- FROM work_messages
471
- WHERE task_id = ? AND kind <> 'provider_state'
472
- ORDER BY message_index DESC
473
- LIMIT ?`)
474
- .all(taskId, pageSize + 1)
475
- : getDatabase()
476
- .prepare(`SELECT id, task_id, run_id, message_index, role, kind, content,
477
- metadata, created_at
478
- FROM work_messages
479
- WHERE task_id = ? AND message_index < ?
480
- AND kind <> 'provider_state'
481
- ORDER BY message_index DESC
482
- LIMIT ?`)
483
- .all(taskId, before, pageSize + 1));
602
+ const rows = await getWorkPersistence().listMessages({
603
+ taskId,
604
+ mode: 'page',
605
+ before,
606
+ limit: pageSize + 1,
607
+ });
484
608
  const selectedRows = [];
485
609
  let selectedBytes = 0;
486
610
  let examinedRows = 0;
@@ -508,57 +632,40 @@ export class WorkTaskService {
508
632
  hasMore,
509
633
  };
510
634
  }
511
- getRun(runId) {
512
- const row = getDatabase()
513
- .prepare('SELECT * FROM work_runs WHERE id = ?')
514
- .get(runId);
635
+ async getRun(runId) {
636
+ const row = await getWorkPersistence().findRun(runId);
515
637
  return row ? mapRun(row) : undefined;
516
638
  }
517
- getActiveRun(taskId) {
518
- const placeholders = ACTIVE_RUN_STATUSES.map(() => '?').join(', ');
519
- const row = getDatabase()
520
- .prepare(`SELECT * FROM work_runs
521
- WHERE task_id = ? AND status IN (${placeholders})
522
- ORDER BY created_at DESC LIMIT 1`)
523
- .get(taskId, ...ACTIVE_RUN_STATUSES);
639
+ async getActiveRun(taskId) {
640
+ const row = await getWorkPersistence().findActiveRun(taskId);
524
641
  return row ? mapRun(row) : undefined;
525
642
  }
526
- updateRun(runId, status, options = {}) {
643
+ async updateRun(runId, status, options = {}) {
527
644
  const now = Date.now();
528
- getDatabase()
529
- .prepare(`UPDATE work_runs
530
- SET status = ?,
531
- error = ?,
532
- started_at = CASE WHEN ? = 1 THEN COALESCE(started_at, ?) ELSE started_at END,
533
- finished_at = CASE WHEN ? = 1 THEN ? ELSE finished_at END
534
- WHERE id = ?`)
535
- .run(status, options.error || null, options.started ? 1 : 0, now, options.finished ? 1 : 0, now, runId);
536
- const run = this.getRun(runId);
645
+ await getWorkPersistence().updateRun({
646
+ runId,
647
+ status,
648
+ error: options.error ? replaceWorkTextNul(options.error) : null,
649
+ started: Boolean(options.started),
650
+ finished: Boolean(options.finished),
651
+ now,
652
+ });
653
+ const run = await this.getRun(runId);
537
654
  if (!run) {
538
655
  throw new WorkNotFoundError('Work run not found.');
539
656
  }
540
657
  return run;
541
658
  }
542
- updateTaskStatus(taskId, status) {
543
- getDatabase()
544
- .prepare(`UPDATE work_tasks
545
- SET status = ?, updated_at = ?
546
- WHERE id = ?`)
547
- .run(status, Date.now(), taskId);
548
- }
549
- updatePreview(taskId, status, previewUrl) {
550
- getDatabase()
551
- .prepare(`UPDATE work_tasks
552
- SET preview_status = ?, preview_url = ?, updated_at = ?
553
- WHERE id = ?`)
554
- .run(status, previewUrl || null, Date.now(), taskId);
555
- }
556
- recoverOnStartup() {
557
- let db;
558
- let taskRows;
659
+ async updateTaskStatus(taskId, status) {
660
+ await getWorkPersistence().updateTaskStatus(taskId, status, Date.now());
661
+ }
662
+ async updatePreview(taskId, status, previewUrl, upstream) {
663
+ await getWorkPersistence().updatePreview(taskId, status, previewUrl || null, upstream?.host ?? null, upstream?.port ?? null, Date.now());
664
+ }
665
+ async recoverOnStartup() {
666
+ let recovered;
559
667
  try {
560
- db = getDatabase();
561
- taskRows = db.prepare('SELECT * FROM work_tasks').all();
668
+ recovered = await getWorkPersistence().recoverOnStartup(Date.now());
562
669
  }
563
670
  catch (error) {
564
671
  logger.error('Failed to read Work tasks for startup recovery:', error);
@@ -567,69 +674,28 @@ export class WorkTaskService {
567
674
  // startup instead of allowing Work to run without supervision.
568
675
  throw error;
569
676
  }
570
- let interruptedRuns = 0;
571
- let activePreviews = 0;
572
- try {
573
- interruptedRuns = db
574
- .prepare(`SELECT COUNT(*) AS count FROM work_runs
575
- WHERE status IN ('queued', 'preparing', 'running')`)
576
- .get().count;
577
- activePreviews = db
578
- .prepare(`SELECT COUNT(*) AS count FROM work_tasks
579
- WHERE preview_status IN ('starting', 'running')`)
580
- .get().count;
581
- }
582
- catch (error) {
583
- logger.error('Failed to count interrupted Work state:', error);
584
- }
585
- try {
586
- const now = Date.now();
587
- const transaction = db.transaction(() => {
588
- db.prepare(`UPDATE work_tasks
589
- SET status = 'failed', updated_at = ?
590
- WHERE status IN ('preparing', 'running')
591
- OR id IN (
592
- SELECT task_id FROM work_runs
593
- WHERE status IN ('queued', 'preparing', 'running')
594
- )`).run(now);
595
- db.prepare(`UPDATE work_tasks
596
- SET preview_status = 'stopped', preview_url = NULL, updated_at = ?
597
- WHERE preview_status != 'stopped' OR preview_url IS NOT NULL`).run(now);
598
- db.prepare(`UPDATE work_runs
599
- SET status = 'failed',
600
- error = 'Backend restarted while this run was active.',
601
- finished_at = ?
602
- WHERE status IN ('queued', 'preparing', 'running')`).run(now);
603
- });
604
- transaction();
605
- }
606
- catch (error) {
677
+ if (recovered.persistenceError) {
607
678
  // Container teardown is the security-critical half of recovery. Return
608
679
  // the rows already read even if SQLite cannot persist terminal states,
609
680
  // so startup can still stop every known command and preview process.
610
- logger.error('Failed to persist recovered Work state on startup:', error);
681
+ logger.error('Failed to persist recovered Work state on startup:', recovered.persistenceError);
611
682
  }
612
683
  return {
613
- tasks: taskRows.map(mapTaskRecord),
614
- interruptedRuns,
615
- activePreviews,
684
+ tasks: recovered.tasks.map(mapTaskRecord),
685
+ interruptedRuns: recovered.interruptedRuns,
686
+ activePreviews: recovered.activePreviews,
616
687
  };
617
688
  }
618
- getTaskRow(taskId, userId) {
619
- return getDatabase()
620
- .prepare('SELECT * FROM work_tasks WHERE id = ? AND user_id = ?')
621
- .get(taskId, userId);
622
- }
623
- detailFromRow(row) {
624
- const messagePage = this.getMessagePage(row.id);
689
+ async detailFromRow(row) {
690
+ const messagePage = await this.getMessagePage(row.id);
625
691
  return {
626
- ...this.summaryFromRow(row),
692
+ ...(await this.summaryFromRow(row)),
627
693
  messages: messagePage.messages,
628
694
  messageCursor: messagePage.cursor,
629
695
  hasMoreMessages: messagePage.hasMore,
630
696
  };
631
697
  }
632
- summaryFromRow(row) {
698
+ async summaryFromRow(row) {
633
699
  return {
634
700
  id: row.id,
635
701
  title: row.title,
@@ -640,7 +706,7 @@ export class WorkTaskService {
640
706
  networkEnabled: Boolean(row.network_enabled),
641
707
  createdAt: row.created_at,
642
708
  updatedAt: row.updated_at,
643
- activeRun: this.getActiveRun(row.id),
709
+ activeRun: await this.getActiveRun(row.id),
644
710
  previewUrl: row.preview_url || undefined,
645
711
  previewStatus: row.preview_status,
646
712
  workspacePath: '/workspace',
@@ -648,18 +714,6 @@ export class WorkTaskService {
648
714
  policyId: row.policy_id || undefined,
649
715
  };
650
716
  }
651
- nextMessageIndex(taskId) {
652
- const row = getDatabase()
653
- .prepare(`SELECT COALESCE(MAX(message_index), -1) + 1 AS next_index
654
- FROM work_messages WHERE task_id = ?`)
655
- .get(taskId);
656
- return row.next_index;
657
- }
658
- touchTask(taskId) {
659
- getDatabase()
660
- .prepare('UPDATE work_tasks SET updated_at = ? WHERE id = ?')
661
- .run(Date.now(), taskId);
662
- }
663
717
  }
664
718
  export class WorkNotFoundError extends Error {
665
719
  constructor(message = 'Work task not found.') {
@@ -690,6 +744,39 @@ export class WorkAdmissionError extends Error {
690
744
  this.code = code;
691
745
  }
692
746
  }
747
+ export class WorkInputError extends Error {
748
+ constructor(message) {
749
+ super(message);
750
+ this.status = 400;
751
+ this.name = 'WorkInputError';
752
+ }
753
+ }
754
+ const translatePersistenceError = (error, previewContext = false) => {
755
+ if (!(error instanceof WorkPersistenceError))
756
+ return error;
757
+ switch (error.code) {
758
+ case 'WORK_USER_FORBIDDEN':
759
+ return new WorkForbiddenError();
760
+ case 'WORK_USER_TASK_LIMIT':
761
+ return new WorkAdmissionError(`This administrator already has the maximum of ${workAdmissionLimits.maxTasksPerUser} Work tasks.`, error.code);
762
+ case 'WORK_GLOBAL_TASK_LIMIT':
763
+ return new WorkAdmissionError(`This Libre WebUI instance already has the maximum of ${workAdmissionLimits.maxTasksGlobal} Work tasks.`, error.code);
764
+ case 'WORK_USER_RUNTIME_LIMIT':
765
+ return new WorkAdmissionError(`This administrator already has ${workAdmissionLimits.maxActiveRuntimesPerUser} active Work runtime(s). Wait for a run or preview to stop.`, error.code);
766
+ case 'WORK_GLOBAL_RUNTIME_LIMIT':
767
+ return new WorkAdmissionError(`This Libre WebUI instance already has ${workAdmissionLimits.maxActiveRuntimesGlobal} active Work runtime(s). Wait for a run or preview to stop.`, error.code);
768
+ case 'WORK_ACTIVE_RUN':
769
+ return new WorkConflictError(previewContext
770
+ ? 'Wait for the active Work run to finish before starting a preview.'
771
+ : 'This Work task already has an active run.');
772
+ case 'WORK_PREVIEW_ACTIVE':
773
+ return new WorkConflictError('Stop this Work task preview before starting another run.');
774
+ case 'WORK_TASK_NOT_FOUND':
775
+ return new WorkNotFoundError();
776
+ default:
777
+ return error;
778
+ }
779
+ };
693
780
  const mapTaskRecord = (row) => ({
694
781
  id: row.id,
695
782
  userId: row.user_id,
@@ -705,6 +792,8 @@ const mapTaskRecord = (row) => ({
705
792
  policyId: row.policy_id || undefined,
706
793
  previewUrl: row.preview_url || undefined,
707
794
  previewStatus: row.preview_status,
795
+ previewUpstreamHost: row.preview_upstream_host || undefined,
796
+ previewUpstreamPort: row.preview_upstream_port || undefined,
708
797
  createdAt: row.created_at,
709
798
  updatedAt: row.updated_at,
710
799
  });
@@ -774,9 +863,15 @@ const deriveTitle = (message) => {
774
863
  const firstLine = message.trim().split(/\r?\n/, 1)[0] || 'New Work';
775
864
  return cleanTitle(firstLine.slice(0, 80));
776
865
  };
777
- const cleanTitle = (value) => value.trim().slice(0, 120) || 'New Work';
866
+ const rejectWorkTextNul = (value, field) => {
867
+ if (value.includes('\u0000')) {
868
+ throw new WorkInputError(`${field} cannot contain U+0000.`);
869
+ }
870
+ return value;
871
+ };
872
+ const cleanTitle = (value) => replaceWorkTextNul(value).trim().slice(0, 120) || 'New Work';
778
873
  const cleanRequired = (value) => {
779
- const cleaned = value.trim();
874
+ const cleaned = rejectWorkTextNul(value, 'Work model').trim();
780
875
  if (!cleaned) {
781
876
  throw new Error('Model cannot be empty.');
782
877
  }