libre-webui 0.25.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -22
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +33 -4
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/middleware/auth.d.ts +7 -0
- package/backend/dist/middleware/auth.d.ts.map +1 -1
- package/backend/dist/middleware/auth.js +26 -0
- package/backend/dist/middleware/auth.js.map +1 -1
- package/backend/dist/middleware/index.d.ts +20 -0
- package/backend/dist/middleware/index.d.ts.map +1 -1
- package/backend/dist/middleware/index.js +105 -2
- package/backend/dist/middleware/index.js.map +1 -1
- package/backend/dist/models/personaModel.d.ts.map +1 -1
- package/backend/dist/models/personaModel.js +2 -0
- package/backend/dist/models/personaModel.js.map +1 -1
- package/backend/dist/observability/otel.d.ts +40 -0
- package/backend/dist/observability/otel.d.ts.map +1 -0
- package/backend/dist/observability/otel.js +337 -0
- package/backend/dist/observability/otel.js.map +1 -0
- package/backend/dist/observability/requestContext.d.ts +14 -0
- package/backend/dist/observability/requestContext.d.ts.map +1 -0
- package/backend/dist/observability/requestContext.js +21 -0
- package/backend/dist/observability/requestContext.js.map +1 -0
- package/backend/dist/persistence/chatGenerationTypes.d.ts +9 -0
- package/backend/dist/persistence/chatGenerationTypes.d.ts.map +1 -1
- package/backend/dist/persistence/extensionTypes.d.ts +13 -0
- package/backend/dist/persistence/extensionTypes.d.ts.map +1 -1
- package/backend/dist/persistence/extensionTypes.js.map +1 -1
- package/backend/dist/persistence/index.d.ts +1 -1
- package/backend/dist/persistence/index.d.ts.map +1 -1
- package/backend/dist/persistence/index.js.map +1 -1
- package/backend/dist/persistence/postgresAgentFoundationMigration.d.ts +9 -0
- package/backend/dist/persistence/postgresAgentFoundationMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresAgentFoundationMigration.js +164 -0
- package/backend/dist/persistence/postgresAgentFoundationMigration.js.map +1 -0
- package/backend/dist/persistence/postgresExtensionRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/postgresExtensionRepositories.js +46 -2
- package/backend/dist/persistence/postgresExtensionRepositories.js.map +1 -1
- package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.d.ts +10 -0
- package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.js +148 -0
- package/backend/dist/persistence/postgresMediaEnterpriseOpsMigration.js.map +1 -0
- package/backend/dist/persistence/postgresMfaPushRecoveryMigration.d.ts +9 -0
- package/backend/dist/persistence/postgresMfaPushRecoveryMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresMfaPushRecoveryMigration.js +107 -0
- package/backend/dist/persistence/postgresMfaPushRecoveryMigration.js.map +1 -0
- package/backend/dist/persistence/postgresMigrationRegistry.d.ts.map +1 -1
- package/backend/dist/persistence/postgresMigrationRegistry.js +12 -0
- package/backend/dist/persistence/postgresMigrationRegistry.js.map +1 -1
- package/backend/dist/persistence/postgresNotesV2Migration.d.ts +4 -0
- package/backend/dist/persistence/postgresNotesV2Migration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresNotesV2Migration.js +57 -0
- package/backend/dist/persistence/postgresNotesV2Migration.js.map +1 -0
- package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/postgresResourceRepositories.js +1930 -133
- package/backend/dist/persistence/postgresResourceRepositories.js.map +1 -1
- package/backend/dist/persistence/postgresSecurityRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/postgresSecurityRepositories.js +150 -0
- package/backend/dist/persistence/postgresSecurityRepositories.js.map +1 -1
- package/backend/dist/persistence/postgresSkillFilesMigration.d.ts +9 -0
- package/backend/dist/persistence/postgresSkillFilesMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresSkillFilesMigration.js +50 -0
- package/backend/dist/persistence/postgresSkillFilesMigration.js.map +1 -0
- package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts +10 -0
- package/backend/dist/persistence/postgresTeamCollaborationMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresTeamCollaborationMigration.js +161 -0
- package/backend/dist/persistence/postgresTeamCollaborationMigration.js.map +1 -0
- package/backend/dist/persistence/resourceTypes.d.ts +600 -3
- package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
- package/backend/dist/persistence/resourceTypes.js.map +1 -1
- package/backend/dist/persistence/securityTypes.d.ts +59 -0
- package/backend/dist/persistence/securityTypes.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteExtensionRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteExtensionRepositories.js +26 -4
- package/backend/dist/persistence/sqliteExtensionRepositories.js.map +1 -1
- package/backend/dist/persistence/sqliteMigrations.d.ts +10 -0
- package/backend/dist/persistence/sqliteMigrations.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteMigrations.js +1492 -131
- package/backend/dist/persistence/sqliteMigrations.js.map +1 -1
- package/backend/dist/persistence/sqliteResourceRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteResourceRepositories.js +1657 -134
- package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
- package/backend/dist/persistence/sqliteSecurityRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteSecurityRepositories.js +134 -0
- package/backend/dist/persistence/sqliteSecurityRepositories.js.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.js +302 -3
- package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
- package/backend/dist/platform/jobs/domainJobContracts.d.ts +10 -0
- package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -1
- package/backend/dist/platform/jobs/domainJobContracts.js +10 -0
- package/backend/dist/platform/jobs/domainJobContracts.js.map +1 -1
- package/backend/dist/platform/jobs/domainJobHandlers.d.ts.map +1 -1
- package/backend/dist/platform/jobs/domainJobHandlers.js +374 -4
- package/backend/dist/platform/jobs/domainJobHandlers.js.map +1 -1
- package/backend/dist/platform/jobs/embeddedDurableJobWorker.d.ts.map +1 -1
- package/backend/dist/platform/jobs/embeddedDurableJobWorker.js +4 -2
- package/backend/dist/platform/jobs/embeddedDurableJobWorker.js.map +1 -1
- package/backend/dist/platform/jobs/postgresDurableJobWorker.d.ts.map +1 -1
- package/backend/dist/platform/jobs/postgresDurableJobWorker.js +4 -2
- package/backend/dist/platform/jobs/postgresDurableJobWorker.js.map +1 -1
- package/backend/dist/platform/storage/pgVectorStore.d.ts +2 -1
- package/backend/dist/platform/storage/pgVectorStore.d.ts.map +1 -1
- package/backend/dist/platform/storage/pgVectorStore.js +51 -0
- package/backend/dist/platform/storage/pgVectorStore.js.map +1 -1
- package/backend/dist/platform/storage/platformDomainRepositories.d.ts +8 -2
- package/backend/dist/platform/storage/platformDomainRepositories.d.ts.map +1 -1
- package/backend/dist/platform/storage/postgresPlatformDomainRepositories.d.ts.map +1 -1
- package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js +25 -4
- package/backend/dist/platform/storage/postgresPlatformDomainRepositories.js.map +1 -1
- package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts +2 -1
- package/backend/dist/platform/storage/sqliteEncryptedVectorStore.d.ts.map +1 -1
- package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js +35 -0
- package/backend/dist/platform/storage/sqliteEncryptedVectorStore.js.map +1 -1
- package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.d.ts.map +1 -1
- package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js +26 -3
- package/backend/dist/platform/storage/sqlitePlatformDomainRepositories.js.map +1 -1
- package/backend/dist/platform/storage/vectorStore.d.ts +14 -0
- package/backend/dist/platform/storage/vectorStore.d.ts.map +1 -1
- package/backend/dist/platform/storage/vectorStore.js.map +1 -1
- package/backend/dist/routes/access.d.ts.map +1 -1
- package/backend/dist/routes/access.js +84 -3
- package/backend/dist/routes/access.js.map +1 -1
- package/backend/dist/routes/auth.d.ts.map +1 -1
- package/backend/dist/routes/auth.js +419 -1
- package/backend/dist/routes/auth.js.map +1 -1
- package/backend/dist/routes/calendar.d.ts.map +1 -1
- package/backend/dist/routes/calendar.js +125 -22
- package/backend/dist/routes/calendar.js.map +1 -1
- package/backend/dist/routes/channels.d.ts +3 -0
- package/backend/dist/routes/channels.d.ts.map +1 -0
- package/backend/dist/routes/channels.js +447 -0
- package/backend/dist/routes/channels.js.map +1 -0
- package/backend/dist/routes/chat.d.ts.map +1 -1
- package/backend/dist/routes/chat.js +195 -7
- package/backend/dist/routes/chat.js.map +1 -1
- package/backend/dist/routes/costs.d.ts +3 -0
- package/backend/dist/routes/costs.d.ts.map +1 -0
- package/backend/dist/routes/costs.js +191 -0
- package/backend/dist/routes/costs.js.map +1 -0
- package/backend/dist/routes/documents.d.ts.map +1 -1
- package/backend/dist/routes/documents.js +68 -21
- package/backend/dist/routes/documents.js.map +1 -1
- package/backend/dist/routes/evaluations.d.ts +3 -0
- package/backend/dist/routes/evaluations.d.ts.map +1 -0
- package/backend/dist/routes/evaluations.js +352 -0
- package/backend/dist/routes/evaluations.js.map +1 -0
- package/backend/dist/routes/imageGen.d.ts.map +1 -1
- package/backend/dist/routes/imageGen.js +2 -1
- package/backend/dist/routes/imageGen.js.map +1 -1
- package/backend/dist/routes/media.d.ts.map +1 -1
- package/backend/dist/routes/media.js +228 -7
- 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 +149 -36
- package/backend/dist/routes/notes.js.map +1 -1
- package/backend/dist/routes/notifications.d.ts +3 -0
- package/backend/dist/routes/notifications.d.ts.map +1 -0
- package/backend/dist/routes/notifications.js +213 -0
- package/backend/dist/routes/notifications.js.map +1 -0
- package/backend/dist/routes/openaiCompat.d.ts +3 -0
- package/backend/dist/routes/openaiCompat.d.ts.map +1 -0
- package/backend/dist/routes/openaiCompat.js +314 -0
- package/backend/dist/routes/openaiCompat.js.map +1 -0
- package/backend/dist/routes/personas.js +1 -1
- package/backend/dist/routes/personas.js.map +1 -1
- package/backend/dist/routes/prompts.d.ts +3 -0
- package/backend/dist/routes/prompts.d.ts.map +1 -0
- package/backend/dist/routes/prompts.js +173 -0
- package/backend/dist/routes/prompts.js.map +1 -0
- package/backend/dist/routes/push.d.ts +3 -0
- package/backend/dist/routes/push.d.ts.map +1 -0
- package/backend/dist/routes/push.js +105 -0
- package/backend/dist/routes/push.js.map +1 -0
- package/backend/dist/routes/recovery.d.ts +3 -0
- package/backend/dist/routes/recovery.d.ts.map +1 -0
- package/backend/dist/routes/recovery.js +83 -0
- package/backend/dist/routes/recovery.js.map +1 -0
- package/backend/dist/routes/search.d.ts.map +1 -1
- package/backend/dist/routes/search.js +29 -1
- package/backend/dist/routes/search.js.map +1 -1
- package/backend/dist/routes/skills.d.ts +3 -0
- package/backend/dist/routes/skills.d.ts.map +1 -0
- package/backend/dist/routes/skills.js +246 -0
- package/backend/dist/routes/skills.js.map +1 -0
- package/backend/dist/routes/stt.d.ts.map +1 -1
- package/backend/dist/routes/stt.js +2 -1
- package/backend/dist/routes/stt.js.map +1 -1
- package/backend/dist/routes/tools.d.ts +3 -0
- package/backend/dist/routes/tools.d.ts.map +1 -0
- package/backend/dist/routes/tools.js +359 -0
- package/backend/dist/routes/tools.js.map +1 -0
- package/backend/dist/routes/tts.d.ts.map +1 -1
- package/backend/dist/routes/tts.js +63 -8
- 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 +35 -0
- package/backend/dist/routes/users.js.map +1 -1
- package/backend/dist/routes/voiceAccess.d.ts +3 -0
- package/backend/dist/routes/voiceAccess.d.ts.map +1 -0
- package/backend/dist/routes/voiceAccess.js +102 -0
- package/backend/dist/routes/voiceAccess.js.map +1 -0
- package/backend/dist/services/apiTokenService.d.ts +2 -2
- package/backend/dist/services/apiTokenService.d.ts.map +1 -1
- package/backend/dist/services/apiTokenService.js +7 -0
- package/backend/dist/services/apiTokenService.js.map +1 -1
- package/backend/dist/services/authService.d.ts +6 -0
- package/backend/dist/services/authService.d.ts.map +1 -1
- package/backend/dist/services/authService.js +9 -0
- package/backend/dist/services/authService.js.map +1 -1
- package/backend/dist/services/authorizationService.d.ts +8 -4
- package/backend/dist/services/authorizationService.d.ts.map +1 -1
- package/backend/dist/services/authorizationService.js +31 -1
- package/backend/dist/services/authorizationService.js.map +1 -1
- package/backend/dist/services/automationSchedulerService.d.ts.map +1 -1
- package/backend/dist/services/automationSchedulerService.js +40 -3
- package/backend/dist/services/automationSchedulerService.js.map +1 -1
- package/backend/dist/services/automationService.d.ts +4 -1
- package/backend/dist/services/automationService.d.ts.map +1 -1
- package/backend/dist/services/automationService.js +25 -2
- package/backend/dist/services/automationService.js.map +1 -1
- package/backend/dist/services/builtinToolsService.d.ts +20 -0
- package/backend/dist/services/builtinToolsService.d.ts.map +1 -0
- package/backend/dist/services/builtinToolsService.js +661 -0
- package/backend/dist/services/builtinToolsService.js.map +1 -0
- package/backend/dist/services/calendarService.d.ts +74 -0
- package/backend/dist/services/calendarService.d.ts.map +1 -0
- package/backend/dist/services/calendarService.js +339 -0
- package/backend/dist/services/calendarService.js.map +1 -0
- package/backend/dist/services/channelService.d.ts +195 -0
- package/backend/dist/services/channelService.d.ts.map +1 -0
- package/backend/dist/services/channelService.js +1057 -0
- package/backend/dist/services/channelService.js.map +1 -0
- package/backend/dist/services/chatRequestService.d.ts.map +1 -1
- package/backend/dist/services/chatRequestService.js +29 -1
- package/backend/dist/services/chatRequestService.js.map +1 -1
- package/backend/dist/services/chatService.d.ts +61 -1
- package/backend/dist/services/chatService.d.ts.map +1 -1
- package/backend/dist/services/chatService.js +218 -1
- package/backend/dist/services/chatService.js.map +1 -1
- package/backend/dist/services/chatToolRuntimeService.d.ts +55 -0
- package/backend/dist/services/chatToolRuntimeService.d.ts.map +1 -0
- package/backend/dist/services/chatToolRuntimeService.js +389 -0
- package/backend/dist/services/chatToolRuntimeService.js.map +1 -0
- package/backend/dist/services/costGovernanceService.d.ts +102 -0
- package/backend/dist/services/costGovernanceService.d.ts.map +1 -0
- package/backend/dist/services/costGovernanceService.js +463 -0
- package/backend/dist/services/costGovernanceService.js.map +1 -0
- package/backend/dist/services/dataArchiveService.d.ts +6 -0
- package/backend/dist/services/dataArchiveService.d.ts.map +1 -1
- package/backend/dist/services/dataArchiveService.js +26 -4
- package/backend/dist/services/dataArchiveService.js.map +1 -1
- package/backend/dist/services/documentMediaExtractionService.d.ts +40 -0
- package/backend/dist/services/documentMediaExtractionService.d.ts.map +1 -0
- package/backend/dist/services/documentMediaExtractionService.js +157 -0
- package/backend/dist/services/documentMediaExtractionService.js.map +1 -0
- package/backend/dist/services/documentService.d.ts +64 -1
- package/backend/dist/services/documentService.d.ts.map +1 -1
- package/backend/dist/services/documentService.js +342 -83
- package/backend/dist/services/documentService.js.map +1 -1
- package/backend/dist/services/durableChatGenerationService.d.ts +9 -0
- package/backend/dist/services/durableChatGenerationService.d.ts.map +1 -1
- package/backend/dist/services/durableChatGenerationService.js +152 -11
- package/backend/dist/services/durableChatGenerationService.js.map +1 -1
- package/backend/dist/services/encryptionService.d.ts +6 -0
- package/backend/dist/services/encryptionService.d.ts.map +1 -1
- package/backend/dist/services/encryptionService.js +12 -0
- package/backend/dist/services/encryptionService.js.map +1 -1
- package/backend/dist/services/evaluationService.d.ts +111 -0
- package/backend/dist/services/evaluationService.d.ts.map +1 -0
- package/backend/dist/services/evaluationService.js +403 -0
- package/backend/dist/services/evaluationService.js.map +1 -0
- package/backend/dist/services/galleryService.d.ts +6 -0
- package/backend/dist/services/galleryService.d.ts.map +1 -1
- package/backend/dist/services/galleryService.js +26 -0
- package/backend/dist/services/galleryService.js.map +1 -1
- package/backend/dist/services/mcpClientService.d.ts +29 -0
- package/backend/dist/services/mcpClientService.d.ts.map +1 -0
- package/backend/dist/services/mcpClientService.js +189 -0
- package/backend/dist/services/mcpClientService.js.map +1 -0
- package/backend/dist/services/mfaService.d.ts +64 -0
- package/backend/dist/services/mfaService.d.ts.map +1 -0
- package/backend/dist/services/mfaService.js +263 -0
- package/backend/dist/services/mfaService.js.map +1 -0
- package/backend/dist/services/noteService.d.ts +71 -0
- package/backend/dist/services/noteService.d.ts.map +1 -0
- package/backend/dist/services/noteService.js +397 -0
- package/backend/dist/services/noteService.js.map +1 -0
- package/backend/dist/services/notificationService.d.ts +60 -0
- package/backend/dist/services/notificationService.d.ts.map +1 -0
- package/backend/dist/services/notificationService.js +340 -0
- package/backend/dist/services/notificationService.js.map +1 -0
- package/backend/dist/services/openApiToolService.d.ts +38 -0
- package/backend/dist/services/openApiToolService.d.ts.map +1 -0
- package/backend/dist/services/openApiToolService.js +254 -0
- package/backend/dist/services/openApiToolService.js.map +1 -0
- package/backend/dist/services/personaService.d.ts +18 -2
- package/backend/dist/services/personaService.d.ts.map +1 -1
- package/backend/dist/services/personaService.js +113 -4
- package/backend/dist/services/personaService.js.map +1 -1
- package/backend/dist/services/pluginImageGenerationService.d.ts +19 -0
- package/backend/dist/services/pluginImageGenerationService.d.ts.map +1 -1
- package/backend/dist/services/pluginImageGenerationService.js +121 -0
- package/backend/dist/services/pluginImageGenerationService.js.map +1 -1
- package/backend/dist/services/pluginService.d.ts +7 -0
- package/backend/dist/services/pluginService.d.ts.map +1 -1
- package/backend/dist/services/pluginService.js +8 -2
- package/backend/dist/services/pluginService.js.map +1 -1
- package/backend/dist/services/preferencesService.d.ts +1 -1
- package/backend/dist/services/preferencesService.d.ts.map +1 -1
- package/backend/dist/services/preferencesService.js +1 -0
- package/backend/dist/services/preferencesService.js.map +1 -1
- package/backend/dist/services/promptService.d.ts +74 -0
- package/backend/dist/services/promptService.d.ts.map +1 -0
- package/backend/dist/services/promptService.js +513 -0
- package/backend/dist/services/promptService.js.map +1 -0
- package/backend/dist/services/recoveryDrillService.d.ts +57 -0
- package/backend/dist/services/recoveryDrillService.d.ts.map +1 -0
- package/backend/dist/services/recoveryDrillService.js +363 -0
- package/backend/dist/services/recoveryDrillService.js.map +1 -0
- package/backend/dist/services/resourceGrantService.d.ts.map +1 -1
- package/backend/dist/services/resourceGrantService.js +62 -17
- package/backend/dist/services/resourceGrantService.js.map +1 -1
- package/backend/dist/services/searchService.d.ts +29 -0
- package/backend/dist/services/searchService.d.ts.map +1 -0
- package/backend/dist/services/searchService.js +0 -0
- package/backend/dist/services/searchService.js.map +1 -0
- package/backend/dist/services/securityAuditService.d.ts.map +1 -1
- package/backend/dist/services/securityAuditService.js +2 -1
- package/backend/dist/services/securityAuditService.js.map +1 -1
- package/backend/dist/services/sharedResourceAccess.d.ts +25 -0
- package/backend/dist/services/sharedResourceAccess.d.ts.map +1 -0
- package/backend/dist/services/sharedResourceAccess.js +59 -0
- package/backend/dist/services/sharedResourceAccess.js.map +1 -0
- package/backend/dist/services/skillService.d.ts +137 -0
- package/backend/dist/services/skillService.d.ts.map +1 -0
- package/backend/dist/services/skillService.js +852 -0
- package/backend/dist/services/skillService.js.map +1 -0
- package/backend/dist/services/toolAccessService.d.ts +9 -0
- package/backend/dist/services/toolAccessService.d.ts.map +1 -0
- package/backend/dist/services/toolAccessService.js +60 -0
- package/backend/dist/services/toolAccessService.js.map +1 -0
- package/backend/dist/services/toolApprovalService.d.ts +34 -0
- package/backend/dist/services/toolApprovalService.d.ts.map +1 -0
- package/backend/dist/services/toolApprovalService.js +188 -0
- package/backend/dist/services/toolApprovalService.js.map +1 -0
- package/backend/dist/services/toolGatewayService.d.ts +53 -0
- package/backend/dist/services/toolGatewayService.d.ts.map +1 -0
- package/backend/dist/services/toolGatewayService.js +249 -0
- package/backend/dist/services/toolGatewayService.js.map +1 -0
- package/backend/dist/services/toolServerService.d.ts +57 -0
- package/backend/dist/services/toolServerService.d.ts.map +1 -0
- package/backend/dist/services/toolServerService.js +521 -0
- package/backend/dist/services/toolServerService.js.map +1 -0
- package/backend/dist/services/voiceAccessService.d.ts +10 -0
- package/backend/dist/services/voiceAccessService.d.ts.map +1 -0
- package/backend/dist/services/voiceAccessService.js +74 -0
- package/backend/dist/services/voiceAccessService.js.map +1 -0
- package/backend/dist/services/voiceProfileService.d.ts +20 -0
- package/backend/dist/services/voiceProfileService.d.ts.map +1 -1
- package/backend/dist/services/voiceProfileService.js +60 -0
- package/backend/dist/services/voiceProfileService.js.map +1 -1
- package/backend/dist/services/webPushService.d.ts +71 -0
- package/backend/dist/services/webPushService.d.ts.map +1 -0
- package/backend/dist/services/webPushService.js +328 -0
- package/backend/dist/services/webPushService.js.map +1 -0
- package/backend/dist/services/webauthnService.d.ts +58 -0
- package/backend/dist/services/webauthnService.d.ts.map +1 -0
- package/backend/dist/services/webauthnService.js +300 -0
- package/backend/dist/services/webauthnService.js.map +1 -0
- package/backend/dist/storage.d.ts +28 -1
- package/backend/dist/storage.d.ts.map +1 -1
- package/backend/dist/storage.js +100 -1
- package/backend/dist/storage.js.map +1 -1
- package/backend/dist/storageMappers.d.ts +2 -2
- package/backend/dist/storageMappers.d.ts.map +1 -1
- package/backend/dist/storageMappers.js.map +1 -1
- package/backend/dist/types/index.d.ts +199 -3
- package/backend/dist/types/index.d.ts.map +1 -1
- package/backend/dist/types/index.js.map +1 -1
- package/backend/dist/types/tools.d.ts +137 -0
- package/backend/dist/types/tools.d.ts.map +1 -0
- package/backend/dist/types/tools.js +25 -0
- package/backend/dist/types/tools.js.map +1 -0
- package/backend/dist/utils/chatDocumentContext.d.ts +26 -1
- package/backend/dist/utils/chatDocumentContext.d.ts.map +1 -1
- package/backend/dist/utils/chatDocumentContext.js +87 -18
- package/backend/dist/utils/chatDocumentContext.js.map +1 -1
- package/backend/dist/utils/documentExtraction.d.ts +97 -0
- package/backend/dist/utils/documentExtraction.d.ts.map +1 -0
- package/backend/dist/utils/documentExtraction.js +651 -0
- package/backend/dist/utils/documentExtraction.js.map +1 -0
- package/backend/dist/utils/hybridRetrieval.d.ts +34 -0
- package/backend/dist/utils/hybridRetrieval.d.ts.map +1 -0
- package/backend/dist/utils/hybridRetrieval.js +119 -0
- package/backend/dist/utils/hybridRetrieval.js.map +1 -0
- package/backend/dist/utils/icsCalendar.d.ts +27 -0
- package/backend/dist/utils/icsCalendar.d.ts.map +1 -0
- package/backend/dist/utils/icsCalendar.js +313 -0
- package/backend/dist/utils/icsCalendar.js.map +1 -0
- package/backend/dist/utils/imageEditUpload.d.ts +29 -0
- package/backend/dist/utils/imageEditUpload.d.ts.map +1 -0
- package/backend/dist/utils/imageEditUpload.js +82 -0
- package/backend/dist/utils/imageEditUpload.js.map +1 -0
- package/backend/dist/utils/logRedaction.d.ts +2 -0
- package/backend/dist/utils/logRedaction.d.ts.map +1 -0
- package/backend/dist/utils/logRedaction.js +66 -0
- package/backend/dist/utils/logRedaction.js.map +1 -0
- package/backend/dist/utils/logger.d.ts +3 -0
- package/backend/dist/utils/logger.d.ts.map +1 -1
- package/backend/dist/utils/logger.js +63 -20
- package/backend/dist/utils/logger.js.map +1 -1
- package/backend/dist/utils/pluginChatAdapter.d.ts +5 -1
- package/backend/dist/utils/pluginChatAdapter.d.ts.map +1 -1
- package/backend/dist/utils/pluginChatAdapter.js +83 -0
- package/backend/dist/utils/pluginChatAdapter.js.map +1 -1
- package/backend/dist/utils/pluginDefinitionTrust.js +1 -1
- package/backend/dist/utils/resourceLimits.d.ts +61 -2
- package/backend/dist/utils/resourceLimits.d.ts.map +1 -1
- package/backend/dist/utils/resourceLimits.js +59 -0
- package/backend/dist/utils/resourceLimits.js.map +1 -1
- package/backend/dist/utils/toolEgress.d.ts +23 -0
- package/backend/dist/utils/toolEgress.d.ts.map +1 -0
- package/backend/dist/utils/toolEgress.js +169 -0
- package/backend/dist/utils/toolEgress.js.map +1 -0
- package/backend/dist/utils/totp.d.ts +19 -0
- package/backend/dist/utils/totp.d.ts.map +1 -0
- package/backend/dist/utils/totp.js +117 -0
- package/backend/dist/utils/totp.js.map +1 -0
- package/backend/dist/utils/webauthn.d.ts +43 -0
- package/backend/dist/utils/webauthn.d.ts.map +1 -0
- package/backend/dist/utils/webauthn.js +294 -0
- package/backend/dist/utils/webauthn.js.map +1 -0
- package/backend/dist/utils/websocketMessages.d.ts +6 -0
- package/backend/dist/utils/websocketMessages.d.ts.map +1 -1
- package/backend/dist/utils/websocketMessages.js +8 -0
- package/backend/dist/utils/websocketMessages.js.map +1 -1
- package/backend/dist/utils/zipArchive.d.ts +32 -0
- package/backend/dist/utils/zipArchive.d.ts.map +1 -0
- package/backend/dist/utils/zipArchive.js +171 -0
- package/backend/dist/utils/zipArchive.js.map +1 -0
- package/backend/dist/websocketServer.d.ts.map +1 -1
- package/backend/dist/websocketServer.js +142 -35
- package/backend/dist/websocketServer.js.map +1 -1
- package/backend/package.json +1 -1
- package/frontend/dist/artifact-runtime/.build-fingerprint +1 -1
- package/frontend/dist/assets/index-DBAf_VaS.js +47 -0
- package/frontend/dist/assets/index-kn_Axjts.css +1 -0
- package/frontend/dist/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
- package/frontend/dist/fonts/jetbrains-mono-latin-700-normal.woff2 +0 -0
- package/frontend/dist/fonts/jetbrains-mono.css +24 -0
- package/frontend/dist/index.html +27 -20
- package/frontend/dist/js/ArtifactContainer-C9zNtCay.js +1 -0
- package/frontend/dist/js/{ArtifactDemoPage-BeNs3gHp.js → ArtifactDemoPage-C-EBFBCt.js} +1 -1
- package/frontend/dist/js/ArtifactSandboxFrame-CTA1j_d1.js +111 -0
- package/frontend/dist/js/ArtifactSlideOutPanel-BOENbOiv.js +1 -0
- package/frontend/dist/js/AutomationsPage-C58MQ4te.js +1 -0
- package/frontend/dist/js/{Button-BPf_pOxH.js → Button-C0r3J9G_.js} +1 -1
- package/frontend/dist/js/CalendarPage-BcdAZ292.js +1 -0
- package/frontend/dist/js/ChannelsPage-DPr9Yajs.js +1 -0
- package/frontend/dist/js/ChatPage-DsbB748s.js +14 -0
- package/frontend/dist/js/EvaluationsPage-FWIJu2fI.js +2 -0
- package/frontend/dist/js/FirstTimeSetup-Cy-w6xko.js +1 -0
- package/frontend/dist/js/GalleryPage-DDAtxM-x.js +1 -0
- package/frontend/dist/js/HomePage-DLKwmE7n.js +1 -0
- package/frontend/dist/js/LibreClawPage-vKOj-9w9.js +1 -0
- package/frontend/dist/js/{ModelManagerModals-DcLGYN3l.js → ModelManagerModals-BY5TK38_.js} +1 -1
- package/frontend/dist/js/ModelSelector-CoCS6MZ9.js +1 -0
- package/frontend/dist/js/NotesPage-BElIpXgA.js +3 -0
- package/frontend/dist/js/OptimizedSyntaxHighlighter-xgyE3dRA.js +1 -0
- package/frontend/dist/js/PersonasPage-P40jVbfU.js +13 -0
- package/frontend/dist/js/PluginUsagePage-CKUEPCJN.js +1 -0
- package/frontend/dist/js/RichMessageContent-Bm2WaEGi.js +3 -0
- package/frontend/dist/js/SettingsModal-DxSGzx9A.js +19 -0
- package/frontend/dist/js/{SettingsToggle-woG_WebF.js → SettingsToggle-BIVyfGjl.js} +1 -1
- package/frontend/dist/js/SystemPage-BT07dTMT.js +1 -0
- package/frontend/dist/js/UserManagementPage-B9Vz5cm3.js +1 -0
- package/frontend/dist/js/WorkPage-qoN_e_jK.js +6 -0
- package/frontend/dist/js/api-D7Ff5M2Q.js +14 -0
- package/frontend/dist/js/appStore-DmV5wqDz.js +2 -0
- package/frontend/dist/js/ar-YHHTVP8f.js +2 -0
- package/frontend/dist/js/artifactHtml-DDmfpcB0.js +41 -0
- package/frontend/dist/js/{authStore-DbMdvNgJ.js → authStore-BYW8-kP6.js} +3 -3
- package/frontend/dist/js/{babel-BsYoxD-7.js → babel-DSqqk5kt.js} +1 -1
- package/frontend/dist/js/bn-C8VTxBVl.js +2 -0
- package/frontend/dist/js/chatStore-D-NTlArO.js +3 -0
- package/frontend/dist/js/{config-DSOYQ9a3.js → config-BqZ5304Q.js} +1 -1
- package/frontend/dist/js/cs-CCngB5fC.js +2 -0
- package/frontend/dist/js/da-CM2PP2ma.js +2 -0
- package/frontend/dist/js/de-BqVkD-dw.js +2 -0
- package/frontend/dist/js/es-BtWsWBjZ.js +2 -0
- package/frontend/dist/js/{estree-BcnBcOAx.js → estree-DPkpBuOU.js} +3 -3
- package/frontend/dist/js/evaluationsApi-Dnf2dTd-.js +1 -0
- package/frontend/dist/js/fr-C68w9abT.js +2 -0
- package/frontend/dist/js/hi-DtBlcyXZ.js +2 -0
- package/frontend/dist/js/{html-DkY55Jys.js → html-BpGUXG8E.js} +2 -2
- package/frontend/dist/js/id-BWzIu8tn.js +2 -0
- package/frontend/dist/js/is-yeFwu4dJ.js +2 -0
- package/frontend/dist/js/it-AxEMG8Jg.js +2 -0
- package/frontend/dist/js/ja-B-VyokB8.js +2 -0
- package/frontend/dist/js/ko-CvwzYr9k.js +2 -0
- package/frontend/dist/js/{markdown-IZSI9DXw.js → markdown-DCBRWJSK.js} +3 -3
- package/frontend/dist/js/markdown-core-BK7WVOb7.js +32 -0
- package/frontend/dist/js/{markdown-math-DK846gXU.js → markdown-math-e1ByS3KY.js} +5 -5
- package/frontend/dist/js/messageCodeStyles-BQwf7sSz.js +2 -0
- package/frontend/dist/js/ms-BhEwb4b7.js +2 -0
- package/frontend/dist/js/nl-Dq-QRx1L.js +2 -0
- package/frontend/dist/js/pl-BNEy8mQm.js +2 -0
- package/frontend/dist/js/{postcss-BJ0okz7n.js → postcss-Bg15EcFE.js} +1 -1
- package/frontend/dist/js/pt-_3Jl3FdY.js +2 -0
- package/frontend/dist/js/{react-vendor-C5yShNlM.js → react-vendor-BG_HPV6X.js} +1 -1
- package/frontend/dist/js/router-vendor-CbexJIsv.js +1 -0
- package/frontend/dist/js/ru-IhQiJ8ta.js +2 -0
- package/frontend/dist/js/{standalone-Csw3jfJ_.js → standalone-BFrK0R2A.js} +3 -3
- package/frontend/dist/js/sv-DWunXUNz.js +2 -0
- package/frontend/dist/js/{syntax-highlight-3EEX6CGL.js → syntax-highlight-P2zo9o06.js} +4 -4
- package/frontend/dist/js/th-DVnW2yyh.js +2 -0
- package/frontend/dist/js/tr-Do8CFmhR.js +2 -0
- package/frontend/dist/js/{typescript-CnF4UVx7.js → typescript-DYVyvmm_.js} +1 -1
- package/frontend/dist/js/ui-db9meqAB.js +2 -0
- package/frontend/dist/js/ui-vendor-C0DZ8-Cm.js +177 -0
- package/frontend/dist/js/uk-BNPKIZga.js +2 -0
- package/frontend/dist/js/{useTranslation-Bho4HCyg.js → useTranslation-5b5UhAc9.js} +1 -1
- package/frontend/dist/js/{utils-D9W1Lnkn.js → utils-BGrdX9ie.js} +1 -1
- package/frontend/dist/js/{utils-vendor-DWh39_3x.js → utils-vendor-9bQ62WeD.js} +1 -1
- package/frontend/dist/js/vi-CZMFo9je.js +2 -0
- package/frontend/dist/js/{workApi-C3uy9EDT.js → workApi-CcprMH_1.js} +3 -3
- package/frontend/dist/js/{yaml-DzT5hBSH.js → yaml-DUeWcOOH.js} +2 -2
- package/frontend/dist/js/zh-Pg0881v0.js +2 -0
- package/frontend/dist/manifest.webmanifest +32 -0
- package/frontend/dist/sw.js +125 -0
- package/package.json +2 -2
- package/plugins/openai.json +52 -9
- package/frontend/dist/assets/index-6o-Hc2wS.js +0 -41
- package/frontend/dist/assets/index-D-pM957b.css +0 -1
- package/frontend/dist/js/ArtifactContainer-CpUi6ekF.js +0 -1
- package/frontend/dist/js/ArtifactSandboxFrame-qsj_Y3LV.js +0 -151
- package/frontend/dist/js/ArtifactSlideOutPanel-CSFRluWA.js +0 -1
- package/frontend/dist/js/AutomationsPage-KUeWoZNv.js +0 -1
- package/frontend/dist/js/CalendarPage-D9I972w8.js +0 -1
- package/frontend/dist/js/ChatPage-CmBx4oAL.js +0 -16
- package/frontend/dist/js/FirstTimeSetup-Df0YJni3.js +0 -1
- package/frontend/dist/js/GalleryPage-bLCrdJN_.js +0 -1
- package/frontend/dist/js/HomePage-Uc6PEg-U.js +0 -1
- package/frontend/dist/js/LibreClawPage-CG63DHg1.js +0 -1
- package/frontend/dist/js/ModelSelector-yxJC64rM.js +0 -1
- package/frontend/dist/js/ModelsPage-1R_TxgmJ.js +0 -2
- package/frontend/dist/js/NotesPage-L65j5HoW.js +0 -1
- package/frontend/dist/js/OptimizedSyntaxHighlighter-Dz7D1LPB.js +0 -1
- package/frontend/dist/js/PersonasPage-CKeBpHIH.js +0 -13
- package/frontend/dist/js/PluginUsagePage-BX1SKMbW.js +0 -1
- package/frontend/dist/js/RichMessageContent-DiySVYGB.js +0 -3
- package/frontend/dist/js/SettingsModal-68SG1uZ2.js +0 -1
- package/frontend/dist/js/SystemPage-CytpZiQV.js +0 -1
- package/frontend/dist/js/UserManagementPage-BzJBvZiS.js +0 -1
- package/frontend/dist/js/WorkPage-C8gr0QJe.js +0 -6
- package/frontend/dist/js/api-BDtqBtqw.js +0 -14
- package/frontend/dist/js/appStore-0JnCUlEq.js +0 -2
- package/frontend/dist/js/ar-CSpi37Gr.js +0 -2
- package/frontend/dist/js/bn-CyH1BeDD.js +0 -2
- package/frontend/dist/js/chatStore-CHQ2uINS.js +0 -3
- package/frontend/dist/js/cs-Cv2NfRK5.js +0 -2
- package/frontend/dist/js/da-D6D6IvPK.js +0 -2
- package/frontend/dist/js/de-BNoJJTrT.js +0 -2
- package/frontend/dist/js/es-kzo9C7q_.js +0 -2
- package/frontend/dist/js/fr-CjHYvJRp.js +0 -2
- package/frontend/dist/js/hi-BU98AdCQ.js +0 -2
- package/frontend/dist/js/id-CpdedejX.js +0 -2
- package/frontend/dist/js/is-Cp5dDWBH.js +0 -2
- package/frontend/dist/js/it-CuH_cK4U.js +0 -2
- package/frontend/dist/js/ja-BWXXXiHn.js +0 -2
- package/frontend/dist/js/ko-DQgv2M1t.js +0 -2
- package/frontend/dist/js/markdown-core-BmPPZiuD.js +0 -31
- package/frontend/dist/js/messageCodeStyles-BFNR9Wv6.js +0 -2
- package/frontend/dist/js/ms-DCcRoIcX.js +0 -2
- package/frontend/dist/js/nl-CbKR1_EU.js +0 -2
- package/frontend/dist/js/pl-CRyJZccn.js +0 -2
- package/frontend/dist/js/pt-BXYmHFGH.js +0 -2
- package/frontend/dist/js/router-vendor-DGFGM3EP.js +0 -1
- package/frontend/dist/js/ru-M9SyZG4b.js +0 -2
- package/frontend/dist/js/sv-DJ486LTU.js +0 -2
- package/frontend/dist/js/th-Ch7gKtZv.js +0 -2
- package/frontend/dist/js/tr-ClehWhSC.js +0 -2
- package/frontend/dist/js/ui-CC-K19wO.js +0 -2
- package/frontend/dist/js/ui-vendor-B1UgO3vd.js +0 -177
- package/frontend/dist/js/uk-BqAd5zHF.js +0 -2
- package/frontend/dist/js/vi-D9gjlDVB.js +0 -2
- package/frontend/dist/js/zh-DKTyHkiR.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documentService.d.ts","sourceRoot":"","sources":["../../src/services/documentService.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"documentService.d.ts","sourceRoot":"","sources":["../../src/services/documentService.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,10 @@ import crypto from 'node:crypto';
|
|
|
18
18
|
import { Readable } from 'node:stream';
|
|
19
19
|
import { v4 as uuidv4 } from 'uuid';
|
|
20
20
|
import storageService from '../storage.js';
|
|
21
|
+
import { getPersistence } from '../persistence/index.js';
|
|
22
|
+
import { encryptionService } from './encryptionService.js';
|
|
23
|
+
import { listGrantsForActor } from './resourceGrantService.js';
|
|
24
|
+
import { grantedResourceIdsFor, sharedMetaFor, } from './sharedResourceAccess.js';
|
|
21
25
|
import { configurePlatformStorageRuntime, getPlatformStorageRuntime, } from '../platform/storage/index.js';
|
|
22
26
|
import { MAX_VECTOR_RECORDS_PER_UPSERT, MAX_VECTOR_RESOURCE_INDEX_ENTRIES, } from '../platform/storage/vectorStore.js';
|
|
23
27
|
import { aggregateDocumentIndexRevision, createDocumentIndexMetadata, DOCUMENT_CHUNKER_VERSION, DOCUMENT_INDEX_METADATA_KEY, DOCUMENT_VECTOR_NAMESPACE, DOCUMENT_VECTOR_VERSION, documentChunkSourceRevision as sourceRevision, documentEmbeddingDimensions as embeddingDimensions, documentIndexMatchesSpec, embeddedDocumentChunks as embeddedChunks, readDocumentIndexMetadata as readDocumentIndexMetadataValue, } from '../platform/storage/documentVectorIndex.js';
|
|
@@ -29,6 +33,8 @@ import { transactionalResourceDeletionEnqueuer } from '../platform/jobs/resource
|
|
|
29
33
|
import preferencesService from './preferencesService.js';
|
|
30
34
|
import { createLogger } from '../utils/logger.js';
|
|
31
35
|
import { throwIfChatGenerationCancelled } from '../utils/chatCancellation.js';
|
|
36
|
+
import { reciprocalRankFusion, scoreCandidatesBm25, } from '../utils/hybridRetrieval.js';
|
|
37
|
+
import { DocumentExtractionError, detectImageMimeType, extractDocumentContentByType, extractPdfEmbeddedJpegs, readDocumentSegments, resolveDocumentFileType, resolveSegmentLabel, } from '../utils/documentExtraction.js';
|
|
32
38
|
const logger = createLogger('documents');
|
|
33
39
|
const DOCUMENT_BLOB_PURPOSE = 'document.source';
|
|
34
40
|
const DOCUMENT_POST_VECTOR_FAULT_MARKER = 'LIBRE_DOCUMENT_POST_VECTOR_KILL';
|
|
@@ -248,31 +254,62 @@ const getPdfjsLib = async () => {
|
|
|
248
254
|
}
|
|
249
255
|
return pdfjsLib;
|
|
250
256
|
};
|
|
251
|
-
|
|
257
|
+
/**
|
|
258
|
+
* Segment maps above this length would bloat the encrypted metadata column;
|
|
259
|
+
* a source under the extraction size cap never legitimately reaches it.
|
|
260
|
+
*/
|
|
261
|
+
const MAX_DOCUMENT_SEGMENTS = 5000;
|
|
262
|
+
const extractDocumentContent = async (fileName, fileBuffer, mimeType, signal, userId) => {
|
|
252
263
|
if (signal?.aborted)
|
|
253
264
|
throw signal.reason;
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
if (mimeType !== 'application/pdf') {
|
|
265
|
+
const fileType = resolveDocumentFileType(fileName, mimeType);
|
|
266
|
+
if (!fileType) {
|
|
258
267
|
throw new Error(`Unsupported file type: ${mimeType}`);
|
|
259
268
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
269
|
+
// Images and audio extract through model calls (vision OCR / provider
|
|
270
|
+
// STT), which need the owner's identity, providers, and permissions.
|
|
271
|
+
if (fileType === 'image' || fileType === 'audio') {
|
|
272
|
+
if (!userId) {
|
|
273
|
+
throw new DocumentExtractionError('Image and audio extraction require an owning user');
|
|
274
|
+
}
|
|
275
|
+
const media = await import('./documentMediaExtractionService.js');
|
|
276
|
+
if (fileType === 'image') {
|
|
277
|
+
const mime = detectImageMimeType(fileBuffer);
|
|
278
|
+
const extracted = await media.extractImagesToText([{ data: fileBuffer, mime, label: 'Image' }], userId, signal);
|
|
279
|
+
return { ...extracted, fileType };
|
|
280
|
+
}
|
|
281
|
+
const extracted = await media.extractAudioToText({ buffer: fileBuffer, mimetype: mimeType, originalname: fileName }, userId, signal);
|
|
282
|
+
return { ...extracted, fileType };
|
|
283
|
+
}
|
|
284
|
+
const extracted = await extractDocumentContentByType(fileBuffer, fileType, {
|
|
285
|
+
signal,
|
|
286
|
+
...(fileType === 'pdf' ? { pdfLib: await getPdfjsLib() } : {}),
|
|
287
|
+
});
|
|
288
|
+
// A PDF with no text layer is almost always a scan: recover the embedded
|
|
289
|
+
// JPEG page images and OCR them through the owner's vision model.
|
|
290
|
+
if (fileType === 'pdf' && !extracted.content.trim() && userId) {
|
|
291
|
+
const scans = extractPdfEmbeddedJpegs(fileBuffer);
|
|
292
|
+
if (scans.length > 0) {
|
|
293
|
+
const media = await import('./documentMediaExtractionService.js');
|
|
294
|
+
const ocr = await media.extractImagesToText(scans.map((data, index) => ({
|
|
295
|
+
data,
|
|
296
|
+
mime: 'image/jpeg',
|
|
297
|
+
label: `Page ${index + 1}`,
|
|
298
|
+
})), userId, signal);
|
|
299
|
+
return {
|
|
300
|
+
content: ocr.content,
|
|
301
|
+
fileType,
|
|
302
|
+
segments: ocr.segments.slice(0, MAX_DOCUMENT_SEGMENTS),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
273
305
|
}
|
|
274
|
-
return {
|
|
306
|
+
return {
|
|
307
|
+
content: extracted.content,
|
|
308
|
+
fileType,
|
|
309
|
+
segments: extracted.segments.slice(0, MAX_DOCUMENT_SEGMENTS),
|
|
310
|
+
};
|
|
275
311
|
};
|
|
312
|
+
const documentContentSha256 = (fileBuffer) => crypto.createHash('sha256').update(fileBuffer).digest('hex');
|
|
276
313
|
export class DocumentService {
|
|
277
314
|
async captureEmbeddingExecutionSpec(userId) {
|
|
278
315
|
const settings = (await preferencesService.getPreferences(userId))
|
|
@@ -333,23 +370,36 @@ export class DocumentService {
|
|
|
333
370
|
* if the SQL transaction cannot commit.
|
|
334
371
|
*/
|
|
335
372
|
async queueDocumentProcessing(fileName, fileBuffer, mimeType, userId, sessionId, signal) {
|
|
336
|
-
|
|
373
|
+
const resolvedType = resolveDocumentFileType(fileName, mimeType);
|
|
374
|
+
if (!resolvedType) {
|
|
337
375
|
throw new Error(`Unsupported file type: ${mimeType}`);
|
|
338
376
|
}
|
|
339
377
|
if (signal?.aborted)
|
|
340
378
|
throw signal.reason;
|
|
379
|
+
const contentSha256 = documentContentSha256(fileBuffer);
|
|
380
|
+
const duplicate = await this.findDuplicateDocument(userId, sessionId, contentSha256);
|
|
381
|
+
if (duplicate) {
|
|
382
|
+
const existingJob = await getDurableJobRuntime().service.getByIdempotency(userId, DOCUMENT_INGEST_IDEMPOTENCY_SCOPE, duplicate.id);
|
|
383
|
+
if (existingJob) {
|
|
384
|
+
return {
|
|
385
|
+
document: duplicate,
|
|
386
|
+
jobId: existingJob.id,
|
|
387
|
+
deduplicated: true,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
}
|
|
341
391
|
const documentId = uuidv4();
|
|
342
392
|
const now = Date.now();
|
|
343
393
|
const document = {
|
|
344
394
|
id: documentId,
|
|
345
395
|
filename: fileName,
|
|
346
396
|
content: '',
|
|
347
|
-
fileType:
|
|
397
|
+
fileType: resolvedType,
|
|
348
398
|
size: fileBuffer.length,
|
|
349
399
|
...(sessionId ? { sessionId } : {}),
|
|
350
400
|
uploadedAt: now,
|
|
351
401
|
createdAt: now,
|
|
352
|
-
metadata: { processingStatus: 'queued' },
|
|
402
|
+
metadata: { processingStatus: 'queued', contentSha256 },
|
|
353
403
|
};
|
|
354
404
|
const platform = getPlatformStorageRuntime();
|
|
355
405
|
const sourceBlob = await platform.blobStore.put({
|
|
@@ -417,7 +467,7 @@ export class DocumentService {
|
|
|
417
467
|
async processDocument(fileName, fileBuffer, mimeType, userId, sessionId) {
|
|
418
468
|
const documentId = uuidv4();
|
|
419
469
|
try {
|
|
420
|
-
const { content, fileType } = await extractDocumentContent(fileBuffer, mimeType);
|
|
470
|
+
const { content, fileType, segments } = await extractDocumentContent(fileName, fileBuffer, mimeType, undefined, userId);
|
|
421
471
|
let document = {
|
|
422
472
|
id: documentId,
|
|
423
473
|
filename: fileName,
|
|
@@ -426,6 +476,10 @@ export class DocumentService {
|
|
|
426
476
|
size: fileBuffer.length,
|
|
427
477
|
sessionId,
|
|
428
478
|
uploadedAt: Date.now(),
|
|
479
|
+
metadata: {
|
|
480
|
+
contentSha256: documentContentSha256(fileBuffer),
|
|
481
|
+
...(segments.length > 0 ? { segments } : {}),
|
|
482
|
+
},
|
|
429
483
|
};
|
|
430
484
|
const spec = await this.captureEmbeddingExecutionSpec(userId);
|
|
431
485
|
// Process the document into chunks under one immutable execution spec.
|
|
@@ -771,6 +825,27 @@ export class DocumentService {
|
|
|
771
825
|
return result;
|
|
772
826
|
}
|
|
773
827
|
/** Durable extraction/embedding handler entrypoint for an existing source. */
|
|
828
|
+
/**
|
|
829
|
+
* Record a terminal extraction failure on the document row so the owner
|
|
830
|
+
* can see why the upload never became searchable. Best effort: the
|
|
831
|
+
* durable job remains the operational record.
|
|
832
|
+
*/
|
|
833
|
+
async markProcessingFailed(documentId, userId, message) {
|
|
834
|
+
const current = await this.getDocument(documentId, userId);
|
|
835
|
+
if (!current)
|
|
836
|
+
return false;
|
|
837
|
+
const document = {
|
|
838
|
+
...current,
|
|
839
|
+
metadata: {
|
|
840
|
+
...(current.metadata ?? {}),
|
|
841
|
+
processingStatus: 'failed',
|
|
842
|
+
processingError: message.slice(0, 500),
|
|
843
|
+
processedAt: Date.now(),
|
|
844
|
+
},
|
|
845
|
+
};
|
|
846
|
+
await getPlatformStorageRuntime().domains.documents.upsert(document, userId);
|
|
847
|
+
return true;
|
|
848
|
+
}
|
|
774
849
|
async reprocessDocument(documentId, userId, signal, assertSideEffectAllowed, attemptCount = 1) {
|
|
775
850
|
const spec = await this.captureEmbeddingExecutionSpec(userId);
|
|
776
851
|
const current = await this.getDocument(documentId, userId);
|
|
@@ -791,7 +866,8 @@ export class DocumentService {
|
|
|
791
866
|
}
|
|
792
867
|
buffers.push(buffer);
|
|
793
868
|
}
|
|
794
|
-
const
|
|
869
|
+
const sourceBuffer = Buffer.concat(buffers, size);
|
|
870
|
+
const extracted = await extractDocumentContent(source.descriptor.originalFilename ?? current.filename, sourceBuffer, source.descriptor.contentType, signal, userId);
|
|
795
871
|
let document = {
|
|
796
872
|
...current,
|
|
797
873
|
content: extracted.content,
|
|
@@ -804,6 +880,10 @@ export class DocumentService {
|
|
|
804
880
|
...(document.metadata ?? {}),
|
|
805
881
|
processingStatus: 'completed',
|
|
806
882
|
processedAt: Date.now(),
|
|
883
|
+
contentSha256: documentContentSha256(sourceBuffer),
|
|
884
|
+
...(extracted.segments.length > 0
|
|
885
|
+
? { segments: extracted.segments }
|
|
886
|
+
: {}),
|
|
807
887
|
};
|
|
808
888
|
document = withDocumentIndexMetadata(document, embedded, spec);
|
|
809
889
|
await assertSideEffectAllowed?.();
|
|
@@ -837,6 +917,31 @@ export class DocumentService {
|
|
|
837
917
|
async getDocument(documentId, userId) {
|
|
838
918
|
return storageService.getDocument(documentId, userId);
|
|
839
919
|
}
|
|
920
|
+
/**
|
|
921
|
+
* Finds an existing live document with identical source bytes in the same
|
|
922
|
+
* scope (the same session, or both standing). Upload deduplication only —
|
|
923
|
+
* a match in another scope is not a duplicate because deleting one scope's
|
|
924
|
+
* copy must never remove another's.
|
|
925
|
+
*/
|
|
926
|
+
async findDuplicateDocument(userId, sessionId, contentSha256) {
|
|
927
|
+
const scope = sessionId ?? null;
|
|
928
|
+
const platform = getPlatformStorageRuntime();
|
|
929
|
+
const documents = await storageService.getAllDocuments(userId);
|
|
930
|
+
for (const candidate of documents) {
|
|
931
|
+
if ((candidate.sessionId ?? null) !== scope)
|
|
932
|
+
continue;
|
|
933
|
+
if (candidate.metadata?.contentSha256 !== contentSha256)
|
|
934
|
+
continue;
|
|
935
|
+
const reserved = await platform.domains.resourceDeletions.isReserved('document', candidate.id);
|
|
936
|
+
if (!reserved)
|
|
937
|
+
return candidate;
|
|
938
|
+
}
|
|
939
|
+
return undefined;
|
|
940
|
+
}
|
|
941
|
+
/** Documents in a chat's searchable scope: session uploads, selected collections, and standing uploads. */
|
|
942
|
+
async getDocumentsInScope(userId, sessionId, collectionIds) {
|
|
943
|
+
return (await storageService.getAllDocuments(userId)).filter(document => this.documentInScope(document, sessionId, collectionIds));
|
|
944
|
+
}
|
|
840
945
|
async getDocuments(userId, sessionId) {
|
|
841
946
|
const allDocs = await storageService.getAllDocuments(userId);
|
|
842
947
|
if (sessionId) {
|
|
@@ -892,6 +997,147 @@ export class DocumentService {
|
|
|
892
997
|
document.collectionId &&
|
|
893
998
|
collectionIds.includes(document.collectionId));
|
|
894
999
|
}
|
|
1000
|
+
/**
|
|
1001
|
+
* Principals that may retrieve this document's vectors: everyone granted
|
|
1002
|
+
* the document directly plus everyone granted its collection. Grants ride
|
|
1003
|
+
* the ACL table, so revocation applies on the very next query without
|
|
1004
|
+
* re-embedding anything.
|
|
1005
|
+
*/
|
|
1006
|
+
async vectorGrantsForDocument(document) {
|
|
1007
|
+
const security = getPersistence(encryptionService).repositories.security;
|
|
1008
|
+
const rows = [
|
|
1009
|
+
...(await security.grants.listForResource('document', document.id)),
|
|
1010
|
+
];
|
|
1011
|
+
if (document.collectionId) {
|
|
1012
|
+
rows.push(...(await security.grants.listForResource('knowledge-collection', document.collectionId)));
|
|
1013
|
+
}
|
|
1014
|
+
const unique = new Map();
|
|
1015
|
+
for (const row of rows) {
|
|
1016
|
+
if (row.principal_type !== 'user' && row.principal_type !== 'group') {
|
|
1017
|
+
continue;
|
|
1018
|
+
}
|
|
1019
|
+
unique.set(`${row.principal_type}${row.principal_id}`, {
|
|
1020
|
+
type: row.principal_type,
|
|
1021
|
+
id: row.principal_id,
|
|
1022
|
+
});
|
|
1023
|
+
}
|
|
1024
|
+
return [...unique.values()];
|
|
1025
|
+
}
|
|
1026
|
+
/**
|
|
1027
|
+
* Re-publishes the vector ACL for every document a share change affects.
|
|
1028
|
+
* Called after a grant on a document or knowledge collection is created
|
|
1029
|
+
* or revoked.
|
|
1030
|
+
*/
|
|
1031
|
+
async syncShareGrants(resourceType, resourceId, ownerUserId) {
|
|
1032
|
+
const platform = getPlatformStorageRuntime();
|
|
1033
|
+
const documents = resourceType === 'document'
|
|
1034
|
+
? await storageService
|
|
1035
|
+
.getDocument(resourceId, ownerUserId)
|
|
1036
|
+
.then(document => (document ? [document] : []))
|
|
1037
|
+
: (await storageService.getAllDocuments(ownerUserId)).filter(document => document.collectionId === resourceId);
|
|
1038
|
+
for (const document of documents) {
|
|
1039
|
+
const grants = await this.vectorGrantsForDocument(document);
|
|
1040
|
+
await platform.vectorStore.replaceResourceGrants({
|
|
1041
|
+
actor: { userId: ownerUserId },
|
|
1042
|
+
namespace: DOCUMENT_VECTOR_NAMESPACE,
|
|
1043
|
+
resourceIds: [document.id],
|
|
1044
|
+
grants,
|
|
1045
|
+
});
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* Documents living in knowledge collections shared with the actor. The
|
|
1050
|
+
* grant rows themselves are the authorization: they are resolved fresh
|
|
1051
|
+
* (including group membership) on every call.
|
|
1052
|
+
*/
|
|
1053
|
+
async loadSharedScopeDocuments(userId, collectionIds) {
|
|
1054
|
+
const grants = await listGrantsForActor({ userId });
|
|
1055
|
+
const shared = [];
|
|
1056
|
+
const seenCollections = new Set();
|
|
1057
|
+
const seenDocuments = new Set();
|
|
1058
|
+
for (const grant of grants) {
|
|
1059
|
+
if (grant.resource_type !== 'knowledge-collection')
|
|
1060
|
+
continue;
|
|
1061
|
+
const collectionId = grant.resource_id;
|
|
1062
|
+
if (seenCollections.has(collectionId))
|
|
1063
|
+
continue;
|
|
1064
|
+
seenCollections.add(collectionId);
|
|
1065
|
+
if (grant.owner_user_id === userId)
|
|
1066
|
+
continue;
|
|
1067
|
+
if (collectionIds &&
|
|
1068
|
+
collectionIds.length > 0 &&
|
|
1069
|
+
!collectionIds.includes(collectionId)) {
|
|
1070
|
+
continue;
|
|
1071
|
+
}
|
|
1072
|
+
const documents = (await storageService.getAllDocuments(grant.owner_user_id)).filter(document => document.collectionId === collectionId);
|
|
1073
|
+
for (const document of documents) {
|
|
1074
|
+
if (seenDocuments.has(document.id))
|
|
1075
|
+
continue;
|
|
1076
|
+
seenDocuments.add(document.id);
|
|
1077
|
+
shared.push({ document, ownerUserId: grant.owner_user_id });
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
return shared;
|
|
1081
|
+
}
|
|
1082
|
+
/**
|
|
1083
|
+
* Loads a document the actor may read: their own, or one reachable
|
|
1084
|
+
* through a document or collection grant. Shared results are read-only.
|
|
1085
|
+
*/
|
|
1086
|
+
async getDocumentShared(documentId, actor) {
|
|
1087
|
+
const own = await storageService.getDocument(documentId, actor.userId);
|
|
1088
|
+
if (own)
|
|
1089
|
+
return { document: own, ownerUserId: actor.userId };
|
|
1090
|
+
const ownerUserId = await getPersistence(encryptionService).repositories.resources.archive.ownerOf('document', documentId);
|
|
1091
|
+
if (!ownerUserId || ownerUserId === actor.userId)
|
|
1092
|
+
return undefined;
|
|
1093
|
+
const document = await storageService.getDocument(documentId, ownerUserId);
|
|
1094
|
+
if (!document)
|
|
1095
|
+
return undefined;
|
|
1096
|
+
let shared = await sharedMetaFor(actor, 'document', documentId, ownerUserId);
|
|
1097
|
+
if (!shared && document.collectionId) {
|
|
1098
|
+
shared = await sharedMetaFor(actor, 'knowledge-collection', document.collectionId, ownerUserId);
|
|
1099
|
+
}
|
|
1100
|
+
if (!shared)
|
|
1101
|
+
return undefined;
|
|
1102
|
+
return { document, ownerUserId, shared };
|
|
1103
|
+
}
|
|
1104
|
+
/** Documents shared with the actor through collection grants. */
|
|
1105
|
+
async listSharedDocuments(actor) {
|
|
1106
|
+
const entries = await this.loadSharedScopeDocuments(actor.userId);
|
|
1107
|
+
const result = [];
|
|
1108
|
+
for (const { document, ownerUserId } of entries) {
|
|
1109
|
+
if (!document.collectionId)
|
|
1110
|
+
continue;
|
|
1111
|
+
const meta = await sharedMetaFor(actor, 'knowledge-collection', document.collectionId, ownerUserId);
|
|
1112
|
+
if (meta)
|
|
1113
|
+
result.push({ document, shared: meta });
|
|
1114
|
+
}
|
|
1115
|
+
return result;
|
|
1116
|
+
}
|
|
1117
|
+
/**
|
|
1118
|
+
* The actor's own collections followed by collections shared with them.
|
|
1119
|
+
*/
|
|
1120
|
+
async listCollectionsWithShared(actor) {
|
|
1121
|
+
const own = await storageService.getKnowledgeCollections(actor.userId);
|
|
1122
|
+
const sharedIds = await grantedResourceIdsFor(actor, 'knowledge-collection', new Set(own.map(collection => collection.id)));
|
|
1123
|
+
const shared = [];
|
|
1124
|
+
for (const collectionId of sharedIds) {
|
|
1125
|
+
const collection = await storageService.getKnowledgeCollectionById(collectionId);
|
|
1126
|
+
if (!collection || collection.ownerUserId === actor.userId)
|
|
1127
|
+
continue;
|
|
1128
|
+
const meta = await sharedMetaFor(actor, 'knowledge-collection', collectionId, collection.ownerUserId);
|
|
1129
|
+
if (!meta)
|
|
1130
|
+
continue;
|
|
1131
|
+
shared.push({
|
|
1132
|
+
id: collection.id,
|
|
1133
|
+
name: collection.name,
|
|
1134
|
+
createdAt: collection.createdAt,
|
|
1135
|
+
updatedAt: collection.updatedAt,
|
|
1136
|
+
shared: meta,
|
|
1137
|
+
});
|
|
1138
|
+
}
|
|
1139
|
+
return [...own, ...shared];
|
|
1140
|
+
}
|
|
895
1141
|
async indexDocumentChunks(document, chunks, userId, spec, attemptCount = 1, signal, assertSideEffectAllowed) {
|
|
896
1142
|
const executionSpec = spec ?? (await this.captureEmbeddingExecutionSpec(userId));
|
|
897
1143
|
const embedded = embeddedChunks(chunks);
|
|
@@ -924,6 +1170,7 @@ export class DocumentService {
|
|
|
924
1170
|
mutated = true;
|
|
925
1171
|
await assertSideEffectAllowed?.();
|
|
926
1172
|
await this.assertDocumentIndexAuthoritative(document.id, userId, expectedRevision, expectedSource);
|
|
1173
|
+
const shareGrants = await this.vectorGrantsForDocument(document);
|
|
927
1174
|
for (let offset = 0; offset < embedded.length; offset += MAX_VECTOR_RECORDS_PER_UPSERT) {
|
|
928
1175
|
await assertSideEffectAllowed?.();
|
|
929
1176
|
await this.assertDocumentIndexAuthoritative(document.id, userId, expectedRevision, expectedSource);
|
|
@@ -947,6 +1194,7 @@ export class DocumentService {
|
|
|
947
1194
|
? { collectionId: document.collectionId }
|
|
948
1195
|
: {}),
|
|
949
1196
|
},
|
|
1197
|
+
...(shareGrants.length > 0 ? { grants: shareGrants } : {}),
|
|
950
1198
|
})),
|
|
951
1199
|
});
|
|
952
1200
|
await assertSideEffectAllowed?.();
|
|
@@ -992,9 +1240,19 @@ export class DocumentService {
|
|
|
992
1240
|
return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds, signal);
|
|
993
1241
|
}
|
|
994
1242
|
const documents = (await storageService.getAllDocuments(userId)).filter(document => this.documentInScope(document, sessionId, collectionIds));
|
|
1243
|
+
// Shared-collection documents join the corpus read-only: their chunks
|
|
1244
|
+
// feed the lexical ranking directly, and their vector hits pass the
|
|
1245
|
+
// store's ACL predicate through the grants published at share time.
|
|
1246
|
+
const sharedDocuments = await this.loadSharedScopeDocuments(userId, collectionIds);
|
|
995
1247
|
const platform = getPlatformStorageRuntime();
|
|
996
1248
|
const chunksById = new Map();
|
|
997
|
-
const
|
|
1249
|
+
for (const { document } of sharedDocuments) {
|
|
1250
|
+
throwIfChatGenerationCancelled(signal);
|
|
1251
|
+
const documentChunks = await this.loadDocumentChunks(document.id);
|
|
1252
|
+
for (const chunk of documentChunks) {
|
|
1253
|
+
chunksById.set(chunk.id, { chunk, document });
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
998
1256
|
for (const document of documents) {
|
|
999
1257
|
throwIfChatGenerationCancelled(signal);
|
|
1000
1258
|
let searchableDocument = document;
|
|
@@ -1026,7 +1284,6 @@ export class DocumentService {
|
|
|
1026
1284
|
// and deletion cleanup through the shared document resource lease.
|
|
1027
1285
|
// PostgreSQL/team reads never mutate PGVector.
|
|
1028
1286
|
const publishedIndex = readDocumentIndexMetadata(searchableDocument);
|
|
1029
|
-
const canProveCurrentEmbeddingModel = documentIndexMatchesSpec(publishedIndex, executionSpec);
|
|
1030
1287
|
const localIndexProbe = platform.dialect === 'sqlite'
|
|
1031
1288
|
? exactLocalDocumentIndexProbe(searchableDocument, documentChunks, userId, executionSpec)
|
|
1032
1289
|
: undefined;
|
|
@@ -1069,24 +1326,20 @@ export class DocumentService {
|
|
|
1069
1326
|
for (const chunk of documentChunks) {
|
|
1070
1327
|
// PostgreSQL deliberately keeps embeddings only in PGVector, so a
|
|
1071
1328
|
// relational chunk without an `embedding` property can still be the
|
|
1072
|
-
// authoritative content for a vector hit.
|
|
1073
|
-
//
|
|
1074
|
-
//
|
|
1075
|
-
//
|
|
1329
|
+
// authoritative content for a vector hit. Every current relational
|
|
1330
|
+
// chunk joins the candidate set: vector hits hydrate from it and
|
|
1331
|
+
// the BM25 side of the hybrid ranking scores it, so chunks without
|
|
1332
|
+
// a current embedding stay reachable.
|
|
1076
1333
|
chunksById.set(chunk.id, {
|
|
1077
1334
|
chunk,
|
|
1078
1335
|
document: searchableDocument,
|
|
1079
1336
|
});
|
|
1080
|
-
const indexedForSemanticQuery = canProveCurrentEmbeddingModel &&
|
|
1081
|
-
publishedIndex !== undefined &&
|
|
1082
|
-
publishedIndex.dimensions !== null &&
|
|
1083
|
-
(platform.dialect === 'postgres' || localIndexReady);
|
|
1084
|
-
if (!indexedForSemanticQuery) {
|
|
1085
|
-
unembedded.push({ chunk, document: searchableDocument });
|
|
1086
|
-
}
|
|
1087
1337
|
}
|
|
1088
1338
|
}
|
|
1089
|
-
const resourceIds =
|
|
1339
|
+
const resourceIds = [
|
|
1340
|
+
...documents.map(document => document.id),
|
|
1341
|
+
...sharedDocuments.map(entry => entry.document.id),
|
|
1342
|
+
];
|
|
1090
1343
|
const hits = [];
|
|
1091
1344
|
for (let offset = 0; offset < resourceIds.length; offset += MAX_VECTOR_RESOURCE_FILTERS) {
|
|
1092
1345
|
throwIfChatGenerationCancelled(signal);
|
|
@@ -1106,37 +1359,39 @@ export class DocumentService {
|
|
|
1106
1359
|
hits.sort((left, right) => right.score - left.score ||
|
|
1107
1360
|
left.ownerUserId.localeCompare(right.ownerUserId) ||
|
|
1108
1361
|
left.id.localeCompare(right.id));
|
|
1109
|
-
|
|
1110
|
-
|
|
1362
|
+
// Hybrid assembly: fuse the vector ranking with an in-process BM25
|
|
1363
|
+
// ranking over every in-scope chunk. The lexical side keeps chunks
|
|
1364
|
+
// without current embeddings reachable and lets an exact term match
|
|
1365
|
+
// outrank a semantically weak neighbor; fusion means neither ranking
|
|
1366
|
+
// silently dominates the other.
|
|
1367
|
+
const semanticRanked = [];
|
|
1368
|
+
const semanticScores = new Map();
|
|
1111
1369
|
for (const hit of hits) {
|
|
1112
|
-
if (top.length >= limit)
|
|
1113
|
-
break;
|
|
1114
1370
|
const match = chunksById.get(hit.id);
|
|
1115
1371
|
if (!match ||
|
|
1116
1372
|
match.document.id !== hit.resourceId ||
|
|
1117
1373
|
sourceRevision(match.chunk) !== hit.sourceRevision ||
|
|
1118
|
-
|
|
1374
|
+
semanticScores.has(match.chunk.id)) {
|
|
1119
1375
|
continue;
|
|
1120
1376
|
}
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
filename: match.document.filename,
|
|
1124
|
-
});
|
|
1125
|
-
selectedChunkIds.add(match.chunk.id);
|
|
1377
|
+
semanticRanked.push(match.chunk.id);
|
|
1378
|
+
semanticScores.set(match.chunk.id, hit.score);
|
|
1126
1379
|
}
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1380
|
+
const lexicalScored = this.scoreChunksByKeywords(query, [
|
|
1381
|
+
...chunksById.values(),
|
|
1382
|
+
]);
|
|
1383
|
+
const fused = reciprocalRankFusion([
|
|
1384
|
+
semanticRanked,
|
|
1385
|
+
lexicalScored.map(entry => entry.chunk.id),
|
|
1386
|
+
]);
|
|
1387
|
+
const top = [];
|
|
1388
|
+
for (const { id, score } of fused) {
|
|
1389
|
+
if (top.length >= limit)
|
|
1390
|
+
break;
|
|
1391
|
+
const match = chunksById.get(id);
|
|
1392
|
+
if (!match)
|
|
1393
|
+
continue;
|
|
1394
|
+
top.push(this.hydrateRetrievedChunk(match.chunk, match.document, score));
|
|
1140
1395
|
}
|
|
1141
1396
|
if (top.length > 0)
|
|
1142
1397
|
return top;
|
|
@@ -1151,25 +1406,13 @@ export class DocumentService {
|
|
|
1151
1406
|
return this.keywordSearchDocuments(query, userId, sessionId, limit, collectionIds, signal);
|
|
1152
1407
|
}
|
|
1153
1408
|
}
|
|
1154
|
-
/**
|
|
1409
|
+
/** BM25 scores for a set of chunks, best first. */
|
|
1155
1410
|
scoreChunksByKeywords(query, entries) {
|
|
1156
|
-
const
|
|
1157
|
-
|
|
1158
|
-
.
|
|
1159
|
-
.
|
|
1160
|
-
|
|
1161
|
-
for (const { chunk, document } of entries) {
|
|
1162
|
-
const chunkText = chunk.content.toLowerCase();
|
|
1163
|
-
let score = 0;
|
|
1164
|
-
for (const term of searchTerms) {
|
|
1165
|
-
// Escape special regex characters to prevent injection
|
|
1166
|
-
const escapedTerm = term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
1167
|
-
score += (chunkText.match(new RegExp(escapedTerm, 'gi')) || []).length;
|
|
1168
|
-
}
|
|
1169
|
-
if (score > 0)
|
|
1170
|
-
scored.push({ chunk, score, document });
|
|
1171
|
-
}
|
|
1172
|
-
return scored.sort((a, b) => b.score - a.score);
|
|
1411
|
+
const byId = new Map(entries.map(entry => [entry.chunk.id, entry]));
|
|
1412
|
+
return scoreCandidatesBm25(query, entries.map(entry => ({ id: entry.chunk.id, text: entry.chunk.content })), { requireQueryWordMatch: true }).map(({ id, score }) => {
|
|
1413
|
+
const entry = byId.get(id);
|
|
1414
|
+
return { chunk: entry.chunk, score, document: entry.document };
|
|
1415
|
+
});
|
|
1173
1416
|
}
|
|
1174
1417
|
async keywordSearchDocuments(query, userId, sessionId, limit = 5, collectionIds, signal) {
|
|
1175
1418
|
const candidates = [];
|
|
@@ -1184,12 +1427,28 @@ export class DocumentService {
|
|
|
1184
1427
|
candidates.push({ chunk, document });
|
|
1185
1428
|
}
|
|
1186
1429
|
}
|
|
1430
|
+
for (const { document } of await this.loadSharedScopeDocuments(userId, collectionIds)) {
|
|
1431
|
+
throwIfChatGenerationCancelled(signal);
|
|
1432
|
+
const documentChunks = await this.loadDocumentChunks(document.id);
|
|
1433
|
+
for (const chunk of documentChunks) {
|
|
1434
|
+
candidates.push({ chunk, document });
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1187
1437
|
throwIfChatGenerationCancelled(signal);
|
|
1188
1438
|
const results = this.scoreChunksByKeywords(query, candidates);
|
|
1189
|
-
return results
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1439
|
+
return results
|
|
1440
|
+
.slice(0, limit)
|
|
1441
|
+
.map(result => this.hydrateRetrievedChunk(result.chunk, result.document, result.score));
|
|
1442
|
+
}
|
|
1443
|
+
/** Attaches filename, score, and source location to a retrieval result. */
|
|
1444
|
+
hydrateRetrievedChunk(chunk, document, score) {
|
|
1445
|
+
const location = resolveSegmentLabel(readDocumentSegments(document.metadata), chunk.startChar, chunk.endChar);
|
|
1446
|
+
return {
|
|
1447
|
+
...chunk,
|
|
1448
|
+
filename: document.filename,
|
|
1449
|
+
...(score !== undefined ? { score } : {}),
|
|
1450
|
+
...(location ? { location } : {}),
|
|
1451
|
+
};
|
|
1193
1452
|
}
|
|
1194
1453
|
// Get relevant context for RAG
|
|
1195
1454
|
async getRelevantContext(query, userId, sessionId) {
|