@memberjunction/server 6.2.0-edge.4 → 6.2.0-edge.6
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 +47 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +91 -30
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +311 -81
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +17 -3
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +44 -10
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/apiRoot.d.ts +32 -0
- package/dist/apiRoot.d.ts.map +1 -0
- package/dist/apiRoot.js +67 -0
- package/dist/apiRoot.js.map +1 -0
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +27 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/LoginScreenEngine.d.ts +22 -0
- package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
- package/dist/auth/LoginScreenEngine.js +57 -0
- package/dist/auth/LoginScreenEngine.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +52 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +10 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +37 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/localDevAuth.d.ts +79 -0
- package/dist/auth/localDevAuth.d.ts.map +1 -0
- package/dist/auth/localDevAuth.js +439 -0
- package/dist/auth/localDevAuth.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +2 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +12 -0
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.d.ts +1 -1
- package/dist/auth/sessionUserClone.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.js +3 -2
- package/dist/auth/sessionUserClone.js.map +1 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
- package/dist/broadcast/index.d.ts +6 -0
- package/dist/broadcast/index.d.ts.map +1 -0
- package/dist/broadcast/index.js +6 -0
- package/dist/broadcast/index.js.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
- package/dist/cache.d.ts +3 -2
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +632 -22
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +104 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +3 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -8
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +29 -0
- package/dist/coreRoutes.d.ts.map +1 -0
- package/dist/coreRoutes.js +156 -0
- package/dist/coreRoutes.js.map +1 -0
- package/dist/generated/graphql-schemas/__mj.d.ts +1016 -29
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +5125 -434
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +85 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +175 -60
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/PubSubManager.d.ts +10 -0
- package/dist/generic/PubSubManager.d.ts.map +1 -1
- package/dist/generic/PubSubManager.js +44 -1
- package/dist/generic/PubSubManager.js.map +1 -1
- package/dist/generic/PushStatusResolver.d.ts +39 -6
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +94 -12
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +168 -69
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +464 -405
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +11 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +91 -13
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
- package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
- package/dist/generic/actionOutputFieldSecurity.js +47 -0
- package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
- package/dist/generic/fieldSecurityTransport.d.ts +30 -0
- package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
- package/dist/generic/fieldSecurityTransport.js +30 -0
- package/dist/generic/fieldSecurityTransport.js.map +1 -0
- package/dist/globalCors.d.ts +33 -0
- package/dist/globalCors.d.ts.map +1 -0
- package/dist/globalCors.js +58 -0
- package/dist/globalCors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +230 -222
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +6 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +50 -1
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +22 -2
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
- package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
- package/dist/realtimeSessions/index.d.ts +2 -0
- package/dist/realtimeSessions/index.d.ts.map +1 -1
- package/dist/realtimeSessions/index.js +2 -0
- package/dist/realtimeSessions/index.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +32 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js +56 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
- package/dist/realtimeSessions/sessionAccess.d.ts +91 -8
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +127 -20
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
- package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.js +19 -3
- package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
- package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +201 -19
- package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
- package/dist/realtimeWidget/host-identity.d.ts +1 -1
- package/dist/realtimeWidget/host-identity.js +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +17 -1
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +19 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +63 -12
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +1 -0
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +40 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.js +9 -7
- package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts +24 -3
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +57 -8
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
- package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +3 -2
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +46 -3
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +211 -50
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -0
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +87 -11
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +292 -105
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +117 -38
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +6 -3
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +49 -9
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +31 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
- package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.js +5 -3
- package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts +2 -0
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +33 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +15 -6
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RSUResolver.d.ts.map +1 -1
- package/dist/resolvers/RSUResolver.js +12 -0
- package/dist/resolvers/RSUResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +18 -10
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +92 -54
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +241 -67
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +4 -4
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTestResolver.js +3 -1
- package/dist/resolvers/RunTestResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
- package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +4 -0
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +66 -13
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +34 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +150 -27
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js +2 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
- package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
- package/dist/resolvers/agent-run-data-guard.js +72 -0
- package/dist/resolvers/agent-run-data-guard.js.map +1 -0
- package/dist/rest/EntityCRUDHandler.d.ts +6 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +19 -5
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +8 -5
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
- package/dist/rest/RealtimeRecordingHandler.js +383 -0
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts +9 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +43 -17
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +6 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +6 -0
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverExtensionReservedRoots.d.ts +12 -10
- package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
- package/dist/serverExtensionReservedRoots.js +14 -17
- package/dist/serverExtensionReservedRoots.js.map +1 -1
- package/dist/serverRoleConfigUnits.d.ts +29 -0
- package/dist/serverRoleConfigUnits.d.ts.map +1 -0
- package/dist/serverRoleConfigUnits.js +33 -0
- package/dist/serverRoleConfigUnits.js.map +1 -0
- package/dist/services/MJStorageBlobStore.d.ts +8 -1
- package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
- package/dist/services/MJStorageBlobStore.js +25 -19
- package/dist/services/MJStorageBlobStore.js.map +1 -1
- package/dist/services/StartTaskGraphDispatcher.js +2 -2
- package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +5 -3
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +27 -5
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +157 -9
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +59 -2
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +626 -16
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/sharedCache.d.ts.map +1 -1
- package/dist/sharedCache.js +3 -0
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +23 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +99 -98
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
- package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +369 -18
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
- package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
- package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
- package/src/__tests__/LoginScreenEngine.test.ts +86 -0
- package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
- package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
- package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
- package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +243 -7
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
- package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
- package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +69 -13
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +20 -28
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +264 -0
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
- package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
- package/src/__tests__/SessionJanitor.test.ts +365 -10
- package/src/__tests__/SessionManager.test.ts +122 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
- package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +468 -23
- package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
- package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
- package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/agent-run-data-guard.test.ts +130 -0
- package/src/__tests__/apiRootBoot.test.ts +202 -0
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +109 -0
- package/src/__tests__/conversationRunEvents.test.ts +56 -14
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +217 -0
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
- package/src/__tests__/multiTenancy.security.test.ts +51 -0
- package/src/__tests__/multiTenancy.test.ts +1 -1
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +64 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +669 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +146 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
- package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
- package/src/__tests__/resolverBase.fls.test.ts +146 -97
- package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
- package/src/__tests__/runParamsTimeZone.test.ts +179 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
- package/src/__tests__/runViewProperties.test.ts +114 -0
- package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
- package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
- package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
- package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/sharedCache.test.ts +5 -3
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +28 -0
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/SessionJanitor.ts +369 -93
- package/src/agentSessions/SessionManager.ts +45 -10
- package/src/apiRoot.ts +78 -0
- package/src/auth/AuthProviderCatalogRouter.ts +29 -0
- package/src/auth/LoginScreenEngine.ts +50 -0
- package/src/auth/index.ts +57 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
- package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
- package/src/auth/magicLink/types.ts +10 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
- package/src/broadcast/index.ts +5 -0
- package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
- package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
- package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
- package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
- package/src/cache.ts +2 -1
- package/src/config.ts +115 -5
- package/src/context.ts +32 -8
- package/src/coreRoutes.ts +181 -0
- package/src/generated/graphql-schemas/__mj.ts +3684 -284
- package/src/generic/CacheInvalidationResolver.ts +172 -60
- package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +109 -12
- package/src/generic/ResolverBase.ts +540 -431
- package/src/generic/RunViewResolver.ts +97 -15
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/globalCors.ts +71 -0
- package/src/index.ts +239 -238
- package/src/integration/CustomColumnPromoter.ts +6 -1
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/multiTenancy/index.ts +24 -2
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
- package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
- package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/index.ts +2 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +69 -0
- package/src/realtimeSessions/sessionAccess.ts +183 -23
- package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
- package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
- package/src/realtimeSessions/verificationWorkflow.ts +3 -1
- package/src/realtimeWidget/WidgetRouter.ts +22 -4
- package/src/realtimeWidget/WidgetSessionService.ts +252 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/widgetCore.ts +30 -1
- package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
- package/src/resolvers/ActionResolver.ts +78 -15
- package/src/resolvers/AdhocQueryResolver.ts +1 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
- package/src/resolvers/AgentSessionResolver.ts +46 -18
- package/src/resolvers/ArtifactFileResolver.ts +9 -8
- package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
- package/src/resolvers/DatasetResolver.ts +70 -10
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/EntityRecordNameResolver.ts +3 -2
- package/src/resolvers/FetchEntityVectorsResolver.ts +248 -55
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +334 -109
- package/src/resolvers/GetDataContextDataResolver.ts +139 -41
- package/src/resolvers/GetDataResolver.ts +6 -3
- package/src/resolvers/IntegrationDiscoveryResolver.ts +53 -9
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +31 -6
- package/src/resolvers/QuerySystemUserResolver.ts +15 -6
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +114 -66
- package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
- package/src/resolvers/RunAIAgentResolver.ts +296 -85
- package/src/resolvers/RunTemplateResolver.ts +6 -4
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
- package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
- package/src/resolvers/TestQuerySQLResolver.ts +69 -13
- package/src/resolvers/TransactionGroupResolver.ts +185 -30
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/resolvers/agent-run-data-guard.ts +89 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +467 -0
- package/src/rest/ViewOperationsHandler.ts +52 -18
- package/src/rest/setupRESTEndpoints.ts +6 -0
- package/src/serverExtensionReservedRoots.ts +14 -17
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/MJStorageBlobStore.ts +31 -30
- package/src/services/StartTaskGraphDispatcher.ts +2 -2
- package/src/services/TaskGraphActionRunner.ts +25 -5
- package/src/services/TaskGraphAgentRunner.ts +188 -11
- package/src/services/TaskGraphContinuationDeliverer.ts +738 -16
- package/src/sharedCache.ts +3 -0
- package/src/types.ts +23 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Resolver, Query, Arg, Ctx, ObjectType, Field, Float, Int } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import { CompositeKey, EntityInfo, IMetadataProvider, LogError, LogStatus, Metadata, RunView, UserInfo } from '@memberjunction/core';
|
|
3
|
+
import { CompositeKey, EntityInfo, IMetadataProvider, LogError, LogStatus, Metadata, RunView, RunViewParams, UserInfo } from '@memberjunction/core';
|
|
4
4
|
import { MJEntityDocumentEntity, MJVectorIndexEntity, MJVectorDatabaseEntity } from '@memberjunction/core-entities';
|
|
5
5
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
6
6
|
import { GetReadOnlyProvider } from '../util.js';
|
|
@@ -41,6 +41,21 @@ export class FetchEntityVectorsResult {
|
|
|
41
41
|
ErrorMessage?: string;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
/** A stored vector's listing row, as `fetchStoredVectors` reads it from `MJ: Entity Record Documents`. */
|
|
45
|
+
type StoredVectorRow = { ID: string; RecordID: string };
|
|
46
|
+
|
|
47
|
+
/** A stored vector chosen for the result, with the labels of the record it belongs to. */
|
|
48
|
+
type LabelledVector = { row: StoredVectorRow; labels: Record<string, string> };
|
|
49
|
+
|
|
50
|
+
/** Most Entity Record Document IDs named in one `ID IN (...)` filter when fetching VectorJSON. */
|
|
51
|
+
const VECTOR_FETCH_CHUNK_SIZE = 1000;
|
|
52
|
+
|
|
53
|
+
/** Most record keys named in one view when checking which matched records the caller may read. */
|
|
54
|
+
const READABLE_KEY_CHECK_CHUNK_SIZE = 1000;
|
|
55
|
+
|
|
56
|
+
/** A match returned by an external vector index's `QueryIndex`. */
|
|
57
|
+
type IndexMatch = { id: string; values?: number[]; metadata?: Record<string, unknown>; score?: number };
|
|
58
|
+
|
|
44
59
|
/* ───── Resolver ───── */
|
|
45
60
|
|
|
46
61
|
@Resolver()
|
|
@@ -61,15 +76,18 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
61
76
|
}
|
|
62
77
|
|
|
63
78
|
const limit = maxRecords ?? 1000;
|
|
79
|
+
// Every read runs on this request's provider.
|
|
80
|
+
const md = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? Metadata.Provider;
|
|
81
|
+
const rv = RunView.FromMetadataProvider(md);
|
|
64
82
|
|
|
65
83
|
// Step 1: Load the EntityDocument
|
|
66
|
-
const entityDoc = await this.loadEntityDocument(entityDocumentID, currentUser);
|
|
84
|
+
const entityDoc = await this.loadEntityDocument(entityDocumentID, currentUser, rv);
|
|
67
85
|
if (!entityDoc) {
|
|
68
86
|
return this.errorResult(`EntityDocument not found: ${entityDocumentID}`, startTime);
|
|
69
87
|
}
|
|
70
88
|
|
|
71
89
|
// Step 2: Resolve the VectorIndex
|
|
72
|
-
const vectorIndex = await this.resolveVectorIndex(entityDoc, currentUser);
|
|
90
|
+
const vectorIndex = await this.resolveVectorIndex(entityDoc, currentUser, rv);
|
|
73
91
|
if (!vectorIndex) {
|
|
74
92
|
return this.errorResult(
|
|
75
93
|
`Could not resolve VectorIndex for EntityDocument "${entityDoc.Name}"`,
|
|
@@ -78,7 +96,7 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
78
96
|
}
|
|
79
97
|
|
|
80
98
|
// Step 3: Create VectorDB provider instance
|
|
81
|
-
const vectorDBInstance = await this.createVectorDBInstance(vectorIndex, currentUser);
|
|
99
|
+
const vectorDBInstance = await this.createVectorDBInstance(vectorIndex, currentUser, rv);
|
|
82
100
|
if (!vectorDBInstance) {
|
|
83
101
|
return this.errorResult(
|
|
84
102
|
`Could not create VectorDB provider for index "${vectorIndex.Name}"`,
|
|
@@ -88,15 +106,24 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
88
106
|
|
|
89
107
|
// Providers that keep their vectors in MJ, keyed by EntityDocumentID (the in-process
|
|
90
108
|
// SimpleVectorServiceProvider), can't be listed through QueryIndex: they key by the
|
|
91
|
-
// document ID rather than the index name,
|
|
92
|
-
//
|
|
109
|
+
// document ID rather than the index name, and return matches without vector values.
|
|
110
|
+
// Read the stored Entity Record Document rows instead.
|
|
93
111
|
if (vectorDBInstance.QueryKeyIsEntityDocumentID) {
|
|
94
|
-
const
|
|
95
|
-
const results = await this.fetchStoredVectors(entityDoc, limit, filter, currentUser, md);
|
|
112
|
+
const results = await this.fetchStoredVectors(entityDoc, limit, filter, currentUser, md, rv);
|
|
96
113
|
LogStatus(`FetchEntityVectors: Loaded ${results.length} stored vectors for entity "${entityDoc.Entity}" in ${Date.now() - startTime}ms`);
|
|
97
114
|
return { Success: true, Results: results, TotalCount: results.length, ElapsedMs: Date.now() - startTime };
|
|
98
115
|
}
|
|
99
116
|
|
|
117
|
+
// The external index was built under whoever ran the sync and is not filtered for this
|
|
118
|
+
// caller, so check here that they may read the source entity at all.
|
|
119
|
+
const entityInfo = this.readableEntity(entityDoc.Entity, currentUser, md);
|
|
120
|
+
if (!entityInfo) {
|
|
121
|
+
return this.errorResult(
|
|
122
|
+
`Entity "${entityDoc.Entity}" does not exist or you do not have permission to read it`,
|
|
123
|
+
startTime
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
100
127
|
// Step 4: Query with zero vector + Entity metadata filter.
|
|
101
128
|
// Pinecone's list API doesn't support metadata filtering, but query does.
|
|
102
129
|
// A zero vector returns results in arbitrary order (similarity is meaningless),
|
|
@@ -127,12 +154,15 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
127
154
|
);
|
|
128
155
|
}
|
|
129
156
|
|
|
130
|
-
// Step 5:
|
|
131
|
-
|
|
157
|
+
// Step 5: Keep only matches for records this caller may read (the index is not filtered
|
|
158
|
+
// by row-level security), then convert them without the fields this caller may not read
|
|
159
|
+
const allMatches = (queryResponse.data as { matches?: IndexMatch[] }).matches ?? [];
|
|
160
|
+
const matches = await this.readableMatches(entityInfo, allMatches, currentUser, rv);
|
|
161
|
+
const denied = entityInfo.GetDeniedReadFields(currentUser);
|
|
132
162
|
const results: EntityVectorItem[] = matches.map(match => ({
|
|
133
163
|
ID: match.id,
|
|
134
164
|
Values: match.values ?? [],
|
|
135
|
-
Metadata: JSON.stringify(match.metadata ?? {}),
|
|
165
|
+
Metadata: JSON.stringify(this.withoutDeniedFields(match.metadata ?? {}, denied)),
|
|
136
166
|
}));
|
|
137
167
|
LogStatus(`FetchEntityVectors: Queried ${results.length} vectors for entity "${entityName}" in ${Date.now() - startTime}ms`);
|
|
138
168
|
|
|
@@ -149,12 +179,100 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
149
179
|
}
|
|
150
180
|
}
|
|
151
181
|
|
|
182
|
+
/**
|
|
183
|
+
* The entity's metadata when `contextUser` may read it, else null — whether it is missing or
|
|
184
|
+
* unreadable is deliberately not distinguished.
|
|
185
|
+
*/
|
|
186
|
+
private readableEntity(entityName: string, contextUser: UserInfo, md: IMetadataProvider): EntityInfo | null {
|
|
187
|
+
const entityInfo = md.EntityByName(entityName);
|
|
188
|
+
if (!entityInfo) return null;
|
|
189
|
+
return entityInfo.GetUserPermisions(contextUser)?.CanRead ? entityInfo : null;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The matches whose record `contextUser` may read, in their original order. A match is kept only
|
|
194
|
+
* when its `RecordID` metadata names a key of the entity and a view run as `contextUser` returns
|
|
195
|
+
* that record; a match without a usable record ID cannot be checked, so it is dropped.
|
|
196
|
+
*/
|
|
197
|
+
private async readableMatches(entityInfo: EntityInfo, matches: IndexMatch[], contextUser: UserInfo, rv: RunView): Promise<IndexMatch[]> {
|
|
198
|
+
const keyed = matches
|
|
199
|
+
.map(match => ({ match, key: this.matchRecordKey(entityInfo, match) }))
|
|
200
|
+
.filter((m): m is { match: IndexMatch; key: CompositeKey } => m.key !== null);
|
|
201
|
+
if (keyed.length === 0) return [];
|
|
202
|
+
const readable = await this.loadReadableKeys(entityInfo, keyed.map(k => k.key), contextUser, rv);
|
|
203
|
+
return keyed.filter(k => readable.has(this.canonicalKey(k.key))).map(k => k.match);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** The record key a match's `RecordID` metadata names, or null when it names no key of the entity. */
|
|
207
|
+
private matchRecordKey(entityInfo: EntityInfo, match: IndexMatch): CompositeKey | null {
|
|
208
|
+
const recordID = match.metadata?.RecordID;
|
|
209
|
+
if (typeof recordID !== 'string' || recordID.length === 0) return null;
|
|
210
|
+
try {
|
|
211
|
+
return CompositeKey.FromRecordID(entityInfo, recordID);
|
|
212
|
+
} catch {
|
|
213
|
+
return null; // field names that are not the entity's primary key: never put into SQL
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* The canonical forms of the keys among `keys` whose record a view run as `contextUser` returns.
|
|
219
|
+
* The keys are checked in lists of at most {@link READABLE_KEY_CHECK_CHUNK_SIZE}, all sent in one
|
|
220
|
+
* `RunViews` batch.
|
|
221
|
+
*/
|
|
222
|
+
private async loadReadableKeys(entityInfo: EntityInfo, keys: CompositeKey[], contextUser: UserInfo, rv: RunView): Promise<Set<string>> {
|
|
223
|
+
const views: RunViewParams[] = [];
|
|
224
|
+
for (let i = 0; i < keys.length; i += READABLE_KEY_CHECK_CHUNK_SIZE) {
|
|
225
|
+
views.push({
|
|
226
|
+
EntityName: entityInfo.Name,
|
|
227
|
+
ExtraFilter: this.keyFilter(entityInfo, keys.slice(i, i + READABLE_KEY_CHECK_CHUNK_SIZE)),
|
|
228
|
+
Fields: entityInfo.PrimaryKeys.map(pk => pk.Name),
|
|
229
|
+
IgnoreMaxRows: true,
|
|
230
|
+
BypassCache: true, // one-off key lists: a cache slot per call would only hold memory
|
|
231
|
+
ResultType: 'simple',
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
const readable = new Set<string>();
|
|
235
|
+
const results = await rv.RunViews<Record<string, unknown>>(views, contextUser);
|
|
236
|
+
for (const result of results) {
|
|
237
|
+
if (!result.Success) {
|
|
238
|
+
throw new Error(`Failed to check access to "${entityInfo.Name}" records: ${result.ErrorMessage}`);
|
|
239
|
+
}
|
|
240
|
+
for (const row of result.Results) {
|
|
241
|
+
readable.add(this.canonicalKey(CompositeKey.FromEntityRecord(entityInfo, row)));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return readable;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** A filter matching exactly `keys`: `PK IN (...)` for a single-column key, one clause per key otherwise. */
|
|
248
|
+
private keyFilter(entityInfo: EntityInfo, keys: CompositeKey[]): string {
|
|
249
|
+
if (entityInfo.PrimaryKeys.length === 1) {
|
|
250
|
+
const values = keys.map(k => `'${EscapeSQLString(String(k.KeyValuePairs[0].Value))}'`).join(',');
|
|
251
|
+
return `${entityInfo.FirstPrimaryKey.Name} IN (${values})`; // first-pk-ok: single-column key, checked above
|
|
252
|
+
}
|
|
253
|
+
return keys.map(k => `(${k.ToWhereClause()})`).join(' OR ');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** A key's field names and values, lower-cased, so keys from the index and from a view compare equal. */
|
|
257
|
+
private canonicalKey(key: CompositeKey): string {
|
|
258
|
+
return key.KeyValuePairs.map(kv => `${kv.FieldName.toLowerCase()}|${String(kv.Value).toLowerCase()}`).join('||');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* A copy of a vector's metadata without the keys naming fields in `denied` (lowercased field
|
|
263
|
+
* names, as `EntityInfo.GetDeniedReadFields` returns them), compared case-insensitively.
|
|
264
|
+
*/
|
|
265
|
+
private withoutDeniedFields(metadata: Record<string, unknown>, denied: Set<string>): Record<string, unknown> {
|
|
266
|
+
if (denied.size === 0) return metadata;
|
|
267
|
+
return Object.fromEntries(Object.entries(metadata).filter(([key]) => !denied.has(key.toLowerCase())));
|
|
268
|
+
}
|
|
269
|
+
|
|
152
270
|
/** Load EntityDocument by ID */
|
|
153
271
|
private async loadEntityDocument(
|
|
154
272
|
entityDocumentID: string,
|
|
155
|
-
contextUser: UserInfo
|
|
273
|
+
contextUser: UserInfo,
|
|
274
|
+
rv: RunView
|
|
156
275
|
): Promise<MJEntityDocumentEntity | null> {
|
|
157
|
-
const rv = new RunView();
|
|
158
276
|
const result = await rv.RunView<MJEntityDocumentEntity>({
|
|
159
277
|
EntityName: 'MJ: Entity Documents',
|
|
160
278
|
ExtraFilter: `ID='${EscapeSQLString(entityDocumentID)}'`,
|
|
@@ -174,9 +292,9 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
174
292
|
*/
|
|
175
293
|
private async resolveVectorIndex(
|
|
176
294
|
entityDoc: MJEntityDocumentEntity,
|
|
177
|
-
contextUser: UserInfo
|
|
295
|
+
contextUser: UserInfo,
|
|
296
|
+
rv: RunView
|
|
178
297
|
): Promise<MJVectorIndexEntity | null> {
|
|
179
|
-
const rv = new RunView();
|
|
180
298
|
|
|
181
299
|
// If the EntityDocument has an explicit VectorIndexID, use it directly
|
|
182
300
|
if (entityDoc.VectorIndexID) {
|
|
@@ -213,9 +331,9 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
213
331
|
/** Create a VectorDBBase provider instance for a given VectorIndex */
|
|
214
332
|
private async createVectorDBInstance(
|
|
215
333
|
vectorIndex: MJVectorIndexEntity,
|
|
216
|
-
contextUser: UserInfo
|
|
334
|
+
contextUser: UserInfo,
|
|
335
|
+
rv: RunView
|
|
217
336
|
): Promise<VectorDBBase | null> {
|
|
218
|
-
const rv = new RunView();
|
|
219
337
|
const dbResult = await rv.RunView<MJVectorDatabaseEntity>({
|
|
220
338
|
EntityName: 'MJ: Vector Databases',
|
|
221
339
|
ExtraFilter: `ID='${vectorIndex.VectorDatabaseID}'`,
|
|
@@ -249,69 +367,144 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
249
367
|
limit: number,
|
|
250
368
|
filter: string | undefined,
|
|
251
369
|
contextUser: UserInfo,
|
|
252
|
-
md: IMetadataProvider
|
|
370
|
+
md: IMetadataProvider,
|
|
371
|
+
rv: RunView
|
|
253
372
|
): Promise<EntityVectorItem[]> {
|
|
254
373
|
const entityInfo = md.EntityByName(entityDoc.Entity);
|
|
255
374
|
if (!entityInfo) {
|
|
256
375
|
throw new Error(`Entity "${entityDoc.Entity}" not found in metadata`);
|
|
257
376
|
}
|
|
258
|
-
const
|
|
259
|
-
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
IgnoreMaxRows: true,
|
|
266
|
-
ResultType: 'simple',
|
|
267
|
-
}, contextUser);
|
|
268
|
-
if (!docResult.Success) {
|
|
269
|
-
throw new Error(`Failed to load stored vectors: ${docResult.ErrorMessage}`);
|
|
270
|
-
}
|
|
377
|
+
const nameFields = this.labelFieldNames(entityInfo);
|
|
378
|
+
const { records, vectors } = await this.loadRecordsAndStoredVectors(entityInfo, entityDoc, nameFields, filter, contextUser, rv);
|
|
379
|
+
const labelsByRecordID = this.mapRecordLabels(entityInfo, nameFields, records);
|
|
380
|
+
|
|
381
|
+
// VectorJSON is the heavy column: list without it, then fetch it only for the items returned.
|
|
382
|
+
const chosen = this.selectLabelledVectors(vectors, labelsByRecordID, limit);
|
|
383
|
+
const valuesByID = await this.loadVectorValues(chosen.map(c => c.row.ID), contextUser, rv);
|
|
271
384
|
|
|
272
385
|
const results: EntityVectorItem[] = [];
|
|
273
|
-
for (const row of
|
|
274
|
-
const
|
|
275
|
-
if (!
|
|
386
|
+
for (const { row, labels } of chosen) {
|
|
387
|
+
const vectorJSON = valuesByID.get(row.ID);
|
|
388
|
+
if (!vectorJSON) continue; // removed or cleared since the listing
|
|
276
389
|
results.push({
|
|
277
390
|
ID: row.ID,
|
|
278
|
-
Values: JSON.parse(
|
|
391
|
+
Values: JSON.parse(vectorJSON) as number[],
|
|
279
392
|
Metadata: JSON.stringify({ Entity: entityDoc.Entity, RecordID: row.RecordID, ...labels }),
|
|
280
393
|
});
|
|
281
|
-
if (results.length >= limit) break;
|
|
282
394
|
}
|
|
283
395
|
return results;
|
|
284
396
|
}
|
|
285
397
|
|
|
398
|
+
/** The first `limit` stored vectors whose record was loaded, in listing order. */
|
|
399
|
+
private selectLabelledVectors(
|
|
400
|
+
vectors: StoredVectorRow[],
|
|
401
|
+
labelsByRecordID: Map<string, Record<string, string>>,
|
|
402
|
+
limit: number
|
|
403
|
+
): LabelledVector[] {
|
|
404
|
+
const chosen: LabelledVector[] = [];
|
|
405
|
+
for (const row of vectors) {
|
|
406
|
+
if (chosen.length >= limit) break;
|
|
407
|
+
const labels = labelsByRecordID.get(row.RecordID.toLowerCase());
|
|
408
|
+
if (!labels) continue; // filtered out, not readable by this user, or the record no longer exists
|
|
409
|
+
chosen.push({ row, labels });
|
|
410
|
+
}
|
|
411
|
+
return chosen;
|
|
412
|
+
}
|
|
413
|
+
|
|
286
414
|
/**
|
|
287
|
-
*
|
|
288
|
-
*
|
|
415
|
+
* Fetch `VectorJSON` for the given Entity Record Document IDs, keyed by ID. The ID lists are
|
|
416
|
+
* capped at {@link VECTOR_FETCH_CHUNK_SIZE} per view and all sent in one `RunViews` batch.
|
|
289
417
|
*/
|
|
290
|
-
private async
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
418
|
+
private async loadVectorValues(ids: string[], contextUser: UserInfo, rv: RunView): Promise<Map<string, string>> {
|
|
419
|
+
const valuesByID = new Map<string, string>();
|
|
420
|
+
if (ids.length === 0) return valuesByID;
|
|
421
|
+
|
|
422
|
+
const views: RunViewParams[] = [];
|
|
423
|
+
for (let i = 0; i < ids.length; i += VECTOR_FETCH_CHUNK_SIZE) {
|
|
424
|
+
const idList = ids.slice(i, i + VECTOR_FETCH_CHUNK_SIZE).map(id => `'${EscapeSQLString(id)}'`).join(',');
|
|
425
|
+
views.push({
|
|
426
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
427
|
+
ExtraFilter: `ID IN (${idList})`,
|
|
428
|
+
Fields: ['ID', 'VectorJSON'],
|
|
429
|
+
IgnoreMaxRows: true,
|
|
430
|
+
BypassCache: true, // one-off ID lists: a cache slot per call would only hold memory
|
|
431
|
+
ResultType: 'simple',
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
const results = await rv.RunViews<{ ID: string; VectorJSON: string | null }>(views, contextUser);
|
|
435
|
+
for (const result of results) {
|
|
436
|
+
if (!result.Success) {
|
|
437
|
+
throw new Error(`Failed to load vector values: ${result.ErrorMessage}`);
|
|
438
|
+
}
|
|
439
|
+
for (const row of result.Results) {
|
|
440
|
+
if (row.VectorJSON) valuesByID.set(row.ID, row.VectorJSON);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
return valuesByID;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/** The fields a stored vector is labelled with: the entity's name fields, else its NameField. */
|
|
447
|
+
private labelFieldNames(entityInfo: EntityInfo): string[] {
|
|
295
448
|
const nameFields = entityInfo.Fields.filter(f => f.IsNameField).map(f => f.Name);
|
|
296
449
|
if (nameFields.length === 0 && entityInfo.NameField) {
|
|
297
450
|
nameFields.push(entityInfo.NameField.Name);
|
|
298
451
|
}
|
|
299
|
-
|
|
452
|
+
return nameFields;
|
|
453
|
+
}
|
|
300
454
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
455
|
+
/**
|
|
456
|
+
* Load the records that pass `filter` (key and name fields only) and the list of the document's
|
|
457
|
+
* stored vectors (ID and RecordID, no VectorJSON). The two views don't depend on each other, so
|
|
458
|
+
* they go in one `RunViews` round trip.
|
|
459
|
+
*/
|
|
460
|
+
private async loadRecordsAndStoredVectors(
|
|
461
|
+
entityInfo: EntityInfo,
|
|
462
|
+
entityDoc: MJEntityDocumentEntity,
|
|
463
|
+
nameFields: string[],
|
|
464
|
+
filter: string | undefined,
|
|
465
|
+
contextUser: UserInfo,
|
|
466
|
+
rv: RunView
|
|
467
|
+
): Promise<{ records: Record<string, unknown>[]; vectors: StoredVectorRow[] }> {
|
|
468
|
+
const keyFields = entityInfo.PrimaryKeys.map(pk => pk.Name);
|
|
469
|
+
const [recordResult, docResult] = await rv.RunViews<Record<string, unknown>>([
|
|
470
|
+
{
|
|
471
|
+
EntityName: entityInfo.Name,
|
|
472
|
+
ExtraFilter: filter || undefined,
|
|
473
|
+
Fields: [...new Set([...keyFields, ...nameFields])],
|
|
474
|
+
IgnoreMaxRows: true,
|
|
475
|
+
ResultType: 'simple',
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
479
|
+
ExtraFilter: `EntityDocumentID='${EscapeSQLString(entityDoc.ID)}' AND VectorJSON IS NOT NULL`,
|
|
480
|
+
Fields: ['ID', 'RecordID'],
|
|
481
|
+
IgnoreMaxRows: true,
|
|
482
|
+
// A cached RunView fetches every column so its slot can serve any field set, which
|
|
483
|
+
// would pull each vector's VectorJSON here. Bypass the cache so Fields is honoured.
|
|
484
|
+
BypassCache: true,
|
|
485
|
+
ResultType: 'simple',
|
|
486
|
+
},
|
|
487
|
+
], contextUser);
|
|
488
|
+
if (!recordResult.Success) {
|
|
489
|
+
throw new Error(`Failed to load "${entityInfo.Name}" records: ${recordResult.ErrorMessage}`);
|
|
490
|
+
}
|
|
491
|
+
if (!docResult.Success) {
|
|
492
|
+
throw new Error(`Failed to load stored vectors: ${docResult.ErrorMessage}`);
|
|
311
493
|
}
|
|
494
|
+
return { records: recordResult.Results, vectors: docResult.Results as StoredVectorRow[] };
|
|
495
|
+
}
|
|
312
496
|
|
|
497
|
+
/**
|
|
498
|
+
* Map each loaded record to its name-field values, keyed by the same compact record-ID form
|
|
499
|
+
* the vector sync writes to `MJ: Entity Record Documents.RecordID` (lower-cased).
|
|
500
|
+
*/
|
|
501
|
+
private mapRecordLabels(
|
|
502
|
+
entityInfo: EntityInfo,
|
|
503
|
+
nameFields: string[],
|
|
504
|
+
rows: Record<string, unknown>[]
|
|
505
|
+
): Map<string, Record<string, string>> {
|
|
313
506
|
const map = new Map<string, Record<string, string>>();
|
|
314
|
-
for (const row of
|
|
507
|
+
for (const row of rows) {
|
|
315
508
|
const key = CompositeKey.FromEntityRecord(entityInfo, row).ToCompactURLSegment().toLowerCase();
|
|
316
509
|
const labels: Record<string, string> = {};
|
|
317
510
|
for (const name of nameFields) {
|
|
@@ -34,6 +34,7 @@ export class FileCategoryResolver extends FileCategoryResolverBase {
|
|
|
34
34
|
fileCategoryEntity.CheckPermissions(EntityPermissionType.Delete, true);
|
|
35
35
|
|
|
36
36
|
await fileCategoryEntity.Load(ID);
|
|
37
|
+
// fls-guard: loaded as the caller; width follows its user
|
|
37
38
|
const returnValue = fileCategoryEntity.GetAll();
|
|
38
39
|
|
|
39
40
|
// Any files using the deleted category fall back to its parent
|