libre-webui 0.21.3 → 0.22.1
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 +617 -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 +83 -0
- package/backend/dist/platform/storage/storageFactory.d.ts.map +1 -0
- package/backend/dist/platform/storage/storageFactory.js +530 -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 +134 -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 +126 -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 +62 -31
- 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 +833 -275
- 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 +1 -1
- 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 +14 -4
- 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-Jtx9Amhz.js +16 -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 +18 -18
- package/frontend/dist/js/{ArtifactContainer-Dy2Q0iIL.js → ArtifactContainer-fZegtmva.js} +1 -1
- package/frontend/dist/js/{ArtifactDemoPage-K79dWshB.js → ArtifactDemoPage-BDBXYv9l.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-DhqLNUtY.js → ArtifactSandboxFrame-BN16NtKe.js} +3 -3
- package/frontend/dist/js/{ArtifactSlideOutPanel-Cl8JG7bz.js → ArtifactSlideOutPanel-x1fS85Ww.js} +1 -1
- package/frontend/dist/js/{Button-CTXHujOd.js → Button-BV44cTnj.js} +1 -1
- package/frontend/dist/js/ChatPage-C_pXh7WN.js +23 -0
- package/frontend/dist/js/{FirstTimeSetup-kHhRzGJ8.js → FirstTimeSetup-oRrlZnBm.js} +1 -1
- package/frontend/dist/js/GalleryPage-CV_vbE7X.js +1 -0
- package/frontend/dist/js/{HomePage-C1L8WAXL.js → HomePage-P-e7Huco.js} +1 -1
- package/frontend/dist/js/{LibreClawPage-Dyua8IUu.js → LibreClawPage-Cee06SUM.js} +1 -1
- package/frontend/dist/js/{ModelManagerModals-CuMRGUd-.js → ModelManagerModals-D7jIT3v1.js} +1 -1
- package/frontend/dist/js/{ModelSelector-CqHc-Ln4.js → ModelSelector-DXucbvrz.js} +1 -1
- package/frontend/dist/js/ModelsPage-C3_fZpMM.js +2 -0
- package/frontend/dist/js/NotesPage-rEIPWGIb.js +1 -0
- package/frontend/dist/js/{OptimizedSyntaxHighlighter-CWYUn9Oe.js → OptimizedSyntaxHighlighter-XwqZEoTf.js} +1 -1
- package/frontend/dist/js/{PersonasPage-D_6WBCH5.js → PersonasPage-BXtepFuD.js} +2 -2
- package/frontend/dist/js/PluginUsagePage-hhu8cxsu.js +1 -0
- package/frontend/dist/js/RichMessageContent-DkiEvdSg.js +3 -0
- package/frontend/dist/js/SettingsModal-BNxCtJ51.js +1 -0
- package/frontend/dist/js/{SettingsToggle-DLHlCDBl.js → SettingsToggle-WTa0rgvY.js} +1 -1
- package/frontend/dist/js/{SystemPage-BMWEet9e.js → SystemPage-BvvKFuoG.js} +1 -1
- package/frontend/dist/js/UserManagementPage-BccyR7si.js +1 -0
- package/frontend/dist/js/WorkPage-BgxrvY3I.js +6 -0
- package/frontend/dist/js/api-BvPDxsUQ.js +14 -0
- package/frontend/dist/js/appStore-DRSSjaHn.js +2 -0
- package/frontend/dist/js/ar-xTSvTq05.js +2 -0
- package/frontend/dist/js/authStore-BVykIRec.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-UPp5TV_t.js +3 -0
- package/frontend/dist/js/{config-DkV1ka7I.js → config-BTlPm-cZ.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-D5KP-qbw.js → estree-CfYahF_d.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-Cm9c2akd.js → html-BJsDX1UZ.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-B2u7CnKN.js → markdown-GLyuUNig.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-DalG2j6U.js → messageCodeStyles-BHddEFP1.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-Dwm1daef.js → standalone-Dh56V0YW.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-CwieSptM.js → typescript-DRy7A9w4.js} +1 -1
- package/frontend/dist/js/{ui-BnDZpjfc.js → ui-CuY4IifA.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-CXY69qNk.js → useTranslation-C3ei3mJq.js} +1 -1
- package/frontend/dist/js/{utils-BM0_0iFj.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-BOS7crs9.js → workApi-DHuYNHLf.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-BBpNbfKW.js +0 -16
- package/frontend/dist/assets/index-BLATyFmD.css +0 -1
- package/frontend/dist/js/ChatPage-BBayfMLS.js +0 -16
- package/frontend/dist/js/GalleryPage-By8VI39Q.js +0 -1
- package/frontend/dist/js/ModelsPage-ODeXhDDk.js +0 -2
- package/frontend/dist/js/NotesPage-CApzDjOq.js +0 -1
- package/frontend/dist/js/PluginUsagePage-kutS6SOd.js +0 -1
- package/frontend/dist/js/RichMessageContent-g6WT75Te.js +0 -3
- package/frontend/dist/js/SettingsModal-B7z51BCx.js +0 -1
- package/frontend/dist/js/UserManagementPage-D08lM51c.js +0 -1
- package/frontend/dist/js/WorkPage-DdVLefsK.js +0 -6
- package/frontend/dist/js/api-CLEmGcEh.js +0 -14
- package/frontend/dist/js/appStore-CGdhvp9P.js +0 -2
- package/frontend/dist/js/ar-BTmB2WVm.js +0 -2
- package/frontend/dist/js/authStore-Dh3beEOq.js +0 -4
- package/frontend/dist/js/bn-CQnH7YVT.js +0 -2
- package/frontend/dist/js/chatStore-CDeYWL_q.js +0 -3
- package/frontend/dist/js/cs-oTTZkQXr.js +0 -2
- package/frontend/dist/js/da-Br0gB6J6.js +0 -2
- package/frontend/dist/js/de-DE2iztTF.js +0 -2
- package/frontend/dist/js/es-DgthfVtl.js +0 -2
- package/frontend/dist/js/fr-BjxjFwPh.js +0 -2
- package/frontend/dist/js/hi-D1q7E-9N.js +0 -2
- package/frontend/dist/js/id-CDJZqLTF.js +0 -2
- package/frontend/dist/js/is-BU7Um_Tq.js +0 -2
- package/frontend/dist/js/it-CdAxr8P_.js +0 -2
- package/frontend/dist/js/ja-BLbQwz9u.js +0 -2
- package/frontend/dist/js/ko-CY5lpkAe.js +0 -2
- package/frontend/dist/js/markdown-core-DHnR5Hw8.js +0 -16
- package/frontend/dist/js/ms-tQ8AYXEQ.js +0 -2
- package/frontend/dist/js/nl-CRNi2oWT.js +0 -2
- package/frontend/dist/js/pl-CWtFRS_W.js +0 -2
- package/frontend/dist/js/pt-C7SPoLF8.js +0 -2
- package/frontend/dist/js/ru-Dz4AX8xc.js +0 -2
- package/frontend/dist/js/sv-ETy5-boa.js +0 -2
- package/frontend/dist/js/th-DpuMqvxU.js +0 -2
- package/frontend/dist/js/tr-C-1AYAqg.js +0 -2
- package/frontend/dist/js/ui-vendor-xUzKqAXI.js +0 -177
- package/frontend/dist/js/uk-CyS680gr.js +0 -2
- package/frontend/dist/js/vi-BG8HuiTz.js +0 -2
- package/frontend/dist/js/zh-NCs2mkHj.js +0 -2
|
@@ -0,0 +1,1292 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
*/
|
|
6
|
+
import crypto from 'node:crypto';
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { Readable } from 'node:stream';
|
|
10
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
11
|
+
import { POSTGRES_SQLITE_IMPORT_SCHEMA_SQL, SQLITE_STORAGE_IMPORT_TABLE, } from '../../persistence/postgresImportState.js';
|
|
12
|
+
import { LocalEncryptedBlobStore } from './localEncryptedBlobStore.js';
|
|
13
|
+
import { resolveS3BlobConfiguration, S3EncryptedBlobStore, } from './s3EncryptedBlobStore.js';
|
|
14
|
+
import { SqliteEncryptedVectorStore } from './sqliteEncryptedVectorStore.js';
|
|
15
|
+
import { MAX_VECTOR_RESOURCE_INDEX_ENTRIES, } from './vectorStore.js';
|
|
16
|
+
import { aggregateDocumentIndexRevisionFromEntries, documentChunkSourceRevision, readDocumentIndexMetadata, } from './documentVectorIndex.js';
|
|
17
|
+
const PHASE_NAME = 'platform-storage';
|
|
18
|
+
const ITEM_TABLE = SQLITE_STORAGE_IMPORT_TABLE;
|
|
19
|
+
const MAX_ITEMS = 500000;
|
|
20
|
+
const MAX_INLINE_BLOB_BYTES = 512 * 1024 * 1024;
|
|
21
|
+
const MAX_PGVECTOR_DIMENSIONS = 16000;
|
|
22
|
+
const BLOB_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
23
|
+
const hashJson = (value) => crypto.createHash('sha256').update(JSON.stringify(value)).digest('hex');
|
|
24
|
+
const safeNumber = (value, field) => {
|
|
25
|
+
const parsed = typeof value === 'bigint' ? Number(value) : Number(value);
|
|
26
|
+
if (!Number.isSafeInteger(parsed) || parsed < 0) {
|
|
27
|
+
throw new Error(`Invalid SQLite platform storage ${field}`);
|
|
28
|
+
}
|
|
29
|
+
return parsed;
|
|
30
|
+
};
|
|
31
|
+
const itemSourceId = (type, identity) => hashJson([PHASE_NAME, type, identity]);
|
|
32
|
+
const canonicalDescriptor = (descriptor) => ({
|
|
33
|
+
id: descriptor.id,
|
|
34
|
+
ownerUserId: descriptor.ownerUserId,
|
|
35
|
+
purpose: descriptor.purpose,
|
|
36
|
+
contentType: descriptor.contentType,
|
|
37
|
+
originalFilename: descriptor.originalFilename ?? null,
|
|
38
|
+
metadata: Object.fromEntries(Object.entries(descriptor.metadata).sort()),
|
|
39
|
+
size: descriptor.size,
|
|
40
|
+
sha256: descriptor.sha256,
|
|
41
|
+
createdAt: descriptor.createdAt,
|
|
42
|
+
formatVersion: descriptor.formatVersion,
|
|
43
|
+
});
|
|
44
|
+
const canonicalReference = (reference) => ({
|
|
45
|
+
blobId: reference.blobId,
|
|
46
|
+
ownerUserId: reference.ownerUserId,
|
|
47
|
+
resourceType: reference.resourceType,
|
|
48
|
+
resourceId: reference.resourceId,
|
|
49
|
+
purpose: reference.purpose,
|
|
50
|
+
createdAt: reference.createdAt,
|
|
51
|
+
});
|
|
52
|
+
const vectorIdentity = (record) => ({
|
|
53
|
+
namespace: record.namespace,
|
|
54
|
+
ownerUserId: record.ownerUserId,
|
|
55
|
+
id: record.id,
|
|
56
|
+
});
|
|
57
|
+
const vectorIdentityKey = (record) => `${record.namespace}\u0000${record.ownerUserId}\u0000${record.id}`;
|
|
58
|
+
const decodeLegacyEmbedding = (value, memoryId) => {
|
|
59
|
+
if (value.byteLength === 0 ||
|
|
60
|
+
value.byteLength % Float32Array.BYTES_PER_ELEMENT !== 0) {
|
|
61
|
+
throw new Error(`Legacy persona memory ${memoryId} has an invalid embedding byte length`);
|
|
62
|
+
}
|
|
63
|
+
const embedding = [];
|
|
64
|
+
for (let offset = 0; offset < value.byteLength; offset += 4) {
|
|
65
|
+
const component = value.readFloatLE(offset);
|
|
66
|
+
if (!Number.isFinite(component)) {
|
|
67
|
+
throw new Error(`Legacy persona memory ${memoryId} has a non-finite embedding`);
|
|
68
|
+
}
|
|
69
|
+
embedding.push(component);
|
|
70
|
+
}
|
|
71
|
+
return embedding;
|
|
72
|
+
};
|
|
73
|
+
const canonicalVectorChecksum = (record) => {
|
|
74
|
+
const hash = crypto.createHash('sha256');
|
|
75
|
+
hash.update(JSON.stringify({
|
|
76
|
+
namespace: record.namespace,
|
|
77
|
+
id: record.id,
|
|
78
|
+
ownerUserId: record.ownerUserId,
|
|
79
|
+
resourceId: record.resourceId,
|
|
80
|
+
model: record.model,
|
|
81
|
+
dimensions: record.dimensions,
|
|
82
|
+
version: record.version,
|
|
83
|
+
sourceRevision: record.sourceRevision,
|
|
84
|
+
attributes: Object.fromEntries(Object.entries(record.attributes ?? {}).sort(([left], [right]) => left.localeCompare(right))),
|
|
85
|
+
grants: [...(record.grants ?? [])].sort((left, right) => left.type.localeCompare(right.type) || left.id.localeCompare(right.id)),
|
|
86
|
+
createdAt: record.createdAt ?? null,
|
|
87
|
+
}));
|
|
88
|
+
const embedding = Buffer.allocUnsafe(record.embedding.length * 4);
|
|
89
|
+
try {
|
|
90
|
+
for (let index = 0; index < record.embedding.length; index += 1) {
|
|
91
|
+
const component = Math.fround(record.embedding[index]);
|
|
92
|
+
embedding.writeFloatLE(Object.is(component, -0) ? 0 : component, index * 4);
|
|
93
|
+
}
|
|
94
|
+
hash.update(embedding);
|
|
95
|
+
return hash.digest('hex');
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
embedding.fill(0);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const deterministicUuid = (identity) => {
|
|
102
|
+
const bytes = crypto
|
|
103
|
+
.createHash('sha256')
|
|
104
|
+
.update(JSON.stringify([PHASE_NAME, identity]))
|
|
105
|
+
.digest()
|
|
106
|
+
.subarray(0, 16);
|
|
107
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x50;
|
|
108
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
109
|
+
const hex = bytes.toString('hex');
|
|
110
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
111
|
+
};
|
|
112
|
+
const decryptLegacyText = (cipher, value) => cipher.isEncrypted(value) ? cipher.decryptAuthenticated(value) : value;
|
|
113
|
+
const documentResourceKey = (ownerUserId, documentId) => `${ownerUserId}\u0000${documentId}`;
|
|
114
|
+
const float32EmbeddingDigest = (embedding) => {
|
|
115
|
+
const bytes = Buffer.allocUnsafe(embedding.length * 4);
|
|
116
|
+
try {
|
|
117
|
+
for (let index = 0; index < embedding.length; index += 1) {
|
|
118
|
+
const component = Math.fround(embedding[index]);
|
|
119
|
+
bytes.writeFloatLE(Object.is(component, -0) ? 0 : component, index * 4);
|
|
120
|
+
}
|
|
121
|
+
return crypto.createHash('sha256').update(bytes).digest('hex');
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
bytes.fill(0);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
const legacyDocumentCandidateKeys = (database) => {
|
|
128
|
+
const candidates = new Set();
|
|
129
|
+
const rows = database
|
|
130
|
+
.prepare(`SELECT d.id AS document_id, d.user_id
|
|
131
|
+
FROM documents d
|
|
132
|
+
WHERE EXISTS (
|
|
133
|
+
SELECT 1 FROM document_chunks legacy
|
|
134
|
+
WHERE legacy.document_id = d.id AND legacy.embedding IS NOT NULL
|
|
135
|
+
)
|
|
136
|
+
ORDER BY d.user_id, d.id`)
|
|
137
|
+
.iterate();
|
|
138
|
+
for (const row of rows) {
|
|
139
|
+
candidates.add(documentResourceKey(row.user_id, row.document_id));
|
|
140
|
+
}
|
|
141
|
+
return candidates;
|
|
142
|
+
};
|
|
143
|
+
const legacyDocumentVectorCoverageBlocker = (database, cipher, vectorProofs) => {
|
|
144
|
+
const rows = database
|
|
145
|
+
.prepare(`SELECT d.id AS document_id, d.user_id, d.metadata,
|
|
146
|
+
c.id AS chunk_id, c.chunk_index, c.content, c.embedding
|
|
147
|
+
FROM documents d
|
|
148
|
+
JOIN document_chunks c ON c.document_id = d.id
|
|
149
|
+
WHERE EXISTS (
|
|
150
|
+
SELECT 1 FROM document_chunks legacy
|
|
151
|
+
WHERE legacy.document_id = d.id AND legacy.embedding IS NOT NULL
|
|
152
|
+
)
|
|
153
|
+
ORDER BY d.user_id, d.id, c.chunk_index, c.id`)
|
|
154
|
+
.iterate();
|
|
155
|
+
const affected = new Map();
|
|
156
|
+
const reasonCounts = new Map();
|
|
157
|
+
const reject = (row, reason) => {
|
|
158
|
+
const documents = affected.get(row.user_id) ?? new Set();
|
|
159
|
+
documents.add(row.document_id);
|
|
160
|
+
affected.set(row.user_id, documents);
|
|
161
|
+
reasonCounts.set(reason, (reasonCounts.get(reason) ?? 0) + 1);
|
|
162
|
+
};
|
|
163
|
+
const startDocument = (row) => {
|
|
164
|
+
const state = {
|
|
165
|
+
first: row,
|
|
166
|
+
rowCount: 0,
|
|
167
|
+
ciphertextBytes: 0,
|
|
168
|
+
reasons: new Set(),
|
|
169
|
+
chunks: [],
|
|
170
|
+
};
|
|
171
|
+
if (!row.metadata || !cipher.isEncrypted(row.metadata)) {
|
|
172
|
+
state.reasons.add('missing authenticated embeddingIndex metadata');
|
|
173
|
+
return state;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const parsed = JSON.parse(cipher.decryptAuthenticated(row.metadata));
|
|
177
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
178
|
+
state.reasons.add('invalid authenticated embeddingIndex metadata');
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const metadata = readDocumentIndexMetadata(parsed);
|
|
182
|
+
if (!metadata || metadata.dimensions === null) {
|
|
183
|
+
state.reasons.add('invalid authenticated embeddingIndex metadata');
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
state.indexMetadata = metadata;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
state.reasons.add('invalid authenticated embeddingIndex metadata');
|
|
192
|
+
}
|
|
193
|
+
return state;
|
|
194
|
+
};
|
|
195
|
+
const addChunk = (state, row) => {
|
|
196
|
+
state.rowCount += 1;
|
|
197
|
+
const contentBytes = Buffer.byteLength(row.content, 'utf8');
|
|
198
|
+
const embeddingBytes = row.embedding
|
|
199
|
+
? Buffer.byteLength(row.embedding, 'utf8')
|
|
200
|
+
: 0;
|
|
201
|
+
state.ciphertextBytes += contentBytes + embeddingBytes;
|
|
202
|
+
if (state.rowCount > MAX_VECTOR_RESOURCE_INDEX_ENTRIES ||
|
|
203
|
+
state.ciphertextBytes > 80 * 1024 * 1024 ||
|
|
204
|
+
contentBytes > 12 * 1024 * 1024 ||
|
|
205
|
+
embeddingBytes > 4 * 1024 * 1024) {
|
|
206
|
+
state.reasons.add('document vector proof exceeds bounded migration limits');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
let content;
|
|
210
|
+
if (!cipher.isEncrypted(row.content)) {
|
|
211
|
+
state.reasons.add('unauthenticated legacy chunk content');
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
try {
|
|
215
|
+
content = cipher.decryptAuthenticated(row.content);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
state.reasons.add('invalid authenticated chunk content');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
let embedding;
|
|
222
|
+
if (!row.embedding) {
|
|
223
|
+
state.reasons.add('partial inline embedding coverage');
|
|
224
|
+
}
|
|
225
|
+
else if (!cipher.isEncrypted(row.embedding)) {
|
|
226
|
+
state.reasons.add('unauthenticated inline embedding');
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
try {
|
|
230
|
+
const parsed = JSON.parse(cipher.decryptAuthenticated(row.embedding));
|
|
231
|
+
if (!Array.isArray(parsed) ||
|
|
232
|
+
parsed.length < 1 ||
|
|
233
|
+
parsed.length > MAX_PGVECTOR_DIMENSIONS ||
|
|
234
|
+
!parsed.every(component => typeof component === 'number' && Number.isFinite(component))) {
|
|
235
|
+
state.reasons.add('invalid authenticated inline embedding');
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
embedding = parsed;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
state.reasons.add('invalid authenticated inline embedding');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (content !== undefined && embedding) {
|
|
246
|
+
state.chunks.push({
|
|
247
|
+
id: row.chunk_id,
|
|
248
|
+
sourceRevision: documentChunkSourceRevision({ content }),
|
|
249
|
+
dimensions: embedding.length,
|
|
250
|
+
embeddingDigest: float32EmbeddingDigest(embedding),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const finishDocument = (state) => {
|
|
255
|
+
const { first, indexMetadata, chunks, reasons } = state;
|
|
256
|
+
const proofs = vectorProofs.get(documentResourceKey(first.user_id, first.document_id)) ??
|
|
257
|
+
new Map();
|
|
258
|
+
if (!indexMetadata ||
|
|
259
|
+
chunks.length !== state.rowCount ||
|
|
260
|
+
state.rowCount > MAX_VECTOR_RESOURCE_INDEX_ENTRIES) {
|
|
261
|
+
if (reasons.size === 0)
|
|
262
|
+
reasons.add('incomplete modern vector coverage');
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
if (proofs.size !== chunks.length) {
|
|
266
|
+
reasons.add('incomplete or extra platform vector coverage');
|
|
267
|
+
}
|
|
268
|
+
for (const chunk of chunks) {
|
|
269
|
+
const proof = proofs.get(chunk.id);
|
|
270
|
+
if (!proof ||
|
|
271
|
+
proof.model !== indexMetadata.model ||
|
|
272
|
+
proof.version !== indexMetadata.version ||
|
|
273
|
+
proof.dimensions !== indexMetadata.dimensions ||
|
|
274
|
+
chunk.dimensions !== indexMetadata.dimensions ||
|
|
275
|
+
proof.sourceRevision !== chunk.sourceRevision ||
|
|
276
|
+
proof.embeddingDigest !== chunk.embeddingDigest) {
|
|
277
|
+
reasons.add('platform vector payload does not match inline index');
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (aggregateDocumentIndexRevisionFromEntries(chunks, indexMetadata) !==
|
|
282
|
+
indexMetadata.aggregateRevision) {
|
|
283
|
+
reasons.add('embeddingIndex aggregate revision mismatch');
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
for (const reason of reasons)
|
|
287
|
+
reject(first, reason);
|
|
288
|
+
};
|
|
289
|
+
let state;
|
|
290
|
+
let stateKey;
|
|
291
|
+
for (const row of rows) {
|
|
292
|
+
const key = documentResourceKey(row.user_id, row.document_id);
|
|
293
|
+
if (state && key !== stateKey)
|
|
294
|
+
finishDocument(state);
|
|
295
|
+
if (!state || key !== stateKey) {
|
|
296
|
+
state = startDocument(row);
|
|
297
|
+
stateKey = key;
|
|
298
|
+
}
|
|
299
|
+
addChunk(state, row);
|
|
300
|
+
}
|
|
301
|
+
if (state)
|
|
302
|
+
finishDocument(state);
|
|
303
|
+
if (affected.size === 0)
|
|
304
|
+
return undefined;
|
|
305
|
+
const documentIds = [...affected.values()].flatMap(ids => [...ids]);
|
|
306
|
+
const reasons = [...reasonCounts.entries()]
|
|
307
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
308
|
+
.map(([reason, count]) => `${reason}: ${count}`)
|
|
309
|
+
.join('; ');
|
|
310
|
+
const examples = documentIds.slice(0, 8).join(', ');
|
|
311
|
+
return (`${documentIds.length} legacy document index(es) across ${affected.size} owner(s) lack fully authenticated modern vector coverage (${reasons}). ` +
|
|
312
|
+
`Affected document IDs${documentIds.length > 8 ? ' (first 8)' : ''}: ${examples}. ` +
|
|
313
|
+
'Start this Libre WebUI release in solo/SQLite mode with the same DATA_DIR and ENCRYPTION_KEY used for migration, enable and select the desired embedding model, then use Settings -> Documents -> Regenerate embeddings for every affected owner. Rerun the migration dry-run afterward; current preferences do not prove which model created legacy inline vectors.');
|
|
314
|
+
};
|
|
315
|
+
const parseDataUrl = (cipher, row, maximumBytes) => {
|
|
316
|
+
const value = decryptLegacyText(cipher, row.image_data);
|
|
317
|
+
const match = /^data:([a-z0-9.+-]+\/[a-z0-9.+-]+);base64,([a-z0-9+/]+={0,2})$/i.exec(value);
|
|
318
|
+
if (!match) {
|
|
319
|
+
throw new Error(`Gallery item ${row.id} contains a provider URL or invalid inline payload; download it through the current solo release before migration`);
|
|
320
|
+
}
|
|
321
|
+
const mimeType = match[1].toLowerCase();
|
|
322
|
+
if (mimeType !== row.mime_type.toLowerCase()) {
|
|
323
|
+
throw new Error(`Gallery item ${row.id} has inconsistent MIME metadata`);
|
|
324
|
+
}
|
|
325
|
+
const bytes = Buffer.from(match[2], 'base64');
|
|
326
|
+
if (bytes.length > maximumBytes || bytes.toString('base64') !== match[2]) {
|
|
327
|
+
bytes.fill(0);
|
|
328
|
+
throw new Error(`Gallery item ${row.id} has an invalid or oversized payload`);
|
|
329
|
+
}
|
|
330
|
+
return { bytes, mimeType };
|
|
331
|
+
};
|
|
332
|
+
const gallerySemantic = (cipher, row) => ({
|
|
333
|
+
id: row.id,
|
|
334
|
+
userId: row.user_id,
|
|
335
|
+
kind: row.kind,
|
|
336
|
+
prompt: decryptLegacyText(cipher, row.prompt),
|
|
337
|
+
model: row.model,
|
|
338
|
+
pluginId: row.plugin_id,
|
|
339
|
+
mimeType: row.mime_type,
|
|
340
|
+
sizeLabel: row.size,
|
|
341
|
+
quality: row.quality,
|
|
342
|
+
metadataJson: row.metadata ? decryptLegacyText(cipher, row.metadata) : null,
|
|
343
|
+
createdAt: safeNumber(row.created_at, 'gallery creation time'),
|
|
344
|
+
});
|
|
345
|
+
const sourceReferences = (database) => database
|
|
346
|
+
.prepare(`SELECT blob_id, owner_user_id, resource_type, resource_id, purpose,
|
|
347
|
+
CAST(created_at AS REAL) AS created_at
|
|
348
|
+
FROM platform_blob_references
|
|
349
|
+
ORDER BY resource_type, resource_id, purpose`)
|
|
350
|
+
.all().map(row => ({
|
|
351
|
+
blobId: row.blob_id,
|
|
352
|
+
ownerUserId: row.owner_user_id,
|
|
353
|
+
resourceType: row.resource_type,
|
|
354
|
+
resourceId: row.resource_id,
|
|
355
|
+
purpose: row.purpose,
|
|
356
|
+
createdAt: safeNumber(row.created_at, 'blob reference creation time'),
|
|
357
|
+
}));
|
|
358
|
+
const sourceGalleryRows = (database) => database
|
|
359
|
+
.prepare(`SELECT id, user_id, kind, prompt, model, plugin_id, image_data,
|
|
360
|
+
mime_type, size, quality, metadata,
|
|
361
|
+
CAST(created_at AS REAL) AS created_at
|
|
362
|
+
FROM generated_images ORDER BY id`)
|
|
363
|
+
.all();
|
|
364
|
+
const scanLocalBlobIds = (blobRoot) => {
|
|
365
|
+
if (!fs.existsSync(blobRoot))
|
|
366
|
+
return [];
|
|
367
|
+
const rootStat = fs.lstatSync(blobRoot);
|
|
368
|
+
if (!rootStat.isDirectory() || rootStat.isSymbolicLink()) {
|
|
369
|
+
throw new Error('SQLite blob migration root must be a physical directory');
|
|
370
|
+
}
|
|
371
|
+
const objectsRoot = path.join(blobRoot, 'objects');
|
|
372
|
+
if (!fs.existsSync(objectsRoot))
|
|
373
|
+
return [];
|
|
374
|
+
const ids = [];
|
|
375
|
+
for (const first of fs.readdirSync(objectsRoot, { withFileTypes: true })) {
|
|
376
|
+
if (!first.isDirectory() ||
|
|
377
|
+
first.isSymbolicLink() ||
|
|
378
|
+
!/^[0-9a-f]{2}$/.test(first.name)) {
|
|
379
|
+
throw new Error('SQLite blob storage contains a non-canonical first shard');
|
|
380
|
+
}
|
|
381
|
+
const firstPath = path.join(objectsRoot, first.name);
|
|
382
|
+
for (const second of fs.readdirSync(firstPath, { withFileTypes: true })) {
|
|
383
|
+
if (!second.isDirectory() ||
|
|
384
|
+
second.isSymbolicLink() ||
|
|
385
|
+
!/^[0-9a-f]{2}$/.test(second.name)) {
|
|
386
|
+
throw new Error('SQLite blob storage contains a non-canonical second shard');
|
|
387
|
+
}
|
|
388
|
+
const secondPath = path.join(firstPath, second.name);
|
|
389
|
+
for (const entry of fs.readdirSync(secondPath, { withFileTypes: true })) {
|
|
390
|
+
const match = /^([0-9a-f-]{36})\.blob$/.exec(entry.name);
|
|
391
|
+
if (!entry.isFile() ||
|
|
392
|
+
entry.isSymbolicLink() ||
|
|
393
|
+
!match ||
|
|
394
|
+
!BLOB_ID_PATTERN.test(match[1])) {
|
|
395
|
+
throw new Error('SQLite blob storage contains a non-canonical object');
|
|
396
|
+
}
|
|
397
|
+
const id = match[1];
|
|
398
|
+
if (id.slice(0, 2) !== first.name || id.slice(2, 4) !== second.name) {
|
|
399
|
+
throw new Error('SQLite blob object is stored in the wrong shard');
|
|
400
|
+
}
|
|
401
|
+
ids.push(id);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return ids.sort();
|
|
406
|
+
};
|
|
407
|
+
const countStagingFiles = (blobRoot) => {
|
|
408
|
+
const staging = path.join(blobRoot, 'staging');
|
|
409
|
+
if (!fs.existsSync(staging))
|
|
410
|
+
return 0;
|
|
411
|
+
const stat = fs.lstatSync(staging);
|
|
412
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
413
|
+
throw new Error('SQLite blob staging path is not a physical directory');
|
|
414
|
+
}
|
|
415
|
+
return fs
|
|
416
|
+
.readdirSync(staging, { withFileTypes: true })
|
|
417
|
+
.filter(entry => entry.isFile()).length;
|
|
418
|
+
};
|
|
419
|
+
const consumeAndHash = async (body) => {
|
|
420
|
+
const hash = crypto.createHash('sha256');
|
|
421
|
+
for await (const chunk of body)
|
|
422
|
+
hash.update(chunk);
|
|
423
|
+
return hash.digest('hex');
|
|
424
|
+
};
|
|
425
|
+
class MigrationQuotaPolicy {
|
|
426
|
+
constructor(target, afterMetadataCommitted) {
|
|
427
|
+
this.target = target;
|
|
428
|
+
this.afterMetadataCommitted = afterMetadataCommitted;
|
|
429
|
+
}
|
|
430
|
+
async reserve(request) {
|
|
431
|
+
let consumed = 0;
|
|
432
|
+
let settled = false;
|
|
433
|
+
const reservation = {
|
|
434
|
+
consume: async (bytes) => {
|
|
435
|
+
if (settled || !Number.isSafeInteger(bytes) || bytes < 0) {
|
|
436
|
+
throw new Error('Invalid storage migration quota reservation');
|
|
437
|
+
}
|
|
438
|
+
consumed += bytes;
|
|
439
|
+
if (!Number.isSafeInteger(consumed)) {
|
|
440
|
+
throw new Error('Storage migration blob size exceeds integer bounds');
|
|
441
|
+
}
|
|
442
|
+
},
|
|
443
|
+
commit: async (descriptor) => {
|
|
444
|
+
await reservation.commitWithMetadata?.(descriptor, async () => undefined);
|
|
445
|
+
},
|
|
446
|
+
release: async () => {
|
|
447
|
+
settled = true;
|
|
448
|
+
},
|
|
449
|
+
};
|
|
450
|
+
reservation.commitWithMetadata = async (descriptor, operation) => {
|
|
451
|
+
if (settled ||
|
|
452
|
+
descriptor.ownerUserId !== request.ownerUserId ||
|
|
453
|
+
descriptor.purpose !== request.purpose ||
|
|
454
|
+
descriptor.size !== consumed) {
|
|
455
|
+
throw new Error('Storage migration blob accounting mismatch');
|
|
456
|
+
}
|
|
457
|
+
await this.target.query('BEGIN');
|
|
458
|
+
try {
|
|
459
|
+
await operation(this.target);
|
|
460
|
+
await this.target.query(`INSERT INTO platform_blob_quota_objects
|
|
461
|
+
(blob_id, owner_user_id, purpose, stored_bytes, created_at)
|
|
462
|
+
VALUES ($1, $2, $3, $4, $5)`, [
|
|
463
|
+
descriptor.id,
|
|
464
|
+
descriptor.ownerUserId,
|
|
465
|
+
descriptor.purpose,
|
|
466
|
+
descriptor.size,
|
|
467
|
+
Date.parse(descriptor.createdAt),
|
|
468
|
+
]);
|
|
469
|
+
await this.target.query(`INSERT INTO platform_blob_quota_usage
|
|
470
|
+
(owner_user_id, stored_bytes, reserved_bytes, updated_at)
|
|
471
|
+
VALUES ($1, $2, 0, $3)
|
|
472
|
+
ON CONFLICT(owner_user_id) DO UPDATE SET
|
|
473
|
+
stored_bytes = platform_blob_quota_usage.stored_bytes + EXCLUDED.stored_bytes,
|
|
474
|
+
updated_at = EXCLUDED.updated_at`, [descriptor.ownerUserId, descriptor.size, Date.now()]);
|
|
475
|
+
await this.target.query('COMMIT');
|
|
476
|
+
settled = true;
|
|
477
|
+
}
|
|
478
|
+
catch (error) {
|
|
479
|
+
await this.target.query('ROLLBACK').catch(() => undefined);
|
|
480
|
+
throw error;
|
|
481
|
+
}
|
|
482
|
+
await this.afterMetadataCommitted?.(descriptor);
|
|
483
|
+
};
|
|
484
|
+
return reservation;
|
|
485
|
+
}
|
|
486
|
+
async releaseStoredWithMetadata(request, operation) {
|
|
487
|
+
await this.target.query('BEGIN');
|
|
488
|
+
try {
|
|
489
|
+
const existing = await this.target.query(`SELECT stored_bytes FROM platform_blob_quota_objects
|
|
490
|
+
WHERE blob_id = $1 AND owner_user_id = $2 FOR UPDATE`, [request.id, request.ownerUserId]);
|
|
491
|
+
await operation(this.target);
|
|
492
|
+
const storedBytes = existing.rows[0]
|
|
493
|
+
? safeNumber(existing.rows[0].stored_bytes, 'target quota bytes')
|
|
494
|
+
: 0;
|
|
495
|
+
if (storedBytes > 0) {
|
|
496
|
+
await this.target.query(`UPDATE platform_blob_quota_usage
|
|
497
|
+
SET stored_bytes = stored_bytes - $1, updated_at = $2
|
|
498
|
+
WHERE owner_user_id = $3`, [storedBytes, Date.now(), request.ownerUserId]);
|
|
499
|
+
}
|
|
500
|
+
await this.target.query(`DELETE FROM platform_blob_quota_objects
|
|
501
|
+
WHERE blob_id = $1 AND owner_user_id = $2`, [request.id, request.ownerUserId]);
|
|
502
|
+
await this.target.query('COMMIT');
|
|
503
|
+
}
|
|
504
|
+
catch (error) {
|
|
505
|
+
await this.target.query('ROLLBACK').catch(() => undefined);
|
|
506
|
+
throw error;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
class SQLiteToTeamStorageMigrationPhase {
|
|
511
|
+
constructor(options) {
|
|
512
|
+
this.options = options;
|
|
513
|
+
this.env = options.env ?? process.env;
|
|
514
|
+
this.maxItems = options.maxItems ?? MAX_ITEMS;
|
|
515
|
+
this.maxInlineBlobBytes =
|
|
516
|
+
options.maxInlineBlobBytes ?? MAX_INLINE_BLOB_BYTES;
|
|
517
|
+
if (!Number.isSafeInteger(this.maxItems) || this.maxItems < 1) {
|
|
518
|
+
throw new Error('Invalid platform storage migration item limit');
|
|
519
|
+
}
|
|
520
|
+
if (!Number.isSafeInteger(this.maxInlineBlobBytes) ||
|
|
521
|
+
this.maxInlineBlobBytes < 1) {
|
|
522
|
+
throw new Error('Invalid platform storage migration blob limit');
|
|
523
|
+
}
|
|
524
|
+
const resolved = resolveS3BlobConfiguration(this.env);
|
|
525
|
+
this.client = new S3Client(resolved.clientConfig);
|
|
526
|
+
this.bucket = resolved.bucket;
|
|
527
|
+
this.keyPrefix = resolved.keyPrefix;
|
|
528
|
+
}
|
|
529
|
+
localStore(blobRoot) {
|
|
530
|
+
return new LocalEncryptedBlobStore({
|
|
531
|
+
rootDirectory: blobRoot,
|
|
532
|
+
keyring: this.options.keyring,
|
|
533
|
+
readOnly: true,
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
targetStore(target) {
|
|
537
|
+
return new S3EncryptedBlobStore({
|
|
538
|
+
database: target,
|
|
539
|
+
client: this.client,
|
|
540
|
+
bucket: this.bucket,
|
|
541
|
+
keyPrefix: this.keyPrefix,
|
|
542
|
+
keyring: this.options.keyring,
|
|
543
|
+
quotaPolicy: new MigrationQuotaPolicy(target, this.options.afterBlobMetadataCommitted),
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
async *sourceVectorRecords(database) {
|
|
547
|
+
database.defaultSafeIntegers(false);
|
|
548
|
+
const store = new SqliteEncryptedVectorStore({
|
|
549
|
+
database,
|
|
550
|
+
keyring: this.options.keyring,
|
|
551
|
+
});
|
|
552
|
+
const identities = new Set();
|
|
553
|
+
for await (const record of store.exportAuthenticatedRecords()) {
|
|
554
|
+
identities.add(vectorIdentityKey(record));
|
|
555
|
+
yield record;
|
|
556
|
+
}
|
|
557
|
+
const legacyRows = database
|
|
558
|
+
.prepare(`SELECT m.id, m.user_id, m.persona_id, m.content, m.embedding,
|
|
559
|
+
m.timestamp, COALESCE(m.memory_type, 'general') AS memory_type,
|
|
560
|
+
COALESCE(NULLIF(p.embedding_model, ''), 'legacy-import') AS model
|
|
561
|
+
FROM persona_memories m
|
|
562
|
+
JOIN personas p ON p.id = m.persona_id AND p.user_id = m.user_id
|
|
563
|
+
WHERE m.embedding IS NOT NULL
|
|
564
|
+
ORDER BY m.user_id, m.id`)
|
|
565
|
+
.iterate();
|
|
566
|
+
for (const row of legacyRows) {
|
|
567
|
+
const identity = {
|
|
568
|
+
namespace: 'persona-memory',
|
|
569
|
+
ownerUserId: row.user_id,
|
|
570
|
+
id: row.id,
|
|
571
|
+
};
|
|
572
|
+
if (identities.has(vectorIdentityKey(identity)))
|
|
573
|
+
continue;
|
|
574
|
+
const embedding = decodeLegacyEmbedding(row.embedding, row.id);
|
|
575
|
+
if (embedding.length > MAX_PGVECTOR_DIMENSIONS) {
|
|
576
|
+
throw new Error(`Legacy persona memory ${row.id} has ${embedding.length} dimensions; PGVector supports at most ${MAX_PGVECTOR_DIMENSIONS}`);
|
|
577
|
+
}
|
|
578
|
+
const content = decryptLegacyText(this.options.cipher, row.content);
|
|
579
|
+
yield {
|
|
580
|
+
...identity,
|
|
581
|
+
resourceId: row.persona_id,
|
|
582
|
+
model: row.model,
|
|
583
|
+
dimensions: embedding.length,
|
|
584
|
+
version: 'v1',
|
|
585
|
+
sourceRevision: crypto
|
|
586
|
+
.createHash('sha256')
|
|
587
|
+
.update(content, 'utf8')
|
|
588
|
+
.digest('hex'),
|
|
589
|
+
embedding,
|
|
590
|
+
attributes: { memoryType: row.memory_type },
|
|
591
|
+
grants: [],
|
|
592
|
+
createdAt: safeNumber(row.timestamp, 'legacy memory timestamp'),
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
async buildInventory(database, sourcePath) {
|
|
597
|
+
// The relational migrator reads manifest integers as bigint. Storage
|
|
598
|
+
// adapters deliberately validate ordinary safe JS integers, so switch the
|
|
599
|
+
// private migration snapshot back before authenticating storage records.
|
|
600
|
+
database.defaultSafeIntegers(false);
|
|
601
|
+
const blobRoot = path.resolve(this.options.sourceBlobRoot ??
|
|
602
|
+
path.join(path.dirname(sourcePath), 'blobs'));
|
|
603
|
+
const warnings = [];
|
|
604
|
+
const blockers = [];
|
|
605
|
+
const references = sourceReferences(database);
|
|
606
|
+
const referenceByResource = new Map(references.map(reference => [
|
|
607
|
+
`${reference.resourceType}\u0000${reference.resourceId}\u0000${reference.purpose}`,
|
|
608
|
+
reference,
|
|
609
|
+
]));
|
|
610
|
+
const physicalIds = scanLocalBlobIds(blobRoot);
|
|
611
|
+
const physicalSet = new Set(physicalIds);
|
|
612
|
+
const metadataOwners = new Map();
|
|
613
|
+
for (const reference of references) {
|
|
614
|
+
const owners = metadataOwners.get(reference.blobId) ?? new Set();
|
|
615
|
+
owners.add(reference.ownerUserId);
|
|
616
|
+
metadataOwners.set(reference.blobId, owners);
|
|
617
|
+
if (!physicalSet.has(reference.blobId)) {
|
|
618
|
+
blockers.push(`Blob reference ${reference.resourceType}/${reference.resourceId} points to missing object ${reference.blobId}`);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
const quotaRows = database
|
|
622
|
+
.prepare(`SELECT blob_id, owner_user_id FROM platform_blob_quota_objects
|
|
623
|
+
ORDER BY blob_id`)
|
|
624
|
+
.all();
|
|
625
|
+
for (const row of quotaRows) {
|
|
626
|
+
const owners = metadataOwners.get(row.blob_id) ?? new Set();
|
|
627
|
+
owners.add(row.owner_user_id);
|
|
628
|
+
metadataOwners.set(row.blob_id, owners);
|
|
629
|
+
if (!physicalSet.has(row.blob_id)) {
|
|
630
|
+
blockers.push(`Blob quota metadata points to missing object ${row.blob_id}`);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
const reservationCount = safeNumber(database
|
|
634
|
+
.prepare(`SELECT CAST(COUNT(*) AS REAL) AS count
|
|
635
|
+
FROM platform_blob_quota_reservations`)
|
|
636
|
+
.get().count, 'reservation count');
|
|
637
|
+
if (reservationCount > 0) {
|
|
638
|
+
warnings.push(`${reservationCount} abandoned/in-flight blob quota reservation(s) are not copied; target usage is reconstructed from authenticated objects.`);
|
|
639
|
+
}
|
|
640
|
+
const stagingFiles = countStagingFiles(blobRoot);
|
|
641
|
+
if (stagingFiles > 0) {
|
|
642
|
+
warnings.push(`${stagingFiles} private staging blob file(s) are excluded; only atomically published objects are migrated.`);
|
|
643
|
+
}
|
|
644
|
+
const blobs = [];
|
|
645
|
+
if (physicalIds.length > 0) {
|
|
646
|
+
const store = this.localStore(blobRoot);
|
|
647
|
+
for (const id of physicalIds) {
|
|
648
|
+
const descriptor = await store.inspectAuthenticated(id);
|
|
649
|
+
const digest = await consumeAndHash((await store.open({ id, ownerUserId: descriptor.ownerUserId })).body);
|
|
650
|
+
if (digest !== descriptor.sha256) {
|
|
651
|
+
throw new Error(`Local blob ${id} failed plaintext checksum verification`);
|
|
652
|
+
}
|
|
653
|
+
const owners = metadataOwners.get(id);
|
|
654
|
+
if (owners &&
|
|
655
|
+
(owners.size !== 1 || !owners.has(descriptor.ownerUserId))) {
|
|
656
|
+
blockers.push(`Blob ${id} owner metadata does not match its authenticated descriptor`);
|
|
657
|
+
}
|
|
658
|
+
const checksum = hashJson(canonicalDescriptor(descriptor));
|
|
659
|
+
blobs.push({
|
|
660
|
+
type: 'blob',
|
|
661
|
+
sourceId: itemSourceId('blob', id),
|
|
662
|
+
checksum,
|
|
663
|
+
targetId: id,
|
|
664
|
+
descriptor,
|
|
665
|
+
source: 'local',
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
const gallery = [];
|
|
670
|
+
const allReferences = [...references];
|
|
671
|
+
for (const row of sourceGalleryRows(database)) {
|
|
672
|
+
const semantic = gallerySemantic(this.options.cipher, row);
|
|
673
|
+
const referenceKey = `generated-media\u0000${row.id}\u0000gallery.media`;
|
|
674
|
+
let reference = referenceByResource.get(referenceKey);
|
|
675
|
+
if (!reference) {
|
|
676
|
+
try {
|
|
677
|
+
const parsed = parseDataUrl(this.options.cipher, row, this.maxInlineBlobBytes);
|
|
678
|
+
try {
|
|
679
|
+
const targetId = deterministicUuid(['gallery-inline', row.id]);
|
|
680
|
+
const descriptor = {
|
|
681
|
+
id: targetId,
|
|
682
|
+
ownerUserId: row.user_id,
|
|
683
|
+
purpose: 'gallery.media',
|
|
684
|
+
contentType: parsed.mimeType,
|
|
685
|
+
metadata: Object.freeze({
|
|
686
|
+
resourceType: 'generated-media',
|
|
687
|
+
resourceId: row.id,
|
|
688
|
+
}),
|
|
689
|
+
size: parsed.bytes.length,
|
|
690
|
+
sha256: crypto
|
|
691
|
+
.createHash('sha256')
|
|
692
|
+
.update(parsed.bytes)
|
|
693
|
+
.digest('hex'),
|
|
694
|
+
createdAt: new Date(semantic.createdAt).toISOString(),
|
|
695
|
+
encryptionKeyId: this.options.keyring.activeKeyId,
|
|
696
|
+
formatVersion: 1,
|
|
697
|
+
};
|
|
698
|
+
blobs.push({
|
|
699
|
+
type: 'blob',
|
|
700
|
+
sourceId: itemSourceId('blob', ['gallery-inline', row.id]),
|
|
701
|
+
checksum: hashJson(canonicalDescriptor(descriptor)),
|
|
702
|
+
targetId,
|
|
703
|
+
descriptor,
|
|
704
|
+
source: 'gallery-inline',
|
|
705
|
+
mediaId: row.id,
|
|
706
|
+
});
|
|
707
|
+
reference = {
|
|
708
|
+
blobId: targetId,
|
|
709
|
+
ownerUserId: row.user_id,
|
|
710
|
+
resourceType: 'generated-media',
|
|
711
|
+
resourceId: row.id,
|
|
712
|
+
purpose: 'gallery.media',
|
|
713
|
+
createdAt: semantic.createdAt,
|
|
714
|
+
};
|
|
715
|
+
allReferences.push(reference);
|
|
716
|
+
referenceByResource.set(referenceKey, reference);
|
|
717
|
+
}
|
|
718
|
+
finally {
|
|
719
|
+
parsed.bytes.fill(0);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
catch (error) {
|
|
723
|
+
blockers.push(error instanceof Error
|
|
724
|
+
? error.message
|
|
725
|
+
: `Gallery item ${row.id} is not migratable`);
|
|
726
|
+
continue;
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if (reference.ownerUserId !== row.user_id) {
|
|
730
|
+
blockers.push(`Gallery item ${row.id} has a cross-owner blob reference`);
|
|
731
|
+
continue;
|
|
732
|
+
}
|
|
733
|
+
const blob = blobs.find(item => item.targetId === reference.blobId);
|
|
734
|
+
if (!blob) {
|
|
735
|
+
blockers.push(`Gallery item ${row.id} references unavailable blob ${reference.blobId}`);
|
|
736
|
+
continue;
|
|
737
|
+
}
|
|
738
|
+
const checksum = hashJson({ ...semantic, blobId: reference.blobId });
|
|
739
|
+
gallery.push({
|
|
740
|
+
type: 'gallery',
|
|
741
|
+
sourceId: itemSourceId('gallery', row.id),
|
|
742
|
+
checksum,
|
|
743
|
+
targetId: row.id,
|
|
744
|
+
mediaId: row.id,
|
|
745
|
+
blobId: reference.blobId,
|
|
746
|
+
semantic,
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
const referenceItems = allReferences
|
|
750
|
+
.map(reference => ({
|
|
751
|
+
type: 'reference',
|
|
752
|
+
sourceId: itemSourceId('reference', [
|
|
753
|
+
reference.resourceType,
|
|
754
|
+
reference.resourceId,
|
|
755
|
+
reference.purpose,
|
|
756
|
+
]),
|
|
757
|
+
checksum: hashJson(canonicalReference(reference)),
|
|
758
|
+
targetId: reference.blobId,
|
|
759
|
+
reference,
|
|
760
|
+
}))
|
|
761
|
+
.sort((left, right) => left.sourceId.localeCompare(right.sourceId));
|
|
762
|
+
const vectors = [];
|
|
763
|
+
const legacyDocumentCandidates = legacyDocumentCandidateKeys(database);
|
|
764
|
+
const documentVectorProofs = new Map();
|
|
765
|
+
try {
|
|
766
|
+
for await (const record of this.sourceVectorRecords(database)) {
|
|
767
|
+
if (record.namespace === 'document-chunk') {
|
|
768
|
+
const key = documentResourceKey(record.ownerUserId, record.resourceId);
|
|
769
|
+
if (legacyDocumentCandidates.has(key)) {
|
|
770
|
+
const proofs = documentVectorProofs.get(key) ??
|
|
771
|
+
new Map();
|
|
772
|
+
proofs.set(record.id, {
|
|
773
|
+
id: record.id,
|
|
774
|
+
model: record.model,
|
|
775
|
+
dimensions: record.dimensions,
|
|
776
|
+
version: record.version,
|
|
777
|
+
sourceRevision: record.sourceRevision,
|
|
778
|
+
embeddingDigest: float32EmbeddingDigest(record.embedding),
|
|
779
|
+
});
|
|
780
|
+
documentVectorProofs.set(key, proofs);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
if (record.dimensions > MAX_PGVECTOR_DIMENSIONS) {
|
|
784
|
+
blockers.push(`Vector ${record.namespace}/${record.id} has ${record.dimensions} dimensions; PGVector supports at most ${MAX_PGVECTOR_DIMENSIONS}`);
|
|
785
|
+
}
|
|
786
|
+
const identity = vectorIdentity(record);
|
|
787
|
+
vectors.push({
|
|
788
|
+
type: 'vector',
|
|
789
|
+
sourceId: itemSourceId('vector', identity),
|
|
790
|
+
checksum: canonicalVectorChecksum(record),
|
|
791
|
+
targetId: record.id,
|
|
792
|
+
identity,
|
|
793
|
+
});
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
catch (error) {
|
|
797
|
+
blockers.push(`Platform vector authentication failed: ${error instanceof Error ? error.message : 'invalid vector record'}`);
|
|
798
|
+
}
|
|
799
|
+
const legacyDocumentBlocker = legacyDocumentVectorCoverageBlocker(database, this.options.cipher, documentVectorProofs);
|
|
800
|
+
if (legacyDocumentBlocker)
|
|
801
|
+
blockers.push(legacyDocumentBlocker);
|
|
802
|
+
vectors.sort((left, right) => left.sourceId.localeCompare(right.sourceId));
|
|
803
|
+
blobs.sort((left, right) => left.sourceId.localeCompare(right.sourceId));
|
|
804
|
+
gallery.sort((left, right) => left.sourceId.localeCompare(right.sourceId));
|
|
805
|
+
const items = [
|
|
806
|
+
...blobs,
|
|
807
|
+
...vectors,
|
|
808
|
+
...gallery,
|
|
809
|
+
...referenceItems,
|
|
810
|
+
];
|
|
811
|
+
if (items.length > this.maxItems) {
|
|
812
|
+
blockers.push(`Platform storage migration has ${items.length} items, exceeding the configured limit of ${this.maxItems}`);
|
|
813
|
+
}
|
|
814
|
+
const checksum = hashJson(items.map(item => [
|
|
815
|
+
item.type,
|
|
816
|
+
item.sourceId,
|
|
817
|
+
item.checksum,
|
|
818
|
+
item.targetId,
|
|
819
|
+
]));
|
|
820
|
+
return {
|
|
821
|
+
sourcePath,
|
|
822
|
+
blobRoot,
|
|
823
|
+
items,
|
|
824
|
+
blobs,
|
|
825
|
+
vectors,
|
|
826
|
+
gallery,
|
|
827
|
+
references: referenceItems,
|
|
828
|
+
checksum,
|
|
829
|
+
warnings,
|
|
830
|
+
blockers: [...new Set(blockers)],
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
async inventoryFor(database, sourcePath) {
|
|
834
|
+
if (this.inventory?.sourcePath === sourcePath && this.inventory.checksum) {
|
|
835
|
+
return this.inventory;
|
|
836
|
+
}
|
|
837
|
+
this.inventory = await this.buildInventory(database, sourcePath);
|
|
838
|
+
return this.inventory;
|
|
839
|
+
}
|
|
840
|
+
async analyze(input) {
|
|
841
|
+
const inventory = await this.inventoryFor(input.sourceDatabase, input.sourcePath);
|
|
842
|
+
return {
|
|
843
|
+
name: PHASE_NAME,
|
|
844
|
+
items: inventory.items.length,
|
|
845
|
+
checksum: inventory.checksum,
|
|
846
|
+
warnings: [...inventory.warnings],
|
|
847
|
+
blockers: [...inventory.blockers],
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
async ensureJournal(target) {
|
|
851
|
+
await target.query(POSTGRES_SQLITE_IMPORT_SCHEMA_SQL);
|
|
852
|
+
}
|
|
853
|
+
async journalRow(target, fingerprint, item) {
|
|
854
|
+
const result = await target.query(`SELECT item_type, source_id, source_checksum, target_id
|
|
855
|
+
FROM ${ITEM_TABLE}
|
|
856
|
+
WHERE source_fingerprint = $1 AND item_type = $2 AND source_id = $3`, [fingerprint, item.type, item.sourceId]);
|
|
857
|
+
return result.rows[0];
|
|
858
|
+
}
|
|
859
|
+
assertJournal(row, item) {
|
|
860
|
+
if (row.item_type !== item.type ||
|
|
861
|
+
row.source_id !== item.sourceId ||
|
|
862
|
+
row.source_checksum !== item.checksum ||
|
|
863
|
+
row.target_id !== item.targetId) {
|
|
864
|
+
throw new Error(`Platform storage import journal mismatch for ${item.type}`);
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
async recordJournal(target, fingerprint, item) {
|
|
868
|
+
await target.query(`INSERT INTO ${ITEM_TABLE}
|
|
869
|
+
(source_fingerprint, item_type, source_id, source_checksum, target_id,
|
|
870
|
+
status, updated_at)
|
|
871
|
+
VALUES ($1, $2, $3, $4, $5, 'complete', $6)
|
|
872
|
+
ON CONFLICT(source_fingerprint, item_type, source_id) DO NOTHING`, [
|
|
873
|
+
fingerprint,
|
|
874
|
+
item.type,
|
|
875
|
+
item.sourceId,
|
|
876
|
+
item.checksum,
|
|
877
|
+
item.targetId,
|
|
878
|
+
Date.now(),
|
|
879
|
+
]);
|
|
880
|
+
const row = await this.journalRow(target, fingerprint, item);
|
|
881
|
+
if (!row)
|
|
882
|
+
throw new Error('Platform storage import journal write was lost');
|
|
883
|
+
this.assertJournal(row, item);
|
|
884
|
+
await this.options.afterItemCommitted?.({
|
|
885
|
+
type: item.type,
|
|
886
|
+
sourceId: item.sourceId,
|
|
887
|
+
targetId: item.targetId,
|
|
888
|
+
});
|
|
889
|
+
}
|
|
890
|
+
async verifyTargetBlob(store, item) {
|
|
891
|
+
const descriptor = await store.stat(item.targetId, item.descriptor.ownerUserId);
|
|
892
|
+
if (hashJson(canonicalDescriptor(descriptor)) !== item.checksum) {
|
|
893
|
+
throw new Error(`Migrated blob ${item.targetId} metadata checksum mismatch`);
|
|
894
|
+
}
|
|
895
|
+
const digest = await consumeAndHash((await store.open({
|
|
896
|
+
id: item.targetId,
|
|
897
|
+
ownerUserId: item.descriptor.ownerUserId,
|
|
898
|
+
})).body);
|
|
899
|
+
if (digest !== item.descriptor.sha256) {
|
|
900
|
+
throw new Error(`Migrated blob ${item.targetId} body checksum mismatch`);
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
async targetBlobExists(target, item) {
|
|
904
|
+
const result = await target.query(`SELECT 1 FROM platform_blob_objects
|
|
905
|
+
WHERE id = $1 AND owner_user_id = $2`, [item.targetId, item.descriptor.ownerUserId]);
|
|
906
|
+
return result.rowCount === 1;
|
|
907
|
+
}
|
|
908
|
+
async applyBlob(input, inventory, item, store) {
|
|
909
|
+
const journal = await this.journalRow(input.target, input.sourceFingerprint, item);
|
|
910
|
+
if (journal) {
|
|
911
|
+
this.assertJournal(journal, item);
|
|
912
|
+
await this.verifyTargetBlob(store, item);
|
|
913
|
+
return;
|
|
914
|
+
}
|
|
915
|
+
if (await this.targetBlobExists(input.target, item)) {
|
|
916
|
+
await this.verifyTargetBlob(store, item);
|
|
917
|
+
await this.recordJournal(input.target, input.sourceFingerprint, item);
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
if (item.source === 'local') {
|
|
921
|
+
const sourceStore = this.localStore(inventory.blobRoot);
|
|
922
|
+
const request = {
|
|
923
|
+
ownerUserId: item.descriptor.ownerUserId,
|
|
924
|
+
purpose: item.descriptor.purpose,
|
|
925
|
+
contentType: item.descriptor.contentType,
|
|
926
|
+
expectedSize: item.descriptor.size,
|
|
927
|
+
...(item.descriptor.originalFilename
|
|
928
|
+
? { originalFilename: item.descriptor.originalFilename }
|
|
929
|
+
: {}),
|
|
930
|
+
metadata: item.descriptor.metadata,
|
|
931
|
+
source: (await sourceStore.open({
|
|
932
|
+
id: item.descriptor.id,
|
|
933
|
+
ownerUserId: item.descriptor.ownerUserId,
|
|
934
|
+
})).body,
|
|
935
|
+
};
|
|
936
|
+
const descriptor = await store.putWithId(request, item.targetId, item.descriptor.createdAt);
|
|
937
|
+
if (hashJson(canonicalDescriptor(descriptor)) !== item.checksum) {
|
|
938
|
+
await store.delete({
|
|
939
|
+
id: item.targetId,
|
|
940
|
+
ownerUserId: item.descriptor.ownerUserId,
|
|
941
|
+
});
|
|
942
|
+
throw new Error(`Migrated blob ${item.targetId} changed semantic metadata`);
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
else {
|
|
946
|
+
const row = sourceGalleryRows(input.sourceDatabase).find(candidate => candidate.id === item.mediaId);
|
|
947
|
+
if (!row)
|
|
948
|
+
throw new Error(`Gallery source ${item.mediaId} disappeared`);
|
|
949
|
+
const parsed = parseDataUrl(this.options.cipher, row, this.maxInlineBlobBytes);
|
|
950
|
+
try {
|
|
951
|
+
const descriptor = await store.putWithId({
|
|
952
|
+
ownerUserId: item.descriptor.ownerUserId,
|
|
953
|
+
purpose: item.descriptor.purpose,
|
|
954
|
+
contentType: parsed.mimeType,
|
|
955
|
+
expectedSize: parsed.bytes.length,
|
|
956
|
+
metadata: item.descriptor.metadata,
|
|
957
|
+
source: Readable.from(parsed.bytes),
|
|
958
|
+
}, item.targetId, item.descriptor.createdAt);
|
|
959
|
+
if (hashJson(canonicalDescriptor(descriptor)) !== item.checksum) {
|
|
960
|
+
await store.delete({
|
|
961
|
+
id: item.targetId,
|
|
962
|
+
ownerUserId: item.descriptor.ownerUserId,
|
|
963
|
+
});
|
|
964
|
+
throw new Error(`Migrated blob ${item.targetId} changed semantic metadata`);
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
finally {
|
|
968
|
+
parsed.bytes.fill(0);
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
await this.recordJournal(input.target, input.sourceFingerprint, item);
|
|
972
|
+
}
|
|
973
|
+
async targetVectorRecord(target, identity) {
|
|
974
|
+
const result = await target.query(`SELECT namespace, id, owner_user_id, resource_id, model, dimensions,
|
|
975
|
+
embedding_version, source_revision, embedding::text AS embedding_text,
|
|
976
|
+
attributes, created_at
|
|
977
|
+
FROM platform_vector_entries
|
|
978
|
+
WHERE namespace = $1 AND owner_user_id = $2 AND id = $3`, [identity.namespace, identity.ownerUserId, identity.id]);
|
|
979
|
+
const row = result.rows[0];
|
|
980
|
+
if (!row)
|
|
981
|
+
return undefined;
|
|
982
|
+
const acl = await target.query(`SELECT principal_type, principal_id FROM platform_vector_acl
|
|
983
|
+
WHERE namespace = $1 AND owner_user_id = $2 AND vector_id = $3
|
|
984
|
+
ORDER BY principal_type, principal_id`, [identity.namespace, identity.ownerUserId, identity.id]);
|
|
985
|
+
const attributes = typeof row.attributes === 'string'
|
|
986
|
+
? JSON.parse(row.attributes)
|
|
987
|
+
: row.attributes;
|
|
988
|
+
return {
|
|
989
|
+
namespace: row.namespace,
|
|
990
|
+
id: row.id,
|
|
991
|
+
ownerUserId: row.owner_user_id,
|
|
992
|
+
resourceId: row.resource_id,
|
|
993
|
+
model: row.model,
|
|
994
|
+
dimensions: safeNumber(row.dimensions, 'target vector dimensions'),
|
|
995
|
+
version: row.embedding_version,
|
|
996
|
+
sourceRevision: row.source_revision,
|
|
997
|
+
embedding: JSON.parse(row.embedding_text),
|
|
998
|
+
attributes,
|
|
999
|
+
grants: acl.rows.map(item => ({
|
|
1000
|
+
type: item.principal_type,
|
|
1001
|
+
id: item.principal_id,
|
|
1002
|
+
})),
|
|
1003
|
+
createdAt: safeNumber(row.created_at, 'target vector creation time'),
|
|
1004
|
+
};
|
|
1005
|
+
}
|
|
1006
|
+
async verifyTargetVector(target, item) {
|
|
1007
|
+
const record = await this.targetVectorRecord(target, item.identity);
|
|
1008
|
+
if (!record || canonicalVectorChecksum(record) !== item.checksum) {
|
|
1009
|
+
throw new Error(`Migrated vector ${item.identity.namespace}/${item.identity.id} checksum mismatch`);
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
async applyVector(input, item, record) {
|
|
1013
|
+
if (canonicalVectorChecksum(record) !== item.checksum) {
|
|
1014
|
+
throw new Error('SQLite vector changed after migration analysis');
|
|
1015
|
+
}
|
|
1016
|
+
const journal = await this.journalRow(input.target, input.sourceFingerprint, item);
|
|
1017
|
+
if (journal) {
|
|
1018
|
+
this.assertJournal(journal, item);
|
|
1019
|
+
await this.verifyTargetVector(input.target, item);
|
|
1020
|
+
return;
|
|
1021
|
+
}
|
|
1022
|
+
if (await this.targetVectorRecord(input.target, item.identity)) {
|
|
1023
|
+
await this.verifyTargetVector(input.target, item);
|
|
1024
|
+
await this.recordJournal(input.target, input.sourceFingerprint, item);
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
await input.target.query('BEGIN');
|
|
1028
|
+
try {
|
|
1029
|
+
await input.target.query(`INSERT INTO platform_vector_entries
|
|
1030
|
+
(namespace, id, owner_user_id, resource_id, model, dimensions,
|
|
1031
|
+
embedding_version, source_revision, embedding, attributes,
|
|
1032
|
+
created_at, updated_at)
|
|
1033
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::vector, $10::jsonb,
|
|
1034
|
+
$11, $12)`, [
|
|
1035
|
+
record.namespace,
|
|
1036
|
+
record.id,
|
|
1037
|
+
record.ownerUserId,
|
|
1038
|
+
record.resourceId,
|
|
1039
|
+
record.model,
|
|
1040
|
+
record.dimensions,
|
|
1041
|
+
record.version,
|
|
1042
|
+
record.sourceRevision,
|
|
1043
|
+
`[${record.embedding.map(value => Math.fround(value)).join(',')}]`,
|
|
1044
|
+
JSON.stringify(record.attributes ?? {}),
|
|
1045
|
+
record.createdAt ?? Date.now(),
|
|
1046
|
+
Date.now(),
|
|
1047
|
+
]);
|
|
1048
|
+
const grants = [...(record.grants ?? [])];
|
|
1049
|
+
for (const grant of grants) {
|
|
1050
|
+
await input.target.query(`INSERT INTO platform_vector_acl
|
|
1051
|
+
(namespace, owner_user_id, vector_id, principal_type, principal_id)
|
|
1052
|
+
VALUES ($1, $2, $3, $4, $5)`, [
|
|
1053
|
+
record.namespace,
|
|
1054
|
+
record.ownerUserId,
|
|
1055
|
+
record.id,
|
|
1056
|
+
grant.type,
|
|
1057
|
+
grant.id,
|
|
1058
|
+
]);
|
|
1059
|
+
}
|
|
1060
|
+
await this.recordJournal(input.target, input.sourceFingerprint, item);
|
|
1061
|
+
await input.target.query('COMMIT');
|
|
1062
|
+
}
|
|
1063
|
+
catch (error) {
|
|
1064
|
+
await input.target.query('ROLLBACK').catch(() => undefined);
|
|
1065
|
+
throw error;
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
async verifyGallery(target, item) {
|
|
1069
|
+
const result = await target.query('SELECT * FROM platform_generated_media WHERE id = $1', [item.mediaId]);
|
|
1070
|
+
const row = result.rows[0];
|
|
1071
|
+
if (!row)
|
|
1072
|
+
throw new Error(`Migrated gallery item ${item.mediaId} is missing`);
|
|
1073
|
+
const semantic = {
|
|
1074
|
+
id: row.id,
|
|
1075
|
+
userId: row.user_id,
|
|
1076
|
+
kind: row.kind,
|
|
1077
|
+
prompt: this.options.cipher.decryptAuthenticated(row.encrypted_prompt),
|
|
1078
|
+
model: row.model,
|
|
1079
|
+
pluginId: row.plugin_id,
|
|
1080
|
+
mimeType: row.mime_type,
|
|
1081
|
+
sizeLabel: row.size_label,
|
|
1082
|
+
quality: row.quality,
|
|
1083
|
+
metadataJson: row.encrypted_metadata
|
|
1084
|
+
? this.options.cipher.decryptAuthenticated(row.encrypted_metadata)
|
|
1085
|
+
: null,
|
|
1086
|
+
createdAt: safeNumber(row.created_at, 'target gallery creation time'),
|
|
1087
|
+
};
|
|
1088
|
+
if (hashJson({ ...semantic, blobId: row.blob_id }) !== item.checksum) {
|
|
1089
|
+
throw new Error(`Migrated gallery item ${item.mediaId} checksum mismatch`);
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
async applyGallery(input, item) {
|
|
1093
|
+
const journal = await this.journalRow(input.target, input.sourceFingerprint, item);
|
|
1094
|
+
if (journal) {
|
|
1095
|
+
this.assertJournal(journal, item);
|
|
1096
|
+
await this.verifyGallery(input.target, item);
|
|
1097
|
+
return;
|
|
1098
|
+
}
|
|
1099
|
+
const existing = await input.target.query('SELECT 1 FROM platform_generated_media WHERE id = $1', [item.mediaId]);
|
|
1100
|
+
if (existing.rowCount === 1) {
|
|
1101
|
+
await this.verifyGallery(input.target, item);
|
|
1102
|
+
await this.recordJournal(input.target, input.sourceFingerprint, item);
|
|
1103
|
+
return;
|
|
1104
|
+
}
|
|
1105
|
+
await input.target.query('BEGIN');
|
|
1106
|
+
try {
|
|
1107
|
+
const semantic = item.semantic;
|
|
1108
|
+
await input.target.query(`INSERT INTO platform_generated_media
|
|
1109
|
+
(id, user_id, kind, encrypted_prompt, model, plugin_id, blob_id,
|
|
1110
|
+
mime_type, size_label, quality, encrypted_metadata, created_at)
|
|
1111
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)`, [
|
|
1112
|
+
semantic.id,
|
|
1113
|
+
semantic.userId,
|
|
1114
|
+
semantic.kind,
|
|
1115
|
+
this.options.cipher.encrypt(semantic.prompt),
|
|
1116
|
+
semantic.model,
|
|
1117
|
+
semantic.pluginId,
|
|
1118
|
+
item.blobId,
|
|
1119
|
+
semantic.mimeType,
|
|
1120
|
+
semantic.sizeLabel,
|
|
1121
|
+
semantic.quality,
|
|
1122
|
+
semantic.metadataJson
|
|
1123
|
+
? this.options.cipher.encrypt(semantic.metadataJson)
|
|
1124
|
+
: null,
|
|
1125
|
+
semantic.createdAt,
|
|
1126
|
+
]);
|
|
1127
|
+
await this.recordJournal(input.target, input.sourceFingerprint, item);
|
|
1128
|
+
await input.target.query('COMMIT');
|
|
1129
|
+
}
|
|
1130
|
+
catch (error) {
|
|
1131
|
+
await input.target.query('ROLLBACK').catch(() => undefined);
|
|
1132
|
+
throw error;
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
async verifyReference(target, item) {
|
|
1136
|
+
const result = await target.query(`SELECT blob_id, owner_user_id, resource_type, resource_id, purpose,
|
|
1137
|
+
created_at
|
|
1138
|
+
FROM platform_blob_references
|
|
1139
|
+
WHERE resource_type = $1 AND resource_id = $2 AND purpose = $3`, [
|
|
1140
|
+
item.reference.resourceType,
|
|
1141
|
+
item.reference.resourceId,
|
|
1142
|
+
item.reference.purpose,
|
|
1143
|
+
]);
|
|
1144
|
+
const row = result.rows[0];
|
|
1145
|
+
if (!row)
|
|
1146
|
+
throw new Error('Migrated blob reference is missing');
|
|
1147
|
+
const reference = {
|
|
1148
|
+
blobId: row.blob_id,
|
|
1149
|
+
ownerUserId: row.owner_user_id,
|
|
1150
|
+
resourceType: row.resource_type,
|
|
1151
|
+
resourceId: row.resource_id,
|
|
1152
|
+
purpose: row.purpose,
|
|
1153
|
+
createdAt: safeNumber(row.created_at, 'target reference creation time'),
|
|
1154
|
+
};
|
|
1155
|
+
if (hashJson(canonicalReference(reference)) !== item.checksum) {
|
|
1156
|
+
throw new Error('Migrated blob reference checksum mismatch');
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
async applyReference(input, item) {
|
|
1160
|
+
const journal = await this.journalRow(input.target, input.sourceFingerprint, item);
|
|
1161
|
+
if (journal) {
|
|
1162
|
+
this.assertJournal(journal, item);
|
|
1163
|
+
await this.verifyReference(input.target, item);
|
|
1164
|
+
return;
|
|
1165
|
+
}
|
|
1166
|
+
const existing = await input.target.query(`SELECT 1 FROM platform_blob_references
|
|
1167
|
+
WHERE resource_type = $1 AND resource_id = $2 AND purpose = $3`, [
|
|
1168
|
+
item.reference.resourceType,
|
|
1169
|
+
item.reference.resourceId,
|
|
1170
|
+
item.reference.purpose,
|
|
1171
|
+
]);
|
|
1172
|
+
if (existing.rowCount === 1) {
|
|
1173
|
+
await this.verifyReference(input.target, item);
|
|
1174
|
+
await this.recordJournal(input.target, input.sourceFingerprint, item);
|
|
1175
|
+
return;
|
|
1176
|
+
}
|
|
1177
|
+
await input.target.query('BEGIN');
|
|
1178
|
+
try {
|
|
1179
|
+
const reference = item.reference;
|
|
1180
|
+
await input.target.query(`INSERT INTO platform_blob_references
|
|
1181
|
+
(blob_id, owner_user_id, resource_type, resource_id, purpose, created_at)
|
|
1182
|
+
VALUES ($1, $2, $3, $4, $5, $6)`, [
|
|
1183
|
+
reference.blobId,
|
|
1184
|
+
reference.ownerUserId,
|
|
1185
|
+
reference.resourceType,
|
|
1186
|
+
reference.resourceId,
|
|
1187
|
+
reference.purpose,
|
|
1188
|
+
reference.createdAt,
|
|
1189
|
+
]);
|
|
1190
|
+
await this.recordJournal(input.target, input.sourceFingerprint, item);
|
|
1191
|
+
await input.target.query('COMMIT');
|
|
1192
|
+
}
|
|
1193
|
+
catch (error) {
|
|
1194
|
+
await input.target.query('ROLLBACK').catch(() => undefined);
|
|
1195
|
+
throw error;
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
async apply(input) {
|
|
1199
|
+
const inventory = await this.inventoryFor(input.sourceDatabase, input.sourcePath);
|
|
1200
|
+
if (inventory.blockers.length > 0) {
|
|
1201
|
+
throw new Error('Platform storage source is not migratable');
|
|
1202
|
+
}
|
|
1203
|
+
await this.ensureJournal(input.target);
|
|
1204
|
+
const store = this.targetStore(input.target);
|
|
1205
|
+
for (const item of inventory.blobs) {
|
|
1206
|
+
await this.applyBlob(input, inventory, item, store);
|
|
1207
|
+
}
|
|
1208
|
+
const expectedVectors = new Map(inventory.vectors.map(item => [item.sourceId, item]));
|
|
1209
|
+
for await (const record of this.sourceVectorRecords(input.sourceDatabase)) {
|
|
1210
|
+
const item = expectedVectors.get(itemSourceId('vector', vectorIdentity(record)));
|
|
1211
|
+
if (!item)
|
|
1212
|
+
throw new Error('SQLite vector manifest changed during import');
|
|
1213
|
+
await this.applyVector(input, item, record);
|
|
1214
|
+
expectedVectors.delete(item.sourceId);
|
|
1215
|
+
}
|
|
1216
|
+
if (expectedVectors.size > 0) {
|
|
1217
|
+
throw new Error('SQLite vector manifest is incomplete during import');
|
|
1218
|
+
}
|
|
1219
|
+
for (const item of inventory.gallery)
|
|
1220
|
+
await this.applyGallery(input, item);
|
|
1221
|
+
for (const item of inventory.references) {
|
|
1222
|
+
await this.applyReference(input, item);
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
async validate(input) {
|
|
1226
|
+
const inventory = await this.inventoryFor(input.sourceDatabase, input.sourcePath);
|
|
1227
|
+
await this.ensureJournal(input.target);
|
|
1228
|
+
const rows = await input.target.query(`SELECT item_type, source_id, source_checksum, target_id
|
|
1229
|
+
FROM ${ITEM_TABLE}
|
|
1230
|
+
WHERE source_fingerprint = $1
|
|
1231
|
+
ORDER BY item_type, source_id`, [input.sourceFingerprint]);
|
|
1232
|
+
if (rows.rows.length !== inventory.items.length) {
|
|
1233
|
+
throw new Error('Platform storage import journal is incomplete');
|
|
1234
|
+
}
|
|
1235
|
+
const store = this.targetStore(input.target);
|
|
1236
|
+
for (const item of inventory.items) {
|
|
1237
|
+
const row = rows.rows.find(candidate => candidate.item_type === item.type &&
|
|
1238
|
+
candidate.source_id === item.sourceId);
|
|
1239
|
+
if (!row)
|
|
1240
|
+
throw new Error('Platform storage import item is missing');
|
|
1241
|
+
this.assertJournal(row, item);
|
|
1242
|
+
if (item.type === 'blob')
|
|
1243
|
+
await this.verifyTargetBlob(store, item);
|
|
1244
|
+
else if (item.type === 'vector') {
|
|
1245
|
+
await this.verifyTargetVector(input.target, item);
|
|
1246
|
+
}
|
|
1247
|
+
else if (item.type === 'gallery') {
|
|
1248
|
+
await this.verifyGallery(input.target, item);
|
|
1249
|
+
}
|
|
1250
|
+
else {
|
|
1251
|
+
await this.verifyReference(input.target, item);
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
async rollback(input) {
|
|
1256
|
+
const inventory = await this.inventoryFor(input.sourceDatabase, input.sourcePath);
|
|
1257
|
+
await this.ensureJournal(input.target);
|
|
1258
|
+
for (const item of [...inventory.gallery].reverse()) {
|
|
1259
|
+
await input.target.query('DELETE FROM platform_generated_media WHERE id = $1', [item.mediaId]);
|
|
1260
|
+
}
|
|
1261
|
+
for (const item of [...inventory.references].reverse()) {
|
|
1262
|
+
await input.target.query(`DELETE FROM platform_blob_references
|
|
1263
|
+
WHERE resource_type = $1 AND resource_id = $2 AND purpose = $3`, [
|
|
1264
|
+
item.reference.resourceType,
|
|
1265
|
+
item.reference.resourceId,
|
|
1266
|
+
item.reference.purpose,
|
|
1267
|
+
]);
|
|
1268
|
+
}
|
|
1269
|
+
for (const item of [...inventory.vectors].reverse()) {
|
|
1270
|
+
await input.target.query(`DELETE FROM platform_vector_entries
|
|
1271
|
+
WHERE namespace = $1 AND owner_user_id = $2 AND id = $3`, [item.identity.namespace, item.identity.ownerUserId, item.identity.id]);
|
|
1272
|
+
}
|
|
1273
|
+
const store = this.targetStore(input.target);
|
|
1274
|
+
for (const item of [...inventory.blobs].reverse()) {
|
|
1275
|
+
const deleted = await store.delete({
|
|
1276
|
+
id: item.targetId,
|
|
1277
|
+
ownerUserId: item.descriptor.ownerUserId,
|
|
1278
|
+
});
|
|
1279
|
+
if (!deleted) {
|
|
1280
|
+
await store.purgeUntrackedObject(item.targetId);
|
|
1281
|
+
await input.target.query('DELETE FROM platform_blob_quota_objects WHERE blob_id = $1', [item.targetId]);
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
await input.target.query(`DELETE FROM ${ITEM_TABLE} WHERE source_fingerprint = $1`, [input.sourceFingerprint]);
|
|
1285
|
+
}
|
|
1286
|
+
async close() {
|
|
1287
|
+
this.client.destroy();
|
|
1288
|
+
this.inventory = undefined;
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
export const createSQLiteToTeamStorageMigrationPhase = (options) => new SQLiteToTeamStorageMigrationPhase(options);
|
|
1292
|
+
//# sourceMappingURL=sqliteToTeamStorageMigration.js.map
|