@memberjunction/server 6.2.0-edge.6 → 6.2.0-edge.8
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 +69 -0
- 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 +31 -8
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +85 -41
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +14 -4
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +28 -4
- 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/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 +50 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +129 -12
- 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 +27 -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/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.map +1 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +2 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -1
- package/dist/config.d.ts +906 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +41 -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 +6 -4
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +1072 -5
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +10174 -4618
- package/dist/generated/graphql-schemas/__mj.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 +27 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +50 -5
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +329 -132
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +4 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +47 -7
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/globalCors.d.ts.map +1 -1
- package/dist/globalCors.js +1 -0
- package/dist/globalCors.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +201 -43
- 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 +87 -46
- 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/StartupLogger.d.ts +50 -0
- package/dist/logging/StartupLogger.d.ts.map +1 -1
- package/dist/logging/StartupLogger.js +15 -22
- package/dist/logging/StartupLogger.js.map +1 -1
- package/dist/middleware/BaseServerMiddleware.d.ts +21 -3
- package/dist/middleware/BaseServerMiddleware.d.ts.map +1 -1
- package/dist/middleware/BaseServerMiddleware.js +4 -2
- package/dist/middleware/BaseServerMiddleware.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.js +2 -3
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +15 -0
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +22 -0
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +2 -0
- package/dist/realtimeWidget/WidgetSessionService.js.map +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.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +4 -7
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +1 -0
- 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/AgentRunStatusPublisher.d.ts +10 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +18 -2
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +6 -2
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.js +61 -16
- 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/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/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +34 -13
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/InfoResolver.js +1 -1
- package/dist/resolvers/InfoResolver.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 +2690 -1305
- 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/QuerySystemUserResolver.d.ts +38 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +181 -88
- package/dist/resolvers/QuerySystemUserResolver.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 +6 -0
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +36 -5
- 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 +217 -34
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +24 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +185 -67
- 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 +3 -1
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +7 -8
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/TagGovernanceResolver.d.ts +12 -0
- package/dist/resolvers/TagGovernanceResolver.d.ts.map +1 -1
- package/dist/resolvers/TagGovernanceResolver.js +84 -0
- package/dist/resolvers/TagGovernanceResolver.js.map +1 -1
- package/dist/resolvers/TelemetryResolver.d.ts +13 -8
- package/dist/resolvers/TelemetryResolver.d.ts.map +1 -1
- package/dist/resolvers/TelemetryResolver.js +40 -9
- package/dist/resolvers/TelemetryResolver.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/resolvers/meetings/meetingMutations.d.ts.map +1 -1
- package/dist/resolvers/meetings/meetingMutations.js +34 -4
- package/dist/resolvers/meetings/meetingMutations.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/RealtimeRecordingHandler.d.ts +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +2 -4
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +2 -1
- 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/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.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +1 -0
- 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 +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +55 -2
- package/dist/util.js.map +1 -1
- package/package.json +107 -100
- package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
- package/src/__tests__/ActiveOperations.test.ts +68 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +13 -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__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
- package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
- package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
- package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
- package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -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__/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.permissions.test.ts +132 -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.test.ts +22 -0
- 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 +6 -4
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +327 -26
- package/src/__tests__/ResolverBase.diagnosticSenderRegistrations.test.ts +26 -0
- package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +53 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +60 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +4 -0
- package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
- package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +2 -0
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +2 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +87 -12
- package/src/__tests__/RunAIAgentResolver.streaming.test.ts +28 -4
- 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 +69 -0
- package/src/__tests__/TagGovernanceAndAutotagResolvers.test.ts +261 -0
- package/src/__tests__/TagGovernanceResolver.test.ts +60 -2
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
- package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
- package/src/__tests__/ViewOperationsHandler.test.ts +2 -5
- package/src/__tests__/WorkQueueHostService.test.ts +25 -7
- package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
- package/src/__tests__/contextRequestOrigin.test.ts +105 -0
- package/src/__tests__/conversationBrowsers.test.ts +62 -0
- package/src/__tests__/globalCors.test.ts +12 -0
- package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
- package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
- package/src/__tests__/realtimeRecordingHandler.test.ts +7 -2
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +79 -1
- package/src/__tests__/requestOrigin.test.ts +104 -0
- package/src/__tests__/review-capture-valid-token-log.test.ts +98 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +5 -5
- package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
- package/src/__tests__/sessionDeadline.test.ts +51 -0
- package/src/__tests__/sharedCache.test.ts +11 -0
- package/src/__tests__/unifiedAuth.test.ts +73 -1
- 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 +92 -42
- package/src/agentSessions/SessionManager.ts +38 -8
- package/src/agentSessions/conversationBrowsers.ts +143 -0
- package/src/agentSessions/sessionDeadline.ts +81 -0
- package/src/auth/APIKeyScopeAuth.ts +5 -4
- package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
- package/src/auth/loginEmailResolution.ts +67 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +146 -14
- 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 +28 -3
- package/src/auth/newUsers.ts +1 -0
- package/src/backgroundSweepConfigUnits.ts +213 -0
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +2 -1
- package/src/config.ts +69 -0
- package/src/context.ts +46 -15
- package/src/coreRoutes.ts +14 -7
- package/src/generated/graphql-schemas/__mj.ts +10360 -6479
- package/src/generic/OrphanedConversationDetailReconciler.ts +32 -1
- package/src/generic/ResolverBase.ts +422 -143
- package/src/generic/RunViewResolver.ts +96 -49
- package/src/globalCors.ts +1 -0
- package/src/index.ts +246 -44
- package/src/integration/ConnectionPause.ts +222 -0
- package/src/integration/CustomColumnPromoter.ts +123 -53
- 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/StartupLogger.ts +24 -0
- package/src/middleware/BaseServerMiddleware.ts +20 -3
- package/src/realtimeSessions/ownedRealtimeSession.ts +2 -6
- package/src/realtimeSessions/sessionAccess.ts +30 -0
- package/src/realtimeWidget/WidgetSessionService.ts +2 -0
- package/src/realtimeWidget/visitorIdentity.ts +1 -0
- package/src/realtimeWidget/widgetCore.ts +4 -8
- package/src/realtimeWidget/widgetGuestElevation.ts +1 -0
- package/src/requestOrigin.ts +64 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +27 -2
- package/src/resolvers/AgentSessionResolver.ts +6 -2
- package/src/resolvers/AutotagPipelineResolver.ts +59 -14
- package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
- package/src/resolvers/GetDataResolver.ts +35 -13
- package/src/resolvers/InfoResolver.ts +1 -1
- package/src/resolvers/IntegrationDiscoveryResolver.ts +1522 -203
- package/src/resolvers/MCPResolver.ts +15 -2
- package/src/resolvers/QuerySystemUserResolver.ts +211 -100
- package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +40 -7
- package/src/resolvers/RemoteBrowserActionResolver.ts +242 -32
- package/src/resolvers/RunAIAgentResolver.ts +265 -86
- package/src/resolvers/RunAIPromptResolver.ts +18 -18
- package/src/resolvers/RunTemplateResolver.ts +3 -1
- package/src/resolvers/SqlLoggingConfigResolver.ts +7 -9
- package/src/resolvers/TagGovernanceResolver.ts +65 -0
- package/src/resolvers/TelemetryResolver.ts +44 -9
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
- package/src/resolvers/meetingRecordingRegistration.ts +2 -0
- package/src/resolvers/meetings/meetingMutations.ts +37 -7
- package/src/rest/MediaAccessKeys.ts +6 -2
- package/src/rest/OAuthCallbackHandler.ts +13 -5
- package/src/rest/RealtimeRecordingHandler.ts +5 -9
- package/src/rest/ViewOperationsHandler.ts +2 -1
- package/src/rest/setupRESTEndpoints.ts +11 -2
- 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 +1 -0
- package/src/services/WorkQueueHostService.ts +26 -4
- package/src/services/workQueueConfig.ts +5 -5
- package/src/sharedCache.ts +1 -1
- package/src/types.ts +18 -0
- package/src/util.ts +55 -3
- package/src/services/TaskOrchestration-Integration.md +0 -188
package/dist/index.js
CHANGED
|
@@ -2,13 +2,15 @@ import dotenv from 'dotenv';
|
|
|
2
2
|
dotenv.config({ quiet: true });
|
|
3
3
|
import { expressMiddleware } from '@as-integrations/express5';
|
|
4
4
|
import { mergeSchemas } from '@graphql-tools/schema';
|
|
5
|
-
import { Metadata, SetProvider, StartupManager as StartupManagerImport, BaseEntity, RunView, DatabaseProviderBase, ProviderBase, ResolveStartupMode } from '@memberjunction/core';
|
|
6
|
-
import { UserCache, resolveDbPlatformFromEnv } from '@memberjunction/generic-database-provider';
|
|
5
|
+
import { Metadata, SetProvider, StartupManager as StartupManagerImport, BaseEntity, RunView, DatabaseProviderBase, ProviderBase, ResolveStartupMode, GetDiagnosticContext, IsDiagnosticCaptureSuppressed } from '@memberjunction/core';
|
|
6
|
+
import { UserCache, resolveDbPlatformFromEnv, GenericDatabaseProvider, SummarizeSqlParameters } from '@memberjunction/generic-database-provider';
|
|
7
7
|
import { MJGlobal, MJEventType, ShutdownRegistry } from '@memberjunction/global';
|
|
8
8
|
import { setupSQLServerClient, SQLServerDataProvider, SQLServerProviderConfigData } from '@memberjunction/sqlserver-dataprovider';
|
|
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,7 +31,8 @@ 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';
|
|
@@ -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 { AuthorizeAnonymousRoomSessions,
|
|
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,13 +54,13 @@ 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
65
|
import { RoomAuthorizationService, RoomHandoffEngine } from '@memberjunction/livekit-room-server';
|
|
63
66
|
import { IntegrationProgressEmitter, SweepInterruptedRuns } from '@memberjunction/integration-progress-artifacts';
|
|
@@ -65,6 +68,7 @@ import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResol
|
|
|
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,7 +76,9 @@ 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';
|
|
@@ -120,6 +126,7 @@ export * from './directives/index.js';
|
|
|
120
126
|
export { NoLog, hasNoLogParameter, getNoLogFields } from './logging/NoLog.js';
|
|
121
127
|
export * from './entitySubclasses/MJEntityPermissionEntityServer.server.js';
|
|
122
128
|
export * from './types.js';
|
|
129
|
+
export * from './requestOrigin.js';
|
|
123
130
|
export { getSystemUser, getSigningKeys, extractUserInfoFromPayload, verifyUserRecord, } from './auth/index.js';
|
|
124
131
|
export * from './auth/APIKeyScopeAuth.js';
|
|
125
132
|
export * from './auth/actingContextResolver.js';
|
|
@@ -229,6 +236,7 @@ export * from './generated/generated.js';
|
|
|
229
236
|
export * from './multiTenancy/index.js';
|
|
230
237
|
export * from './middleware/index.js';
|
|
231
238
|
import { RegisterDataHook } from '@memberjunction/core';
|
|
239
|
+
import { EnsureAnchoredConversationReadHookRegistered } from '@memberjunction/core-entities-server';
|
|
232
240
|
import { BaseServerMiddleware } from './middleware/BaseServerMiddleware.js';
|
|
233
241
|
import { SuppressTaskGraphSubmission } from '@memberjunction/ai-core-plus';
|
|
234
242
|
const localPath = (p) => {
|
|
@@ -268,8 +276,6 @@ function resolveServerVersion() {
|
|
|
268
276
|
return undefined;
|
|
269
277
|
}
|
|
270
278
|
}
|
|
271
|
-
/** How often to re-check for conversation details left behind by finished runs. */
|
|
272
|
-
const ORPHAN_DETAIL_SWEEP_INTERVAL_MS = 5 * 60_000;
|
|
273
279
|
/**
|
|
274
280
|
* Replicate handoff-offer updates across server instances over Redis.
|
|
275
281
|
*
|
|
@@ -404,7 +410,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
404
410
|
await WirePushStatusFanOut(sharedCache);
|
|
405
411
|
await wireHandoffOfferFanOut(sharedCache, startupLog);
|
|
406
412
|
await wireRealtimeSessionEventFanOut(sharedCache);
|
|
407
|
-
|
|
413
|
+
const safeRedisUrl = (process.env.REDIS_URL ?? '').replace(/:\/\/[^@]+@/, '://***@');
|
|
414
|
+
startupLog.LogIf('verbose', `Redis cache provider connected: ${safeRedisUrl}`);
|
|
408
415
|
}
|
|
409
416
|
const cacheManagerConfig = CacheManagerConfigFromSettings(configInfo.cacheSettings);
|
|
410
417
|
const warmupLeaseMs = WarmupLeaseMsFromSettings(configInfo.cacheSettings);
|
|
@@ -486,8 +493,39 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
486
493
|
const thePgPool = poolAny._pgPool;
|
|
487
494
|
// Translate SQL Server bracket syntax to PostgreSQL double-quote syntax
|
|
488
495
|
const pgQuery = TranslateBracketsToPG(query);
|
|
489
|
-
const
|
|
490
|
-
|
|
496
|
+
const startTime = performance.now();
|
|
497
|
+
try {
|
|
498
|
+
const result = await thePgPool.query(pgQuery);
|
|
499
|
+
if (!IsDiagnosticCaptureSuppressed() && GenericDatabaseProvider.HasSqlObservers()) {
|
|
500
|
+
GenericDatabaseProvider.NotifySqlObservers({
|
|
501
|
+
ts: Date.now(),
|
|
502
|
+
sql: pgQuery,
|
|
503
|
+
parameterSummaries: SummarizeSqlParameters(parameters),
|
|
504
|
+
durationMs: performance.now() - startTime,
|
|
505
|
+
rowCount: result.rows?.length ?? 0,
|
|
506
|
+
isMutation: false,
|
|
507
|
+
description: 'ExecuteSQLWithPool(PG)',
|
|
508
|
+
diagnosticContext: GetDiagnosticContext(),
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
return result.rows;
|
|
512
|
+
}
|
|
513
|
+
catch (err) {
|
|
514
|
+
if (!IsDiagnosticCaptureSuppressed() && GenericDatabaseProvider.HasSqlObservers()) {
|
|
515
|
+
GenericDatabaseProvider.NotifySqlObservers({
|
|
516
|
+
ts: Date.now(),
|
|
517
|
+
sql: pgQuery,
|
|
518
|
+
parameterSummaries: SummarizeSqlParameters(parameters),
|
|
519
|
+
durationMs: performance.now() - startTime,
|
|
520
|
+
rowCount: 0,
|
|
521
|
+
isMutation: false,
|
|
522
|
+
errorMessage: err instanceof Error ? err.message : String(err),
|
|
523
|
+
description: 'ExecuteSQLWithPool(PG)',
|
|
524
|
+
diagnosticContext: GetDiagnosticContext(),
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
throw err;
|
|
528
|
+
}
|
|
491
529
|
}
|
|
492
530
|
return origExecuteSQLWithPool.call(this, pool, query, parameters, contextUser);
|
|
493
531
|
};
|
|
@@ -512,7 +550,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
512
550
|
await codegenTestClient.query('SELECT 1');
|
|
513
551
|
codegenTestClient.release();
|
|
514
552
|
const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
|
|
515
|
-
|
|
553
|
+
// Adopt the already-loaded global Metadata.Provider catalog (ignoreExistingMetadata = false)
|
|
554
|
+
// so boot does not pay a second full metadata load. The refresh interval stays non-zero on
|
|
555
|
+
// PostgreSQL on purpose: PostgreSQLDataProvider.AllowRefresh is `CheckRefreshIntervalSeconds > 0`,
|
|
556
|
+
// so an interval of 0 would make every later codegenPgProvider.Refresh() — the one RSU CodeGen
|
|
557
|
+
// issues after DDL — return without reloading, leaving this provider frozen at the boot catalog.
|
|
558
|
+
// (SQL Server's AllowRefresh is independent of the interval, so its codegen provider can use 0.)
|
|
559
|
+
const codegenPgConfigData = new PostgreSQLProviderConfigData(codegenPgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000, // ms → seconds
|
|
560
|
+
undefined, undefined, false);
|
|
516
561
|
const codegenPgProvider = new PostgreSQLDataProvider();
|
|
517
562
|
await codegenPgProvider.Config(codegenPgConfigData); // separate pool (per-instance manager); does NOT touch the global API provider
|
|
518
563
|
RuntimeSchemaManager.Instance.SetDDLProvider(codegenPgProvider);
|
|
@@ -642,8 +687,11 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
642
687
|
});
|
|
643
688
|
await codegenPool.connect();
|
|
644
689
|
const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
|
|
645
|
-
//
|
|
646
|
-
|
|
690
|
+
// Adopt the already-loaded global Metadata.Provider catalog (ignoreExistingMetadata = false)
|
|
691
|
+
// and disable a duplicate background refresh timer (0): avoids a second full metadata load
|
|
692
|
+
// on boot while explicit codegenProvider.Refresh() after DDL still reloads from the DB
|
|
693
|
+
// (SQLServerDataProvider.AllowRefresh does not depend on the interval; PostgreSQL's does — see above).
|
|
694
|
+
const codegenConfig = new SQLServerProviderConfigData(codegenPool, mj_core_schema, 0, undefined, undefined, false);
|
|
647
695
|
const codegenProvider = new SQLServerDataProvider();
|
|
648
696
|
await codegenProvider.Config(codegenConfig);
|
|
649
697
|
RuntimeSchemaManager.Instance.SetDDLProvider(codegenProvider);
|
|
@@ -801,8 +849,9 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
801
849
|
}
|
|
802
850
|
}
|
|
803
851
|
// Initialize all middleware
|
|
852
|
+
const middlewareContext = { ApiRoute: (subpath, options) => ApiRoute(subpath, options) };
|
|
804
853
|
for (const mw of middlewares) {
|
|
805
|
-
await mw.Initialize();
|
|
854
|
+
await mw.Initialize(middlewareContext);
|
|
806
855
|
startupLog.LogIf('verbose', ` [Middleware] ${mw.Label}`);
|
|
807
856
|
}
|
|
808
857
|
// Collect middleware contributions for each pipeline stage
|
|
@@ -821,7 +870,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
821
870
|
mwResolverPaths.push(...mw.GetResolverPaths());
|
|
822
871
|
// Express app configuration escape hatch
|
|
823
872
|
if (mw.ConfigureExpressApp) {
|
|
824
|
-
await mw.ConfigureExpressApp(app);
|
|
873
|
+
await mw.ConfigureExpressApp(app, middlewareContext);
|
|
825
874
|
}
|
|
826
875
|
// Extract hook methods and register in the global hook store
|
|
827
876
|
// (ProviderBase/BaseEntity will read these via GetDataHooks())
|
|
@@ -829,6 +878,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
829
878
|
RegisterDataHook('PostRunView', mw.PostRunView.bind(mw));
|
|
830
879
|
RegisterDataHook('PreSave', mw.PreSave.bind(mw));
|
|
831
880
|
}
|
|
881
|
+
EnsureAnchoredConversationReadHookRegistered();
|
|
832
882
|
// ─── Resolve middleware-contributed resolver paths and merge into resolvers ───
|
|
833
883
|
let allResolvers = resolvers;
|
|
834
884
|
if (mwResolverPaths.length > 0) {
|
|
@@ -1086,6 +1136,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1086
1136
|
},
|
|
1087
1137
|
// context() now just reads the already-validated payload — no I/O, no logging
|
|
1088
1138
|
context: async (ctx) => {
|
|
1139
|
+
// No RequestOrigin here: the upgrade request's Origin is not carried onto subscription contexts.
|
|
1089
1140
|
return { userPayload: ctx.extra.userPayload };
|
|
1090
1141
|
},
|
|
1091
1142
|
onClose: (ctx) => {
|
|
@@ -1144,6 +1195,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1144
1195
|
// ─── Server extensions loader & shared service registry ───────────────────
|
|
1145
1196
|
const extensionLoader = new ServerExtensionLoader();
|
|
1146
1197
|
_currentExtensionLoader = extensionLoader;
|
|
1198
|
+
const hostRuntimeService = {
|
|
1199
|
+
CreateIsolatedProvider,
|
|
1200
|
+
GetSystemUser: () => getSystemUser(),
|
|
1201
|
+
ResolvePrincipal: (configuredEmailOrId, subsystemLabel) => ResolveConfiguredPrincipal(configuredEmailOrId, subsystemLabel),
|
|
1202
|
+
};
|
|
1203
|
+
extensionLoader.Services.RegisterService(SERVER_EXTENSION_CORE_SERVICE_KEYS.HostRuntime, hostRuntimeService);
|
|
1204
|
+
if (coreAuthenticatedRouters.MagicLinkService) {
|
|
1205
|
+
extensionLoader.Services.RegisterService(SERVER_EXTENSION_CORE_SERVICE_KEYS.MagicLink, coreAuthenticatedRouters.MagicLinkService);
|
|
1206
|
+
}
|
|
1147
1207
|
// Open App packages publish their extensions; host mj.config.cjs overlays by DriverClass
|
|
1148
1208
|
// Backwards-compatibility shim: synthesize ServerExtensionConfig entries from legacy configInfo.telephony
|
|
1149
1209
|
const telephonyExtensionConfigs = [];
|
|
@@ -1246,6 +1306,11 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1246
1306
|
MountExtensionHealthRoute(app, extensionLoader);
|
|
1247
1307
|
MountAuthCatalogRoute(app, startupLog);
|
|
1248
1308
|
// ─── Unified auth middleware (replaces both REST authMiddleware and contextFunction auth) ─────
|
|
1309
|
+
// Always shown, whatever the log level: a configured map makes logins run as other people's records
|
|
1310
|
+
const userEmailMapWarning = DescribeUserEmailMap(userEmailMap);
|
|
1311
|
+
if (userEmailMapWarning) {
|
|
1312
|
+
console.warn(userEmailMapWarning);
|
|
1313
|
+
}
|
|
1249
1314
|
app.use(CreateUnifiedAuthMiddleware(dataSources));
|
|
1250
1315
|
// ─── Post-auth middleware from BaseServerMiddleware plugins ─────
|
|
1251
1316
|
// Middleware here has access to the authenticated user via req.userPayload.
|
|
@@ -1324,7 +1389,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1324
1389
|
setupRESTEndpoints(app, restApiConfig);
|
|
1325
1390
|
// ─── GraphQL middleware (contextFunction reads req.userPayload, no re-auth) ─────
|
|
1326
1391
|
app.use(graphqlRootPath, cors({
|
|
1327
|
-
exposedHeaders: ['X-MJ-Cache-Seq', 'X-MJ-Server-ID'],
|
|
1392
|
+
exposedHeaders: ['X-MJ-Cache-Seq', 'X-MJ-Server-ID', 'X-MJ-Trace-ID', 'X-MJ-Diagnostic-Trigger'],
|
|
1328
1393
|
}), BodyParser.json({ limit: '50mb' }),
|
|
1329
1394
|
// Express 5 leaves req.body as undefined for non-JSON or empty bodies;
|
|
1330
1395
|
// Apollo Server's expressMiddleware requires req.body to be defined.
|
|
@@ -1361,6 +1426,10 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1361
1426
|
if (!runBackgroundWorkers) {
|
|
1362
1427
|
LogStatus(`[ServerRole] Running in '${serverRole}' mode — background worker services are disabled on this replica.`);
|
|
1363
1428
|
}
|
|
1429
|
+
// Every role runs agents, so every role's watchdog takes the configured intervals (before any run starts).
|
|
1430
|
+
AgentRunWatchdog.Instance.Configure(configInfo.agentRunWatchdog);
|
|
1431
|
+
// The handoff offer registry starts its own expiry sweep when it loads, on every role; apply the host's setting.
|
|
1432
|
+
ApplyHandoffOfferExpirySettings(configInfo.agentSessions.handoffOfferExpiry);
|
|
1364
1433
|
// Close out run artifacts a dead process left open, BEFORE anything below can start a new run.
|
|
1365
1434
|
//
|
|
1366
1435
|
// A killed process (OOM killer, SIGKILL, host reboot) never writes its run's terminal result, so
|
|
@@ -1370,7 +1439,13 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1370
1439
|
// to a process that no longer exists. That is why it runs here, ahead of the scheduler, the
|
|
1371
1440
|
// integration sync worker (its Start() polls immediately), the HTTP listener (a request can
|
|
1372
1441
|
// start a discovery) and pending RSU work, and why it is awaited. It needs none of them.
|
|
1373
|
-
|
|
1442
|
+
//
|
|
1443
|
+
// One exception: an RSU run killed inside its own RestartMJAPI step is not dead — THIS process is
|
|
1444
|
+
// its continuation, and processRSUPendingWork below re-attaches to it. Those are left in flight
|
|
1445
|
+
// (and named in `Skipped`); whichever of them nothing re-attaches to is closed out afterwards by
|
|
1446
|
+
// RSUPostRestartProgressSession.SweepUnattached. On a replica that runs no background workers
|
|
1447
|
+
// nothing would ever resume them, so there they are swept like any other.
|
|
1448
|
+
const bootSweep = await SweepInterruptedRuns(undefined, msg => console.warn(msg), runBackgroundWorkers ? RSUPostRestartProgressSession.WasKilledAtRestart : undefined);
|
|
1374
1449
|
// Initialize and start scheduled jobs service if enabled
|
|
1375
1450
|
let scheduledJobsService = null;
|
|
1376
1451
|
if (runBackgroundWorkers && configInfo.scheduledJobs?.enabled) {
|
|
@@ -1424,7 +1499,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1424
1499
|
const resumeUser = UserCache.Instance.GetSystemUser();
|
|
1425
1500
|
if (runBackgroundWorkers) {
|
|
1426
1501
|
// Process pending RSU work from pre-restart (entity maps, field maps, sync)
|
|
1427
|
-
processRSUPendingWork().catch(err => console.warn(`RSU pending work processing failed: ${err}`))
|
|
1502
|
+
processRSUPendingWork().catch(err => console.warn(`RSU pending work processing failed: ${err}`))
|
|
1503
|
+
.finally(() => RSUPostRestartProgressSession.SweepUnattached(bootSweep.Skipped, undefined, msg => console.warn(msg)).catch(err => console.warn(`RSU leftover run sweep failed: ${err}`)));
|
|
1428
1504
|
// Resume any integration syncs that were orphaned by the previous process restart
|
|
1429
1505
|
if (resumeUser) {
|
|
1430
1506
|
IntegrationEngine.Instance.ResumeOrphanedSyncs(resumeUser)
|
|
@@ -1437,32 +1513,26 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1437
1513
|
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1438
1514
|
const sweepUser = resumeUser;
|
|
1439
1515
|
const sweepProvider = Metadata.Provider; // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1440
|
-
AgentRunWatchdog.SweepOrphanedRuns(sweepProvider, sweepUser)
|
|
1516
|
+
AgentRunWatchdog.SweepOrphanedRuns(sweepProvider, sweepUser, configInfo.agentRunWatchdog)
|
|
1441
1517
|
.catch(err => console.warn(`[AgentRunWatchdog] Startup sweep failed: ${err}`));
|
|
1442
1518
|
// The watchdog repairs the RUN; nothing repaired the conversation detail, which is the row the
|
|
1443
1519
|
// chat actually renders from (MJ #4222). A process that dies mid-run leaves a terminal run
|
|
1444
1520
|
// beside a message that still claims to be generating, and it spins forever for anyone who
|
|
1445
|
-
// opens it. Runs at boot (closes restart orphans) and
|
|
1446
|
-
// mirroring the watchdog's own two-phase shape.
|
|
1447
|
-
|
|
1448
|
-
.catch(err => console.warn(`[OrphanDetailReconciler] Pass failed: ${err}`));
|
|
1449
|
-
void reconcileOrphans();
|
|
1450
|
-
const orphanDetailTimer = setInterval(() => void reconcileOrphans(), ORPHAN_DETAIL_SWEEP_INTERVAL_MS);
|
|
1451
|
-
ShutdownRegistry.Instance.Register({
|
|
1452
|
-
ShutdownName: 'OrphanDetailReconciler',
|
|
1453
|
-
Shutdown: () => { clearInterval(orphanDetailTimer); },
|
|
1454
|
-
});
|
|
1521
|
+
// opens it. Runs at boot (closes restart orphans) and, unless `conversationDetailReconciler.enabled`
|
|
1522
|
+
// is false, on a timer (closes mid-life orphans), mirroring the watchdog's own two-phase shape.
|
|
1523
|
+
StartOrphanedConversationDetailReconciler(sweepProvider, sweepUser, configInfo.conversationDetailReconciler);
|
|
1455
1524
|
}
|
|
1456
1525
|
// Launch the AI Agent Session janitor: run own-host orphan recovery once at boot, then a periodic tick
|
|
1457
1526
|
// that closes stale and over-deadline sessions and rebuilds lost realtime recordings from their
|
|
1458
1527
|
// crash-recovery shards (storage reads and writes). Self-registers with ShutdownRegistry, so its timer
|
|
1459
1528
|
// is cleared by the gracefulShutdown drain below (no explicit Stop() wiring needed here).
|
|
1460
1529
|
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — boot-time session janitor uses the server's own provider
|
|
1461
|
-
|
|
1530
|
+
// `agentSessions.janitor.enabled: false` keeps the boot recovery and shutdown drain but schedules no tick.
|
|
1531
|
+
SessionJanitor.Instance.StartWithSettings(configInfo.agentSessions.janitor, Metadata.Provider, resumeUser) // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1462
1532
|
.catch(err => console.warn(`[SessionJanitor] Startup failed: ${err}`));
|
|
1463
1533
|
// The bridge engine's orphan reconcile likewise starts only now that this process holds its port, so it can't
|
|
1464
1534
|
// take the live bridges of another MJAPI still serving that port for its own orphans (#5310).
|
|
1465
|
-
StartBridgeOrphanReconciliation(Metadata.Provider, resumeUser); // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1535
|
+
StartBridgeOrphanReconciliation(Metadata.Provider, resumeUser, configInfo.agentSessions.bridgeReconciler); // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1466
1536
|
}
|
|
1467
1537
|
}
|
|
1468
1538
|
// Launch the durable task-graph dispatcher: claim Pending tasks, execute them with a fresh
|
|
@@ -1644,9 +1714,17 @@ async function processRSUPendingWork() {
|
|
|
1644
1714
|
console.log(`[RSU] Processing ${pendingItems.length} pending work item(s) from pre-restart...`);
|
|
1645
1715
|
// Wait a moment for metadata to be fully loaded
|
|
1646
1716
|
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
1717
|
+
// The RSU run these items belong to is still open: the pre-restart process was killed inside its
|
|
1718
|
+
// own RestartMJAPI step, so it never wrote a terminal result. This session re-attaches to that run
|
|
1719
|
+
// and reports the two steps that only ever happen here — CreateEntityMaps and StartSync — into the
|
|
1720
|
+
// SAME event stream, so a client that has been tailing since before the restart keeps its cursor
|
|
1721
|
+
// and finally learns whether the connector went live. Purely observational: every failure below is
|
|
1722
|
+
// swallowed, and the work proceeds whether or not a run was found to report into.
|
|
1723
|
+
const progressSession = new RSUPostRestartProgressSession();
|
|
1647
1724
|
for (const pending of pendingItems) {
|
|
1648
1725
|
const pendingWorkID = pending.ID;
|
|
1649
1726
|
const item = pending.Work;
|
|
1727
|
+
let progress = null;
|
|
1650
1728
|
// Declared outside the try so the catch can narrow a retry to what is still outstanding: what
|
|
1651
1729
|
// actually got mapped this attempt. Each retry is then strictly smaller, and one poison object
|
|
1652
1730
|
// cannot keep re-running its healthy siblings.
|
|
@@ -1665,6 +1743,9 @@ async function processRSUPendingWork() {
|
|
|
1665
1743
|
await ProcessPromoteColumnsPendingWork(item, pendingWorkID, rsm, systemUser);
|
|
1666
1744
|
continue;
|
|
1667
1745
|
}
|
|
1746
|
+
// Attached only for apply-objects work: promote-columns is a follow-up to a DIFFERENT run
|
|
1747
|
+
// shape that has no CreateEntityMaps/StartSync steps to report.
|
|
1748
|
+
progress = await progressSession.For(item.CompanyIntegrationID);
|
|
1668
1749
|
// Resolve connector
|
|
1669
1750
|
const rv = new RunView();
|
|
1670
1751
|
const ciResult = await rv.RunView({
|
|
@@ -1674,8 +1755,10 @@ async function processRSUPendingWork() {
|
|
|
1674
1755
|
}, systemUser);
|
|
1675
1756
|
const companyIntegration = ciResult.Results[0];
|
|
1676
1757
|
if (!companyIntegration) {
|
|
1677
|
-
|
|
1678
|
-
|
|
1758
|
+
const missingCI = `CompanyIntegration ${item.CompanyIntegrationID} not found`;
|
|
1759
|
+
progress?.FailEntityMaps(missingCI, item.SourceObjectNames ?? []);
|
|
1760
|
+
await rsm.FailPendingWork(pendingWorkID, missingCI, systemUser);
|
|
1761
|
+
console.warn(`[RSU] ${missingCI}`);
|
|
1679
1762
|
continue;
|
|
1680
1763
|
}
|
|
1681
1764
|
const integrationName = companyIntegration.Integration;
|
|
@@ -1686,23 +1769,39 @@ async function processRSUPendingWork() {
|
|
|
1686
1769
|
}, systemUser);
|
|
1687
1770
|
const integrationEntity = integrationResult.Results[0];
|
|
1688
1771
|
if (!integrationEntity) {
|
|
1689
|
-
|
|
1690
|
-
|
|
1772
|
+
const missingIntegration = `Integration entity for ${integrationName} not found`;
|
|
1773
|
+
progress?.FailEntityMaps(missingIntegration, item.SourceObjectNames ?? []);
|
|
1774
|
+
await rsm.FailPendingWork(pendingWorkID, missingIntegration, systemUser);
|
|
1775
|
+
console.warn(`[RSU] ${missingIntegration}`);
|
|
1691
1776
|
continue;
|
|
1692
1777
|
}
|
|
1693
1778
|
const connector = ConnectorFactory.Resolve(integrationEntity);
|
|
1694
1779
|
if (!connector) {
|
|
1695
|
-
|
|
1696
|
-
|
|
1780
|
+
const missingConnector = `Connector for ${integrationName} not found`;
|
|
1781
|
+
progress?.FailEntityMaps(missingConnector, item.SourceObjectNames ?? []);
|
|
1782
|
+
await rsm.FailPendingWork(pendingWorkID, missingConnector, systemUser);
|
|
1783
|
+
console.warn(`[RSU] ${missingConnector}`);
|
|
1697
1784
|
continue;
|
|
1698
1785
|
}
|
|
1699
1786
|
// Create entity maps + field maps for each source object
|
|
1700
1787
|
const createdEntityMapIDs = [];
|
|
1701
1788
|
const rvPending = new RunView();
|
|
1702
1789
|
const sourceObjectFields = item.SourceObjectFields ?? {};
|
|
1703
|
-
// Introspect schema ONCE for the entire connector, then reuse per object
|
|
1790
|
+
// Introspect schema ONCE for the entire connector, then reuse per object.
|
|
1791
|
+
//
|
|
1792
|
+
// IN THE CONNECTION'S CATALOG SCOPE. This runs at process start, outside any request, so
|
|
1793
|
+
// nothing upstream has entered a scope for it — and an unscoped catalog read falls back to
|
|
1794
|
+
// the SHARED catalog by design. That would build these field maps from the connector's
|
|
1795
|
+
// declared fields alone: every column this connection's own discovery sampled would get a
|
|
1796
|
+
// table column from the RSU (built in scope, from the per-connection rows) but no field map,
|
|
1797
|
+
// and its values would land in the overflow JSON instead of the column. Observed on the
|
|
1798
|
+
// sandbox 2026-09-11: 487 declared fields, 556 per-connection — 69 columns that this read
|
|
1799
|
+
// would have silently left unmapped. Entering the scope is not enough on a fresh process:
|
|
1800
|
+
// IntrospectInCatalogScope loads the catalog and warms each object's fields first.
|
|
1704
1801
|
const introspect = connector.IntrospectSchema.bind(connector);
|
|
1705
|
-
const schema = await introspect(companyIntegration, systemUser);
|
|
1802
|
+
const schema = await IntrospectInCatalogScope(item.CompanyIntegrationID, item.SourceObjectNames, () => introspect(companyIntegration, systemUser), systemUser);
|
|
1803
|
+
const objectsToMap = item.SourceObjectNames.length;
|
|
1804
|
+
progress?.BeginEntityMaps(objectsToMap);
|
|
1706
1805
|
for (const objName of item.SourceObjectNames) {
|
|
1707
1806
|
const tableName = objName.replace(/[^A-Za-z0-9_]/g, '_').toLowerCase();
|
|
1708
1807
|
const entity = md.Entities.find(e => e.SchemaName.toLowerCase() === item.SchemaName.toLowerCase() &&
|
|
@@ -1797,7 +1896,12 @@ async function processRSUPendingWork() {
|
|
|
1797
1896
|
catch (fieldErr) {
|
|
1798
1897
|
console.warn(`[RSU] Field map creation failed for ${objName}: ${fieldErr}`);
|
|
1799
1898
|
}
|
|
1899
|
+
progress?.ObjectMapped(objName, mappedObjectNames.size, objectsToMap);
|
|
1800
1900
|
}
|
|
1901
|
+
// The applied rollup for this half of the run, in OBJECTS. `mappedObjectNames` is the same set
|
|
1902
|
+
// the retry path narrows against, so what is reported succeeded here is exactly what a retry
|
|
1903
|
+
// would NOT redo.
|
|
1904
|
+
progress?.CompleteEntityMaps(objectsToMap, mappedObjectNames.size, objectsToMap - mappedObjectNames.size);
|
|
1801
1905
|
// Remove-as-disable: entity maps whose object is NOT in this apply's selection
|
|
1802
1906
|
// are disabled (data kept; re-selection re-enables). 'ignore' opts out for subset applies.
|
|
1803
1907
|
if ((item.UnselectedAction ?? 'disable') !== 'ignore') {
|
|
@@ -1812,8 +1916,11 @@ async function processRSUPendingWork() {
|
|
|
1812
1916
|
console.warn(`[RSU] Unselected-map disable failed: ${disableErr}`);
|
|
1813
1917
|
}
|
|
1814
1918
|
}
|
|
1815
|
-
// Start sync if requested
|
|
1919
|
+
// Start sync if requested. This is the step the setup journey is actually waiting on — the
|
|
1920
|
+
// connector is not live until it begins — so it is a stage of its own rather than a footnote
|
|
1921
|
+
// on entity-map creation.
|
|
1816
1922
|
if (item.StartSync !== false) {
|
|
1923
|
+
progress?.BeginStartSync();
|
|
1817
1924
|
try {
|
|
1818
1925
|
await IntegrationEngine.Instance.Config(false, systemUser);
|
|
1819
1926
|
const syncOptions = {};
|
|
@@ -1826,13 +1933,20 @@ async function processRSUPendingWork() {
|
|
|
1826
1933
|
const opts = Object.keys(syncOptions).length > 0 ? syncOptions : undefined;
|
|
1827
1934
|
IntegrationEngine.Instance.RunSync(item.CompanyIntegrationID, systemUser, 'Manual', undefined, undefined, opts);
|
|
1828
1935
|
console.log(`[RSU] Sync started for ${item.CompanyIntegrationID} (EntityMaps: ${createdEntityMapIDs.length}, FullSync: ${!!item.FullSync}, SyncDirection: ${item.SyncDirection ?? 'entity-map default'})`);
|
|
1936
|
+
// Looked up rather than returned: RunSync resolves only when the whole sync finishes, and
|
|
1937
|
+
// this stage closes when the sync STARTS. A null id closes the stage anyway — the sync did
|
|
1938
|
+
// start; only the hand-off to its own stream is missing.
|
|
1939
|
+
progress?.CompleteStartSync(await FindStartedSyncRunID(item.CompanyIntegrationID, systemUser));
|
|
1829
1940
|
}
|
|
1830
1941
|
catch (syncErr) {
|
|
1831
1942
|
console.warn(`[RSU] Sync start failed: ${syncErr}`);
|
|
1943
|
+
progress?.FailStartSync(`Sync start failed: ${syncErr instanceof Error ? syncErr.message : String(syncErr)}`);
|
|
1832
1944
|
}
|
|
1833
1945
|
}
|
|
1834
1946
|
else {
|
|
1835
1947
|
console.log(`[RSU] Sync skipped for ${item.CompanyIntegrationID} (StartSync=false)`);
|
|
1948
|
+
progress?.BeginStartSync();
|
|
1949
|
+
progress?.SkipStartSync('the caller asked for no initial sync (StartSync=false)');
|
|
1836
1950
|
}
|
|
1837
1951
|
// Create or update schedule if CronExpression provided
|
|
1838
1952
|
if (item.CronExpression) {
|
|
@@ -1868,6 +1982,7 @@ async function processRSUPendingWork() {
|
|
|
1868
1982
|
EntityName: 'MJ: Scheduled Job Types',
|
|
1869
1983
|
ExtraFilter: `DriverClass='IntegrationSyncScheduledJobDriver'`,
|
|
1870
1984
|
MaxRows: 1,
|
|
1985
|
+
SkipTotalRowCount: true,
|
|
1871
1986
|
ResultType: 'simple',
|
|
1872
1987
|
Fields: ['ID']
|
|
1873
1988
|
}, systemUser);
|
|
@@ -1916,6 +2031,16 @@ async function processRSUPendingWork() {
|
|
|
1916
2031
|
// Failing terminally on the first error means the objects this item would have mapped are
|
|
1917
2032
|
// silently never mapped, and the only recovery is someone noticing and re-applying by hand.
|
|
1918
2033
|
const remaining = (item.SourceObjectNames ?? []).filter(n => !mappedObjectNames.has(n));
|
|
2034
|
+
// Same list the retry narrows to, reported into the run stream: when this half fails, those
|
|
2035
|
+
// objects have tables and no way to sync into them, and this is the client's only signal.
|
|
2036
|
+
//
|
|
2037
|
+
// Reported under CreateEntityMaps because that is where the overwhelming majority of this
|
|
2038
|
+
// block's work — and so its failures — lives. A throw from further down (schedule creation,
|
|
2039
|
+
// say) lands here too, with an empty `remaining`; the stage attribution is then approximate
|
|
2040
|
+
// but the message is the real error and the run is correctly marked failed, which is what the
|
|
2041
|
+
// operator needs. The alternative — inventing a stage that is not in the pipeline's step list
|
|
2042
|
+
// — would break the determinate stepper for the sake of a nicer label.
|
|
2043
|
+
progress?.FailEntityMaps(message, remaining);
|
|
1919
2044
|
const requeued = await rsm.RetryPendingWork(pendingWorkID, item, remaining, systemUser);
|
|
1920
2045
|
if (!requeued) {
|
|
1921
2046
|
// Budget spent, or nothing left to retry. This message is the operator's only signal, so
|
|
@@ -1925,8 +2050,40 @@ async function processRSUPendingWork() {
|
|
|
1925
2050
|
}
|
|
1926
2051
|
}
|
|
1927
2052
|
}
|
|
2053
|
+
// Terminates every RSU run this pass re-attached to. Until this lands, those runs have been
|
|
2054
|
+
// flagged in-flight since before the restart — which is exactly the state this whole mechanism
|
|
2055
|
+
// exists to end.
|
|
2056
|
+
await progressSession.FinishAll();
|
|
1928
2057
|
console.log(`[RSU] Pending work processing complete`);
|
|
1929
2058
|
}
|
|
2059
|
+
/**
|
|
2060
|
+
* The ID of the sync run a just-launched sync created, or null if it is not readable yet.
|
|
2061
|
+
*
|
|
2062
|
+
* `RunSync` resolves only when the entire sync FINISHES, so it cannot be awaited for this — the
|
|
2063
|
+
* StartSync stage closes when the sync begins, not when it ends. The run row is written early in
|
|
2064
|
+
* the sync's own startup, so a short settle plus a newest-first lookup finds it. Null is a normal
|
|
2065
|
+
* outcome under load and is reported as such; it never fails anything.
|
|
2066
|
+
*/
|
|
2067
|
+
async function FindStartedSyncRunID(companyIntegrationID, systemUser) {
|
|
2068
|
+
try {
|
|
2069
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
2070
|
+
const rv = new RunView();
|
|
2071
|
+
const runResult = await rv.RunView({
|
|
2072
|
+
EntityName: 'MJ: Company Integration Runs',
|
|
2073
|
+
ExtraFilter: `CompanyIntegrationID='${companyIntegrationID.replace(/'/g, "''")}' AND Status='In Progress'`,
|
|
2074
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
2075
|
+
MaxRows: 1,
|
|
2076
|
+
SkipTotalRowCount: true,
|
|
2077
|
+
ResultType: 'simple',
|
|
2078
|
+
Fields: ['ID'],
|
|
2079
|
+
}, systemUser);
|
|
2080
|
+
return runResult.Success && runResult.Results.length > 0 ? runResult.Results[0].ID : null;
|
|
2081
|
+
}
|
|
2082
|
+
catch (e) {
|
|
2083
|
+
console.warn(`[RSU] Could not resolve the started sync run id for ${companyIntegrationID}: ${e}`);
|
|
2084
|
+
return null;
|
|
2085
|
+
}
|
|
2086
|
+
}
|
|
1930
2087
|
/**
|
|
1931
2088
|
* Creates a MSSQL ConnectionPool-compatible wrapper around a pg.Pool.
|
|
1932
2089
|
* This allows existing code that references DataSourceInfo.dataSource (typed as sql.ConnectionPool)
|
|
@@ -1979,7 +2136,7 @@ function mountRealtimeRecordingRoutes(app) {
|
|
|
1979
2136
|
return user ? { ContextUser: user, Provider: provider } : null;
|
|
1980
2137
|
},
|
|
1981
2138
|
LoadOwnedSession: LoadOwnedRealtimeSession,
|
|
1982
|
-
|
|
2139
|
+
AuthorizeSession: AuthorizeLoadedSession,
|
|
1983
2140
|
CreateLedger: (ledgerProvider, contextUser) => new SqlRealtimeRecordingLedger(ledgerProvider, contextUser),
|
|
1984
2141
|
Scheduler: RecordingAssemblyScheduler.Instance,
|
|
1985
2142
|
GraceMs: graceMs,
|
|
@@ -1994,4 +2151,5 @@ function mountRealtimeRecordingRoutes(app) {
|
|
|
1994
2151
|
export { BuildSessionClaims, MagicLinkKeyManager, MagicLinkService, HashToken, GenerateRawToken } from './auth/magicLink/index.js';
|
|
1995
2152
|
export { VerifyHostAssertion } from './realtimeWidget/host-identity.js';
|
|
1996
2153
|
export { IsScopeLimitedPrincipal } from './auth/scopeLimitedPrincipal.js';
|
|
2154
|
+
export const GetServerStartupSummary = () => StartupLogger.GetLastStartupSnapshot();
|
|
1997
2155
|
//# sourceMappingURL=index.js.map
|