libre-webui 0.21.2 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +308 -328
- package/backend/dist/cli/migrateSqliteToPostgres.d.ts +2 -0
- package/backend/dist/cli/migrateSqliteToPostgres.d.ts.map +1 -0
- package/backend/dist/cli/migrateSqliteToPostgres.js +113 -0
- package/backend/dist/cli/migrateSqliteToPostgres.js.map +1 -0
- package/backend/dist/cli/recoveryBackup.d.ts +3 -0
- package/backend/dist/cli/recoveryBackup.d.ts.map +1 -0
- package/backend/dist/cli/recoveryBackup.js +251 -0
- package/backend/dist/cli/recoveryBackup.js.map +1 -0
- package/backend/dist/cli/recoveryInventory.d.ts +2 -0
- package/backend/dist/cli/recoveryInventory.d.ts.map +1 -0
- package/backend/dist/cli/recoveryInventory.js +109 -0
- package/backend/dist/cli/recoveryInventory.js.map +1 -0
- package/backend/dist/db.d.ts +27 -0
- package/backend/dist/db.d.ts.map +1 -1
- package/backend/dist/db.js +333 -16
- package/backend/dist/db.js.map +1 -1
- package/backend/dist/env.d.ts.map +1 -1
- package/backend/dist/env.js +12 -2
- package/backend/dist/env.js.map +1 -1
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +235 -47
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/main.d.ts +2 -0
- package/backend/dist/main.d.ts.map +1 -0
- package/backend/dist/main.js +137 -0
- package/backend/dist/main.js.map +1 -0
- package/backend/dist/middleware/auth.d.ts.map +1 -1
- package/backend/dist/middleware/auth.js +7 -3
- package/backend/dist/middleware/auth.js.map +1 -1
- package/backend/dist/middleware/chatCancellationAdmission.d.ts +7 -0
- package/backend/dist/middleware/chatCancellationAdmission.d.ts.map +1 -0
- package/backend/dist/middleware/chatCancellationAdmission.js +17 -0
- package/backend/dist/middleware/chatCancellationAdmission.js.map +1 -0
- package/backend/dist/middleware/coordinatedRateLimit.d.ts +18 -0
- package/backend/dist/middleware/coordinatedRateLimit.d.ts.map +1 -0
- package/backend/dist/middleware/coordinatedRateLimit.js +52 -0
- package/backend/dist/middleware/coordinatedRateLimit.js.map +1 -0
- package/backend/dist/middleware/sharedRateLimit.d.ts +26 -0
- package/backend/dist/middleware/sharedRateLimit.d.ts.map +1 -0
- package/backend/dist/middleware/sharedRateLimit.js +99 -0
- package/backend/dist/middleware/sharedRateLimit.js.map +1 -0
- package/backend/dist/models/personaModel.d.ts +1 -26
- package/backend/dist/models/personaModel.d.ts.map +1 -1
- package/backend/dist/models/personaModel.js +54 -247
- package/backend/dist/models/personaModel.js.map +1 -1
- package/backend/dist/models/userModel.d.ts +23 -66
- package/backend/dist/models/userModel.d.ts.map +1 -1
- package/backend/dist/models/userModel.js +110 -187
- package/backend/dist/models/userModel.js.map +1 -1
- package/backend/dist/persistence/chatGenerationTypes.d.ts +24 -0
- package/backend/dist/persistence/chatGenerationTypes.d.ts.map +1 -0
- package/backend/dist/persistence/chatGenerationTypes.js +7 -0
- package/backend/dist/persistence/chatGenerationTypes.js.map +1 -0
- package/backend/dist/persistence/extensionTypes.d.ts +185 -0
- package/backend/dist/persistence/extensionTypes.d.ts.map +1 -0
- package/backend/dist/persistence/extensionTypes.js +13 -0
- package/backend/dist/persistence/extensionTypes.js.map +1 -0
- package/backend/dist/persistence/identityDeletionTypes.d.ts +16 -0
- package/backend/dist/persistence/identityDeletionTypes.d.ts.map +1 -0
- package/backend/dist/persistence/identityDeletionTypes.js +7 -0
- package/backend/dist/persistence/identityDeletionTypes.js.map +1 -0
- package/backend/dist/persistence/index.d.ts +48 -0
- package/backend/dist/persistence/index.d.ts.map +1 -0
- package/backend/dist/persistence/index.js +159 -0
- package/backend/dist/persistence/index.js.map +1 -0
- package/backend/dist/persistence/postgresConfig.d.ts +32 -0
- package/backend/dist/persistence/postgresConfig.d.ts.map +1 -0
- package/backend/dist/persistence/postgresConfig.js +91 -0
- package/backend/dist/persistence/postgresConfig.js.map +1 -0
- package/backend/dist/persistence/postgresCoreMigration.d.ts +8 -0
- package/backend/dist/persistence/postgresCoreMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresCoreMigration.js +179 -0
- package/backend/dist/persistence/postgresCoreMigration.js.map +1 -0
- package/backend/dist/persistence/postgresDatabase.d.ts +40 -0
- package/backend/dist/persistence/postgresDatabase.d.ts.map +1 -0
- package/backend/dist/persistence/postgresDatabase.js +148 -0
- package/backend/dist/persistence/postgresDatabase.js.map +1 -0
- package/backend/dist/persistence/postgresExtensionMigration.d.ts +4 -0
- package/backend/dist/persistence/postgresExtensionMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresExtensionMigration.js +143 -0
- package/backend/dist/persistence/postgresExtensionMigration.js.map +1 -0
- package/backend/dist/persistence/postgresExtensionRepositories.d.ts +6 -0
- package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -0
- package/backend/dist/persistence/postgresExtensionRepositories.js +550 -0
- package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -0
- package/backend/dist/persistence/postgresImportState.d.ts +9 -0
- package/backend/dist/persistence/postgresImportState.d.ts.map +1 -0
- package/backend/dist/persistence/postgresImportState.js +64 -0
- package/backend/dist/persistence/postgresImportState.js.map +1 -0
- package/backend/dist/persistence/postgresMigrationRegistry.d.ts +4 -0
- package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -0
- package/backend/dist/persistence/postgresMigrationRegistry.js +33 -0
- package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -0
- package/backend/dist/persistence/postgresMigrationTypes.d.ts +24 -0
- package/backend/dist/persistence/postgresMigrationTypes.d.ts.map +1 -0
- package/backend/dist/persistence/postgresMigrationTypes.js +7 -0
- package/backend/dist/persistence/postgresMigrationTypes.js.map +1 -0
- package/backend/dist/persistence/postgresMigrations.d.ts +15 -0
- package/backend/dist/persistence/postgresMigrations.d.ts.map +1 -0
- package/backend/dist/persistence/postgresMigrations.js +333 -0
- package/backend/dist/persistence/postgresMigrations.js.map +1 -0
- package/backend/dist/persistence/postgresPersistence.d.ts +17 -0
- package/backend/dist/persistence/postgresPersistence.d.ts.map +1 -0
- package/backend/dist/persistence/postgresPersistence.js +332 -0
- package/backend/dist/persistence/postgresPersistence.js.map +1 -0
- package/backend/dist/persistence/postgresPluginDefinitionMigration.d.ts +4 -0
- package/backend/dist/persistence/postgresPluginDefinitionMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresPluginDefinitionMigration.js +40 -0
- package/backend/dist/persistence/postgresPluginDefinitionMigration.js.map +1 -0
- package/backend/dist/persistence/postgresResourceRepositories.d.ts +7 -0
- package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -0
- package/backend/dist/persistence/postgresResourceRepositories.js +776 -0
- package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -0
- package/backend/dist/persistence/postgresSchemaInspector.d.ts +14 -0
- package/backend/dist/persistence/postgresSchemaInspector.d.ts.map +1 -0
- package/backend/dist/persistence/postgresSchemaInspector.js +817 -0
- package/backend/dist/persistence/postgresSchemaInspector.js.map +1 -0
- package/backend/dist/persistence/resourceTypes.d.ts +207 -0
- package/backend/dist/persistence/resourceTypes.d.ts.map +1 -0
- package/backend/dist/persistence/resourceTypes.js +38 -0
- package/backend/dist/persistence/resourceTypes.js.map +1 -0
- package/backend/dist/persistence/sqliteExtensionRepositories.d.ts +4 -0
- package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -0
- package/backend/dist/persistence/sqliteExtensionRepositories.js +494 -0
- package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -0
- package/backend/dist/persistence/sqliteMigrations.d.ts +93 -0
- package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -0
- package/backend/dist/persistence/sqliteMigrations.js +2232 -0
- package/backend/dist/persistence/sqliteMigrations.js.map +1 -0
- package/backend/dist/persistence/sqlitePersistence.d.ts +23 -0
- package/backend/dist/persistence/sqlitePersistence.d.ts.map +1 -0
- package/backend/dist/persistence/sqlitePersistence.js +596 -0
- package/backend/dist/persistence/sqlitePersistence.js.map +1 -0
- package/backend/dist/persistence/sqliteResourceRepositories.d.ts +4 -0
- package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -0
- package/backend/dist/persistence/sqliteResourceRepositories.js +663 -0
- package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -0
- package/backend/dist/persistence/sqliteSyncExecutor.d.ts +5 -0
- package/backend/dist/persistence/sqliteSyncExecutor.d.ts.map +1 -0
- package/backend/dist/persistence/sqliteSyncExecutor.js +19 -0
- package/backend/dist/persistence/sqliteSyncExecutor.js.map +1 -0
- package/backend/dist/persistence/sqliteToPostgresMigration.d.ts +80 -0
- package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -0
- package/backend/dist/persistence/sqliteToPostgresMigration.js +1543 -0
- package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -0
- package/backend/dist/persistence/types.d.ts +131 -0
- package/backend/dist/persistence/types.d.ts.map +1 -0
- package/backend/dist/persistence/types.js +18 -0
- package/backend/dist/persistence/types.js.map +1 -0
- package/backend/dist/persistence/voiceProfileNameLookup.d.ts +9 -0
- package/backend/dist/persistence/voiceProfileNameLookup.d.ts.map +1 -0
- package/backend/dist/persistence/voiceProfileNameLookup.js +15 -0
- package/backend/dist/persistence/voiceProfileNameLookup.js.map +1 -0
- package/backend/dist/platform/coordination/index.d.ts +7 -0
- package/backend/dist/platform/coordination/index.d.ts.map +1 -0
- package/backend/dist/platform/coordination/index.js +24 -0
- package/backend/dist/platform/coordination/index.js.map +1 -0
- package/backend/dist/platform/coordination/localCoordinator.d.ts +49 -0
- package/backend/dist/platform/coordination/localCoordinator.d.ts.map +1 -0
- package/backend/dist/platform/coordination/localCoordinator.js +380 -0
- package/backend/dist/platform/coordination/localCoordinator.js.map +1 -0
- package/backend/dist/platform/coordination/redisCoordinator.d.ts +83 -0
- package/backend/dist/platform/coordination/redisCoordinator.d.ts.map +1 -0
- package/backend/dist/platform/coordination/redisCoordinator.js +726 -0
- package/backend/dist/platform/coordination/redisCoordinator.js.map +1 -0
- package/backend/dist/platform/coordination/service.d.ts +11 -0
- package/backend/dist/platform/coordination/service.d.ts.map +1 -0
- package/backend/dist/platform/coordination/service.js +55 -0
- package/backend/dist/platform/coordination/service.js.map +1 -0
- package/backend/dist/platform/coordination/sharedAdmission.d.ts +53 -0
- package/backend/dist/platform/coordination/sharedAdmission.d.ts.map +1 -0
- package/backend/dist/platform/coordination/sharedAdmission.js +194 -0
- package/backend/dist/platform/coordination/sharedAdmission.js.map +1 -0
- package/backend/dist/platform/coordination/types.d.ts +76 -0
- package/backend/dist/platform/coordination/types.d.ts.map +1 -0
- package/backend/dist/platform/coordination/types.js +32 -0
- package/backend/dist/platform/coordination/types.js.map +1 -0
- package/backend/dist/platform/events/durableEventGateway.d.ts +54 -0
- package/backend/dist/platform/events/durableEventGateway.d.ts.map +1 -0
- package/backend/dist/platform/events/durableEventGateway.js +262 -0
- package/backend/dist/platform/events/durableEventGateway.js.map +1 -0
- package/backend/dist/platform/events/index.d.ts +3 -0
- package/backend/dist/platform/events/index.d.ts.map +1 -0
- package/backend/dist/platform/events/index.js +8 -0
- package/backend/dist/platform/events/index.js.map +1 -0
- package/backend/dist/platform/events/service.d.ts +8 -0
- package/backend/dist/platform/events/service.d.ts.map +1 -0
- package/backend/dist/platform/events/service.js +25 -0
- package/backend/dist/platform/events/service.js.map +1 -0
- package/backend/dist/platform/jobs/chatGenerationEnqueuer.d.ts +3 -0
- package/backend/dist/platform/jobs/chatGenerationEnqueuer.d.ts.map +1 -0
- package/backend/dist/platform/jobs/chatGenerationEnqueuer.js +55 -0
- package/backend/dist/platform/jobs/chatGenerationEnqueuer.js.map +1 -0
- package/backend/dist/platform/jobs/documentIngestionEnqueuer.d.ts +3 -0
- package/backend/dist/platform/jobs/documentIngestionEnqueuer.d.ts.map +1 -0
- package/backend/dist/platform/jobs/documentIngestionEnqueuer.js +38 -0
- package/backend/dist/platform/jobs/documentIngestionEnqueuer.js.map +1 -0
- package/backend/dist/platform/jobs/domainJobContracts.d.ts +30 -0
- package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -0
- package/backend/dist/platform/jobs/domainJobContracts.js +53 -0
- package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -0
- package/backend/dist/platform/jobs/domainJobHandlers.d.ts +11 -0
- package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -0
- package/backend/dist/platform/jobs/domainJobHandlers.js +612 -0
- package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -0
- package/backend/dist/platform/jobs/durableEventIdentity.d.ts +8 -0
- package/backend/dist/platform/jobs/durableEventIdentity.d.ts.map +1 -0
- package/backend/dist/platform/jobs/durableEventIdentity.js +33 -0
- package/backend/dist/platform/jobs/durableEventIdentity.js.map +1 -0
- package/backend/dist/platform/jobs/durableJobRuntime.d.ts +57 -0
- package/backend/dist/platform/jobs/durableJobRuntime.d.ts.map +1 -0
- package/backend/dist/platform/jobs/durableJobRuntime.js +131 -0
- package/backend/dist/platform/jobs/durableJobRuntime.js.map +1 -0
- package/backend/dist/platform/jobs/durableJobRuntimeBackend.d.ts +28 -0
- package/backend/dist/platform/jobs/durableJobRuntimeBackend.d.ts.map +1 -0
- package/backend/dist/platform/jobs/durableJobRuntimeBackend.js +62 -0
- package/backend/dist/platform/jobs/durableJobRuntimeBackend.js.map +1 -0
- package/backend/dist/platform/jobs/durableJobService.d.ts +85 -0
- package/backend/dist/platform/jobs/durableJobService.d.ts.map +1 -0
- package/backend/dist/platform/jobs/durableJobService.js +726 -0
- package/backend/dist/platform/jobs/durableJobService.js.map +1 -0
- package/backend/dist/platform/jobs/durableJobTypes.d.ts +195 -0
- package/backend/dist/platform/jobs/durableJobTypes.d.ts.map +1 -0
- package/backend/dist/platform/jobs/durableJobTypes.js +72 -0
- package/backend/dist/platform/jobs/durableJobTypes.js.map +1 -0
- package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts +87 -0
- package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts.map +1 -0
- package/backend/dist/platform/jobs/embeddedDurableJobWorker.js +429 -0
- package/backend/dist/platform/jobs/embeddedDurableJobWorker.js.map +1 -0
- package/backend/dist/platform/jobs/identityDeletionEnqueuer.d.ts +3 -0
- package/backend/dist/platform/jobs/identityDeletionEnqueuer.d.ts.map +1 -0
- package/backend/dist/platform/jobs/identityDeletionEnqueuer.js +36 -0
- package/backend/dist/platform/jobs/identityDeletionEnqueuer.js.map +1 -0
- package/backend/dist/platform/jobs/index.d.ts +18 -0
- package/backend/dist/platform/jobs/index.d.ts.map +1 -0
- package/backend/dist/platform/jobs/index.js +34 -0
- package/backend/dist/platform/jobs/index.js.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.d.ts +4 -0
- package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.d.ts.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.js +25 -0
- package/backend/dist/platform/jobs/postgresDurableEventIdempotencyMigration.js.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.d.ts +4 -0
- package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.d.ts.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.js +23 -0
- package/backend/dist/platform/jobs/postgresDurableEventReplayIndexMigration.js.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableJobMigration.d.ts +11 -0
- package/backend/dist/platform/jobs/postgresDurableJobMigration.d.ts.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableJobMigration.js +106 -0
- package/backend/dist/platform/jobs/postgresDurableJobMigration.js.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableJobRepository.d.ts +88 -0
- package/backend/dist/platform/jobs/postgresDurableJobRepository.d.ts.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableJobRepository.js +1185 -0
- package/backend/dist/platform/jobs/postgresDurableJobRepository.js.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableJobService.d.ts +86 -0
- package/backend/dist/platform/jobs/postgresDurableJobService.d.ts.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableJobService.js +696 -0
- package/backend/dist/platform/jobs/postgresDurableJobService.js.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts +53 -0
- package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts.map +1 -0
- package/backend/dist/platform/jobs/postgresDurableJobWorker.js +393 -0
- package/backend/dist/platform/jobs/postgresDurableJobWorker.js.map +1 -0
- package/backend/dist/platform/jobs/resourceDeletionEnqueuer.d.ts +3 -0
- package/backend/dist/platform/jobs/resourceDeletionEnqueuer.d.ts.map +1 -0
- package/backend/dist/platform/jobs/resourceDeletionEnqueuer.js +43 -0
- package/backend/dist/platform/jobs/resourceDeletionEnqueuer.js.map +1 -0
- package/backend/dist/platform/jobs/sqliteDurableJobRepository.d.ts +166 -0
- package/backend/dist/platform/jobs/sqliteDurableJobRepository.d.ts.map +1 -0
- package/backend/dist/platform/jobs/sqliteDurableJobRepository.js +1008 -0
- package/backend/dist/platform/jobs/sqliteDurableJobRepository.js.map +1 -0
- package/backend/dist/platform/jobs/videoGenerationEnqueuer.d.ts +4 -0
- package/backend/dist/platform/jobs/videoGenerationEnqueuer.d.ts.map +1 -0
- package/backend/dist/platform/jobs/videoGenerationEnqueuer.js +46 -0
- package/backend/dist/platform/jobs/videoGenerationEnqueuer.js.map +1 -0
- package/backend/dist/platform/jobs/workExecutionEnqueuer.d.ts +3 -0
- package/backend/dist/platform/jobs/workExecutionEnqueuer.d.ts.map +1 -0
- package/backend/dist/platform/jobs/workExecutionEnqueuer.js +38 -0
- package/backend/dist/platform/jobs/workExecutionEnqueuer.js.map +1 -0
- package/backend/dist/platform/ollamaRuntimeConfig.d.ts +40 -0
- package/backend/dist/platform/ollamaRuntimeConfig.d.ts.map +1 -0
- package/backend/dist/platform/ollamaRuntimeConfig.js +72 -0
- package/backend/dist/platform/ollamaRuntimeConfig.js.map +1 -0
- package/backend/dist/platform/recovery/backupArchive.d.ts +120 -0
- package/backend/dist/platform/recovery/backupArchive.d.ts.map +1 -0
- package/backend/dist/platform/recovery/backupArchive.js +842 -0
- package/backend/dist/platform/recovery/backupArchive.js.map +1 -0
- package/backend/dist/platform/recovery/index.d.ts +3 -0
- package/backend/dist/platform/recovery/index.d.ts.map +1 -0
- package/backend/dist/platform/recovery/index.js +8 -0
- package/backend/dist/platform/recovery/index.js.map +1 -0
- package/backend/dist/platform/recovery/teamBackupArchive.d.ts +98 -0
- package/backend/dist/platform/recovery/teamBackupArchive.d.ts.map +1 -0
- package/backend/dist/platform/recovery/teamBackupArchive.js +1203 -0
- package/backend/dist/platform/recovery/teamBackupArchive.js.map +1 -0
- package/backend/dist/platform/runtimeConfig.d.ts +70 -0
- package/backend/dist/platform/runtimeConfig.d.ts.map +1 -0
- package/backend/dist/platform/runtimeConfig.js +205 -0
- package/backend/dist/platform/runtimeConfig.js.map +1 -0
- package/backend/dist/platform/storage/aesGcmKeyring.d.ts +26 -0
- package/backend/dist/platform/storage/aesGcmKeyring.d.ts.map +1 -0
- package/backend/dist/platform/storage/aesGcmKeyring.js +135 -0
- package/backend/dist/platform/storage/aesGcmKeyring.js.map +1 -0
- package/backend/dist/platform/storage/blobReferenceRepository.d.ts +36 -0
- package/backend/dist/platform/storage/blobReferenceRepository.d.ts.map +1 -0
- package/backend/dist/platform/storage/blobReferenceRepository.js +117 -0
- package/backend/dist/platform/storage/blobReferenceRepository.js.map +1 -0
- package/backend/dist/platform/storage/blobStore.d.ts +111 -0
- package/backend/dist/platform/storage/blobStore.d.ts.map +1 -0
- package/backend/dist/platform/storage/blobStore.js +46 -0
- package/backend/dist/platform/storage/blobStore.js.map +1 -0
- package/backend/dist/platform/storage/documentVectorIndex.d.ts +44 -0
- package/backend/dist/platform/storage/documentVectorIndex.d.ts.map +1 -0
- package/backend/dist/platform/storage/documentVectorIndex.js +110 -0
- package/backend/dist/platform/storage/documentVectorIndex.js.map +1 -0
- package/backend/dist/platform/storage/durableBlobQuotaPolicy.d.ts +82 -0
- package/backend/dist/platform/storage/durableBlobQuotaPolicy.d.ts.map +1 -0
- package/backend/dist/platform/storage/durableBlobQuotaPolicy.js +583 -0
- package/backend/dist/platform/storage/durableBlobQuotaPolicy.js.map +1 -0
- package/backend/dist/platform/storage/index.d.ts +19 -0
- package/backend/dist/platform/storage/index.d.ts.map +1 -0
- package/backend/dist/platform/storage/index.js +35 -0
- package/backend/dist/platform/storage/index.js.map +1 -0
- package/backend/dist/platform/storage/localEncryptedBlobStore.d.ts +120 -0
- package/backend/dist/platform/storage/localEncryptedBlobStore.d.ts.map +1 -0
- package/backend/dist/platform/storage/localEncryptedBlobStore.js +1205 -0
- package/backend/dist/platform/storage/localEncryptedBlobStore.js.map +1 -0
- package/backend/dist/platform/storage/personaMemoryIndexing.d.ts +12 -0
- package/backend/dist/platform/storage/personaMemoryIndexing.d.ts.map +1 -0
- package/backend/dist/platform/storage/personaMemoryIndexing.js +25 -0
- package/backend/dist/platform/storage/personaMemoryIndexing.js.map +1 -0
- package/backend/dist/platform/storage/pgVectorStore.d.ts +37 -0
- package/backend/dist/platform/storage/pgVectorStore.d.ts.map +1 -0
- package/backend/dist/platform/storage/pgVectorStore.js +493 -0
- package/backend/dist/platform/storage/pgVectorStore.js.map +1 -0
- package/backend/dist/platform/storage/platformDomainRepositories.d.ts +244 -0
- package/backend/dist/platform/storage/platformDomainRepositories.d.ts.map +1 -0
- package/backend/dist/platform/storage/platformDomainRepositories.js +7 -0
- package/backend/dist/platform/storage/platformDomainRepositories.js.map +1 -0
- package/backend/dist/platform/storage/platformStorageRuntime.d.ts +35 -0
- package/backend/dist/platform/storage/platformStorageRuntime.d.ts.map +1 -0
- package/backend/dist/platform/storage/platformStorageRuntime.js +299 -0
- package/backend/dist/platform/storage/platformStorageRuntime.js.map +1 -0
- package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts +4 -0
- package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts.map +1 -0
- package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js +1017 -0
- package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js.map +1 -0
- package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.d.ts +4 -0
- package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.d.ts.map +1 -0
- package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.js +40 -0
- package/backend/dist/platform/storage/postgresResourceDeletionLifecycleMigration.js.map +1 -0
- package/backend/dist/platform/storage/resourceContentCleanup.d.ts +29 -0
- package/backend/dist/platform/storage/resourceContentCleanup.d.ts.map +1 -0
- package/backend/dist/platform/storage/resourceContentCleanup.js +100 -0
- package/backend/dist/platform/storage/resourceContentCleanup.js.map +1 -0
- package/backend/dist/platform/storage/resourceDeletionLifecycle.d.ts +14 -0
- package/backend/dist/platform/storage/resourceDeletionLifecycle.d.ts.map +1 -0
- package/backend/dist/platform/storage/resourceDeletionLifecycle.js +31 -0
- package/backend/dist/platform/storage/resourceDeletionLifecycle.js.map +1 -0
- package/backend/dist/platform/storage/s3EncryptedBlobStore.d.ts +140 -0
- package/backend/dist/platform/storage/s3EncryptedBlobStore.d.ts.map +1 -0
- package/backend/dist/platform/storage/s3EncryptedBlobStore.js +1309 -0
- package/backend/dist/platform/storage/s3EncryptedBlobStore.js.map +1 -0
- package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts +71 -0
- package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts.map +1 -0
- package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js +766 -0
- package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js.map +1 -0
- package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts +4 -0
- package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts.map +1 -0
- package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js +1037 -0
- package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js.map +1 -0
- package/backend/dist/platform/storage/sqliteToTeamStorageMigration.d.ts +25 -0
- package/backend/dist/platform/storage/sqliteToTeamStorageMigration.d.ts.map +1 -0
- package/backend/dist/platform/storage/sqliteToTeamStorageMigration.js +1292 -0
- package/backend/dist/platform/storage/sqliteToTeamStorageMigration.js.map +1 -0
- package/backend/dist/platform/storage/storageFactory.d.ts +81 -0
- package/backend/dist/platform/storage/storageFactory.d.ts.map +1 -0
- package/backend/dist/platform/storage/storageFactory.js +518 -0
- package/backend/dist/platform/storage/storageFactory.js.map +1 -0
- package/backend/dist/platform/storage/storageSchemaContracts.d.ts +22 -0
- package/backend/dist/platform/storage/storageSchemaContracts.d.ts.map +1 -0
- package/backend/dist/platform/storage/storageSchemaContracts.js +299 -0
- package/backend/dist/platform/storage/storageSchemaContracts.js.map +1 -0
- package/backend/dist/platform/storage/vectorStore.d.ts +117 -0
- package/backend/dist/platform/storage/vectorStore.d.ts.map +1 -0
- package/backend/dist/platform/storage/vectorStore.js +40 -0
- package/backend/dist/platform/storage/vectorStore.js.map +1 -0
- package/backend/dist/platform/workPersistence/index.d.ts +9 -0
- package/backend/dist/platform/workPersistence/index.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/index.js +14 -0
- package/backend/dist/platform/workPersistence/index.js.map +1 -0
- package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.d.ts +9 -0
- package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.js +47 -0
- package/backend/dist/platform/workPersistence/postgresWorkLifecycleMigration.js.map +1 -0
- package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.d.ts +3 -0
- package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.js +28 -0
- package/backend/dist/platform/workPersistence/postgresWorkMessageContentMigration.js.map +1 -0
- package/backend/dist/platform/workPersistence/postgresWorkMigration.d.ts +3 -0
- package/backend/dist/platform/workPersistence/postgresWorkMigration.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/postgresWorkMigration.js +101 -0
- package/backend/dist/platform/workPersistence/postgresWorkMigration.js.map +1 -0
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts +79 -0
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.js +521 -0
- package/backend/dist/platform/workPersistence/postgresWorkPersistence.js.map +1 -0
- package/backend/dist/platform/workPersistence/service.d.ts +6 -0
- package/backend/dist/platform/workPersistence/service.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/service.js +27 -0
- package/backend/dist/platform/workPersistence/service.js.map +1 -0
- package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts +77 -0
- package/backend/dist/platform/workPersistence/sqliteWorkPersistence.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js +463 -0
- package/backend/dist/platform/workPersistence/sqliteWorkPersistence.js.map +1 -0
- package/backend/dist/platform/workPersistence/types.d.ts +159 -0
- package/backend/dist/platform/workPersistence/types.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/types.js +13 -0
- package/backend/dist/platform/workPersistence/types.js.map +1 -0
- package/backend/dist/platform/workPersistence/workExecutionTypes.d.ts +13 -0
- package/backend/dist/platform/workPersistence/workExecutionTypes.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/workExecutionTypes.js +7 -0
- package/backend/dist/platform/workPersistence/workExecutionTypes.js.map +1 -0
- package/backend/dist/platform/workPersistence/workMessageContentCodec.d.ts +8 -0
- package/backend/dist/platform/workPersistence/workMessageContentCodec.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/workMessageContentCodec.js +25 -0
- package/backend/dist/platform/workPersistence/workMessageContentCodec.js.map +1 -0
- package/backend/dist/platform/workPersistence/workTextSafety.d.ts +3 -0
- package/backend/dist/platform/workPersistence/workTextSafety.d.ts.map +1 -0
- package/backend/dist/platform/workPersistence/workTextSafety.js +8 -0
- package/backend/dist/platform/workPersistence/workTextSafety.js.map +1 -0
- package/backend/dist/routes/agentCli.js +1 -1
- package/backend/dist/routes/agentCli.js.map +1 -1
- package/backend/dist/routes/artifacts.d.ts.map +1 -1
- package/backend/dist/routes/artifacts.js +2 -1
- package/backend/dist/routes/artifacts.js.map +1 -1
- package/backend/dist/routes/auth.d.ts.map +1 -1
- package/backend/dist/routes/auth.js +64 -18
- package/backend/dist/routes/auth.js.map +1 -1
- package/backend/dist/routes/chat.d.ts.map +1 -1
- package/backend/dist/routes/chat.js +519 -85
- package/backend/dist/routes/chat.js.map +1 -1
- package/backend/dist/routes/documents.d.ts.map +1 -1
- package/backend/dist/routes/documents.js +136 -28
- package/backend/dist/routes/documents.js.map +1 -1
- package/backend/dist/routes/embeddings.d.ts.map +1 -1
- package/backend/dist/routes/embeddings.js +2 -1
- package/backend/dist/routes/embeddings.js.map +1 -1
- package/backend/dist/routes/health.d.ts +3 -0
- package/backend/dist/routes/health.d.ts.map +1 -0
- package/backend/dist/routes/health.js +52 -0
- package/backend/dist/routes/health.js.map +1 -0
- package/backend/dist/routes/huggingfaceHub.d.ts.map +1 -1
- package/backend/dist/routes/huggingfaceHub.js +2 -1
- package/backend/dist/routes/huggingfaceHub.js.map +1 -1
- package/backend/dist/routes/imageGen.d.ts.map +1 -1
- package/backend/dist/routes/imageGen.js +42 -10
- package/backend/dist/routes/imageGen.js.map +1 -1
- package/backend/dist/routes/jobs.d.ts +3 -0
- package/backend/dist/routes/jobs.d.ts.map +1 -0
- package/backend/dist/routes/jobs.js +117 -0
- package/backend/dist/routes/jobs.js.map +1 -0
- package/backend/dist/routes/libreClaw.d.ts.map +1 -1
- package/backend/dist/routes/libreClaw.js +10 -7
- package/backend/dist/routes/libreClaw.js.map +1 -1
- package/backend/dist/routes/media.d.ts.map +1 -1
- package/backend/dist/routes/media.js +523 -77
- package/backend/dist/routes/media.js.map +1 -1
- package/backend/dist/routes/notes.d.ts.map +1 -1
- package/backend/dist/routes/notes.js +21 -21
- package/backend/dist/routes/notes.js.map +1 -1
- package/backend/dist/routes/ollama.d.ts.map +1 -1
- package/backend/dist/routes/ollama.js +40 -12
- package/backend/dist/routes/ollama.js.map +1 -1
- package/backend/dist/routes/personas.d.ts.map +1 -1
- package/backend/dist/routes/personas.js +4 -2
- package/backend/dist/routes/personas.js.map +1 -1
- package/backend/dist/routes/plugins.d.ts.map +1 -1
- package/backend/dist/routes/plugins.js +79 -51
- package/backend/dist/routes/plugins.js.map +1 -1
- package/backend/dist/routes/preferences.d.ts.map +1 -1
- package/backend/dist/routes/preferences.js +290 -25
- package/backend/dist/routes/preferences.js.map +1 -1
- package/backend/dist/routes/search.d.ts.map +1 -1
- package/backend/dist/routes/search.js +23 -14
- package/backend/dist/routes/search.js.map +1 -1
- package/backend/dist/routes/stt.d.ts +9 -0
- package/backend/dist/routes/stt.d.ts.map +1 -0
- package/backend/dist/routes/stt.js +217 -0
- package/backend/dist/routes/stt.js.map +1 -0
- package/backend/dist/routes/systemDiagnostics.d.ts.map +1 -1
- package/backend/dist/routes/systemDiagnostics.js +2 -1
- package/backend/dist/routes/systemDiagnostics.js.map +1 -1
- package/backend/dist/routes/tts.d.ts.map +1 -1
- package/backend/dist/routes/tts.js +577 -28
- package/backend/dist/routes/tts.js.map +1 -1
- package/backend/dist/routes/users.d.ts.map +1 -1
- package/backend/dist/routes/users.js +16 -25
- package/backend/dist/routes/users.js.map +1 -1
- package/backend/dist/routes/work.d.ts.map +1 -1
- package/backend/dist/routes/work.js +167 -113
- package/backend/dist/routes/work.js.map +1 -1
- package/backend/dist/services/agentAccessService.d.ts +2 -2
- package/backend/dist/services/agentAccessService.d.ts.map +1 -1
- package/backend/dist/services/agentAccessService.js +5 -14
- package/backend/dist/services/agentAccessService.js.map +1 -1
- package/backend/dist/services/agentCliService.d.ts +3 -2
- package/backend/dist/services/agentCliService.d.ts.map +1 -1
- package/backend/dist/services/agentCliService.js +44 -16
- package/backend/dist/services/agentCliService.js.map +1 -1
- package/backend/dist/services/assistantCompletionService.d.ts +2 -1
- package/backend/dist/services/assistantCompletionService.d.ts.map +1 -1
- package/backend/dist/services/assistantCompletionService.js +7 -3
- package/backend/dist/services/assistantCompletionService.js.map +1 -1
- package/backend/dist/services/authService.d.ts +7 -2
- package/backend/dist/services/authService.d.ts.map +1 -1
- package/backend/dist/services/authService.js +23 -10
- package/backend/dist/services/authService.js.map +1 -1
- package/backend/dist/services/chatGenerationService.d.ts +5 -4
- package/backend/dist/services/chatGenerationService.d.ts.map +1 -1
- package/backend/dist/services/chatGenerationService.js +23 -17
- package/backend/dist/services/chatGenerationService.js.map +1 -1
- package/backend/dist/services/chatRequestService.d.ts +4 -3
- package/backend/dist/services/chatRequestService.d.ts.map +1 -1
- package/backend/dist/services/chatRequestService.js +3 -3
- package/backend/dist/services/chatRequestService.js.map +1 -1
- package/backend/dist/services/chatService.d.ts +66 -16
- package/backend/dist/services/chatService.d.ts.map +1 -1
- package/backend/dist/services/chatService.js +402 -111
- package/backend/dist/services/chatService.js.map +1 -1
- package/backend/dist/services/codexOAuthService.d.ts +2 -2
- package/backend/dist/services/codexOAuthService.d.ts.map +1 -1
- package/backend/dist/services/codexOAuthService.js +63 -7
- package/backend/dist/services/codexOAuthService.js.map +1 -1
- package/backend/dist/services/dataArchiveService.d.ts +88 -0
- package/backend/dist/services/dataArchiveService.d.ts.map +1 -0
- package/backend/dist/services/dataArchiveService.js +1027 -0
- package/backend/dist/services/dataArchiveService.js.map +1 -0
- package/backend/dist/services/documentService.d.ts +67 -14
- package/backend/dist/services/documentService.d.ts.map +1 -1
- package/backend/dist/services/documentService.js +938 -193
- package/backend/dist/services/documentService.js.map +1 -1
- package/backend/dist/services/durableChatCompletion.d.ts +16 -0
- package/backend/dist/services/durableChatCompletion.d.ts.map +1 -0
- package/backend/dist/services/durableChatCompletion.js +34 -0
- package/backend/dist/services/durableChatCompletion.js.map +1 -0
- package/backend/dist/services/durableChatGenerationService.d.ts +19 -0
- package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -0
- package/backend/dist/services/durableChatGenerationService.js +341 -0
- package/backend/dist/services/durableChatGenerationService.js.map +1 -0
- package/backend/dist/services/embeddingService.d.ts +1 -1
- package/backend/dist/services/embeddingService.d.ts.map +1 -1
- package/backend/dist/services/embeddingService.js +16 -13
- package/backend/dist/services/embeddingService.js.map +1 -1
- package/backend/dist/services/encryptionService.d.ts +28 -1
- package/backend/dist/services/encryptionService.d.ts.map +1 -1
- package/backend/dist/services/encryptionService.js +131 -51
- package/backend/dist/services/encryptionService.js.map +1 -1
- package/backend/dist/services/followUpService.d.ts +1 -1
- package/backend/dist/services/followUpService.d.ts.map +1 -1
- package/backend/dist/services/followUpService.js +1 -1
- package/backend/dist/services/followUpService.js.map +1 -1
- package/backend/dist/services/galleryService.d.ts +38 -37
- package/backend/dist/services/galleryService.d.ts.map +1 -1
- package/backend/dist/services/galleryService.js +356 -251
- package/backend/dist/services/galleryService.js.map +1 -1
- package/backend/dist/services/healthService.d.ts +65 -0
- package/backend/dist/services/healthService.d.ts.map +1 -0
- package/backend/dist/services/healthService.js +379 -0
- package/backend/dist/services/healthService.js.map +1 -0
- package/backend/dist/services/legacyCiphertextIntegrity.d.ts +40 -0
- package/backend/dist/services/legacyCiphertextIntegrity.d.ts.map +1 -0
- package/backend/dist/services/legacyCiphertextIntegrity.js +406 -0
- package/backend/dist/services/legacyCiphertextIntegrity.js.map +1 -0
- package/backend/dist/services/mediaGenerationJobService.d.ts +27 -5
- package/backend/dist/services/mediaGenerationJobService.d.ts.map +1 -1
- package/backend/dist/services/mediaGenerationJobService.js +185 -55
- package/backend/dist/services/mediaGenerationJobService.js.map +1 -1
- package/backend/dist/services/memoryService.d.ts +7 -83
- package/backend/dist/services/memoryService.d.ts.map +1 -1
- package/backend/dist/services/memoryService.js +428 -573
- package/backend/dist/services/memoryService.js.map +1 -1
- package/backend/dist/services/memoryUtils.d.ts.map +1 -1
- package/backend/dist/services/memoryUtils.js +8 -1
- package/backend/dist/services/memoryUtils.js.map +1 -1
- package/backend/dist/services/modelAccessService.d.ts +3 -3
- package/backend/dist/services/modelAccessService.d.ts.map +1 -1
- package/backend/dist/services/modelAccessService.js +8 -16
- package/backend/dist/services/modelAccessService.js.map +1 -1
- package/backend/dist/services/mutationEngineService.d.ts +0 -7
- package/backend/dist/services/mutationEngineService.d.ts.map +1 -1
- package/backend/dist/services/mutationEngineService.js +7 -78
- package/backend/dist/services/mutationEngineService.js.map +1 -1
- package/backend/dist/services/ollamaService.d.ts +4 -4
- package/backend/dist/services/ollamaService.d.ts.map +1 -1
- package/backend/dist/services/ollamaService.js +97 -34
- package/backend/dist/services/ollamaService.js.map +1 -1
- package/backend/dist/services/personaService.d.ts.map +1 -1
- package/backend/dist/services/personaService.js +19 -54
- package/backend/dist/services/personaService.js.map +1 -1
- package/backend/dist/services/pluginActivationService.d.ts +6 -5
- package/backend/dist/services/pluginActivationService.d.ts.map +1 -1
- package/backend/dist/services/pluginActivationService.js +36 -76
- package/backend/dist/services/pluginActivationService.js.map +1 -1
- package/backend/dist/services/pluginAudioGenerationService.d.ts +11 -6
- package/backend/dist/services/pluginAudioGenerationService.d.ts.map +1 -1
- package/backend/dist/services/pluginAudioGenerationService.js +74 -16
- package/backend/dist/services/pluginAudioGenerationService.js.map +1 -1
- package/backend/dist/services/pluginCacheInvalidation.d.ts +38 -0
- package/backend/dist/services/pluginCacheInvalidation.d.ts.map +1 -0
- package/backend/dist/services/pluginCacheInvalidation.js +198 -0
- package/backend/dist/services/pluginCacheInvalidation.js.map +1 -0
- package/backend/dist/services/pluginCapabilityRegistryService.d.ts +3 -3
- package/backend/dist/services/pluginCapabilityRegistryService.d.ts.map +1 -1
- package/backend/dist/services/pluginCapabilityRegistryService.js +11 -7
- package/backend/dist/services/pluginCapabilityRegistryService.js.map +1 -1
- package/backend/dist/services/pluginCredentialsService.d.ts +9 -8
- package/backend/dist/services/pluginCredentialsService.d.ts.map +1 -1
- package/backend/dist/services/pluginCredentialsService.js +48 -89
- package/backend/dist/services/pluginCredentialsService.js.map +1 -1
- package/backend/dist/services/pluginEmbeddingService.d.ts +8 -7
- package/backend/dist/services/pluginEmbeddingService.d.ts.map +1 -1
- package/backend/dist/services/pluginEmbeddingService.js +13 -11
- package/backend/dist/services/pluginEmbeddingService.js.map +1 -1
- package/backend/dist/services/pluginImageGenerationService.d.ts +10 -8
- package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
- package/backend/dist/services/pluginImageGenerationService.js +119 -14
- package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
- package/backend/dist/services/pluginSTTService.d.ts +47 -0
- package/backend/dist/services/pluginSTTService.d.ts.map +1 -0
- package/backend/dist/services/pluginSTTService.js +199 -0
- package/backend/dist/services/pluginSTTService.js.map +1 -0
- package/backend/dist/services/pluginService.d.ts +94 -40
- package/backend/dist/services/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +799 -274
- package/backend/dist/services/pluginService.js.map +1 -1
- package/backend/dist/services/pluginTTSService.d.ts +26 -8
- package/backend/dist/services/pluginTTSService.d.ts.map +1 -1
- package/backend/dist/services/pluginTTSService.js +277 -25
- package/backend/dist/services/pluginTTSService.js.map +1 -1
- package/backend/dist/services/pluginUsageService.d.ts +4 -4
- package/backend/dist/services/pluginUsageService.d.ts.map +1 -1
- package/backend/dist/services/pluginUsageService.js +44 -93
- package/backend/dist/services/pluginUsageService.js.map +1 -1
- package/backend/dist/services/pluginVariablesService.d.ts +14 -7
- package/backend/dist/services/pluginVariablesService.d.ts.map +1 -1
- package/backend/dist/services/pluginVariablesService.js +116 -81
- package/backend/dist/services/pluginVariablesService.js.map +1 -1
- package/backend/dist/services/pluginVideoGenerationService.d.ts +19 -8
- package/backend/dist/services/pluginVideoGenerationService.d.ts.map +1 -1
- package/backend/dist/services/pluginVideoGenerationService.js +116 -20
- package/backend/dist/services/pluginVideoGenerationService.js.map +1 -1
- package/backend/dist/services/preferencesService.d.ts +31 -21
- package/backend/dist/services/preferencesService.d.ts.map +1 -1
- package/backend/dist/services/preferencesService.js +104 -102
- package/backend/dist/services/preferencesService.js.map +1 -1
- package/backend/dist/services/recoveryInventoryService.d.ts +244 -0
- package/backend/dist/services/recoveryInventoryService.d.ts.map +1 -0
- package/backend/dist/services/recoveryInventoryService.js +1436 -0
- package/backend/dist/services/recoveryInventoryService.js.map +1 -0
- package/backend/dist/services/simpleGitHubOAuth.js +3 -3
- package/backend/dist/services/simpleGitHubOAuth.js.map +1 -1
- package/backend/dist/services/simpleHuggingFaceOAuth.d.ts.map +1 -1
- package/backend/dist/services/simpleHuggingFaceOAuth.js +3 -3
- package/backend/dist/services/simpleHuggingFaceOAuth.js.map +1 -1
- package/backend/dist/services/systemDiagnosticsService.d.ts.map +1 -1
- package/backend/dist/services/systemDiagnosticsService.js +2 -2
- package/backend/dist/services/systemDiagnosticsService.js.map +1 -1
- package/backend/dist/services/systemSettingsService.d.ts +5 -0
- package/backend/dist/services/systemSettingsService.d.ts.map +1 -0
- package/backend/dist/services/systemSettingsService.js +24 -0
- package/backend/dist/services/systemSettingsService.js.map +1 -0
- package/backend/dist/services/titleGenerationService.d.ts +1 -1
- package/backend/dist/services/titleGenerationService.d.ts.map +1 -1
- package/backend/dist/services/titleGenerationService.js +15 -4
- package/backend/dist/services/titleGenerationService.js.map +1 -1
- package/backend/dist/services/voiceProfileService.d.ts +44 -0
- package/backend/dist/services/voiceProfileService.d.ts.map +1 -0
- package/backend/dist/services/voiceProfileService.js +195 -0
- package/backend/dist/services/voiceProfileService.js.map +1 -0
- package/backend/dist/services/webSearchService.d.ts +7 -7
- package/backend/dist/services/webSearchService.d.ts.map +1 -1
- package/backend/dist/services/webSearchService.js +40 -35
- package/backend/dist/services/webSearchService.js.map +1 -1
- package/backend/dist/services/websocketTicketService.d.ts +39 -0
- package/backend/dist/services/websocketTicketService.d.ts.map +1 -0
- package/backend/dist/services/websocketTicketService.js +183 -0
- package/backend/dist/services/websocketTicketService.js.map +1 -0
- package/backend/dist/services/workAccessService.d.ts +3 -3
- package/backend/dist/services/workAccessService.d.ts.map +1 -1
- package/backend/dist/services/workAccessService.js +8 -16
- package/backend/dist/services/workAccessService.js.map +1 -1
- package/backend/dist/services/workAdminService.d.ts +3 -3
- package/backend/dist/services/workAdminService.d.ts.map +1 -1
- package/backend/dist/services/workAdminService.js +4 -4
- package/backend/dist/services/workAdminService.js.map +1 -1
- package/backend/dist/services/workAgentService.d.ts +25 -1
- package/backend/dist/services/workAgentService.d.ts.map +1 -1
- package/backend/dist/services/workAgentService.js +294 -126
- package/backend/dist/services/workAgentService.js.map +1 -1
- package/backend/dist/services/workEventService.d.ts +15 -2
- package/backend/dist/services/workEventService.d.ts.map +1 -1
- package/backend/dist/services/workEventService.js +201 -3
- package/backend/dist/services/workEventService.js.map +1 -1
- package/backend/dist/services/workKubernetesDriver.d.ts +8 -7
- package/backend/dist/services/workKubernetesDriver.d.ts.map +1 -1
- package/backend/dist/services/workKubernetesDriver.js +65 -21
- package/backend/dist/services/workKubernetesDriver.js.map +1 -1
- package/backend/dist/services/workModelProviderService.d.ts +2 -2
- package/backend/dist/services/workModelProviderService.d.ts.map +1 -1
- package/backend/dist/services/workModelProviderService.js +38 -34
- package/backend/dist/services/workModelProviderService.js.map +1 -1
- package/backend/dist/services/workPolicyService.d.ts +7 -7
- package/backend/dist/services/workPolicyService.d.ts.map +1 -1
- package/backend/dist/services/workPolicyService.js +50 -51
- package/backend/dist/services/workPolicyService.js.map +1 -1
- package/backend/dist/services/workPreviewProxyService.d.ts +8 -8
- package/backend/dist/services/workPreviewProxyService.d.ts.map +1 -1
- package/backend/dist/services/workPreviewProxyService.js +47 -44
- package/backend/dist/services/workPreviewProxyService.js.map +1 -1
- package/backend/dist/services/workRuntimeDriver.d.ts +21 -18
- package/backend/dist/services/workRuntimeDriver.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeDriver.js +69 -20
- package/backend/dist/services/workRuntimeDriver.js.map +1 -1
- package/backend/dist/services/workRuntimeService.d.ts +18 -13
- package/backend/dist/services/workRuntimeService.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeService.js +438 -194
- package/backend/dist/services/workRuntimeService.js.map +1 -1
- package/backend/dist/services/workRuntimeShared.d.ts +2 -0
- package/backend/dist/services/workRuntimeShared.d.ts.map +1 -1
- package/backend/dist/services/workRuntimeShared.js.map +1 -1
- package/backend/dist/services/workTaskService.d.ts +42 -36
- package/backend/dist/services/workTaskService.d.ts.map +1 -1
- package/backend/dist/services/workTaskService.js +445 -350
- package/backend/dist/services/workTaskService.js.map +1 -1
- package/backend/dist/services/workTerminalService.d.ts +1 -1
- package/backend/dist/services/workTerminalService.d.ts.map +1 -1
- package/backend/dist/services/workTerminalService.js +33 -6
- package/backend/dist/services/workTerminalService.js.map +1 -1
- package/backend/dist/storage.d.ts +72 -40
- package/backend/dist/storage.d.ts.map +1 -1
- package/backend/dist/storage.js +312 -660
- package/backend/dist/storage.js.map +1 -1
- package/backend/dist/types/index.d.ts +28 -0
- package/backend/dist/types/index.d.ts.map +1 -1
- package/backend/dist/types/index.js.map +1 -1
- package/backend/dist/types/work.d.ts +7 -2
- package/backend/dist/types/work.d.ts.map +1 -1
- package/backend/dist/utils/chatCancellation.d.ts +48 -0
- package/backend/dist/utils/chatCancellation.d.ts.map +1 -0
- package/backend/dist/utils/chatCancellation.js +152 -0
- package/backend/dist/utils/chatCancellation.js.map +1 -0
- package/backend/dist/utils/chatDocumentContext.d.ts +1 -1
- package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
- package/backend/dist/utils/chatDocumentContext.js +11 -5
- package/backend/dist/utils/chatDocumentContext.js.map +1 -1
- package/backend/dist/utils/chatStreamCoalescer.d.ts +15 -0
- package/backend/dist/utils/chatStreamCoalescer.d.ts.map +1 -0
- package/backend/dist/utils/chatStreamCoalescer.js +59 -0
- package/backend/dist/utils/chatStreamCoalescer.js.map +1 -0
- package/backend/dist/utils/dataDirectory.d.ts +49 -0
- package/backend/dist/utils/dataDirectory.d.ts.map +1 -0
- package/backend/dist/utils/dataDirectory.js +291 -0
- package/backend/dist/utils/dataDirectory.js.map +1 -0
- package/backend/dist/utils/generationUtils.d.ts.map +1 -1
- package/backend/dist/utils/generationUtils.js +18 -6
- package/backend/dist/utils/generationUtils.js.map +1 -1
- package/backend/dist/utils/jwt.d.ts.map +1 -1
- package/backend/dist/utils/jwt.js +2 -3
- package/backend/dist/utils/jwt.js.map +1 -1
- package/backend/dist/utils/ollamaModelDefaults.d.ts.map +1 -1
- package/backend/dist/utils/ollamaModelDefaults.js +2 -7
- package/backend/dist/utils/ollamaModelDefaults.js.map +1 -1
- package/backend/dist/utils/ollamaStreaming.d.ts +2 -1
- package/backend/dist/utils/ollamaStreaming.d.ts.map +1 -1
- package/backend/dist/utils/ollamaStreaming.js +49 -11
- package/backend/dist/utils/ollamaStreaming.js.map +1 -1
- package/backend/dist/utils/pluginConnectionVariables.d.ts.map +1 -1
- package/backend/dist/utils/pluginConnectionVariables.js +11 -3
- package/backend/dist/utils/pluginConnectionVariables.js.map +1 -1
- package/backend/dist/utils/pluginDefinitionTrust.d.ts.map +1 -1
- package/backend/dist/utils/pluginDefinitionTrust.js +4 -3
- package/backend/dist/utils/pluginDefinitionTrust.js.map +1 -1
- package/backend/dist/utils/pluginStreaming.d.ts +2 -1
- package/backend/dist/utils/pluginStreaming.d.ts.map +1 -1
- package/backend/dist/utils/pluginStreaming.js +5 -1
- package/backend/dist/utils/pluginStreaming.js.map +1 -1
- package/backend/dist/utils/pluginUpload.d.ts +1 -0
- package/backend/dist/utils/pluginUpload.d.ts.map +1 -1
- package/backend/dist/utils/pluginUpload.js +9 -2
- package/backend/dist/utils/pluginUpload.js.map +1 -1
- package/backend/dist/utils/pluginValidation.d.ts.map +1 -1
- package/backend/dist/utils/pluginValidation.js +29 -1
- package/backend/dist/utils/pluginValidation.js.map +1 -1
- package/backend/dist/utils/sttAudioUpload.d.ts +24 -0
- package/backend/dist/utils/sttAudioUpload.d.ts.map +1 -0
- package/backend/dist/utils/sttAudioUpload.js +500 -0
- package/backend/dist/utils/sttAudioUpload.js.map +1 -0
- package/backend/dist/utils/ttsVoiceCloneUpload.d.ts +34 -0
- package/backend/dist/utils/ttsVoiceCloneUpload.d.ts.map +1 -0
- package/backend/dist/utils/ttsVoiceCloneUpload.js +224 -0
- package/backend/dist/utils/ttsVoiceCloneUpload.js.map +1 -0
- package/backend/dist/utils/websocketMessages.d.ts +2 -1
- package/backend/dist/utils/websocketMessages.d.ts.map +1 -1
- package/backend/dist/utils/websocketMessages.js +16 -2
- package/backend/dist/utils/websocketMessages.js.map +1 -1
- package/backend/dist/websocketServer.d.ts +4 -1
- package/backend/dist/websocketServer.d.ts.map +1 -1
- package/backend/dist/websocketServer.js +290 -44
- package/backend/dist/websocketServer.js.map +1 -1
- package/backend/dist/workTerminalServer.d.ts +9 -0
- package/backend/dist/workTerminalServer.d.ts.map +1 -1
- package/backend/dist/workTerminalServer.js +221 -52
- package/backend/dist/workTerminalServer.js.map +1 -1
- package/backend/dist/worker.d.ts +2 -0
- package/backend/dist/worker.d.ts.map +1 -0
- package/backend/dist/worker.js +250 -0
- package/backend/dist/worker.js.map +1 -0
- package/backend/package.json +19 -9
- package/bin/cli.js +126 -99
- package/bin/runtime-paths.js +108 -0
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/artifact-runtime/framer-motion.js +5 -5
- package/frontend/dist/artifact-runtime/lucide-react.js +1 -1
- package/frontend/dist/assets/index-CUhEG7E2.js +33 -0
- package/frontend/dist/assets/index-kxtZQLV6.css +1 -0
- package/frontend/dist/assets/{markdown-math-ClQbWekD.css → markdown-math-ClTedVi7.css} +1 -1
- package/frontend/dist/index.html +36 -18
- package/frontend/dist/js/{ArtifactContainer-C_UdeK4k.js → ArtifactContainer-BTEDhBnv.js} +1 -1
- package/frontend/dist/js/{ArtifactDemoPage-D3AuvuR5.js → ArtifactDemoPage-B0gN3YTl.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-BiXl9iGD.js → ArtifactSandboxFrame-CLBXQkZs.js} +3 -3
- package/frontend/dist/js/{ArtifactSlideOutPanel-CvgS3sfQ.js → ArtifactSlideOutPanel-CfqHPFdE.js} +1 -1
- package/frontend/dist/js/{Button-DcBM7gdH.js → Button-BV44cTnj.js} +1 -1
- package/frontend/dist/js/ChatPage-DIkAXZWA.js +23 -0
- package/frontend/dist/js/{FirstTimeSetup-B9742i3H.js → FirstTimeSetup-B8phXGNA.js} +1 -1
- package/frontend/dist/js/GalleryPage-W4uI043I.js +1 -0
- package/frontend/dist/js/HomePage-DlxehbyO.js +1 -0
- package/frontend/dist/js/{LibreClawPage-Ds6pqEyk.js → LibreClawPage-CgD0_G_F.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-BBNg2fxs.js → ModelManagerModals-D7jIT3v1.js} +1 -1
- package/frontend/dist/js/{ModelSelector-CJfJYwxh.js → ModelSelector-BYxJU1UV.js} +1 -1
- package/frontend/dist/js/ModelsPage-C4XdCKP5.js +2 -0
- package/frontend/dist/js/NotesPage-CDECOl4V.js +1 -0
- package/frontend/dist/js/{OptimizedSyntaxHighlighter-CWYUn9Oe.js → OptimizedSyntaxHighlighter-XwqZEoTf.js} +1 -1
- package/frontend/dist/js/{PersonasPage-CbQVv9OM.js → PersonasPage-CjSLPrgS.js} +2 -2
- package/frontend/dist/js/PluginUsagePage-DJOXJuH4.js +1 -0
- package/frontend/dist/js/RichMessageContent-Debeh6bi.js +3 -0
- package/frontend/dist/js/SettingsModal-cUqAeYUP.js +1 -0
- package/frontend/dist/js/{SettingsToggle-Uz2jvV64.js → SettingsToggle-WTa0rgvY.js} +1 -1
- package/frontend/dist/js/{SystemPage-CIBDZTWB.js → SystemPage-DxPw0GS7.js} +1 -1
- package/frontend/dist/js/UserManagementPage-CEdYFe_Z.js +1 -0
- package/frontend/dist/js/WorkPage-DDVeuG_9.js +6 -0
- package/frontend/dist/js/api-IzobHGND.js +14 -0
- package/frontend/dist/js/appStore-DKwC2vgn.js +2 -0
- package/frontend/dist/js/ar-xTSvTq05.js +2 -0
- package/frontend/dist/js/authStore-OaTuapL7.js +4 -0
- package/frontend/dist/js/{babel-CmENXdZw.js → babel-D24oDI9y.js} +1 -1
- package/frontend/dist/js/bn-iYAsohEA.js +2 -0
- package/frontend/dist/js/chatStore-DXGUVLXD.js +3 -0
- package/frontend/dist/js/{config-CV8L89A5.js → config-DPEEuTAe.js} +1 -1
- package/frontend/dist/js/cs-YBHN88Hb.js +2 -0
- package/frontend/dist/js/da-D7qlLy_k.js +2 -0
- package/frontend/dist/js/de-DV671k2c.js +2 -0
- package/frontend/dist/js/es-kyBgzNq-.js +2 -0
- package/frontend/dist/js/{estree-Lx6fK8Ug.js → estree-ChwJsD2w.js} +1 -1
- package/frontend/dist/js/fr-Cw1vut7I.js +2 -0
- package/frontend/dist/js/hi-DWEFC024.js +2 -0
- package/frontend/dist/js/{html-Dx5reqmV.js → html-DFrVjciF.js} +1 -1
- package/frontend/dist/js/id-DlMHjjy0.js +2 -0
- package/frontend/dist/js/is-B9E_a7dG.js +2 -0
- package/frontend/dist/js/it-DawmVbLC.js +2 -0
- package/frontend/dist/js/ja-DmVvwY3W.js +2 -0
- package/frontend/dist/js/ko-DzOPpkVs.js +2 -0
- package/frontend/dist/js/{markdown-Bd5G8zQB.js → markdown-FLLx7b67.js} +1 -1
- package/frontend/dist/js/markdown-core-BmPPZiuD.js +31 -0
- package/frontend/dist/js/{markdown-math-B7FlYsmr.js → markdown-math-mH7AZ_mb.js} +6 -6
- package/frontend/dist/js/{messageCodeStyles-CUWSpffv.js → messageCodeStyles-CBkkZY4n.js} +1 -1
- package/frontend/dist/js/ms-DpsaOPht.js +2 -0
- package/frontend/dist/js/nl-B1d8W22n.js +2 -0
- package/frontend/dist/js/pl-nCncRVgt.js +2 -0
- package/frontend/dist/js/{postcss-B5WIGhAY.js → postcss-Bx9CTcIc.js} +1 -1
- package/frontend/dist/js/pt-DHw8fGuu.js +2 -0
- package/frontend/dist/js/{react-vendor-DPNXrO-8.js → react-vendor-C5yShNlM.js} +1 -1
- package/frontend/dist/js/{router-vendor-Ca9zqOqT.js → router-vendor-CbPDks39.js} +1 -1
- package/frontend/dist/js/ru-Derl_YP_.js +2 -0
- package/frontend/dist/js/{standalone-DLNXiOUi.js → standalone-i8-5bg5p.js} +1 -1
- package/frontend/dist/js/sv-pJAfBVo0.js +2 -0
- package/frontend/dist/js/{syntax-highlight-Ca9bHsaz.js → syntax-highlight-3EEX6CGL.js} +3 -3
- package/frontend/dist/js/th-C_7fIGnk.js +2 -0
- package/frontend/dist/js/tr-CPqsJvaP.js +2 -0
- package/frontend/dist/js/{typescript-YKxslwSt.js → typescript-CQ3x-Uni.js} +1 -1
- package/frontend/dist/js/{ui-Dw6jDKxN.js → ui-BHhR3Vok.js} +2 -2
- package/frontend/dist/js/ui-vendor-D3Ahl1x5.js +177 -0
- package/frontend/dist/js/uk-3o8P_kFi.js +2 -0
- package/frontend/dist/js/{useTranslation-t1quV8ce.js → useTranslation-C3ei3mJq.js} +1 -1
- package/frontend/dist/js/{utils-iKndEgla.js → utils-CuC1beTY.js} +1 -1
- package/frontend/dist/js/{utils-vendor-1zob7nK9.js → utils-vendor-BBa8OxtB.js} +1 -1
- package/frontend/dist/js/vi-Dv6N7OVD.js +2 -0
- package/frontend/dist/js/{workApi-LrQmhNxb.js → workApi-Czu69yWS.js} +2 -2
- package/frontend/dist/js/{yaml-QD4znPfZ.js → yaml-DioTxVLA.js} +1 -1
- package/frontend/dist/js/zh-qg5iqtPi.js +2 -0
- package/package.json +16 -5
- package/plugins/huggingface.json +12 -3
- package/plugins/llama-cpp.json +18 -6
- package/plugins/longcat-audiodit.json +114 -0
- package/plugins/openai.json +18 -0
- package/frontend/dist/assets/index-CN7wpzUO.js +0 -26
- package/frontend/dist/assets/index-Dqkx5o2y.css +0 -1
- package/frontend/dist/js/ChatPage-DBEi-FSO.js +0 -16
- package/frontend/dist/js/GalleryPage-BL0x_xl7.js +0 -1
- package/frontend/dist/js/HomePage-Ukn2Y-BG.js +0 -1
- package/frontend/dist/js/ModelsPage-CDPJM-LA.js +0 -2
- package/frontend/dist/js/NotesPage-DJ-_MSI1.js +0 -1
- package/frontend/dist/js/PluginUsagePage-D69rQvFl.js +0 -1
- package/frontend/dist/js/RichMessageContent-DfuCu6PB.js +0 -3
- package/frontend/dist/js/SettingsModal-D87lWSx4.js +0 -1
- package/frontend/dist/js/UserManagementPage-DzMnFKDG.js +0 -1
- package/frontend/dist/js/WorkPage-D84JNdjS.js +0 -6
- package/frontend/dist/js/api-DhmVEJr2.js +0 -14
- package/frontend/dist/js/appStore-BsqeY2tS.js +0 -2
- package/frontend/dist/js/ar-BgCHB9_9.js +0 -2
- package/frontend/dist/js/authStore-DanfaPdm.js +0 -4
- package/frontend/dist/js/bn-Cr8_opuR.js +0 -2
- package/frontend/dist/js/chatStore-C25ywAXQ.js +0 -3
- package/frontend/dist/js/cs-Bb9gXpfH.js +0 -2
- package/frontend/dist/js/da-JfdGHjAw.js +0 -2
- package/frontend/dist/js/de-CczkCOVx.js +0 -2
- package/frontend/dist/js/es-n_0cjhn7.js +0 -2
- package/frontend/dist/js/fr-Pno128cn.js +0 -2
- package/frontend/dist/js/hi-DBCdcL4p.js +0 -2
- package/frontend/dist/js/id-85QDk-wA.js +0 -2
- package/frontend/dist/js/is-9MuKmBft.js +0 -2
- package/frontend/dist/js/it-C5mz9I3H.js +0 -2
- package/frontend/dist/js/ja-Cu90QTBd.js +0 -2
- package/frontend/dist/js/ko-CSdgcMgq.js +0 -2
- package/frontend/dist/js/markdown-core-DHnR5Hw8.js +0 -16
- package/frontend/dist/js/ms-IQMi6HBU.js +0 -2
- package/frontend/dist/js/nl-BwpdTgvn.js +0 -2
- package/frontend/dist/js/pl-zq8ctKrQ.js +0 -2
- package/frontend/dist/js/pt-BIQu7dBu.js +0 -2
- package/frontend/dist/js/ru-BT5-Z0F9.js +0 -2
- package/frontend/dist/js/sv-B1_q6-Uj.js +0 -2
- package/frontend/dist/js/th-BiLLwq0A.js +0 -2
- package/frontend/dist/js/tr-NZbkkeKs.js +0 -2
- package/frontend/dist/js/ui-vendor-xUzKqAXI.js +0 -177
- package/frontend/dist/js/uk-CGu1pg-F.js +0 -2
- package/frontend/dist/js/vi-ClvH5JZg.js +0 -2
- package/frontend/dist/js/zh-Jgjy3uAG.js +0 -2
|
@@ -15,12 +15,15 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
import path from 'node:path';
|
|
18
|
-
import {
|
|
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.
|
|
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
|
|
59
|
-
// that never appears (30 × 10s
|
|
60
|
-
// without probing
|
|
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
|
-
|
|
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
|
|
106
|
+
async isRuntimeAvailable() {
|
|
94
107
|
try {
|
|
95
108
|
await this.driver.probe();
|
|
96
|
-
this.
|
|
109
|
+
this.lastRuntimeUnavailableReason = null;
|
|
97
110
|
return true;
|
|
98
111
|
}
|
|
99
112
|
catch (error) {
|
|
100
|
-
this.
|
|
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.
|
|
107
|
-
*
|
|
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
|
|
111
|
-
return this.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ||
|
|
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
|
-
|
|
201
|
-
await this.
|
|
202
|
-
this.
|
|
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.
|
|
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
|
-
//
|
|
291
|
-
//
|
|
292
|
-
//
|
|
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 =>
|
|
335
|
-
|
|
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 (
|
|
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
|
|
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)
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
688
|
+
await this.recreateContainerWithLock(desired, signal);
|
|
689
|
+
await assertHeld();
|
|
690
|
+
await this.stopContainerWithLock(desired, signal);
|
|
567
691
|
previewStopped = true;
|
|
568
|
-
|
|
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.
|
|
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
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
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 (
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
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
|
-
|
|
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
|
|
1019
|
-
this.assertTaskIsActive(task);
|
|
1020
|
-
|
|
1021
|
-
|
|
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
|
-
], {
|
|
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
|
-
|
|
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
|
-
|
|
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)], {
|
|
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 =
|
|
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 =
|
|
1271
|
-
.
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
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
|
|
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 {
|