@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/src/index.ts
CHANGED
|
@@ -11,6 +11,9 @@ import { setupSQLServerClient, SQLServerDataProvider, SQLServerProviderConfigDat
|
|
|
11
11
|
import { extendConnectionPoolWithQuery } from './util.js';
|
|
12
12
|
import { registerIntegrationCustomColumnPromoter, IntegrationCustomColumnPromoter } from './integration/CustomColumnPromoter.js';
|
|
13
13
|
import { DisableUnselectedEntityMaps, ReenableFieldMapsForEntityMap, selectFieldsToMap } from './integration/EntityMapLifecycle.js';
|
|
14
|
+
import { RSUPostRestartProgressSession } from './integration/RSUPostRestartProgress.js';
|
|
15
|
+
import type { RSUPostRestartProgress } from './integration/RSUPostRestartProgress.js';
|
|
16
|
+
import { IntrospectInCatalogScope } from './integration/PostRestartIntrospect.js';
|
|
14
17
|
import { default as BodyParser } from 'body-parser';
|
|
15
18
|
import compression from 'compression'; // Add compression middleware
|
|
16
19
|
import cors from 'cors';
|
|
@@ -31,14 +34,15 @@ import sql from 'mssql';
|
|
|
31
34
|
import { WebSocketServer } from 'ws';
|
|
32
35
|
import { RealtimeProxyServer } from './realtimeProxy/RealtimeProxyServer.js';
|
|
33
36
|
import buildApolloServer from './apolloServer/index.js';
|
|
34
|
-
import { configInfo, configFilePath, dbDatabase, dbHost, dbPort, dbUsername, graphqlPort, graphqlRootPath, mj_core_schema, websiteRunFromPackage, RESTApiOptions } from './config.js';
|
|
37
|
+
import { configInfo, configFilePath, dbDatabase, dbHost, dbPort, dbUsername, graphqlPort, graphqlRootPath, mj_core_schema, websiteRunFromPackage, RESTApiOptions, userEmailMap } from './config.js';
|
|
38
|
+
import { DescribeUserEmailMap } from './auth/loginEmailResolution.js';
|
|
35
39
|
import { TranslateBracketsToPG } from './postgresqlCompat.js';
|
|
36
40
|
import { BuildPostgreSQLConnectionConfig, DescribeReadOnlyLoginOverreach, PostgreSQLReadOnlyPool, ResolvePostgreSQLEndpoint, ResolvePostgreSQLReadOnlyCredentials, ToPGPoolConfig } from './postgresqlPoolSettings.js';
|
|
37
41
|
import { default as jwt } from 'jsonwebtoken';
|
|
38
42
|
import { contextFunction, CreateReadOnlyProvider, CreateUnifiedAuthMiddleware, getUserPayload } from './context.js';
|
|
39
43
|
import { UserPayload } from './types.js';
|
|
40
44
|
import { requireSystemUserDirective, publicDirective } from './directives/index.js';
|
|
41
|
-
import { variablesLoggingMiddleware } from './logging/variablesLoggingMiddleware.js';
|
|
45
|
+
import { ApplyRootVariablesLoggingMiddleware, variablesLoggingMiddleware } from './logging/variablesLoggingMiddleware.js';
|
|
42
46
|
import { auditResolversForUndecoratedArgs } from './logging/bootAudit.js';
|
|
43
47
|
import { StartupLogger } from './logging/StartupLogger.js';
|
|
44
48
|
import { AuthProviderFactory } from '@memberjunction/auth-providers';
|
|
@@ -46,7 +50,7 @@ import createMSSQLConfig from './orm.js';
|
|
|
46
50
|
import { setupRESTEndpoints } from './rest/setupRESTEndpoints.js';
|
|
47
51
|
import { CreateRealtimeRecordingRouter, REALTIME_RECORDING_MOUNT_PATH } from './rest/RealtimeRecordingHandler.js';
|
|
48
52
|
import { LoadOwnedRealtimeSession } from './realtimeSessions/ownedRealtimeSession.js';
|
|
49
|
-
import {
|
|
53
|
+
import { AuthorizeAnonymousRoomSessions, AuthorizeLoadedSession } from './realtimeSessions/sessionAccess.js';
|
|
50
54
|
import { RecordingAssemblyScheduler } from './realtimeSessions/RecordingAssemblyScheduler.js';
|
|
51
55
|
import {
|
|
52
56
|
RealtimeSessionEventService,
|
|
@@ -66,22 +70,23 @@ import { ActionEngineServer } from '@memberjunction/actions';
|
|
|
66
70
|
import { CreateAdhocSQLAuthorizer } from './resolvers/AdhocQueryResolver.js';
|
|
67
71
|
import { CacheManagerConfigFromSettings, CreateSharedCacheFromEnvironment, StartEngineSweeper, StartMetadataSweep, StartUserCacheChecks, WarmupLeaseMsFromSettings, WirePushStatusFanOut, WireSharedCacheEvents } from './sharedCache.js';
|
|
68
72
|
import { PubSubManager } from './generic/PubSubManager.js';
|
|
69
|
-
import {
|
|
73
|
+
import { StartOrphanedConversationDetailReconciler } from './generic/OrphanedConversationDetailReconciler.js';
|
|
70
74
|
import {
|
|
71
75
|
HANDOFF_OFFER_FANOUT_CHANNEL,
|
|
72
76
|
HANDOFF_OFFER_TOPIC,
|
|
73
77
|
SetHandoffOfferPublishHook,
|
|
74
78
|
ParseReplicatedHandoffOfferUpdate,
|
|
75
79
|
} from './resolvers/HumanHandoffResolver.js';
|
|
76
|
-
import { RoomHandoffEngine } from '@memberjunction/livekit-room-server';
|
|
80
|
+
import { RoomAuthorizationService, RoomHandoffEngine } from '@memberjunction/livekit-room-server';
|
|
77
81
|
// Type-only: the provider is built in ./sharedCache.ts. Still needed here because the handoff-offer
|
|
78
82
|
// fan-out below stays in this file — see the note at its call site.
|
|
79
83
|
import type { RedisLocalStorageProvider } from '@memberjunction/redis-provider';
|
|
80
|
-
import { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
|
|
84
|
+
import { IntegrationProgressEmitter, SweepInterruptedRuns } from '@memberjunction/integration-progress-artifacts';
|
|
81
85
|
import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResolver.js';
|
|
82
86
|
import { RegisterRSUProgressBridge } from './integration/RSUProgressBridge.js';
|
|
83
87
|
import { ClientToolRequestManager, AgentRunWatchdog, SqlRealtimeRecordingLedger } from '@memberjunction/ai-agents';
|
|
84
88
|
import { BindBridgeEngineHostInstance, SessionJanitor, SetHostInstancePort, StartBridgeOrphanReconciliation } from './agentSessions/index.js';
|
|
89
|
+
import { ApplyHandoffOfferExpirySettings } from './agentSessions/HandoffOfferExpiry.js';
|
|
85
90
|
import { StartTaskGraphDispatcher } from './services/StartTaskGraphDispatcher.js';
|
|
86
91
|
import { MJServerWorkQueueProviderSource, StartWorkQueueHost } from './services/WorkQueueHostService.js';
|
|
87
92
|
import { GetAttachmentService } from '@memberjunction/aiengine';
|
|
@@ -96,17 +101,35 @@ import {
|
|
|
96
101
|
MJCompanyIntegrationFieldMapEntity,
|
|
97
102
|
MJScheduledJobEntity,
|
|
98
103
|
} from '@memberjunction/core-entities';
|
|
99
|
-
import {
|
|
104
|
+
import {
|
|
105
|
+
ServerExtensionLoader,
|
|
106
|
+
ServerExtensionConfig,
|
|
107
|
+
SERVER_EXTENSION_CORE_SERVICE_KEYS,
|
|
108
|
+
type IServerExtensionHostRuntimeService,
|
|
109
|
+
mergeServerExtensionConfigs,
|
|
110
|
+
prepareServerExtensionConfigs,
|
|
111
|
+
describeServerExtensionMount,
|
|
112
|
+
InstallMediaUpgradeDispatcher,
|
|
113
|
+
IsGraphQLWsPath,
|
|
114
|
+
GetCorsOwningServerExtensionRoots,
|
|
115
|
+
} from '@memberjunction/server-extensions-core';
|
|
116
|
+
import { CreateIsolatedProvider } from './isolatedProvider.js';
|
|
117
|
+
import { ResolveConfiguredPrincipal } from './auth/principals.js';
|
|
100
118
|
import { CreateExtensionOwnedPreflightFallback, CreateGlobalCorsMiddleware } from './globalCors.js';
|
|
101
119
|
import { CoreReservedServerExtensionRoots } from './serverExtensionReservedRoots.js';
|
|
102
120
|
import { ApiRoute, ApiRootPath, ConfiguredPublicUrl } from './apiRoot.js';
|
|
103
121
|
import { MountHealthcheckRoute, MountPublicCoreRoutes, MountExtensionHealthRoute, MountAuthCatalogRoute, MountAuthenticatedCoreRoutes } from './coreRoutes.js';
|
|
104
122
|
import { MetadataCacheRefreshIntervalSeconds } from './providerConfigUnits.js';
|
|
105
123
|
import { CreateMetadataRefreshSignalHandler, METADATA_REFRESH_SIGNAL } from './metadataRefreshSignal.js';
|
|
124
|
+
import { CacheInvalidationBroadcastManager } from './broadcast/index.js';
|
|
125
|
+
import { ResolveServerRole, ShouldRunBackgroundWorkers } from './serverRoleConfigUnits.js';
|
|
106
126
|
|
|
107
127
|
const cacheRefreshInterval = configInfo.databaseSettings.metadataCacheRefreshInterval;
|
|
108
128
|
|
|
109
129
|
export { MetadataCacheRefreshIntervalSeconds } from './providerConfigUnits.js';
|
|
130
|
+
export * from './serverRoleConfigUnits.js';
|
|
131
|
+
export * from './broadcast/index.js';
|
|
132
|
+
export { ApplyRootVariablesLoggingMiddleware } from './logging/variablesLoggingMiddleware.js';
|
|
110
133
|
|
|
111
134
|
/**
|
|
112
135
|
* Returns the configured database platform from the `DB_PLATFORM` environment
|
|
@@ -153,6 +176,7 @@ export * from './directives/index.js';
|
|
|
153
176
|
export { NoLog, hasNoLogParameter, getNoLogFields } from './logging/NoLog.js';
|
|
154
177
|
export * from './entitySubclasses/MJEntityPermissionEntityServer.server.js';
|
|
155
178
|
export * from './types.js';
|
|
179
|
+
export * from './requestOrigin.js';
|
|
156
180
|
export {
|
|
157
181
|
getSystemUser,
|
|
158
182
|
getSigningKeys,
|
|
@@ -333,8 +357,6 @@ function resolveServerVersion(): string | undefined {
|
|
|
333
357
|
}
|
|
334
358
|
}
|
|
335
359
|
|
|
336
|
-
/** How often to re-check for conversation details left behind by finished runs. */
|
|
337
|
-
const ORPHAN_DETAIL_SWEEP_INTERVAL_MS = 5 * 60_000;
|
|
338
360
|
|
|
339
361
|
/**
|
|
340
362
|
* Replicate handoff-offer updates across server instances over Redis.
|
|
@@ -432,6 +454,9 @@ export const Serve = async (resolverPaths: Array<string>, app: Application = Cre
|
|
|
432
454
|
SetHostInstancePort(graphqlPort);
|
|
433
455
|
// The realtime bridge engine stamps its bridge rows with the same identity and reconciles orphans by it (#5310).
|
|
434
456
|
BindBridgeEngineHostInstance();
|
|
457
|
+
// An anonymous visitor may join only the LiveKit agent-session room it owns by scope; the room gate cannot import
|
|
458
|
+
// this package's session-access decision, so it is handed in here, before any resolver runs (MJ#6044).
|
|
459
|
+
RoomAuthorizationService.Instance.SetAnonymousSessionOwnerCheck(AuthorizeAnonymousRoomSessions);
|
|
435
460
|
// Level-gated startup logger. Resolves verbosity from telemetry.level (single
|
|
436
461
|
// operator knob). At `standard` (default), per-phase timings are collapsed into
|
|
437
462
|
// the one-line summary; at `verbose`+ each phase prints inline as before.
|
|
@@ -491,6 +516,8 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
491
516
|
// Every API pool carries the statement and idle-in-transaction timeouts from connection #1.
|
|
492
517
|
const pgConnectionConfig = BuildPostgreSQLConnectionConfig(pgEndpoint, configInfo.databaseSettings, 'api');
|
|
493
518
|
const pgPool = new pg.default.Pool(ToPGPoolConfig(pgConnectionConfig));
|
|
519
|
+
// An idle connection the server drops is emitted on the pool; without a listener Node exits.
|
|
520
|
+
pgPool.on('error', (err) => console.error('[PostgreSQL pool] Idle connection error (connection evicted):', err.message));
|
|
494
521
|
|
|
495
522
|
// Verify connection
|
|
496
523
|
const testClient = await pgPool.connect();
|
|
@@ -508,6 +535,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
508
535
|
...ToPGPoolConfig(BuildPostgreSQLConnectionConfig({ ...pgEndpoint, ...pgReadOnlyCredentials }, configInfo.databaseSettings, 'read-only')),
|
|
509
536
|
types: MJPostgresTypes,
|
|
510
537
|
});
|
|
538
|
+
readOnlyPgPool.on('error', (err) => console.error('[PostgreSQL read-only pool] Idle connection error (connection evicted):', err.message));
|
|
511
539
|
const readOnlyTestClient = await readOnlyPgPool.connect();
|
|
512
540
|
try {
|
|
513
541
|
for (const warning of await DescribeReadOnlyLoginOverreach(readOnlyTestClient, mj_core_schema)) {
|
|
@@ -594,15 +622,25 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
594
622
|
'codegen',
|
|
595
623
|
);
|
|
596
624
|
const codegenPgPool = new pg.default.Pool(ToPGPoolConfig(codegenPgConnectionConfig));
|
|
625
|
+
codegenPgPool.on('error', (err) => console.error('[PostgreSQL CodeGen pool] Idle connection error (connection evicted):', err.message));
|
|
597
626
|
const codegenTestClient = await codegenPgPool.connect();
|
|
598
627
|
await codegenTestClient.query('SELECT 1');
|
|
599
628
|
codegenTestClient.release();
|
|
600
629
|
|
|
601
630
|
const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
|
|
631
|
+
// Adopt the already-loaded global Metadata.Provider catalog (ignoreExistingMetadata = false)
|
|
632
|
+
// so boot does not pay a second full metadata load. The refresh interval stays non-zero on
|
|
633
|
+
// PostgreSQL on purpose: PostgreSQLDataProvider.AllowRefresh is `CheckRefreshIntervalSeconds > 0`,
|
|
634
|
+
// so an interval of 0 would make every later codegenPgProvider.Refresh() — the one RSU CodeGen
|
|
635
|
+
// issues after DDL — return without reloading, leaving this provider frozen at the boot catalog.
|
|
636
|
+
// (SQL Server's AllowRefresh is independent of the interval, so its codegen provider can use 0.)
|
|
602
637
|
const codegenPgConfigData = new PostgreSQLProviderConfigData(
|
|
603
638
|
codegenPgConnectionConfig,
|
|
604
639
|
mj_core_schema,
|
|
605
640
|
cacheRefreshInterval / 1000, // ms → seconds
|
|
641
|
+
undefined,
|
|
642
|
+
undefined,
|
|
643
|
+
false,
|
|
606
644
|
);
|
|
607
645
|
const codegenPgProvider = new PostgreSQLDataProvider();
|
|
608
646
|
await codegenPgProvider.Config(codegenPgConfigData); // separate pool (per-instance manager); does NOT touch the global API provider
|
|
@@ -632,7 +670,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
632
670
|
startupLog.LogIf('verbose', 'RSU in-process CodeGen runner initialized (PostgreSQL).');
|
|
633
671
|
|
|
634
672
|
// Inject CodeGen output paths for targeted git staging
|
|
635
|
-
const { initializeConfig } = await import('@memberjunction/codegen-lib');
|
|
673
|
+
const { initializeConfig, ResolveAdditionalSchemaInfoPath } = await import('@memberjunction/codegen-lib');
|
|
636
674
|
const cgConfig = initializeConfig(rsuWorkDir);
|
|
637
675
|
const outputPaths = (cgConfig.output ?? []).map((o: { directory: string }) => o.directory);
|
|
638
676
|
RuntimeSchemaManager.Instance.SetCodeGenOutputPaths(outputPaths);
|
|
@@ -641,9 +679,12 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
641
679
|
// Point RSU's soft PK/FK writer at the SAME file CodeGen reads (mj.config.cjs
|
|
642
680
|
// `additionalSchemaInfo`), or RSU writes soft PKs to its own default path while
|
|
643
681
|
// CodeGen reads a different one and skips integration tables with "No primary key found".
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
682
|
+
// Inject the ABSOLUTE path CodeGen resolves (env override, else relative to the mj.config
|
|
683
|
+
// file's directory) so RSU, the resolvers and CodeGen agree whatever their cwd (#5858).
|
|
684
|
+
const resolvedSchemaInfoPath = ResolveAdditionalSchemaInfoPath();
|
|
685
|
+
if (resolvedSchemaInfoPath) {
|
|
686
|
+
RuntimeSchemaManager.Instance.SetAdditionalSchemaInfoPath(resolvedSchemaInfoPath);
|
|
687
|
+
startupLog.LogIf('verbose', `RSU additionalSchemaInfo path: ${resolvedSchemaInfoPath}`);
|
|
647
688
|
} else if (RuntimeSchemaManager.Instance.IsEnabled) {
|
|
648
689
|
// U5 — boot-time assert: RSU is enabled but CodeGen has NO additionalSchemaInfo path
|
|
649
690
|
// configured, so RSU's soft-PK/FK writes land in a file CodeGen never reads. Every
|
|
@@ -651,7 +692,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
651
692
|
// named, and actionable — grep for RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE.
|
|
652
693
|
console.error(
|
|
653
694
|
`[RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE] Runtime Schema Update is ENABLED but mj.config.cjs has no ` +
|
|
654
|
-
`'additionalSchemaInfo' setting — RSU writes soft PK/FK definitions to '${
|
|
695
|
+
`'additionalSchemaInfo' setting (and RSU_ADDITIONAL_SCHEMA_INFO_PATH is unset) — RSU writes soft PK/FK definitions to '${RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath}' ` +
|
|
655
696
|
`while CodeGen reads none, so resolved soft primary keys will be silently LOST at codegen time. ` +
|
|
656
697
|
`Set 'additionalSchemaInfo' in mj.config.cjs to the same file so the write path and read path agree.`
|
|
657
698
|
);
|
|
@@ -747,8 +788,18 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
747
788
|
await codegenPool.connect();
|
|
748
789
|
|
|
749
790
|
const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
|
|
750
|
-
//
|
|
751
|
-
|
|
791
|
+
// Adopt the already-loaded global Metadata.Provider catalog (ignoreExistingMetadata = false)
|
|
792
|
+
// and disable a duplicate background refresh timer (0): avoids a second full metadata load
|
|
793
|
+
// on boot while explicit codegenProvider.Refresh() after DDL still reloads from the DB
|
|
794
|
+
// (SQLServerDataProvider.AllowRefresh does not depend on the interval; PostgreSQL's does — see above).
|
|
795
|
+
const codegenConfig = new SQLServerProviderConfigData(
|
|
796
|
+
codegenPool,
|
|
797
|
+
mj_core_schema,
|
|
798
|
+
0,
|
|
799
|
+
undefined,
|
|
800
|
+
undefined,
|
|
801
|
+
false,
|
|
802
|
+
);
|
|
752
803
|
const codegenProvider = new SQLServerDataProvider();
|
|
753
804
|
await codegenProvider.Config(codegenConfig);
|
|
754
805
|
RuntimeSchemaManager.Instance.SetDDLProvider(codegenProvider);
|
|
@@ -777,7 +828,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
777
828
|
startupLog.LogIf('verbose', 'RSU in-process CodeGen runner initialized.');
|
|
778
829
|
|
|
779
830
|
// Inject CodeGen output paths for targeted git staging
|
|
780
|
-
const { initializeConfig } = await import('@memberjunction/codegen-lib');
|
|
831
|
+
const { initializeConfig, ResolveAdditionalSchemaInfoPath } = await import('@memberjunction/codegen-lib');
|
|
781
832
|
const codegenConfig = initializeConfig(rsuWorkDir);
|
|
782
833
|
const outputPaths = (codegenConfig.output ?? []).map((o: { directory: string }) => o.directory);
|
|
783
834
|
RuntimeSchemaManager.Instance.SetCodeGenOutputPaths(outputPaths);
|
|
@@ -787,14 +838,17 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
787
838
|
// `additionalSchemaInfo`). Without this, RSU writes soft PKs to its own default
|
|
788
839
|
// path while CodeGen reads a different one and skips every integration table
|
|
789
840
|
// with "No primary key found".
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
841
|
+
// Inject the ABSOLUTE path CodeGen resolves (env override, else relative to the mj.config
|
|
842
|
+
// file's directory) so RSU, the resolvers and CodeGen agree whatever their cwd (#5858).
|
|
843
|
+
const resolvedSchemaInfoPath = ResolveAdditionalSchemaInfoPath();
|
|
844
|
+
if (resolvedSchemaInfoPath) {
|
|
845
|
+
RuntimeSchemaManager.Instance.SetAdditionalSchemaInfoPath(resolvedSchemaInfoPath);
|
|
846
|
+
startupLog.LogIf('verbose', `RSU additionalSchemaInfo path: ${resolvedSchemaInfoPath}`);
|
|
793
847
|
} else if (RuntimeSchemaManager.Instance.IsEnabled) {
|
|
794
848
|
// U5 — boot-time assert: write path ≠ read path (see the PostgreSQL branch for detail).
|
|
795
849
|
console.error(
|
|
796
850
|
`[RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE] Runtime Schema Update is ENABLED but mj.config.cjs has no ` +
|
|
797
|
-
`'additionalSchemaInfo' setting — RSU writes soft PK/FK definitions to '${
|
|
851
|
+
`'additionalSchemaInfo' setting (and RSU_ADDITIONAL_SCHEMA_INFO_PATH is unset) — RSU writes soft PK/FK definitions to '${RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath}' ` +
|
|
798
852
|
`while CodeGen reads none, so resolved soft primary keys will be silently LOST at codegen time. ` +
|
|
799
853
|
`Set 'additionalSchemaInfo' in mj.config.cjs to the same file so the write path and read path agree.`
|
|
800
854
|
);
|
|
@@ -1030,6 +1084,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1030
1084
|
// config.ts loads and validates at module scope, so importing it there would pull full config
|
|
1031
1085
|
// validation into every import chain that touches the resolver, unit tests included.
|
|
1032
1086
|
ConfigureRecordDataBroadcast(configInfo.cacheSettings?.recordDataBroadcastEntities);
|
|
1087
|
+
CacheInvalidationBroadcastManager.Instance.Configure(configInfo.cacheSettings?.broadcast);
|
|
1033
1088
|
|
|
1034
1089
|
// Global listener: broadcast CACHE_INVALIDATION to all browser clients whenever
|
|
1035
1090
|
// ANY BaseEntity save/delete occurs on this server — regardless of whether it
|
|
@@ -1052,7 +1107,8 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1052
1107
|
// fires for server-internal saves too (agents, actions, orchestrator), which are exactly
|
|
1053
1108
|
// the ones no browser session asked for.
|
|
1054
1109
|
recordData:
|
|
1055
|
-
beEvent.type === 'save' && MayBroadcastRecordData(entityName)
|
|
1110
|
+
beEvent.type === 'save' && MayBroadcastRecordData(entityName, beEvent.baseEntity.EntityInfo)
|
|
1111
|
+
// fls-guard: MayBroadcastRecordData refuses FLS entities and Record Changes
|
|
1056
1112
|
? JSON.stringify(beEvent.baseEntity.GetAll())
|
|
1057
1113
|
: undefined,
|
|
1058
1114
|
});
|
|
@@ -1103,7 +1159,6 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1103
1159
|
scalarsMap: [{ type: Date, scalar: GraphQLTimestamp }],
|
|
1104
1160
|
emitSchemaFile: websiteRunFromPackage !== 1,
|
|
1105
1161
|
pubSub,
|
|
1106
|
-
globalMiddlewares: [variablesLoggingMiddleware],
|
|
1107
1162
|
});
|
|
1108
1163
|
const buildMs = performance.now() - tBuild;
|
|
1109
1164
|
|
|
@@ -1130,6 +1185,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1130
1185
|
auditResolversForUndecoratedArgs();
|
|
1131
1186
|
|
|
1132
1187
|
const tTransform = performance.now();
|
|
1188
|
+
schema = ApplyRootVariablesLoggingMiddleware(schema);
|
|
1133
1189
|
schema = requireSystemUserDirective.transformer(schema);
|
|
1134
1190
|
schema = publicDirective.transformer(schema);
|
|
1135
1191
|
|
|
@@ -1250,6 +1306,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1250
1306
|
},
|
|
1251
1307
|
// context() now just reads the already-validated payload — no I/O, no logging
|
|
1252
1308
|
context: async (ctx) => {
|
|
1309
|
+
// No RequestOrigin here: the upgrade request's Origin is not carried onto subscription contexts.
|
|
1253
1310
|
return { userPayload: ctx.extra.userPayload as UserPayload };
|
|
1254
1311
|
},
|
|
1255
1312
|
onClose: (ctx) => {
|
|
@@ -1299,7 +1356,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1299
1356
|
},
|
|
1300
1357
|
// High compression level (good balance between CPU and compression ratio)
|
|
1301
1358
|
level: 6
|
|
1302
|
-
}));
|
|
1359
|
+
}) as object as express.RequestHandler);
|
|
1303
1360
|
|
|
1304
1361
|
// Health check — before every middleware contribution and the auth middleware, so cloud platform
|
|
1305
1362
|
// probes never generate auth noise. Every core route mounts under MJAPI_BASE_PATH (see apiRoot.ts).
|
|
@@ -1323,6 +1380,19 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1323
1380
|
const extensionLoader = new ServerExtensionLoader();
|
|
1324
1381
|
_currentExtensionLoader = extensionLoader;
|
|
1325
1382
|
|
|
1383
|
+
const hostRuntimeService: IServerExtensionHostRuntimeService = {
|
|
1384
|
+
CreateIsolatedProvider,
|
|
1385
|
+
GetSystemUser: () => getSystemUser(),
|
|
1386
|
+
ResolvePrincipal: (configuredEmailOrId, subsystemLabel) => ResolveConfiguredPrincipal(configuredEmailOrId, subsystemLabel),
|
|
1387
|
+
};
|
|
1388
|
+
extensionLoader.Services.RegisterService(SERVER_EXTENSION_CORE_SERVICE_KEYS.HostRuntime, hostRuntimeService);
|
|
1389
|
+
if (coreAuthenticatedRouters.MagicLinkService) {
|
|
1390
|
+
extensionLoader.Services.RegisterService(
|
|
1391
|
+
SERVER_EXTENSION_CORE_SERVICE_KEYS.MagicLink,
|
|
1392
|
+
coreAuthenticatedRouters.MagicLinkService,
|
|
1393
|
+
);
|
|
1394
|
+
}
|
|
1395
|
+
|
|
1326
1396
|
// Open App packages publish their extensions; host mj.config.cjs overlays by DriverClass
|
|
1327
1397
|
// Backwards-compatibility shim: synthesize ServerExtensionConfig entries from legacy configInfo.telephony
|
|
1328
1398
|
const telephonyExtensionConfigs: ServerExtensionConfig[] = [];
|
|
@@ -1437,6 +1507,11 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1437
1507
|
MountAuthCatalogRoute(app, startupLog);
|
|
1438
1508
|
|
|
1439
1509
|
// ─── Unified auth middleware (replaces both REST authMiddleware and contextFunction auth) ─────
|
|
1510
|
+
// Always shown, whatever the log level: a configured map makes logins run as other people's records
|
|
1511
|
+
const userEmailMapWarning = DescribeUserEmailMap(userEmailMap);
|
|
1512
|
+
if (userEmailMapWarning) {
|
|
1513
|
+
console.warn(userEmailMapWarning);
|
|
1514
|
+
}
|
|
1440
1515
|
app.use(CreateUnifiedAuthMiddleware(dataSources));
|
|
1441
1516
|
|
|
1442
1517
|
// ─── Post-auth middleware from BaseServerMiddleware plugins ─────
|
|
@@ -1530,11 +1605,29 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1530
1605
|
// ─── GraphQL middleware (contextFunction reads req.userPayload, no re-auth) ─────
|
|
1531
1606
|
app.use(
|
|
1532
1607
|
graphqlRootPath,
|
|
1533
|
-
cors<cors.CorsRequest>(
|
|
1608
|
+
cors<cors.CorsRequest>({
|
|
1609
|
+
exposedHeaders: ['X-MJ-Cache-Seq', 'X-MJ-Server-ID'],
|
|
1610
|
+
}),
|
|
1534
1611
|
BodyParser.json({ limit: '50mb' }),
|
|
1535
1612
|
// Express 5 leaves req.body as undefined for non-JSON or empty bodies;
|
|
1536
1613
|
// Apollo Server's expressMiddleware requires req.body to be defined.
|
|
1537
|
-
|
|
1614
|
+
// Also piggyback the latest monotonic cache invalidation sequence and server process ID
|
|
1615
|
+
// onto every GraphQL HTTP response so clients can detect and recover missed invalidations.
|
|
1616
|
+
(req, res, next) => {
|
|
1617
|
+
if (req.body === undefined) req.body = {};
|
|
1618
|
+
const broadcastProvider = CacheInvalidationBroadcastManager.Instance.Provider;
|
|
1619
|
+
res.setHeader('X-MJ-Cache-Seq', String(broadcastProvider.CurrentSequence));
|
|
1620
|
+
res.setHeader('X-MJ-Server-ID', broadcastProvider.ServerProcessID);
|
|
1621
|
+
const originalWriteHead = res.writeHead.bind(res);
|
|
1622
|
+
res.writeHead = ((...args: Parameters<typeof res.writeHead>) => {
|
|
1623
|
+
if (!res.headersSent) {
|
|
1624
|
+
res.setHeader('X-MJ-Cache-Seq', String(broadcastProvider.CurrentSequence));
|
|
1625
|
+
res.setHeader('X-MJ-Server-ID', broadcastProvider.ServerProcessID);
|
|
1626
|
+
}
|
|
1627
|
+
return originalWriteHead(...args);
|
|
1628
|
+
}) as typeof res.writeHead;
|
|
1629
|
+
next();
|
|
1630
|
+
},
|
|
1538
1631
|
expressMiddleware(apolloServer, {
|
|
1539
1632
|
context: contextFunction({
|
|
1540
1633
|
setupComplete$,
|
|
@@ -1549,9 +1642,41 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1549
1642
|
app.use(mw);
|
|
1550
1643
|
}
|
|
1551
1644
|
|
|
1645
|
+
const serverRole = ResolveServerRole(configInfo.serverRole ?? process.env.MJ_SERVER_ROLE);
|
|
1646
|
+
const runBackgroundWorkers = ShouldRunBackgroundWorkers(serverRole);
|
|
1647
|
+
if (!runBackgroundWorkers) {
|
|
1648
|
+
LogStatus(`[ServerRole] Running in '${serverRole}' mode — background worker services are disabled on this replica.`);
|
|
1649
|
+
}
|
|
1650
|
+
|
|
1651
|
+
// Every role runs agents, so every role's watchdog takes the configured intervals (before any run starts).
|
|
1652
|
+
AgentRunWatchdog.Instance.Configure(configInfo.agentRunWatchdog);
|
|
1653
|
+
// The handoff offer registry starts its own expiry sweep when it loads, on every role; apply the host's setting.
|
|
1654
|
+
ApplyHandoffOfferExpirySettings(configInfo.agentSessions.handoffOfferExpiry);
|
|
1655
|
+
|
|
1656
|
+
// Close out run artifacts a dead process left open, BEFORE anything below can start a new run.
|
|
1657
|
+
//
|
|
1658
|
+
// A killed process (OOM killer, SIGKILL, host reboot) never writes its run's terminal result, so
|
|
1659
|
+
// the run reads as in-flight forever: the wizard spins, the active-operations panel shows a step
|
|
1660
|
+
// that will never advance, and no failure is reported anywhere. Sound only before the first new
|
|
1661
|
+
// run: artifacts are process-local, so anything still in flight as THIS process starts belongs
|
|
1662
|
+
// to a process that no longer exists. That is why it runs here, ahead of the scheduler, the
|
|
1663
|
+
// integration sync worker (its Start() polls immediately), the HTTP listener (a request can
|
|
1664
|
+
// start a discovery) and pending RSU work, and why it is awaited. It needs none of them.
|
|
1665
|
+
//
|
|
1666
|
+
// One exception: an RSU run killed inside its own RestartMJAPI step is not dead — THIS process is
|
|
1667
|
+
// its continuation, and processRSUPendingWork below re-attaches to it. Those are left in flight
|
|
1668
|
+
// (and named in `Skipped`); whichever of them nothing re-attaches to is closed out afterwards by
|
|
1669
|
+
// RSUPostRestartProgressSession.SweepUnattached. On a replica that runs no background workers
|
|
1670
|
+
// nothing would ever resume them, so there they are swept like any other.
|
|
1671
|
+
const bootSweep = await SweepInterruptedRuns(
|
|
1672
|
+
undefined,
|
|
1673
|
+
msg => console.warn(msg),
|
|
1674
|
+
runBackgroundWorkers ? RSUPostRestartProgressSession.WasKilledAtRestart : undefined
|
|
1675
|
+
);
|
|
1676
|
+
|
|
1552
1677
|
// Initialize and start scheduled jobs service if enabled
|
|
1553
1678
|
let scheduledJobsService: ScheduledJobsService | null = null;
|
|
1554
|
-
if (configInfo.scheduledJobs?.enabled) {
|
|
1679
|
+
if (runBackgroundWorkers && configInfo.scheduledJobs?.enabled) {
|
|
1555
1680
|
try {
|
|
1556
1681
|
scheduledJobsService = new ScheduledJobsService(configInfo.scheduledJobs);
|
|
1557
1682
|
await scheduledJobsService.Initialize();
|
|
@@ -1565,7 +1690,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1565
1690
|
// Initialize and start the integration sync worker if enabled (PR 1 item 8).
|
|
1566
1691
|
// Off by default — deployments that don't opt in keep running syncs inline.
|
|
1567
1692
|
let integrationSyncWorker: IntegrationSyncWorkerService | null = null;
|
|
1568
|
-
if (configInfo.integrationSyncWorker?.enabled) {
|
|
1693
|
+
if (runBackgroundWorkers && configInfo.integrationSyncWorker?.enabled) {
|
|
1569
1694
|
try {
|
|
1570
1695
|
integrationSyncWorker = new IntegrationSyncWorkerService(configInfo.integrationSyncWorker);
|
|
1571
1696
|
await integrationSyncWorker.Initialize();
|
|
@@ -1603,52 +1728,53 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1603
1728
|
}
|
|
1604
1729
|
startupLog.PrintSummary();
|
|
1605
1730
|
|
|
1606
|
-
// Process pending RSU work from pre-restart (entity maps, field maps, sync)
|
|
1607
|
-
processRSUPendingWork().catch(err => console.warn(`RSU pending work processing failed: ${err}`));
|
|
1608
|
-
|
|
1609
|
-
// Resume any integration syncs that were orphaned by the previous process restart
|
|
1610
1731
|
const resumeUser = UserCache.Instance.GetSystemUser();
|
|
1611
|
-
if (resumeUser) {
|
|
1612
|
-
IntegrationEngine.Instance.ResumeOrphanedSyncs(resumeUser)
|
|
1613
|
-
.catch(err => console.warn(`[IntegrationEngine] Orphaned sync resume failed: ${err}`));
|
|
1614
|
-
}
|
|
1615
1732
|
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1733
|
+
if (runBackgroundWorkers) {
|
|
1734
|
+
// Process pending RSU work from pre-restart (entity maps, field maps, sync)
|
|
1735
|
+
processRSUPendingWork().catch(err => console.warn(`RSU pending work processing failed: ${err}`))
|
|
1736
|
+
.finally(() =>
|
|
1737
|
+
RSUPostRestartProgressSession.SweepUnattached(bootSweep.Skipped, undefined, msg => console.warn(msg)).catch(err =>
|
|
1738
|
+
console.warn(`RSU leftover run sweep failed: ${err}`)
|
|
1739
|
+
)
|
|
1740
|
+
);
|
|
1741
|
+
|
|
1742
|
+
// Resume any integration syncs that were orphaned by the previous process restart
|
|
1743
|
+
if (resumeUser) {
|
|
1744
|
+
IntegrationEngine.Instance.ResumeOrphanedSyncs(resumeUser)
|
|
1745
|
+
.catch(err => console.warn(`[IntegrationEngine] Orphaned sync resume failed: ${err}`));
|
|
1746
|
+
}
|
|
1747
|
+
|
|
1748
|
+
// Force-fail any agent runs left 'Running' by a process that died (restart/crash/OOM) or whose
|
|
1749
|
+
// terminal-state write never landed. Staleness-based, so it never touches runs another healthy
|
|
1750
|
+
// instance is still heart-beating. The watchdog also self-registers for graceful-shutdown
|
|
1751
|
+
// cancellation (via ShutdownRegistry) once it begins tracking this process's first live run.
|
|
1752
|
+
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1753
|
+
const sweepUser = resumeUser;
|
|
1754
|
+
const sweepProvider = Metadata.Provider; // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1755
|
+
AgentRunWatchdog.SweepOrphanedRuns(sweepProvider, sweepUser, configInfo.agentRunWatchdog)
|
|
1756
|
+
.catch(err => console.warn(`[AgentRunWatchdog] Startup sweep failed: ${err}`));
|
|
1757
|
+
|
|
1758
|
+
// The watchdog repairs the RUN; nothing repaired the conversation detail, which is the row the
|
|
1759
|
+
// chat actually renders from (MJ #4222). A process that dies mid-run leaves a terminal run
|
|
1760
|
+
// beside a message that still claims to be generating, and it spins forever for anyone who
|
|
1761
|
+
// opens it. Runs at boot (closes restart orphans) and, unless `conversationDetailReconciler.enabled`
|
|
1762
|
+
// is false, on a timer (closes mid-life orphans), mirroring the watchdog's own two-phase shape.
|
|
1763
|
+
StartOrphanedConversationDetailReconciler(sweepProvider, sweepUser, configInfo.conversationDetailReconciler);
|
|
1764
|
+
}
|
|
1641
1765
|
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
.
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1766
|
+
// Launch the AI Agent Session janitor: run own-host orphan recovery once at boot, then a periodic tick
|
|
1767
|
+
// that closes stale and over-deadline sessions and rebuilds lost realtime recordings from their
|
|
1768
|
+
// crash-recovery shards (storage reads and writes). Self-registers with ShutdownRegistry, so its timer
|
|
1769
|
+
// is cleared by the gracefulShutdown drain below (no explicit Stop() wiring needed here).
|
|
1770
|
+
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — boot-time session janitor uses the server's own provider
|
|
1771
|
+
// `agentSessions.janitor.enabled: false` keeps the boot recovery and shutdown drain but schedules no tick.
|
|
1772
|
+
SessionJanitor.Instance.StartWithSettings(configInfo.agentSessions.janitor, Metadata.Provider, resumeUser) // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1773
|
+
.catch(err => console.warn(`[SessionJanitor] Startup failed: ${err}`));
|
|
1774
|
+
// The bridge engine's orphan reconcile likewise starts only now that this process holds its port, so it can't
|
|
1775
|
+
// take the live bridges of another MJAPI still serving that port for its own orphans (#5310).
|
|
1776
|
+
StartBridgeOrphanReconciliation(Metadata.Provider, resumeUser, configInfo.agentSessions.bridgeReconciler); // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1777
|
+
}
|
|
1652
1778
|
}
|
|
1653
1779
|
|
|
1654
1780
|
// Launch the durable task-graph dispatcher: claim Pending tasks, execute them with a fresh
|
|
@@ -1677,7 +1803,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1677
1803
|
// StartTaskGraphDispatcher); this gives the agent seam the same.
|
|
1678
1804
|
SuppressTaskGraphSubmission('MJ_DISABLE_TASK_GRAPH_DISPATCHER=1 is set on this host');
|
|
1679
1805
|
LogStatus('[TaskGraphDispatcher] Disabled by MJ_DISABLE_TASK_GRAPH_DISPATCHER=1 — this process will neither accept nor execute task graphs.');
|
|
1680
|
-
} else if (resumeUser && taskGraphPool instanceof sql.ConnectionPool) {
|
|
1806
|
+
} else if (runBackgroundWorkers && resumeUser && taskGraphPool instanceof sql.ConnectionPool) {
|
|
1681
1807
|
StartTaskGraphDispatcher(taskGraphPool, resumeUser)
|
|
1682
1808
|
.catch(err => console.warn(`[TaskGraphDispatcher] Startup failed: ${err}`));
|
|
1683
1809
|
}
|
|
@@ -1687,7 +1813,7 @@ const setupComplete$ = new ReplaySubject(1);
|
|
|
1687
1813
|
// ShutdownAll() drains it (up to 2 × shutdownDrainMs) before the HTTP server closes.
|
|
1688
1814
|
// Not awaited: a slow engine load must not delay readiness, and a failure never stops the API.
|
|
1689
1815
|
const workQueueProvider = Metadata.Provider; // global-provider-ok: server startup — the work-queue host runs on the server's own provider
|
|
1690
|
-
if (configInfo.workQueue?.enabled && workQueueProvider instanceof DatabaseProviderBase) {
|
|
1816
|
+
if (runBackgroundWorkers && configInfo.workQueue?.enabled && workQueueProvider instanceof DatabaseProviderBase) {
|
|
1691
1817
|
const workQueuePool = dataSources[0]?.dataSource;
|
|
1692
1818
|
const providerSource = new MJServerWorkQueueProviderSource(workQueuePool instanceof sql.ConnectionPool ? workQueuePool : null, workQueueProvider);
|
|
1693
1819
|
StartWorkQueueHost(configInfo.workQueue, workQueueProvider, providerSource)
|
|
@@ -1850,9 +1976,18 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
1850
1976
|
// Wait a moment for metadata to be fully loaded
|
|
1851
1977
|
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
1852
1978
|
|
|
1979
|
+
// The RSU run these items belong to is still open: the pre-restart process was killed inside its
|
|
1980
|
+
// own RestartMJAPI step, so it never wrote a terminal result. This session re-attaches to that run
|
|
1981
|
+
// and reports the two steps that only ever happen here — CreateEntityMaps and StartSync — into the
|
|
1982
|
+
// SAME event stream, so a client that has been tailing since before the restart keeps its cursor
|
|
1983
|
+
// and finally learns whether the connector went live. Purely observational: every failure below is
|
|
1984
|
+
// swallowed, and the work proceeds whether or not a run was found to report into.
|
|
1985
|
+
const progressSession = new RSUPostRestartProgressSession();
|
|
1986
|
+
|
|
1853
1987
|
for (const pending of pendingItems) {
|
|
1854
1988
|
const pendingWorkID = pending.ID;
|
|
1855
1989
|
const item = pending.Work;
|
|
1990
|
+
let progress: RSUPostRestartProgress | null = null;
|
|
1856
1991
|
// Declared outside the try so the catch can narrow a retry to what is still outstanding: what
|
|
1857
1992
|
// actually got mapped this attempt. Each retry is then strictly smaller, and one poison object
|
|
1858
1993
|
// cannot keep re-running its healthy siblings.
|
|
@@ -1874,6 +2009,10 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
1874
2009
|
continue;
|
|
1875
2010
|
}
|
|
1876
2011
|
|
|
2012
|
+
// Attached only for apply-objects work: promote-columns is a follow-up to a DIFFERENT run
|
|
2013
|
+
// shape that has no CreateEntityMaps/StartSync steps to report.
|
|
2014
|
+
progress = await progressSession.For(item.CompanyIntegrationID);
|
|
2015
|
+
|
|
1877
2016
|
// Resolve connector
|
|
1878
2017
|
const rv = new RunView();
|
|
1879
2018
|
const ciResult = await rv.RunView<MJCompanyIntegrationEntity>({
|
|
@@ -1883,8 +2022,10 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
1883
2022
|
}, systemUser);
|
|
1884
2023
|
const companyIntegration = ciResult.Results[0];
|
|
1885
2024
|
if (!companyIntegration) {
|
|
1886
|
-
|
|
1887
|
-
|
|
2025
|
+
const missingCI = `CompanyIntegration ${item.CompanyIntegrationID} not found`;
|
|
2026
|
+
progress?.FailEntityMaps(missingCI, item.SourceObjectNames ?? []);
|
|
2027
|
+
await rsm.FailPendingWork(pendingWorkID, missingCI, systemUser);
|
|
2028
|
+
console.warn(`[RSU] ${missingCI}`);
|
|
1888
2029
|
continue;
|
|
1889
2030
|
}
|
|
1890
2031
|
|
|
@@ -1896,14 +2037,18 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
1896
2037
|
}, systemUser);
|
|
1897
2038
|
const integrationEntity = integrationResult.Results[0];
|
|
1898
2039
|
if (!integrationEntity) {
|
|
1899
|
-
|
|
1900
|
-
|
|
2040
|
+
const missingIntegration = `Integration entity for ${integrationName} not found`;
|
|
2041
|
+
progress?.FailEntityMaps(missingIntegration, item.SourceObjectNames ?? []);
|
|
2042
|
+
await rsm.FailPendingWork(pendingWorkID, missingIntegration, systemUser);
|
|
2043
|
+
console.warn(`[RSU] ${missingIntegration}`);
|
|
1901
2044
|
continue;
|
|
1902
2045
|
}
|
|
1903
2046
|
const connector = ConnectorFactory.Resolve(integrationEntity);
|
|
1904
2047
|
if (!connector) {
|
|
1905
|
-
|
|
1906
|
-
|
|
2048
|
+
const missingConnector = `Connector for ${integrationName} not found`;
|
|
2049
|
+
progress?.FailEntityMaps(missingConnector, item.SourceObjectNames ?? []);
|
|
2050
|
+
await rsm.FailPendingWork(pendingWorkID, missingConnector, systemUser);
|
|
2051
|
+
console.warn(`[RSU] ${missingConnector}`);
|
|
1907
2052
|
continue;
|
|
1908
2053
|
}
|
|
1909
2054
|
|
|
@@ -1912,10 +2057,28 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
1912
2057
|
const rvPending = new RunView();
|
|
1913
2058
|
const sourceObjectFields: Record<string, string[] | null> = item.SourceObjectFields ?? {};
|
|
1914
2059
|
|
|
1915
|
-
// Introspect schema ONCE for the entire connector, then reuse per object
|
|
2060
|
+
// Introspect schema ONCE for the entire connector, then reuse per object.
|
|
2061
|
+
//
|
|
2062
|
+
// IN THE CONNECTION'S CATALOG SCOPE. This runs at process start, outside any request, so
|
|
2063
|
+
// nothing upstream has entered a scope for it — and an unscoped catalog read falls back to
|
|
2064
|
+
// the SHARED catalog by design. That would build these field maps from the connector's
|
|
2065
|
+
// declared fields alone: every column this connection's own discovery sampled would get a
|
|
2066
|
+
// table column from the RSU (built in scope, from the per-connection rows) but no field map,
|
|
2067
|
+
// and its values would land in the overflow JSON instead of the column. Observed on the
|
|
2068
|
+
// sandbox 2026-09-11: 487 declared fields, 556 per-connection — 69 columns that this read
|
|
2069
|
+
// would have silently left unmapped. Entering the scope is not enough on a fresh process:
|
|
2070
|
+
// IntrospectInCatalogScope loads the catalog and warms each object's fields first.
|
|
1916
2071
|
const introspect = connector.IntrospectSchema.bind(connector) as
|
|
1917
2072
|
(ci: unknown, u: unknown) => Promise<{ Objects: Array<{ ExternalName: string; Fields: Array<{ Name: string; IsPrimaryKey?: boolean; IsRequired?: boolean }> }> }>;
|
|
1918
|
-
const schema = await
|
|
2073
|
+
const schema = await IntrospectInCatalogScope(
|
|
2074
|
+
item.CompanyIntegrationID,
|
|
2075
|
+
item.SourceObjectNames,
|
|
2076
|
+
() => introspect(companyIntegration, systemUser),
|
|
2077
|
+
systemUser,
|
|
2078
|
+
);
|
|
2079
|
+
|
|
2080
|
+
const objectsToMap = item.SourceObjectNames.length;
|
|
2081
|
+
progress?.BeginEntityMaps(objectsToMap);
|
|
1919
2082
|
|
|
1920
2083
|
for (const objName of item.SourceObjectNames) {
|
|
1921
2084
|
const tableName = objName.replace(/[^A-Za-z0-9_]/g, '_').toLowerCase();
|
|
@@ -2021,8 +2184,15 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
2021
2184
|
} catch (fieldErr) {
|
|
2022
2185
|
console.warn(`[RSU] Field map creation failed for ${objName}: ${fieldErr}`);
|
|
2023
2186
|
}
|
|
2187
|
+
|
|
2188
|
+
progress?.ObjectMapped(objName, mappedObjectNames.size, objectsToMap);
|
|
2024
2189
|
}
|
|
2025
2190
|
|
|
2191
|
+
// The applied rollup for this half of the run, in OBJECTS. `mappedObjectNames` is the same set
|
|
2192
|
+
// the retry path narrows against, so what is reported succeeded here is exactly what a retry
|
|
2193
|
+
// would NOT redo.
|
|
2194
|
+
progress?.CompleteEntityMaps(objectsToMap, mappedObjectNames.size, objectsToMap - mappedObjectNames.size);
|
|
2195
|
+
|
|
2026
2196
|
// Remove-as-disable: entity maps whose object is NOT in this apply's selection
|
|
2027
2197
|
// are disabled (data kept; re-selection re-enables). 'ignore' opts out for subset applies.
|
|
2028
2198
|
if ((item.UnselectedAction ?? 'disable') !== 'ignore') {
|
|
@@ -2038,8 +2208,11 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
2038
2208
|
}
|
|
2039
2209
|
}
|
|
2040
2210
|
|
|
2041
|
-
// Start sync if requested
|
|
2211
|
+
// Start sync if requested. This is the step the setup journey is actually waiting on — the
|
|
2212
|
+
// connector is not live until it begins — so it is a stage of its own rather than a footnote
|
|
2213
|
+
// on entity-map creation.
|
|
2042
2214
|
if (item.StartSync !== false) {
|
|
2215
|
+
progress?.BeginStartSync();
|
|
2043
2216
|
try {
|
|
2044
2217
|
await IntegrationEngine.Instance.Config(false, systemUser);
|
|
2045
2218
|
const syncOptions: IntegrationSyncOptions = {};
|
|
@@ -2049,11 +2222,18 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
2049
2222
|
const opts = Object.keys(syncOptions).length > 0 ? syncOptions : undefined;
|
|
2050
2223
|
IntegrationEngine.Instance.RunSync(item.CompanyIntegrationID, systemUser, 'Manual', undefined, undefined, opts);
|
|
2051
2224
|
console.log(`[RSU] Sync started for ${item.CompanyIntegrationID} (EntityMaps: ${createdEntityMapIDs.length}, FullSync: ${!!item.FullSync}, SyncDirection: ${item.SyncDirection ?? 'entity-map default'})`);
|
|
2225
|
+
// Looked up rather than returned: RunSync resolves only when the whole sync finishes, and
|
|
2226
|
+
// this stage closes when the sync STARTS. A null id closes the stage anyway — the sync did
|
|
2227
|
+
// start; only the hand-off to its own stream is missing.
|
|
2228
|
+
progress?.CompleteStartSync(await FindStartedSyncRunID(item.CompanyIntegrationID, systemUser));
|
|
2052
2229
|
} catch (syncErr) {
|
|
2053
2230
|
console.warn(`[RSU] Sync start failed: ${syncErr}`);
|
|
2231
|
+
progress?.FailStartSync(`Sync start failed: ${syncErr instanceof Error ? syncErr.message : String(syncErr)}`);
|
|
2054
2232
|
}
|
|
2055
2233
|
} else {
|
|
2056
2234
|
console.log(`[RSU] Sync skipped for ${item.CompanyIntegrationID} (StartSync=false)`);
|
|
2235
|
+
progress?.BeginStartSync();
|
|
2236
|
+
progress?.SkipStartSync('the caller asked for no initial sync (StartSync=false)');
|
|
2057
2237
|
}
|
|
2058
2238
|
|
|
2059
2239
|
// Create or update schedule if CronExpression provided
|
|
@@ -2092,6 +2272,7 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
2092
2272
|
EntityName: 'MJ: Scheduled Job Types',
|
|
2093
2273
|
ExtraFilter: `DriverClass='IntegrationSyncScheduledJobDriver'`,
|
|
2094
2274
|
MaxRows: 1,
|
|
2275
|
+
SkipTotalRowCount: true,
|
|
2095
2276
|
ResultType: 'simple',
|
|
2096
2277
|
Fields: ['ID']
|
|
2097
2278
|
}, systemUser);
|
|
@@ -2140,6 +2321,16 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
2140
2321
|
// Failing terminally on the first error means the objects this item would have mapped are
|
|
2141
2322
|
// silently never mapped, and the only recovery is someone noticing and re-applying by hand.
|
|
2142
2323
|
const remaining = (item.SourceObjectNames ?? []).filter(n => !mappedObjectNames.has(n));
|
|
2324
|
+
// Same list the retry narrows to, reported into the run stream: when this half fails, those
|
|
2325
|
+
// objects have tables and no way to sync into them, and this is the client's only signal.
|
|
2326
|
+
//
|
|
2327
|
+
// Reported under CreateEntityMaps because that is where the overwhelming majority of this
|
|
2328
|
+
// block's work — and so its failures — lives. A throw from further down (schedule creation,
|
|
2329
|
+
// say) lands here too, with an empty `remaining`; the stage attribution is then approximate
|
|
2330
|
+
// but the message is the real error and the run is correctly marked failed, which is what the
|
|
2331
|
+
// operator needs. The alternative — inventing a stage that is not in the pipeline's step list
|
|
2332
|
+
// — would break the determinate stepper for the sake of a nicer label.
|
|
2333
|
+
progress?.FailEntityMaps(message, remaining);
|
|
2143
2334
|
const requeued = await rsm.RetryPendingWork(pendingWorkID, item, remaining, systemUser);
|
|
2144
2335
|
if (!requeued) {
|
|
2145
2336
|
// Budget spent, or nothing left to retry. This message is the operator's only signal, so
|
|
@@ -2150,9 +2341,42 @@ async function processRSUPendingWork(): Promise<void> {
|
|
|
2150
2341
|
}
|
|
2151
2342
|
}
|
|
2152
2343
|
|
|
2344
|
+
// Terminates every RSU run this pass re-attached to. Until this lands, those runs have been
|
|
2345
|
+
// flagged in-flight since before the restart — which is exactly the state this whole mechanism
|
|
2346
|
+
// exists to end.
|
|
2347
|
+
await progressSession.FinishAll();
|
|
2348
|
+
|
|
2153
2349
|
console.log(`[RSU] Pending work processing complete`);
|
|
2154
2350
|
}
|
|
2155
2351
|
|
|
2352
|
+
/**
|
|
2353
|
+
* The ID of the sync run a just-launched sync created, or null if it is not readable yet.
|
|
2354
|
+
*
|
|
2355
|
+
* `RunSync` resolves only when the entire sync FINISHES, so it cannot be awaited for this — the
|
|
2356
|
+
* StartSync stage closes when the sync begins, not when it ends. The run row is written early in
|
|
2357
|
+
* the sync's own startup, so a short settle plus a newest-first lookup finds it. Null is a normal
|
|
2358
|
+
* outcome under load and is reported as such; it never fails anything.
|
|
2359
|
+
*/
|
|
2360
|
+
async function FindStartedSyncRunID(companyIntegrationID: string, systemUser: UserInfo): Promise<string | null> {
|
|
2361
|
+
try {
|
|
2362
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
2363
|
+
const rv = new RunView();
|
|
2364
|
+
const runResult = await rv.RunView<{ ID: string }>({
|
|
2365
|
+
EntityName: 'MJ: Company Integration Runs',
|
|
2366
|
+
ExtraFilter: `CompanyIntegrationID='${companyIntegrationID.replace(/'/g, "''")}' AND Status='In Progress'`,
|
|
2367
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
2368
|
+
MaxRows: 1,
|
|
2369
|
+
SkipTotalRowCount: true,
|
|
2370
|
+
ResultType: 'simple',
|
|
2371
|
+
Fields: ['ID'],
|
|
2372
|
+
}, systemUser);
|
|
2373
|
+
return runResult.Success && runResult.Results.length > 0 ? runResult.Results[0].ID : null;
|
|
2374
|
+
} catch (e) {
|
|
2375
|
+
console.warn(`[RSU] Could not resolve the started sync run id for ${companyIntegrationID}: ${e}`);
|
|
2376
|
+
return null;
|
|
2377
|
+
}
|
|
2378
|
+
}
|
|
2379
|
+
|
|
2156
2380
|
/**
|
|
2157
2381
|
* Creates a MSSQL ConnectionPool-compatible wrapper around a pg.Pool.
|
|
2158
2382
|
* This allows existing code that references DataSourceInfo.dataSource (typed as sql.ConnectionPool)
|
|
@@ -2193,9 +2417,10 @@ function mountRealtimeRecordingRoutes(app: Application): boolean {
|
|
|
2193
2417
|
}
|
|
2194
2418
|
const graceMs = (): number => configInfo.realtime.recordingAssemblyGraceSeconds * 1000;
|
|
2195
2419
|
const systemUser = UserCache.Instance.GetSystemUser();
|
|
2196
|
-
|
|
2420
|
+
const runWorkers = ShouldRunBackgroundWorkers(ResolveServerRole(configInfo.serverRole ?? process.env.MJ_SERVER_ROLE));
|
|
2421
|
+
if (systemUser && runWorkers) {
|
|
2197
2422
|
RecordingAssemblyScheduler.Instance.Start({ Provider: provider, SystemUser: systemUser, GraceMs: graceMs });
|
|
2198
|
-
} else {
|
|
2423
|
+
} else if (!systemUser) {
|
|
2199
2424
|
LogError('[Realtime] Recording assembly scheduler not started: no system user; the session janitor assembles recordings instead');
|
|
2200
2425
|
}
|
|
2201
2426
|
app.use(ApiRoute(REALTIME_RECORDING_MOUNT_PATH), cors<cors.CorsRequest>(), CreateRealtimeRecordingRouter({
|
|
@@ -2204,7 +2429,7 @@ function mountRealtimeRecordingRoutes(app: Application): boolean {
|
|
|
2204
2429
|
return user ? { ContextUser: user, Provider: provider } : null;
|
|
2205
2430
|
},
|
|
2206
2431
|
LoadOwnedSession: LoadOwnedRealtimeSession,
|
|
2207
|
-
|
|
2432
|
+
AuthorizeSession: AuthorizeLoadedSession,
|
|
2208
2433
|
CreateLedger: (ledgerProvider, contextUser) => new SqlRealtimeRecordingLedger(ledgerProvider, contextUser),
|
|
2209
2434
|
Scheduler: RecordingAssemblyScheduler.Instance,
|
|
2210
2435
|
GraceMs: graceMs,
|