@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
package/dist/index.js
CHANGED
|
@@ -9,6 +9,8 @@ import { setupSQLServerClient, SQLServerDataProvider, SQLServerProviderConfigDat
|
|
|
9
9
|
import { extendConnectionPoolWithQuery } from './util.js';
|
|
10
10
|
import { registerIntegrationCustomColumnPromoter, IntegrationCustomColumnPromoter } from './integration/CustomColumnPromoter.js';
|
|
11
11
|
import { DisableUnselectedEntityMaps, ReenableFieldMapsForEntityMap, selectFieldsToMap } from './integration/EntityMapLifecycle.js';
|
|
12
|
+
import { RSUPostRestartProgressSession } from './integration/RSUPostRestartProgress.js';
|
|
13
|
+
import { IntrospectInCatalogScope } from './integration/PostRestartIntrospect.js';
|
|
12
14
|
import { default as BodyParser } from 'body-parser';
|
|
13
15
|
import compression from 'compression'; // Add compression middleware
|
|
14
16
|
import cors from 'cors';
|
|
@@ -29,13 +31,14 @@ import sql from 'mssql';
|
|
|
29
31
|
import { WebSocketServer } from 'ws';
|
|
30
32
|
import { RealtimeProxyServer } from './realtimeProxy/RealtimeProxyServer.js';
|
|
31
33
|
import buildApolloServer from './apolloServer/index.js';
|
|
32
|
-
import { configInfo, configFilePath, dbDatabase, dbHost, dbPort, dbUsername, graphqlPort, graphqlRootPath, mj_core_schema, websiteRunFromPackage } from './config.js';
|
|
34
|
+
import { configInfo, configFilePath, dbDatabase, dbHost, dbPort, dbUsername, graphqlPort, graphqlRootPath, mj_core_schema, websiteRunFromPackage, userEmailMap } from './config.js';
|
|
35
|
+
import { DescribeUserEmailMap } from './auth/loginEmailResolution.js';
|
|
33
36
|
import { TranslateBracketsToPG } from './postgresqlCompat.js';
|
|
34
37
|
import { BuildPostgreSQLConnectionConfig, DescribeReadOnlyLoginOverreach, PostgreSQLReadOnlyPool, ResolvePostgreSQLEndpoint, ResolvePostgreSQLReadOnlyCredentials, ToPGPoolConfig } from './postgresqlPoolSettings.js';
|
|
35
38
|
import { default as jwt } from 'jsonwebtoken';
|
|
36
39
|
import { contextFunction, CreateReadOnlyProvider, CreateUnifiedAuthMiddleware, getUserPayload } from './context.js';
|
|
37
40
|
import { requireSystemUserDirective, publicDirective } from './directives/index.js';
|
|
38
|
-
import {
|
|
41
|
+
import { ApplyRootVariablesLoggingMiddleware } from './logging/variablesLoggingMiddleware.js';
|
|
39
42
|
import { auditResolversForUndecoratedArgs } from './logging/bootAudit.js';
|
|
40
43
|
import { StartupLogger } from './logging/StartupLogger.js';
|
|
41
44
|
import { AuthProviderFactory } from '@memberjunction/auth-providers';
|
|
@@ -43,7 +46,7 @@ import createMSSQLConfig from './orm.js';
|
|
|
43
46
|
import { setupRESTEndpoints } from './rest/setupRESTEndpoints.js';
|
|
44
47
|
import { CreateRealtimeRecordingRouter, REALTIME_RECORDING_MOUNT_PATH } from './rest/RealtimeRecordingHandler.js';
|
|
45
48
|
import { LoadOwnedRealtimeSession } from './realtimeSessions/ownedRealtimeSession.js';
|
|
46
|
-
import {
|
|
49
|
+
import { AuthorizeAnonymousRoomSessions, AuthorizeLoadedSession } from './realtimeSessions/sessionAccess.js';
|
|
47
50
|
import { RecordingAssemblyScheduler } from './realtimeSessions/RecordingAssemblyScheduler.js';
|
|
48
51
|
import { RealtimeSessionEventService, ParseReplicatedRealtimeSessionEvent, } from './realtimeSessions/index.js';
|
|
49
52
|
import { resolve } from 'node:path';
|
|
@@ -51,20 +54,21 @@ import { DataSourceInfo, raiseEvent } from './types.js';
|
|
|
51
54
|
import { ScheduledJobsService } from './services/ScheduledJobsService.js';
|
|
52
55
|
import { IntegrationSyncWorkerService } from './services/IntegrationSyncWorkerService.js';
|
|
53
56
|
import { LocalCacheManager, TelemetryManager, LogStatus, LogError, SetVerboseLogging } from '@memberjunction/core';
|
|
54
|
-
import { validateAuthProvidersRegistered } from './auth/index.js';
|
|
57
|
+
import { getSystemUser, validateAuthProvidersRegistered } from './auth/index.js';
|
|
55
58
|
import { GetAPIKeyEngine } from '@memberjunction/api-keys';
|
|
56
59
|
import { ActionEngineServer } from '@memberjunction/actions';
|
|
57
60
|
import { CreateAdhocSQLAuthorizer } from './resolvers/AdhocQueryResolver.js';
|
|
58
61
|
import { CacheManagerConfigFromSettings, CreateSharedCacheFromEnvironment, StartEngineSweeper, StartMetadataSweep, StartUserCacheChecks, WarmupLeaseMsFromSettings, WirePushStatusFanOut, WireSharedCacheEvents } from './sharedCache.js';
|
|
59
62
|
import { PubSubManager } from './generic/PubSubManager.js';
|
|
60
|
-
import {
|
|
63
|
+
import { StartOrphanedConversationDetailReconciler } from './generic/OrphanedConversationDetailReconciler.js';
|
|
61
64
|
import { HANDOFF_OFFER_FANOUT_CHANNEL, HANDOFF_OFFER_TOPIC, SetHandoffOfferPublishHook, ParseReplicatedHandoffOfferUpdate, } from './resolvers/HumanHandoffResolver.js';
|
|
62
|
-
import { RoomHandoffEngine } from '@memberjunction/livekit-room-server';
|
|
63
|
-
import { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
|
|
65
|
+
import { RoomAuthorizationService, RoomHandoffEngine } from '@memberjunction/livekit-room-server';
|
|
66
|
+
import { IntegrationProgressEmitter, SweepInterruptedRuns } from '@memberjunction/integration-progress-artifacts';
|
|
64
67
|
import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResolver.js';
|
|
65
68
|
import { RegisterRSUProgressBridge } from './integration/RSUProgressBridge.js';
|
|
66
69
|
import { ClientToolRequestManager, AgentRunWatchdog, SqlRealtimeRecordingLedger } from '@memberjunction/ai-agents';
|
|
67
70
|
import { BindBridgeEngineHostInstance, SessionJanitor, SetHostInstancePort, StartBridgeOrphanReconciliation } from './agentSessions/index.js';
|
|
71
|
+
import { ApplyHandoffOfferExpirySettings } from './agentSessions/HandoffOfferExpiry.js';
|
|
68
72
|
import { StartTaskGraphDispatcher } from './services/StartTaskGraphDispatcher.js';
|
|
69
73
|
import { MJServerWorkQueueProviderSource, StartWorkQueueHost } from './services/WorkQueueHostService.js';
|
|
70
74
|
import { GetAttachmentService } from '@memberjunction/aiengine';
|
|
@@ -72,15 +76,22 @@ import { MJStorageBlobStore } from './services/MJStorageBlobStore.js';
|
|
|
72
76
|
import { CACHE_INVALIDATION_TOPIC, MayBroadcastRecordData, ConfigureRecordDataBroadcast } from './generic/CacheInvalidationResolver.js';
|
|
73
77
|
import { ConnectorFactory, IntegrationEngine } from '@memberjunction/integration-engine';
|
|
74
78
|
import { CronExpressionHelper } from '@memberjunction/scheduling-engine';
|
|
75
|
-
import { ServerExtensionLoader, mergeServerExtensionConfigs, prepareServerExtensionConfigs, describeServerExtensionMount, InstallMediaUpgradeDispatcher, IsGraphQLWsPath, GetCorsOwningServerExtensionRoots } from '@memberjunction/server-extensions-core';
|
|
79
|
+
import { ServerExtensionLoader, SERVER_EXTENSION_CORE_SERVICE_KEYS, mergeServerExtensionConfigs, prepareServerExtensionConfigs, describeServerExtensionMount, InstallMediaUpgradeDispatcher, IsGraphQLWsPath, GetCorsOwningServerExtensionRoots, } from '@memberjunction/server-extensions-core';
|
|
80
|
+
import { CreateIsolatedProvider } from './isolatedProvider.js';
|
|
81
|
+
import { ResolveConfiguredPrincipal } from './auth/principals.js';
|
|
76
82
|
import { CreateExtensionOwnedPreflightFallback, CreateGlobalCorsMiddleware } from './globalCors.js';
|
|
77
83
|
import { CoreReservedServerExtensionRoots } from './serverExtensionReservedRoots.js';
|
|
78
84
|
import { ApiRoute, ApiRootPath, ConfiguredPublicUrl } from './apiRoot.js';
|
|
79
85
|
import { MountHealthcheckRoute, MountPublicCoreRoutes, MountExtensionHealthRoute, MountAuthCatalogRoute, MountAuthenticatedCoreRoutes } from './coreRoutes.js';
|
|
80
86
|
import { MetadataCacheRefreshIntervalSeconds } from './providerConfigUnits.js';
|
|
81
87
|
import { CreateMetadataRefreshSignalHandler, METADATA_REFRESH_SIGNAL } from './metadataRefreshSignal.js';
|
|
88
|
+
import { CacheInvalidationBroadcastManager } from './broadcast/index.js';
|
|
89
|
+
import { ResolveServerRole, ShouldRunBackgroundWorkers } from './serverRoleConfigUnits.js';
|
|
82
90
|
const cacheRefreshInterval = configInfo.databaseSettings.metadataCacheRefreshInterval;
|
|
83
91
|
export { MetadataCacheRefreshIntervalSeconds } from './providerConfigUnits.js';
|
|
92
|
+
export * from './serverRoleConfigUnits.js';
|
|
93
|
+
export * from './broadcast/index.js';
|
|
94
|
+
export { ApplyRootVariablesLoggingMiddleware } from './logging/variablesLoggingMiddleware.js';
|
|
84
95
|
/**
|
|
85
96
|
* Returns the configured database platform from the `DB_PLATFORM` environment
|
|
86
97
|
* variable, falling back to `'sqlserver'` when the env var is unset. An
|
|
@@ -115,6 +126,7 @@ export * from './directives/index.js';
|
|
|
115
126
|
export { NoLog, hasNoLogParameter, getNoLogFields } from './logging/NoLog.js';
|
|
116
127
|
export * from './entitySubclasses/MJEntityPermissionEntityServer.server.js';
|
|
117
128
|
export * from './types.js';
|
|
129
|
+
export * from './requestOrigin.js';
|
|
118
130
|
export { getSystemUser, getSigningKeys, extractUserInfoFromPayload, verifyUserRecord, } from './auth/index.js';
|
|
119
131
|
export * from './auth/APIKeyScopeAuth.js';
|
|
120
132
|
export * from './auth/actingContextResolver.js';
|
|
@@ -263,8 +275,6 @@ function resolveServerVersion() {
|
|
|
263
275
|
return undefined;
|
|
264
276
|
}
|
|
265
277
|
}
|
|
266
|
-
/** How often to re-check for conversation details left behind by finished runs. */
|
|
267
|
-
const ORPHAN_DETAIL_SWEEP_INTERVAL_MS = 5 * 60_000;
|
|
268
278
|
/**
|
|
269
279
|
* Replicate handoff-offer updates across server instances over Redis.
|
|
270
280
|
*
|
|
@@ -359,6 +369,9 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
359
369
|
SetHostInstancePort(graphqlPort);
|
|
360
370
|
// The realtime bridge engine stamps its bridge rows with the same identity and reconciles orphans by it (#5310).
|
|
361
371
|
BindBridgeEngineHostInstance();
|
|
372
|
+
// An anonymous visitor may join only the LiveKit agent-session room it owns by scope; the room gate cannot import
|
|
373
|
+
// this package's session-access decision, so it is handed in here, before any resolver runs (MJ#6044).
|
|
374
|
+
RoomAuthorizationService.Instance.SetAnonymousSessionOwnerCheck(AuthorizeAnonymousRoomSessions);
|
|
362
375
|
// Level-gated startup logger. Resolves verbosity from telemetry.level (single
|
|
363
376
|
// operator knob). At `standard` (default), per-phase timings are collapsed into
|
|
364
377
|
// the one-line summary; at `verbose`+ each phase prints inline as before.
|
|
@@ -411,6 +424,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
411
424
|
// Every API pool carries the statement and idle-in-transaction timeouts from connection #1.
|
|
412
425
|
const pgConnectionConfig = BuildPostgreSQLConnectionConfig(pgEndpoint, configInfo.databaseSettings, 'api');
|
|
413
426
|
const pgPool = new pg.default.Pool(ToPGPoolConfig(pgConnectionConfig));
|
|
427
|
+
// An idle connection the server drops is emitted on the pool; without a listener Node exits.
|
|
428
|
+
pgPool.on('error', (err) => console.error('[PostgreSQL pool] Idle connection error (connection evicted):', err.message));
|
|
414
429
|
// Verify connection
|
|
415
430
|
const testClient = await pgPool.connect();
|
|
416
431
|
await testClient.query('SELECT 1');
|
|
@@ -426,6 +441,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
426
441
|
...ToPGPoolConfig(BuildPostgreSQLConnectionConfig({ ...pgEndpoint, ...pgReadOnlyCredentials }, configInfo.databaseSettings, 'read-only')),
|
|
427
442
|
types: MJPostgresTypes,
|
|
428
443
|
});
|
|
444
|
+
readOnlyPgPool.on('error', (err) => console.error('[PostgreSQL read-only pool] Idle connection error (connection evicted):', err.message));
|
|
429
445
|
const readOnlyTestClient = await readOnlyPgPool.connect();
|
|
430
446
|
try {
|
|
431
447
|
for (const warning of await DescribeReadOnlyLoginOverreach(readOnlyTestClient, mj_core_schema)) {
|
|
@@ -496,11 +512,19 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
496
512
|
// long CodeGen timeout rather than the API one, as the SQL Server CodeGen pool does.
|
|
497
513
|
const codegenPgConnectionConfig = BuildPostgreSQLConnectionConfig({ ...pgEndpoint, User: pgCodegenUser, Password: pgCodegenPass }, configInfo.databaseSettings, 'codegen');
|
|
498
514
|
const codegenPgPool = new pg.default.Pool(ToPGPoolConfig(codegenPgConnectionConfig));
|
|
515
|
+
codegenPgPool.on('error', (err) => console.error('[PostgreSQL CodeGen pool] Idle connection error (connection evicted):', err.message));
|
|
499
516
|
const codegenTestClient = await codegenPgPool.connect();
|
|
500
517
|
await codegenTestClient.query('SELECT 1');
|
|
501
518
|
codegenTestClient.release();
|
|
502
519
|
const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
|
|
503
|
-
|
|
520
|
+
// Adopt the already-loaded global Metadata.Provider catalog (ignoreExistingMetadata = false)
|
|
521
|
+
// so boot does not pay a second full metadata load. The refresh interval stays non-zero on
|
|
522
|
+
// PostgreSQL on purpose: PostgreSQLDataProvider.AllowRefresh is `CheckRefreshIntervalSeconds > 0`,
|
|
523
|
+
// so an interval of 0 would make every later codegenPgProvider.Refresh() — the one RSU CodeGen
|
|
524
|
+
// issues after DDL — return without reloading, leaving this provider frozen at the boot catalog.
|
|
525
|
+
// (SQL Server's AllowRefresh is independent of the interval, so its codegen provider can use 0.)
|
|
526
|
+
const codegenPgConfigData = new PostgreSQLProviderConfigData(codegenPgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000, // ms → seconds
|
|
527
|
+
undefined, undefined, false);
|
|
504
528
|
const codegenPgProvider = new PostgreSQLDataProvider();
|
|
505
529
|
await codegenPgProvider.Config(codegenPgConfigData); // separate pool (per-instance manager); does NOT touch the global API provider
|
|
506
530
|
RuntimeSchemaManager.Instance.SetDDLProvider(codegenPgProvider);
|
|
@@ -523,7 +547,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
523
547
|
});
|
|
524
548
|
startupLog.LogIf('verbose', 'RSU in-process CodeGen runner initialized (PostgreSQL).');
|
|
525
549
|
// Inject CodeGen output paths for targeted git staging
|
|
526
|
-
const { initializeConfig } = await import('@memberjunction/codegen-lib');
|
|
550
|
+
const { initializeConfig, ResolveAdditionalSchemaInfoPath } = await import('@memberjunction/codegen-lib');
|
|
527
551
|
const cgConfig = initializeConfig(rsuWorkDir);
|
|
528
552
|
const outputPaths = (cgConfig.output ?? []).map((o) => o.directory);
|
|
529
553
|
RuntimeSchemaManager.Instance.SetCodeGenOutputPaths(outputPaths);
|
|
@@ -531,9 +555,12 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
531
555
|
// Point RSU's soft PK/FK writer at the SAME file CodeGen reads (mj.config.cjs
|
|
532
556
|
// `additionalSchemaInfo`), or RSU writes soft PKs to its own default path while
|
|
533
557
|
// CodeGen reads a different one and skips integration tables with "No primary key found".
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
558
|
+
// Inject the ABSOLUTE path CodeGen resolves (env override, else relative to the mj.config
|
|
559
|
+
// file's directory) so RSU, the resolvers and CodeGen agree whatever their cwd (#5858).
|
|
560
|
+
const resolvedSchemaInfoPath = ResolveAdditionalSchemaInfoPath();
|
|
561
|
+
if (resolvedSchemaInfoPath) {
|
|
562
|
+
RuntimeSchemaManager.Instance.SetAdditionalSchemaInfoPath(resolvedSchemaInfoPath);
|
|
563
|
+
startupLog.LogIf('verbose', `RSU additionalSchemaInfo path: ${resolvedSchemaInfoPath}`);
|
|
537
564
|
}
|
|
538
565
|
else if (RuntimeSchemaManager.Instance.IsEnabled) {
|
|
539
566
|
// U5 — boot-time assert: RSU is enabled but CodeGen has NO additionalSchemaInfo path
|
|
@@ -541,7 +568,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
541
568
|
// resolved soft PK would be silently lost ("No primary key found" per table). LOUD,
|
|
542
569
|
// named, and actionable — grep for RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE.
|
|
543
570
|
console.error(`[RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE] Runtime Schema Update is ENABLED but mj.config.cjs has no ` +
|
|
544
|
-
`'additionalSchemaInfo' setting — RSU writes soft PK/FK definitions to '${
|
|
571
|
+
`'additionalSchemaInfo' setting (and RSU_ADDITIONAL_SCHEMA_INFO_PATH is unset) — RSU writes soft PK/FK definitions to '${RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath}' ` +
|
|
545
572
|
`while CodeGen reads none, so resolved soft primary keys will be silently LOST at codegen time. ` +
|
|
546
573
|
`Set 'additionalSchemaInfo' in mj.config.cjs to the same file so the write path and read path agree.`);
|
|
547
574
|
}
|
|
@@ -627,8 +654,11 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
627
654
|
});
|
|
628
655
|
await codegenPool.connect();
|
|
629
656
|
const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
|
|
630
|
-
//
|
|
631
|
-
|
|
657
|
+
// Adopt the already-loaded global Metadata.Provider catalog (ignoreExistingMetadata = false)
|
|
658
|
+
// and disable a duplicate background refresh timer (0): avoids a second full metadata load
|
|
659
|
+
// on boot while explicit codegenProvider.Refresh() after DDL still reloads from the DB
|
|
660
|
+
// (SQLServerDataProvider.AllowRefresh does not depend on the interval; PostgreSQL's does — see above).
|
|
661
|
+
const codegenConfig = new SQLServerProviderConfigData(codegenPool, mj_core_schema, 0, undefined, undefined, false);
|
|
632
662
|
const codegenProvider = new SQLServerDataProvider();
|
|
633
663
|
await codegenProvider.Config(codegenConfig);
|
|
634
664
|
RuntimeSchemaManager.Instance.SetDDLProvider(codegenProvider);
|
|
@@ -651,7 +681,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
651
681
|
});
|
|
652
682
|
startupLog.LogIf('verbose', 'RSU in-process CodeGen runner initialized.');
|
|
653
683
|
// Inject CodeGen output paths for targeted git staging
|
|
654
|
-
const { initializeConfig } = await import('@memberjunction/codegen-lib');
|
|
684
|
+
const { initializeConfig, ResolveAdditionalSchemaInfoPath } = await import('@memberjunction/codegen-lib');
|
|
655
685
|
const codegenConfig = initializeConfig(rsuWorkDir);
|
|
656
686
|
const outputPaths = (codegenConfig.output ?? []).map((o) => o.directory);
|
|
657
687
|
RuntimeSchemaManager.Instance.SetCodeGenOutputPaths(outputPaths);
|
|
@@ -660,14 +690,17 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
660
690
|
// `additionalSchemaInfo`). Without this, RSU writes soft PKs to its own default
|
|
661
691
|
// path while CodeGen reads a different one and skips every integration table
|
|
662
692
|
// with "No primary key found".
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
693
|
+
// Inject the ABSOLUTE path CodeGen resolves (env override, else relative to the mj.config
|
|
694
|
+
// file's directory) so RSU, the resolvers and CodeGen agree whatever their cwd (#5858).
|
|
695
|
+
const resolvedSchemaInfoPath = ResolveAdditionalSchemaInfoPath();
|
|
696
|
+
if (resolvedSchemaInfoPath) {
|
|
697
|
+
RuntimeSchemaManager.Instance.SetAdditionalSchemaInfoPath(resolvedSchemaInfoPath);
|
|
698
|
+
startupLog.LogIf('verbose', `RSU additionalSchemaInfo path: ${resolvedSchemaInfoPath}`);
|
|
666
699
|
}
|
|
667
700
|
else if (RuntimeSchemaManager.Instance.IsEnabled) {
|
|
668
701
|
// U5 — boot-time assert: write path ≠ read path (see the PostgreSQL branch for detail).
|
|
669
702
|
console.error(`[RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE] Runtime Schema Update is ENABLED but mj.config.cjs has no ` +
|
|
670
|
-
`'additionalSchemaInfo' setting — RSU writes soft PK/FK definitions to '${
|
|
703
|
+
`'additionalSchemaInfo' setting (and RSU_ADDITIONAL_SCHEMA_INFO_PATH is unset) — RSU writes soft PK/FK definitions to '${RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath}' ` +
|
|
671
704
|
`while CodeGen reads none, so resolved soft primary keys will be silently LOST at codegen time. ` +
|
|
672
705
|
`Set 'additionalSchemaInfo' in mj.config.cjs to the same file so the write path and read path agree.`);
|
|
673
706
|
}
|
|
@@ -868,6 +901,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
868
901
|
// config.ts loads and validates at module scope, so importing it there would pull full config
|
|
869
902
|
// validation into every import chain that touches the resolver, unit tests included.
|
|
870
903
|
ConfigureRecordDataBroadcast(configInfo.cacheSettings?.recordDataBroadcastEntities);
|
|
904
|
+
CacheInvalidationBroadcastManager.Instance.Configure(configInfo.cacheSettings?.broadcast);
|
|
871
905
|
// Global listener: broadcast CACHE_INVALIDATION to all browser clients whenever
|
|
872
906
|
// ANY BaseEntity save/delete occurs on this server — regardless of whether it
|
|
873
907
|
// originated from a GraphQL mutation or internal server-side code (agents, actions,
|
|
@@ -888,7 +922,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
888
922
|
// Opt-in only: this event reaches every connected client unfiltered, and this listener
|
|
889
923
|
// fires for server-internal saves too (agents, actions, orchestrator), which are exactly
|
|
890
924
|
// the ones no browser session asked for.
|
|
891
|
-
recordData: beEvent.type === 'save' && MayBroadcastRecordData(entityName)
|
|
925
|
+
recordData: beEvent.type === 'save' && MayBroadcastRecordData(entityName, beEvent.baseEntity.EntityInfo)
|
|
926
|
+
// fls-guard: MayBroadcastRecordData refuses FLS entities and Record Changes
|
|
892
927
|
? JSON.stringify(beEvent.baseEntity.GetAll())
|
|
893
928
|
: undefined,
|
|
894
929
|
});
|
|
@@ -936,7 +971,6 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
936
971
|
scalarsMap: [{ type: Date, scalar: GraphQLTimestamp }],
|
|
937
972
|
emitSchemaFile: websiteRunFromPackage !== 1,
|
|
938
973
|
pubSub,
|
|
939
|
-
globalMiddlewares: [variablesLoggingMiddleware],
|
|
940
974
|
});
|
|
941
975
|
const buildMs = performance.now() - tBuild;
|
|
942
976
|
if (cpuProf && profSession) {
|
|
@@ -957,6 +991,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
957
991
|
// and aren't @NoLog-marked. No-op in default config (logVariables=false).
|
|
958
992
|
auditResolversForUndecoratedArgs();
|
|
959
993
|
const tTransform = performance.now();
|
|
994
|
+
schema = ApplyRootVariablesLoggingMiddleware(schema);
|
|
960
995
|
schema = requireSystemUserDirective.transformer(schema);
|
|
961
996
|
schema = publicDirective.transformer(schema);
|
|
962
997
|
// Apply middleware-contributed schema transformers (after built-in directive transformers)
|
|
@@ -1066,6 +1101,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1066
1101
|
},
|
|
1067
1102
|
// context() now just reads the already-validated payload — no I/O, no logging
|
|
1068
1103
|
context: async (ctx) => {
|
|
1104
|
+
// No RequestOrigin here: the upgrade request's Origin is not carried onto subscription contexts.
|
|
1069
1105
|
return { userPayload: ctx.extra.userPayload };
|
|
1070
1106
|
},
|
|
1071
1107
|
onClose: (ctx) => {
|
|
@@ -1124,6 +1160,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1124
1160
|
// ─── Server extensions loader & shared service registry ───────────────────
|
|
1125
1161
|
const extensionLoader = new ServerExtensionLoader();
|
|
1126
1162
|
_currentExtensionLoader = extensionLoader;
|
|
1163
|
+
const hostRuntimeService = {
|
|
1164
|
+
CreateIsolatedProvider,
|
|
1165
|
+
GetSystemUser: () => getSystemUser(),
|
|
1166
|
+
ResolvePrincipal: (configuredEmailOrId, subsystemLabel) => ResolveConfiguredPrincipal(configuredEmailOrId, subsystemLabel),
|
|
1167
|
+
};
|
|
1168
|
+
extensionLoader.Services.RegisterService(SERVER_EXTENSION_CORE_SERVICE_KEYS.HostRuntime, hostRuntimeService);
|
|
1169
|
+
if (coreAuthenticatedRouters.MagicLinkService) {
|
|
1170
|
+
extensionLoader.Services.RegisterService(SERVER_EXTENSION_CORE_SERVICE_KEYS.MagicLink, coreAuthenticatedRouters.MagicLinkService);
|
|
1171
|
+
}
|
|
1127
1172
|
// Open App packages publish their extensions; host mj.config.cjs overlays by DriverClass
|
|
1128
1173
|
// Backwards-compatibility shim: synthesize ServerExtensionConfig entries from legacy configInfo.telephony
|
|
1129
1174
|
const telephonyExtensionConfigs = [];
|
|
@@ -1226,6 +1271,11 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1226
1271
|
MountExtensionHealthRoute(app, extensionLoader);
|
|
1227
1272
|
MountAuthCatalogRoute(app, startupLog);
|
|
1228
1273
|
// ─── Unified auth middleware (replaces both REST authMiddleware and contextFunction auth) ─────
|
|
1274
|
+
// Always shown, whatever the log level: a configured map makes logins run as other people's records
|
|
1275
|
+
const userEmailMapWarning = DescribeUserEmailMap(userEmailMap);
|
|
1276
|
+
if (userEmailMapWarning) {
|
|
1277
|
+
console.warn(userEmailMapWarning);
|
|
1278
|
+
}
|
|
1229
1279
|
app.use(CreateUnifiedAuthMiddleware(dataSources));
|
|
1230
1280
|
// ─── Post-auth middleware from BaseServerMiddleware plugins ─────
|
|
1231
1281
|
// Middleware here has access to the authenticated user via req.userPayload.
|
|
@@ -1303,11 +1353,29 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1303
1353
|
// No per-route authMiddleware needed — unified auth middleware already ran
|
|
1304
1354
|
setupRESTEndpoints(app, restApiConfig);
|
|
1305
1355
|
// ─── GraphQL middleware (contextFunction reads req.userPayload, no re-auth) ─────
|
|
1306
|
-
app.use(graphqlRootPath, cors(
|
|
1356
|
+
app.use(graphqlRootPath, cors({
|
|
1357
|
+
exposedHeaders: ['X-MJ-Cache-Seq', 'X-MJ-Server-ID'],
|
|
1358
|
+
}), BodyParser.json({ limit: '50mb' }),
|
|
1307
1359
|
// Express 5 leaves req.body as undefined for non-JSON or empty bodies;
|
|
1308
1360
|
// Apollo Server's expressMiddleware requires req.body to be defined.
|
|
1309
|
-
|
|
1310
|
-
|
|
1361
|
+
// Also piggyback the latest monotonic cache invalidation sequence and server process ID
|
|
1362
|
+
// onto every GraphQL HTTP response so clients can detect and recover missed invalidations.
|
|
1363
|
+
(req, res, next) => {
|
|
1364
|
+
if (req.body === undefined)
|
|
1365
|
+
req.body = {};
|
|
1366
|
+
const broadcastProvider = CacheInvalidationBroadcastManager.Instance.Provider;
|
|
1367
|
+
res.setHeader('X-MJ-Cache-Seq', String(broadcastProvider.CurrentSequence));
|
|
1368
|
+
res.setHeader('X-MJ-Server-ID', broadcastProvider.ServerProcessID);
|
|
1369
|
+
const originalWriteHead = res.writeHead.bind(res);
|
|
1370
|
+
res.writeHead = ((...args) => {
|
|
1371
|
+
if (!res.headersSent) {
|
|
1372
|
+
res.setHeader('X-MJ-Cache-Seq', String(broadcastProvider.CurrentSequence));
|
|
1373
|
+
res.setHeader('X-MJ-Server-ID', broadcastProvider.ServerProcessID);
|
|
1374
|
+
}
|
|
1375
|
+
return originalWriteHead(...args);
|
|
1376
|
+
});
|
|
1377
|
+
next();
|
|
1378
|
+
}, expressMiddleware(apolloServer, {
|
|
1311
1379
|
context: contextFunction({
|
|
1312
1380
|
setupComplete$,
|
|
1313
1381
|
dataSource: extendConnectionPoolWithQuery(dataSources[0].dataSource), // default read-write data source
|
|
@@ -1318,9 +1386,34 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1318
1386
|
for (const mw of mwPostRoute) {
|
|
1319
1387
|
app.use(mw);
|
|
1320
1388
|
}
|
|
1389
|
+
const serverRole = ResolveServerRole(configInfo.serverRole ?? process.env.MJ_SERVER_ROLE);
|
|
1390
|
+
const runBackgroundWorkers = ShouldRunBackgroundWorkers(serverRole);
|
|
1391
|
+
if (!runBackgroundWorkers) {
|
|
1392
|
+
LogStatus(`[ServerRole] Running in '${serverRole}' mode — background worker services are disabled on this replica.`);
|
|
1393
|
+
}
|
|
1394
|
+
// Every role runs agents, so every role's watchdog takes the configured intervals (before any run starts).
|
|
1395
|
+
AgentRunWatchdog.Instance.Configure(configInfo.agentRunWatchdog);
|
|
1396
|
+
// The handoff offer registry starts its own expiry sweep when it loads, on every role; apply the host's setting.
|
|
1397
|
+
ApplyHandoffOfferExpirySettings(configInfo.agentSessions.handoffOfferExpiry);
|
|
1398
|
+
// Close out run artifacts a dead process left open, BEFORE anything below can start a new run.
|
|
1399
|
+
//
|
|
1400
|
+
// A killed process (OOM killer, SIGKILL, host reboot) never writes its run's terminal result, so
|
|
1401
|
+
// the run reads as in-flight forever: the wizard spins, the active-operations panel shows a step
|
|
1402
|
+
// that will never advance, and no failure is reported anywhere. Sound only before the first new
|
|
1403
|
+
// run: artifacts are process-local, so anything still in flight as THIS process starts belongs
|
|
1404
|
+
// to a process that no longer exists. That is why it runs here, ahead of the scheduler, the
|
|
1405
|
+
// integration sync worker (its Start() polls immediately), the HTTP listener (a request can
|
|
1406
|
+
// start a discovery) and pending RSU work, and why it is awaited. It needs none of them.
|
|
1407
|
+
//
|
|
1408
|
+
// One exception: an RSU run killed inside its own RestartMJAPI step is not dead — THIS process is
|
|
1409
|
+
// its continuation, and processRSUPendingWork below re-attaches to it. Those are left in flight
|
|
1410
|
+
// (and named in `Skipped`); whichever of them nothing re-attaches to is closed out afterwards by
|
|
1411
|
+
// RSUPostRestartProgressSession.SweepUnattached. On a replica that runs no background workers
|
|
1412
|
+
// nothing would ever resume them, so there they are swept like any other.
|
|
1413
|
+
const bootSweep = await SweepInterruptedRuns(undefined, msg => console.warn(msg), runBackgroundWorkers ? RSUPostRestartProgressSession.WasKilledAtRestart : undefined);
|
|
1321
1414
|
// Initialize and start scheduled jobs service if enabled
|
|
1322
1415
|
let scheduledJobsService = null;
|
|
1323
|
-
if (configInfo.scheduledJobs?.enabled) {
|
|
1416
|
+
if (runBackgroundWorkers && configInfo.scheduledJobs?.enabled) {
|
|
1324
1417
|
try {
|
|
1325
1418
|
scheduledJobsService = new ScheduledJobsService(configInfo.scheduledJobs);
|
|
1326
1419
|
await scheduledJobsService.Initialize();
|
|
@@ -1334,7 +1427,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1334
1427
|
// Initialize and start the integration sync worker if enabled (PR 1 item 8).
|
|
1335
1428
|
// Off by default — deployments that don't opt in keep running syncs inline.
|
|
1336
1429
|
let integrationSyncWorker = null;
|
|
1337
|
-
if (configInfo.integrationSyncWorker?.enabled) {
|
|
1430
|
+
if (runBackgroundWorkers && configInfo.integrationSyncWorker?.enabled) {
|
|
1338
1431
|
try {
|
|
1339
1432
|
integrationSyncWorker = new IntegrationSyncWorkerService(configInfo.integrationSyncWorker);
|
|
1340
1433
|
await integrationSyncWorker.Initialize();
|
|
@@ -1368,47 +1461,44 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1368
1461
|
startupLog.SetScheduledJobCount(scheduledJobsService.GetStatus().activeJobs);
|
|
1369
1462
|
}
|
|
1370
1463
|
startupLog.PrintSummary();
|
|
1371
|
-
// Process pending RSU work from pre-restart (entity maps, field maps, sync)
|
|
1372
|
-
processRSUPendingWork().catch(err => console.warn(`RSU pending work processing failed: ${err}`));
|
|
1373
|
-
// Resume any integration syncs that were orphaned by the previous process restart
|
|
1374
1464
|
const resumeUser = UserCache.Instance.GetSystemUser();
|
|
1375
|
-
if (
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1465
|
+
if (runBackgroundWorkers) {
|
|
1466
|
+
// Process pending RSU work from pre-restart (entity maps, field maps, sync)
|
|
1467
|
+
processRSUPendingWork().catch(err => console.warn(`RSU pending work processing failed: ${err}`))
|
|
1468
|
+
.finally(() => RSUPostRestartProgressSession.SweepUnattached(bootSweep.Skipped, undefined, msg => console.warn(msg)).catch(err => console.warn(`RSU leftover run sweep failed: ${err}`)));
|
|
1469
|
+
// Resume any integration syncs that were orphaned by the previous process restart
|
|
1470
|
+
if (resumeUser) {
|
|
1471
|
+
IntegrationEngine.Instance.ResumeOrphanedSyncs(resumeUser)
|
|
1472
|
+
.catch(err => console.warn(`[IntegrationEngine] Orphaned sync resume failed: ${err}`));
|
|
1473
|
+
}
|
|
1474
|
+
// Force-fail any agent runs left 'Running' by a process that died (restart/crash/OOM) or whose
|
|
1475
|
+
// terminal-state write never landed. Staleness-based, so it never touches runs another healthy
|
|
1476
|
+
// instance is still heart-beating. The watchdog also self-registers for graceful-shutdown
|
|
1477
|
+
// cancellation (via ShutdownRegistry) once it begins tracking this process's first live run.
|
|
1478
|
+
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1479
|
+
const sweepUser = resumeUser;
|
|
1480
|
+
const sweepProvider = Metadata.Provider; // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1481
|
+
AgentRunWatchdog.SweepOrphanedRuns(sweepProvider, sweepUser, configInfo.agentRunWatchdog)
|
|
1482
|
+
.catch(err => console.warn(`[AgentRunWatchdog] Startup sweep failed: ${err}`));
|
|
1483
|
+
// The watchdog repairs the RUN; nothing repaired the conversation detail, which is the row the
|
|
1484
|
+
// chat actually renders from (MJ #4222). A process that dies mid-run leaves a terminal run
|
|
1485
|
+
// beside a message that still claims to be generating, and it spins forever for anyone who
|
|
1486
|
+
// opens it. Runs at boot (closes restart orphans) and, unless `conversationDetailReconciler.enabled`
|
|
1487
|
+
// is false, on a timer (closes mid-life orphans), mirroring the watchdog's own two-phase shape.
|
|
1488
|
+
StartOrphanedConversationDetailReconciler(sweepProvider, sweepUser, configInfo.conversationDetailReconciler);
|
|
1489
|
+
}
|
|
1490
|
+
// Launch the AI Agent Session janitor: run own-host orphan recovery once at boot, then a periodic tick
|
|
1491
|
+
// that closes stale and over-deadline sessions and rebuilds lost realtime recordings from their
|
|
1492
|
+
// crash-recovery shards (storage reads and writes). Self-registers with ShutdownRegistry, so its timer
|
|
1493
|
+
// is cleared by the gracefulShutdown drain below (no explicit Stop() wiring needed here).
|
|
1494
|
+
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — boot-time session janitor uses the server's own provider
|
|
1495
|
+
// `agentSessions.janitor.enabled: false` keeps the boot recovery and shutdown drain but schedules no tick.
|
|
1496
|
+
SessionJanitor.Instance.StartWithSettings(configInfo.agentSessions.janitor, Metadata.Provider, resumeUser) // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1497
|
+
.catch(err => console.warn(`[SessionJanitor] Startup failed: ${err}`));
|
|
1498
|
+
// The bridge engine's orphan reconcile likewise starts only now that this process holds its port, so it can't
|
|
1499
|
+
// take the live bridges of another MJAPI still serving that port for its own orphans (#5310).
|
|
1500
|
+
StartBridgeOrphanReconciliation(Metadata.Provider, resumeUser, configInfo.agentSessions.bridgeReconciler); // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1501
|
+
}
|
|
1412
1502
|
}
|
|
1413
1503
|
// Launch the durable task-graph dispatcher: claim Pending tasks, execute them with a fresh
|
|
1414
1504
|
// provider each, and reconcile claims orphaned by a crash. Without this nothing ever picks up a
|
|
@@ -1437,7 +1527,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1437
1527
|
SuppressTaskGraphSubmission('MJ_DISABLE_TASK_GRAPH_DISPATCHER=1 is set on this host');
|
|
1438
1528
|
LogStatus('[TaskGraphDispatcher] Disabled by MJ_DISABLE_TASK_GRAPH_DISPATCHER=1 — this process will neither accept nor execute task graphs.');
|
|
1439
1529
|
}
|
|
1440
|
-
else if (resumeUser && taskGraphPool instanceof sql.ConnectionPool) {
|
|
1530
|
+
else if (runBackgroundWorkers && resumeUser && taskGraphPool instanceof sql.ConnectionPool) {
|
|
1441
1531
|
StartTaskGraphDispatcher(taskGraphPool, resumeUser)
|
|
1442
1532
|
.catch(err => console.warn(`[TaskGraphDispatcher] Startup failed: ${err}`));
|
|
1443
1533
|
}
|
|
@@ -1446,7 +1536,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1446
1536
|
// ShutdownAll() drains it (up to 2 × shutdownDrainMs) before the HTTP server closes.
|
|
1447
1537
|
// Not awaited: a slow engine load must not delay readiness, and a failure never stops the API.
|
|
1448
1538
|
const workQueueProvider = Metadata.Provider; // global-provider-ok: server startup — the work-queue host runs on the server's own provider
|
|
1449
|
-
if (configInfo.workQueue?.enabled && workQueueProvider instanceof DatabaseProviderBase) {
|
|
1539
|
+
if (runBackgroundWorkers && configInfo.workQueue?.enabled && workQueueProvider instanceof DatabaseProviderBase) {
|
|
1450
1540
|
const workQueuePool = dataSources[0]?.dataSource;
|
|
1451
1541
|
const providerSource = new MJServerWorkQueueProviderSource(workQueuePool instanceof sql.ConnectionPool ? workQueuePool : null, workQueueProvider);
|
|
1452
1542
|
StartWorkQueueHost(configInfo.workQueue, workQueueProvider, providerSource)
|
|
@@ -1589,9 +1679,17 @@ async function processRSUPendingWork() {
|
|
|
1589
1679
|
console.log(`[RSU] Processing ${pendingItems.length} pending work item(s) from pre-restart...`);
|
|
1590
1680
|
// Wait a moment for metadata to be fully loaded
|
|
1591
1681
|
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
1682
|
+
// The RSU run these items belong to is still open: the pre-restart process was killed inside its
|
|
1683
|
+
// own RestartMJAPI step, so it never wrote a terminal result. This session re-attaches to that run
|
|
1684
|
+
// and reports the two steps that only ever happen here — CreateEntityMaps and StartSync — into the
|
|
1685
|
+
// SAME event stream, so a client that has been tailing since before the restart keeps its cursor
|
|
1686
|
+
// and finally learns whether the connector went live. Purely observational: every failure below is
|
|
1687
|
+
// swallowed, and the work proceeds whether or not a run was found to report into.
|
|
1688
|
+
const progressSession = new RSUPostRestartProgressSession();
|
|
1592
1689
|
for (const pending of pendingItems) {
|
|
1593
1690
|
const pendingWorkID = pending.ID;
|
|
1594
1691
|
const item = pending.Work;
|
|
1692
|
+
let progress = null;
|
|
1595
1693
|
// Declared outside the try so the catch can narrow a retry to what is still outstanding: what
|
|
1596
1694
|
// actually got mapped this attempt. Each retry is then strictly smaller, and one poison object
|
|
1597
1695
|
// cannot keep re-running its healthy siblings.
|
|
@@ -1610,6 +1708,9 @@ async function processRSUPendingWork() {
|
|
|
1610
1708
|
await ProcessPromoteColumnsPendingWork(item, pendingWorkID, rsm, systemUser);
|
|
1611
1709
|
continue;
|
|
1612
1710
|
}
|
|
1711
|
+
// Attached only for apply-objects work: promote-columns is a follow-up to a DIFFERENT run
|
|
1712
|
+
// shape that has no CreateEntityMaps/StartSync steps to report.
|
|
1713
|
+
progress = await progressSession.For(item.CompanyIntegrationID);
|
|
1613
1714
|
// Resolve connector
|
|
1614
1715
|
const rv = new RunView();
|
|
1615
1716
|
const ciResult = await rv.RunView({
|
|
@@ -1619,8 +1720,10 @@ async function processRSUPendingWork() {
|
|
|
1619
1720
|
}, systemUser);
|
|
1620
1721
|
const companyIntegration = ciResult.Results[0];
|
|
1621
1722
|
if (!companyIntegration) {
|
|
1622
|
-
|
|
1623
|
-
|
|
1723
|
+
const missingCI = `CompanyIntegration ${item.CompanyIntegrationID} not found`;
|
|
1724
|
+
progress?.FailEntityMaps(missingCI, item.SourceObjectNames ?? []);
|
|
1725
|
+
await rsm.FailPendingWork(pendingWorkID, missingCI, systemUser);
|
|
1726
|
+
console.warn(`[RSU] ${missingCI}`);
|
|
1624
1727
|
continue;
|
|
1625
1728
|
}
|
|
1626
1729
|
const integrationName = companyIntegration.Integration;
|
|
@@ -1631,23 +1734,39 @@ async function processRSUPendingWork() {
|
|
|
1631
1734
|
}, systemUser);
|
|
1632
1735
|
const integrationEntity = integrationResult.Results[0];
|
|
1633
1736
|
if (!integrationEntity) {
|
|
1634
|
-
|
|
1635
|
-
|
|
1737
|
+
const missingIntegration = `Integration entity for ${integrationName} not found`;
|
|
1738
|
+
progress?.FailEntityMaps(missingIntegration, item.SourceObjectNames ?? []);
|
|
1739
|
+
await rsm.FailPendingWork(pendingWorkID, missingIntegration, systemUser);
|
|
1740
|
+
console.warn(`[RSU] ${missingIntegration}`);
|
|
1636
1741
|
continue;
|
|
1637
1742
|
}
|
|
1638
1743
|
const connector = ConnectorFactory.Resolve(integrationEntity);
|
|
1639
1744
|
if (!connector) {
|
|
1640
|
-
|
|
1641
|
-
|
|
1745
|
+
const missingConnector = `Connector for ${integrationName} not found`;
|
|
1746
|
+
progress?.FailEntityMaps(missingConnector, item.SourceObjectNames ?? []);
|
|
1747
|
+
await rsm.FailPendingWork(pendingWorkID, missingConnector, systemUser);
|
|
1748
|
+
console.warn(`[RSU] ${missingConnector}`);
|
|
1642
1749
|
continue;
|
|
1643
1750
|
}
|
|
1644
1751
|
// Create entity maps + field maps for each source object
|
|
1645
1752
|
const createdEntityMapIDs = [];
|
|
1646
1753
|
const rvPending = new RunView();
|
|
1647
1754
|
const sourceObjectFields = item.SourceObjectFields ?? {};
|
|
1648
|
-
// Introspect schema ONCE for the entire connector, then reuse per object
|
|
1755
|
+
// Introspect schema ONCE for the entire connector, then reuse per object.
|
|
1756
|
+
//
|
|
1757
|
+
// IN THE CONNECTION'S CATALOG SCOPE. This runs at process start, outside any request, so
|
|
1758
|
+
// nothing upstream has entered a scope for it — and an unscoped catalog read falls back to
|
|
1759
|
+
// the SHARED catalog by design. That would build these field maps from the connector's
|
|
1760
|
+
// declared fields alone: every column this connection's own discovery sampled would get a
|
|
1761
|
+
// table column from the RSU (built in scope, from the per-connection rows) but no field map,
|
|
1762
|
+
// and its values would land in the overflow JSON instead of the column. Observed on the
|
|
1763
|
+
// sandbox 2026-09-11: 487 declared fields, 556 per-connection — 69 columns that this read
|
|
1764
|
+
// would have silently left unmapped. Entering the scope is not enough on a fresh process:
|
|
1765
|
+
// IntrospectInCatalogScope loads the catalog and warms each object's fields first.
|
|
1649
1766
|
const introspect = connector.IntrospectSchema.bind(connector);
|
|
1650
|
-
const schema = await introspect(companyIntegration, systemUser);
|
|
1767
|
+
const schema = await IntrospectInCatalogScope(item.CompanyIntegrationID, item.SourceObjectNames, () => introspect(companyIntegration, systemUser), systemUser);
|
|
1768
|
+
const objectsToMap = item.SourceObjectNames.length;
|
|
1769
|
+
progress?.BeginEntityMaps(objectsToMap);
|
|
1651
1770
|
for (const objName of item.SourceObjectNames) {
|
|
1652
1771
|
const tableName = objName.replace(/[^A-Za-z0-9_]/g, '_').toLowerCase();
|
|
1653
1772
|
const entity = md.Entities.find(e => e.SchemaName.toLowerCase() === item.SchemaName.toLowerCase() &&
|
|
@@ -1742,7 +1861,12 @@ async function processRSUPendingWork() {
|
|
|
1742
1861
|
catch (fieldErr) {
|
|
1743
1862
|
console.warn(`[RSU] Field map creation failed for ${objName}: ${fieldErr}`);
|
|
1744
1863
|
}
|
|
1864
|
+
progress?.ObjectMapped(objName, mappedObjectNames.size, objectsToMap);
|
|
1745
1865
|
}
|
|
1866
|
+
// The applied rollup for this half of the run, in OBJECTS. `mappedObjectNames` is the same set
|
|
1867
|
+
// the retry path narrows against, so what is reported succeeded here is exactly what a retry
|
|
1868
|
+
// would NOT redo.
|
|
1869
|
+
progress?.CompleteEntityMaps(objectsToMap, mappedObjectNames.size, objectsToMap - mappedObjectNames.size);
|
|
1746
1870
|
// Remove-as-disable: entity maps whose object is NOT in this apply's selection
|
|
1747
1871
|
// are disabled (data kept; re-selection re-enables). 'ignore' opts out for subset applies.
|
|
1748
1872
|
if ((item.UnselectedAction ?? 'disable') !== 'ignore') {
|
|
@@ -1757,8 +1881,11 @@ async function processRSUPendingWork() {
|
|
|
1757
1881
|
console.warn(`[RSU] Unselected-map disable failed: ${disableErr}`);
|
|
1758
1882
|
}
|
|
1759
1883
|
}
|
|
1760
|
-
// Start sync if requested
|
|
1884
|
+
// Start sync if requested. This is the step the setup journey is actually waiting on — the
|
|
1885
|
+
// connector is not live until it begins — so it is a stage of its own rather than a footnote
|
|
1886
|
+
// on entity-map creation.
|
|
1761
1887
|
if (item.StartSync !== false) {
|
|
1888
|
+
progress?.BeginStartSync();
|
|
1762
1889
|
try {
|
|
1763
1890
|
await IntegrationEngine.Instance.Config(false, systemUser);
|
|
1764
1891
|
const syncOptions = {};
|
|
@@ -1771,13 +1898,20 @@ async function processRSUPendingWork() {
|
|
|
1771
1898
|
const opts = Object.keys(syncOptions).length > 0 ? syncOptions : undefined;
|
|
1772
1899
|
IntegrationEngine.Instance.RunSync(item.CompanyIntegrationID, systemUser, 'Manual', undefined, undefined, opts);
|
|
1773
1900
|
console.log(`[RSU] Sync started for ${item.CompanyIntegrationID} (EntityMaps: ${createdEntityMapIDs.length}, FullSync: ${!!item.FullSync}, SyncDirection: ${item.SyncDirection ?? 'entity-map default'})`);
|
|
1901
|
+
// Looked up rather than returned: RunSync resolves only when the whole sync finishes, and
|
|
1902
|
+
// this stage closes when the sync STARTS. A null id closes the stage anyway — the sync did
|
|
1903
|
+
// start; only the hand-off to its own stream is missing.
|
|
1904
|
+
progress?.CompleteStartSync(await FindStartedSyncRunID(item.CompanyIntegrationID, systemUser));
|
|
1774
1905
|
}
|
|
1775
1906
|
catch (syncErr) {
|
|
1776
1907
|
console.warn(`[RSU] Sync start failed: ${syncErr}`);
|
|
1908
|
+
progress?.FailStartSync(`Sync start failed: ${syncErr instanceof Error ? syncErr.message : String(syncErr)}`);
|
|
1777
1909
|
}
|
|
1778
1910
|
}
|
|
1779
1911
|
else {
|
|
1780
1912
|
console.log(`[RSU] Sync skipped for ${item.CompanyIntegrationID} (StartSync=false)`);
|
|
1913
|
+
progress?.BeginStartSync();
|
|
1914
|
+
progress?.SkipStartSync('the caller asked for no initial sync (StartSync=false)');
|
|
1781
1915
|
}
|
|
1782
1916
|
// Create or update schedule if CronExpression provided
|
|
1783
1917
|
if (item.CronExpression) {
|
|
@@ -1813,6 +1947,7 @@ async function processRSUPendingWork() {
|
|
|
1813
1947
|
EntityName: 'MJ: Scheduled Job Types',
|
|
1814
1948
|
ExtraFilter: `DriverClass='IntegrationSyncScheduledJobDriver'`,
|
|
1815
1949
|
MaxRows: 1,
|
|
1950
|
+
SkipTotalRowCount: true,
|
|
1816
1951
|
ResultType: 'simple',
|
|
1817
1952
|
Fields: ['ID']
|
|
1818
1953
|
}, systemUser);
|
|
@@ -1861,6 +1996,16 @@ async function processRSUPendingWork() {
|
|
|
1861
1996
|
// Failing terminally on the first error means the objects this item would have mapped are
|
|
1862
1997
|
// silently never mapped, and the only recovery is someone noticing and re-applying by hand.
|
|
1863
1998
|
const remaining = (item.SourceObjectNames ?? []).filter(n => !mappedObjectNames.has(n));
|
|
1999
|
+
// Same list the retry narrows to, reported into the run stream: when this half fails, those
|
|
2000
|
+
// objects have tables and no way to sync into them, and this is the client's only signal.
|
|
2001
|
+
//
|
|
2002
|
+
// Reported under CreateEntityMaps because that is where the overwhelming majority of this
|
|
2003
|
+
// block's work — and so its failures — lives. A throw from further down (schedule creation,
|
|
2004
|
+
// say) lands here too, with an empty `remaining`; the stage attribution is then approximate
|
|
2005
|
+
// but the message is the real error and the run is correctly marked failed, which is what the
|
|
2006
|
+
// operator needs. The alternative — inventing a stage that is not in the pipeline's step list
|
|
2007
|
+
// — would break the determinate stepper for the sake of a nicer label.
|
|
2008
|
+
progress?.FailEntityMaps(message, remaining);
|
|
1864
2009
|
const requeued = await rsm.RetryPendingWork(pendingWorkID, item, remaining, systemUser);
|
|
1865
2010
|
if (!requeued) {
|
|
1866
2011
|
// Budget spent, or nothing left to retry. This message is the operator's only signal, so
|
|
@@ -1870,8 +2015,40 @@ async function processRSUPendingWork() {
|
|
|
1870
2015
|
}
|
|
1871
2016
|
}
|
|
1872
2017
|
}
|
|
2018
|
+
// Terminates every RSU run this pass re-attached to. Until this lands, those runs have been
|
|
2019
|
+
// flagged in-flight since before the restart — which is exactly the state this whole mechanism
|
|
2020
|
+
// exists to end.
|
|
2021
|
+
await progressSession.FinishAll();
|
|
1873
2022
|
console.log(`[RSU] Pending work processing complete`);
|
|
1874
2023
|
}
|
|
2024
|
+
/**
|
|
2025
|
+
* The ID of the sync run a just-launched sync created, or null if it is not readable yet.
|
|
2026
|
+
*
|
|
2027
|
+
* `RunSync` resolves only when the entire sync FINISHES, so it cannot be awaited for this — the
|
|
2028
|
+
* StartSync stage closes when the sync begins, not when it ends. The run row is written early in
|
|
2029
|
+
* the sync's own startup, so a short settle plus a newest-first lookup finds it. Null is a normal
|
|
2030
|
+
* outcome under load and is reported as such; it never fails anything.
|
|
2031
|
+
*/
|
|
2032
|
+
async function FindStartedSyncRunID(companyIntegrationID, systemUser) {
|
|
2033
|
+
try {
|
|
2034
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
2035
|
+
const rv = new RunView();
|
|
2036
|
+
const runResult = await rv.RunView({
|
|
2037
|
+
EntityName: 'MJ: Company Integration Runs',
|
|
2038
|
+
ExtraFilter: `CompanyIntegrationID='${companyIntegrationID.replace(/'/g, "''")}' AND Status='In Progress'`,
|
|
2039
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
2040
|
+
MaxRows: 1,
|
|
2041
|
+
SkipTotalRowCount: true,
|
|
2042
|
+
ResultType: 'simple',
|
|
2043
|
+
Fields: ['ID'],
|
|
2044
|
+
}, systemUser);
|
|
2045
|
+
return runResult.Success && runResult.Results.length > 0 ? runResult.Results[0].ID : null;
|
|
2046
|
+
}
|
|
2047
|
+
catch (e) {
|
|
2048
|
+
console.warn(`[RSU] Could not resolve the started sync run id for ${companyIntegrationID}: ${e}`);
|
|
2049
|
+
return null;
|
|
2050
|
+
}
|
|
2051
|
+
}
|
|
1875
2052
|
/**
|
|
1876
2053
|
* Creates a MSSQL ConnectionPool-compatible wrapper around a pg.Pool.
|
|
1877
2054
|
* This allows existing code that references DataSourceInfo.dataSource (typed as sql.ConnectionPool)
|
|
@@ -1911,10 +2088,11 @@ function mountRealtimeRecordingRoutes(app) {
|
|
|
1911
2088
|
}
|
|
1912
2089
|
const graceMs = () => configInfo.realtime.recordingAssemblyGraceSeconds * 1000;
|
|
1913
2090
|
const systemUser = UserCache.Instance.GetSystemUser();
|
|
1914
|
-
|
|
2091
|
+
const runWorkers = ShouldRunBackgroundWorkers(ResolveServerRole(configInfo.serverRole ?? process.env.MJ_SERVER_ROLE));
|
|
2092
|
+
if (systemUser && runWorkers) {
|
|
1915
2093
|
RecordingAssemblyScheduler.Instance.Start({ Provider: provider, SystemUser: systemUser, GraceMs: graceMs });
|
|
1916
2094
|
}
|
|
1917
|
-
else {
|
|
2095
|
+
else if (!systemUser) {
|
|
1918
2096
|
LogError('[Realtime] Recording assembly scheduler not started: no system user; the session janitor assembles recordings instead');
|
|
1919
2097
|
}
|
|
1920
2098
|
app.use(ApiRoute(REALTIME_RECORDING_MOUNT_PATH), cors(), CreateRealtimeRecordingRouter({
|
|
@@ -1923,7 +2101,7 @@ function mountRealtimeRecordingRoutes(app) {
|
|
|
1923
2101
|
return user ? { ContextUser: user, Provider: provider } : null;
|
|
1924
2102
|
},
|
|
1925
2103
|
LoadOwnedSession: LoadOwnedRealtimeSession,
|
|
1926
|
-
|
|
2104
|
+
AuthorizeSession: AuthorizeLoadedSession,
|
|
1927
2105
|
CreateLedger: (ledgerProvider, contextUser) => new SqlRealtimeRecordingLedger(ledgerProvider, contextUser),
|
|
1928
2106
|
Scheduler: RecordingAssemblyScheduler.Instance,
|
|
1929
2107
|
GraceMs: graceMs,
|