libre-webui 0.21.3 → 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 (945) 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 +134 -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 +62 -31
  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 +1 -1
  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 +18 -18
  828. package/frontend/dist/js/{ArtifactContainer-Dy2Q0iIL.js → ArtifactContainer-BTEDhBnv.js} +1 -1
  829. package/frontend/dist/js/{ArtifactDemoPage-K79dWshB.js → ArtifactDemoPage-B0gN3YTl.js} +1 -1
  830. package/frontend/dist/js/{ArtifactSandboxFrame-DhqLNUtY.js → ArtifactSandboxFrame-CLBXQkZs.js} +3 -3
  831. package/frontend/dist/js/{ArtifactSlideOutPanel-Cl8JG7bz.js → ArtifactSlideOutPanel-CfqHPFdE.js} +1 -1
  832. package/frontend/dist/js/{Button-CTXHujOd.js → Button-BV44cTnj.js} +1 -1
  833. package/frontend/dist/js/ChatPage-DIkAXZWA.js +23 -0
  834. package/frontend/dist/js/{FirstTimeSetup-kHhRzGJ8.js → FirstTimeSetup-B8phXGNA.js} +1 -1
  835. package/frontend/dist/js/GalleryPage-W4uI043I.js +1 -0
  836. package/frontend/dist/js/{HomePage-C1L8WAXL.js → HomePage-DlxehbyO.js} +1 -1
  837. package/frontend/dist/js/{LibreClawPage-Dyua8IUu.js → LibreClawPage-CgD0_G_F.js} +1 -1
  838. package/frontend/dist/js/{ModelManagerModals-CuMRGUd-.js → ModelManagerModals-D7jIT3v1.js} +1 -1
  839. package/frontend/dist/js/{ModelSelector-CqHc-Ln4.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-D_6WBCH5.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-DLHlCDBl.js → SettingsToggle-WTa0rgvY.js} +1 -1
  848. package/frontend/dist/js/{SystemPage-BMWEet9e.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-DkV1ka7I.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-D5KP-qbw.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-Cm9c2akd.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-B2u7CnKN.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-DalG2j6U.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-Dwm1daef.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-CwieSptM.js → typescript-CQ3x-Uni.js} +1 -1
  890. package/frontend/dist/js/{ui-BnDZpjfc.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-CXY69qNk.js → useTranslation-C3ei3mJq.js} +1 -1
  894. package/frontend/dist/js/{utils-BM0_0iFj.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-BOS7crs9.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-BBpNbfKW.js +0 -16
  906. package/frontend/dist/assets/index-BLATyFmD.css +0 -1
  907. package/frontend/dist/js/ChatPage-BBayfMLS.js +0 -16
  908. package/frontend/dist/js/GalleryPage-By8VI39Q.js +0 -1
  909. package/frontend/dist/js/ModelsPage-ODeXhDDk.js +0 -2
  910. package/frontend/dist/js/NotesPage-CApzDjOq.js +0 -1
  911. package/frontend/dist/js/PluginUsagePage-kutS6SOd.js +0 -1
  912. package/frontend/dist/js/RichMessageContent-g6WT75Te.js +0 -3
  913. package/frontend/dist/js/SettingsModal-B7z51BCx.js +0 -1
  914. package/frontend/dist/js/UserManagementPage-D08lM51c.js +0 -1
  915. package/frontend/dist/js/WorkPage-DdVLefsK.js +0 -6
  916. package/frontend/dist/js/api-CLEmGcEh.js +0 -14
  917. package/frontend/dist/js/appStore-CGdhvp9P.js +0 -2
  918. package/frontend/dist/js/ar-BTmB2WVm.js +0 -2
  919. package/frontend/dist/js/authStore-Dh3beEOq.js +0 -4
  920. package/frontend/dist/js/bn-CQnH7YVT.js +0 -2
  921. package/frontend/dist/js/chatStore-CDeYWL_q.js +0 -3
  922. package/frontend/dist/js/cs-oTTZkQXr.js +0 -2
  923. package/frontend/dist/js/da-Br0gB6J6.js +0 -2
  924. package/frontend/dist/js/de-DE2iztTF.js +0 -2
  925. package/frontend/dist/js/es-DgthfVtl.js +0 -2
  926. package/frontend/dist/js/fr-BjxjFwPh.js +0 -2
  927. package/frontend/dist/js/hi-D1q7E-9N.js +0 -2
  928. package/frontend/dist/js/id-CDJZqLTF.js +0 -2
  929. package/frontend/dist/js/is-BU7Um_Tq.js +0 -2
  930. package/frontend/dist/js/it-CdAxr8P_.js +0 -2
  931. package/frontend/dist/js/ja-BLbQwz9u.js +0 -2
  932. package/frontend/dist/js/ko-CY5lpkAe.js +0 -2
  933. package/frontend/dist/js/markdown-core-DHnR5Hw8.js +0 -16
  934. package/frontend/dist/js/ms-tQ8AYXEQ.js +0 -2
  935. package/frontend/dist/js/nl-CRNi2oWT.js +0 -2
  936. package/frontend/dist/js/pl-CWtFRS_W.js +0 -2
  937. package/frontend/dist/js/pt-C7SPoLF8.js +0 -2
  938. package/frontend/dist/js/ru-Dz4AX8xc.js +0 -2
  939. package/frontend/dist/js/sv-ETy5-boa.js +0 -2
  940. package/frontend/dist/js/th-DpuMqvxU.js +0 -2
  941. package/frontend/dist/js/tr-C-1AYAqg.js +0 -2
  942. package/frontend/dist/js/ui-vendor-xUzKqAXI.js +0 -177
  943. package/frontend/dist/js/uk-CyS680gr.js +0 -2
  944. package/frontend/dist/js/vi-BG8HuiTz.js +0 -2
  945. package/frontend/dist/js/zh-NCs2mkHj.js +0 -2
@@ -15,12 +15,15 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  import path from 'node:path';
18
- import { getDatabase } from '../db.js';
18
+ import { randomUUID } from 'node:crypto';
19
+ import { getWorkPersistence } from '../platform/workPersistence/index.js';
20
+ import { getCoordinator, getPlatformRuntimeConfig, } from '../platform/coordination/service.js';
21
+ import { combineAbortSignals, SHARED_COORDINATION_OPERATION_TIMEOUT_MS, withCoordinationTimeout, } from '../platform/coordination/sharedAdmission.js';
19
22
  import { createLogger } from '../utils/logger.js';
20
23
  import { buildWorkGitCommand, parseWorkGitBranches, parseWorkGitLog, parseWorkGitStatus, validateWorkGitBranchName, validateWorkGitRepositoryPaths, } from '../utils/workGit.js';
21
24
  import { userHasWorkAccess } from './workAccessService.js';
22
25
  import workPolicyService from './workPolicyService.js';
23
- import workPreviewProxyService from './workPreviewProxyService.js';
26
+ import workPreviewProxyService, { normalizePreviewUpstreamHost, } from './workPreviewProxyService.js';
24
27
  import workTaskService from './workTaskService.js';
25
28
  import { KubernetesWorkRuntimeDriver } from './workKubernetesDriver.js';
26
29
  import { DockerWorkRuntimeDriver, } from './workRuntimeDriver.js';
@@ -49,28 +52,38 @@ export class WorkRuntimeService {
49
52
  this.retiringTasks = new Set();
50
53
  this.networkPolicies = new Map();
51
54
  this.activeCommands = new Set();
52
- this.lastDockerUnavailableReason = null;
55
+ this.lastRuntimeUnavailableReason = null;
53
56
  this.runtimeLeases = new Map();
54
57
  this.previewLeaseReleases = new Map();
55
58
  this.terminalHolds = new Map();
56
59
  this.recoveryTasks = new Map();
57
60
  this.recoveryOrphans = new Map();
58
- // Sweeps left for the empty-inventory case before giving up on a daemon
59
- // that never appears (30 × 10s: covers a socket proxy starting late
60
- // without probing a Docker-less deployment forever).
61
+ // Sweeps left for the empty-inventory case before giving up on a runtime
62
+ // that never appears (30 × 10s covers a late Docker socket proxy or
63
+ // Kubernetes API without probing an intentionally disabled backend forever).
61
64
  this.emptyInventorySweepsLeft = 30;
62
65
  this.shuttingDown = false;
66
+ this.activityMemberId = `${process.env.LIBRE_PROCESS_ROLE || 'standalone'}-${process.pid}-` +
67
+ randomUUID();
63
68
  // Last observed activity per task, feeding the idle sweep: a finished
64
69
  // command, a terminal session ending, or a preview fetch. In-memory only —
65
70
  // after a restart the clock restarts from the first sighting.
66
71
  this.taskActivity = new Map();
67
72
  this.driver = driver;
73
+ this.runtimeKind = driver.kind;
68
74
  // Authorized preview traffic keeps its task's idle clock fresh.
69
75
  workPreviewProxyService.onPreviewActivity(taskId => this.noteTaskActivity(taskId));
70
- this.scheduleIdleSweep();
76
+ if (process.env.LIBRE_PROCESS_ROLE !== 'app-external') {
77
+ this.scheduleIdleSweep();
78
+ }
71
79
  }
72
80
  noteTaskActivity(taskId) {
73
81
  this.taskActivity.set(taskId, Date.now());
82
+ if (getPlatformRuntimeConfig().mode === 'team') {
83
+ void getCoordinator()
84
+ .setCache(`work-task-activity:${taskId}`, Date.now(), 86400000)
85
+ .catch(error => logger.warn(`Could not persist Work activity for ${taskId}:`, error));
86
+ }
74
87
  }
75
88
  get recoveryPending() {
76
89
  return this.recoveryPendingCount > 0;
@@ -90,25 +103,24 @@ export class WorkRuntimeService {
90
103
  throw new WorkRuntimeError(`Work is temporarily unavailable while ${this.recoveryPendingCount} container cleanup(s) are retried.`, 503, 'WORK_RUNTIME_RECOVERING');
91
104
  }
92
105
  }
93
- async isDockerAvailable() {
106
+ async isRuntimeAvailable() {
94
107
  try {
95
108
  await this.driver.probe();
96
- this.lastDockerUnavailableReason = null;
109
+ this.lastRuntimeUnavailableReason = null;
97
110
  return true;
98
111
  }
99
112
  catch (error) {
100
- this.lastDockerUnavailableReason =
113
+ this.lastRuntimeUnavailableReason =
101
114
  error instanceof Error ? error.message : String(error);
102
115
  return false;
103
116
  }
104
117
  }
105
118
  /**
106
- * Why the last availability probe failed. "Docker is not available" cannot be
107
- * acted on: a containerized deployment fails for a missing CLI, an unreadable
108
- * socket, or a stopped daemon, and each needs a different change.
119
+ * Why the last availability probe failed. A generic "runtime unavailable"
120
+ * message cannot be acted on, so drivers return their operator-facing cause.
109
121
  */
110
- get dockerUnavailableReason() {
111
- return this.lastDockerUnavailableReason;
122
+ get runtimeUnavailableReason() {
123
+ return this.lastRuntimeUnavailableReason;
112
124
  }
113
125
  /**
114
126
  * Live runtime occupancy, so the interface can say "1 of 2 runtimes in use"
@@ -124,14 +136,25 @@ export class WorkRuntimeService {
124
136
  }
125
137
  return { global: this.runtimeLeases.size, user };
126
138
  }
127
- async beginRecovery(tasks) {
139
+ async beginRecovery(tasks, assertRecoveryLease) {
128
140
  this.recoveryInventory = tasks;
129
- const result = await this.sweepRecoveryTasks();
130
- this.scheduleRecoverySweep();
141
+ const result = await this.sweepRecoveryTasks(assertRecoveryLease);
142
+ if (assertRecoveryLease) {
143
+ // An external worker must never hand unfinished destructive recovery to
144
+ // an unfenced background retry after releasing the global startup lease.
145
+ if (this.recoveryInventory !== undefined && result.failed === 0) {
146
+ return { ...result, failed: 1 };
147
+ }
148
+ }
149
+ else {
150
+ this.scheduleRecoverySweep();
151
+ }
131
152
  return result;
132
153
  }
133
- acquireRuntimeLease(task) {
134
- this.assertTaskIsActive(task);
154
+ async acquireRuntimeLease(task, signal) {
155
+ signal?.throwIfAborted();
156
+ await this.assertTaskIsActive(task);
157
+ signal?.throwIfAborted();
135
158
  const existing = this.runtimeLeases.get(task.id);
136
159
  if (existing) {
137
160
  if (existing.userId !== task.userId) {
@@ -147,25 +170,101 @@ export class WorkRuntimeService {
147
170
  if (this.runtimeLeases.size >= config.maxActiveRuntimesGlobal) {
148
171
  throw new WorkRuntimeError(`This Libre WebUI instance already has ${config.maxActiveRuntimesGlobal} active Work runtime(s). Wait for another operation or preview to stop.`, 429, 'WORK_GLOBAL_RUNTIME_LIMIT');
149
172
  }
150
- this.runtimeLeases.set(task.id, { userId: task.userId, holders: 1 });
173
+ const runtimeLease = {
174
+ userId: task.userId,
175
+ holders: 1,
176
+ };
177
+ if (getPlatformRuntimeConfig().mode === 'team') {
178
+ let abandoned = false;
179
+ const pendingSharedLease = getCoordinator().acquireLease(`work-task-runtime:${task.id}`, 60000);
180
+ void pendingSharedLease
181
+ .then(lease => {
182
+ if (!abandoned || !lease)
183
+ return;
184
+ void withCoordinationTimeout(lease.release(), SHARED_COORDINATION_OPERATION_TIMEOUT_MS).catch(() => undefined);
185
+ })
186
+ .catch(() => undefined);
187
+ let sharedLease;
188
+ try {
189
+ sharedLease = await waitForAbortSignal(withCoordinationTimeout(pendingSharedLease, SHARED_COORDINATION_OPERATION_TIMEOUT_MS), signal);
190
+ }
191
+ catch (error) {
192
+ abandoned = true;
193
+ throw error;
194
+ }
195
+ if (!sharedLease) {
196
+ throw new WorkRuntimeError('This Work task is active on another replica.', 409, 'WORK_RUNTIME_LEASE_CONFLICT');
197
+ }
198
+ runtimeLease.sharedLease = sharedLease;
199
+ runtimeLease.sharedLeaseTimer = setInterval(() => {
200
+ void withCoordinationTimeout(sharedLease.extend(60000), SHARED_COORDINATION_OPERATION_TIMEOUT_MS)
201
+ .then(extended => {
202
+ if (!extended)
203
+ throw new Error('lease ownership was lost');
204
+ })
205
+ .catch(error => {
206
+ if (runtimeLease.sharedLeaseLost)
207
+ return;
208
+ runtimeLease.sharedLeaseLost = true;
209
+ logger.error(`Shared Work runtime lease was lost for task ${task.id}; stopping its sandbox:`, error);
210
+ void this.driver
211
+ .stopRuntime(task)
212
+ .catch(stopError => logger.error(`Could not stop Work task ${task.id} after lease loss:`, stopError));
213
+ });
214
+ }, 20000);
215
+ runtimeLease.sharedLeaseTimer.unref?.();
216
+ const refreshPresence = () => withCoordinationTimeout(getCoordinator().setPresence(`work-task-active:${task.id}`, this.activityMemberId, 30000), SHARED_COORDINATION_OPERATION_TIMEOUT_MS);
217
+ try {
218
+ await waitForAbortSignal(refreshPresence(), signal);
219
+ }
220
+ catch (error) {
221
+ if (runtimeLease.sharedLeaseTimer) {
222
+ clearInterval(runtimeLease.sharedLeaseTimer);
223
+ }
224
+ await withCoordinationTimeout(sharedLease.release(), SHARED_COORDINATION_OPERATION_TIMEOUT_MS).catch(() => false);
225
+ throw error;
226
+ }
227
+ runtimeLease.presenceTimer = setInterval(() => {
228
+ void refreshPresence().catch(error => logger.warn(`Could not refresh Work activity for ${task.id}:`, error));
229
+ }, 10000);
230
+ runtimeLease.presenceTimer.unref?.();
231
+ }
232
+ this.runtimeLeases.set(task.id, runtimeLease);
151
233
  }
152
234
  let released = false;
153
235
  return () => {
154
236
  if (released)
155
237
  return;
156
238
  released = true;
157
- const lease = this.runtimeLeases.get(task.id);
158
- if (!lease || lease.userId !== task.userId)
159
- return;
160
- lease.holders -= 1;
161
- if (lease.holders <= 0) {
162
- this.runtimeLeases.delete(task.id);
163
- }
239
+ this.releaseRuntimeLease(task.id, task.userId);
164
240
  };
165
241
  }
242
+ releaseRuntimeLease(taskId, expectedUserId, force = false) {
243
+ const lease = this.runtimeLeases.get(taskId);
244
+ if (!lease || (expectedUserId && lease.userId !== expectedUserId))
245
+ return;
246
+ if (!force)
247
+ lease.holders -= 1;
248
+ if (!force && lease.holders > 0)
249
+ return;
250
+ if (lease.presenceTimer)
251
+ clearInterval(lease.presenceTimer);
252
+ if (lease.sharedLeaseTimer)
253
+ clearInterval(lease.sharedLeaseTimer);
254
+ this.runtimeLeases.delete(taskId);
255
+ void lease.sharedLease?.release().catch(() => false);
256
+ if (getPlatformRuntimeConfig().mode === 'team') {
257
+ void getCoordinator()
258
+ .clearPresence(`work-task-active:${taskId}`, this.activityMemberId)
259
+ .catch(error => logger.warn(`Could not clear Work activity for ${taskId}:`, error));
260
+ }
261
+ }
166
262
  assertRuntimeLease(task) {
167
263
  const lease = this.runtimeLeases.get(task.id);
168
- if (!lease || lease.userId !== task.userId || lease.holders < 1) {
264
+ if (!lease ||
265
+ lease.userId !== task.userId ||
266
+ lease.holders < 1 ||
267
+ lease.sharedLeaseLost) {
169
268
  throw new WorkRuntimeError('Work container acquisition requires a runtime capacity lease.', 503, 'WORK_RUNTIME_LEASE_REQUIRED');
170
269
  }
171
270
  }
@@ -179,8 +278,8 @@ export class WorkRuntimeService {
179
278
  }
180
279
  }
181
280
  async prepare(task, signal) {
182
- const releaseLease = this.acquireRuntimeLease(task);
183
- this.assertTaskIsActive(task);
281
+ const releaseLease = await this.acquireRuntimeLease(task, signal);
282
+ await this.assertTaskIsActive(task);
184
283
  const active = this.preparations.get(task.id);
185
284
  if (active) {
186
285
  try {
@@ -195,11 +294,12 @@ export class WorkRuntimeService {
195
294
  let tracked;
196
295
  tracked = (async () => {
197
296
  await waitForAbortSignal(this.ensureImage(task), signal);
198
- this.assertTaskIsActive(task);
199
- await this.withLifecycleLock(task.id, async () => {
200
- this.assertTaskIsActive(task);
201
- await this.prepareWithLock(task);
202
- this.assertTaskIsActive(task);
297
+ await this.assertTaskIsActive(task);
298
+ await this.withLifecycleLock(task.id, async (_assertHeld, leaseSignal) => {
299
+ const operationSignal = combineAbortSignals(signal, leaseSignal);
300
+ await this.assertTaskIsActive(task);
301
+ await this.prepareWithLock(task, operationSignal);
302
+ await this.assertTaskIsActive(task);
203
303
  });
204
304
  })().finally(() => {
205
305
  if (this.preparations.get(task.id) === tracked) {
@@ -222,11 +322,11 @@ export class WorkRuntimeService {
222
322
  * container preparation as every other runtime operation, and keeps the
223
323
  * idle-stop path from tearing the container down while a shell is attached.
224
324
  */
225
- async acquireTerminalHold(task) {
325
+ async acquireTerminalHold(task, signal) {
226
326
  if (this.activeCommands.has(task.id)) {
227
327
  throw new WorkRuntimeError('A Work command is running in this container. Wait for it to finish, then reconnect the terminal.', 409, 'WORK_TERMINAL_COMMAND_ACTIVE');
228
328
  }
229
- const releaseLease = await this.prepare(task);
329
+ const releaseLease = await this.prepare(task, signal);
230
330
  this.terminalHolds.set(task.id, (this.terminalHolds.get(task.id) ?? 0) + 1);
231
331
  let released = false;
232
332
  return async () => {
@@ -243,7 +343,7 @@ export class WorkRuntimeService {
243
343
  }
244
344
  try {
245
345
  if (remaining <= 0 && !this.shuttingDown) {
246
- await this.withLifecycleLock(task.id, () => this.stopContainerIfIdleWithLock(task));
346
+ await this.withLifecycleLock(task.id, (_assertHeld, signal) => this.stopContainerIfIdleWithLock(task, signal));
247
347
  }
248
348
  }
249
349
  catch (error) {
@@ -267,6 +367,12 @@ export class WorkRuntimeService {
267
367
  clearTimeout(this.idleTimer);
268
368
  this.idleTimer = undefined;
269
369
  }
370
+ for (const taskId of [...this.previewLeaseReleases.keys()]) {
371
+ this.releasePreviewLease(taskId);
372
+ }
373
+ for (const taskId of [...this.runtimeLeases.keys()]) {
374
+ this.releaseRuntimeLease(taskId, undefined, true);
375
+ }
270
376
  this.driver.shutdown();
271
377
  }
272
378
  beginTaskSuspension(taskId) {
@@ -278,19 +384,18 @@ export class WorkRuntimeService {
278
384
  releaseTaskSuspension(taskId) {
279
385
  this.retiringTasks.delete(taskId);
280
386
  }
281
- async sweepRecoveryTasks() {
387
+ async sweepRecoveryTasks(assertRecoveryLease = async () => undefined) {
282
388
  if (this.recoveryInventory === undefined &&
283
389
  this.recoveryTasks.size === 0 &&
284
390
  this.recoveryOrphans.size === 0) {
285
391
  return { stopped: 0, failed: 0 };
286
392
  }
287
- if (this.shuttingDown || !(await this.isDockerAvailable())) {
393
+ if (this.shuttingDown || !(await this.isRuntimeAvailable())) {
288
394
  if (this.recoveryInventory?.length === 0) {
289
395
  // No tasks to supervise, so nothing fail-closes — but leftover
290
- // containers may still exist (a restored database, a daemon or
291
- // socket proxy that comes up after the backend). Keep retrying the
292
- // reconciliation quietly for a bounded window, then give up so a
293
- // deployment without Docker is not probed forever.
396
+ // sandboxes may still exist after a database restore, or the runtime
397
+ // control plane may start after the backend. Retry for a bounded
398
+ // window without probing an intentionally disabled runtime forever.
294
399
  if (this.shuttingDown || this.emptyInventorySweepsLeft <= 0) {
295
400
  this.recoveryInventory = undefined;
296
401
  return { stopped: 0, failed: 0 };
@@ -307,6 +412,7 @@ export class WorkRuntimeService {
307
412
  // by a task whose database row is gone.
308
413
  let discovered;
309
414
  try {
415
+ await assertRecoveryLease();
310
416
  discovered = await this.driver.listManaged();
311
417
  }
312
418
  catch (error) {
@@ -331,8 +437,16 @@ export class WorkRuntimeService {
331
437
  const tasks = [...this.recoveryTasks.values()];
332
438
  const orphans = [...this.recoveryOrphans.values()];
333
439
  const [taskResults, orphanResults] = await Promise.all([
334
- Promise.allSettled(tasks.map(task => this.stopContainer(task))),
335
- Promise.allSettled(orphans.map(orphan => this.driver.removeOrphan(orphan.name))),
440
+ Promise.allSettled(tasks.map(async (task) => {
441
+ await assertRecoveryLease();
442
+ await this.stopContainer(task);
443
+ await assertRecoveryLease();
444
+ })),
445
+ Promise.allSettled(orphans.map(async (orphan) => {
446
+ await assertRecoveryLease();
447
+ await this.driver.removeOrphan(orphan.name);
448
+ await assertRecoveryLease();
449
+ })),
336
450
  ]);
337
451
  let stopped = 0;
338
452
  taskResults.forEach((result, index) => {
@@ -389,12 +503,14 @@ export class WorkRuntimeService {
389
503
  * on a guess.
390
504
  */
391
505
  async sweepIdleRuntimes(now = Date.now()) {
392
- if (this.shuttingDown || this.recoveryPending) {
506
+ if (process.env.LIBRE_PROCESS_ROLE === 'app-external' ||
507
+ this.shuttingDown ||
508
+ this.recoveryPending) {
393
509
  return { stopped: 0 };
394
510
  }
395
511
  // Idle-stop can come from the global knob or from any named policy.
396
512
  if (config.idleTimeoutMs <= 0 &&
397
- !workPolicyService.anyIdleTimeoutConfigured()) {
513
+ !(await workPolicyService.anyIdleTimeoutConfigured())) {
398
514
  return { stopped: 0 };
399
515
  }
400
516
  let discovered;
@@ -405,7 +521,7 @@ export class WorkRuntimeService {
405
521
  // The runtime is unreachable; nothing can be stopped anyway.
406
522
  return { stopped: 0 };
407
523
  }
408
- const records = new Map(workTaskService.listAllTaskRecords().map(task => [task.id, task]));
524
+ const records = new Map((await workTaskService.listAllTaskRecords()).map(task => [task.id, task]));
409
525
  let stopped = 0;
410
526
  for (const entry of discovered) {
411
527
  if (!entry.running)
@@ -414,16 +530,25 @@ export class WorkRuntimeService {
414
530
  // Containers without a task row are startup reconciliation's business.
415
531
  if (!task)
416
532
  continue;
533
+ if (getPlatformRuntimeConfig().mode === 'team' &&
534
+ (await getCoordinator().listPresence(`work-task-active:${task.id}`))
535
+ .length > 0) {
536
+ continue;
537
+ }
417
538
  const busy = this.activeCommands.has(task.id) ||
418
539
  (this.terminalHolds.get(task.id) ?? 0) > 0 ||
419
540
  (this.runtimeLeases.has(task.id) &&
420
541
  !this.previewLeaseReleases.has(task.id));
421
- const lastActivity = this.taskActivity.get(task.id);
542
+ const sharedActivity = getPlatformRuntimeConfig().mode === 'team'
543
+ ? await getCoordinator().getCache(`work-task-activity:${task.id}`)
544
+ : null;
545
+ const lastActivity = sharedActivity ?? this.taskActivity.get(task.id);
422
546
  if (busy || lastActivity === undefined) {
423
547
  this.noteTaskActivity(task.id);
424
548
  continue;
425
549
  }
426
- const idleAfterMs = workPolicyService.resolve(task.policyId).idleTimeoutMs;
550
+ const idleAfterMs = (await workPolicyService.resolve(task.policyId))
551
+ .idleTimeoutMs;
427
552
  if (idleAfterMs <= 0 || now - lastActivity < idleAfterMs)
428
553
  continue;
429
554
  try {
@@ -499,80 +624,80 @@ export class WorkRuntimeService {
499
624
  logger.info('Pending Work container cleanup completed.');
500
625
  }
501
626
  }
502
- markPreviewStopped(taskId) {
627
+ async markPreviewStopped(taskId) {
503
628
  try {
504
- getDatabase()
505
- .prepare(`UPDATE work_tasks
506
- SET preview_status = 'stopped', preview_url = NULL, updated_at = ?
507
- WHERE id = ?`)
508
- .run(Date.now(), taskId);
629
+ await getWorkPersistence().updatePreview(taskId, 'stopped', null, null, null, Date.now());
509
630
  }
510
631
  catch (error) {
511
632
  logger.warn(`Could not persist stopped preview state for Work task ${taskId}:`, error);
512
633
  }
513
634
  }
514
- async prepareWithLock(task) {
635
+ async prepareWithLock(task, signal) {
636
+ signal?.throwIfAborted();
515
637
  this.assertRuntimeLease(task);
516
638
  this.assertCurrentNetworkPolicy(task);
517
- this.assertTaskIsActive(task);
518
- await this.driver.ensureWorkspace(task);
519
- this.assertTaskIsActive(task);
639
+ await this.assertTaskIsActive(task);
640
+ await this.driver.ensureWorkspace(task, signal);
641
+ await this.assertTaskIsActive(task);
520
642
  this.assertRuntimeLease(task);
521
- await this.driver.ensureRuntime(task);
643
+ await this.driver.ensureRuntime(task, signal);
522
644
  if (this.shuttingDown) {
523
- await this.stopContainerWithLock(task);
524
- this.assertTaskIsActive(task);
645
+ await this.stopContainerWithLock(task, signal);
646
+ await this.assertTaskIsActive(task);
525
647
  }
526
648
  }
527
649
  async recreateContainer(task) {
528
- const releaseLease = this.acquireRuntimeLease(task);
650
+ const releaseLease = await this.acquireRuntimeLease(task);
529
651
  try {
530
652
  await this.ensureImage(task);
531
- this.assertTaskIsActive(task);
532
- await this.withLifecycleLock(task.id, async () => {
533
- this.assertTaskIsActive(task);
534
- await this.recreateContainerWithLock(task);
535
- await this.stopContainerWithLock(task);
653
+ await this.assertTaskIsActive(task);
654
+ await this.withLifecycleLock(task.id, async (_assertHeld, signal) => {
655
+ await this.assertTaskIsActive(task);
656
+ await this.recreateContainerWithLock(task, signal);
657
+ await this.stopContainerWithLock(task, signal);
536
658
  this.networkPolicies.set(task.id, task.networkEnabled);
537
659
  });
538
660
  this.releasePreviewLease(task.id);
539
- this.markPreviewStopped(task.id);
661
+ await this.markPreviewStopped(task.id);
540
662
  }
541
663
  finally {
542
664
  releaseLease();
543
665
  }
544
666
  }
545
667
  async changeNetworkPolicy(before, desired, commit) {
546
- this.assertTaskIsActive(before);
668
+ await this.assertTaskIsActive(before);
547
669
  if (desired.networkEnabled === before.networkEnabled) {
548
- return this.withLifecycleLock(before.id, async () => {
549
- this.assertTaskIsActive(before);
670
+ return this.withLifecycleLock(before.id, async (assertHeld) => {
671
+ await this.assertTaskIsActive(before);
550
672
  this.assertCurrentNetworkPolicy(before);
551
- const result = commit();
673
+ await assertHeld();
674
+ const result = await commit();
552
675
  this.networkPolicies.set(desired.id, desired.networkEnabled);
553
676
  return result;
554
677
  });
555
678
  }
556
- const releaseLease = this.acquireRuntimeLease(before);
679
+ const releaseLease = await this.acquireRuntimeLease(before);
557
680
  let previewStopped = false;
558
681
  try {
559
682
  await this.ensureImage(before);
560
- this.assertTaskIsActive(before);
561
- return await this.withLifecycleLock(before.id, async () => {
562
- this.assertTaskIsActive(before);
683
+ await this.assertTaskIsActive(before);
684
+ return await this.withLifecycleLock(before.id, async (assertHeld, signal) => {
685
+ await this.assertTaskIsActive(before);
563
686
  this.assertCurrentNetworkPolicy(before);
564
687
  try {
565
- await this.recreateContainerWithLock(desired);
566
- await this.stopContainerWithLock(desired);
688
+ await this.recreateContainerWithLock(desired, signal);
689
+ await assertHeld();
690
+ await this.stopContainerWithLock(desired, signal);
567
691
  previewStopped = true;
568
- const result = commit();
692
+ await assertHeld();
693
+ const result = await commit();
569
694
  this.networkPolicies.set(desired.id, desired.networkEnabled);
570
695
  return result;
571
696
  }
572
697
  catch (error) {
573
698
  try {
574
- await this.recreateContainerWithLock(before);
575
- await this.stopContainerWithLock(before);
699
+ await this.recreateContainerWithLock(before, signal);
700
+ await this.stopContainerWithLock(before, signal);
576
701
  previewStopped = true;
577
702
  this.networkPolicies.set(before.id, before.networkEnabled);
578
703
  }
@@ -586,27 +711,27 @@ export class WorkRuntimeService {
586
711
  finally {
587
712
  if (previewStopped) {
588
713
  this.releasePreviewLease(before.id);
589
- this.markPreviewStopped(before.id);
714
+ await this.markPreviewStopped(before.id);
590
715
  }
591
716
  releaseLease();
592
717
  }
593
718
  }
594
- async recreateContainerWithLock(task) {
719
+ async recreateContainerWithLock(task, signal) {
595
720
  this.assertRuntimeLease(task);
596
- this.assertTaskIsActive(task);
597
- await this.driver.ensureWorkspace(task);
598
- this.assertTaskIsActive(task);
599
- await this.driver.removeRuntime(task);
600
- await this.driver.ensureRuntime(task);
721
+ await this.assertTaskIsActive(task);
722
+ await this.driver.ensureWorkspace(task, signal);
723
+ await this.assertTaskIsActive(task);
724
+ await this.driver.removeRuntime(task, signal);
725
+ await this.driver.ensureRuntime(task, signal);
601
726
  if (this.shuttingDown) {
602
- await this.stopContainerWithLock(task);
603
- this.assertTaskIsActive(task);
727
+ await this.stopContainerWithLock(task, signal);
728
+ await this.assertTaskIsActive(task);
604
729
  }
605
730
  }
606
731
  async stopContainer(task) {
607
- await this.withLifecycleLock(task.id, () => this.stopContainerWithLock(task));
732
+ await this.withLifecycleLock(task.id, (_assertHeld, signal) => this.stopContainerWithLock(task, signal));
608
733
  this.releasePreviewLease(task.id);
609
- this.markPreviewStopped(task.id);
734
+ await this.markPreviewStopped(task.id);
610
735
  this.completeRecoveryTask(task.id);
611
736
  }
612
737
  /**
@@ -618,12 +743,12 @@ export class WorkRuntimeService {
618
743
  async interruptContainer(task) {
619
744
  await this.stopContainerWithLock(task);
620
745
  this.releasePreviewLease(task.id);
621
- this.markPreviewStopped(task.id);
746
+ await this.markPreviewStopped(task.id);
622
747
  this.completeRecoveryTask(task.id);
623
748
  }
624
- async stopContainerWithLock(task) {
749
+ async stopContainerWithLock(task, signal) {
625
750
  try {
626
- await this.driver.stopRuntime(task);
751
+ await this.driver.stopRuntime(task, signal);
627
752
  }
628
753
  catch (error) {
629
754
  this.queueFailedCleanup(task, error);
@@ -632,14 +757,14 @@ export class WorkRuntimeService {
632
757
  }
633
758
  async removeTask(task, allowRevokedOwner = false) {
634
759
  if (allowRevokedOwner) {
635
- this.assertTaskStillOwned(task);
760
+ await this.assertTaskStillOwned(task);
636
761
  }
637
762
  else {
638
- this.assertTaskOwnerHasWorkAccess(task);
763
+ await this.assertTaskOwnerHasWorkAccess(task);
639
764
  }
640
765
  this.retiringTasks.add(task.id);
641
766
  try {
642
- await this.withLifecycleLock(task.id, () => this.driver.removeTaskResources(task));
767
+ await this.withLifecycleLock(task.id, (_assertHeld, signal) => this.driver.removeTaskResources(task, signal));
643
768
  }
644
769
  catch (error) {
645
770
  this.retiringTasks.delete(task.id);
@@ -652,9 +777,8 @@ export class WorkRuntimeService {
652
777
  this.preparations.delete(taskId);
653
778
  this.activeCommands.delete(taskId);
654
779
  this.releasePreviewLease(taskId);
655
- this.runtimeLeases.delete(taskId);
780
+ this.releaseRuntimeLease(taskId, undefined, true);
656
781
  this.taskActivity.delete(taskId);
657
- workPreviewProxyService.clearPreviewUpstream(taskId);
658
782
  }
659
783
  async listFiles(task, requestedPath = '.') {
660
784
  const workspacePath = validateWorkspacePath(requestedPath);
@@ -665,19 +789,19 @@ export class WorkRuntimeService {
665
789
  });
666
790
  }
667
791
  async withWorkspaceHelperContainer(task, operation) {
668
- const releaseLease = this.acquireRuntimeLease(task);
792
+ const releaseLease = await this.acquireRuntimeLease(task);
669
793
  try {
670
794
  await this.ensureImage(task);
671
- this.assertTaskIsActive(task);
672
- return await this.withLifecycleLock(task.id, async () => {
673
- this.assertTaskIsActive(task);
674
- await this.prepareWithLock(task);
675
- this.assertTaskIsActive(task);
795
+ await this.assertTaskIsActive(task);
796
+ return await this.withLifecycleLock(task.id, async (_assertHeld, signal) => {
797
+ await this.assertTaskIsActive(task);
798
+ await this.prepareWithLock(task, signal);
799
+ await this.assertTaskIsActive(task);
676
800
  try {
677
801
  return await operation();
678
802
  }
679
803
  finally {
680
- await this.stopContainerIfIdleWithLock(task);
804
+ await this.stopContainerIfIdleWithLock(task, signal);
681
805
  }
682
806
  });
683
807
  }
@@ -685,7 +809,7 @@ export class WorkRuntimeService {
685
809
  releaseLease();
686
810
  }
687
811
  }
688
- async stopContainerIfIdleWithLock(task) {
812
+ async stopContainerIfIdleWithLock(task, signal) {
689
813
  if (this.activeCommands.has(task.id))
690
814
  return;
691
815
  // An attached terminal session owns the running container exactly like a
@@ -693,7 +817,7 @@ export class WorkRuntimeService {
693
817
  if ((this.terminalHolds.get(task.id) ?? 0) > 0)
694
818
  return;
695
819
  try {
696
- if ((await this.previewProcessCheckWithLock(task)) === 'ready' &&
820
+ if ((await this.previewProcessCheckWithLock(task, signal)) === 'ready' &&
697
821
  this.previewLeaseReleases.has(task.id)) {
698
822
  return;
699
823
  }
@@ -701,9 +825,9 @@ export class WorkRuntimeService {
701
825
  catch (error) {
702
826
  logger.warn(`Could not verify preview state before idling Work container ${task.containerName}; stopping it:`, error);
703
827
  }
704
- await this.stopContainerWithLock(task);
828
+ await this.stopContainerWithLock(task, signal);
705
829
  this.releasePreviewLease(task.id);
706
- this.markPreviewStopped(task.id);
830
+ await this.markPreviewStopped(task.id);
707
831
  this.completeRecoveryTask(task.id);
708
832
  }
709
833
  async readFile(task, requestedPath) {
@@ -930,20 +1054,21 @@ export class WorkRuntimeService {
930
1054
  throw new WorkRuntimeError('Command must contain 1 to 20,000 characters.', 400, 'WORK_INVALID_COMMAND');
931
1055
  }
932
1056
  const boundedTimeout = Math.min(Math.max(timeoutMs, 1000), 600000);
933
- const releaseLease = this.acquireRuntimeLease(task);
1057
+ const releaseLease = await this.acquireRuntimeLease(task);
934
1058
  let commandRegistered = false;
1059
+ let containerStopped = false;
935
1060
  try {
936
1061
  await this.ensureImage(task);
937
- this.assertTaskIsActive(task);
938
- await this.withLifecycleLock(task.id, async () => {
939
- this.assertTaskIsActive(task);
1062
+ await this.assertTaskIsActive(task);
1063
+ return await this.withLifecycleLock(task.id, async (assertHeld, signal) => {
1064
+ await this.assertTaskIsActive(task);
940
1065
  try {
941
- await this.prepareWithLock(task);
942
- this.assertTaskIsActive(task);
1066
+ await this.prepareWithLock(task, signal);
1067
+ await this.assertTaskIsActive(task);
943
1068
  if (this.activeCommands.has(task.id)) {
944
1069
  throw new WorkRuntimeError('This Work task already has an active command.', 409, 'WORK_COMMAND_ACTIVE');
945
1070
  }
946
- const previewState = await this.previewProcessCheckWithLock(task);
1071
+ const previewState = await this.previewProcessCheckWithLock(task, signal);
947
1072
  if (previewState === 'ready' || previewState === 'alive') {
948
1073
  throw new WorkRuntimeError('Stop the Work preview before running another command.', 409, 'WORK_COMMAND_REQUIRES_STOPPED_PREVIEW');
949
1074
  }
@@ -951,36 +1076,50 @@ export class WorkRuntimeService {
951
1076
  commandRegistered = true;
952
1077
  }
953
1078
  catch (error) {
954
- await this.stopContainerIfIdleWithLock(task);
1079
+ await this.stopContainerIfIdleWithLock(task, signal);
955
1080
  throw error;
956
1081
  }
957
- });
958
- return await this.exec(task, [
959
- 'timeout',
960
- '--signal=TERM',
961
- '--kill-after=3s',
962
- `${Math.ceil(boundedTimeout / 1000)}s`,
963
- '/bin/bash',
964
- '-c',
965
- MANAGED_COMMAND_SCRIPT,
966
- '--',
967
- command,
968
- ], {
969
- timeoutMs: boundedTimeout + 5000,
970
- maxOutputChars: config.maxOutputChars,
971
- acceptFailure: true,
1082
+ try {
1083
+ const result = await this.exec(task, [
1084
+ 'timeout',
1085
+ '--signal=TERM',
1086
+ '--kill-after=3s',
1087
+ `${Math.ceil(boundedTimeout / 1000)}s`,
1088
+ '/bin/bash',
1089
+ '-c',
1090
+ MANAGED_COMMAND_SCRIPT,
1091
+ '--',
1092
+ command,
1093
+ ], {
1094
+ timeoutMs: boundedTimeout + 5000,
1095
+ maxOutputChars: config.maxOutputChars,
1096
+ acceptFailure: true,
1097
+ abortSignal: signal,
1098
+ });
1099
+ await assertHeld();
1100
+ return result;
1101
+ }
1102
+ finally {
1103
+ if (commandRegistered) {
1104
+ // Keep the distributed lifecycle fence through teardown. A
1105
+ // second replica must never stop or recreate this sandbox in
1106
+ // the gap between preparation and Docker exec.
1107
+ await this.stopContainerWithLock(task, signal);
1108
+ containerStopped = true;
1109
+ }
1110
+ }
972
1111
  });
973
1112
  }
974
1113
  finally {
1114
+ this.activeCommands.delete(task.id);
975
1115
  try {
976
- if (commandRegistered) {
977
- // This also kills intentionally detached descendants that escaped
978
- // the managed process group. The named volume remains durable.
979
- await this.stopContainer(task);
1116
+ if (containerStopped) {
1117
+ this.releasePreviewLease(task.id);
1118
+ await this.markPreviewStopped(task.id);
1119
+ this.completeRecoveryTask(task.id);
980
1120
  }
981
1121
  }
982
1122
  finally {
983
- this.activeCommands.delete(task.id);
984
1123
  releaseLease();
985
1124
  }
986
1125
  }
@@ -993,35 +1132,37 @@ export class WorkRuntimeService {
993
1132
  if (previewCommand && previewCommand.length > 20000) {
994
1133
  throw new WorkRuntimeError('Preview command is too long.', 400, 'WORK_INVALID_COMMAND');
995
1134
  }
996
- const releaseLease = this.acquireRuntimeLease(task);
1135
+ const releaseLease = await this.acquireRuntimeLease(task);
997
1136
  let leaseRetained = false;
998
1137
  try {
999
1138
  await this.ensureImage(task);
1000
- this.assertTaskIsActive(task);
1001
- const url = await this.withLifecycleLock(task.id, async () => {
1002
- this.assertTaskIsActive(task);
1139
+ await this.assertTaskIsActive(task);
1140
+ const url = await this.withLifecycleLock(task.id, async (assertHeld, signal) => {
1141
+ await this.assertTaskIsActive(task);
1003
1142
  this.assertCurrentNetworkPolicy(task);
1004
1143
  if (this.activeCommands.has(task.id)) {
1005
1144
  throw new WorkRuntimeError('Wait for the active command to finish before starting a preview.', 409, 'WORK_PREVIEW_COMMAND_ACTIVE');
1006
1145
  }
1007
- hooks.onStarting?.();
1146
+ await assertHeld();
1147
+ await hooks.onStarting?.();
1008
1148
  try {
1009
- await this.prepareWithLock(task);
1010
- this.assertTaskIsActive(task);
1149
+ await this.prepareWithLock(task, signal);
1150
+ await this.assertTaskIsActive(task);
1011
1151
  const previewLaunch = previewCommand
1012
1152
  ? {
1013
1153
  kind: 'shell',
1014
1154
  workdir: '/workspace',
1015
1155
  command: previewCommand,
1016
1156
  }
1017
- : await this.detectPreviewLaunch(task);
1018
- const previewUrl = await this.startPreviewPrepared(task, previewLaunch);
1019
- this.assertTaskIsActive(task);
1020
- hooks.onRunning?.(previewUrl);
1021
- return previewUrl;
1157
+ : await this.detectPreviewLaunch(task, signal);
1158
+ const preview = await this.startPreviewPrepared(task, previewLaunch, signal);
1159
+ await this.assertTaskIsActive(task);
1160
+ await assertHeld();
1161
+ await hooks.onRunning?.(preview.url, preview.endpoint);
1162
+ return preview.url;
1022
1163
  }
1023
1164
  catch (error) {
1024
- hooks.onFailed?.();
1165
+ await hooks.onFailed?.();
1025
1166
  this.releasePreviewLease(task.id);
1026
1167
  throw error;
1027
1168
  }
@@ -1041,12 +1182,13 @@ export class WorkRuntimeService {
1041
1182
  }
1042
1183
  }
1043
1184
  }
1044
- async detectPreviewLaunch(task) {
1185
+ async detectPreviewLaunch(task, signal) {
1045
1186
  try {
1046
1187
  const result = await this.driver.exec(task, ['node', '-e', PREVIEW_TARGET_SCRIPT, '--', '/workspace'], {
1047
1188
  acceptFailure: true,
1048
1189
  timeoutMs: 5000,
1049
1190
  maxOutputChars: 10000,
1191
+ abortSignal: signal,
1050
1192
  });
1051
1193
  if (result.exitCode !== 0) {
1052
1194
  throw new WorkRuntimeError(`Could not inspect the workspace for a previewable app.${result.stderr.trim() ? `\n${result.stderr.trim()}` : ''}`, 422, 'WORK_PREVIEW_DETECTION_FAILED');
@@ -1084,7 +1226,7 @@ export class WorkRuntimeService {
1084
1226
  }
1085
1227
  catch (error) {
1086
1228
  try {
1087
- await this.stopPreviewPrepared(task);
1229
+ await this.stopPreviewPrepared(task, signal);
1088
1230
  }
1089
1231
  catch (cleanupError) {
1090
1232
  logger.warn(`Could not clean up failed preview detection for Work task ${task.id}:`, cleanupError);
@@ -1092,7 +1234,7 @@ export class WorkRuntimeService {
1092
1234
  throw error;
1093
1235
  }
1094
1236
  }
1095
- async startPreviewPrepared(task, previewLaunch) {
1237
+ async startPreviewPrepared(task, previewLaunch, signal) {
1096
1238
  try {
1097
1239
  const launch = await this.driver.exec(task, [
1098
1240
  '/bin/bash',
@@ -1121,6 +1263,7 @@ export class WorkRuntimeService {
1121
1263
  workdir: previewLaunch.workdir,
1122
1264
  acceptFailure: true,
1123
1265
  timeoutMs: 5000,
1266
+ abortSignal: signal,
1124
1267
  });
1125
1268
  if (launch.exitCode !== 0 && launch.exitCode !== 17) {
1126
1269
  throw await this.previewStartError(task, 'Preview process could not be launched.', launch.stderr);
@@ -1133,7 +1276,12 @@ export class WorkRuntimeService {
1133
1276
  PREVIEW_READY_SCRIPT,
1134
1277
  '--',
1135
1278
  String(config.previewPort),
1136
- ], { acceptFailure: true, timeoutMs: 2000, maxOutputChars: 2000 });
1279
+ ], {
1280
+ acceptFailure: true,
1281
+ timeoutMs: 2000,
1282
+ maxOutputChars: 2000,
1283
+ abortSignal: signal,
1284
+ });
1137
1285
  if (readiness.exitCode === 0)
1138
1286
  break;
1139
1287
  if (readiness.exitCode !== 3) {
@@ -1142,17 +1290,24 @@ export class WorkRuntimeService {
1142
1290
  if (Date.now() >= deadline) {
1143
1291
  throw await this.previewStartError(task, `Preview did not listen on port ${config.previewPort} within ${PREVIEW_READY_TIMEOUT_MS / 1000} seconds.`);
1144
1292
  }
1145
- await new Promise(resolve => setTimeout(resolve, PREVIEW_POLL_INTERVAL_MS));
1293
+ await waitForAbortSignal(new Promise(resolve => setTimeout(resolve, PREVIEW_POLL_INTERVAL_MS)), signal);
1146
1294
  }
1147
1295
  const endpoint = await this.driver.previewEndpoint(task);
1148
1296
  if (!endpoint) {
1149
1297
  throw new WorkRuntimeError('The runtime did not expose the preview port.', 503, 'WORK_PREVIEW_PORT_UNAVAILABLE');
1150
1298
  }
1151
- return workPreviewProxyService.createPreviewUrl(task.id, endpoint.port, endpoint.host);
1299
+ const upstream = {
1300
+ host: normalizePreviewUpstreamHost(endpoint.host),
1301
+ port: endpoint.port,
1302
+ };
1303
+ return {
1304
+ url: workPreviewProxyService.createPreviewUrl(task.id, endpoint.port),
1305
+ endpoint: upstream,
1306
+ };
1152
1307
  }
1153
1308
  catch (error) {
1154
1309
  try {
1155
- await this.stopPreviewPrepared(task);
1310
+ await this.stopPreviewPrepared(task, signal);
1156
1311
  }
1157
1312
  catch (cleanupError) {
1158
1313
  logger.warn(`Could not clean up failed preview for Work task ${task.id}:`, cleanupError);
@@ -1174,14 +1329,15 @@ export class WorkRuntimeService {
1174
1329
  async stopPreview(task, hooks = {}) {
1175
1330
  let stopped = false;
1176
1331
  try {
1177
- await this.withLifecycleLock(task.id, async () => {
1332
+ await this.withLifecycleLock(task.id, async (assertHeld, signal) => {
1178
1333
  this.assertCurrentNetworkPolicy(task);
1179
1334
  if (this.activeCommands.has(task.id)) {
1180
1335
  throw new WorkRuntimeError('Wait for the active command to finish before stopping a preview.', 409, 'WORK_PREVIEW_COMMAND_ACTIVE');
1181
1336
  }
1182
- await this.stopPreviewPrepared(task);
1337
+ await this.stopPreviewPrepared(task, signal);
1183
1338
  stopped = true;
1184
- hooks.onStopped?.();
1339
+ await assertHeld();
1340
+ await hooks.onStopped?.();
1185
1341
  });
1186
1342
  }
1187
1343
  finally {
@@ -1191,30 +1347,35 @@ export class WorkRuntimeService {
1191
1347
  }
1192
1348
  }
1193
1349
  async isPreviewRunning(task) {
1194
- return this.withLifecycleLock(task.id, async () => {
1350
+ return this.withLifecycleLock(task.id, async (_assertHeld, signal) => {
1195
1351
  this.assertCurrentNetworkPolicy(task);
1196
1352
  // An ordinary command owns this running container and will stop it when
1197
1353
  // it finishes. Preview reconciliation must not interrupt that command.
1198
1354
  if (this.activeCommands.has(task.id))
1199
1355
  return false;
1200
- const state = await this.previewProcessCheckWithLock(task);
1356
+ const state = await this.previewProcessCheckWithLock(task, signal);
1201
1357
  if (state === 'ready' && this.previewLeaseReleases.has(task.id)) {
1202
1358
  return true;
1203
1359
  }
1204
1360
  if (state === 'dead' || state === 'alive') {
1205
- await this.stopPreviewPrepared(task);
1361
+ await this.stopPreviewPrepared(task, signal);
1206
1362
  }
1207
1363
  if (state === 'ready') {
1208
- await this.stopPreviewPrepared(task);
1364
+ await this.stopPreviewPrepared(task, signal);
1209
1365
  }
1210
1366
  this.releasePreviewLease(task.id);
1211
1367
  return false;
1212
1368
  });
1213
1369
  }
1214
- async previewProcessCheckWithLock(task) {
1370
+ async previewProcessCheckWithLock(task, signal) {
1215
1371
  if ((await this.driver.runtimeState(task)) !== 'running')
1216
1372
  return 'absent';
1217
- const readiness = await this.driver.exec(task, ['node', '-e', PREVIEW_READY_SCRIPT, '--', String(config.previewPort)], { acceptFailure: true, timeoutMs: 2000, maxOutputChars: 2000 });
1373
+ const readiness = await this.driver.exec(task, ['node', '-e', PREVIEW_READY_SCRIPT, '--', String(config.previewPort)], {
1374
+ acceptFailure: true,
1375
+ timeoutMs: 2000,
1376
+ maxOutputChars: 2000,
1377
+ abortSignal: signal,
1378
+ });
1218
1379
  if (readiness.exitCode === 0)
1219
1380
  return 'ready';
1220
1381
  if (readiness.exitCode === 3)
@@ -1223,18 +1384,17 @@ export class WorkRuntimeService {
1223
1384
  return 'dead';
1224
1385
  throw new WorkRuntimeError(readiness.stderr.trim() || 'Could not inspect the Work preview.', 503, 'WORK_PREVIEW_INSPECT_FAILED');
1225
1386
  }
1226
- async stopPreviewPrepared(task) {
1227
- workPreviewProxyService.clearPreviewUpstream(task.id);
1387
+ async stopPreviewPrepared(task, signal) {
1228
1388
  // Stop the container, not only the recorded process group. A custom
1229
1389
  // preview command can intentionally double-fork or create a new session;
1230
1390
  // Docker's container boundary guarantees those descendants are gone.
1231
1391
  // The named /workspace volume remains persistent across the restart.
1232
- await this.stopContainerWithLock(task);
1392
+ await this.stopContainerWithLock(task, signal);
1233
1393
  }
1234
1394
  async ensureImage(task) {
1235
1395
  // Pulls are deduplicated per image, not globally: tasks under different
1236
1396
  // policies may run different images.
1237
- const image = workPolicyService.resolve(task.policyId).image;
1397
+ const image = (await workPolicyService.resolve(task.policyId)).image;
1238
1398
  let preparation = this.imagePreparations.get(image);
1239
1399
  if (!preparation) {
1240
1400
  preparation = this.driver.ensureImage(image).catch(error => {
@@ -1245,34 +1405,29 @@ export class WorkRuntimeService {
1245
1405
  }
1246
1406
  await preparation;
1247
1407
  }
1248
- assertTaskIsActive(task) {
1408
+ async assertTaskIsActive(task) {
1249
1409
  this.assertAcceptingWork();
1250
1410
  if (this.retiringTasks.has(task.id)) {
1251
1411
  throw new WorkRuntimeError('This Work task is being deleted.', 409, 'WORK_TASK_REMOVING');
1252
1412
  }
1253
- this.assertTaskOwnerHasWorkAccess(task);
1413
+ await this.assertTaskOwnerHasWorkAccess(task);
1254
1414
  }
1255
- assertTaskOwnerHasWorkAccess(task) {
1256
- const access = getDatabase()
1257
- .prepare(`SELECT users.role AS role, users.account_status AS status
1258
- FROM work_tasks
1259
- JOIN users ON users.id = work_tasks.user_id
1260
- WHERE work_tasks.id = ? AND work_tasks.user_id = ?`)
1261
- .get(task.id, task.userId);
1415
+ async assertTaskOwnerHasWorkAccess(task) {
1416
+ const access = await getWorkPersistence().findTaskOwnerAccess(task.id, task.userId);
1262
1417
  if (!access) {
1263
1418
  throw new WorkRuntimeError('This Work task no longer exists.', 409, 'WORK_TASK_REMOVING');
1264
1419
  }
1265
- if (!userHasWorkAccess(access)) {
1420
+ if (!(await userHasWorkAccess(access))) {
1266
1421
  throw new WorkRuntimeError('Work access for this task was revoked.', 403, 'WORK_ACCESS_REVOKED');
1267
1422
  }
1268
1423
  }
1269
- assertTaskStillOwned(task) {
1270
- const persisted = getDatabase()
1271
- .prepare(`SELECT 1
1272
- FROM work_tasks
1273
- WHERE id = ? AND user_id = ?
1274
- AND volume_name = ? AND container_name = ?`)
1275
- .get(task.id, task.userId, task.volumeName, task.containerName);
1424
+ async assertTaskStillOwned(task) {
1425
+ const persisted = await getWorkPersistence().taskStillOwnsResources({
1426
+ taskId: task.id,
1427
+ userId: task.userId,
1428
+ volumeName: task.volumeName,
1429
+ containerName: task.containerName,
1430
+ });
1276
1431
  if (!persisted) {
1277
1432
  throw new WorkRuntimeError('This Work task no longer exists or its managed resources changed.', 409, 'WORK_TASK_REMOVING');
1278
1433
  }
@@ -1289,7 +1444,96 @@ export class WorkRuntimeService {
1289
1444
  }
1290
1445
  async withLifecycleLock(taskId, operation) {
1291
1446
  const previous = this.lifecycleTails.get(taskId) || Promise.resolve();
1292
- const current = previous.catch(() => undefined).then(operation);
1447
+ const current = previous
1448
+ .catch(() => undefined)
1449
+ .then(async () => {
1450
+ let sharedLease = null;
1451
+ if (getPlatformRuntimeConfig().mode === 'team') {
1452
+ const deadline = Date.now() + 10000;
1453
+ do {
1454
+ let abandoned = false;
1455
+ const pendingLease = getCoordinator().acquireLease(`work-task-lifecycle:${taskId}`, 60000);
1456
+ void pendingLease
1457
+ .then(lease => {
1458
+ if (!abandoned || !lease)
1459
+ return;
1460
+ void withCoordinationTimeout(lease.release(), SHARED_COORDINATION_OPERATION_TIMEOUT_MS).catch(() => undefined);
1461
+ })
1462
+ .catch(() => undefined);
1463
+ try {
1464
+ sharedLease = await withCoordinationTimeout(pendingLease, SHARED_COORDINATION_OPERATION_TIMEOUT_MS);
1465
+ }
1466
+ catch (_error) {
1467
+ abandoned = true;
1468
+ throw new WorkRuntimeError('Work task lifecycle coordination is unavailable.', 503, 'WORK_RUNTIME_LEASE_CONFLICT');
1469
+ }
1470
+ if (!sharedLease) {
1471
+ await new Promise(resolve => setTimeout(resolve, 25));
1472
+ }
1473
+ } while (!sharedLease && Date.now() < deadline);
1474
+ if (!sharedLease) {
1475
+ throw new WorkRuntimeError('This Work task has a lifecycle operation on another replica.', 409, 'WORK_RUNTIME_LEASE_CONFLICT');
1476
+ }
1477
+ }
1478
+ let closed = false;
1479
+ let lost = false;
1480
+ const lossController = new AbortController();
1481
+ let renewalTimer;
1482
+ const leaseLostError = () => new WorkRuntimeError('The shared Work task lifecycle lease was lost.', 503, 'WORK_RUNTIME_LEASE_CONFLICT');
1483
+ const markLost = () => {
1484
+ if (lost)
1485
+ return;
1486
+ lost = true;
1487
+ lossController.abort(leaseLostError());
1488
+ };
1489
+ const assertHeld = async () => {
1490
+ if (!sharedLease)
1491
+ return;
1492
+ if (closed || lost)
1493
+ throw leaseLostError();
1494
+ try {
1495
+ if (await withCoordinationTimeout(sharedLease.extend(60000), SHARED_COORDINATION_OPERATION_TIMEOUT_MS)) {
1496
+ return;
1497
+ }
1498
+ }
1499
+ catch {
1500
+ // Report expiry and coordination outages through one safe fence.
1501
+ }
1502
+ markLost();
1503
+ throw leaseLostError();
1504
+ };
1505
+ if (sharedLease) {
1506
+ const renew = async () => {
1507
+ if (closed)
1508
+ return;
1509
+ try {
1510
+ if (!(await withCoordinationTimeout(sharedLease?.extend(60000) ?? Promise.resolve(false), SHARED_COORDINATION_OPERATION_TIMEOUT_MS))) {
1511
+ markLost();
1512
+ }
1513
+ }
1514
+ catch {
1515
+ markLost();
1516
+ }
1517
+ if (!closed && !lost)
1518
+ renewalTimer = setTimeout(renew, 20000);
1519
+ };
1520
+ renewalTimer = setTimeout(renew, 20000);
1521
+ renewalTimer.unref?.();
1522
+ }
1523
+ try {
1524
+ await assertHeld();
1525
+ const result = await operation(assertHeld, lossController.signal);
1526
+ return result;
1527
+ }
1528
+ finally {
1529
+ closed = true;
1530
+ if (renewalTimer)
1531
+ clearTimeout(renewalTimer);
1532
+ if (sharedLease) {
1533
+ await withCoordinationTimeout(sharedLease.release(), SHARED_COORDINATION_OPERATION_TIMEOUT_MS).catch(() => false);
1534
+ }
1535
+ }
1536
+ });
1293
1537
  const tail = current.then(() => undefined, () => undefined);
1294
1538
  this.lifecycleTails.set(taskId, tail);
1295
1539
  try {