@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
|
@@ -19,29 +19,50 @@
|
|
|
19
19
|
import { Resolver, Mutation, Query, Arg, Ctx, Float, Int, ObjectType, Field, PubSub, PubSubEngine } from 'type-graphql';
|
|
20
20
|
import { AppContext, UserPayload } from '../types.js';
|
|
21
21
|
import { UserInfo, IMetadataProvider, LogError } from '@memberjunction/core';
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
22
|
+
import { NormalizeUUID } from '@memberjunction/global';
|
|
23
|
+
import { MJAIAgentEntity, MJConversationEntity } from '@memberjunction/core-entities';
|
|
24
24
|
import { NormalizeInstanceKey, RemoteBrowserEngine } from '@memberjunction/remote-browser-server';
|
|
25
25
|
import { BeginBrowserGoalStep, FinalizeBrowserGoalStep, ExtractCoAgentRunID } from '../agentSessions/remoteBrowserGoalEngine.js';
|
|
26
26
|
import { RemoteBrowserGoalRegistry } from '../agentSessions/remoteBrowserGoalRegistry.js';
|
|
27
27
|
import { SessionRunIDVerifier } from '../agentSessions/SessionRunIDVerifier.js';
|
|
28
28
|
import { randomUUID } from 'node:crypto';
|
|
29
29
|
import {
|
|
30
|
+
IRemoteBrowserSession,
|
|
30
31
|
RemoteBrowserAction,
|
|
31
32
|
RemoteBrowserAudioChunk,
|
|
33
|
+
RemoteBrowserFillFieldInput,
|
|
32
34
|
RemoteBrowserHumanInput,
|
|
33
35
|
RemoteBrowserModifierKey,
|
|
34
36
|
RemoteBrowserCapabilityNotSupportedError,
|
|
35
37
|
} from '@memberjunction/remote-browser-base';
|
|
36
38
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
37
39
|
import { GetReadWriteProvider } from '../util.js';
|
|
40
|
+
import {
|
|
41
|
+
LoadOwnedRealtimeSession,
|
|
42
|
+
RealtimeSessionNotFoundError,
|
|
43
|
+
RealtimeSessionOwnershipError,
|
|
44
|
+
} from '../realtimeSessions/ownedRealtimeSession.js';
|
|
45
|
+
import { AuthorizeSessionAccess, ResolveSessionScopeIdentity } from '../realtimeSessions/sessionAccess.js';
|
|
46
|
+
import { ConversationBrowserLedger, RemoteBrowserRefusedError } from '../agentSessions/conversationBrowsers.js';
|
|
47
|
+
import { configInfo, type ConversationBrowserConfig } from '../config.js';
|
|
38
48
|
import { PUSH_STATUS_UPDATES_TOPIC } from '../generic/PushStatusResolver.js';
|
|
39
49
|
import { AIEngine } from '@memberjunction/aiengine';
|
|
40
50
|
import { AIPromptRunner } from '@memberjunction/ai-prompts';
|
|
41
51
|
import { AIPromptParams } from '@memberjunction/ai-core-plus';
|
|
42
52
|
|
|
43
|
-
/** Entity name
|
|
44
|
-
const
|
|
53
|
+
/** Entity name for turn-based text conversations that scope a live Remote Browser session. */
|
|
54
|
+
const CONVERSATION_ENTITY = 'MJ: Conversations';
|
|
55
|
+
/**
|
|
56
|
+
* What an owned browser scope supplies: an `MJ: AI Agent Sessions` row (a realtime call), or an owned
|
|
57
|
+
* `MJ: Conversations` row (text chat), which has no agent and no config.
|
|
58
|
+
*/
|
|
59
|
+
export interface OwnedBrowserScope {
|
|
60
|
+
ID: string;
|
|
61
|
+
AgentID: string | null;
|
|
62
|
+
Config_: string | null;
|
|
63
|
+
/** `true` for a text conversation's browser (the opt-in, capped, private-network-restricted kind). */
|
|
64
|
+
IsConversation?: boolean;
|
|
65
|
+
}
|
|
45
66
|
/** Entity name for the agent whose `TypeConfiguration` carries the remote-browser provider preference. */
|
|
46
67
|
const AGENT_ENTITY = 'MJ: AI Agents';
|
|
47
68
|
/**
|
|
@@ -65,7 +86,7 @@ interface RemoteBrowserTypeConfiguration {
|
|
|
65
86
|
|
|
66
87
|
/**
|
|
67
88
|
* Result of {@link RemoteBrowserActionResolver.ExecuteRemoteBrowserAction} — the outcome of one browser
|
|
68
|
-
* action plus the resulting URL
|
|
89
|
+
* action plus the resulting URL and optional structured DOM observation / filled-field list.
|
|
69
90
|
*/
|
|
70
91
|
@ObjectType()
|
|
71
92
|
export class RemoteBrowserActionResult {
|
|
@@ -80,6 +101,14 @@ export class RemoteBrowserActionResult {
|
|
|
80
101
|
/** Human-readable detail — an error message on failure, a note on success. Null when none. */
|
|
81
102
|
@Field(() => String, { nullable: true })
|
|
82
103
|
Detail?: string;
|
|
104
|
+
|
|
105
|
+
/** Optional JSON-serialized {@link import('@memberjunction/remote-browser-base').RemoteBrowserPageObservation} returned by `inspect`, `fill`, or `click`. */
|
|
106
|
+
@Field(() => String, { nullable: true })
|
|
107
|
+
ObservationJson?: string;
|
|
108
|
+
|
|
109
|
+
/** Optional JSON-serialized `RemoteBrowserFilledFieldResult[]` returned by `fill`. */
|
|
110
|
+
@Field(() => String, { nullable: true })
|
|
111
|
+
FilledJson?: string;
|
|
83
112
|
}
|
|
84
113
|
|
|
85
114
|
/**
|
|
@@ -247,6 +276,12 @@ const MAX_STREAM_ENTRY_AGE_MS = 4 * 60 * 60 * 1000; // 4 hours — generous vs.
|
|
|
247
276
|
|
|
248
277
|
@Resolver()
|
|
249
278
|
export class RemoteBrowserActionResolver extends ResolverBase {
|
|
279
|
+
constructor() {
|
|
280
|
+
super();
|
|
281
|
+
// The idle reaper ends a conversation browser the way EndRemoteBrowserSession does.
|
|
282
|
+
ConversationBrowserLedger.Instance.EndBrowser = (conversationID) => this.endBrowser(conversationID);
|
|
283
|
+
}
|
|
284
|
+
|
|
250
285
|
/**
|
|
251
286
|
* Surfaces whose live CDP screencast this resolver has already started, keyed by
|
|
252
287
|
* {@link RemoteBrowserActionResolver.streamKey} (agent session **plus** instance) so a re-issued
|
|
@@ -273,6 +308,14 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
273
308
|
*/
|
|
274
309
|
private startedAudioStreams = new Map<string, number>();
|
|
275
310
|
|
|
311
|
+
/**
|
|
312
|
+
* The push session each surface's frames and audio go to, by stream key. A reloaded tab starts again
|
|
313
|
+
* from a new push session while the browser keeps streaming; it takes the frames over here instead of
|
|
314
|
+
* being told "already streaming" while they still go to the old session. An entry whose streams have
|
|
315
|
+
* stopped is dropped by {@link sweepStreamEntries}.
|
|
316
|
+
*/
|
|
317
|
+
private streamTargets = new Map<string, UserPayload>();
|
|
318
|
+
|
|
276
319
|
/**
|
|
277
320
|
* Drops any {@link startedScreencasts} / {@link startedAudioStreams} entry older than
|
|
278
321
|
* {@link MAX_STREAM_ENTRY_AGE_MS} — the reclaim path for sessions that never called
|
|
@@ -291,6 +334,12 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
291
334
|
this.startedAudioStreams.delete(key);
|
|
292
335
|
}
|
|
293
336
|
}
|
|
337
|
+
// A target outlives its streams only until here (a stop, a failed start, a voice session's end).
|
|
338
|
+
for (const key of this.streamTargets.keys()) {
|
|
339
|
+
if (!this.startedScreencasts.has(key) && !this.startedAudioStreams.has(key)) {
|
|
340
|
+
this.streamTargets.delete(key);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
294
343
|
}
|
|
295
344
|
|
|
296
345
|
/**
|
|
@@ -324,20 +373,28 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
324
373
|
@Arg('deltaY', () => Float, { nullable: true }) deltaY?: number,
|
|
325
374
|
@Arg('ms', () => Float, { nullable: true }) ms?: number,
|
|
326
375
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
376
|
+
@Arg('ref', () => String, { nullable: true }) ref?: string,
|
|
377
|
+
@Arg('valuesJson', () => String, { nullable: true }) valuesJson?: string,
|
|
327
378
|
): Promise<RemoteBrowserActionResult> {
|
|
328
379
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
329
|
-
const session = await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
380
|
+
const session = await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
330
381
|
|
|
331
|
-
const action = this.buildAction({ kind, url, selector, x, y, text, key, deltaX, deltaY, ms });
|
|
382
|
+
const action = this.buildAction({ kind, url, selector, ref, x, y, text, key, deltaX, deltaY, ms, valuesJson });
|
|
332
383
|
if (!action) {
|
|
333
384
|
return { Success: false, Detail: `Unknown or incomplete remote-browser action '${kind}'.` };
|
|
334
385
|
}
|
|
335
386
|
|
|
336
387
|
const providerName = await this.resolveProviderName(session, contextUser, provider);
|
|
337
388
|
try {
|
|
338
|
-
const liveSession = await
|
|
389
|
+
const liveSession = await this.startBrowser(agentSessionID, session, contextUser, providerName, instanceKey);
|
|
339
390
|
const result = await liveSession.ExecuteAction(action);
|
|
340
|
-
return {
|
|
391
|
+
return {
|
|
392
|
+
Success: result.Success,
|
|
393
|
+
CurrentUrl: result.CurrentUrl,
|
|
394
|
+
Detail: result.Detail,
|
|
395
|
+
...(result.Observation ? { ObservationJson: JSON.stringify(result.Observation) } : {}),
|
|
396
|
+
...(result.Filled ? { FilledJson: JSON.stringify(result.Filled) } : {}),
|
|
397
|
+
};
|
|
341
398
|
} catch (err) {
|
|
342
399
|
// A dead handle is not a failure to report, it is a mapping to delete (#3598) — and this is the
|
|
343
400
|
// path where that fault is actually FELT: the poll below only freezes a pane, while here the
|
|
@@ -362,6 +419,8 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
362
419
|
Detail: retried.Success
|
|
363
420
|
? retried.Detail
|
|
364
421
|
: `The browser had closed and was replaced (it is now on a blank page). ${retried.Detail ?? ''}`.trim(),
|
|
422
|
+
...(retried.Observation ? { ObservationJson: JSON.stringify(retried.Observation) } : {}),
|
|
423
|
+
...(retried.Filled ? { FilledJson: JSON.stringify(retried.Filled) } : {}),
|
|
365
424
|
};
|
|
366
425
|
} catch (retryError) {
|
|
367
426
|
const retryMessage = retryError instanceof Error ? retryError.message : String(retryError);
|
|
@@ -400,7 +459,11 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
400
459
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
401
460
|
): Promise<RemoteBrowserGoalResultType> {
|
|
402
461
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
403
|
-
const session = await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
462
|
+
const session = await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
463
|
+
if (session.IsConversation) {
|
|
464
|
+
// A goal loop clicks and navigates on its own, past the click guard the browser_* tools go through.
|
|
465
|
+
return { Success: false, Status: 'Error', Detail: 'Goal runs are not available in a text conversation; use the browser_* tools.' };
|
|
466
|
+
}
|
|
404
467
|
const providerName = await this.resolveProviderName(session, contextUser, provider);
|
|
405
468
|
// Observability: nest this goal's many prompt runs under ONE "Browser goal" step on the realtime
|
|
406
469
|
// co-agent run (when the session has one). Best-effort — a null step just means the goal runs unlinked.
|
|
@@ -487,7 +550,7 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
487
550
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
488
551
|
): Promise<RemoteBrowserSnapshot> {
|
|
489
552
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
490
|
-
await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
553
|
+
await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
491
554
|
|
|
492
555
|
const liveSession = RemoteBrowserEngine.Instance.GetSessionForAgentSession(agentSessionID, instanceKey);
|
|
493
556
|
if (!liveSession) {
|
|
@@ -570,7 +633,7 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
570
633
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
571
634
|
): Promise<RemoteBrowserInterpretation> {
|
|
572
635
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
573
|
-
await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
636
|
+
await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
574
637
|
|
|
575
638
|
const liveSession = RemoteBrowserEngine.Instance.GetSessionForAgentSession(agentSessionID, instanceKey);
|
|
576
639
|
if (!liveSession) {
|
|
@@ -612,21 +675,22 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
612
675
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
613
676
|
): Promise<RemoteBrowserScreencastResult> {
|
|
614
677
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
615
|
-
const session = await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
678
|
+
const session = await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
616
679
|
|
|
617
680
|
// Idempotent PER SURFACE: a re-bind must not stack a second screencast on the one live browser,
|
|
618
681
|
// but a SECOND surface binding for the first time is not a re-bind (#3531).
|
|
619
682
|
this.sweepStreamEntries();
|
|
620
683
|
const streamKey = this.streamKey(agentSessionID, instanceKey);
|
|
684
|
+
this.streamTargets.set(streamKey, userPayload);
|
|
621
685
|
if (this.startedScreencasts.has(streamKey)) {
|
|
622
686
|
return { Streaming: true };
|
|
623
687
|
}
|
|
624
688
|
|
|
625
689
|
const providerName = await this.resolveProviderName(session, contextUser, provider);
|
|
626
690
|
try {
|
|
627
|
-
const liveSession = await
|
|
691
|
+
const liveSession = await this.startBrowser(agentSessionID, session, contextUser, providerName, instanceKey);
|
|
628
692
|
await liveSession.StartScreencast((frame) =>
|
|
629
|
-
this.publishFrame(pubSub, userPayload, agentSessionID, instanceKey, frame, liveSession.GetCurrentUrl()),
|
|
693
|
+
this.publishFrame(pubSub, this.streamTargets.get(streamKey) ?? userPayload, agentSessionID, instanceKey, frame, liveSession.GetCurrentUrl()),
|
|
630
694
|
);
|
|
631
695
|
this.startedScreencasts.set(streamKey, Date.now());
|
|
632
696
|
return { Streaming: true };
|
|
@@ -635,6 +699,9 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
635
699
|
// Backend can't stream — the client keeps polling. Not an error condition.
|
|
636
700
|
return { Streaming: false };
|
|
637
701
|
}
|
|
702
|
+
if (err instanceof RemoteBrowserRefusedError) {
|
|
703
|
+
throw err; // the client must stop and say so, not poll for a browser that will never start
|
|
704
|
+
}
|
|
638
705
|
const message = err instanceof Error ? err.message : String(err);
|
|
639
706
|
LogError(`StartRemoteBrowserScreencast failed (provider='${providerName}'): ${message}`);
|
|
640
707
|
return { Streaming: false };
|
|
@@ -656,7 +723,7 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
656
723
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
657
724
|
): Promise<boolean> {
|
|
658
725
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
659
|
-
await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
726
|
+
await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
660
727
|
|
|
661
728
|
this.startedScreencasts.delete(this.streamKey(agentSessionID, instanceKey));
|
|
662
729
|
const liveSession = RemoteBrowserEngine.Instance.GetSessionForAgentSession(agentSessionID, instanceKey);
|
|
@@ -672,6 +739,40 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
672
739
|
return true;
|
|
673
740
|
}
|
|
674
741
|
|
|
742
|
+
/**
|
|
743
|
+
* Ends the browser the caller's own session or conversation started, and forgets its stream
|
|
744
|
+
* bookkeeping. Ownership-gated. Idempotent: ending a scope that holds no browser resolves `false`.
|
|
745
|
+
* A text chat calls this when its browser drawer closes, the conversation changes, or the chat is
|
|
746
|
+
* destroyed, so a closed drawer never leaves a Chromium process (or a billed hosted browser) running.
|
|
747
|
+
*
|
|
748
|
+
* @param agentSessionID The `AIAgentSession` id or `Conversation` id.
|
|
749
|
+
* @returns `true` when a live browser was ended.
|
|
750
|
+
*/
|
|
751
|
+
@Mutation(() => Boolean)
|
|
752
|
+
async EndRemoteBrowserSession(
|
|
753
|
+
@Arg('agentSessionID', () => String) agentSessionID: string,
|
|
754
|
+
@Ctx() { userPayload, providers }: AppContext,
|
|
755
|
+
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
756
|
+
): Promise<boolean> {
|
|
757
|
+
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
758
|
+
await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
759
|
+
return this.endBrowser(agentSessionID, instanceKey);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
/**
|
|
763
|
+
* Ends a scope's browser and everything kept about it: the ledger slot (released first, so an action
|
|
764
|
+
* landing during teardown is counted again), the stream entries (so the next open streams the next
|
|
765
|
+
* browser) and the browser itself. The idle reaper ends conversation browsers through here too.
|
|
766
|
+
*/
|
|
767
|
+
private async endBrowser(agentSessionID: string, instanceKey?: string): Promise<boolean> {
|
|
768
|
+
ConversationBrowserLedger.Instance.Release(agentSessionID);
|
|
769
|
+
const streamKey = this.streamKey(agentSessionID, instanceKey);
|
|
770
|
+
this.startedScreencasts.delete(streamKey);
|
|
771
|
+
this.startedAudioStreams.delete(streamKey);
|
|
772
|
+
this.streamTargets.delete(streamKey);
|
|
773
|
+
return RemoteBrowserEngine.Instance.EndSessionForAgentSession(agentSessionID, instanceKey);
|
|
774
|
+
}
|
|
775
|
+
|
|
675
776
|
/**
|
|
676
777
|
* Starts streaming the session browser's TAB AUDIO and PUSHES each encoded chunk to the calling user's
|
|
677
778
|
* push-status topic — so a co-agent demoing a video/audio site is HEARD, not just seen. Ownership-gated.
|
|
@@ -693,19 +794,20 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
693
794
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
694
795
|
): Promise<RemoteBrowserAudioStreamResult> {
|
|
695
796
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
696
|
-
const session = await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
797
|
+
const session = await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
697
798
|
|
|
698
799
|
// Idempotent PER SURFACE — same reasoning as the screencast map (#3531).
|
|
699
800
|
this.sweepStreamEntries();
|
|
700
801
|
const streamKey = this.streamKey(agentSessionID, instanceKey);
|
|
802
|
+
this.streamTargets.set(streamKey, userPayload);
|
|
701
803
|
if (this.startedAudioStreams.has(streamKey)) {
|
|
702
804
|
return { Streaming: true };
|
|
703
805
|
}
|
|
704
806
|
|
|
705
807
|
const providerName = await this.resolveProviderName(session, contextUser, provider);
|
|
706
808
|
try {
|
|
707
|
-
const liveSession = await
|
|
708
|
-
await liveSession.StartAudioStream((chunk) => this.publishAudioChunk(pubSub, userPayload, agentSessionID, instanceKey, chunk));
|
|
809
|
+
const liveSession = await this.startBrowser(agentSessionID, session, contextUser, providerName, instanceKey);
|
|
810
|
+
await liveSession.StartAudioStream((chunk) => this.publishAudioChunk(pubSub, this.streamTargets.get(streamKey) ?? userPayload, agentSessionID, instanceKey, chunk));
|
|
709
811
|
this.startedAudioStreams.set(streamKey, Date.now());
|
|
710
812
|
return { Streaming: true };
|
|
711
813
|
} catch (err) {
|
|
@@ -713,6 +815,9 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
713
815
|
// Backend can't capture audio — the client plays no audio. Not an error condition.
|
|
714
816
|
return { Streaming: false };
|
|
715
817
|
}
|
|
818
|
+
if (err instanceof RemoteBrowserRefusedError) {
|
|
819
|
+
throw err;
|
|
820
|
+
}
|
|
716
821
|
const message = err instanceof Error ? err.message : String(err);
|
|
717
822
|
LogError(`StartRemoteBrowserAudioStream failed (provider='${providerName}'): ${message}`);
|
|
718
823
|
return { Streaming: false };
|
|
@@ -734,7 +839,7 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
734
839
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
735
840
|
): Promise<boolean> {
|
|
736
841
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
737
|
-
await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
842
|
+
await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
738
843
|
|
|
739
844
|
this.startedAudioStreams.delete(this.streamKey(agentSessionID, instanceKey));
|
|
740
845
|
const liveSession = RemoteBrowserEngine.Instance.GetSessionForAgentSession(agentSessionID, instanceKey);
|
|
@@ -790,7 +895,7 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
790
895
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
791
896
|
): Promise<boolean> {
|
|
792
897
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
793
|
-
await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
898
|
+
await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
794
899
|
|
|
795
900
|
const liveSession = RemoteBrowserEngine.Instance.GetSessionForAgentSession(agentSessionID, instanceKey);
|
|
796
901
|
if (!liveSession) {
|
|
@@ -837,7 +942,7 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
837
942
|
@Arg('instanceKey', () => String, { nullable: true }) instanceKey?: string,
|
|
838
943
|
): Promise<RemoteBrowserSelection> {
|
|
839
944
|
const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
|
|
840
|
-
await this.loadOwnedSession(agentSessionID, contextUser, provider);
|
|
945
|
+
await this.loadOwnedSession(agentSessionID, contextUser, provider, instanceKey);
|
|
841
946
|
|
|
842
947
|
const liveSession = RemoteBrowserEngine.Instance.GetSessionForAgentSession(agentSessionID, instanceKey);
|
|
843
948
|
if (!liveSession) {
|
|
@@ -1077,21 +1182,92 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
1077
1182
|
}
|
|
1078
1183
|
|
|
1079
1184
|
/**
|
|
1080
|
-
* Loads the
|
|
1081
|
-
*
|
|
1185
|
+
* Loads the owning scope and enforces inbound ownership: an `MJ: AI Agent Sessions` row (a realtime
|
|
1186
|
+
* call, via `LoadOwnedRealtimeSession`) or, failing that, an `MJ: Conversations` row (a text chat's
|
|
1187
|
+
* browser), both under `AuthorizeSessionAccess`. Throws when neither exists or the caller may not use it.
|
|
1082
1188
|
*
|
|
1083
|
-
* @param agentSessionID The `AIAgentSession` id.
|
|
1084
|
-
* @returns The
|
|
1189
|
+
* @param agentSessionID The `AIAgentSession` id or `Conversation` id.
|
|
1190
|
+
* @returns The owned scope.
|
|
1085
1191
|
*/
|
|
1086
|
-
protected async loadOwnedSession(agentSessionID: string, contextUser: UserInfo, provider: IMetadataProvider): Promise<
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1192
|
+
protected async loadOwnedSession(agentSessionID: string, contextUser: UserInfo, provider: IMetadataProvider, instanceKey?: string): Promise<OwnedBrowserScope> {
|
|
1193
|
+
try {
|
|
1194
|
+
return await LoadOwnedRealtimeSession(agentSessionID, contextUser, provider);
|
|
1195
|
+
} catch (err) {
|
|
1196
|
+
if (err instanceof RealtimeSessionOwnershipError) {
|
|
1197
|
+
throw new RemoteBrowserRefusedError(`Not authorized: remote-browser session ${agentSessionID} is not owned by you.`);
|
|
1198
|
+
}
|
|
1199
|
+
if (!(err instanceof RealtimeSessionNotFoundError)) {
|
|
1200
|
+
throw err;
|
|
1201
|
+
}
|
|
1090
1202
|
}
|
|
1091
|
-
|
|
1092
|
-
|
|
1203
|
+
// Not a realtime session: a text chat scopes its browser to a conversation, which this server must opt
|
|
1204
|
+
// into (each browser is a server Chromium or a billed hosted session), under the same access rule
|
|
1205
|
+
// (owner, and for an anonymous widget guest its scope id), loaded as the caller so its RLS applies too.
|
|
1206
|
+
const settings = this.ConversationBrowserSettings();
|
|
1207
|
+
if (!settings.enabled) {
|
|
1208
|
+
throw new RemoteBrowserRefusedError(`Remote-browser session ${agentSessionID} not found. Conversation browsers are not enabled on this server (realtime.conversationBrowser.enabled).`);
|
|
1209
|
+
}
|
|
1210
|
+
if (contextUser.IsMagicLinkAnonymous && !settings.allowAnonymous) {
|
|
1211
|
+
throw new RemoteBrowserRefusedError(`Not authorized: anonymous users cannot open a conversation browser on this server.`);
|
|
1212
|
+
}
|
|
1213
|
+
// One browser per conversation: an instance key would key a second one past the cap, the network
|
|
1214
|
+
// policy and the reaper (the client never sends one).
|
|
1215
|
+
if (instanceKey?.trim()) {
|
|
1216
|
+
throw new RemoteBrowserRefusedError('A conversation browser has no instances; instanceKey is not accepted.');
|
|
1217
|
+
}
|
|
1218
|
+
const conversation = await provider.GetEntityObject<MJConversationEntity>(CONVERSATION_ENTITY, contextUser);
|
|
1219
|
+
if (!(await conversation.Load(agentSessionID))) {
|
|
1220
|
+
throw new RemoteBrowserRefusedError(`Remote-browser session ${agentSessionID} not found.`);
|
|
1221
|
+
}
|
|
1222
|
+
const access = AuthorizeSessionAccess(
|
|
1223
|
+
{ SessionUserID: conversation.UserID, ConversationExternalID: conversation.ExternalID, ConversationReadable: true },
|
|
1224
|
+
contextUser,
|
|
1225
|
+
);
|
|
1226
|
+
if (!access.Allowed) {
|
|
1227
|
+
throw new RemoteBrowserRefusedError(`Not authorized: remote-browser session ${agentSessionID} is not owned by you.`);
|
|
1228
|
+
}
|
|
1229
|
+
// Each use puts off the browser's idle end.
|
|
1230
|
+
ConversationBrowserLedger.Instance.Touch(agentSessionID);
|
|
1231
|
+
return { ID: conversation.ID, AgentID: null, Config_: null, IsConversation: true };
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
/** This server's conversation-browser settings (a seam for tests). */
|
|
1235
|
+
protected ConversationBrowserSettings(): ConversationBrowserConfig {
|
|
1236
|
+
return configInfo.realtime.conversationBrowser;
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
/**
|
|
1240
|
+
* Starts (or reuses) the scope's browser. A conversation's browser first counts against its owner's
|
|
1241
|
+
* cap, and gives the slot back when it fails to start.
|
|
1242
|
+
*/
|
|
1243
|
+
private async startBrowser(
|
|
1244
|
+
agentSessionID: string,
|
|
1245
|
+
scope: OwnedBrowserScope,
|
|
1246
|
+
contextUser: UserInfo,
|
|
1247
|
+
providerName: string | undefined,
|
|
1248
|
+
instanceKey?: string,
|
|
1249
|
+
): Promise<IRemoteBrowserSession> {
|
|
1250
|
+
if (scope.IsConversation) {
|
|
1251
|
+
const settings = this.ConversationBrowserSettings();
|
|
1252
|
+
// ponytail: an action that joins a launch a concurrent End then tears down keeps this slot until the
|
|
1253
|
+
// reaper frees it (idleMinutes); release it on that teardown if users hit maxPerUser this way.
|
|
1254
|
+
// An anonymous guest's cap is its own: every guest is the one shared Anonymous user.
|
|
1255
|
+
const guestScope = contextUser.IsMagicLinkAnonymous ? ResolveSessionScopeIdentity(contextUser) : undefined;
|
|
1256
|
+
const owner = { Key: guestScope ? `scope:${guestScope}` : `user:${NormalizeUUID(contextUser.ID)}`, Anonymous: Boolean(contextUser.IsMagicLinkAnonymous) };
|
|
1257
|
+
ConversationBrowserLedger.Instance.Claim(agentSessionID, owner, settings);
|
|
1258
|
+
// Set once, before the browser launches; the engine re-applies it to any replacement.
|
|
1259
|
+
if (!RemoteBrowserEngine.Instance.GetSessionForAgentSession(agentSessionID, instanceKey)) {
|
|
1260
|
+
await RemoteBrowserEngine.Instance.RestrictPrivateNetworkForAgentSession(agentSessionID, settings.allowedPrivateHosts);
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
try {
|
|
1264
|
+
return await RemoteBrowserEngine.Instance.StartSessionForAgentSession(agentSessionID, contextUser, providerName, instanceKey);
|
|
1265
|
+
} catch (err) {
|
|
1266
|
+
if (scope.IsConversation && !RemoteBrowserEngine.Instance.GetSessionForAgentSession(agentSessionID, instanceKey)) {
|
|
1267
|
+
ConversationBrowserLedger.Instance.Release(agentSessionID);
|
|
1268
|
+
}
|
|
1269
|
+
throw err;
|
|
1093
1270
|
}
|
|
1094
|
-
return session;
|
|
1095
1271
|
}
|
|
1096
1272
|
|
|
1097
1273
|
/**
|
|
@@ -1100,10 +1276,13 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
1100
1276
|
* config, or unparseable JSON all yield `undefined`, letting the engine fall back to the single Active
|
|
1101
1277
|
* provider.
|
|
1102
1278
|
*
|
|
1103
|
-
* @param session The owned
|
|
1279
|
+
* @param session The owned scope (supplies the agent id; a conversation has none).
|
|
1104
1280
|
* @returns The configured backend name, or `undefined` to let the engine auto-select.
|
|
1105
1281
|
*/
|
|
1106
|
-
protected async resolveProviderName(session:
|
|
1282
|
+
protected async resolveProviderName(session: OwnedBrowserScope, contextUser: UserInfo, provider: IMetadataProvider): Promise<string | undefined> {
|
|
1283
|
+
if (!session.AgentID) {
|
|
1284
|
+
return undefined;
|
|
1285
|
+
}
|
|
1107
1286
|
// The session's agent IS the co-agent (the realtime voice agent), and the interactive channels
|
|
1108
1287
|
// (Remote Browser, Whiteboard) are the CO-AGENT's abilities — so the remoteBrowser backend config
|
|
1109
1288
|
// lives on the co-agent's TypeConfiguration, not on the target agent it voices.
|
|
@@ -1154,6 +1333,7 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
1154
1333
|
kind: string;
|
|
1155
1334
|
url?: string;
|
|
1156
1335
|
selector?: string;
|
|
1336
|
+
ref?: string;
|
|
1157
1337
|
x?: number;
|
|
1158
1338
|
y?: number;
|
|
1159
1339
|
text?: string;
|
|
@@ -1161,13 +1341,21 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
1161
1341
|
deltaX?: number;
|
|
1162
1342
|
deltaY?: number;
|
|
1163
1343
|
ms?: number;
|
|
1344
|
+
valuesJson?: string;
|
|
1164
1345
|
}): RemoteBrowserAction | null {
|
|
1165
1346
|
switch (input.kind) {
|
|
1166
1347
|
case 'navigate':
|
|
1167
1348
|
return input.url ? { Kind: 'navigate', Url: input.url } : null;
|
|
1168
1349
|
case 'click':
|
|
1169
|
-
if (input.selector || (typeof input.x === 'number' && typeof input.y === 'number')) {
|
|
1170
|
-
return {
|
|
1350
|
+
if (input.selector || input.ref || input.text || (typeof input.x === 'number' && typeof input.y === 'number')) {
|
|
1351
|
+
return {
|
|
1352
|
+
Kind: 'click',
|
|
1353
|
+
Selector: input.selector,
|
|
1354
|
+
Ref: input.ref,
|
|
1355
|
+
Text: input.text,
|
|
1356
|
+
X: input.x,
|
|
1357
|
+
Y: input.y,
|
|
1358
|
+
};
|
|
1171
1359
|
}
|
|
1172
1360
|
return null;
|
|
1173
1361
|
case 'type':
|
|
@@ -1188,11 +1376,38 @@ export class RemoteBrowserActionResolver extends ResolverBase {
|
|
|
1188
1376
|
return { Kind: 'wait', Ms: input.ms, Selector: input.selector };
|
|
1189
1377
|
}
|
|
1190
1378
|
return null;
|
|
1379
|
+
case 'inspect':
|
|
1380
|
+
return { Kind: 'inspect' };
|
|
1381
|
+
case 'getPageText':
|
|
1382
|
+
return { Kind: 'getPageText' };
|
|
1383
|
+
case 'fill': {
|
|
1384
|
+
const values = this.parseFillValues(input.valuesJson);
|
|
1385
|
+
return values.length > 0 ? { Kind: 'fill', Values: values } : null;
|
|
1386
|
+
}
|
|
1191
1387
|
default:
|
|
1192
1388
|
return null;
|
|
1193
1389
|
}
|
|
1194
1390
|
}
|
|
1195
1391
|
|
|
1392
|
+
/**
|
|
1393
|
+
* Parses the `valuesJson` payload for a `fill` action: a JSON object mapping a field ref (`f1`) or
|
|
1394
|
+
* label to its value (`string`, or `boolean` for a checkbox). Anything else yields no values.
|
|
1395
|
+
*/
|
|
1396
|
+
private parseFillValues(valuesJson?: string): RemoteBrowserFillFieldInput[] {
|
|
1397
|
+
let parsed: unknown;
|
|
1398
|
+
try {
|
|
1399
|
+
parsed = JSON.parse(valuesJson ?? '');
|
|
1400
|
+
} catch {
|
|
1401
|
+
return [];
|
|
1402
|
+
}
|
|
1403
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
1404
|
+
return [];
|
|
1405
|
+
}
|
|
1406
|
+
return Object.entries(parsed as Record<string, unknown>)
|
|
1407
|
+
.filter(([target, value]) => target.trim().length > 0 && value !== undefined && value !== null)
|
|
1408
|
+
.map(([target, value]) => ({ Target: target.trim(), Value: typeof value === 'boolean' ? value : String(value) }));
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1196
1411
|
/**
|
|
1197
1412
|
* Builds a strongly-typed {@link RemoteBrowserHumanInput} from the relayed `kind` + fields, validating
|
|
1198
1413
|
* each kind's required field(s). Returns `null` for an unknown kind or a kind missing its required
|