@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
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// type-graphql decorators on the resolver class need the reflect-metadata polyfill.
|
|
2
|
+
import 'reflect-metadata';
|
|
3
|
+
|
|
4
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
5
|
+
import type { MockInstance } from 'vitest';
|
|
6
|
+
import { SQLExpressionValidator } from '@memberjunction/global';
|
|
7
|
+
|
|
8
|
+
const { executedSQL } = vi.hoisted(() => ({ executedSQL: [] as string[] }));
|
|
9
|
+
|
|
10
|
+
// GetData's server bootstrap, provider, auth and driver imports are replaced so the resolver runs
|
|
11
|
+
// offline. The fake driver records every text it is asked to run.
|
|
12
|
+
vi.mock('../../index.js', () => ({ GetDbType: () => 'sqlserver' }));
|
|
13
|
+
vi.mock('@memberjunction/generic-database-provider', () => ({
|
|
14
|
+
QueryCompositionEngine: class {
|
|
15
|
+
HasCompositionTokens(): boolean {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
}));
|
|
20
|
+
vi.mock('../../util.js', () => ({ GetReadOnlyDataSource: () => ({}), GetReadOnlyProvider: () => null }));
|
|
21
|
+
vi.mock('../../auth/index.js', () => ({ GetSystemUser: async () => ({}) }));
|
|
22
|
+
vi.mock('mssql', () => ({
|
|
23
|
+
default: {
|
|
24
|
+
Request: class {
|
|
25
|
+
async query(text: string): Promise<{ recordset: Array<Record<string, unknown>> }> {
|
|
26
|
+
executedSQL.push(text);
|
|
27
|
+
return { recordset: [] };
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
import { GetDataResolver, GetDataInputType, GetDataOutputType, RegisterAccessToken } from '../GetDataResolver.js';
|
|
34
|
+
import type { AppContext } from '../../types.js';
|
|
35
|
+
|
|
36
|
+
const CONTEXT = { dataSources: [] } as unknown as AppContext;
|
|
37
|
+
|
|
38
|
+
let tokenSeq = 0;
|
|
39
|
+
|
|
40
|
+
/** Calls GetData with a fresh valid token. */
|
|
41
|
+
async function runGetData(queries: string[]): Promise<GetDataOutputType> {
|
|
42
|
+
const token = `getdata-validation-${Date.now()}-${++tokenSeq}`;
|
|
43
|
+
RegisterAccessToken(token, 60_000);
|
|
44
|
+
const input = Object.assign(new GetDataInputType(), { Token: token, Queries: queries });
|
|
45
|
+
return new GetDataResolver().GetData(input, CONTEXT);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** The text of every call to the validator's `validate` method. */
|
|
49
|
+
function validatedTexts(spy: MockInstance<SQLExpressionValidator['validate']>): string[] {
|
|
50
|
+
return spy.mock.calls.map(([text]) => text);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
describe('GetData runs exactly the SQL it validated', () => {
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
executedSQL.length = 0;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it('validates and runs the same text when the query contains backslash sequences', async () => {
|
|
59
|
+
const query = String.raw`SELECT Name FROM __mj.vwFiles WHERE Path = 'C:\new\temp'`;
|
|
60
|
+
const validateSpy = vi.spyOn(SQLExpressionValidator.Instance, 'validate');
|
|
61
|
+
|
|
62
|
+
const output = await runGetData([query]);
|
|
63
|
+
|
|
64
|
+
expect(output.ErrorMessages).toEqual([null]);
|
|
65
|
+
expect(executedSQL).toEqual(validatedTexts(validateSpy));
|
|
66
|
+
expect(executedSQL).toEqual([query]);
|
|
67
|
+
expect(validateSpy).toHaveBeenCalledWith(query, { context: 'full_query', Dialect: 'sqlserver' });
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('runs the trimmed text that the validator reads', async () => {
|
|
71
|
+
const validateSpy = vi.spyOn(SQLExpressionValidator.Instance, 'validate');
|
|
72
|
+
|
|
73
|
+
const output = await runGetData(['\n SELECT 1 AS One \n']);
|
|
74
|
+
|
|
75
|
+
expect(output.ErrorMessages).toEqual([null]);
|
|
76
|
+
expect(executedSQL).toEqual(['SELECT 1 AS One']);
|
|
77
|
+
expect(validatedTexts(validateSpy)).toEqual(executedSQL);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('refuses a query whose text, as written, does not open with SELECT or WITH', async () => {
|
|
81
|
+
const output = await runGetData(["-- note\\n SELECT 1\nPRINT 'hello'"]);
|
|
82
|
+
|
|
83
|
+
expect(executedSQL).toEqual([]);
|
|
84
|
+
expect(output.Success).toBe(false);
|
|
85
|
+
expect(output.ErrorMessages[0]).toMatch(/must start with SELECT or WITH/);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('does not run a refused query and still runs the others', async () => {
|
|
89
|
+
const output = await runGetData(['SELECT 1; SELECT 2', 'SELECT 1 AS One']);
|
|
90
|
+
|
|
91
|
+
expect(executedSQL).toEqual(['SELECT 1 AS One']);
|
|
92
|
+
expect(output.ErrorMessages[0]).toMatch(/Semicolons are not allowed/);
|
|
93
|
+
expect(output.ErrorMessages[1]).toBeNull();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
@@ -90,4 +90,47 @@ describe('RecordDependencyResolver', () => {
|
|
|
90
90
|
expect(result[0].IsSoftLink).toBeUndefined();
|
|
91
91
|
expect(result[0].EntityIDFieldName).toBeUndefined();
|
|
92
92
|
});
|
|
93
|
+
|
|
94
|
+
it('forwards contextUser and options to provider and maps FieldDisplayName', async () => {
|
|
95
|
+
const mockDep: RecordDependency = {
|
|
96
|
+
EntityName: 'Users',
|
|
97
|
+
RelatedEntityName: 'MJ: Task Links',
|
|
98
|
+
FieldName: 'RecordID',
|
|
99
|
+
FieldDisplayName: 'Linked Record',
|
|
100
|
+
PrimaryKey: new CompositeKey([new KeyValuePair('ID', 'TL-200')]),
|
|
101
|
+
IsSoftLink: true,
|
|
102
|
+
EntityIDFieldName: 'EntityID',
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const getRecordDepsSpy = vi.fn().mockResolvedValue([mockDep]);
|
|
106
|
+
const mockProvider = {
|
|
107
|
+
GetRecordDependencies: getRecordDepsSpy,
|
|
108
|
+
} as unknown as IMetadataProvider;
|
|
109
|
+
|
|
110
|
+
vi.mocked(GetReadOnlyProvider).mockReturnValue(mockProvider as never);
|
|
111
|
+
|
|
112
|
+
const resolver = new RecordDependencyResolver();
|
|
113
|
+
const mockUser = { ID: 'u-1', Email: 'test@example.com' };
|
|
114
|
+
const mockContext = {
|
|
115
|
+
dataSource: {},
|
|
116
|
+
userPayload: { userRecord: mockUser },
|
|
117
|
+
providers: [],
|
|
118
|
+
} as unknown as AppContext;
|
|
119
|
+
const mockPubSub = {} as PubSubEngine;
|
|
120
|
+
const options = { LinkType: 'soft' as const, IncludeSystemEntities: false };
|
|
121
|
+
|
|
122
|
+
const result = await resolver.GetRecordDependencies(
|
|
123
|
+
'Users',
|
|
124
|
+
{ KeyValuePairs: [{ FieldName: 'ID', Value: 'USER-1' }] },
|
|
125
|
+
mockContext,
|
|
126
|
+
mockPubSub,
|
|
127
|
+
options
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
expect(getRecordDepsSpy).toHaveBeenCalledTimes(1);
|
|
131
|
+
expect(getRecordDepsSpy.mock.calls[0][0]).toBe('Users');
|
|
132
|
+
expect(getRecordDepsSpy.mock.calls[0][2]).toBe(mockUser);
|
|
133
|
+
expect(getRecordDepsSpy.mock.calls[0][3]).toEqual(options);
|
|
134
|
+
expect(result[0].FieldDisplayName).toBe('Linked Record');
|
|
135
|
+
});
|
|
93
136
|
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Decides which callers of the agent-run resolvers may set a run's scope or agent-type parameters
|
|
3
|
+
* through the free-form `data` argument.
|
|
4
|
+
*
|
|
5
|
+
* `BaseAgent` and `AgentRunner` read a few `ExecuteAgentParams.data` keys (`RESERVED_AGENT_RUN_DATA_KEYS` in
|
|
6
|
+
* `@memberjunction/ai-core-plus`) as fallbacks that change what a run is, not just what its prompt says:
|
|
7
|
+
* - `PrimaryScopeEntityName`, `PrimaryScopeRecordID`, `SecondaryScopes` decide the run's scope: which
|
|
8
|
+
* notes and examples memory is injected, the pre-execution RAG search context, the scoped prompt parts
|
|
9
|
+
* and run settings, the scope columns written on the `MJ: AI Agent Runs` row, and what sub-agents
|
|
10
|
+
* inherit. On a widget-guest run an explicit scope also beats the returning-visitor scope.
|
|
11
|
+
* - `__agentTypePromptParams` is the highest-precedence agent-type parameter layer. It can turn on the
|
|
12
|
+
* Loop type's `enableTaskGraphs` capability, and switch decisions on or off.
|
|
13
|
+
*
|
|
14
|
+
* The rule lives with the run, not here: `BaseAgent.Execute` drops those keys from every run's `data` unless the
|
|
15
|
+
* params set `ExecuteAgentParams.TrustReservedRunData`. The resolvers set that marker for the callers
|
|
16
|
+
* {@link IsTrustedAgentRunCaller} accepts — the system user, and an `mj_sk_*` API key that holds the
|
|
17
|
+
* {@link TRUSTED_RUN_DATA_SCOPE} scope — and never for a browser or a widget guest. Any user who may create API
|
|
18
|
+
* keys can mint one for themselves, so a key alone is not enough: an administrator grants the scope. Explorer never
|
|
19
|
+
* sends these keys. Everything else in `data` (template data, `conversationId`, `appContext`, `clientTools`, ...)
|
|
20
|
+
* reaches the run unchanged either way.
|
|
21
|
+
*
|
|
22
|
+
* @module @memberjunction/server/resolvers
|
|
23
|
+
*/
|
|
24
|
+
import { LogError } from '@memberjunction/core';
|
|
25
|
+
import { GetAPIKeyEngine } from '@memberjunction/api-keys';
|
|
26
|
+
import { UserCache } from '@memberjunction/generic-database-provider';
|
|
27
|
+
import type { UserPayload } from '../types.js';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The API-key scope (`MJ: API Scopes.FullPath`) that makes an `mj_sk_*` key a trusted integration for reserved run
|
|
31
|
+
* data. Checked against the agent being run, so a key can be trusted for some agents only. `full_access` does not
|
|
32
|
+
* imply it: the key must hold this scope itself.
|
|
33
|
+
*/
|
|
34
|
+
export const TRUSTED_RUN_DATA_SCOPE = 'agent:trusted';
|
|
35
|
+
|
|
36
|
+
/** Who sent a run's `data`, as far as {@link IsTrustedAgentRunCaller} needs to know. */
|
|
37
|
+
export interface ClientAgentRunCaller {
|
|
38
|
+
/**
|
|
39
|
+
* The request's authenticated payload, BEFORE any widget-guest elevation. `isSystemUser` is set only by
|
|
40
|
+
* the system API key (and by widget elevation, which {@link IsWidgetGuestRun} overrides); `apiKeyHash`
|
|
41
|
+
* only by an `mj_sk_*` user API key.
|
|
42
|
+
*/
|
|
43
|
+
UserPayload: Pick<UserPayload, 'email' | 'isSystemUser' | 'apiKeyHash'>;
|
|
44
|
+
/** True when the run executes under the widget-guest elevated principal. Such a run is never trusted. */
|
|
45
|
+
IsWidgetGuestRun: boolean;
|
|
46
|
+
/** The agent the caller asked to run: the resource the {@link TRUSTED_RUN_DATA_SCOPE} check is made against. */
|
|
47
|
+
AgentID: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Whether a caller may set the reserved run-data keys — the value the agent-run resolvers pass as
|
|
52
|
+
* `ExecuteAgentParams.TrustReservedRunData`: the system user, or an API key that holds
|
|
53
|
+
* {@link TRUSTED_RUN_DATA_SCOPE} for this agent, and never a widget-guest run, whatever principal it was elevated to.
|
|
54
|
+
* A key without the scope is treated like the browser session of the user it belongs to.
|
|
55
|
+
*
|
|
56
|
+
* @param caller - Who sent the run's `data`.
|
|
57
|
+
* @returns `true` when the run may read the reserved keys from `data`.
|
|
58
|
+
*/
|
|
59
|
+
export async function IsTrustedAgentRunCaller(caller: ClientAgentRunCaller): Promise<boolean> {
|
|
60
|
+
if (caller.IsWidgetGuestRun) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
if (caller.UserPayload.isSystemUser === true) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
const apiKeyHash = caller.UserPayload.apiKeyHash;
|
|
67
|
+
return apiKeyHash ? keyHoldsTrustedRunDataScope(apiKeyHash, caller.AgentID) : false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Whether the key explicitly holds {@link TRUSTED_RUN_DATA_SCOPE} for the agent. A key-level rule must match: an
|
|
72
|
+
* allow that comes from scope enforcement being switched off, or from `defaultBehaviorNoScopes: 'allow'`, matches
|
|
73
|
+
* no rule and does not count. Any failure counts as not held.
|
|
74
|
+
*/
|
|
75
|
+
async function keyHoldsTrustedRunDataScope(apiKeyHash: string, agentID: string): Promise<boolean> {
|
|
76
|
+
try {
|
|
77
|
+
const systemUser = UserCache.Instance.GetSystemUser();
|
|
78
|
+
if (!systemUser) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
// A probe, not an access decision (the run goes ahead either way), so it is not written to the usage log.
|
|
82
|
+
const result = await GetAPIKeyEngine().Authorize(apiKeyHash, 'MJAPI', TRUSTED_RUN_DATA_SCOPE, agentID, systemUser,
|
|
83
|
+
{ endpoint: '/graphql', method: 'POST' }, { skipLogging: true });
|
|
84
|
+
return result.Allowed && result.MatchedKeyRule != null;
|
|
85
|
+
} catch (e) {
|
|
86
|
+
LogError(`IsTrustedAgentRunCaller: the ${TRUSTED_RUN_DATA_SCOPE} check failed; the run is not trusted: ${e}`);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
-
BaseEntity, CompositeKey, EntityDeleteOptions, EntityPermissionType,
|
|
2
|
+
AssertClientInputWritableForUser, BaseEntity, CompositeKey, EntityDeleteOptions, EntityPermissionType,
|
|
3
3
|
EntitySaveOptions, LogError, Metadata, UserInfo
|
|
4
4
|
} from '@memberjunction/core';
|
|
5
|
+
import { ProjectValuesForCaller } from '../generic/fieldSecurityTransport.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Entity CRUD Implementation Functions for REST endpoints
|
|
@@ -42,6 +43,9 @@ export class EntityCRUDHandler {
|
|
|
42
43
|
delete data.options;
|
|
43
44
|
}
|
|
44
45
|
|
|
46
|
+
// Field-level security: refuse a key the caller may not read, or that names no field
|
|
47
|
+
AssertClientInputWritableForUser(entity.EntityInfo, data, user);
|
|
48
|
+
|
|
45
49
|
// Set values on the entity
|
|
46
50
|
for (const key in data) {
|
|
47
51
|
entity.Set(key, data[key]);
|
|
@@ -70,7 +74,7 @@ export class EntityCRUDHandler {
|
|
|
70
74
|
}
|
|
71
75
|
|
|
72
76
|
// Get entity data for response
|
|
73
|
-
const entityData = await
|
|
77
|
+
const entityData = await this.responseData(entity, user, md);
|
|
74
78
|
return { success: true, entity: entityData };
|
|
75
79
|
} catch (error: any) {
|
|
76
80
|
LogError(error);
|
|
@@ -114,7 +118,7 @@ export class EntityCRUDHandler {
|
|
|
114
118
|
}
|
|
115
119
|
|
|
116
120
|
// Get entity data for response
|
|
117
|
-
const entityData = await
|
|
121
|
+
const entityData = await this.responseData(entity, user, md);
|
|
118
122
|
return { success: true, entity: entityData };
|
|
119
123
|
} catch (error: any) {
|
|
120
124
|
LogError(error);
|
|
@@ -171,6 +175,9 @@ export class EntityCRUDHandler {
|
|
|
171
175
|
delete data.options;
|
|
172
176
|
}
|
|
173
177
|
|
|
178
|
+
// Field-level security: refuse a key the caller may not read, or that names no field
|
|
179
|
+
AssertClientInputWritableForUser(entity.EntityInfo, data, user);
|
|
180
|
+
|
|
174
181
|
// Update entity with new values
|
|
175
182
|
for (const key in data) {
|
|
176
183
|
entity.Set(key, data[key]);
|
|
@@ -179,7 +186,7 @@ export class EntityCRUDHandler {
|
|
|
179
186
|
// Check if entity is dirty
|
|
180
187
|
if (!entity.Dirty && !options.IgnoreDirtyState) {
|
|
181
188
|
// Nothing changed, return success
|
|
182
|
-
const entityData = await
|
|
189
|
+
const entityData = await this.responseData(entity, user, md);
|
|
183
190
|
return { success: true, entity: entityData };
|
|
184
191
|
}
|
|
185
192
|
|
|
@@ -206,7 +213,7 @@ export class EntityCRUDHandler {
|
|
|
206
213
|
}
|
|
207
214
|
|
|
208
215
|
// Get entity data for response
|
|
209
|
-
const entityData = await
|
|
216
|
+
const entityData = await this.responseData(entity, user, md);
|
|
210
217
|
return { success: true, entity: entityData };
|
|
211
218
|
} catch (error: any) {
|
|
212
219
|
LogError(error);
|
|
@@ -273,6 +280,16 @@ export class EntityCRUDHandler {
|
|
|
273
280
|
return this.DeleteEntity(entityName, id, options, user);
|
|
274
281
|
}
|
|
275
282
|
|
|
283
|
+
/**
|
|
284
|
+
* The record's field values for the response, reduced to what `user` may READ. An entity
|
|
285
|
+
* object built for a restricted user holds no denied value already; this is the backstop for
|
|
286
|
+
* one that does.
|
|
287
|
+
*/
|
|
288
|
+
private static async responseData(entity: BaseEntity, user: UserInfo, md: Metadata): Promise<Record<string, unknown>> {
|
|
289
|
+
// fls-guard: projected by ProjectValuesForCaller
|
|
290
|
+
return ProjectValuesForCaller(entity.EntityInfo, await entity.GetDataObject() as Record<string, unknown>, user, md);
|
|
291
|
+
}
|
|
292
|
+
|
|
276
293
|
/**
|
|
277
294
|
* Build the record key from the `:id` path segment. A single-column key (any column name) is
|
|
278
295
|
* the bare value; a composite key is the URL-encoded `Field1|Value1||Field2|Value2` segment.
|
|
@@ -2,7 +2,7 @@ import express from 'express';
|
|
|
2
2
|
import {
|
|
3
3
|
BaseEntity, CompositeKey, EntityDeleteOptions, EntityInfo,
|
|
4
4
|
EntityPermissionType, EntitySaveOptions, LogError, Metadata,
|
|
5
|
-
RunView, RunViewParams, UserInfo
|
|
5
|
+
RunView, RunViewParams, StripServerOnlyRunViewParams, UserInfo
|
|
6
6
|
} from '@memberjunction/core';
|
|
7
7
|
import { EntityCRUDHandler } from './EntityCRUDHandler.js';
|
|
8
8
|
import { ViewOperationsHandler } from './ViewOperationsHandler.js';
|
|
@@ -499,10 +499,11 @@ export class RESTEndpointHandler {
|
|
|
499
499
|
|
|
500
500
|
const user = req['mjUser'];
|
|
501
501
|
|
|
502
|
-
// Create RunViewParams from the request body
|
|
502
|
+
// Create RunViewParams from the request body, without the fields only server code sets;
|
|
503
|
+
// the time zone comes from the x-mj-timezone header, as on the GraphQL path
|
|
503
504
|
const params: RunViewParams = {
|
|
504
|
-
EntityName: entityName,
|
|
505
|
-
|
|
505
|
+
...StripServerOnlyRunViewParams({ ...viewParams, EntityName: entityName }),
|
|
506
|
+
TimeZone: req.userPayload?.TimeZone
|
|
506
507
|
};
|
|
507
508
|
|
|
508
509
|
const result = await ViewOperationsHandler.runView(params, user);
|
|
@@ -533,7 +534,9 @@ export class RESTEndpointHandler {
|
|
|
533
534
|
|
|
534
535
|
// Filter out any views for entities that aren't allowed
|
|
535
536
|
// using our enhanced entity filtering with wildcards and schema support
|
|
536
|
-
const filteredParams = params
|
|
537
|
+
const filteredParams = params
|
|
538
|
+
.filter(p => this.isEntityAllowed(p.EntityName))
|
|
539
|
+
.map(p => ({ ...StripServerOnlyRunViewParams(p), TimeZone: req.userPayload?.TimeZone }));
|
|
537
540
|
|
|
538
541
|
// If all requested entities were filtered out, return an error
|
|
539
542
|
if (filteredParams.length === 0 && params.length > 0) {
|