@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,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression suite for the ad-hoc read-only execution path being SQL-Server-shaped.
|
|
3
|
+
*
|
|
4
|
+
* The bug — `ExecuteAdhocQuery` opened with
|
|
5
|
+
* `GetReadOnlyDataSource(context.dataSources, …)`, which looks for an **mssql
|
|
6
|
+
* `ConnectionPool`**. A PostgreSQL provider never populates `context.dataSources`
|
|
7
|
+
* with one, so every ad-hoc query on PostgreSQL returned
|
|
8
|
+
* "No read-only data source available for ad-hoc query execution".
|
|
9
|
+
*
|
|
10
|
+
* `next` fixed the execution path (R31): the resolver now hands the SQL to the
|
|
11
|
+
* read-only PROVIDER's `RunQuery`, and renders it for that provider's platform.
|
|
12
|
+
* This suite pins the dialect half of that contract — the platform comes from the
|
|
13
|
+
* provider the SQL runs on, never from a literal, and nothing reaches for mssql —
|
|
14
|
+
* and drives the resolver against a PostgreSQL provider with no mssql pool at all.
|
|
15
|
+
* Paging, the timeout clamp and the read authorizer have their own suites.
|
|
16
|
+
*/
|
|
17
|
+
import 'reflect-metadata';
|
|
18
|
+
|
|
19
|
+
import { describe, it, expect, vi, afterEach } from 'vitest';
|
|
20
|
+
import { readFileSync } from 'fs';
|
|
21
|
+
import { resolve } from 'path';
|
|
22
|
+
|
|
23
|
+
// `RunQueryResultType` is a type-graphql object type whose fields rely on
|
|
24
|
+
// `emitDecoratorMetadata`. esbuild (what vitest transforms with) cannot emit it,
|
|
25
|
+
// so importing QueryResolver for real fails at decoration time. The resolver only
|
|
26
|
+
// uses the class as the @Query return marker, so a bare stand-in is enough and
|
|
27
|
+
// keeps the REAL AdhocQueryResolver under test.
|
|
28
|
+
vi.mock('../resolvers/QueryResolver.js', () => ({
|
|
29
|
+
RunQueryResultType: class RunQueryResultType {},
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
// The server config is read from mj.config at import; only the timeout cap is used here.
|
|
33
|
+
vi.mock('../config.js', () => ({ configInfo: { databaseSettings: { requestTimeout: 120_000 } } }));
|
|
34
|
+
|
|
35
|
+
import { AdhocQueryResolver } from '../resolvers/AdhocQueryResolver.js';
|
|
36
|
+
import type { AppContext } from '../types.js';
|
|
37
|
+
|
|
38
|
+
const ADHOC_RESOLVER_PATH = resolve(__dirname, '../resolvers/AdhocQueryResolver.ts');
|
|
39
|
+
|
|
40
|
+
function readResolverSource(): string {
|
|
41
|
+
return readFileSync(ADHOC_RESOLVER_PATH, 'utf8');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type RunQueryCall = { SQL: string; MaxRows?: number; StartRow?: number };
|
|
45
|
+
|
|
46
|
+
function postgresContext(calls: RunQueryCall[], rows: Record<string, unknown>[]): AppContext {
|
|
47
|
+
const provider = {
|
|
48
|
+
PlatformKey: 'postgresql',
|
|
49
|
+
RunQuery: async (params: RunQueryCall) => {
|
|
50
|
+
calls.push(params);
|
|
51
|
+
return { Success: true, Results: rows, RowCount: rows.length, TotalRowCount: rows.length };
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
// Deliberately EMPTY: a PostgreSQL tenant has no mssql ConnectionPool here.
|
|
56
|
+
// If the resolver still reaches for one, these tests fail.
|
|
57
|
+
dataSources: [],
|
|
58
|
+
providers: [{ type: 'Read-Only', provider }],
|
|
59
|
+
userPayload: { userRecord: { ID: 'u-1', Name: 'Tester' } },
|
|
60
|
+
} as unknown as AppContext;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
vi.restoreAllMocks();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('AdhocQueryResolver dialect source-shape contract', () => {
|
|
68
|
+
it('must NOT gate execution on a SQL-Server-only read-only data source', () => {
|
|
69
|
+
expect(readResolverSource()).not.toContain('GetReadOnlyDataSource');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('must NOT depend on the mssql driver', () => {
|
|
73
|
+
const src = readResolverSource();
|
|
74
|
+
expect(src).not.toMatch(/^import .* from 'mssql';$/m);
|
|
75
|
+
expect(src).not.toContain('new sql.Request(');
|
|
76
|
+
expect(src).not.toContain('sql.ConnectionPool');
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('renders for the platform of the read-only provider the SQL runs on, not a literal', () => {
|
|
80
|
+
const src = readResolverSource();
|
|
81
|
+
expect(src).toContain('GetReadOnlyProvider(context.providers');
|
|
82
|
+
expect(src).toContain('Platform: provider.PlatformKey');
|
|
83
|
+
expect(src).not.toMatch(/platform\s*(:\s*DatabasePlatform\s*)?=\s*'sqlserver'/);
|
|
84
|
+
expect(src).not.toMatch(/Platform:\s*'sqlserver'/);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe('ExecuteAdhocQuery on a PostgreSQL tenant', () => {
|
|
89
|
+
it('runs on the read-only provider instead of refusing for want of an mssql pool', async () => {
|
|
90
|
+
const resolver = new AdhocQueryResolver();
|
|
91
|
+
const authorize = vi.spyOn(resolver, 'AuthorizeRenderedSQL').mockReturnValue(null);
|
|
92
|
+
const calls: RunQueryCall[] = [];
|
|
93
|
+
|
|
94
|
+
const result = await resolver.ExecuteAdhocQuery(
|
|
95
|
+
{ SQL: 'SELECT ID FROM __mj.vwUsers' },
|
|
96
|
+
postgresContext(calls, [{ ID: '1' }, { ID: '2' }]),
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
expect(result.ErrorMessage).not.toContain('No read-only data source');
|
|
100
|
+
expect(result.Success).toBe(true);
|
|
101
|
+
expect(calls).toHaveLength(1);
|
|
102
|
+
expect(calls[0].SQL).toBe('SELECT ID FROM __mj.vwUsers');
|
|
103
|
+
expect(JSON.parse(result.Results)).toEqual([{ ID: '1' }, { ID: '2' }]);
|
|
104
|
+
// The SQL is authorized (and so rendered) against the same PostgreSQL provider it runs on.
|
|
105
|
+
expect((authorize.mock.calls[0][1] as { PlatformKey: string }).PlatformKey).toBe('postgresql');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('ExecuteAdhocQuery refusal path', () => {
|
|
110
|
+
it('still refuses when there is no read-only provider at all', async () => {
|
|
111
|
+
const resolver = new AdhocQueryResolver();
|
|
112
|
+
|
|
113
|
+
const result = await resolver.ExecuteAdhocQuery(
|
|
114
|
+
{ SQL: 'SELECT ID FROM __mj.vwUsers' },
|
|
115
|
+
{ dataSources: [], providers: [], userPayload: { userRecord: { ID: 'u-1' } } } as unknown as AppContext,
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
expect(result.Success).toBe(false);
|
|
119
|
+
expect(result.ErrorMessage).toContain('No read-only data source available for ad-hoc query execution');
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('does NOT fall back to a read-write provider', async () => {
|
|
123
|
+
const resolver = new AdhocQueryResolver();
|
|
124
|
+
|
|
125
|
+
const result = await resolver.ExecuteAdhocQuery(
|
|
126
|
+
{ SQL: 'SELECT ID FROM __mj.vwUsers' },
|
|
127
|
+
{
|
|
128
|
+
dataSources: [],
|
|
129
|
+
providers: [{ type: 'Read-Write', provider: { PlatformKey: 'postgresql', RunQuery: async () => ({ Success: true, Results: [] }) } }],
|
|
130
|
+
userPayload: { userRecord: { ID: 'u-1' } },
|
|
131
|
+
} as unknown as AppContext,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
expect(result.Success).toBe(false);
|
|
135
|
+
expect(result.ErrorMessage).toContain('No read-only data source available');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
@@ -29,6 +29,7 @@ vi.mock('@memberjunction/graphql-dataprovider', () => ({
|
|
|
29
29
|
import type { ExecuteAgentResult } from '@memberjunction/ai-core-plus';
|
|
30
30
|
import { ConversationStreaming, type IConversationsRuntimeContext } from '@memberjunction/conversations-runtime';
|
|
31
31
|
import { AgentRunStatusPublisher } from '../resolvers/AgentRunStatusPublisher.js';
|
|
32
|
+
import { StatusUpdatesFilter, type PushStatusNotificationPayload } from '../generic/PushStatusResolver.js';
|
|
32
33
|
import type { UserPayload } from '../types.js';
|
|
33
34
|
|
|
34
35
|
const run = {
|
|
@@ -56,6 +57,31 @@ function envelopes(publish: ReturnType<typeof vi.fn>): Array<Record<string, unkn
|
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
describe('AgentRunStatusPublisher', () => {
|
|
60
|
+
it('stamps the reply row on every message when it has one, so a reconnecting client can find its row', () => {
|
|
61
|
+
const publish = vi.fn().mockResolvedValue(undefined);
|
|
62
|
+
const pubSub = { publish } as unknown as PubSubEngine;
|
|
63
|
+
const userPayload = { sessionId: 'session-1', userRecord: { ID: 'user-1' } } as UserPayload;
|
|
64
|
+
const made = new AgentRunStatusPublisher(pubSub, userPayload, 'session-1', 'reply-7');
|
|
65
|
+
const runWithoutDetail = { ...run, ConversationDetailID: undefined, GetAll: () => ({ ID: 'run-1' }) };
|
|
66
|
+
|
|
67
|
+
made.OnProgress({ step: 'prompt_execution', message: 'Writing', metadata: { agentRun: runWithoutDetail } });
|
|
68
|
+
made.OnStreaming({ content: 'Hel', isComplete: false, stepType: 'prompt', kind: 'final-response' });
|
|
69
|
+
made.PublishFinal({ success: true, agentRun: runWithoutDetail } as unknown as ExecuteAgentResult);
|
|
70
|
+
|
|
71
|
+
const details = envelopes(publish).map((row) => (row.data as { conversationDetailId?: string }).conversationDetailId);
|
|
72
|
+
expect(details).toEqual(['reply-7', 'reply-7', 'reply-7', 'reply-7']);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('leaves progress and streaming messages without a reply row when it has none, as before', () => {
|
|
76
|
+
const { publish, made } = publisher();
|
|
77
|
+
|
|
78
|
+
made.OnProgress({ step: 'prompt_execution', message: 'Writing', metadata: { agentRun: run } });
|
|
79
|
+
made.OnStreaming({ content: 'Hel', isComplete: false, stepType: 'prompt', kind: 'final-response' });
|
|
80
|
+
|
|
81
|
+
const sent = envelopes(publish).map((row) => row.data as Record<string, unknown>);
|
|
82
|
+
expect(sent.every((data) => !('conversationDetailId' in data))).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
|
|
59
85
|
it('publishes the resolver sequence: a significant step, streamed text, the partial result, then the completion', () => {
|
|
60
86
|
const { publish, made } = publisher();
|
|
61
87
|
|
|
@@ -173,3 +199,26 @@ describe('AgentRunStatusPublisher', () => {
|
|
|
173
199
|
expect(streaming.GetRecentCompletion('detail-1')?.agentRunId).toBe('run-1');
|
|
174
200
|
});
|
|
175
201
|
});
|
|
202
|
+
|
|
203
|
+
describe('AgentRunStatusPublisher — a widget guest elevated to the system user (#4931)', () => {
|
|
204
|
+
const GUEST = { ID: 'anonymous-user', IsMagicLinkAnonymous: true, AnonymousVisitorID: 'sid-a', MagicLinkScope: { ResourceID: 'sid-a' } };
|
|
205
|
+
const SYSTEM = { ID: 'system-user' };
|
|
206
|
+
|
|
207
|
+
it("stamps the guest (ElevatedFrom), not the elevated user, so the guest's own socket receives the run's events", () => {
|
|
208
|
+
const publish = vi.fn().mockResolvedValue(undefined);
|
|
209
|
+
const elevated = { sessionId: 'session-1', userRecord: SYSTEM, isSystemUser: true, ElevatedFrom: GUEST } as unknown as UserPayload;
|
|
210
|
+
const made = new AgentRunStatusPublisher({ publish } as unknown as PubSubEngine, elevated, 'session-1');
|
|
211
|
+
|
|
212
|
+
made.PublishFinal({ success: true, agentRun: run, payload: { text: 'Hello' } } as ExecuteAgentResult, 'detail-1', '{"text":"Hello"}');
|
|
213
|
+
made.PublishFailure('detail-1', 'boom');
|
|
214
|
+
|
|
215
|
+
const owners = publish.mock.calls.map((call) => (call[1] as { ownerUserId: string }).ownerUserId);
|
|
216
|
+
expect(owners.length).toBeGreaterThan(0);
|
|
217
|
+
// An anonymous visitor's owner key carries its scope identity, so another visitor cannot receive these events.
|
|
218
|
+
expect(owners.every((owner) => owner === 'anonymous-user|sid-a')).toBe(true);
|
|
219
|
+
const guestConnection = { userPayload: { sessionId: 'session-1', userRecord: GUEST } as unknown as UserPayload };
|
|
220
|
+
for (const call of publish.mock.calls) {
|
|
221
|
+
expect(StatusUpdatesFilter({ payload: call[1] as PushStatusNotificationPayload, args: { sessionId: 'session-1' }, context: guestConnection })).toBe(true);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
});
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import type { IMetadataProvider, UserInfo } from '@memberjunction/core';
|
|
3
|
+
import type { AppContext } from '../types.js';
|
|
4
|
+
|
|
5
|
+
vi.mock('type-graphql', () => {
|
|
6
|
+
const noopDecorator = () => () => undefined;
|
|
7
|
+
return {
|
|
8
|
+
Resolver: noopDecorator,
|
|
9
|
+
Mutation: noopDecorator,
|
|
10
|
+
Arg: noopDecorator,
|
|
11
|
+
Ctx: noopDecorator,
|
|
12
|
+
ObjectType: noopDecorator,
|
|
13
|
+
Field: noopDecorator,
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
vi.mock('../generic/ResolverBase.js', () => ({
|
|
18
|
+
ResolverBase: class {
|
|
19
|
+
protected GetUserFromPayload(payload?: { userRecord?: UserInfo }): UserInfo | undefined {
|
|
20
|
+
return payload?.userRecord;
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
const closeSessionMock = vi.fn(async () => true);
|
|
26
|
+
const heartbeatMock = vi.fn(async () => true);
|
|
27
|
+
|
|
28
|
+
vi.mock('../agentSessions/index.js', () => ({
|
|
29
|
+
SessionManager: class {
|
|
30
|
+
CloseSession = closeSessionMock;
|
|
31
|
+
Heartbeat = heartbeatMock;
|
|
32
|
+
},
|
|
33
|
+
SessionAuthorizationError: class extends Error {},
|
|
34
|
+
}));
|
|
35
|
+
|
|
36
|
+
import { AgentSessionResolver } from '../resolvers/AgentSessionResolver.js';
|
|
37
|
+
|
|
38
|
+
const uuid = (a: string, b: string) =>
|
|
39
|
+
[a.repeat(8), b.repeat(4), '4' + b.repeat(3), '8' + b.repeat(3), b.repeat(12)].join('-');
|
|
40
|
+
const ANON = uuid('A', '0');
|
|
41
|
+
const SESSION = uuid('1', '1');
|
|
42
|
+
const CONVERSATION = uuid('2', '2');
|
|
43
|
+
|
|
44
|
+
const guest = (visitorId: string) =>
|
|
45
|
+
({
|
|
46
|
+
ID: ANON,
|
|
47
|
+
IsMagicLinkAnonymous: true,
|
|
48
|
+
// An unscoped multi-use invite: redemptions are told apart by mj_sid (a resource scope would be shared).
|
|
49
|
+
AnonymousVisitorID: visitorId,
|
|
50
|
+
}) as unknown as UserInfo;
|
|
51
|
+
|
|
52
|
+
function makeProvider(sessionFound = true, externalId = 'visitor-1'): IMetadataProvider {
|
|
53
|
+
return {
|
|
54
|
+
GetEntityObject: vi.fn(async (entityName: string) =>
|
|
55
|
+
entityName === 'MJ: AI Agent Sessions'
|
|
56
|
+
? { UserID: ANON, ConversationID: CONVERSATION, Load: vi.fn(async () => sessionFound) }
|
|
57
|
+
: { ExternalID: externalId, Load: vi.fn(async () => true) },
|
|
58
|
+
),
|
|
59
|
+
} as unknown as IMetadataProvider;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function makeCtx(user: UserInfo, provider: IMetadataProvider): AppContext {
|
|
63
|
+
return {
|
|
64
|
+
userPayload: { email: 'anonymous@magic-link.local', sessionId: 's', userRecord: user },
|
|
65
|
+
providers: [{ provider, type: 'Read-Write' }],
|
|
66
|
+
} as unknown as AppContext;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
describe('AgentSessionResolver anonymous visitor ownership', () => {
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
closeSessionMock.mockClear();
|
|
72
|
+
heartbeatMock.mockClear();
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('CloseAgentSession allows the matching anonymous visitor and refuses a second anonymous visitor', async () => {
|
|
76
|
+
const resolver = new AgentSessionResolver();
|
|
77
|
+
const provider = makeProvider(true, 'visitor-1');
|
|
78
|
+
|
|
79
|
+
await expect(resolver.CloseAgentSession(SESSION, makeCtx(guest('visitor-1'), provider))).resolves.toBe(true);
|
|
80
|
+
expect(closeSessionMock).toHaveBeenCalledOnce();
|
|
81
|
+
|
|
82
|
+
await expect(resolver.CloseAgentSession(SESSION, makeCtx(guest('visitor-2'), provider))).rejects.toThrow(
|
|
83
|
+
'Not authorized: you do not own this agent session',
|
|
84
|
+
);
|
|
85
|
+
expect(closeSessionMock).toHaveBeenCalledOnce();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('AgentSessionHeartbeat allows the matching anonymous visitor and refuses a second anonymous visitor', async () => {
|
|
89
|
+
const resolver = new AgentSessionResolver();
|
|
90
|
+
const provider = makeProvider(true, 'visitor-1');
|
|
91
|
+
|
|
92
|
+
await expect(resolver.AgentSessionHeartbeat(SESSION, makeCtx(guest('visitor-1'), provider))).resolves.toBe(true);
|
|
93
|
+
expect(heartbeatMock).toHaveBeenCalledOnce();
|
|
94
|
+
|
|
95
|
+
await expect(resolver.AgentSessionHeartbeat(SESSION, makeCtx(guest('visitor-2'), provider))).rejects.toThrow(
|
|
96
|
+
'Not authorized: you do not own this agent session',
|
|
97
|
+
);
|
|
98
|
+
expect(heartbeatMock).toHaveBeenCalledOnce();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('throws the expected not-found message when the session does not exist', async () => {
|
|
102
|
+
const resolver = new AgentSessionResolver();
|
|
103
|
+
const provider = makeProvider(false);
|
|
104
|
+
|
|
105
|
+
await expect(resolver.CloseAgentSession(SESSION, makeCtx(guest('visitor-1'), provider))).rejects.toThrow(
|
|
106
|
+
`Agent session ${SESSION} not found`,
|
|
107
|
+
);
|
|
108
|
+
await expect(resolver.AgentSessionHeartbeat(SESSION, makeCtx(guest('visitor-1'), provider))).rejects.toThrow(
|
|
109
|
+
`Agent session ${SESSION} not found`,
|
|
110
|
+
);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
describe('CloseAgentSession close reason (MJ#6013)', () => {
|
|
115
|
+
beforeEach(() => closeSessionMock.mockClear());
|
|
116
|
+
|
|
117
|
+
it('passes a client-reportable reason through, so a start that failed is recorded as an Error', async () => {
|
|
118
|
+
const resolver = new AgentSessionResolver();
|
|
119
|
+
const provider = makeProvider(true, 'visitor-1');
|
|
120
|
+
await expect(resolver.CloseAgentSession(SESSION, makeCtx(guest('visitor-1'), provider), 'Error')).resolves.toBe(true);
|
|
121
|
+
expect(closeSessionMock).toHaveBeenCalledWith(SESSION, expect.anything(), provider, 'Error');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('defaults to Explicit when the client sends no reason (older clients)', async () => {
|
|
125
|
+
const resolver = new AgentSessionResolver();
|
|
126
|
+
const provider = makeProvider(true, 'visitor-1');
|
|
127
|
+
await expect(resolver.CloseAgentSession(SESSION, makeCtx(guest('visitor-1'), provider))).resolves.toBe(true);
|
|
128
|
+
expect(closeSessionMock).toHaveBeenCalledWith(SESSION, expect.anything(), provider, 'Explicit');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('a client may stamp TimeLimit (CloseSession verifies it); Janitor, Shutdown and Idle are still refused', async () => {
|
|
132
|
+
const resolver = new AgentSessionResolver();
|
|
133
|
+
const provider = makeProvider(true, 'visitor-1');
|
|
134
|
+
const ctx = makeCtx(guest('visitor-1'), provider);
|
|
135
|
+
await expect(resolver.CloseAgentSession(SESSION, ctx, 'TimeLimit')).resolves.toBe(true);
|
|
136
|
+
expect(closeSessionMock).toHaveBeenCalledWith(SESSION, expect.anything(), provider, 'TimeLimit');
|
|
137
|
+
closeSessionMock.mockClear();
|
|
138
|
+
for (const reason of ['Janitor', 'Shutdown', 'Idle']) {
|
|
139
|
+
await expect(resolver.CloseAgentSession(SESSION, ctx, reason)).rejects.toThrow(/Unsupported close reason/);
|
|
140
|
+
}
|
|
141
|
+
expect(closeSessionMock).not.toHaveBeenCalled();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('refuses a reason only the server may stamp', async () => {
|
|
145
|
+
const resolver = new AgentSessionResolver();
|
|
146
|
+
const provider = makeProvider(true, 'visitor-1');
|
|
147
|
+
await expect(resolver.CloseAgentSession(SESSION, makeCtx(guest('visitor-1'), provider), 'Janitor')).rejects.toThrow(/close reason/i);
|
|
148
|
+
expect(closeSessionMock).not.toHaveBeenCalled();
|
|
149
|
+
});
|
|
150
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An apply whose selected objects all drop out of buildTargetConfigs must fail, not run RSU on
|
|
3
|
+
* nothing (PropFuel, 2026-10-29). A selection that produces even one table must still apply.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import { readFileSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import type { TargetTableConfig } from '@memberjunction/integration-schema-builder';
|
|
9
|
+
import { AssertTargetConfigs, NewTargetConfigDrops, SampleNames } from '../integration/TargetConfigGuard.js';
|
|
10
|
+
|
|
11
|
+
const selected = [{ SourceObjectName: 'clicks' }, { SourceObjectName: 'sends' }, { SourceObjectName: 'opens' }];
|
|
12
|
+
const oneTable = [{ SchemaName: 'propfuel', TableName: 'clicks' } as TargetTableConfig];
|
|
13
|
+
|
|
14
|
+
describe('AssertTargetConfigs', () => {
|
|
15
|
+
it('refuses a selection none of whose objects produced a table, naming what was asked for', () => {
|
|
16
|
+
expect(() => AssertTargetConfigs(selected, [], 'PropFuel')).toThrow(
|
|
17
|
+
/NO_TARGET_TABLES: none of the 3 selected object\(s\) for PropFuel produced a target table \(clicks, sends, opens\)/
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('names why each object was dropped, so a caller does not need the server log', () => {
|
|
22
|
+
const drops = NewTargetConfigDrops();
|
|
23
|
+
drops.NotInSchema.push('clicks', 'sends');
|
|
24
|
+
drops.NoPrimaryKey.push('opens');
|
|
25
|
+
expect(() => AssertTargetConfigs(selected, [], 'PropFuel', drops)).toThrow(
|
|
26
|
+
'Dropped as not in the source schema: clicks, sends; no primary key: opens.'
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('says nothing was applied by default, and what was already committed when the caller says so', () => {
|
|
31
|
+
expect(() => AssertTargetConfigs(selected, [], 'PropFuel')).toThrow('Nothing was applied.');
|
|
32
|
+
expect(() => AssertTargetConfigs(selected, [], 'PropFuel', undefined, 'The catalog had already been saved.'))
|
|
33
|
+
.toThrow(/The catalog had already been saved\. Re-run discovery/);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('caps the names it lists, so a large selection cannot make a multi-KB error', () => {
|
|
37
|
+
const many = Array.from({ length: 168 }, (_v, i) => ({ SourceObjectName: `obj${i}` }));
|
|
38
|
+
expect(() => AssertTargetConfigs(many, [], 'NetForum')).toThrow('(obj0, obj1, obj2, obj3, obj4 and 163 more)');
|
|
39
|
+
expect(SampleNames(['a', 'b'])).toBe('a, b');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('lets a selection through when at least one object produced a table', () => {
|
|
43
|
+
expect(() => AssertTargetConfigs(selected, oneTable, 'PropFuel')).not.toThrow();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('lets an empty selection through — there was nothing to refuse', () => {
|
|
47
|
+
expect(() => AssertTargetConfigs([], [], 'PropFuel')).not.toThrow();
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Read from source: the call sites are resolver mutations that need a provider, a connector and an
|
|
53
|
+
* RSU pipeline to run.
|
|
54
|
+
*/
|
|
55
|
+
describe('the guard\'s callers', () => {
|
|
56
|
+
const SRC = readFileSync(join(__dirname, '..', 'resolvers', 'IntegrationDiscoveryResolver.ts'), 'utf-8');
|
|
57
|
+
|
|
58
|
+
it('IntegrationApplySchema filters on names whose casing resolveObjectInputs has corrected', () => {
|
|
59
|
+
// A filter built from the raw input is case-sensitive: `Clicks` for a stored `clicks` selected
|
|
60
|
+
// nothing, and the guard then told the caller to re-run discovery, which cannot fix casing.
|
|
61
|
+
const start = SRC.indexOf('async IntegrationApplySchema(');
|
|
62
|
+
const body = SRC.slice(start, SRC.indexOf('AssertTargetConfigs(', start));
|
|
63
|
+
const resolve = body.indexOf('await this.resolveObjectInputs(objects, sourceSchema, user);');
|
|
64
|
+
const names = body.indexOf('const resolvedNames = new Set(objects.map(o => o.SourceObjectName));');
|
|
65
|
+
expect(resolve).toBeGreaterThan(-1);
|
|
66
|
+
expect(names).toBeGreaterThan(resolve);
|
|
67
|
+
expect(body).toMatch(/sourceSchema\.Objects\.filter\(o => resolvedNames\.has\(o\.ExternalName\)\)/);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('every call passes the drop reasons, and schema evolution says what it had already committed', () => {
|
|
71
|
+
const calls = [...SRC.matchAll(/AssertTargetConfigs\(objects, targetConfigs, companyIntegration\.Integration, drops([\s\S]*?)\);/g)];
|
|
72
|
+
expect(calls).toHaveLength(3);
|
|
73
|
+
expect(calls.filter(c => /already been saved/.test(c[1]))).toHaveLength(1);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The two apply paths must agree, because the shared connector surface collapses onto the batch
|
|
3
|
+
* one. Two defects made them differ, and both are invisible until a surface migrates:
|
|
4
|
+
*
|
|
5
|
+
* - MJ-APPLY-12: the batch never made the first-apply full-sync determination, and its input
|
|
6
|
+
* declared `defaultValue: false` for FullSync, which made the null-coalesce dead code. A
|
|
7
|
+
* re-apply the caller left unspecified therefore ran INCREMENTAL against objects whose
|
|
8
|
+
* watermark the schema change had just reset. everything.txt: "for the very first RSU of a
|
|
9
|
+
* connector, the sync afterwards should be chosen to be full/incremental, but always full
|
|
10
|
+
* generally as the default."
|
|
11
|
+
* - MJ-APPLY-13: the batch's skipRestart branch never applied remove-as-disable, so
|
|
12
|
+
* UnselectedAction was a silent no-op and a deselected table kept syncing.
|
|
13
|
+
*
|
|
14
|
+
* Read from source: both live in a resolver that needs a provider, a connector and an RSU
|
|
15
|
+
* pipeline to invoke, and the property under test is a one-line policy, not a behaviour worth
|
|
16
|
+
* standing all that up to observe.
|
|
17
|
+
*/
|
|
18
|
+
import { describe, it, expect } from 'vitest';
|
|
19
|
+
import { readFileSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
|
|
22
|
+
const SRC = readFileSync(
|
|
23
|
+
join(__dirname, '..', 'resolvers', 'IntegrationDiscoveryResolver.ts'),
|
|
24
|
+
'utf-8',
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
/** The body of a named input class, up to its closing brace. */
|
|
28
|
+
function classBody(name: string): string {
|
|
29
|
+
const start = SRC.indexOf(`class ${name} {`);
|
|
30
|
+
expect(start, `${name} not found`).toBeGreaterThan(-1);
|
|
31
|
+
const rest = SRC.slice(start);
|
|
32
|
+
const end = rest.indexOf('\n}');
|
|
33
|
+
return end === -1 ? rest : rest.slice(0, end);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** The body of a named resolver method, up to the next method at the same indent. */
|
|
37
|
+
function methodBody(name: string): string {
|
|
38
|
+
const start = SRC.indexOf(`async ${name}(`);
|
|
39
|
+
expect(start, `${name} not found`).toBeGreaterThan(-1);
|
|
40
|
+
const rest = SRC.slice(start);
|
|
41
|
+
const end = rest.search(/\n @(Query|Mutation)\(/);
|
|
42
|
+
return end === -1 ? rest : rest.slice(0, end);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
describe('MJ-APPLY-12 first-apply full sync', () => {
|
|
46
|
+
it('the batch resolves FullSync from prior maps, not from a bare false', () => {
|
|
47
|
+
const body = methodBody('IntegrationApplyAllBatch');
|
|
48
|
+
expect(body).toMatch(/const fullSync = input\.FullSync\s*\?\?\s*!hadPriorMaps;/);
|
|
49
|
+
expect(body).toMatch(/FullSync:\s*fullSync,/);
|
|
50
|
+
expect(body).not.toMatch(/input\.FullSync\s*\?\?\s*false/);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('ApplyAllBatchInput.FullSync has NO defaultValue, or the coalesce is dead again', () => {
|
|
54
|
+
// Scope to the CLASS. There are several `FullSync?: boolean` fields in this file and a bare
|
|
55
|
+
// find() picks ApplyAllInput's, which would pass no matter what the batch input declared.
|
|
56
|
+
const body = classBody('ApplyAllBatchInput');
|
|
57
|
+
const line = body.split('\n').find(l => l.includes('FullSync?: boolean') && l.includes('@Field'));
|
|
58
|
+
expect(line, 'ApplyAllBatchInput.FullSync not found').toBeDefined();
|
|
59
|
+
expect(line!).not.toMatch(/defaultValue/);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('the single-connector path still does the same thing', () => {
|
|
63
|
+
expect(methodBody('IntegrationApplyAll')).toMatch(/input\.FullSync\s*\?\?\s*!hadPriorMaps/);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('the prior-maps read UUID-validates the connection id, like every other caller-supplied id', () => {
|
|
67
|
+
// The batch takes its CompanyIntegrationIDs from the caller. The rest of this resolver refuses a
|
|
68
|
+
// non-UUID id with sqlUuid before it reaches an ExtraFilter; quote-doubling is not that check.
|
|
69
|
+
const body = methodBody('IntegrationApplyAllBatch');
|
|
70
|
+
expect(body).toMatch(/CompanyIntegrationID='\$\{sqlUuid\(connInput\.CompanyIntegrationID, 'CompanyIntegrationID'\)\}'/);
|
|
71
|
+
expect(body).not.toMatch(/connInput\.CompanyIntegrationID\.replace\(/);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('the skipRestart branch starts its sync with the RESOLVED FullSync, as the restart path queues it', () => {
|
|
75
|
+
// The restart path carries the coalesced value in its PendingWork; the skipRestart branch starts
|
|
76
|
+
// the sync itself. Passing the raw input there means an omitted FullSync is undefined, which
|
|
77
|
+
// startSyncAfterApply reads as incremental — against tables the apply just created.
|
|
78
|
+
const body = methodBody('IntegrationApplyAllBatch');
|
|
79
|
+
const call = body.match(/this\.startSyncAfterApply\(build\.connInput\.CompanyIntegrationID,[^)]*\)/);
|
|
80
|
+
expect(call, 'skipRestart sync start not found').not.toBeNull();
|
|
81
|
+
expect(call![0]).not.toMatch(/input\.FullSync/);
|
|
82
|
+
expect(call![0]).toMatch(/build\.fullSync\)$/);
|
|
83
|
+
expect(body).toMatch(/^\s*fullSync,$/m);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('the prior-maps probe skips the row count, as the single path does', () => {
|
|
87
|
+
// MaxRows: 1 is an existence probe; without SkipTotalRowCount the provider follows every hit
|
|
88
|
+
// with a COUNT(*) over the connection's maps.
|
|
89
|
+
const body = methodBody('IntegrationApplyAllBatch');
|
|
90
|
+
const probe = body.slice(body.indexOf('const priorMapsResult'), body.indexOf('const hadPriorMaps'));
|
|
91
|
+
expect(probe).toMatch(/MaxRows:\s*1,/);
|
|
92
|
+
expect(probe).toMatch(/SkipTotalRowCount:\s*true/);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe('MJ-APPLY-13 remove-as-disable', () => {
|
|
97
|
+
it('the batch skipRestart branch disables unselected maps', () => {
|
|
98
|
+
const body = methodBody('IntegrationApplyAllBatch');
|
|
99
|
+
expect(body).toMatch(/UnselectedAction\s*\?\?\s*'disable'\)\s*!==\s*'ignore'/);
|
|
100
|
+
expect(body).toMatch(/DisableUnselectedEntityMaps\(/);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('and honours the ignore opt-out rather than always disabling', () => {
|
|
104
|
+
const body = methodBody('IntegrationApplyAllBatch');
|
|
105
|
+
const at = body.indexOf('DisableUnselectedEntityMaps(');
|
|
106
|
+
// the guard must precede the call, not follow it
|
|
107
|
+
expect(body.lastIndexOf("!== 'ignore'", at)).toBeGreaterThan(-1);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
@@ -230,3 +230,45 @@ describe('StartBridgeOrphanReconciliation', () => {
|
|
|
230
230
|
expect(runView.mock.calls[0][1]).toBe(user);
|
|
231
231
|
});
|
|
232
232
|
});
|
|
233
|
+
|
|
234
|
+
describe('StartBridgeOrphanReconciliation with agentSessions.bridgeReconciler settings', () => {
|
|
235
|
+
const HOUR = 60 * 60_000;
|
|
236
|
+
afterEach(() => {
|
|
237
|
+
vi.restoreAllMocks();
|
|
238
|
+
vi.useRealTimers();
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
it('enabled: reconciles now, then on the configured interval', async () => {
|
|
242
|
+
vi.useFakeTimers();
|
|
243
|
+
const reconcile = vi.spyOn(AIBridgeEngine.Instance, 'ReconcileOrphans').mockResolvedValue(0);
|
|
244
|
+
const { provider } = bridgeTable([]);
|
|
245
|
+
|
|
246
|
+
StartBridgeOrphanReconciliation(provider, user, { enabled: true, sweepIntervalMs: 120_000 });
|
|
247
|
+
await vi.advanceTimersByTimeAsync(6 * 60_000);
|
|
248
|
+
|
|
249
|
+
expect(reconcile).toHaveBeenCalledTimes(4); // now + every 2 minutes
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it('disabled: reconciles once now and never again', async () => {
|
|
253
|
+
vi.useFakeTimers();
|
|
254
|
+
const reconcile = vi.spyOn(AIBridgeEngine.Instance, 'ReconcileOrphans').mockResolvedValue(0);
|
|
255
|
+
const { provider } = bridgeTable([]);
|
|
256
|
+
|
|
257
|
+
StartBridgeOrphanReconciliation(provider, user, { enabled: false, sweepIntervalMs: 600_000 });
|
|
258
|
+
await vi.advanceTimersByTimeAsync(HOUR);
|
|
259
|
+
|
|
260
|
+
expect(reconcile).toHaveBeenCalledTimes(1);
|
|
261
|
+
expect(reconcile.mock.calls[0][0]).toBe(user);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('with no settings keeps the shipped 10-minute repeat', async () => {
|
|
265
|
+
vi.useFakeTimers();
|
|
266
|
+
const reconcile = vi.spyOn(AIBridgeEngine.Instance, 'ReconcileOrphans').mockResolvedValue(0);
|
|
267
|
+
const { provider } = bridgeTable([]);
|
|
268
|
+
|
|
269
|
+
StartBridgeOrphanReconciliation(provider, user);
|
|
270
|
+
await vi.advanceTimersByTimeAsync(HOUR);
|
|
271
|
+
|
|
272
|
+
expect(reconcile).toHaveBeenCalledTimes(7);
|
|
273
|
+
});
|
|
274
|
+
});
|