libre-webui 0.24.1 → 0.26.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 +36 -15
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +35 -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/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/postgresPersonalAutomationsMigration.d.ts +8 -0
- package/backend/dist/persistence/postgresPersonalAutomationsMigration.d.ts.map +1 -0
- package/backend/dist/persistence/postgresPersonalAutomationsMigration.js +98 -0
- package/backend/dist/persistence/postgresPersonalAutomationsMigration.js.map +1 -0
- package/backend/dist/persistence/postgresResourceRepositories.d.ts.map +1 -1
- package/backend/dist/persistence/postgresResourceRepositories.js +1972 -63
- package/backend/dist/persistence/postgresResourceRepositories.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 +622 -3
- package/backend/dist/persistence/resourceTypes.d.ts.map +1 -1
- package/backend/dist/persistence/resourceTypes.js.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 +1396 -48
- 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 +1680 -58
- package/backend/dist/persistence/sqliteResourceRepositories.js.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.d.ts.map +1 -1
- package/backend/dist/persistence/sqliteToPostgresMigration.js +297 -2
- package/backend/dist/persistence/sqliteToPostgresMigration.js.map +1 -1
- package/backend/dist/platform/jobs/domainJobContracts.d.ts +11 -0
- package/backend/dist/platform/jobs/domainJobContracts.d.ts.map +1 -1
- package/backend/dist/platform/jobs/domainJobContracts.js +11 -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 +409 -2
- 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/automations.d.ts +3 -0
- package/backend/dist/routes/automations.d.ts.map +1 -0
- package/backend/dist/routes/automations.js +232 -0
- package/backend/dist/routes/automations.js.map +1 -0
- package/backend/dist/routes/calendar.d.ts +3 -0
- package/backend/dist/routes/calendar.d.ts.map +1 -0
- package/backend/dist/routes/calendar.js +309 -0
- package/backend/dist/routes/calendar.js.map +1 -0
- 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 +237 -10
- 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 +64 -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/ollama.d.ts.map +1 -1
- package/backend/dist/routes/ollama.js +4 -1
- package/backend/dist/routes/ollama.js.map +1 -1
- 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/search.d.ts.map +1 -1
- package/backend/dist/routes/search.js +34 -4
- 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/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/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 +28 -0
- package/backend/dist/services/automationSchedulerService.d.ts.map +1 -0
- package/backend/dist/services/automationSchedulerService.js +221 -0
- package/backend/dist/services/automationSchedulerService.js.map +1 -0
- package/backend/dist/services/automationService.d.ts +56 -0
- package/backend/dist/services/automationService.d.ts.map +1 -0
- package/backend/dist/services/automationService.js +247 -0
- package/backend/dist/services/automationService.js.map +1 -0
- 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/chatGenerationService.d.ts.map +1 -1
- package/backend/dist/services/chatGenerationService.js +7 -1
- package/backend/dist/services/chatGenerationService.js.map +1 -1
- 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 +62 -1
- package/backend/dist/services/chatService.d.ts.map +1 -1
- package/backend/dist/services/chatService.js +242 -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 +23 -4
- package/backend/dist/services/dataArchiveService.js.map +1 -1
- package/backend/dist/services/documentService.d.ts +58 -1
- package/backend/dist/services/documentService.d.ts.map +1 -1
- package/backend/dist/services/documentService.js +289 -84
- 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 +160 -13
- package/backend/dist/services/durableChatGenerationService.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/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 +55 -0
- package/backend/dist/services/notificationService.d.ts.map +1 -0
- package/backend/dist/services/notificationService.js +308 -0
- package/backend/dist/services/notificationService.js.map +1 -0
- package/backend/dist/services/ollamaService.d.ts.map +1 -1
- package/backend/dist/services/ollamaService.js +3 -1
- package/backend/dist/services/ollamaService.js.map +1 -1
- 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/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/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/titleGenerationService.d.ts.map +1 -1
- package/backend/dist/services/titleGenerationService.js +5 -1
- package/backend/dist/services/titleGenerationService.js.map +1 -1
- 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/webSearchPlanService.d.ts +18 -0
- package/backend/dist/services/webSearchPlanService.d.ts.map +1 -0
- package/backend/dist/services/webSearchPlanService.js +160 -0
- package/backend/dist/services/webSearchPlanService.js.map +1 -0
- package/backend/dist/services/webSearchService.d.ts +9 -3
- package/backend/dist/services/webSearchService.d.ts.map +1 -1
- package/backend/dist/services/webSearchService.js +8 -2
- package/backend/dist/services/webSearchService.js.map +1 -1
- package/backend/dist/storage.d.ts +34 -1
- package/backend/dist/storage.d.ts.map +1 -1
- package/backend/dist/storage.js +164 -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 +269 -2
- 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/automationSchedule.d.ts +26 -0
- package/backend/dist/utils/automationSchedule.d.ts.map +1 -0
- package/backend/dist/utils/automationSchedule.js +231 -0
- package/backend/dist/utils/automationSchedule.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 +69 -0
- package/backend/dist/utils/documentExtraction.d.ts.map +1 -0
- package/backend/dist/utils/documentExtraction.js +545 -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 +68 -2
- package/backend/dist/utils/resourceLimits.d.ts.map +1 -1
- package/backend/dist/utils/resourceLimits.js +66 -0
- package/backend/dist/utils/resourceLimits.js.map +1 -1
- package/backend/dist/utils/toolEgress.d.ts +22 -0
- package/backend/dist/utils/toolEgress.d.ts.map +1 -0
- package/backend/dist/utils/toolEgress.js +157 -0
- package/backend/dist/utils/toolEgress.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 +150 -37
- 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-BPsH9FII.js +80 -0
- package/frontend/dist/assets/index-BtXF0Oxa.css +1 -0
- package/frontend/dist/index.html +18 -18
- package/frontend/dist/js/{ArtifactContainer-B-hs0F5K.js → ArtifactContainer-CIoFoMv8.js} +1 -1
- package/frontend/dist/js/{ArtifactDemoPage-QFtJw-u4.js → ArtifactDemoPage-D0JEIAbZ.js} +1 -1
- package/frontend/dist/js/{ArtifactSandboxFrame-S9g_q47-.js → ArtifactSandboxFrame-REazyIrx.js} +2 -2
- package/frontend/dist/js/ArtifactSlideOutPanel-A-i94ghF.js +1 -0
- package/frontend/dist/js/AutomationsPage-Dow_lbIf.js +1 -0
- package/frontend/dist/js/{Button-BPf_pOxH.js → Button-C0r3J9G_.js} +1 -1
- package/frontend/dist/js/CalendarPage-DLjasZOd.js +1 -0
- package/frontend/dist/js/ChannelsPage-C8hvTD7J.js +1 -0
- package/frontend/dist/js/ChatPage-BAgBHUES.js +16 -0
- package/frontend/dist/js/EvaluationsPage-Bm8FRoeX.js +2 -0
- package/frontend/dist/js/FirstTimeSetup-BxJapNul.js +1 -0
- package/frontend/dist/js/GalleryPage-DHz9DkK7.js +1 -0
- package/frontend/dist/js/HomePage-BqNy-FWX.js +1 -0
- package/frontend/dist/js/LibreClawPage-BDzDILjY.js +1 -0
- package/frontend/dist/js/{ModelManagerModals-DBmm_slu.js → ModelManagerModals-DX9eT5r2.js} +1 -1
- package/frontend/dist/js/ModelSelector-ol8mK2ja.js +1 -0
- package/frontend/dist/js/NotesPage-DzHEx2O4.js +3 -0
- package/frontend/dist/js/{OptimizedSyntaxHighlighter-Dz7D1LPB.js → OptimizedSyntaxHighlighter-CZNPwN0i.js} +1 -1
- package/frontend/dist/js/PersonasPage-M_WKH2a9.js +13 -0
- package/frontend/dist/js/PluginUsagePage-Ctoka6JZ.js +1 -0
- package/frontend/dist/js/RichMessageContent-BqgafH4p.js +3 -0
- package/frontend/dist/js/SettingsModal-R9EDadAV.js +19 -0
- package/frontend/dist/js/{SettingsToggle-woG_WebF.js → SettingsToggle-BIVyfGjl.js} +1 -1
- package/frontend/dist/js/{SystemPage-Xr7XJv8c.js → SystemPage-aOkrSuY7.js} +1 -1
- package/frontend/dist/js/UserManagementPage-BOuaX3ay.js +1 -0
- package/frontend/dist/js/WorkPage-DxZISerQ.js +6 -0
- package/frontend/dist/js/api-6bSMtSNh.js +14 -0
- package/frontend/dist/js/{appStore-DXlmTjIC.js → appStore-CdObhQBb.js} +2 -2
- package/frontend/dist/js/ar-DT_VLBO3.js +2 -0
- package/frontend/dist/js/{authStore-B97lJ5Ee.js → authStore-DbqqrfZv.js} +3 -3
- package/frontend/dist/js/{babel-D24oDI9y.js → babel-DSqqk5kt.js} +1 -1
- package/frontend/dist/js/bn-BrvEqhGA.js +2 -0
- package/frontend/dist/js/calendarDates-Co3o_05Y.js +1 -0
- package/frontend/dist/js/chatStore-DbZPJNsu.js +3 -0
- package/frontend/dist/js/{config-CmEh9o8U.js → config-8KdgjtEx.js} +1 -1
- package/frontend/dist/js/cs-BthnM_YI.js +2 -0
- package/frontend/dist/js/da-DCth-6_j.js +2 -0
- package/frontend/dist/js/de-BBWt0gJ_.js +2 -0
- package/frontend/dist/js/es-DuslOPqM.js +2 -0
- package/frontend/dist/js/{estree-CZO8RS52.js → estree-BU5-LV_1.js} +7 -7
- package/frontend/dist/js/evaluationsApi-CwZJsgeG.js +1 -0
- package/frontend/dist/js/fr-DZAeg46S.js +2 -0
- package/frontend/dist/js/hi-ijDSiY77.js +2 -0
- package/frontend/dist/js/{html-C31pxhBG.js → html-DeoAy2bo.js} +10 -10
- package/frontend/dist/js/id-BS6qS0oq.js +2 -0
- package/frontend/dist/js/is-CO2PMDte.js +2 -0
- package/frontend/dist/js/it-ChhxT4hs.js +2 -0
- package/frontend/dist/js/ja-cyeqUeJN.js +2 -0
- package/frontend/dist/js/ko-CfqHTLXj.js +2 -0
- package/frontend/dist/js/{markdown-C1CEqXpL.js → markdown-DOLsYkBY.js} +6 -6
- 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-BqQ6kOSU.js → messageCodeStyles-DhVgizF-.js} +2 -2
- package/frontend/dist/js/ms-DZ5pACe1.js +2 -0
- package/frontend/dist/js/nl-BsRsnOVp.js +2 -0
- package/frontend/dist/js/pl-DXSTAW4M.js +2 -0
- package/frontend/dist/js/{postcss-Bx9CTcIc.js → postcss-Bg15EcFE.js} +1 -1
- package/frontend/dist/js/pt-DmDx0JxB.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-d2g8EWfY.js +2 -0
- package/frontend/dist/js/{standalone-Dz0pkxn0.js → standalone-BO5pzI8_.js} +5 -5
- package/frontend/dist/js/sv-CIhYUTVQ.js +2 -0
- package/frontend/dist/js/{syntax-highlight-3EEX6CGL.js → syntax-highlight-DcR9Vhb7.js} +3 -3
- package/frontend/dist/js/th-B3wSxanB.js +2 -0
- package/frontend/dist/js/tr-R4UGgPOY.js +2 -0
- package/frontend/dist/js/{typescript-DeXPhp90.js → typescript-6GJ8APmn.js} +2 -2
- package/frontend/dist/js/ui-CV0LYmkM.js +2 -0
- package/frontend/dist/js/ui-vendor-CWjIBW-z.js +177 -0
- package/frontend/dist/js/uk-BzUF4Vkt.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-CKc6Fg4h.js +2 -0
- package/frontend/dist/js/{workApi-C4QtuhcE.js → workApi-BruWTlHM.js} +2 -2
- package/frontend/dist/js/{yaml-DioTxVLA.js → yaml-DUeWcOOH.js} +5 -5
- package/frontend/dist/js/zh-CXL-kDe8.js +2 -0
- package/package.json +2 -2
- package/plugins/openai.json +52 -9
- package/frontend/dist/assets/index-CDQ12KBq.js +0 -34
- package/frontend/dist/assets/index-DkFWzmFD.css +0 -1
- package/frontend/dist/js/ArtifactSlideOutPanel-D0UOo8RW.js +0 -1
- package/frontend/dist/js/ChatPage-fdd8500b.js +0 -23
- package/frontend/dist/js/FirstTimeSetup-BTjafGOq.js +0 -1
- package/frontend/dist/js/GalleryPage-hR9AJ6b-.js +0 -1
- package/frontend/dist/js/HomePage-JvTzq-Pp.js +0 -1
- package/frontend/dist/js/LibreClawPage-CLJvtXft.js +0 -1
- package/frontend/dist/js/ModelSelector-A-viVFEc.js +0 -1
- package/frontend/dist/js/ModelsPage-C4Rm-TZF.js +0 -2
- package/frontend/dist/js/NotesPage-C7bPU_KF.js +0 -1
- package/frontend/dist/js/PersonasPage-DpvxbFzv.js +0 -13
- package/frontend/dist/js/PluginUsagePage-laF-M2X9.js +0 -1
- package/frontend/dist/js/RichMessageContent-D0mK9vRA.js +0 -3
- package/frontend/dist/js/SettingsModal-DNEQ5sTt.js +0 -1
- package/frontend/dist/js/UserManagementPage-DGmbGTC2.js +0 -1
- package/frontend/dist/js/WorkPage-DNKFD9gS.js +0 -6
- package/frontend/dist/js/api-DGVZHSkS.js +0 -14
- package/frontend/dist/js/ar-DW79oSyN.js +0 -2
- package/frontend/dist/js/bn-BEAmE7VH.js +0 -2
- package/frontend/dist/js/chatStore-zilBUd1p.js +0 -3
- package/frontend/dist/js/cs-irpRMzRo.js +0 -2
- package/frontend/dist/js/da-cgilTVxc.js +0 -2
- package/frontend/dist/js/de-BU-eH3gU.js +0 -2
- package/frontend/dist/js/es-B2LRpZ0p.js +0 -2
- package/frontend/dist/js/fr-Cd5JM-oQ.js +0 -2
- package/frontend/dist/js/hi-CvOhdtiK.js +0 -2
- package/frontend/dist/js/id-BtRK5nR_.js +0 -2
- package/frontend/dist/js/is-CnEqwgRF.js +0 -2
- package/frontend/dist/js/it-CI6WjId6.js +0 -2
- package/frontend/dist/js/ja-B6gFOHi6.js +0 -2
- package/frontend/dist/js/ko-DuAhnmMf.js +0 -2
- package/frontend/dist/js/markdown-core-BmPPZiuD.js +0 -31
- package/frontend/dist/js/ms-C8BIP7MZ.js +0 -2
- package/frontend/dist/js/nl-DnEdspER.js +0 -2
- package/frontend/dist/js/pl-Ddyyvbse.js +0 -2
- package/frontend/dist/js/pt-BYuzm70F.js +0 -2
- package/frontend/dist/js/router-vendor-CbPDks39.js +0 -1
- package/frontend/dist/js/ru-CmSPFxPX.js +0 -2
- package/frontend/dist/js/sv-Dd6SQ9f1.js +0 -2
- package/frontend/dist/js/th-CpH8745B.js +0 -2
- package/frontend/dist/js/tr-DuVD75iJ.js +0 -2
- package/frontend/dist/js/ui-CO0DPqrI.js +0 -2
- package/frontend/dist/js/ui-vendor-mqjSfAaS.js +0 -177
- package/frontend/dist/js/uk-B0MU-M8k.js +0 -2
- package/frontend/dist/js/vi-BLmFNp_z.js +0 -2
- package/frontend/dist/js/zh-BQu0TLhw.js +0 -2
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recurrence math for calendar events and automations. All computation uses
|
|
3
|
+
* the server's local timezone; wall-clock trigger times stay stable across
|
|
4
|
+
* DST because candidates are built from local date components, which the
|
|
5
|
+
* Date constructor renormalizes.
|
|
6
|
+
*/
|
|
7
|
+
import type { AutomationTrigger } from '../types/index.js';
|
|
8
|
+
export declare class InvalidTriggerError extends Error {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
/** Validate untrusted input into a well-formed trigger list. */
|
|
12
|
+
export declare function validateTriggers(value: unknown, maximum?: number): AutomationTrigger[];
|
|
13
|
+
/**
|
|
14
|
+
* The first occurrence of a trigger strictly after `after`, or null when the
|
|
15
|
+
* trigger is exhausted. The strictly-after invariant is what prevents a fired
|
|
16
|
+
* occurrence from firing again.
|
|
17
|
+
*/
|
|
18
|
+
export declare function nextOccurrence(trigger: AutomationTrigger, after: number): number | null;
|
|
19
|
+
/** The earliest next occurrence across all triggers, or null when exhausted. */
|
|
20
|
+
export declare function nextRunAt(triggers: readonly AutomationTrigger[], after: number): number | null;
|
|
21
|
+
/**
|
|
22
|
+
* Every occurrence in [from, to), ascending, capped. Used to project
|
|
23
|
+
* recurring calendar events and upcoming automation runs onto a date range.
|
|
24
|
+
*/
|
|
25
|
+
export declare function occurrencesBetween(triggers: readonly AutomationTrigger[], from: number, to: number, cap?: number): number[];
|
|
26
|
+
//# sourceMappingURL=automationSchedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automationSchedule.d.ts","sourceRoot":"","sources":["../../src/utils/automationSchedule.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAmB3D,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,OAAO,SAAI,GACV,iBAAiB,EAAE,CAoHrB;AAqBD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CA8Ef;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CACvB,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EACtC,KAAK,EAAE,MAAM,GACZ,MAAM,GAAG,IAAI,CASf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EACtC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,GAAG,SAAM,GACR,MAAM,EAAE,CAYV"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Libre WebUI
|
|
3
|
+
* Copyright (C) 2025 Kroonen AI, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at:
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
18
|
+
const TRIGGER_KINDS = [
|
|
19
|
+
'once',
|
|
20
|
+
'hourly',
|
|
21
|
+
'daily',
|
|
22
|
+
'weekly',
|
|
23
|
+
'monthly',
|
|
24
|
+
'yearly',
|
|
25
|
+
];
|
|
26
|
+
const isInt = (value, min, max) => typeof value === 'number' &&
|
|
27
|
+
Number.isSafeInteger(value) &&
|
|
28
|
+
value >= min &&
|
|
29
|
+
value <= max;
|
|
30
|
+
export class InvalidTriggerError extends Error {
|
|
31
|
+
constructor(message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = 'InvalidTriggerError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Validate untrusted input into a well-formed trigger list. */
|
|
37
|
+
export function validateTriggers(value, maximum = 5) {
|
|
38
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
39
|
+
throw new InvalidTriggerError('At least one trigger is required');
|
|
40
|
+
}
|
|
41
|
+
if (value.length > maximum) {
|
|
42
|
+
throw new InvalidTriggerError(`At most ${maximum} triggers are allowed`);
|
|
43
|
+
}
|
|
44
|
+
return value.map(item => {
|
|
45
|
+
if (typeof item !== 'object' || item === null) {
|
|
46
|
+
throw new InvalidTriggerError('Each trigger must be an object');
|
|
47
|
+
}
|
|
48
|
+
const trigger = item;
|
|
49
|
+
switch (trigger.kind) {
|
|
50
|
+
case 'once': {
|
|
51
|
+
if (!isInt(trigger.at, 0, 8.64e15)) {
|
|
52
|
+
throw new InvalidTriggerError('A once trigger needs an epoch-ms "at" time');
|
|
53
|
+
}
|
|
54
|
+
return { kind: 'once', at: trigger.at };
|
|
55
|
+
}
|
|
56
|
+
case 'hourly': {
|
|
57
|
+
if (!isInt(trigger.minute, 0, 59)) {
|
|
58
|
+
throw new InvalidTriggerError('An hourly trigger needs a minute between 0 and 59');
|
|
59
|
+
}
|
|
60
|
+
const bounds = {};
|
|
61
|
+
if (trigger.startHour !== undefined) {
|
|
62
|
+
if (!isInt(trigger.startHour, 0, 23)) {
|
|
63
|
+
throw new InvalidTriggerError('startHour must be 0-23');
|
|
64
|
+
}
|
|
65
|
+
bounds.startHour = trigger.startHour;
|
|
66
|
+
}
|
|
67
|
+
if (trigger.endHour !== undefined) {
|
|
68
|
+
if (!isInt(trigger.endHour, 0, 23)) {
|
|
69
|
+
throw new InvalidTriggerError('endHour must be 0-23');
|
|
70
|
+
}
|
|
71
|
+
bounds.endHour = trigger.endHour;
|
|
72
|
+
}
|
|
73
|
+
if (bounds.startHour !== undefined &&
|
|
74
|
+
bounds.endHour !== undefined &&
|
|
75
|
+
bounds.endHour < bounds.startHour) {
|
|
76
|
+
throw new InvalidTriggerError('endHour must not precede startHour');
|
|
77
|
+
}
|
|
78
|
+
return { kind: 'hourly', minute: trigger.minute, ...bounds };
|
|
79
|
+
}
|
|
80
|
+
case 'daily': {
|
|
81
|
+
if (!isInt(trigger.hour, 0, 23) || !isInt(trigger.minute, 0, 59)) {
|
|
82
|
+
throw new InvalidTriggerError('A daily trigger needs an hour (0-23) and minute (0-59)');
|
|
83
|
+
}
|
|
84
|
+
return { kind: 'daily', hour: trigger.hour, minute: trigger.minute };
|
|
85
|
+
}
|
|
86
|
+
case 'weekly': {
|
|
87
|
+
if (!isInt(trigger.dayOfWeek, 0, 6) ||
|
|
88
|
+
!isInt(trigger.hour, 0, 23) ||
|
|
89
|
+
!isInt(trigger.minute, 0, 59)) {
|
|
90
|
+
throw new InvalidTriggerError('A weekly trigger needs dayOfWeek (0-6), hour, and minute');
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
kind: 'weekly',
|
|
94
|
+
dayOfWeek: trigger.dayOfWeek,
|
|
95
|
+
hour: trigger.hour,
|
|
96
|
+
minute: trigger.minute,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
case 'monthly': {
|
|
100
|
+
if (!isInt(trigger.dayOfMonth, 1, 31) ||
|
|
101
|
+
!isInt(trigger.hour, 0, 23) ||
|
|
102
|
+
!isInt(trigger.minute, 0, 59)) {
|
|
103
|
+
throw new InvalidTriggerError('A monthly trigger needs dayOfMonth (1-31), hour, and minute');
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
kind: 'monthly',
|
|
107
|
+
dayOfMonth: trigger.dayOfMonth,
|
|
108
|
+
hour: trigger.hour,
|
|
109
|
+
minute: trigger.minute,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
case 'yearly': {
|
|
113
|
+
if (!isInt(trigger.month, 1, 12) ||
|
|
114
|
+
!isInt(trigger.dayOfMonth, 1, 31) ||
|
|
115
|
+
!isInt(trigger.hour, 0, 23) ||
|
|
116
|
+
!isInt(trigger.minute, 0, 59)) {
|
|
117
|
+
throw new InvalidTriggerError('A yearly trigger needs month (1-12), dayOfMonth, hour, and minute');
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
kind: 'yearly',
|
|
121
|
+
month: trigger.month,
|
|
122
|
+
dayOfMonth: trigger.dayOfMonth,
|
|
123
|
+
hour: trigger.hour,
|
|
124
|
+
minute: trigger.minute,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
default:
|
|
128
|
+
throw new InvalidTriggerError(`Unknown trigger kind; expected one of ${TRIGGER_KINDS.join(', ')}`);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
const daysInMonth = (year, monthIndex) => new Date(year, monthIndex + 1, 0).getDate();
|
|
133
|
+
const atLocalTime = (base, dayOffset, hour, minute) => new Date(base.getFullYear(), base.getMonth(), base.getDate() + dayOffset, hour, minute, 0, 0).getTime();
|
|
134
|
+
/**
|
|
135
|
+
* The first occurrence of a trigger strictly after `after`, or null when the
|
|
136
|
+
* trigger is exhausted. The strictly-after invariant is what prevents a fired
|
|
137
|
+
* occurrence from firing again.
|
|
138
|
+
*/
|
|
139
|
+
export function nextOccurrence(trigger, after) {
|
|
140
|
+
const base = new Date(after);
|
|
141
|
+
switch (trigger.kind) {
|
|
142
|
+
case 'once':
|
|
143
|
+
return trigger.at > after ? trigger.at : null;
|
|
144
|
+
case 'hourly': {
|
|
145
|
+
const start = trigger.startHour ?? 0;
|
|
146
|
+
const end = trigger.endHour ?? 23;
|
|
147
|
+
for (let offset = 0; offset <= 1; offset += 1) {
|
|
148
|
+
const day = new Date(after + offset * DAY_MS);
|
|
149
|
+
const firstHour = offset === 0 ? 0 : start;
|
|
150
|
+
for (let hour = firstHour; hour <= 23; hour += 1) {
|
|
151
|
+
if (hour < start || hour > end)
|
|
152
|
+
continue;
|
|
153
|
+
const candidate = atLocalTime(day, 0, hour, trigger.minute);
|
|
154
|
+
if (candidate > after)
|
|
155
|
+
return candidate;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
case 'daily': {
|
|
161
|
+
for (let offset = 0; offset <= 1; offset += 1) {
|
|
162
|
+
const candidate = atLocalTime(base, offset, trigger.hour, trigger.minute);
|
|
163
|
+
if (candidate > after)
|
|
164
|
+
return candidate;
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
case 'weekly': {
|
|
169
|
+
const todayDow = base.getDay();
|
|
170
|
+
let offset = (trigger.dayOfWeek - todayDow + 7) % 7;
|
|
171
|
+
let candidate = atLocalTime(base, offset, trigger.hour, trigger.minute);
|
|
172
|
+
if (candidate <= after) {
|
|
173
|
+
offset += 7;
|
|
174
|
+
candidate = atLocalTime(base, offset, trigger.hour, trigger.minute);
|
|
175
|
+
}
|
|
176
|
+
return candidate;
|
|
177
|
+
}
|
|
178
|
+
case 'monthly': {
|
|
179
|
+
for (let monthOffset = 0; monthOffset <= 1; monthOffset += 1) {
|
|
180
|
+
const year = base.getFullYear();
|
|
181
|
+
const month = base.getMonth() + monthOffset;
|
|
182
|
+
const day = Math.min(trigger.dayOfMonth, daysInMonth(year, month));
|
|
183
|
+
const candidate = new Date(year, month, day, trigger.hour, trigger.minute, 0, 0).getTime();
|
|
184
|
+
if (candidate > after)
|
|
185
|
+
return candidate;
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
case 'yearly': {
|
|
190
|
+
for (let yearOffset = 0; yearOffset <= 1; yearOffset += 1) {
|
|
191
|
+
const year = base.getFullYear() + yearOffset;
|
|
192
|
+
const monthIndex = trigger.month - 1;
|
|
193
|
+
const day = Math.min(trigger.dayOfMonth, daysInMonth(year, monthIndex));
|
|
194
|
+
const candidate = new Date(year, monthIndex, day, trigger.hour, trigger.minute, 0, 0).getTime();
|
|
195
|
+
if (candidate > after)
|
|
196
|
+
return candidate;
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** The earliest next occurrence across all triggers, or null when exhausted. */
|
|
203
|
+
export function nextRunAt(triggers, after) {
|
|
204
|
+
let earliest = null;
|
|
205
|
+
for (const trigger of triggers) {
|
|
206
|
+
const candidate = nextOccurrence(trigger, after);
|
|
207
|
+
if (candidate !== null && (earliest === null || candidate < earliest)) {
|
|
208
|
+
earliest = candidate;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return earliest;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Every occurrence in [from, to), ascending, capped. Used to project
|
|
215
|
+
* recurring calendar events and upcoming automation runs onto a date range.
|
|
216
|
+
*/
|
|
217
|
+
export function occurrencesBetween(triggers, from, to, cap = 500) {
|
|
218
|
+
const occurrences = new Set();
|
|
219
|
+
for (const trigger of triggers) {
|
|
220
|
+
let cursor = from - 1;
|
|
221
|
+
while (occurrences.size < cap) {
|
|
222
|
+
const candidate = nextOccurrence(trigger, cursor);
|
|
223
|
+
if (candidate === null || candidate >= to)
|
|
224
|
+
break;
|
|
225
|
+
occurrences.add(candidate);
|
|
226
|
+
cursor = candidate;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return [...occurrences].sort((left, right) => left - right);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=automationSchedule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automationSchedule.js","sourceRoot":"","sources":["../../src/utils/automationSchedule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnC,MAAM,aAAa,GAAG;IACpB,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;CACA,CAAC;AAEX,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,GAAW,EAAE,GAAW,EAAmB,EAAE,CAC1E,OAAO,KAAK,KAAK,QAAQ;IACzB,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;IAC3B,KAAK,IAAI,GAAG;IACZ,KAAK,IAAI,GAAG,CAAC;AAEf,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,UAAU,gBAAgB,CAC9B,KAAc,EACd,OAAO,GAAG,CAAC;IAEX,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,mBAAmB,CAAC,kCAAkC,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,mBAAmB,CAAC,WAAW,OAAO,uBAAuB,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACtB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,IAAI,mBAAmB,CAAC,gCAAgC,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,OAAO,GAAG,IAA+B,CAAC;QAChD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,mBAAmB,CAC3B,4CAA4C,CAC7C,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;YAC1C,CAAC;YACD,KAAK,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBAClC,MAAM,IAAI,mBAAmB,CAC3B,mDAAmD,CACpD,CAAC;gBACJ,CAAC;gBACD,MAAM,MAAM,GAA6C,EAAE,CAAC;gBAC5D,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;wBACrC,MAAM,IAAI,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;oBAC1D,CAAC;oBACD,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;gBACvC,CAAC;gBACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;wBACnC,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;oBACxD,CAAC;oBACD,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;gBACnC,CAAC;gBACD,IACE,MAAM,CAAC,SAAS,KAAK,SAAS;oBAC9B,MAAM,CAAC,OAAO,KAAK,SAAS;oBAC5B,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,EACjC,CAAC;oBACD,MAAM,IAAI,mBAAmB,CAAC,oCAAoC,CAAC,CAAC;gBACtE,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;YAC/D,CAAC;YACD,KAAK,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACjE,MAAM,IAAI,mBAAmB,CAC3B,wDAAwD,CACzD,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YACvE,CAAC;YACD,KAAK,QAAQ,EAAE,CAAC;gBACd,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC/B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EAC7B,CAAC;oBACD,MAAM,IAAI,mBAAmB,CAC3B,0DAA0D,CAC3D,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC;YACJ,CAAC;YACD,KAAK,SAAS,EAAE,CAAC;gBACf,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EAC7B,CAAC;oBACD,MAAM,IAAI,mBAAmB,CAC3B,6DAA6D,CAC9D,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC;YACJ,CAAC;YACD,KAAK,QAAQ,EAAE,CAAC;gBACd,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;oBACjC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,EAC7B,CAAC;oBACD,MAAM,IAAI,mBAAmB,CAC3B,mEAAmE,CACpE,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC;YACJ,CAAC;YACD;gBACE,MAAM,IAAI,mBAAmB,CAC3B,yCAAyC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;QACN,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,UAAkB,EAAU,EAAE,CAC/D,IAAI,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AAE9C,MAAM,WAAW,GAAG,CAClB,IAAU,EACV,SAAiB,EACjB,IAAY,EACZ,MAAc,EACN,EAAE,CACV,IAAI,IAAI,CACN,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,QAAQ,EAAE,EACf,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,EAC1B,IAAI,EACJ,MAAM,EACN,CAAC,EACD,CAAC,CACF,CAAC,OAAO,EAAE,CAAC;AAEd;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,OAA0B,EAC1B,KAAa;IAEb,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;YAClC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;gBAC9C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3C,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;oBACjD,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG;wBAAE,SAAS;oBACzC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC5D,IAAI,SAAS,GAAG,KAAK;wBAAE,OAAO,SAAS,CAAC;gBAC1C,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,WAAW,CAC3B,IAAI,EACJ,MAAM,EACN,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,MAAM,CACf,CAAC;gBACF,IAAI,SAAS,GAAG,KAAK;oBAAE,OAAO,SAAS,CAAC;YAC1C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACpD,IAAI,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACxE,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,CAAC;gBACZ,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YACf,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,WAAW,IAAI,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC;gBAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACnE,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,IAAI,EACJ,KAAK,EACL,GAAG,EACH,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,MAAM,EACd,CAAC,EACD,CAAC,CACF,CAAC,OAAO,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,KAAK;oBAAE,OAAO,SAAS,CAAC;YAC1C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,QAAQ,EAAE,CAAC;YACd,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,UAAU,IAAI,CAAC,EAAE,CAAC;gBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC;gBAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;gBACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;gBACxE,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,IAAI,EACJ,UAAU,EACV,GAAG,EACH,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,MAAM,EACd,CAAC,EACD,CAAC,CACF,CAAC,OAAO,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,KAAK;oBAAE,OAAO,SAAS,CAAC;YAC1C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,SAAS,CACvB,QAAsC,EACtC,KAAa;IAEb,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjD,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,SAAS,GAAG,QAAQ,CAAC,EAAE,CAAC;YACtE,QAAQ,GAAG,SAAS,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAsC,EACtC,IAAY,EACZ,EAAU,EACV,GAAG,GAAG,GAAG;IAET,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;QACtB,OAAO,WAAW,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,IAAI,EAAE;gBAAE,MAAM;YACjD,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC3B,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -1,14 +1,39 @@
|
|
|
1
|
+
/** One cited excerpt of a source document. */
|
|
2
|
+
export interface ChatDocumentCitation {
|
|
3
|
+
chunkIndex: number;
|
|
4
|
+
/** Human-readable source location (page/slide/sheet/section). */
|
|
5
|
+
location?: string;
|
|
6
|
+
/** Retrieval score of this excerpt within the query's ranking. */
|
|
7
|
+
score?: number;
|
|
8
|
+
}
|
|
1
9
|
export interface ChatDocumentSource {
|
|
2
10
|
id: string;
|
|
3
11
|
filename: string;
|
|
12
|
+
/** Present in retrieval mode: which excerpts contributed, best first. */
|
|
13
|
+
citations?: ChatDocumentCitation[];
|
|
14
|
+
/** True when the document's full content entered context. */
|
|
15
|
+
full?: boolean;
|
|
4
16
|
}
|
|
5
17
|
export interface ChatDocumentContext {
|
|
6
18
|
documentContext: string;
|
|
7
19
|
enhancedContent: string;
|
|
8
20
|
hasRelevantContext: boolean;
|
|
9
|
-
/** Documents that actually contributed
|
|
21
|
+
/** Documents that actually contributed, deduplicated, best first. */
|
|
10
22
|
sources: ChatDocumentSource[];
|
|
23
|
+
/** How document context was assembled for this turn. */
|
|
24
|
+
mode: 'retrieval' | 'full';
|
|
25
|
+
/** Set when full-document mode was requested but exceeded the guard. */
|
|
26
|
+
fullContextSkipped?: {
|
|
27
|
+
estimatedTokens: number;
|
|
28
|
+
maxTokens: number;
|
|
29
|
+
};
|
|
11
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Full-document mode sends entire extracted sources instead of retrieved
|
|
33
|
+
* excerpts, so it needs a hard token guard. Deliberately conservative:
|
|
34
|
+
* most local models run 8k-128k contexts.
|
|
35
|
+
*/
|
|
36
|
+
export declare const fullDocumentContextMaxTokens: () => number;
|
|
12
37
|
export declare const EMPTY_CHAT_DOCUMENT_CONTEXT: (message: string) => ChatDocumentContext;
|
|
13
38
|
export declare function buildChatDocumentContext(message: string, sessionId: string, userId: string, signal?: AbortSignal): Promise<ChatDocumentContext>;
|
|
14
39
|
//# sourceMappingURL=chatDocumentContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatDocumentContext.d.ts","sourceRoot":"","sources":["../../src/utils/chatDocumentContext.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chatDocumentContext.d.ts","sourceRoot":"","sources":["../../src/utils/chatDocumentContext.ts"],"names":[],"mappings":"AAsBA,8CAA8C;AAC9C,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACnC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qEAAqE;IACrE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,wDAAwD;IACxD,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,wEAAwE;IACxE,kBAAkB,CAAC,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,QAAO,MAU/C,CAAC;AAEF,eAAO,MAAM,2BAA2B,YAC7B,MAAM,KACd,mBAMD,CAAC;AA6DH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAkF9B"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
6
|
* you may not use this file except in compliance with the License.
|
|
7
|
-
* You may obtain a copy of the License at
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
8
|
*
|
|
9
9
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
10
|
*
|
|
@@ -15,48 +15,115 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
import documentService from '../services/documentService.js';
|
|
18
|
+
import { estimateTextTokens } from '../services/contextCompactionService.js';
|
|
18
19
|
import storageService from '../storage.js';
|
|
19
20
|
import { throwIfChatGenerationCancelled } from './chatCancellation.js';
|
|
21
|
+
/**
|
|
22
|
+
* Full-document mode sends entire extracted sources instead of retrieved
|
|
23
|
+
* excerpts, so it needs a hard token guard. Deliberately conservative:
|
|
24
|
+
* most local models run 8k-128k contexts.
|
|
25
|
+
*/
|
|
26
|
+
export const fullDocumentContextMaxTokens = () => {
|
|
27
|
+
const raw = process.env.FULL_DOCUMENT_CONTEXT_MAX_TOKENS;
|
|
28
|
+
if (raw === undefined)
|
|
29
|
+
return 32000;
|
|
30
|
+
const value = Number.parseInt(raw, 10);
|
|
31
|
+
if (!Number.isSafeInteger(value) || value < 1000 || value > 2000000) {
|
|
32
|
+
throw new Error('FULL_DOCUMENT_CONTEXT_MAX_TOKENS must be between 1000 and 2000000');
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
};
|
|
20
36
|
export const EMPTY_CHAT_DOCUMENT_CONTEXT = (message) => ({
|
|
21
37
|
documentContext: '',
|
|
22
38
|
enhancedContent: message,
|
|
23
39
|
hasRelevantContext: false,
|
|
24
40
|
sources: [],
|
|
41
|
+
mode: 'retrieval',
|
|
25
42
|
});
|
|
43
|
+
const buildFullDocumentContext = async (message, sessionId, userId, knowledgeCollectionIds, signal) => {
|
|
44
|
+
const documents = (await documentService.getDocumentsInScope(userId, sessionId, knowledgeCollectionIds)).filter(document => (document.content ?? '').trim().length > 0);
|
|
45
|
+
throwIfChatGenerationCancelled(signal);
|
|
46
|
+
if (documents.length === 0) {
|
|
47
|
+
return { context: EMPTY_CHAT_DOCUMENT_CONTEXT(message) };
|
|
48
|
+
}
|
|
49
|
+
const maxTokens = fullDocumentContextMaxTokens();
|
|
50
|
+
const estimatedTokens = documents.reduce((total, document) => total + estimateTextTokens(document.content ?? ''), 0);
|
|
51
|
+
if (estimatedTokens > maxTokens) {
|
|
52
|
+
// Too large to send whole: fall back to retrieval, but tell the caller
|
|
53
|
+
// so the client can explain why full mode did not apply.
|
|
54
|
+
return { skipped: { estimatedTokens, maxTokens } };
|
|
55
|
+
}
|
|
56
|
+
const documentContext = '\n\n--- ATTACHED DOCUMENTS (full content) ---\n' +
|
|
57
|
+
documents
|
|
58
|
+
.map(document => `Document: ${document.filename}\n${document.content ?? ''}\n`)
|
|
59
|
+
.join('\n---\n') +
|
|
60
|
+
'\n--- END DOCUMENTS ---\n\n';
|
|
61
|
+
return {
|
|
62
|
+
context: {
|
|
63
|
+
documentContext,
|
|
64
|
+
enhancedContent: `${documentContext}User question: ${message}`,
|
|
65
|
+
hasRelevantContext: true,
|
|
66
|
+
sources: documents.map(document => ({
|
|
67
|
+
id: document.id,
|
|
68
|
+
filename: document.filename,
|
|
69
|
+
full: true,
|
|
70
|
+
})),
|
|
71
|
+
mode: 'full',
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
};
|
|
26
75
|
export async function buildChatDocumentContext(message, sessionId, userId, signal) {
|
|
27
76
|
throwIfChatGenerationCancelled(signal);
|
|
28
77
|
// Documents from knowledge collections attached to this chat join the
|
|
29
78
|
// session's own uploads and the user's standing uploads in the
|
|
30
|
-
// searchable scope. searchDocuments picks
|
|
79
|
+
// searchable scope. searchDocuments picks hybrid or keyword retrieval
|
|
31
80
|
// by the embedding settings, so retrieval works either way.
|
|
32
|
-
const
|
|
81
|
+
const settings = (await storageService.getSession(sessionId, userId))
|
|
82
|
+
?.settings;
|
|
83
|
+
const knowledgeCollectionIds = settings?.knowledgeCollectionIds;
|
|
84
|
+
throwIfChatGenerationCancelled(signal);
|
|
85
|
+
let fullContextSkipped;
|
|
86
|
+
if (settings?.fullDocumentContext === true) {
|
|
87
|
+
const outcome = await buildFullDocumentContext(message, sessionId, userId, knowledgeCollectionIds, signal);
|
|
88
|
+
if (outcome.context)
|
|
89
|
+
return outcome.context;
|
|
90
|
+
fullContextSkipped = outcome.skipped;
|
|
91
|
+
}
|
|
33
92
|
throwIfChatGenerationCancelled(signal);
|
|
34
93
|
const relevantDocuments = await documentService.searchDocuments(message, userId, sessionId, 5, knowledgeCollectionIds, signal);
|
|
35
94
|
throwIfChatGenerationCancelled(signal);
|
|
36
95
|
if (relevantDocuments.length === 0) {
|
|
37
|
-
return
|
|
96
|
+
return {
|
|
97
|
+
...EMPTY_CHAT_DOCUMENT_CONTEXT(message),
|
|
98
|
+
...(fullContextSkipped ? { fullContextSkipped } : {}),
|
|
99
|
+
};
|
|
38
100
|
}
|
|
39
|
-
const
|
|
40
|
-
const sources = [];
|
|
101
|
+
const sourcesById = new Map();
|
|
41
102
|
for (const chunk of relevantDocuments) {
|
|
42
103
|
throwIfChatGenerationCancelled(signal);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
documentsMap.set(chunk.documentId, document);
|
|
47
|
-
sources.push({
|
|
104
|
+
let source = sourcesById.get(chunk.documentId);
|
|
105
|
+
if (!source) {
|
|
106
|
+
source = {
|
|
48
107
|
id: chunk.documentId,
|
|
49
|
-
filename:
|
|
50
|
-
|
|
108
|
+
filename: chunk.filename || 'Unknown Document',
|
|
109
|
+
citations: [],
|
|
110
|
+
};
|
|
111
|
+
sourcesById.set(chunk.documentId, source);
|
|
51
112
|
}
|
|
113
|
+
source.citations.push({
|
|
114
|
+
chunkIndex: chunk.chunkIndex,
|
|
115
|
+
...(chunk.location ? { location: chunk.location } : {}),
|
|
116
|
+
...(chunk.score !== undefined ? { score: chunk.score } : {}),
|
|
117
|
+
});
|
|
52
118
|
}
|
|
53
|
-
throwIfChatGenerationCancelled(signal);
|
|
54
119
|
const documentContext = '\n\n--- RELEVANT DOCUMENTS ---\n' +
|
|
55
120
|
relevantDocuments
|
|
56
121
|
.map((chunk, index) => {
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
|
|
122
|
+
const docTitle = chunk.filename || 'Unknown Document';
|
|
123
|
+
const where = chunk.location
|
|
124
|
+
? `chunk ${chunk.chunkIndex + 1}, ${chunk.location}`
|
|
125
|
+
: `chunk ${chunk.chunkIndex + 1}`;
|
|
126
|
+
return `Document ${index + 1}: ${docTitle} (${where})\n${chunk.content}\n`;
|
|
60
127
|
})
|
|
61
128
|
.join('\n---\n') +
|
|
62
129
|
'\n--- END DOCUMENTS ---\n\n';
|
|
@@ -64,7 +131,9 @@ export async function buildChatDocumentContext(message, sessionId, userId, signa
|
|
|
64
131
|
documentContext,
|
|
65
132
|
enhancedContent: `${documentContext}User question: ${message}`,
|
|
66
133
|
hasRelevantContext: true,
|
|
67
|
-
sources,
|
|
134
|
+
sources: [...sourcesById.values()],
|
|
135
|
+
mode: 'retrieval',
|
|
136
|
+
...(fullContextSkipped ? { fullContextSkipped } : {}),
|
|
68
137
|
};
|
|
69
138
|
}
|
|
70
139
|
//# sourceMappingURL=chatDocumentContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatDocumentContext.js","sourceRoot":"","sources":["../../src/utils/chatDocumentContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,eAAe,MAAM,gCAAgC,CAAC;AAC7D,OAAO,cAAc,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"chatDocumentContext.js","sourceRoot":"","sources":["../../src/utils/chatDocumentContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { DocumentFileType } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Document extraction for knowledge ingestion.
|
|
4
|
+
*
|
|
5
|
+
* Every supported upload type resolves to one canonical `DocumentFileType`
|
|
6
|
+
* and one extractor that returns plain text plus an optional segment map.
|
|
7
|
+
* Segments record where pages, slides, sheets, and Markdown sections start
|
|
8
|
+
* and end inside the extracted text, so retrieval can cite an exact source
|
|
9
|
+
* location without a second parse of the original file.
|
|
10
|
+
*
|
|
11
|
+
* OOXML formats are unpacked with the in-repo bounded ZIP reader and a
|
|
12
|
+
* narrow text-run scan of the document XML; the goal is faithful text for
|
|
13
|
+
* retrieval, not layout fidelity. Images/OCR and audio transcription are
|
|
14
|
+
* deliberately not extracted here — they are documented boundaries until an
|
|
15
|
+
* OCR engine and a default speech-to-text route exist.
|
|
16
|
+
*/
|
|
17
|
+
export type { DocumentFileType } from '../types/index.js';
|
|
18
|
+
export interface DocumentSegment {
|
|
19
|
+
kind: 'page' | 'slide' | 'sheet' | 'section';
|
|
20
|
+
label: string;
|
|
21
|
+
startChar: number;
|
|
22
|
+
endChar: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ExtractedDocumentContent {
|
|
25
|
+
content: string;
|
|
26
|
+
segments: DocumentSegment[];
|
|
27
|
+
}
|
|
28
|
+
export declare class DocumentExtractionError extends Error {
|
|
29
|
+
constructor(message: string);
|
|
30
|
+
}
|
|
31
|
+
export declare const SUPPORTED_DOCUMENT_EXTENSIONS: readonly string[];
|
|
32
|
+
export declare const SUPPORTED_DOCUMENT_MIME_TYPES: readonly string[];
|
|
33
|
+
/**
|
|
34
|
+
* Resolves the canonical file type for an upload. The extension decides
|
|
35
|
+
* first because browsers report unreliable MIME types for Markdown, code,
|
|
36
|
+
* and OOXML files; the declared MIME type is the fallback for extensionless
|
|
37
|
+
* names. Returns null when neither identifies a supported type.
|
|
38
|
+
*/
|
|
39
|
+
export declare const resolveDocumentFileType: (fileName: string, mimeType: string) => DocumentFileType | null;
|
|
40
|
+
/** Validates a stored document metadata segment map. */
|
|
41
|
+
export declare const readDocumentSegments: (metadata: Record<string, unknown> | undefined) => DocumentSegment[];
|
|
42
|
+
/**
|
|
43
|
+
* Human-readable location of a chunk inside its source, chosen as the
|
|
44
|
+
* segment with the greatest overlap of the chunk's character range.
|
|
45
|
+
* Offsets are approximate (chunking trims whitespace), so overlap rather
|
|
46
|
+
* than containment decides.
|
|
47
|
+
*/
|
|
48
|
+
export declare const resolveSegmentLabel: (segments: readonly DocumentSegment[], startChar: number, endChar: number) => string | undefined;
|
|
49
|
+
export interface PdfExtractionApi {
|
|
50
|
+
getDocument(options: {
|
|
51
|
+
data: Uint8Array;
|
|
52
|
+
}): {
|
|
53
|
+
promise: Promise<{
|
|
54
|
+
numPages: number;
|
|
55
|
+
getPage(pageNumber: number): Promise<{
|
|
56
|
+
getTextContent(): Promise<{
|
|
57
|
+
items: unknown[];
|
|
58
|
+
}>;
|
|
59
|
+
}>;
|
|
60
|
+
}>;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export interface DocumentExtractionOptions {
|
|
64
|
+
signal?: AbortSignal;
|
|
65
|
+
/** Lazily loaded pdfjs module; required only for PDF extraction. */
|
|
66
|
+
pdfLib?: PdfExtractionApi;
|
|
67
|
+
}
|
|
68
|
+
export declare const extractDocumentContentByType: (buffer: Buffer, fileType: DocumentFileType, options?: DocumentExtractionOptions) => Promise<ExtractedDocumentContent>;
|
|
69
|
+
//# sourceMappingURL=documentExtraction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentExtraction.d.ts","sourceRoot":"","sources":["../../src/utils/documentExtraction.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AA0GD,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAE1D,CAAC;AAEF,eAAO,MAAM,6BAA6B,EAAE,SAAS,MAAM,EAEzD,CAAC;AASH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,aACxB,MAAM,YACN,MAAM,KACf,gBAAgB,GAAG,IAerB,CAAC;AAIF,wDAAwD;AACxD,eAAO,MAAM,oBAAoB,aACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAC5C,eAAe,EA0BjB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,aACpB,SAAS,eAAe,EAAE,aACzB,MAAM,WACR,MAAM,KACd,MAAM,GAAG,SAqBX,CAAC;AAsSF,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG;QAC1C,OAAO,EAAE,OAAO,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;gBACnC,cAAc,IAAI,OAAO,CAAC;oBAAE,KAAK,EAAE,OAAO,EAAE,CAAA;iBAAE,CAAC,CAAC;aACjD,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;CACH;AAgDD,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oEAAoE;IACpE,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,eAAO,MAAM,4BAA4B,WAC/B,MAAM,YACJ,gBAAgB,YACjB,yBAAyB,KACjC,OAAO,CAAC,wBAAwB,CA4BlC,CAAC"}
|