@memberjunction/server 6.2.0-edge.5 → 6.2.0-edge.7
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 +96 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
- package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
- package/dist/agentSessions/BridgeHostInstance.js +14 -4
- package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
- package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
- package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
- package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
- package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +34 -11
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +88 -44
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +29 -9
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +62 -16
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
- package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
- package/dist/agentSessions/conversationBrowsers.js +118 -0
- package/dist/agentSessions/conversationBrowsers.js.map +1 -0
- package/dist/agentSessions/sessionDeadline.d.ts +43 -0
- package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
- package/dist/agentSessions/sessionDeadline.js +68 -0
- package/dist/agentSessions/sessionDeadline.js.map +1 -0
- package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
- package/dist/auth/APIKeyScopeAuth.js +5 -4
- package/dist/auth/APIKeyScopeAuth.js.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +2 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +51 -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/loginEmailResolution.d.ts +41 -0
- package/dist/auth/loginEmailResolution.d.ts.map +1 -0
- package/dist/auth/loginEmailResolution.js +47 -0
- package/dist/auth/loginEmailResolution.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +221 -9
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/index.d.ts +1 -1
- package/dist/auth/magicLink/index.d.ts.map +1 -1
- package/dist/auth/magicLink/index.js +1 -1
- package/dist/auth/magicLink/index.js.map +1 -1
- package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
- package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
- package/dist/auth/magicLink/redeemLanding.js +7 -4
- package/dist/auth/magicLink/redeemLanding.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +39 -3
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/magicLink/types.js +0 -4
- package/dist/auth/magicLink/types.js.map +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +1 -0
- package/dist/auth/newUsers.js.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/backgroundSweepConfigUnits.d.ts +231 -0
- package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
- package/dist/backgroundSweepConfigUnits.js +180 -0
- package/dist/backgroundSweepConfigUnits.js.map +1 -0
- 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 +1402 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +5 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +64 -12
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +3 -1
- package/dist/coreRoutes.d.ts.map +1 -1
- package/dist/coreRoutes.js +20 -4
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +4167 -62
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +154 -79
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
- 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 +93 -11
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +114 -29
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +509 -220
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +15 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +126 -20
- 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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +262 -84
- package/dist/index.js.map +1 -1
- package/dist/integration/ConnectionPause.d.ts +121 -0
- package/dist/integration/ConnectionPause.d.ts.map +1 -0
- package/dist/integration/ConnectionPause.js +183 -0
- package/dist/integration/ConnectionPause.js.map +1 -0
- package/dist/integration/CustomColumnPromoter.d.ts +72 -6
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +93 -47
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/integration/EntityMapLifecycle.d.ts +78 -4
- package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
- package/dist/integration/EntityMapLifecycle.js +199 -5
- package/dist/integration/EntityMapLifecycle.js.map +1 -1
- package/dist/integration/InactiveRowWarnings.d.ts +31 -0
- package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
- package/dist/integration/InactiveRowWarnings.js +29 -0
- package/dist/integration/InactiveRowWarnings.js.map +1 -1
- package/dist/integration/ObjectNamesByID.d.ts +28 -0
- package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
- package/dist/integration/ObjectNamesByID.js +87 -0
- package/dist/integration/ObjectNamesByID.js.map +1 -0
- package/dist/integration/PostRestartIntrospect.d.ts +26 -0
- package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
- package/dist/integration/PostRestartIntrospect.js +27 -0
- package/dist/integration/PostRestartIntrospect.js.map +1 -0
- package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
- package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
- package/dist/integration/RSUPostRestartProgress.js +323 -0
- package/dist/integration/RSUPostRestartProgress.js.map +1 -0
- package/dist/integration/RSUProgressBridge.d.ts +41 -2
- package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
- package/dist/integration/RSUProgressBridge.js +84 -1
- package/dist/integration/RSUProgressBridge.js.map +1 -1
- package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
- package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
- package/dist/integration/RunArtifactAuthorization.js +45 -0
- package/dist/integration/RunArtifactAuthorization.js.map +1 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
- package/dist/integration/SchemaRefreshLaunch.js +3 -2
- package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
- package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
- package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
- package/dist/integration/ScopedFieldsForBuild.js +91 -0
- package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
- package/dist/integration/TargetConfigGuard.d.ts +40 -0
- package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
- package/dist/integration/TargetConfigGuard.js +40 -0
- package/dist/integration/TargetConfigGuard.js.map +1 -0
- 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/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/ownedRealtimeSession.d.ts +8 -6
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +147 -22
- 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 +203 -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/visitorIdentity.d.ts.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.js +1 -0
- package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +21 -8
- 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 +3 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/requestOrigin.d.ts +22 -0
- package/dist/requestOrigin.d.ts.map +1 -0
- package/dist/requestOrigin.js +60 -0
- package/dist/requestOrigin.js.map +1 -0
- 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 +44 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.js +2 -1
- package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
- package/dist/resolvers/ConversationRunEventsResolver.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/ExecuteRemoteOperationResolver.d.ts +6 -0
- package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
- package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
- package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
- 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 +5 -0
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +13 -4
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +34 -13
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +13 -2
- package/dist/resolvers/MCPResolver.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.map +1 -1
- package/dist/resolvers/QueryResolver.js +20 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +184 -88
- 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/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +388 -125
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +19 -18
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +7 -5
- 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/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +4 -0
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +1 -0
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +60 -15
- 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/meetingRecordingRegistration.d.ts.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.js +2 -0
- package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
- 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/MediaAccessKeys.d.ts.map +1 -1
- package/dist/rest/MediaAccessKeys.js +6 -2
- package/dist/rest/MediaAccessKeys.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +11 -5
- package/dist/rest/OAuthCallbackHandler.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 +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +6 -8
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +6 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +24 -6
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +3 -1
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +11 -2
- package/dist/rest/setupRESTEndpoints.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/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +2 -26
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +38 -0
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/services/WorkQueueHostService.d.ts +2 -1
- package/dist/services/WorkQueueHostService.d.ts.map +1 -1
- package/dist/services/WorkQueueHostService.js +19 -4
- package/dist/services/WorkQueueHostService.js.map +1 -1
- package/dist/services/workQueueConfig.d.ts +2 -2
- package/dist/services/workQueueConfig.js +5 -5
- package/dist/services/workQueueConfig.js.map +1 -1
- package/dist/sharedCache.js +1 -1
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +40 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +98 -98
- package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/ActiveOperations.test.ts +68 -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 +150 -0
- package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
- package/src/__tests__/BatchApplyParity.test.ts +109 -0
- package/src/__tests__/BridgeHostInstance.test.ts +42 -0
- package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
- package/src/__tests__/ConnectionPause.test.ts +192 -0
- package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
- package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
- package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
- package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
- package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
- package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
- package/src/__tests__/MagicLinkKeys.test.ts +102 -0
- package/src/__tests__/MediaAccessKeys.test.ts +57 -10
- package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
- package/src/__tests__/ObjectNamesByID.test.ts +176 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
- package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
- package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
- package/src/__tests__/RSUProgressBridge.test.ts +188 -5
- package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
- package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
- package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
- package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -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 +72 -13
- package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
- package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
- package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
- package/src/__tests__/SessionJanitor.test.ts +195 -4
- package/src/__tests__/SessionManager.test.ts +164 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
- package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/WorkQueueHostService.test.ts +25 -7
- package/src/__tests__/apiRootBoot.test.ts +1 -1
- package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
- package/src/__tests__/contextRequestOrigin.test.ts +105 -0
- package/src/__tests__/conversationBrowsers.test.ts +62 -0
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +3 -3
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
- package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
- 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 +224 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/requestOrigin.test.ts +104 -0
- 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__/securityHardeningPr6034.test.ts +120 -0
- package/src/__tests__/sessionDeadline.test.ts +51 -0
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/sharedCache.test.ts +11 -0
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +101 -1
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/BridgeHostInstance.ts +20 -5
- package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
- package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
- package/src/agentSessions/SessionJanitor.ts +95 -45
- package/src/agentSessions/SessionManager.ts +73 -20
- package/src/agentSessions/conversationBrowsers.ts +143 -0
- package/src/agentSessions/sessionDeadline.ts +81 -0
- package/src/auth/APIKeyScopeAuth.ts +5 -4
- package/src/auth/AuthProviderCatalogRouter.ts +3 -0
- package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
- package/src/auth/index.ts +56 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/loginEmailResolution.ts +67 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
- package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
- package/src/auth/magicLink/MagicLinkService.ts +250 -10
- package/src/auth/magicLink/index.ts +1 -1
- package/src/auth/magicLink/redeemLanding.ts +7 -4
- package/src/auth/magicLink/types.ts +38 -3
- package/src/auth/newUsers.ts +1 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/backgroundSweepConfigUnits.ts +213 -0
- 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 +138 -0
- package/src/context.ts +71 -14
- package/src/coreRoutes.ts +29 -7
- package/src/generated/graphql-schemas/__mj.ts +4145 -1193
- package/src/generic/CacheInvalidationResolver.ts +135 -78
- package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +108 -11
- package/src/generic/ResolverBase.ts +635 -234
- package/src/generic/RunViewResolver.ts +176 -64
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/index.ts +310 -85
- package/src/integration/ConnectionPause.ts +222 -0
- package/src/integration/CustomColumnPromoter.ts +129 -54
- package/src/integration/EntityMapLifecycle.ts +229 -6
- package/src/integration/InactiveRowWarnings.ts +50 -0
- package/src/integration/ObjectNamesByID.ts +97 -0
- package/src/integration/PostRestartIntrospect.ts +49 -0
- package/src/integration/RSUPostRestartProgress.ts +359 -0
- package/src/integration/RSUProgressBridge.ts +85 -2
- package/src/integration/RunArtifactAuthorization.ts +65 -0
- package/src/integration/SchemaRefreshLaunch.ts +12 -2
- package/src/integration/ScopedFieldsForBuild.ts +113 -0
- package/src/integration/TargetConfigGuard.ts +71 -0
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
- package/src/realtimeSessions/sessionAccess.ts +211 -25
- 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 +254 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/visitorIdentity.ts +1 -0
- package/src/realtimeWidget/widgetCore.ts +34 -9
- package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
- package/src/requestOrigin.ts +64 -0
- 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 +50 -18
- package/src/resolvers/AutotagPipelineResolver.ts +2 -1
- package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
- package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +14 -4
- package/src/resolvers/GetDataResolver.ts +35 -13
- package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
- package/src/resolvers/MCPResolver.ts +15 -2
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +20 -6
- package/src/resolvers/QuerySystemUserResolver.ts +207 -99
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
- package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
- package/src/resolvers/RunAIAgentResolver.ts +518 -163
- package/src/resolvers/RunAIPromptResolver.ts +18 -18
- package/src/resolvers/RunTemplateResolver.ts +9 -5
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TestQuerySQLResolver.ts +1 -0
- package/src/resolvers/TransactionGroupResolver.ts +66 -15
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/resolvers/meetingRecordingRegistration.ts +2 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/MediaAccessKeys.ts +6 -2
- package/src/rest/OAuthCallbackHandler.ts +13 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +9 -10
- package/src/rest/ViewOperationsHandler.ts +26 -7
- package/src/rest/setupRESTEndpoints.ts +11 -2
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
- package/src/services/TaskGraphActionRunner.ts +2 -23
- package/src/services/TaskGraphAgentRunner.ts +43 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
- package/src/services/WorkQueueHostService.ts +26 -4
- package/src/services/workQueueConfig.ts +5 -5
- package/src/sharedCache.ts +1 -1
- package/src/types.ts +41 -1
- package/src/services/TaskOrchestration-Integration.md +0 -188
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request-origin helpers shared by the GraphQL context (`AppContext.RequestOrigin`) and the realtime
|
|
3
|
+
* widget origin allowlist, so an origin read from a request and an origin read from an allowlist are
|
|
4
|
+
* normalized the same way and compare with plain string equality.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Shape of a serialized http(s) origin: scheme, host and optional port, with no path, query,
|
|
9
|
+
* fragment or credentials. Applied after {@link NormalizeOrigin}, so it only needs lowercase.
|
|
10
|
+
*/
|
|
11
|
+
const HTTP_ORIGIN_PATTERN = /^https?:\/\/[^/?#@\s]+$/;
|
|
12
|
+
|
|
13
|
+
/** Character code of `/`. */
|
|
14
|
+
const SLASH_CHAR_CODE = 47;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes an origin for stable comparison: trims whitespace, lowercases, and strips trailing
|
|
18
|
+
* slashes. It does not parse the value or rewrite ports, so `https://a.com:443` stays as written.
|
|
19
|
+
* @param origin an origin as written in a header or an allowlist entry
|
|
20
|
+
*/
|
|
21
|
+
export function NormalizeOrigin(origin: string): string {
|
|
22
|
+
return StripTrailingSlashes(origin.trim().toLowerCase());
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Removes trailing `/` characters with a linear scan. A `/\/+$/` regex is quadratic on input with
|
|
27
|
+
* many `/` not at the end, and this runs on a request header the client controls.
|
|
28
|
+
*/
|
|
29
|
+
function StripTrailingSlashes(value: string): string {
|
|
30
|
+
let end = value.length;
|
|
31
|
+
while (end > 0 && value.charCodeAt(end - 1) === SLASH_CHAR_CODE) {
|
|
32
|
+
end--;
|
|
33
|
+
}
|
|
34
|
+
return value.slice(0, end);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Reads a request's `Origin` header into a normalized origin (`scheme://host[:port]`).
|
|
39
|
+
*
|
|
40
|
+
* Returns undefined when the header is absent, repeated, blank, opaque (`null`, which sandboxed
|
|
41
|
+
* frames and privacy-sensitive redirects send), or anything other than a parseable http(s) origin.
|
|
42
|
+
* Ports are kept as sent: browsers omit default ports from `Origin`, and allowlist entries pass
|
|
43
|
+
* through the same {@link NormalizeOrigin}, so both sides agree without rewriting.
|
|
44
|
+
* @param originHeader the raw `Origin` header value from the request
|
|
45
|
+
*/
|
|
46
|
+
export function ReadRequestOrigin(originHeader: string | string[] | undefined): string | undefined {
|
|
47
|
+
if (typeof originHeader !== 'string') {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const normalized = NormalizeOrigin(originHeader);
|
|
51
|
+
return IsHttpOrigin(normalized) ? normalized : undefined;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** True when a normalized value is a parseable http(s) origin with no path, query, fragment or credentials. */
|
|
55
|
+
function IsHttpOrigin(normalized: string): boolean {
|
|
56
|
+
if (!HTTP_ORIGIN_PATTERN.test(normalized)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
return new URL(normalized).host.length > 0;
|
|
61
|
+
} catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { Resolver, Mutation, Arg, Ctx } from "type-graphql";
|
|
2
2
|
import { ActionEngineServer } from "@memberjunction/actions";
|
|
3
3
|
import { EntityActionEngineServer } from "@memberjunction/actions";
|
|
4
|
-
import { Metadata, UserInfo, BaseEntity, CompositeKey, KeyValuePair, LogError, RunView, DatabaseProviderBase } from "@memberjunction/core";
|
|
5
|
-
import { ActionParam, ActionResult, MJActionEntityExtended } from "@memberjunction/actions-base";
|
|
4
|
+
import { Metadata, UserInfo, BaseEntity, CompositeKey, KeyValuePair, LogError, RunView, DatabaseProviderBase, EntityInfo, IMetadataProvider } from "@memberjunction/core";
|
|
5
|
+
import { ActionParam, ActionResult, MJActionEntityExtended, ProjectActionParamValuesForUser } from "@memberjunction/actions-base";
|
|
6
6
|
import { UserCache } from "@memberjunction/generic-database-provider";
|
|
7
7
|
import { Field, InputType, ObjectType } from "type-graphql";
|
|
8
8
|
import { KeyValuePairInput } from "../generic/KeyValuePairInput.js";
|
|
9
9
|
import { AppContext, ProviderInfo } from "../types.js";
|
|
10
|
-
import { CopyScalarsAndArrays, EscapeSQLString, UUIDsEqual } from "@memberjunction/global";
|
|
10
|
+
import { CopyScalarsAndArrays, EscapeSQLString, IndexByUUID, UUIDsEqual } from "@memberjunction/global";
|
|
11
11
|
import { GetReadOnlyProvider, GetReadWriteProvider } from "../util.js";
|
|
12
12
|
import { ResolverBase } from "../generic/ResolverBase.js";
|
|
13
13
|
import { IsScopeLimitedPrincipal } from "../auth/scopeLimitedPrincipal.js";
|
|
14
14
|
import { EvaluateActionRunAuthorization, IsOwner } from "../auth/actionAuthorization.js";
|
|
15
|
+
import { EntityObjectDataBinding, ProjectActionParamsForCaller } from "../generic/actionOutputFieldSecurity.js";
|
|
16
|
+
import type { EntityActionResult } from "@memberjunction/actions-base";
|
|
15
17
|
|
|
16
18
|
/**
|
|
17
19
|
* Input type for action parameters
|
|
@@ -213,8 +215,8 @@ export class ActionResolver extends ResolverBase {
|
|
|
213
215
|
// params.Provider.SearchEntity) run against the caller's metadata layer.
|
|
214
216
|
const result = await this.executeAction(action, user, params, ctx.providers);
|
|
215
217
|
|
|
216
|
-
// Return the result
|
|
217
|
-
return this.createActionResult(result);
|
|
218
|
+
// Return the result, its output parameters projected for the caller
|
|
219
|
+
return this.createActionResult(result, user, ctx.providers);
|
|
218
220
|
} catch (e) {
|
|
219
221
|
return this.handleActionError(e);
|
|
220
222
|
}
|
|
@@ -357,20 +359,29 @@ export class ActionResolver extends ResolverBase {
|
|
|
357
359
|
}
|
|
358
360
|
|
|
359
361
|
/**
|
|
360
|
-
* Creates an action result from the execution result
|
|
362
|
+
* Creates an action result from the execution result. The output parameters are projected for
|
|
363
|
+
* the caller first (see {@link ProjectActionParamValuesForUser}): an action may return rows it
|
|
364
|
+
* did not load as the caller, such as engine-cached or system-user rows, so an entity object is
|
|
365
|
+
* sent as its field values projected for the caller and a plain row of a field-secured entity
|
|
366
|
+
* loses the keys the caller is denied. An entity object of an entity the caller cannot read is
|
|
367
|
+
* kept as it is, so `CopyScalarsAndArrays` drops it exactly as it always has.
|
|
361
368
|
* @param result The execution result
|
|
369
|
+
* @param user The caller the result is sent to
|
|
370
|
+
* @param providers The request's providers, for the entity metadata the projection reads
|
|
362
371
|
* @returns The formatted action result
|
|
363
372
|
* @private
|
|
364
373
|
*/
|
|
365
|
-
private createActionResult(result: ActionResult): ActionResultOutput {
|
|
366
|
-
const
|
|
374
|
+
private createActionResult(result: ActionResult, user: UserInfo, providers: Array<ProviderInfo>): ActionResultOutput {
|
|
375
|
+
const outputs = (result.Params || result.RunParams.Params || [])
|
|
367
376
|
.filter(p => p.Type.trim().toLowerCase() === 'output' ||
|
|
368
|
-
p.Type.trim().toLowerCase() === 'both')
|
|
377
|
+
p.Type.trim().toLowerCase() === 'both');
|
|
378
|
+
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? undefined;
|
|
379
|
+
const projected = ProjectActionParamValuesForUser(outputs, user, provider, { UnreadableEntityObjects: 'keep' }) ?? outputs;
|
|
369
380
|
return {
|
|
370
381
|
Success: result.Success,
|
|
371
382
|
Message: result.Message,
|
|
372
383
|
ResultCode: result.Result?.ResultCode,
|
|
373
|
-
ResultData:
|
|
384
|
+
ResultData: projected.length > 0 ? JSON.stringify(CopyScalarsAndArrays(projected)) : undefined
|
|
374
385
|
};
|
|
375
386
|
}
|
|
376
387
|
|
|
@@ -442,11 +453,11 @@ export class ActionResolver extends ResolverBase {
|
|
|
442
453
|
};
|
|
443
454
|
}
|
|
444
455
|
|
|
445
|
-
// Return the result
|
|
456
|
+
// Return the result, its echoed parameters projected for the caller
|
|
446
457
|
return {
|
|
447
458
|
Success: result.Success,
|
|
448
459
|
Message: result.Message,
|
|
449
|
-
ResultData: JSON.stringify(result)
|
|
460
|
+
ResultData: JSON.stringify(this.projectEntityActionResult(result, entityAction, params.EntityObject, user, ctx.providers))
|
|
450
461
|
};
|
|
451
462
|
} catch (e) {
|
|
452
463
|
return this.handleError(e);
|
|
@@ -513,13 +524,65 @@ export class ActionResolver extends ResolverBase {
|
|
|
513
524
|
throw new Error("Entity information is required");
|
|
514
525
|
}
|
|
515
526
|
|
|
516
|
-
// Create a composite key and load the entity object
|
|
527
|
+
// Create a composite key and load the entity object FOR THE CALLER: with no user the load
|
|
528
|
+
// falls back to the provider's current user, which on a server is the system user (every
|
|
529
|
+
// column, and none of the caller's row-level security).
|
|
517
530
|
const compositeKey = this.createCompositeKey(entity, input.PrimaryKey);
|
|
518
|
-
const entityObject = await md.GetEntityObject(entity.Name);
|
|
519
|
-
await entityObject.InnerLoad(compositeKey)
|
|
531
|
+
const entityObject = await md.GetEntityObject(entity.Name, user);
|
|
532
|
+
if (!await entityObject.InnerLoad(compositeKey)) {
|
|
533
|
+
// One message whether the record is missing or out of the caller's reach.
|
|
534
|
+
throw new Error('Record not found or access denied');
|
|
535
|
+
}
|
|
520
536
|
params['EntityObject'] = entityObject;
|
|
521
537
|
}
|
|
522
538
|
|
|
539
|
+
/**
|
|
540
|
+
* The entity action result as it may be sent to `user`: its parameters, which the result echoes
|
|
541
|
+
* (in `Params` and in `RunParams.Params`), projected for the caller wherever their entity is known.
|
|
542
|
+
* That is any entity object among them, and the parameters bound to the record's field values
|
|
543
|
+
* (`'Entity Object Data'`), whose entity is the bound record's. Any other value then passes the
|
|
544
|
+
* general backstop ({@link ProjectActionParamValuesForUser}), which narrows plain objects shaped
|
|
545
|
+
* like a row of a field-secured entity.
|
|
546
|
+
*/
|
|
547
|
+
private projectEntityActionResult(
|
|
548
|
+
result: EntityActionResult,
|
|
549
|
+
entityAction: { EntityID?: string; Params?: Array<{ ActionParamID: string; ValueType: string }> },
|
|
550
|
+
entityObject: BaseEntity | undefined,
|
|
551
|
+
user: UserInfo,
|
|
552
|
+
providers: Array<ProviderInfo>
|
|
553
|
+
): EntityActionResult {
|
|
554
|
+
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? undefined;
|
|
555
|
+
const binding = this.entityObjectDataBinding(entityAction, entityObject, provider);
|
|
556
|
+
const project = (params: ActionParam[]) =>
|
|
557
|
+
ProjectActionParamValuesForUser(ProjectActionParamsForCaller(params, user, provider, binding), user, provider, { UnreadableEntityObjects: 'keep' });
|
|
558
|
+
const projected: EntityActionResult = { ...result, Params: project(result.Params) };
|
|
559
|
+
if (result.RunParams) {
|
|
560
|
+
projected.RunParams = { ...result.RunParams, Params: project(result.RunParams.Params) };
|
|
561
|
+
}
|
|
562
|
+
return projected;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/** The action parameters bound as `'Entity Object Data'`, with the entity their values belong to. */
|
|
566
|
+
private entityObjectDataBinding(
|
|
567
|
+
entityAction: { EntityID?: string; Params?: Array<{ ActionParamID: string; ValueType: string }> },
|
|
568
|
+
entityObject: BaseEntity | undefined,
|
|
569
|
+
provider: IMetadataProvider | undefined
|
|
570
|
+
): EntityObjectDataBinding | undefined {
|
|
571
|
+
const entityInfo: EntityInfo | undefined = entityObject?.EntityInfo
|
|
572
|
+
?? provider?.Entities?.find(e => UUIDsEqual(e.ID, entityAction?.EntityID));
|
|
573
|
+
if (!entityInfo) {
|
|
574
|
+
return undefined;
|
|
575
|
+
}
|
|
576
|
+
const names = new Set<string>();
|
|
577
|
+
const dataParams = (entityAction?.Params ?? []).filter(eap => eap.ValueType === 'Entity Object Data');
|
|
578
|
+
const actionParamsById = dataParams.length > 0 ? IndexByUUID(ActionEngineServer.Instance.ActionParams) : null;
|
|
579
|
+
for (const eap of dataParams) {
|
|
580
|
+
const param = actionParamsById?.Get(eap.ActionParamID);
|
|
581
|
+
if (param?.Name) names.add(param.Name.trim().toLowerCase());
|
|
582
|
+
}
|
|
583
|
+
return names.size > 0 ? { EntityInfo: entityInfo, ParamNames: names } : undefined;
|
|
584
|
+
}
|
|
585
|
+
|
|
523
586
|
/**
|
|
524
587
|
* Creates a composite key from the input
|
|
525
588
|
* @param entity The entity information
|
|
@@ -139,6 +139,7 @@ export class AdhocQueryResolver extends ResolverBase {
|
|
|
139
139
|
QueryID: '',
|
|
140
140
|
QueryName: 'Ad-Hoc Query',
|
|
141
141
|
Success: true,
|
|
142
|
+
// fls-guard: query rows; the SQL is refused before it runs if it reads a field the caller is denied
|
|
142
143
|
Results: JSON.stringify(result.Results),
|
|
143
144
|
RowCount: result.RowCount,
|
|
144
145
|
TotalRowCount: result.TotalRowCount,
|
|
@@ -14,8 +14,10 @@ import type {
|
|
|
14
14
|
AgentExecutionStreamingCallback,
|
|
15
15
|
ExecuteAgentResult,
|
|
16
16
|
} from '@memberjunction/ai-core-plus';
|
|
17
|
+
import type { EntityInfo } from '@memberjunction/core';
|
|
17
18
|
import type { UserPayload } from '../types.js';
|
|
18
|
-
import { PublishStatusUpdate } from '../generic/PushStatusResolver.js';
|
|
19
|
+
import { PublishStatusUpdate, StatusUpdateOwnerID } from '../generic/PushStatusResolver.js';
|
|
20
|
+
import { ProjectEntityObjectForCaller } from '../generic/fieldSecurityTransport.js';
|
|
19
21
|
|
|
20
22
|
const SIGNIFICANT_STEPS = ['prompt_execution', 'action_execution', 'subagent_execution', 'decision_processing'];
|
|
21
23
|
|
|
@@ -25,7 +27,8 @@ interface StatusRun {
|
|
|
25
27
|
ConversationDetailID?: string;
|
|
26
28
|
ErrorMessage?: string;
|
|
27
29
|
Steps?: Array<{ StepName?: string }>;
|
|
28
|
-
|
|
30
|
+
EntityInfo?: EntityInfo | null;
|
|
31
|
+
GetAll?: () => Record<string, unknown>;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
export class AgentRunStatusPublisher {
|
|
@@ -34,11 +37,15 @@ export class AgentRunStatusPublisher {
|
|
|
34
37
|
/**
|
|
35
38
|
* @param sessionId Session stamped on the message body. Defaults to the payload's session.
|
|
36
39
|
* The push itself is always addressed to `userPayload.sessionId`, matching the resolver.
|
|
40
|
+
* @param conversationDetailId The run's reply row. When set, every message carries it as
|
|
41
|
+
* `conversationDetailId`, not only the completion, so a client that reconnects mid-run can
|
|
42
|
+
* find its row. When omitted, messages are as before.
|
|
37
43
|
*/
|
|
38
44
|
constructor(
|
|
39
45
|
private readonly pubSub: PubSubEngine,
|
|
40
46
|
private readonly userPayload: UserPayload,
|
|
41
47
|
private readonly sessionId: string = userPayload.sessionId,
|
|
48
|
+
private readonly conversationDetailId?: string,
|
|
42
49
|
) {}
|
|
43
50
|
|
|
44
51
|
/** Latest run observed from a progress event, including steps that are not published. */
|
|
@@ -66,7 +73,8 @@ export class AgentRunStatusPublisher {
|
|
|
66
73
|
sessionId: this.sessionId,
|
|
67
74
|
agentRunId: agentRun.ID,
|
|
68
75
|
type: 'progress',
|
|
69
|
-
|
|
76
|
+
...this.replyRow(),
|
|
77
|
+
agentRun: this.runValues(agentRun),
|
|
70
78
|
progress: {
|
|
71
79
|
currentStep: progress.step,
|
|
72
80
|
percentage: progress.percentage,
|
|
@@ -93,7 +101,8 @@ export class AgentRunStatusPublisher {
|
|
|
93
101
|
sessionId: this.sessionId,
|
|
94
102
|
agentRunId: agentRun.ID,
|
|
95
103
|
type: 'streaming',
|
|
96
|
-
|
|
104
|
+
...this.replyRow(),
|
|
105
|
+
agentRun: this.runValues(agentRun),
|
|
97
106
|
streaming: {
|
|
98
107
|
content: chunk.content,
|
|
99
108
|
isPartial: !chunk.isComplete,
|
|
@@ -122,6 +131,7 @@ export class AgentRunStatusPublisher {
|
|
|
122
131
|
sessionId: this.sessionId,
|
|
123
132
|
agentRunId: agentRun.ID,
|
|
124
133
|
type: 'partial_result',
|
|
134
|
+
...this.replyRow(),
|
|
125
135
|
partialResult: {
|
|
126
136
|
currentStep: lastStep,
|
|
127
137
|
partialOutput: result.payload || undefined,
|
|
@@ -134,7 +144,7 @@ export class AgentRunStatusPublisher {
|
|
|
134
144
|
agentRunId: agentRun?.ID || 'unknown',
|
|
135
145
|
type: 'complete',
|
|
136
146
|
timestamp: new Date(),
|
|
137
|
-
conversationDetailId: conversationDetailId || agentRun?.ConversationDetailID,
|
|
147
|
+
conversationDetailId: conversationDetailId || agentRun?.ConversationDetailID || this.conversationDetailId,
|
|
138
148
|
success: result.success,
|
|
139
149
|
errorMessage: agentRun?.ErrorMessage || undefined,
|
|
140
150
|
result: resultJson || undefined,
|
|
@@ -142,8 +152,9 @@ export class AgentRunStatusPublisher {
|
|
|
142
152
|
}
|
|
143
153
|
|
|
144
154
|
/**
|
|
145
|
-
* Completion for a failure that has no run.
|
|
146
|
-
*
|
|
155
|
+
* Completion for a failure that has no run result. `executeAIAgent` sends it when the run
|
|
156
|
+
* throws (the agent could not start, the run failed, or its reply could not be saved), so a
|
|
157
|
+
* fire-and-forget client learns the reason. A host uses it the same way: when the turn throws
|
|
147
158
|
* instead of returning a result, call `PublishFailure` with the reply row's id
|
|
148
159
|
* and the error. That completion is what tells the chat the reply finished.
|
|
149
160
|
*/
|
|
@@ -160,10 +171,27 @@ export class AgentRunStatusPublisher {
|
|
|
160
171
|
});
|
|
161
172
|
}
|
|
162
173
|
|
|
174
|
+
/** `{ conversationDetailId }` when this run has a reply row, otherwise nothing, so the message keeps its old shape. */
|
|
175
|
+
private replyRow(): { conversationDetailId?: string } {
|
|
176
|
+
return this.conversationDetailId ? { conversationDetailId: this.conversationDetailId } : {};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* The run's field values as the recipient may read them. The run object comes from the agent
|
|
181
|
+
* engine, which is not bound to this session's user, so it is projected here.
|
|
182
|
+
*/
|
|
183
|
+
private runValues(agentRun: StatusRun): unknown {
|
|
184
|
+
if (!agentRun.GetAll) {
|
|
185
|
+
return agentRun;
|
|
186
|
+
}
|
|
187
|
+
const getAll = agentRun.GetAll;
|
|
188
|
+
return ProjectEntityObjectForCaller({ EntityInfo: agentRun.EntityInfo, GetAll: () => getAll.call(agentRun) }, this.userPayload?.userRecord);
|
|
189
|
+
}
|
|
190
|
+
|
|
163
191
|
private publish(type: 'ExecutionProgress' | 'StreamingContent', data: unknown): void {
|
|
164
192
|
PublishStatusUpdate(this.pubSub, {
|
|
165
193
|
sessionId: this.userPayload.sessionId,
|
|
166
|
-
ownerUserId: this.userPayload
|
|
194
|
+
ownerUserId: StatusUpdateOwnerID(this.userPayload),
|
|
167
195
|
message: JSON.stringify({
|
|
168
196
|
resolver: 'RunAIAgentResolver',
|
|
169
197
|
type,
|
|
@@ -13,12 +13,34 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { Resolver, Mutation, Arg, Ctx, ObjectType, Field } from 'type-graphql';
|
|
15
15
|
import { AppContext } from '../types.js';
|
|
16
|
-
import { UserInfo, IMetadataProvider
|
|
17
|
-
import { UUIDsEqual } from '@memberjunction/global';
|
|
18
|
-
import { MJAIAgentSessionEntity } from '@memberjunction/core-entities';
|
|
16
|
+
import { UserInfo, IMetadataProvider } from '@memberjunction/core';
|
|
19
17
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
20
18
|
import { GetReadWriteProvider } from '../util.js';
|
|
21
|
-
import { SessionManager, SessionAuthorizationError } from '../agentSessions/index.js';
|
|
19
|
+
import { SessionManager, SessionAuthorizationError, type SessionCloseReason } from '../agentSessions/index.js';
|
|
20
|
+
import {
|
|
21
|
+
LoadOwnedRealtimeSession,
|
|
22
|
+
RealtimeSessionNotFoundError,
|
|
23
|
+
RealtimeSessionOwnershipError,
|
|
24
|
+
} from '../realtimeSessions/ownedRealtimeSession.js';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The `CloseReason` values a client may stamp on its own session; `Idle`, `Janitor` and `Shutdown` are the server's.
|
|
28
|
+
* `TimeLimit` is a claim: the browser's deadline alarm fired, and {@link SessionManager.CloseSession} verifies it
|
|
29
|
+
* against the session's stored deadline, recording `Explicit` instead when the deadline is not near.
|
|
30
|
+
*/
|
|
31
|
+
const CLIENT_CLOSE_REASONS: readonly SessionCloseReason[] = ['Explicit', 'Error', 'TimeLimit'];
|
|
32
|
+
|
|
33
|
+
/** Reads the mutation's optional `closeReason`: absent means `Explicit`; a server-only or unknown value is refused. */
|
|
34
|
+
function ParseClientCloseReason(closeReason: string | null | undefined): SessionCloseReason {
|
|
35
|
+
if (closeReason == null || closeReason === '') {
|
|
36
|
+
return 'Explicit';
|
|
37
|
+
}
|
|
38
|
+
const match = CLIENT_CLOSE_REASONS.find((r) => r === closeReason);
|
|
39
|
+
if (!match) {
|
|
40
|
+
throw new Error(`Unsupported close reason '${closeReason}': a client may close its session as ${CLIENT_CLOSE_REASONS.join(' or ')}`);
|
|
41
|
+
}
|
|
42
|
+
return match;
|
|
43
|
+
}
|
|
22
44
|
|
|
23
45
|
/** Result of {@link AgentSessionResolver.StartAgentSession}. */
|
|
24
46
|
@ObjectType()
|
|
@@ -77,15 +99,22 @@ export class AgentSessionResolver extends ResolverBase {
|
|
|
77
99
|
/**
|
|
78
100
|
* Close a session. Rejects unless the caller owns it. Returns `true` on a successful (or
|
|
79
101
|
* idempotent) close, `false` if the session can't be loaded.
|
|
102
|
+
*
|
|
103
|
+
* `closeReason` is what the row records as its `CloseReason`: `Explicit` (the default, and what
|
|
104
|
+
* every client sent before the argument existed) when the user or host ended the call, `Error`
|
|
105
|
+
* when the client ended it because the start or the call failed (MJ#6013). The other reasons are
|
|
106
|
+
* the server's own (janitor, shutdown) and are refused from a client.
|
|
80
107
|
*/
|
|
81
108
|
@Mutation(() => Boolean)
|
|
82
109
|
async CloseAgentSession(
|
|
83
110
|
@Arg('agentSessionId') agentSessionId: string,
|
|
84
111
|
@Ctx() { userPayload, providers }: AppContext,
|
|
112
|
+
@Arg('closeReason', () => String, { nullable: true }) closeReason?: string | null,
|
|
85
113
|
): Promise<boolean> {
|
|
114
|
+
const reason = ParseClientCloseReason(closeReason);
|
|
86
115
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
87
|
-
await this.
|
|
88
|
-
return this.sessionManager.CloseSession(agentSessionId, contextUser, provider);
|
|
116
|
+
await this.loadOwnedSession(agentSessionId, contextUser, provider);
|
|
117
|
+
return this.sessionManager.CloseSession(agentSessionId, contextUser, provider, reason);
|
|
89
118
|
}
|
|
90
119
|
|
|
91
120
|
/**
|
|
@@ -98,7 +127,7 @@ export class AgentSessionResolver extends ResolverBase {
|
|
|
98
127
|
@Ctx() { userPayload, providers }: AppContext,
|
|
99
128
|
): Promise<boolean> {
|
|
100
129
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
101
|
-
await this.
|
|
130
|
+
await this.loadOwnedSession(agentSessionId, contextUser, provider);
|
|
102
131
|
return this.sessionManager.Heartbeat(agentSessionId, contextUser, provider);
|
|
103
132
|
}
|
|
104
133
|
|
|
@@ -117,22 +146,25 @@ export class AgentSessionResolver extends ResolverBase {
|
|
|
117
146
|
}
|
|
118
147
|
|
|
119
148
|
/**
|
|
120
|
-
* Inbound ownership gate
|
|
121
|
-
*
|
|
149
|
+
* Inbound ownership gate: delegates to {@link LoadOwnedRealtimeSession} (which enforces both
|
|
150
|
+
* `UserID === contextUser.ID` and `AuthorizeSessionAccess` scope/visitor binding) and maps its
|
|
151
|
+
* typed errors to this resolver's message format.
|
|
122
152
|
*/
|
|
123
|
-
private async
|
|
153
|
+
private async loadOwnedSession(
|
|
124
154
|
agentSessionId: string,
|
|
125
155
|
contextUser: UserInfo,
|
|
126
156
|
provider: IMetadataProvider,
|
|
127
157
|
): Promise<void> {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
158
|
+
try {
|
|
159
|
+
await LoadOwnedRealtimeSession(agentSessionId, contextUser, provider);
|
|
160
|
+
} catch (err) {
|
|
161
|
+
if (err instanceof RealtimeSessionNotFoundError) {
|
|
162
|
+
throw new Error(`Agent session ${agentSessionId} not found`);
|
|
163
|
+
}
|
|
164
|
+
if (err instanceof RealtimeSessionOwnershipError) {
|
|
165
|
+
throw new Error('Not authorized: you do not own this agent session');
|
|
166
|
+
}
|
|
167
|
+
throw err;
|
|
136
168
|
}
|
|
137
169
|
}
|
|
138
170
|
}
|
|
@@ -170,7 +170,8 @@ export class AutotagPipelineResolver extends ResolverBase {
|
|
|
170
170
|
EntityName: 'MJ: Content Sources',
|
|
171
171
|
Fields: ['ID'],
|
|
172
172
|
ResultType: 'simple',
|
|
173
|
-
MaxRows: 1
|
|
173
|
+
MaxRows: 1,
|
|
174
|
+
SkipTotalRowCount: true
|
|
174
175
|
}, currentUser);
|
|
175
176
|
if (result.Success && result.Results.length > 0) {
|
|
176
177
|
sourceID = result.Results[0].ID;
|
|
@@ -235,6 +235,7 @@ export class ConversationRunEventsResolver {
|
|
|
235
235
|
EntityName: 'MJ: Conversation Details',
|
|
236
236
|
ExtraFilter: `ID='${this.escape(conversationDetailID)}'`,
|
|
237
237
|
MaxRows: 1,
|
|
238
|
+
SkipTotalRowCount: true,
|
|
238
239
|
ResultType: 'entity_object',
|
|
239
240
|
BypassCache: true,
|
|
240
241
|
},
|
|
@@ -259,6 +260,7 @@ export class ConversationRunEventsResolver {
|
|
|
259
260
|
ExtraFilter: `ConversationDetailID='${this.escape(conversationDetailID)}'`,
|
|
260
261
|
OrderBy: '__mj_CreatedAt DESC',
|
|
261
262
|
MaxRows: 1,
|
|
263
|
+
SkipTotalRowCount: true,
|
|
262
264
|
Fields: RUN_FIELDS,
|
|
263
265
|
ResultType: 'simple',
|
|
264
266
|
BypassCache: true,
|
|
@@ -3,12 +3,14 @@ import { AppContext } from '../types.js';
|
|
|
3
3
|
import { RunViewByIDInput } from '../generic/RunViewResolver.js';
|
|
4
4
|
import { Message } from '@memberjunction/communication-types';
|
|
5
5
|
import { EntityCommunicationsEngine } from '@memberjunction/entity-communications-server';
|
|
6
|
-
import { RunViewParams } from '@memberjunction/core';
|
|
6
|
+
import { DatabaseProviderBase, IMetadataProvider, RunViewParams, UserInfo } from '@memberjunction/core';
|
|
7
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
7
8
|
import { GraphQLJSONObject } from 'graphql-type-json';
|
|
8
9
|
import { TemplateEngineServer } from '@memberjunction/templates';
|
|
9
10
|
import { EntityCommunicationParams } from '@memberjunction/entity-communications-base';
|
|
10
11
|
import { z } from 'zod';
|
|
11
12
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
13
|
+
import { GetReadOnlyProvider } from '../util.js';
|
|
12
14
|
|
|
13
15
|
@InputType()
|
|
14
16
|
export class CommunicationProviderMessageType {
|
|
@@ -168,6 +170,11 @@ export class RunEntityCommunicationResultType {
|
|
|
168
170
|
|
|
169
171
|
@Resolver(RunEntityCommunicationResultType)
|
|
170
172
|
export class ReportResolver extends ResolverBase {
|
|
173
|
+
/**
|
|
174
|
+
* Runs a message against a view of records, as the caller. The recipient and related-entity reads
|
|
175
|
+
* run as the authenticated user, so a preview returns and a send merges only rows and fields that
|
|
176
|
+
* user may read. The view's client-supplied clauses get the same screen as a RunView request.
|
|
177
|
+
*/
|
|
171
178
|
@Query(() => RunEntityCommunicationResultType)
|
|
172
179
|
async RunEntityCommunicationByViewID(
|
|
173
180
|
@Arg('entityID', () => String) entityID: string,
|
|
@@ -177,25 +184,29 @@ export class ReportResolver extends ResolverBase {
|
|
|
177
184
|
@Arg('message', () => CommunicationMessageInput) message: CommunicationMessageInput,
|
|
178
185
|
@Arg('previewOnly', () => Boolean) previewOnly: boolean,
|
|
179
186
|
@Arg('includeProcessedMessages', () => Boolean) includeProcessedMessages: boolean,
|
|
180
|
-
@Ctx() { userPayload }: AppContext
|
|
187
|
+
@Ctx() { userPayload, providers }: AppContext
|
|
181
188
|
): Promise<RunEntityCommunicationResultType> {
|
|
182
189
|
// Check API key scope authorization for communication send
|
|
183
190
|
await this.CheckAPIKeyScopeAuthorization('communication:send', entityID, userPayload);
|
|
184
191
|
|
|
185
192
|
try {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
193
|
+
const contextUser = this.GetUserFromPayload(userPayload);
|
|
194
|
+
if (!contextUser) throw new Error('Unable to determine the acting user for this communication');
|
|
195
|
+
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
196
|
+
this.screenClientViewClauses(
|
|
197
|
+
{
|
|
198
|
+
extraFilter: runViewByIDInput.ExtraFilter,
|
|
199
|
+
orderBy: runViewByIDInput.OrderBy,
|
|
200
|
+
userSearchString: runViewByIDInput.UserSearchString,
|
|
201
|
+
overrideExcludeFilter: runViewByIDInput.OverrideExcludeFilter,
|
|
202
|
+
},
|
|
203
|
+
provider as unknown as IMetadataProvider,
|
|
204
|
+
contextUser,
|
|
205
|
+
);
|
|
206
|
+
await this.assertViewBelongsToEntity(runViewByIDInput.ViewID, entityID, provider, contextUser);
|
|
207
|
+
|
|
208
|
+
await EntityCommunicationsEngine.Instance.Config(false, contextUser);
|
|
209
|
+
const newMessage = await this.resolveMessageTemplates(message, contextUser);
|
|
199
210
|
const params: EntityCommunicationParams = {
|
|
200
211
|
EntityID: entityID,
|
|
201
212
|
RunViewParams: <RunViewParams>runViewByIDInput,
|
|
@@ -204,6 +215,8 @@ export class ReportResolver extends ResolverBase {
|
|
|
204
215
|
Message: newMessage,
|
|
205
216
|
PreviewOnly: previewOnly,
|
|
206
217
|
IncludeProcessedMessages: includeProcessedMessages,
|
|
218
|
+
ContextUser: contextUser,
|
|
219
|
+
Provider: provider,
|
|
207
220
|
};
|
|
208
221
|
const result = await EntityCommunicationsEngine.Instance.RunEntityCommunication(params);
|
|
209
222
|
return {
|
|
@@ -222,4 +235,32 @@ export class ReportResolver extends ResolverBase {
|
|
|
222
235
|
};
|
|
223
236
|
}
|
|
224
237
|
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Refuses a view that is not a view of `entityID`, with the same message as for a view that does
|
|
241
|
+
* not exist or that the caller cannot load, so the refusal does not reveal which views exist.
|
|
242
|
+
*/
|
|
243
|
+
private async assertViewBelongsToEntity(viewID: string | undefined, entityID: string, provider: DatabaseProviderBase, contextUser: UserInfo): Promise<void> {
|
|
244
|
+
if (!viewID) return;
|
|
245
|
+
const view = await this.resolveUserViewByID(viewID, provider, contextUser);
|
|
246
|
+
if (!view?.ID || !UUIDsEqual(view.ID, viewID) || !UUIDsEqual(view.EntityID, entityID)) {
|
|
247
|
+
throw new Error('The requested view does not exist or you do not have access to it');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** Builds the message, replacing each template the client named with the server's copy of it. */
|
|
252
|
+
private async resolveMessageTemplates(message: CommunicationMessageInput, contextUser: UserInfo): Promise<Message> {
|
|
253
|
+
const newMessage = new Message(message as unknown as Message);
|
|
254
|
+
await TemplateEngineServer.Instance.Config(false, contextUser);
|
|
255
|
+
if (newMessage.BodyTemplate) {
|
|
256
|
+
newMessage.BodyTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.BodyTemplate.Name);
|
|
257
|
+
}
|
|
258
|
+
if (newMessage.HTMLBodyTemplate) {
|
|
259
|
+
newMessage.HTMLBodyTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.HTMLBodyTemplate.Name);
|
|
260
|
+
}
|
|
261
|
+
if (newMessage.SubjectTemplate) {
|
|
262
|
+
newMessage.SubjectTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.SubjectTemplate.Name);
|
|
263
|
+
}
|
|
264
|
+
return newMessage;
|
|
265
|
+
}
|
|
225
266
|
}
|