@memberjunction/server 6.2.0-edge.3 → 6.2.0-edge.5
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 +20 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/BridgeHostInstance.d.ts +25 -0
- package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -0
- package/dist/agentSessions/BridgeHostInstance.js +30 -0
- package/dist/agentSessions/BridgeHostInstance.js.map +1 -0
- package/dist/agentSessions/HostInstance.d.ts +75 -11
- package/dist/agentSessions/HostInstance.d.ts.map +1 -1
- package/dist/agentSessions/HostInstance.js +99 -28
- package/dist/agentSessions/HostInstance.js.map +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.js +7 -3
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +236 -27
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +682 -54
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +48 -3
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +112 -9
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/agentSessions/SessionRunIDVerifier.d.ts +63 -0
- package/dist/agentSessions/SessionRunIDVerifier.d.ts.map +1 -0
- package/dist/agentSessions/SessionRunIDVerifier.js +129 -0
- package/dist/agentSessions/SessionRunIDVerifier.js.map +1 -0
- package/dist/agentSessions/index.d.ts +2 -0
- package/dist/agentSessions/index.d.ts.map +1 -1
- package/dist/agentSessions/index.js +10 -3
- package/dist/agentSessions/index.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 +25 -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/actionAuthorization.d.ts +40 -0
- package/dist/auth/actionAuthorization.d.ts.map +1 -0
- package/dist/auth/actionAuthorization.js +94 -0
- package/dist/auth/actionAuthorization.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 +4 -10
- package/dist/auth/index.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/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +6 -3
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/newUsers.d.ts +10 -0
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +80 -11
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/config.d.ts +2514 -22
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +166 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +8 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +14 -11
- 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 +142 -0
- package/dist/coreRoutes.js.map +1 -0
- package/dist/generated/graphql-schemas/__mj.d.ts +504 -3
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +2456 -7
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +43 -8
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +59 -19
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/PushStatusResolver.js +1 -1
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +123 -48
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +293 -305
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +16 -0
- package/dist/generic/RunViewResolver.js.map +1 -1
- 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 +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +219 -278
- package/dist/index.js.map +1 -1
- package/dist/isolatedProvider.d.ts +20 -0
- package/dist/isolatedProvider.d.ts.map +1 -0
- package/dist/isolatedProvider.js +22 -0
- package/dist/isolatedProvider.js.map +1 -0
- 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/realtimeProxy/RealtimeProxyServer.d.ts +44 -4
- package/dist/realtimeProxy/RealtimeProxyServer.d.ts.map +1 -1
- package/dist/realtimeProxy/RealtimeProxyServer.js +121 -16
- package/dist/realtimeProxy/RealtimeProxyServer.js.map +1 -1
- package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts +171 -0
- package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts.map +1 -0
- package/dist/realtimeProxy/RealtimeRelayTunnel.js +532 -0
- package/dist/realtimeProxy/RealtimeRelayTunnel.js.map +1 -0
- package/dist/realtimeSessions/RealtimeSessionEventService.d.ts +148 -0
- package/dist/realtimeSessions/RealtimeSessionEventService.d.ts.map +1 -0
- package/dist/realtimeSessions/RealtimeSessionEventService.js +191 -0
- package/dist/realtimeSessions/RealtimeSessionEventService.js.map +1 -0
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts +66 -0
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -0
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js +139 -0
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts +38 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.js +99 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -0
- 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 +61 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js +149 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -0
- package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts +57 -0
- package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts.map +1 -0
- package/dist/realtimeSessions/SlidingWindowRateLimiter.js +69 -0
- package/dist/realtimeSessions/SlidingWindowRateLimiter.js.map +1 -0
- package/dist/realtimeSessions/index.d.ts +19 -0
- package/dist/realtimeSessions/index.d.ts.map +1 -0
- package/dist/realtimeSessions/index.js +19 -0
- package/dist/realtimeSessions/index.js.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +30 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js +47 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
- package/dist/realtimeSessions/sessionAccess.d.ts +92 -0
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
- package/dist/realtimeSessions/sessionAccess.js +94 -0
- package/dist/realtimeSessions/sessionAccess.js.map +1 -0
- package/dist/realtimeSessions/sessionConfigStamps.d.ts +70 -0
- package/dist/realtimeSessions/sessionConfigStamps.d.ts.map +1 -0
- package/dist/realtimeSessions/sessionConfigStamps.js +93 -0
- package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -0
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts +65 -0
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -0
- package/dist/realtimeSessions/subscriptionAuthorization.js +71 -0
- package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -0
- package/dist/realtimeSessions/verificationCore.d.ts +243 -0
- package/dist/realtimeSessions/verificationCore.d.ts.map +1 -0
- package/dist/realtimeSessions/verificationCore.js +356 -0
- package/dist/realtimeSessions/verificationCore.js.map +1 -0
- package/dist/realtimeSessions/verificationPages.d.ts +66 -0
- package/dist/realtimeSessions/verificationPages.d.ts.map +1 -0
- package/dist/realtimeSessions/verificationPages.js +110 -0
- package/dist/realtimeSessions/verificationPages.js.map +1 -0
- package/dist/realtimeSessions/verificationPolicy.d.ts +147 -0
- package/dist/realtimeSessions/verificationPolicy.d.ts.map +1 -0
- package/dist/realtimeSessions/verificationPolicy.js +249 -0
- package/dist/realtimeSessions/verificationPolicy.js.map +1 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts +263 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -0
- package/dist/realtimeSessions/verificationWorkflow.js +435 -0
- package/dist/realtimeSessions/verificationWorkflow.js.map +1 -0
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +20 -2
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +31 -2
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +31 -5
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +75 -14
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts +14 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +21 -5
- package/dist/resolvers/AdhocQueryResolver.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/CacheStatsResolver.d.ts +27 -0
- package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -1
- package/dist/resolvers/CacheStatsResolver.js +113 -2
- package/dist/resolvers/CacheStatsResolver.js.map +1 -1
- package/dist/resolvers/ClientToolRequestResolver.d.ts +4 -2
- package/dist/resolvers/ClientToolRequestResolver.d.ts.map +1 -1
- package/dist/resolvers/ClientToolRequestResolver.js +28 -10
- package/dist/resolvers/ClientToolRequestResolver.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/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 +27 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +148 -2
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +82 -11
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +279 -101
- 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/HumanHandoffResolver.d.ts.map +1 -1
- package/dist/resolvers/HumanHandoffResolver.js +7 -1
- package/dist/resolvers/HumanHandoffResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +4 -2
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +9 -4
- package/dist/resolvers/MCPResolver.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 +13 -0
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts +54 -2
- package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +155 -10
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +157 -33
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +404 -116
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RealtimeSessionEventsResolver.d.ts +61 -0
- package/dist/resolvers/RealtimeSessionEventsResolver.d.ts.map +1 -0
- package/dist/resolvers/RealtimeSessionEventsResolver.js +130 -0
- package/dist/resolvers/RealtimeSessionEventsResolver.js.map +1 -0
- package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts +85 -0
- package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts.map +1 -0
- package/dist/resolvers/RealtimeSessionVerificationResolver.js +188 -0
- package/dist/resolvers/RealtimeSessionVerificationResolver.js.map +1 -0
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +10 -0
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +100 -14
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +12 -11
- package/dist/resolvers/RunTemplateResolver.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 +6 -2
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +2 -0
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +23 -6
- package/dist/resolvers/SyncRolesUsersResolver.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 +65 -13
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +19 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +102 -24
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserAvatarResolver.d.ts +16 -0
- package/dist/resolvers/UserAvatarResolver.d.ts.map +1 -0
- package/dist/resolvers/UserAvatarResolver.js +124 -0
- package/dist/resolvers/UserAvatarResolver.js.map +1 -0
- package/dist/resolvers/UserResolver.d.ts.map +1 -1
- package/dist/resolvers/UserResolver.js +2 -17
- package/dist/resolvers/UserResolver.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/resolvers/agentVisionConsentAudit.d.ts +37 -0
- package/dist/resolvers/agentVisionConsentAudit.d.ts.map +1 -0
- package/dist/resolvers/agentVisionConsentAudit.js +63 -0
- package/dist/resolvers/agentVisionConsentAudit.js.map +1 -0
- package/dist/resolvers/avatarInputValidation.d.ts +40 -0
- package/dist/resolvers/avatarInputValidation.d.ts.map +1 -0
- package/dist/resolvers/avatarInputValidation.js +97 -0
- package/dist/resolvers/avatarInputValidation.js.map +1 -0
- package/dist/resolvers/currentUserRoles.d.ts +29 -0
- package/dist/resolvers/currentUserRoles.d.ts.map +1 -1
- package/dist/resolvers/currentUserRoles.js +30 -0
- package/dist/resolvers/currentUserRoles.js.map +1 -1
- package/dist/resolvers/meetings/meetingMutations.d.ts +6 -0
- package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -1
- package/dist/resolvers/meetings/meetingMutations.js +21 -0
- package/dist/resolvers/meetings/meetingMutations.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 +3 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +21 -12
- 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/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 +57 -4
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +607 -18
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/sharedCache.d.ts +105 -0
- package/dist/sharedCache.d.ts.map +1 -0
- package/dist/sharedCache.js +279 -0
- package/dist/sharedCache.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +99 -96
- package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
- package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
- package/src/__tests__/BridgeHostInstance.test.ts +232 -0
- package/src/__tests__/ClientToolRequestResolver.test.ts +116 -0
- package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
- package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +433 -0
- package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
- package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
- package/src/__tests__/HostInstance.test.ts +84 -0
- package/src/__tests__/HumanHandoffResolver.test.ts +17 -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__/MeetingResolver.test.ts +75 -1
- package/src/__tests__/RealtimeBridgeResolver.test.ts +415 -6
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +682 -58
- package/src/__tests__/RealtimeProxyServer.test.ts +16 -1
- package/src/__tests__/RealtimeRelay.test.ts +876 -0
- package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
- package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
- package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
- 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 +212 -6
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
- package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +170 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +6 -4
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +258 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +166 -0
- package/src/__tests__/RunTemplateResolver.test.ts +132 -0
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +63 -0
- package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
- package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
- package/src/__tests__/SessionJanitor.test.ts +1203 -21
- package/src/__tests__/SessionManager.test.ts +240 -17
- package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
- package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
- package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +403 -22
- package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
- package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
- package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
- package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
- package/src/__tests__/UserAvatarResolver.test.ts +255 -0
- package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
- package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
- package/src/__tests__/actionAuthorization.test.ts +130 -0
- package/src/__tests__/agent-run-data-guard.test.ts +130 -0
- package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
- package/src/__tests__/apiRootBoot.test.ts +202 -0
- package/src/__tests__/avatarInputValidation.test.ts +160 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +64 -0
- package/src/__tests__/conversationRunEvents.test.ts +56 -14
- package/src/__tests__/globalCors.test.ts +217 -0
- package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
- package/src/__tests__/magicLinkService.consume.test.ts +6 -0
- package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -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__/newUsers.template.test.ts +151 -0
- package/src/__tests__/newUsers.test.ts +74 -5
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +17 -2
- package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +7 -0
- package/src/__tests__/realtimeRecordingHandler.test.ts +652 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionEventService.test.ts +201 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +215 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionVerificationResolver.test.ts +102 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionVerificationService.test.ts +349 -0
- package/src/__tests__/realtimeSessions/RealtimeVerifyRouter.test.ts +131 -0
- package/src/__tests__/realtimeSessions/SlidingWindowRateLimiter.test.ts +56 -0
- package/src/__tests__/realtimeSessions/helpers.ts +4 -0
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +129 -0
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +124 -0
- package/src/__tests__/realtimeSessions/verificationCore.test.ts +355 -0
- package/src/__tests__/realtimeSessions/verificationPages.test.ts +84 -0
- package/src/__tests__/realtimeSessions/verificationPolicy.test.ts +226 -0
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +633 -0
- package/src/__tests__/resolverBase.fls.test.ts +87 -4
- package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
- package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -96
- package/src/__tests__/sharedCache.test.ts +312 -0
- package/src/__tests__/widgetGuestElevation.test.ts +44 -0
- package/src/agentSessions/BridgeHostInstance.ts +32 -0
- package/src/agentSessions/HostInstance.ts +124 -28
- package/src/agentSessions/ReturningVisitorRecap.ts +7 -3
- package/src/agentSessions/SessionJanitor.ts +821 -59
- package/src/agentSessions/SessionManager.ts +138 -26
- package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
- package/src/agentSessions/index.ts +10 -3
- package/src/apiRoot.ts +78 -0
- package/src/auth/AuthProviderCatalogRouter.ts +26 -0
- package/src/auth/LoginScreenEngine.ts +50 -0
- package/src/auth/actionAuthorization.ts +116 -0
- package/src/auth/index.ts +4 -8
- package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
- package/src/auth/magicLink/MagicLinkService.ts +6 -3
- package/src/auth/newUsers.ts +99 -11
- package/src/config.ts +171 -5
- package/src/context.ts +15 -10
- package/src/coreRoutes.ts +166 -0
- package/src/generated/graphql-schemas/__mj.ts +1815 -57
- package/src/generic/CacheInvalidationResolver.ts +73 -18
- package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
- package/src/generic/PushStatusResolver.ts +1 -1
- package/src/generic/ResolverBase.ts +335 -326
- package/src/generic/RunViewResolver.ts +21 -0
- package/src/globalCors.ts +71 -0
- package/src/index.ts +231 -300
- package/src/isolatedProvider.ts +22 -0
- package/src/multiTenancy/index.ts +24 -2
- package/src/realtimeProxy/RealtimeProxyServer.ts +148 -16
- package/src/realtimeProxy/RealtimeRelayTunnel.ts +645 -0
- package/src/realtimeSessions/README.md +179 -0
- package/src/realtimeSessions/RealtimeSessionEventService.ts +274 -0
- package/src/realtimeSessions/RealtimeSessionVerificationService.ts +168 -0
- package/src/realtimeSessions/RealtimeVerifyRouter.ts +109 -0
- package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
- package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
- package/src/realtimeSessions/index.ts +18 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +55 -0
- package/src/realtimeSessions/sessionAccess.ts +145 -0
- package/src/realtimeSessions/sessionConfigStamps.ts +123 -0
- package/src/realtimeSessions/subscriptionAuthorization.ts +116 -0
- package/src/realtimeSessions/verificationCore.ts +502 -0
- package/src/realtimeSessions/verificationPages.ts +149 -0
- package/src/realtimeSessions/verificationPolicy.ts +321 -0
- package/src/realtimeSessions/verificationWorkflow.ts +702 -0
- package/src/realtimeWidget/widgetGuestElevation.ts +34 -2
- package/src/resolvers/ActionResolver.ts +84 -21
- package/src/resolvers/AdhocQueryResolver.ts +24 -6
- package/src/resolvers/ArtifactFileResolver.ts +9 -8
- package/src/resolvers/CacheStatsResolver.ts +89 -2
- package/src/resolvers/ClientToolRequestResolver.ts +25 -7
- package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
- package/src/resolvers/DatasetResolver.ts +70 -10
- package/src/resolvers/EntityRecordNameResolver.ts +3 -2
- package/src/resolvers/FetchEntityVectorsResolver.ts +179 -2
- package/src/resolvers/FileResolver.ts +321 -106
- package/src/resolvers/GetDataContextDataResolver.ts +139 -41
- package/src/resolvers/GetDataResolver.ts +6 -3
- package/src/resolvers/HumanHandoffResolver.ts +8 -0
- package/src/resolvers/IntegrationDiscoveryResolver.ts +4 -2
- package/src/resolvers/MCPResolver.ts +8 -5
- package/src/resolvers/QueryResolver.ts +11 -0
- package/src/resolvers/RealtimeBridgeResolver.ts +163 -11
- package/src/resolvers/RealtimeClientSessionResolver.ts +511 -129
- package/src/resolvers/RealtimeSessionEventsResolver.ts +133 -0
- package/src/resolvers/RealtimeSessionVerificationResolver.ts +174 -0
- package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
- package/src/resolvers/RunAIAgentResolver.ts +116 -14
- package/src/resolvers/RunTemplateResolver.ts +13 -12
- package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
- package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
- package/src/resolvers/SyncDataResolver.ts +6 -2
- package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
- package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
- package/src/resolvers/TestQuerySQLResolver.ts +68 -13
- package/src/resolvers/TransactionGroupResolver.ts +131 -27
- package/src/resolvers/UserAvatarResolver.ts +111 -0
- package/src/resolvers/UserResolver.ts +2 -16
- package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
- package/src/resolvers/agent-run-data-guard.ts +89 -0
- package/src/resolvers/agentVisionConsentAudit.ts +82 -0
- package/src/resolvers/avatarInputValidation.ts +123 -0
- package/src/resolvers/currentUserRoles.ts +32 -1
- package/src/resolvers/meetings/meetingMutations.ts +21 -0
- package/src/rest/RealtimeRecordingHandler.ts +464 -0
- package/src/rest/ViewOperationsHandler.ts +29 -13
- package/src/rest/setupRESTEndpoints.ts +6 -0
- package/src/serverExtensionReservedRoots.ts +14 -17
- 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 +713 -17
- package/src/sharedCache.ts +305 -0
- package/src/types.ts +7 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Arg, Ctx, Field, InputType, Int, ObjectType, Query, Resolver } from 'type-graphql';
|
|
2
|
-
import { AppContext } from '../types.js';
|
|
3
|
-
import { LogError, Metadata } from '@memberjunction/core';
|
|
2
|
+
import { AppContext, UserPayload } from '../types.js';
|
|
3
|
+
import { DatabaseProviderBase, DatasetItemFilterType, DatasetItemResultType, LogError, Metadata, UserInfo } from '@memberjunction/core';
|
|
4
4
|
import { GetReadOnlyProvider } from '../util.js';
|
|
5
5
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
6
6
|
|
|
@@ -34,9 +34,64 @@ export class DatasetItemFilterTypeGQL {
|
|
|
34
34
|
Filter: string;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* Request handling shared by the dataset queries. Every read runs as the session's user, so the
|
|
39
|
+
* provider applies that user's entity read permission and row-level security per item, and every
|
|
40
|
+
* client ItemFilter passes the same AST screen as a RunView ExtraFilter before a provider sees it.
|
|
41
|
+
*/
|
|
42
|
+
export abstract class DatasetResolverBase extends ResolverBase {
|
|
43
|
+
/** The session's user. A dataset read never runs without one: the provider applies no read checks then. */
|
|
44
|
+
protected RequireDatasetUser(userPayload: UserPayload): UserInfo {
|
|
45
|
+
const user = this.GetUserFromPayload(userPayload);
|
|
46
|
+
if (!user) {
|
|
47
|
+
throw new Error('Dataset request refused: the session resolves to no user');
|
|
48
|
+
}
|
|
49
|
+
return user;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Screens every client ItemFilter: one statement, read-only, and subqueries only over entity base
|
|
54
|
+
* views the user can read. Throws on the first refusal. Returns the filters without null entries.
|
|
55
|
+
*/
|
|
56
|
+
protected ScreenItemFilters(
|
|
57
|
+
itemFilters: DatasetItemFilterTypeGQL[] | undefined,
|
|
58
|
+
provider: DatabaseProviderBase,
|
|
59
|
+
user: UserInfo,
|
|
60
|
+
): DatasetItemFilterType[] | undefined {
|
|
61
|
+
if (!itemFilters) return undefined;
|
|
62
|
+
itemFilters.forEach((itemFilter, index) => {
|
|
63
|
+
if (itemFilter) {
|
|
64
|
+
this.assertClientClauseUsesEntityBaseViews(itemFilter.Filter, `ItemFilters[${index}].Filter`, provider, user);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return itemFilters.filter((itemFilter) => itemFilter != null);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Applies the API encryption policy to each item's rows, as every other GraphQL read path does:
|
|
72
|
+
* an encrypted field the entity does not allow decrypted over the API leaves as ciphertext or the
|
|
73
|
+
* sentinel. Works on copies, because the rows can be the server cache's own frozen objects.
|
|
74
|
+
*/
|
|
75
|
+
protected async ProtectEncryptedFields(
|
|
76
|
+
items: DatasetItemResultType[],
|
|
77
|
+
provider: DatabaseProviderBase,
|
|
78
|
+
user: UserInfo,
|
|
79
|
+
): Promise<DatasetItemResultType[]> {
|
|
80
|
+
return Promise.all(
|
|
81
|
+
items.map(async (item) => {
|
|
82
|
+
const entity = provider.EntityByName(item.EntityName);
|
|
83
|
+
if (!item.Results?.length || !entity?.EncryptedFields.some((field) => !field.AllowDecryptInAPI)) {
|
|
84
|
+
return item;
|
|
85
|
+
}
|
|
86
|
+
const rows = item.Results.map((row: Record<string, unknown>) => ({ ...row }));
|
|
87
|
+
return { ...item, Results: await this.ArrayFilterEncryptedFieldsForAPI(item.EntityName, rows, user, provider, 'Name') };
|
|
88
|
+
}),
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
37
92
|
|
|
38
93
|
@Resolver(DatasetResultType)
|
|
39
|
-
export class DatasetResolverExtended extends
|
|
94
|
+
export class DatasetResolverExtended extends DatasetResolverBase {
|
|
40
95
|
@Query(() => DatasetResultType)
|
|
41
96
|
async GetDatasetByName(
|
|
42
97
|
@Arg('DatasetName', () => String) DatasetName: string,
|
|
@@ -45,10 +100,12 @@ export class DatasetResolverExtended extends ResolverBase {
|
|
|
45
100
|
) {
|
|
46
101
|
// Check API key scope authorization for dataset read
|
|
47
102
|
await this.CheckAPIKeyScopeAuthorization('dataset:read', DatasetName, userPayload);
|
|
103
|
+
const md = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true});
|
|
104
|
+
const user = this.RequireDatasetUser(userPayload);
|
|
105
|
+
const itemFilters = this.ScreenItemFilters(ItemFilters, md, user);
|
|
48
106
|
|
|
49
107
|
try {
|
|
50
|
-
const
|
|
51
|
-
const result = await md.GetDatasetByName(DatasetName, ItemFilters);
|
|
108
|
+
const result = await md.GetDatasetByName(DatasetName, itemFilters, user);
|
|
52
109
|
if (result) {
|
|
53
110
|
return {
|
|
54
111
|
DatasetID: result.DatasetID,
|
|
@@ -56,7 +113,7 @@ export class DatasetResolverExtended extends ResolverBase {
|
|
|
56
113
|
Success: result.Success,
|
|
57
114
|
Status: result.Status,
|
|
58
115
|
LatestUpdateDate: result.LatestUpdateDate,
|
|
59
|
-
Results: JSON.stringify(result.Results),
|
|
116
|
+
Results: JSON.stringify(await this.ProtectEncryptedFields(result.Results, md, user)),
|
|
60
117
|
};
|
|
61
118
|
} else {
|
|
62
119
|
throw new Error('Error retrieving Dataset: ' + DatasetName);
|
|
@@ -90,7 +147,7 @@ export class DatasetStatusResultType {
|
|
|
90
147
|
}
|
|
91
148
|
|
|
92
149
|
@Resolver(DatasetStatusResultType)
|
|
93
|
-
export class DatasetStatusResolver extends
|
|
150
|
+
export class DatasetStatusResolver extends DatasetResolverBase {
|
|
94
151
|
@Query(() => DatasetStatusResultType)
|
|
95
152
|
async GetDatasetStatusByName(
|
|
96
153
|
@Arg('DatasetName', () => String) DatasetName: string,
|
|
@@ -99,10 +156,12 @@ export class DatasetStatusResolver extends ResolverBase {
|
|
|
99
156
|
) {
|
|
100
157
|
// Check API key scope authorization for dataset read
|
|
101
158
|
await this.CheckAPIKeyScopeAuthorization('dataset:read', DatasetName, userPayload);
|
|
159
|
+
const md = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true});
|
|
160
|
+
const user = this.RequireDatasetUser(userPayload);
|
|
161
|
+
const itemFilters = this.ScreenItemFilters(ItemFilters, md, user);
|
|
102
162
|
|
|
103
163
|
try {
|
|
104
|
-
const
|
|
105
|
-
const result = await md.GetDatasetStatusByName(DatasetName, ItemFilters);
|
|
164
|
+
const result = await md.GetDatasetStatusByName(DatasetName, itemFilters, user);
|
|
106
165
|
if (result) {
|
|
107
166
|
return {
|
|
108
167
|
DatasetID: result.DatasetID,
|
|
@@ -131,12 +190,13 @@ export class DatasetStatusResolver extends ResolverBase {
|
|
|
131
190
|
@Ctx() { providers, userPayload }: AppContext,
|
|
132
191
|
): Promise<DatasetStatusResultType[]> {
|
|
133
192
|
const md = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true});
|
|
193
|
+
const user = this.RequireDatasetUser(userPayload);
|
|
134
194
|
const results: DatasetStatusResultType[] = [];
|
|
135
195
|
|
|
136
196
|
// Execute all status checks in parallel
|
|
137
197
|
const statusPromises = DatasetNames.map(async (name) => {
|
|
138
198
|
await this.CheckAPIKeyScopeAuthorization('dataset:read', name, userPayload);
|
|
139
|
-
return md.GetDatasetStatusByName(name);
|
|
199
|
+
return md.GetDatasetStatusByName(name, undefined, user);
|
|
140
200
|
});
|
|
141
201
|
|
|
142
202
|
const statuses = await Promise.all(statusPromises);
|
|
@@ -38,7 +38,8 @@ export class EntityRecordNameResult {
|
|
|
38
38
|
*
|
|
39
39
|
* Entity-level read permission is checked here ({@link ResolverBase.CheckUserReadPermissions}).
|
|
40
40
|
* Field- and row-level security are applied by the provider's lookup, for the acting user passed
|
|
41
|
-
* to it: when any field the name is built from is withheld, it answers with no name
|
|
41
|
+
* to it: when any field the name is built from is withheld, it answers with no name, and it reads
|
|
42
|
+
* only rows the user's read row filter allows. Without an acting user there is no lookup.
|
|
42
43
|
*
|
|
43
44
|
* A withheld name answers `Success: false` with the same status as a record that does not exist.
|
|
44
45
|
* Callers already treat "no name" as "show the primary key", and the identical answer keeps this
|
|
@@ -85,7 +86,7 @@ export class EntityRecordNameResolver extends ResolverBase {
|
|
|
85
86
|
if (e) {
|
|
86
87
|
const contextUser = userPayload ? this.GetUserFromPayload(userPayload) : undefined;
|
|
87
88
|
// The acting user is what field- and row-level security are applied for.
|
|
88
|
-
const recordName = await md.GetEntityRecordName(e.Name, pk, contextUser);
|
|
89
|
+
const recordName = contextUser ? await md.GetEntityRecordName(e.Name, pk, contextUser) : '';
|
|
89
90
|
if (recordName) return { Success: true, Status: 'OK', CompositeKey: pk, RecordName: recordName, EntityName };
|
|
90
91
|
else
|
|
91
92
|
return {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Resolver, Query, Arg, Ctx, ObjectType, Field, Float, Int } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import { 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
|
+
import { GetReadOnlyProvider } from '../util.js';
|
|
6
7
|
import { GetAIAPIKey } from '@memberjunction/ai';
|
|
7
8
|
import { VectorDBBase } from '@memberjunction/ai-vectordb';
|
|
8
9
|
import { AIEngine } from '@memberjunction/aiengine';
|
|
@@ -40,6 +41,15 @@ export class FetchEntityVectorsResult {
|
|
|
40
41
|
ErrorMessage?: string;
|
|
41
42
|
}
|
|
42
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
|
+
|
|
43
53
|
/* ───── Resolver ───── */
|
|
44
54
|
|
|
45
55
|
@Resolver()
|
|
@@ -50,7 +60,7 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
50
60
|
@Arg('entityDocumentID') entityDocumentID: string,
|
|
51
61
|
@Arg('maxRecords', () => Int, { nullable: true }) maxRecords: number | undefined,
|
|
52
62
|
@Arg('filter', { nullable: true }) filter: string | undefined,
|
|
53
|
-
@Ctx() { userPayload }: AppContext = {} as AppContext
|
|
63
|
+
@Ctx() { userPayload, providers }: AppContext = {} as AppContext
|
|
54
64
|
): Promise<FetchEntityVectorsResult> {
|
|
55
65
|
const startTime = Date.now();
|
|
56
66
|
try {
|
|
@@ -85,6 +95,17 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
85
95
|
);
|
|
86
96
|
}
|
|
87
97
|
|
|
98
|
+
// Providers that keep their vectors in MJ, keyed by EntityDocumentID (the in-process
|
|
99
|
+
// SimpleVectorServiceProvider), can't be listed through QueryIndex: they key by the
|
|
100
|
+
// document ID rather than the index name, and return matches without vector values.
|
|
101
|
+
// Read the stored Entity Record Document rows instead.
|
|
102
|
+
if (vectorDBInstance.QueryKeyIsEntityDocumentID) {
|
|
103
|
+
const md = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? Metadata.Provider;
|
|
104
|
+
const results = await this.fetchStoredVectors(entityDoc, limit, filter, currentUser, md);
|
|
105
|
+
LogStatus(`FetchEntityVectors: Loaded ${results.length} stored vectors for entity "${entityDoc.Entity}" in ${Date.now() - startTime}ms`);
|
|
106
|
+
return { Success: true, Results: results, TotalCount: results.length, ElapsedMs: Date.now() - startTime };
|
|
107
|
+
}
|
|
108
|
+
|
|
88
109
|
// Step 4: Query with zero vector + Entity metadata filter.
|
|
89
110
|
// Pinecone's list API doesn't support metadata filtering, but query does.
|
|
90
111
|
// A zero vector returns results in arbitrary order (similarity is meaningless),
|
|
@@ -227,6 +248,162 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
227
248
|
return instance;
|
|
228
249
|
}
|
|
229
250
|
|
|
251
|
+
/**
|
|
252
|
+
* Load the vectors an EntityDocument stored in MJ (`MJ: Entity Record Documents.VectorJSON`),
|
|
253
|
+
* restricted to the entity records that pass `filter`. Each item's metadata carries the entity
|
|
254
|
+
* name, the record ID and the record's name fields, which is what the cluster view labels from.
|
|
255
|
+
*/
|
|
256
|
+
private async fetchStoredVectors(
|
|
257
|
+
entityDoc: MJEntityDocumentEntity,
|
|
258
|
+
limit: number,
|
|
259
|
+
filter: string | undefined,
|
|
260
|
+
contextUser: UserInfo,
|
|
261
|
+
md: IMetadataProvider
|
|
262
|
+
): Promise<EntityVectorItem[]> {
|
|
263
|
+
const entityInfo = md.EntityByName(entityDoc.Entity);
|
|
264
|
+
if (!entityInfo) {
|
|
265
|
+
throw new Error(`Entity "${entityDoc.Entity}" not found in metadata`);
|
|
266
|
+
}
|
|
267
|
+
const nameFields = this.labelFieldNames(entityInfo);
|
|
268
|
+
const { records, vectors } = await this.loadRecordsAndStoredVectors(entityInfo, entityDoc, nameFields, filter, contextUser);
|
|
269
|
+
const labelsByRecordID = this.mapRecordLabels(entityInfo, nameFields, records);
|
|
270
|
+
|
|
271
|
+
// VectorJSON is the heavy column: list without it, then fetch it only for the items returned.
|
|
272
|
+
const chosen = this.selectLabelledVectors(vectors, labelsByRecordID, limit);
|
|
273
|
+
const valuesByID = await this.loadVectorValues(chosen.map(c => c.row.ID), contextUser);
|
|
274
|
+
|
|
275
|
+
const results: EntityVectorItem[] = [];
|
|
276
|
+
for (const { row, labels } of chosen) {
|
|
277
|
+
const vectorJSON = valuesByID.get(row.ID);
|
|
278
|
+
if (!vectorJSON) continue; // removed or cleared since the listing
|
|
279
|
+
results.push({
|
|
280
|
+
ID: row.ID,
|
|
281
|
+
Values: JSON.parse(vectorJSON) as number[],
|
|
282
|
+
Metadata: JSON.stringify({ Entity: entityDoc.Entity, RecordID: row.RecordID, ...labels }),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
return results;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/** The first `limit` stored vectors whose record was loaded, in listing order. */
|
|
289
|
+
private selectLabelledVectors(
|
|
290
|
+
vectors: StoredVectorRow[],
|
|
291
|
+
labelsByRecordID: Map<string, Record<string, string>>,
|
|
292
|
+
limit: number
|
|
293
|
+
): LabelledVector[] {
|
|
294
|
+
const chosen: LabelledVector[] = [];
|
|
295
|
+
for (const row of vectors) {
|
|
296
|
+
if (chosen.length >= limit) break;
|
|
297
|
+
const labels = labelsByRecordID.get(row.RecordID.toLowerCase());
|
|
298
|
+
if (!labels) continue; // filtered out, not readable by this user, or the record no longer exists
|
|
299
|
+
chosen.push({ row, labels });
|
|
300
|
+
}
|
|
301
|
+
return chosen;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Fetch `VectorJSON` for the given Entity Record Document IDs, keyed by ID. The ID lists are
|
|
306
|
+
* capped at {@link VECTOR_FETCH_CHUNK_SIZE} per view and all sent in one `RunViews` batch.
|
|
307
|
+
*/
|
|
308
|
+
private async loadVectorValues(ids: string[], contextUser: UserInfo): Promise<Map<string, string>> {
|
|
309
|
+
const valuesByID = new Map<string, string>();
|
|
310
|
+
if (ids.length === 0) return valuesByID;
|
|
311
|
+
|
|
312
|
+
const views: RunViewParams[] = [];
|
|
313
|
+
for (let i = 0; i < ids.length; i += VECTOR_FETCH_CHUNK_SIZE) {
|
|
314
|
+
const idList = ids.slice(i, i + VECTOR_FETCH_CHUNK_SIZE).map(id => `'${EscapeSQLString(id)}'`).join(',');
|
|
315
|
+
views.push({
|
|
316
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
317
|
+
ExtraFilter: `ID IN (${idList})`,
|
|
318
|
+
Fields: ['ID', 'VectorJSON'],
|
|
319
|
+
IgnoreMaxRows: true,
|
|
320
|
+
BypassCache: true, // one-off ID lists: a cache slot per call would only hold memory
|
|
321
|
+
ResultType: 'simple',
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
const results = await new RunView().RunViews<{ ID: string; VectorJSON: string | null }>(views, contextUser);
|
|
325
|
+
for (const result of results) {
|
|
326
|
+
if (!result.Success) {
|
|
327
|
+
throw new Error(`Failed to load vector values: ${result.ErrorMessage}`);
|
|
328
|
+
}
|
|
329
|
+
for (const row of result.Results) {
|
|
330
|
+
if (row.VectorJSON) valuesByID.set(row.ID, row.VectorJSON);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return valuesByID;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** The fields a stored vector is labelled with: the entity's name fields, else its NameField. */
|
|
337
|
+
private labelFieldNames(entityInfo: EntityInfo): string[] {
|
|
338
|
+
const nameFields = entityInfo.Fields.filter(f => f.IsNameField).map(f => f.Name);
|
|
339
|
+
if (nameFields.length === 0 && entityInfo.NameField) {
|
|
340
|
+
nameFields.push(entityInfo.NameField.Name);
|
|
341
|
+
}
|
|
342
|
+
return nameFields;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Load the records that pass `filter` (key and name fields only) and the list of the document's
|
|
347
|
+
* stored vectors (ID and RecordID, no VectorJSON). The two views don't depend on each other, so
|
|
348
|
+
* they go in one `RunViews` round trip.
|
|
349
|
+
*/
|
|
350
|
+
private async loadRecordsAndStoredVectors(
|
|
351
|
+
entityInfo: EntityInfo,
|
|
352
|
+
entityDoc: MJEntityDocumentEntity,
|
|
353
|
+
nameFields: string[],
|
|
354
|
+
filter: string | undefined,
|
|
355
|
+
contextUser: UserInfo
|
|
356
|
+
): Promise<{ records: Record<string, unknown>[]; vectors: StoredVectorRow[] }> {
|
|
357
|
+
const keyFields = entityInfo.PrimaryKeys.map(pk => pk.Name);
|
|
358
|
+
const [recordResult, docResult] = await new RunView().RunViews<Record<string, unknown>>([
|
|
359
|
+
{
|
|
360
|
+
EntityName: entityInfo.Name,
|
|
361
|
+
ExtraFilter: filter || undefined,
|
|
362
|
+
Fields: [...new Set([...keyFields, ...nameFields])],
|
|
363
|
+
IgnoreMaxRows: true,
|
|
364
|
+
ResultType: 'simple',
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
EntityName: 'MJ: Entity Record Documents',
|
|
368
|
+
ExtraFilter: `EntityDocumentID='${EscapeSQLString(entityDoc.ID)}' AND VectorJSON IS NOT NULL`,
|
|
369
|
+
Fields: ['ID', 'RecordID'],
|
|
370
|
+
IgnoreMaxRows: true,
|
|
371
|
+
// A cached RunView fetches every column so its slot can serve any field set, which
|
|
372
|
+
// would pull each vector's VectorJSON here. Bypass the cache so Fields is honoured.
|
|
373
|
+
BypassCache: true,
|
|
374
|
+
ResultType: 'simple',
|
|
375
|
+
},
|
|
376
|
+
], contextUser);
|
|
377
|
+
if (!recordResult.Success) {
|
|
378
|
+
throw new Error(`Failed to load "${entityInfo.Name}" records: ${recordResult.ErrorMessage}`);
|
|
379
|
+
}
|
|
380
|
+
if (!docResult.Success) {
|
|
381
|
+
throw new Error(`Failed to load stored vectors: ${docResult.ErrorMessage}`);
|
|
382
|
+
}
|
|
383
|
+
return { records: recordResult.Results, vectors: docResult.Results as StoredVectorRow[] };
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Map each loaded record to its name-field values, keyed by the same compact record-ID form
|
|
388
|
+
* the vector sync writes to `MJ: Entity Record Documents.RecordID` (lower-cased).
|
|
389
|
+
*/
|
|
390
|
+
private mapRecordLabels(
|
|
391
|
+
entityInfo: EntityInfo,
|
|
392
|
+
nameFields: string[],
|
|
393
|
+
rows: Record<string, unknown>[]
|
|
394
|
+
): Map<string, Record<string, string>> {
|
|
395
|
+
const map = new Map<string, Record<string, string>>();
|
|
396
|
+
for (const row of rows) {
|
|
397
|
+
const key = CompositeKey.FromEntityRecord(entityInfo, row).ToCompactURLSegment().toLowerCase();
|
|
398
|
+
const labels: Record<string, string> = {};
|
|
399
|
+
for (const name of nameFields) {
|
|
400
|
+
if (row[name] != null) labels[name] = String(row[name]);
|
|
401
|
+
}
|
|
402
|
+
map.set(key, labels);
|
|
403
|
+
}
|
|
404
|
+
return map;
|
|
405
|
+
}
|
|
406
|
+
|
|
230
407
|
private errorResult(message: string, startTime: number): FetchEntityVectorsResult {
|
|
231
408
|
return {
|
|
232
409
|
Success: false,
|