@memberjunction/server 6.2.0-edge.0 → 6.2.0-edge.2
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/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.d.ts +2 -0
- package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.js +5 -1
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionManager.js +2 -2
- package/dist/agentSessions/remoteBrowserGoalEngine.d.ts +8 -0
- package/dist/agentSessions/remoteBrowserGoalEngine.d.ts.map +1 -1
- package/dist/agentSessions/remoteBrowserGoalEngine.js +21 -5
- package/dist/agentSessions/remoteBrowserGoalEngine.js.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.d.ts +2 -0
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +5 -1
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/index.d.ts +20 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +20 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +8 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +21 -5
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts +9 -0
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +22 -10
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +65 -51
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/index.d.ts +2 -2
- package/dist/auth/magicLink/index.d.ts.map +1 -1
- package/dist/auth/magicLink/index.js +2 -2
- package/dist/auth/magicLink/index.js.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.d.ts +54 -33
- package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.js +61 -61
- package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
- package/dist/auth/magicLink/redeemLanding.d.ts +4 -0
- package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
- package/dist/auth/magicLink/redeemLanding.js +12 -4
- package/dist/auth/magicLink/redeemLanding.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +4 -4
- package/dist/auth/principals.d.ts +2 -0
- package/dist/auth/principals.d.ts.map +1 -1
- package/dist/auth/principals.js +6 -2
- package/dist/auth/principals.js.map +1 -1
- package/dist/cache.d.ts +2 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +3 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +346 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +20 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -19
- package/dist/context.js.map +1 -1
- package/dist/directives/Public.d.ts +2 -0
- package/dist/directives/Public.d.ts.map +1 -1
- package/dist/directives/Public.js +3 -1
- package/dist/directives/Public.js.map +1 -1
- package/dist/directives/RequireSystemUser.d.ts +2 -0
- package/dist/directives/RequireSystemUser.d.ts.map +1 -1
- package/dist/directives/RequireSystemUser.js +3 -1
- package/dist/directives/RequireSystemUser.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +1021 -0
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +7368 -2145
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +94 -4
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +122 -3
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/DeleteOptionsInput.d.ts +8 -1
- package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
- package/dist/generic/DeleteOptionsInput.js +1 -1
- package/dist/generic/DeleteOptionsInput.js.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts +18 -2
- package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.js +24 -6
- package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +31 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js +215 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -0
- package/dist/generic/PushStatusResolver.d.ts +48 -1
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +95 -4
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +18 -2
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +64 -55
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -11
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts +2 -0
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +5 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/integration/EntityMapLifecycle.d.ts +4 -0
- package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
- package/dist/integration/EntityMapLifecycle.js +10 -2
- package/dist/integration/EntityMapLifecycle.js.map +1 -1
- package/dist/logging/NoLog.d.ts +4 -0
- package/dist/logging/NoLog.d.ts.map +1 -1
- package/dist/logging/NoLog.js +10 -2
- package/dist/logging/NoLog.js.map +1 -1
- package/dist/logging/StartupLogger.d.ts +2 -0
- package/dist/logging/StartupLogger.d.ts.map +1 -1
- package/dist/logging/StartupLogger.js +5 -1
- package/dist/logging/StartupLogger.js.map +1 -1
- package/dist/logging/bootAudit.d.ts +11 -7
- package/dist/logging/bootAudit.d.ts.map +1 -1
- package/dist/logging/bootAudit.js +15 -7
- package/dist/logging/bootAudit.js.map +1 -1
- package/dist/logging/boundaryLogPayload.d.ts +4 -0
- package/dist/logging/boundaryLogPayload.d.ts.map +1 -1
- package/dist/logging/boundaryLogPayload.js +5 -1
- package/dist/logging/boundaryLogPayload.js.map +1 -1
- package/dist/logging/secretRedactor.d.ts +2 -0
- package/dist/logging/secretRedactor.d.ts.map +1 -1
- package/dist/logging/secretRedactor.js +8 -4
- package/dist/logging/secretRedactor.js.map +1 -1
- package/dist/logging/shortenForLog.d.ts +2 -0
- package/dist/logging/shortenForLog.d.ts.map +1 -1
- package/dist/logging/shortenForLog.js +7 -3
- package/dist/logging/shortenForLog.js.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.d.ts +2 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +8 -6
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/metadataRefreshSignal.d.ts +19 -0
- package/dist/metadataRefreshSignal.d.ts.map +1 -0
- package/dist/metadataRefreshSignal.js +45 -0
- package/dist/metadataRefreshSignal.js.map +1 -0
- package/dist/middleware/MJTenantFilterMiddleware.js +4 -4
- package/dist/multiTenancy/index.d.ts +8 -0
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +21 -5
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.d.ts +5 -0
- package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.js +14 -10
- package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts +6 -6
- package/dist/realtimeWidget/WidgetSessionService.js +27 -27
- package/dist/realtimeWidget/host-identity.d.ts +5 -1
- package/dist/realtimeWidget/host-identity.d.ts.map +1 -1
- package/dist/realtimeWidget/host-identity.js +11 -3
- package/dist/realtimeWidget/host-identity.js.map +1 -1
- package/dist/realtimeWidget/index.d.ts +2 -2
- package/dist/realtimeWidget/index.d.ts.map +1 -1
- package/dist/realtimeWidget/index.js +2 -2
- package/dist/realtimeWidget/index.js.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.d.ts +21 -1
- package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.js +16 -4
- package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +48 -0
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +38 -10
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +10 -6
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +14 -6
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +3 -3
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +55 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -0
- package/dist/resolvers/AgentRunStatusPublisher.js +141 -0
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +90 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.js +283 -0
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts +98 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js +227 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js.map +1 -0
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +2 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.js +3 -3
- package/dist/resolvers/GeoResolver.d.ts +2 -2
- package/dist/resolvers/GeoResolver.js +4 -4
- package/dist/resolvers/GetDataResolver.d.ts +14 -0
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +43 -15
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +2 -2
- package/dist/resolvers/ListOperationsResolver.d.ts +20 -0
- package/dist/resolvers/ListOperationsResolver.d.ts.map +1 -1
- package/dist/resolvers/ListOperationsResolver.js +68 -28
- package/dist/resolvers/ListOperationsResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts +11 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +7 -3
- package/dist/resolvers/MCPResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +7 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +16 -2
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +3 -3
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +44 -6
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +93 -37
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +5 -5
- package/dist/resolvers/RunAIAgentResolver.d.ts +8 -18
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +85 -184
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +2 -2
- package/dist/resolvers/RunDecisionResolver.d.ts +149 -0
- package/dist/resolvers/RunDecisionResolver.d.ts.map +1 -0
- package/dist/resolvers/RunDecisionResolver.js +396 -0
- package/dist/resolvers/RunDecisionResolver.js.map +1 -0
- package/dist/resolvers/RunTestResolver.js +5 -5
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts +8 -4
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +5 -5
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +8 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.js +6 -2
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.js +14 -10
- package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
- package/dist/resolvers/adhoc-query-helpers.d.ts +6 -0
- package/dist/resolvers/adhoc-query-helpers.d.ts.map +1 -1
- package/dist/resolvers/adhoc-query-helpers.js +10 -2
- package/dist/resolvers/adhoc-query-helpers.js.map +1 -1
- package/dist/resolvers/artifact-routing.d.ts +8 -8
- package/dist/resolvers/artifact-routing.js +2 -2
- package/dist/resolvers/artifact-routing.js.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.d.ts +10 -2
- package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.js +24 -8
- package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
- package/dist/resolvers/peaksSidecar.d.ts +4 -0
- package/dist/resolvers/peaksSidecar.d.ts.map +1 -1
- package/dist/resolvers/peaksSidecar.js +10 -2
- package/dist/resolvers/peaksSidecar.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +28 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +20 -4
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/MediaStreamHandler.d.ts +2 -0
- package/dist/rest/MediaStreamHandler.d.ts.map +1 -1
- package/dist/rest/MediaStreamHandler.js +10 -6
- package/dist/rest/MediaStreamHandler.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts +9 -0
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +15 -3
- package/dist/rest/OAuthCallbackHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts +6 -4
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +15 -11
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeSdpBrokerHandler.d.ts +5 -1
- package/dist/rest/RealtimeSdpBrokerHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeSdpBrokerHandler.js +12 -4
- package/dist/rest/RealtimeSdpBrokerHandler.js.map +1 -1
- package/dist/rest/SignatureWebhookHandler.d.ts +2 -0
- package/dist/rest/SignatureWebhookHandler.d.ts.map +1 -1
- package/dist/rest/SignatureWebhookHandler.js +5 -1
- package/dist/rest/SignatureWebhookHandler.js.map +1 -1
- package/dist/rest/UploadTokenManager.d.ts +24 -8
- package/dist/rest/UploadTokenManager.d.ts.map +1 -1
- package/dist/rest/UploadTokenManager.js +53 -21
- package/dist/rest/UploadTokenManager.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +20 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +20 -4
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/mediaRange.d.ts +4 -0
- package/dist/rest/mediaRange.d.ts.map +1 -1
- package/dist/rest/mediaRange.js +10 -2
- package/dist/rest/mediaRange.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +4 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +13 -7
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverExtensionReservedRoots.d.ts +2 -0
- package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
- package/dist/serverExtensionReservedRoots.js +5 -1
- package/dist/serverExtensionReservedRoots.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +13 -8
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +16 -15
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -3
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +6 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +13 -5
- package/dist/util.js.map +1 -1
- package/package.json +94 -92
- package/src/__tests__/AgentRunStatusPublisher.test.ts +175 -0
- package/src/__tests__/DeleteOptionsInput.wireShape.test.ts +62 -0
- package/src/__tests__/DuplicateEntryCheckResolver.test.ts +300 -0
- package/src/__tests__/FileResolverPeaks.test.ts +13 -13
- package/src/__tests__/ListOperationsResolver.test.ts +17 -17
- package/src/__tests__/MediaStreamHandler.test.ts +28 -28
- package/src/__tests__/NoLog.test.ts +11 -11
- package/src/__tests__/PrimaryKeyAlwaysMapped.test.ts +10 -10
- package/src/__tests__/RESTEndpointHandler.test.ts +14 -14
- package/src/__tests__/RealtimeBridgeResolver.test.ts +4 -2
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
- package/src/__tests__/RealtimeSdpBrokerHandler.test.ts +6 -6
- package/src/__tests__/RefreshAdoptsNewColumns.test.ts +8 -8
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +7 -1
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +7 -1
- package/src/__tests__/RemoteBrowserGoalEngine.test.ts +18 -18
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +7 -1
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +52 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +398 -0
- package/src/__tests__/RunAIAgentResolver.streaming.test.ts +18 -27
- package/src/__tests__/RunDecisionResolver.test.ts +699 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +131 -0
- package/src/__tests__/TaskGraphFrameResolver.test.ts +2 -2
- package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
- package/src/__tests__/WidgetSessionService.test.ts +8 -4
- package/src/__tests__/adhoc-query-helpers.test.ts +21 -21
- package/src/__tests__/bootAudit.test.ts +11 -11
- package/src/__tests__/boundaryLogPayload.test.ts +6 -6
- package/src/__tests__/cacheInvalidationRecordData.test.ts +177 -0
- package/src/__tests__/conversationRunEvents.test.ts +399 -0
- package/src/__tests__/databaseAbstraction.test.ts +12 -6
- package/src/__tests__/getDataTokenRedaction.test.ts +7 -7
- package/src/__tests__/initializeProviders.refresh.test.ts +4 -4
- package/src/__tests__/magicLink.test.ts +73 -134
- package/src/__tests__/magicLinkService.consume.test.ts +224 -0
- package/src/__tests__/meetingRecordingRegistration.test.ts +12 -12
- package/src/__tests__/metadataRefreshSignal.test.ts +78 -0
- package/src/__tests__/multiTenancy.security.test.ts +40 -40
- package/src/__tests__/multiTenancy.test.ts +18 -18
- package/src/__tests__/newUsers.test.ts +24 -23
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +283 -0
- package/src/__tests__/principals.test.ts +22 -22
- package/src/__tests__/pushStatusFanOut.test.ts +206 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +8 -8
- package/src/__tests__/secretRedactor.failOpen.test.ts +12 -12
- package/src/__tests__/secretRedactor.test.ts +12 -12
- package/src/__tests__/serverExtensionReservedRoots.test.ts +7 -7
- package/src/__tests__/subscriptionRedaction.test.ts +5 -5
- package/src/__tests__/unifiedAuth.test.ts +15 -9
- package/src/__tests__/visitorIdentity.resolve.test.ts +6 -6
- package/src/__tests__/widget.test.ts +45 -45
- package/src/__tests__/widgetGuestElevation.test.ts +7 -7
- package/src/__tests__/widgetHostIdentity.test.ts +14 -14
- package/src/agentSessions/ReturningVisitorRecap.ts +12 -1
- package/src/agentSessions/SessionManager.ts +2 -2
- package/src/agentSessions/remoteBrowserGoalEngine.ts +30 -5
- package/src/auth/AuthProviderCatalogRouter.ts +6 -1
- package/src/auth/__tests__/backward-compatibility.test.ts +4 -3
- package/src/auth/index.ts +43 -28
- package/src/auth/initializeProviders.ts +25 -5
- package/src/auth/magicLink/MagicLinkRouter.ts +28 -10
- package/src/auth/magicLink/MagicLinkService.ts +71 -52
- package/src/auth/magicLink/index.ts +7 -7
- package/src/auth/magicLink/magicLinkCore.ts +96 -64
- package/src/auth/magicLink/redeemLanding.ts +14 -4
- package/src/auth/magicLink/types.ts +54 -54
- package/src/auth/newUsers.ts +1 -1
- package/src/auth/principals.ts +11 -2
- package/src/cache.ts +4 -1
- package/src/config.ts +37 -4
- package/src/context.ts +37 -24
- package/src/directives/Public.ts +4 -1
- package/src/directives/RequireSystemUser.ts +4 -1
- package/src/generated/graphql-schemas/__mj.ts +3674 -4
- package/src/generic/CacheInvalidationResolver.ts +148 -4
- package/src/generic/DeleteOptionsInput.ts +9 -2
- package/src/generic/FireAndForgetHeartbeat.ts +35 -16
- package/src/generic/OrphanedConversationDetailReconciler.ts +267 -0
- package/src/generic/PushStatusResolver.ts +118 -8
- package/src/generic/ResolverBase.ts +65 -57
- package/src/generic/RunViewResolver.ts +22 -22
- package/src/generic/__tests__/FireAndForgetHeartbeat.test.ts +7 -7
- package/src/index.ts +137 -11
- package/src/integration/CustomColumnPromoter.ts +6 -1
- package/src/integration/EntityMapLifecycle.ts +20 -2
- package/src/logging/NoLog.ts +16 -2
- package/src/logging/StartupLogger.ts +6 -1
- package/src/logging/bootAudit.ts +26 -16
- package/src/logging/boundaryLogPayload.ts +8 -1
- package/src/logging/secretRedactor.ts +14 -9
- package/src/logging/shortenForLog.ts +8 -3
- package/src/logging/variablesLoggingMiddleware.ts +9 -6
- package/src/metadataRefreshSignal.ts +45 -0
- package/src/middleware/MJTenantFilterMiddleware.ts +4 -4
- package/src/multiTenancy/index.ts +29 -5
- package/src/realtimeWidget/WidgetRouter.ts +15 -10
- package/src/realtimeWidget/WidgetSessionService.ts +76 -76
- package/src/realtimeWidget/host-identity.ts +24 -10
- package/src/realtimeWidget/index.ts +3 -3
- package/src/realtimeWidget/visitorIdentity.ts +39 -8
- package/src/realtimeWidget/widgetCore.ts +75 -10
- package/src/realtimeWidget/widgetGuestElevation.ts +25 -12
- package/src/resolvers/AdhocQueryResolver.ts +3 -3
- package/src/resolvers/AgentRunStatusPublisher.ts +175 -0
- package/src/resolvers/AgentSessionResolver.ts +3 -3
- package/src/resolvers/ColorResolver.ts +6 -6
- package/src/resolvers/ComponentRegistryResolver.ts +36 -36
- package/src/resolvers/ConversationRunEventsResolver.ts +308 -0
- package/src/resolvers/DuplicateEntryCheckResolver.ts +232 -0
- package/src/resolvers/EntityCommunicationsResolver.ts +4 -4
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +9 -9
- package/src/resolvers/FetchEntityVectorsResolver.ts +2 -1
- package/src/resolvers/FileResolver.ts +42 -42
- package/src/resolvers/GeoResolver.ts +4 -4
- package/src/resolvers/GetDataResolver.ts +50 -15
- package/src/resolvers/IntegrationDiscoveryResolver.ts +2 -2
- package/src/resolvers/ListOperationsResolver.ts +78 -28
- package/src/resolvers/MCPResolver.ts +30 -15
- package/src/resolvers/MergeRecordsResolver.ts +14 -2
- package/src/resolvers/QueryResolver.ts +13 -13
- package/src/resolvers/RealtimeBridgeResolver.ts +3 -3
- package/src/resolvers/RealtimeClientSessionResolver.ts +96 -38
- package/src/resolvers/RemoteBrowserActionResolver.ts +5 -5
- package/src/resolvers/RunAIAgentResolver.ts +134 -239
- package/src/resolvers/RunAIPromptResolver.ts +22 -22
- package/src/resolvers/RunDecisionResolver.ts +435 -0
- package/src/resolvers/RunTemplateResolver.ts +4 -4
- package/src/resolvers/RunTestResolver.ts +25 -25
- package/src/resolvers/SqlLoggingConfigResolver.ts +56 -56
- package/src/resolvers/TaskGraphFrameResolver.ts +37 -28
- package/src/resolvers/TelemetryResolver.ts +79 -79
- package/src/resolvers/VectorizeEntityResolver.ts +16 -11
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +40 -38
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +93 -0
- package/src/resolvers/__tests__/artifact-routing.test.ts +23 -23
- package/src/resolvers/adhoc-query-helpers.ts +19 -2
- package/src/resolvers/artifact-routing.ts +19 -19
- package/src/resolvers/meetingRecordingRegistration.ts +44 -10
- package/src/resolvers/peaksSidecar.ts +12 -2
- package/src/rest/EntityCRUDHandler.ts +24 -4
- package/src/rest/MediaStreamHandler.ts +11 -6
- package/src/rest/OAuthCallbackHandler.ts +25 -7
- package/src/rest/RESTEndpointHandler.ts +20 -15
- package/src/rest/RealtimeSdpBrokerHandler.ts +14 -4
- package/src/rest/SignatureWebhookHandler.ts +6 -1
- package/src/rest/UploadTokenManager.ts +66 -30
- package/src/rest/ViewOperationsHandler.ts +24 -4
- package/src/rest/mediaRange.ts +16 -6
- package/src/rest/setupRESTEndpoints.ts +24 -12
- package/src/serverExtensionReservedRoots.ts +6 -1
- package/src/services/TaskGraphActionRunner.ts +16 -15
- package/src/types.ts +21 -16
- package/src/util.ts +16 -6
|
@@ -1,4 +1,31 @@
|
|
|
1
1
|
export declare const CACHE_INVALIDATION_TOPIC = "CACHE_INVALIDATION";
|
|
2
|
+
/**
|
|
3
|
+
* Supply the configured allowlist. Called once from the server entry point during bootstrap.
|
|
4
|
+
*
|
|
5
|
+
* INJECTED rather than read from `configInfo` here, deliberately. `config.ts` runs `loadConfig()` at
|
|
6
|
+
* module scope, so importing it from this module would drag full config validation into every
|
|
7
|
+
* import chain that touches the resolver — including unit tests, which have no server config and
|
|
8
|
+
* would fail at import with "Configuration validation failed". This module deliberately imports
|
|
9
|
+
* nothing from MJServer itself — only type-graphql and `@memberjunction/core` (for the entity
|
|
10
|
+
* permission check in the subscription filter), neither of which loads config.
|
|
11
|
+
*/
|
|
12
|
+
export declare function ConfigureRecordDataBroadcast(entities: readonly string[] | undefined | null): void;
|
|
13
|
+
/**
|
|
14
|
+
* May the full row of `entityName` be broadcast alongside its cache-invalidation event?
|
|
15
|
+
*
|
|
16
|
+
* The subscription below is filtered only by ENTITY-level read permission, so anything included
|
|
17
|
+
* here is disclosed to every signed-in session that may read the entity at all — regardless of
|
|
18
|
+
* row-level security or any tenant scoping a consumer applies on the read path, neither of which
|
|
19
|
+
* this push traverses. The answer is therefore NO unless a deployment has explicitly opted the
|
|
20
|
+
* entity in via `cacheSettings.recordDataBroadcastEntities`.
|
|
21
|
+
*
|
|
22
|
+
* Callers that get `false` simply omit `recordData`; the event still carries the entity name and
|
|
23
|
+
* primary key, so clients evict and re-fetch through the normal access-controlled read path.
|
|
24
|
+
*
|
|
25
|
+
* Matching is exact (trimmed, case-insensitive) rather than substring: a loose match would let an
|
|
26
|
+
* allowlisted name drag in every entity whose name contains it.
|
|
27
|
+
*/
|
|
28
|
+
export declare function MayBroadcastRecordData(entityName: string): boolean;
|
|
2
29
|
export declare class CacheInvalidationNotification {
|
|
3
30
|
EntityName: string;
|
|
4
31
|
PrimaryKeyValues?: string;
|
|
@@ -21,12 +48,75 @@ export interface CacheInvalidationPayload {
|
|
|
21
48
|
originSessionId?: string;
|
|
22
49
|
recordData?: string;
|
|
23
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* What the subscription filter needs off the WS connection.
|
|
53
|
+
*
|
|
54
|
+
* Declared structurally rather than importing MJServer's `UserPayload`, which reaches `types.ts`
|
|
55
|
+
* and through it `auth/index.js` and config. Keeping this module's imports minimal is not fussiness
|
|
56
|
+
* — importing `configInfo` here is what previously broke every unit test that touched the resolver,
|
|
57
|
+
* and the import-surface test in this package exists to keep it that way.
|
|
58
|
+
*/
|
|
59
|
+
export interface CacheInvalidationFilterContext {
|
|
60
|
+
userPayload?: {
|
|
61
|
+
userRecord?: unknown;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Should this subscriber hear about this event at all?
|
|
66
|
+
*
|
|
67
|
+
* Entity-level narrowing, raised in review: an event for an entity a session has no read
|
|
68
|
+
* permission on tells that session the record exists, its stable key, and when it changed — and
|
|
69
|
+
* the session could never have read it anyway, so nothing is lost by withholding it. This is a
|
|
70
|
+
* monotonic reduction in disclosure that needs no tenancy model, which is why it is here and the
|
|
71
|
+
* row-level question is not.
|
|
72
|
+
*
|
|
73
|
+
* What it does NOT close: two sessions that both hold read permission on an entity still see each
|
|
74
|
+
* other's keys, because what separates them is row-level. That predicate is tracked separately —
|
|
75
|
+
* see the class docblock below.
|
|
76
|
+
*
|
|
77
|
+
* `GetUserPermisions` is an in-memory match of the entity's permission rows against the user's
|
|
78
|
+
* roles, so this stays cheap enough to run per subscriber per event. It is not free: it runs for
|
|
79
|
+
* every connected socket on every save, so keep it free of I/O.
|
|
80
|
+
*/
|
|
81
|
+
export declare function CacheInvalidationFilter(data: {
|
|
82
|
+
payload: CacheInvalidationPayload;
|
|
83
|
+
context: CacheInvalidationFilterContext | undefined;
|
|
84
|
+
}): boolean;
|
|
85
|
+
/** @deprecated Use {@link CacheInvalidationFilter}. */
|
|
86
|
+
export declare function cacheInvalidationFilter(data: {
|
|
87
|
+
payload: CacheInvalidationPayload;
|
|
88
|
+
context: CacheInvalidationFilterContext | undefined;
|
|
89
|
+
}): boolean;
|
|
24
90
|
export declare class CacheInvalidationResolver {
|
|
25
91
|
/**
|
|
26
|
-
* Subscription that broadcasts cache invalidation events to
|
|
27
|
-
*
|
|
28
|
-
*
|
|
92
|
+
* Subscription that broadcasts cache invalidation events to connected clients, so cross-server
|
|
93
|
+
* cache invalidation reaches browsers.
|
|
94
|
+
*
|
|
95
|
+
* Delivery is filtered only by ENTITY-level read permission (see {@link CacheInvalidationFilter}).
|
|
96
|
+
* Every session that may read an entity at all still receives every event for it, from every
|
|
97
|
+
* other session and tenant.
|
|
98
|
+
*
|
|
99
|
+
* Because that narrowing stops well short of row level, `RecordData` is only populated for entities a
|
|
100
|
+
* deployment has opted in through `cacheSettings.recordDataBroadcastEntities` — see
|
|
101
|
+
* {@link MayBroadcastRecordData}, applied at both publish sites.
|
|
102
|
+
*
|
|
103
|
+
* `EntityName`, `PrimaryKeyValues`, `Action` and `Timestamp` ARE still broadcast to every
|
|
104
|
+
* session, and that is a disclosure, not a safe residue. An earlier version of this comment
|
|
105
|
+
* called them "safe to broadcast" on the grounds that reading the record still goes through
|
|
106
|
+
* the access-controlled path — true of the row's CONTENTS, and beside the point for the
|
|
107
|
+
* metadata itself. A session with no relationship to a record still learns that it exists,
|
|
108
|
+
* its stable key, and every time it changes; across entities it learns the cadence and volume
|
|
109
|
+
* of another tenant's activity.
|
|
110
|
+
*
|
|
111
|
+
* The key is kept deliberately, because consumers need it to re-read the record they were
|
|
112
|
+
* told about (see `ResolveEntityEventKey` in @memberjunction/core) and because the alternative
|
|
113
|
+
* — a coarse "something in this entity changed" — forces whole-entity invalidation on the
|
|
114
|
+
* hottest write paths. That is a trade, not an absence of cost. Narrowing it means filtering
|
|
115
|
+
* delivery per subscriber, which needs an authorization predicate cheap enough to run per
|
|
116
|
+
* subscriber per event; entity-level permissions (`EntityInfo.GetUserPermisions`, an in-memory
|
|
117
|
+
* role match) would cover part of it, row-level tenancy would not.
|
|
29
118
|
*/
|
|
30
|
-
cacheInvalidation(
|
|
119
|
+
cacheInvalidation(// case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
120
|
+
payload: CacheInvalidationPayload): CacheInvalidationNotification;
|
|
31
121
|
}
|
|
32
122
|
//# sourceMappingURL=CacheInvalidationResolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheInvalidationResolver.d.ts","sourceRoot":"","sources":["../../src/generic/CacheInvalidationResolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CacheInvalidationResolver.d.ts","sourceRoot":"","sources":["../../src/generic/CacheInvalidationResolver.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAS7D;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI,CASjG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAIlE;AAED,qBACa,6BAA6B;IAEtC,UAAU,EAAG,MAAM,CAAC;IAGpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAG1B,MAAM,EAAG,MAAM,CAAC;IAGhB,cAAc,EAAG,MAAM,CAAC;IAGxB,SAAS,EAAG,IAAI,CAAC;IAGjB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,8BAA8B;IAC3C,WAAW,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,8BAA8B,GAAG,SAAS,CAAC;CACvD,GAAG,OAAO,CA2BV;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,8BAA8B,GAAG,SAAS,CAAC;CACvD,GAAG,OAAO,CAEV;AAED,qBACa,yBAAyB;IAClC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IAMH,iBAAiB,CAAG,mIAAmI;IAC3I,OAAO,EAAE,wBAAwB,GAC1C,6BAA6B;CAWnC"}
|
|
@@ -11,7 +11,56 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
11
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
12
|
};
|
|
13
13
|
import { Field, ObjectType, Resolver, Root, Subscription } from 'type-graphql';
|
|
14
|
+
import { Metadata } from '@memberjunction/core';
|
|
14
15
|
export const CACHE_INVALIDATION_TOPIC = 'CACHE_INVALIDATION';
|
|
16
|
+
/**
|
|
17
|
+
* Entities whose rows may ride along with an invalidation event. Empty until the server entry point
|
|
18
|
+
* supplies the configured list, so the default — including in any process that never configures it
|
|
19
|
+
* — is to broadcast nothing.
|
|
20
|
+
*/
|
|
21
|
+
let allowedRecordDataEntities = [];
|
|
22
|
+
/**
|
|
23
|
+
* Supply the configured allowlist. Called once from the server entry point during bootstrap.
|
|
24
|
+
*
|
|
25
|
+
* INJECTED rather than read from `configInfo` here, deliberately. `config.ts` runs `loadConfig()` at
|
|
26
|
+
* module scope, so importing it from this module would drag full config validation into every
|
|
27
|
+
* import chain that touches the resolver — including unit tests, which have no server config and
|
|
28
|
+
* would fail at import with "Configuration validation failed". This module deliberately imports
|
|
29
|
+
* nothing from MJServer itself — only type-graphql and `@memberjunction/core` (for the entity
|
|
30
|
+
* permission check in the subscription filter), neither of which loads config.
|
|
31
|
+
*/
|
|
32
|
+
export function ConfigureRecordDataBroadcast(entities) {
|
|
33
|
+
// Normalised HERE, once, rather than at each comparison. The wildcard used to be matched raw
|
|
34
|
+
// (`includes('*')`) while entity names were trimmed and lowercased two lines below, so a
|
|
35
|
+
// hand-edited `[' * ']` matched neither branch and silently opted nothing in — a config that
|
|
36
|
+
// looks like it disables the gate while leaving it fully on. Empty entries are dropped so a
|
|
37
|
+
// stray `''` cannot match an entity whose name is somehow blank.
|
|
38
|
+
allowedRecordDataEntities = (entities ?? [])
|
|
39
|
+
.map((e) => e.trim().toLowerCase())
|
|
40
|
+
.filter((e) => e.length > 0);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* May the full row of `entityName` be broadcast alongside its cache-invalidation event?
|
|
44
|
+
*
|
|
45
|
+
* The subscription below is filtered only by ENTITY-level read permission, so anything included
|
|
46
|
+
* here is disclosed to every signed-in session that may read the entity at all — regardless of
|
|
47
|
+
* row-level security or any tenant scoping a consumer applies on the read path, neither of which
|
|
48
|
+
* this push traverses. The answer is therefore NO unless a deployment has explicitly opted the
|
|
49
|
+
* entity in via `cacheSettings.recordDataBroadcastEntities`.
|
|
50
|
+
*
|
|
51
|
+
* Callers that get `false` simply omit `recordData`; the event still carries the entity name and
|
|
52
|
+
* primary key, so clients evict and re-fetch through the normal access-controlled read path.
|
|
53
|
+
*
|
|
54
|
+
* Matching is exact (trimmed, case-insensitive) rather than substring: a loose match would let an
|
|
55
|
+
* allowlisted name drag in every entity whose name contains it.
|
|
56
|
+
*/
|
|
57
|
+
export function MayBroadcastRecordData(entityName) {
|
|
58
|
+
if (allowedRecordDataEntities.length === 0)
|
|
59
|
+
return false;
|
|
60
|
+
if (allowedRecordDataEntities.includes('*'))
|
|
61
|
+
return true;
|
|
62
|
+
return allowedRecordDataEntities.includes(entityName.trim().toLowerCase());
|
|
63
|
+
}
|
|
15
64
|
let CacheInvalidationNotification = class CacheInvalidationNotification {
|
|
16
65
|
};
|
|
17
66
|
__decorate([
|
|
@@ -46,11 +95,80 @@ CacheInvalidationNotification = __decorate([
|
|
|
46
95
|
ObjectType()
|
|
47
96
|
], CacheInvalidationNotification);
|
|
48
97
|
export { CacheInvalidationNotification };
|
|
98
|
+
/**
|
|
99
|
+
* Should this subscriber hear about this event at all?
|
|
100
|
+
*
|
|
101
|
+
* Entity-level narrowing, raised in review: an event for an entity a session has no read
|
|
102
|
+
* permission on tells that session the record exists, its stable key, and when it changed — and
|
|
103
|
+
* the session could never have read it anyway, so nothing is lost by withholding it. This is a
|
|
104
|
+
* monotonic reduction in disclosure that needs no tenancy model, which is why it is here and the
|
|
105
|
+
* row-level question is not.
|
|
106
|
+
*
|
|
107
|
+
* What it does NOT close: two sessions that both hold read permission on an entity still see each
|
|
108
|
+
* other's keys, because what separates them is row-level. That predicate is tracked separately —
|
|
109
|
+
* see the class docblock below.
|
|
110
|
+
*
|
|
111
|
+
* `GetUserPermisions` is an in-memory match of the entity's permission rows against the user's
|
|
112
|
+
* roles, so this stays cheap enough to run per subscriber per event. It is not free: it runs for
|
|
113
|
+
* every connected socket on every save, so keep it free of I/O.
|
|
114
|
+
*/
|
|
115
|
+
export function CacheInvalidationFilter(data) {
|
|
116
|
+
const user = data.context?.userPayload?.userRecord;
|
|
117
|
+
// FAIL CLOSED on identity, matching `statusUpdatesFilter`. `onConnect` rejects a socket whose
|
|
118
|
+
// token does not validate, so a subscriber with no user record should not exist; if one does,
|
|
119
|
+
// it is the case least deserving of an unfiltered firehose.
|
|
120
|
+
if (!user) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
const entityName = data.payload?.entityName;
|
|
124
|
+
if (!entityName) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
// A pub/sub subscription filter has no per-request provider to thread: it runs on the server's
|
|
128
|
+
// own metadata, which is the one place the entity's permission rows can be answered from.
|
|
129
|
+
const entity = new Metadata().EntityByName(entityName); // global-provider-ok: subscription filter — server-wide metadata, no request-scoped provider exists here
|
|
130
|
+
// DELIVER when the entity is unknown here, deliberately — the opposite of the choice above.
|
|
131
|
+
// A name absent from metadata cannot be permission-checked, and withholding would silently
|
|
132
|
+
// stop invalidating a legitimately cacheable entity, which is a correctness bug rather than a
|
|
133
|
+
// disclosure one. All it discloses is the name and key of something this server cannot
|
|
134
|
+
// describe.
|
|
135
|
+
if (!entity) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return entity.GetUserPermisions(user).CanRead;
|
|
139
|
+
}
|
|
140
|
+
/** @deprecated Use {@link CacheInvalidationFilter}. */
|
|
141
|
+
export function cacheInvalidationFilter(data) {
|
|
142
|
+
return CacheInvalidationFilter(data);
|
|
143
|
+
}
|
|
49
144
|
let CacheInvalidationResolver = class CacheInvalidationResolver {
|
|
50
145
|
/**
|
|
51
|
-
* Subscription that broadcasts cache invalidation events to
|
|
52
|
-
*
|
|
53
|
-
*
|
|
146
|
+
* Subscription that broadcasts cache invalidation events to connected clients, so cross-server
|
|
147
|
+
* cache invalidation reaches browsers.
|
|
148
|
+
*
|
|
149
|
+
* Delivery is filtered only by ENTITY-level read permission (see {@link CacheInvalidationFilter}).
|
|
150
|
+
* Every session that may read an entity at all still receives every event for it, from every
|
|
151
|
+
* other session and tenant.
|
|
152
|
+
*
|
|
153
|
+
* Because that narrowing stops well short of row level, `RecordData` is only populated for entities a
|
|
154
|
+
* deployment has opted in through `cacheSettings.recordDataBroadcastEntities` — see
|
|
155
|
+
* {@link MayBroadcastRecordData}, applied at both publish sites.
|
|
156
|
+
*
|
|
157
|
+
* `EntityName`, `PrimaryKeyValues`, `Action` and `Timestamp` ARE still broadcast to every
|
|
158
|
+
* session, and that is a disclosure, not a safe residue. An earlier version of this comment
|
|
159
|
+
* called them "safe to broadcast" on the grounds that reading the record still goes through
|
|
160
|
+
* the access-controlled path — true of the row's CONTENTS, and beside the point for the
|
|
161
|
+
* metadata itself. A session with no relationship to a record still learns that it exists,
|
|
162
|
+
* its stable key, and every time it changes; across entities it learns the cadence and volume
|
|
163
|
+
* of another tenant's activity.
|
|
164
|
+
*
|
|
165
|
+
* The key is kept deliberately, because consumers need it to re-read the record they were
|
|
166
|
+
* told about (see `ResolveEntityEventKey` in @memberjunction/core) and because the alternative
|
|
167
|
+
* — a coarse "something in this entity changed" — forces whole-entity invalidation on the
|
|
168
|
+
* hottest write paths. That is a trade, not an absence of cost. Narrowing it means filtering
|
|
169
|
+
* delivery per subscriber, which needs an authorization predicate cheap enough to run per
|
|
170
|
+
* subscriber per event; entity-level permissions (`EntityInfo.GetUserPermisions`, an in-memory
|
|
171
|
+
* role match) would cover part of it, row-level tenancy would not.
|
|
54
172
|
*/
|
|
55
173
|
cacheInvalidation(payload) {
|
|
56
174
|
return {
|
|
@@ -67,6 +185,7 @@ let CacheInvalidationResolver = class CacheInvalidationResolver {
|
|
|
67
185
|
__decorate([
|
|
68
186
|
Subscription(() => CacheInvalidationNotification, {
|
|
69
187
|
topics: CACHE_INVALIDATION_TOPIC,
|
|
188
|
+
filter: (data) => CacheInvalidationFilter(data),
|
|
70
189
|
}),
|
|
71
190
|
__param(0, Root()),
|
|
72
191
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CacheInvalidationResolver.js","sourceRoot":"","sources":["../../src/generic/CacheInvalidationResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"CacheInvalidationResolver.js","sourceRoot":"","sources":["../../src/generic/CacheInvalidationResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,8 +38,15 @@ export declare class DeleteOptionsInput {
|
|
|
38
38
|
* schema-sync gate requires `DeleteOptionsInput` to carry every `EntityDeleteOptions` field;
|
|
39
39
|
* {@link DeleteOptionsInput.SanitizeFromWire} forces it back to false on every request. See
|
|
40
40
|
* that method for why.
|
|
41
|
+
*
|
|
42
|
+
* **Optional on the wire, on purpose.** This field did not exist in 5.51.x, and every other
|
|
43
|
+
* field here is required, so making it required too turned a 6.1 upgrade into a hard failure
|
|
44
|
+
* for every client that spells out `options___` on a delete (`Field
|
|
45
|
+
* "DeleteOptionsInput.SkipRecordChanges" of required type "Boolean!" was not provided`). A
|
|
46
|
+
* 5.51 client that omits it and a 6.1 client that sends `false` mean the same thing, and the
|
|
47
|
+
* server forces it to `false` regardless, so `null`/absent defaults to `false` here.
|
|
41
48
|
*/
|
|
42
|
-
SkipRecordChanges
|
|
49
|
+
SkipRecordChanges?: boolean;
|
|
43
50
|
/**
|
|
44
51
|
* Strips wire-unreachable capabilities from client-supplied delete options.
|
|
45
52
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteOptionsInput.d.ts","sourceRoot":"","sources":["../../src/generic/DeleteOptionsInput.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,qBACa,kBAAkB;IAE3B,mBAAmB,EAAE,OAAO,CAAC;IAG7B,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IAEH,UAAU,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IAEH,oBAAoB,EAAE,OAAO,CAAC;IAE9B
|
|
1
|
+
{"version":3,"file":"DeleteOptionsInput.d.ts","sourceRoot":"","sources":["../../src/generic/DeleteOptionsInput.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;GAaG;AACH,qBACa,kBAAkB;IAE3B,mBAAmB,EAAE,OAAO,CAAC;IAG7B,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IAEH,UAAU,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IAEH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;;;;;;;;;;;;;;;;;OAkBG;IAEH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;;;;;;;;;;;;;;;;;;;;OAsBG;WACW,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,kBAAkB;CAU1H"}
|
|
@@ -73,7 +73,7 @@ __decorate([
|
|
|
73
73
|
__metadata("design:type", Boolean)
|
|
74
74
|
], DeleteOptionsInput.prototype, "IsParentEntityDelete", void 0);
|
|
75
75
|
__decorate([
|
|
76
|
-
Field(() => Boolean),
|
|
76
|
+
Field(() => Boolean, { nullable: true, defaultValue: false }),
|
|
77
77
|
__metadata("design:type", Boolean)
|
|
78
78
|
], DeleteOptionsInput.prototype, "SkipRecordChanges", void 0);
|
|
79
79
|
DeleteOptionsInput = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeleteOptionsInput.js","sourceRoot":"","sources":["../../src/generic/DeleteOptionsInput.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;
|
|
1
|
+
{"version":3,"file":"DeleteOptionsInput.js","sourceRoot":"","sources":["../../src/generic/DeleteOptionsInput.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IA6C3B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACI,MAAM,CAAC,gBAAgB,CAAC,OAA2B,EAAE,UAAkB,EAAE,SAAkB;QAC9F,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC;YAC9B,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,QAAQ,CACJ,mCAAmC,UAAU,wBAAwB,SAAS,IAAI,wBAAwB,IAAI;YAC9G,mEAAmE,CACtE,CAAC;QACF,OAAO,EAAE,GAAG,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;CACJ,CAAA;AA5EG;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;;+DACQ;AAG7B;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;;6DACM;AAQ3B;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;;sDACD;AAQpB;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;;gEACS;AAsB9B;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;;6DAClC;AA3CnB,kBAAkB;IAD9B,SAAS,EAAE;GACC,kBAAkB,CA8E9B"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { PubSubEngine } from 'type-graphql';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Default cadence for fire-and-forget liveness pulses (60 seconds).
|
|
4
|
+
*
|
|
5
|
+
* MATCHED PAIR — do not change alone. The client's inactivity window
|
|
6
|
+
* (`DEFAULT_IDLE_TIMEOUT_MS` in GraphQLDataProvider's fireAndForgetHelper) is sized at roughly
|
|
7
|
+
* 3x this value, so a healthy run always refreshes the timer well before it expires. Lengthening
|
|
8
|
+
* this without lengthening that window makes every quiet stretch of a long agent run look like a
|
|
9
|
+
* stall and trips reconciliation; shortening the window without shortening this does the same.
|
|
10
|
+
*
|
|
11
|
+
* WAS 5 MINUTES (MJ #4222). Paired with the old 12-minute window, a client whose transport had
|
|
12
|
+
* silently died waited 12 minutes to notice — on runs that typically finish in 20 seconds. The
|
|
13
|
+
* pulse is a few dozen bytes and exists only while an operation is actually running, so the
|
|
14
|
+
* added traffic is negligible: a 40-minute run now sends ~40 pulses instead of ~8, and the
|
|
15
|
+
* 20-second run that motivated the change still sends none.
|
|
16
|
+
*/
|
|
3
17
|
export declare const DEFAULT_PULSE_INTERVAL_MS: number;
|
|
4
18
|
/** The `type` discriminator carried by liveness pulse messages. */
|
|
5
19
|
export declare const HEARTBEAT_MESSAGE_TYPE = "Heartbeat";
|
|
@@ -18,7 +32,7 @@ export interface PulseStatus {
|
|
|
18
32
|
}
|
|
19
33
|
/** Handle returned by {@link startLivenessPulse}; call `stop()` when the work settles. */
|
|
20
34
|
export interface LivenessPulseHandle {
|
|
21
|
-
|
|
35
|
+
Stop(): void;
|
|
22
36
|
}
|
|
23
37
|
export interface LivenessPulseOptions {
|
|
24
38
|
/** PubSub engine used to publish on the shared push-status topic. */
|
|
@@ -52,5 +66,7 @@ export interface LivenessPulseOptions {
|
|
|
52
66
|
* (`{ message: JSON.stringify({ resolver, type, status, data }), sessionId }`),
|
|
53
67
|
* so the client receives it through the same subscription with no special parsing.
|
|
54
68
|
*/
|
|
69
|
+
export declare function StartLivenessPulse(options: LivenessPulseOptions): LivenessPulseHandle;
|
|
70
|
+
/** @deprecated Use {@link StartLivenessPulse}. */
|
|
55
71
|
export declare function startLivenessPulse(options: LivenessPulseOptions): LivenessPulseHandle;
|
|
56
72
|
//# sourceMappingURL=FireAndForgetHeartbeat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FireAndForgetHeartbeat.d.ts","sourceRoot":"","sources":["../../src/generic/FireAndForgetHeartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C
|
|
1
|
+
{"version":3,"file":"FireAndForgetHeartbeat.d.ts","sourceRoot":"","sources":["../../src/generic/FireAndForgetHeartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAI5C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAEnD,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IACxB,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,0FAA0F;AAC1F,MAAM,WAAW,mBAAmB;IAChC,IAAI,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACjC,qEAAqE;IACrE,MAAM,EAAE,YAAY,CAAC;IACrB,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CA4BrF;AAED,kDAAkD;AAClD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CAErF"}
|
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
import { LogError } from '@memberjunction/core';
|
|
2
|
-
import {
|
|
3
|
-
/**
|
|
4
|
-
|
|
2
|
+
import { PublishStatusUpdate } from './PushStatusResolver.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default cadence for fire-and-forget liveness pulses (60 seconds).
|
|
5
|
+
*
|
|
6
|
+
* MATCHED PAIR — do not change alone. The client's inactivity window
|
|
7
|
+
* (`DEFAULT_IDLE_TIMEOUT_MS` in GraphQLDataProvider's fireAndForgetHelper) is sized at roughly
|
|
8
|
+
* 3x this value, so a healthy run always refreshes the timer well before it expires. Lengthening
|
|
9
|
+
* this without lengthening that window makes every quiet stretch of a long agent run look like a
|
|
10
|
+
* stall and trips reconciliation; shortening the window without shortening this does the same.
|
|
11
|
+
*
|
|
12
|
+
* WAS 5 MINUTES (MJ #4222). Paired with the old 12-minute window, a client whose transport had
|
|
13
|
+
* silently died waited 12 minutes to notice — on runs that typically finish in 20 seconds. The
|
|
14
|
+
* pulse is a few dozen bytes and exists only while an operation is actually running, so the
|
|
15
|
+
* added traffic is negligible: a 40-minute run now sends ~40 pulses instead of ~8, and the
|
|
16
|
+
* 20-second run that motivated the change still sends none.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_PULSE_INTERVAL_MS = 60 * 1000;
|
|
5
19
|
/** The `type` discriminator carried by liveness pulse messages. */
|
|
6
20
|
export const HEARTBEAT_MESSAGE_TYPE = 'Heartbeat';
|
|
7
21
|
/**
|
|
@@ -15,7 +29,7 @@ export const HEARTBEAT_MESSAGE_TYPE = 'Heartbeat';
|
|
|
15
29
|
* (`{ message: JSON.stringify({ resolver, type, status, data }), sessionId }`),
|
|
16
30
|
* so the client receives it through the same subscription with no special parsing.
|
|
17
31
|
*/
|
|
18
|
-
export function
|
|
32
|
+
export function StartLivenessPulse(options) {
|
|
19
33
|
const { pubSub, sessionId, ownerUserId, resolver, readStatus } = options;
|
|
20
34
|
const intervalMs = options.intervalMs ?? DEFAULT_PULSE_INTERVAL_MS;
|
|
21
35
|
const timer = setInterval(() => {
|
|
@@ -27,7 +41,7 @@ export function startLivenessPulse(options) {
|
|
|
27
41
|
// A status read failure must not break the liveness loop.
|
|
28
42
|
LogError(`[LivenessPulse:${resolver}] readStatus failed: ${e.message}`);
|
|
29
43
|
}
|
|
30
|
-
|
|
44
|
+
PublishStatusUpdate(pubSub, {
|
|
31
45
|
sessionId,
|
|
32
46
|
ownerUserId,
|
|
33
47
|
message: JSON.stringify({
|
|
@@ -39,7 +53,11 @@ export function startLivenessPulse(options) {
|
|
|
39
53
|
});
|
|
40
54
|
}, intervalMs);
|
|
41
55
|
return {
|
|
42
|
-
|
|
56
|
+
Stop: () => clearInterval(timer),
|
|
43
57
|
};
|
|
44
58
|
}
|
|
59
|
+
/** @deprecated Use {@link StartLivenessPulse}. */
|
|
60
|
+
export function startLivenessPulse(options) {
|
|
61
|
+
return StartLivenessPulse(options);
|
|
62
|
+
}
|
|
45
63
|
//# sourceMappingURL=FireAndForgetHeartbeat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FireAndForgetHeartbeat.js","sourceRoot":"","sources":["../../src/generic/FireAndForgetHeartbeat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D
|
|
1
|
+
{"version":3,"file":"FireAndForgetHeartbeat.js","sourceRoot":"","sources":["../../src/generic/FireAndForgetHeartbeat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,CAAC;AAEnD,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC;AA2ClD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA6B;IAC5D,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACzE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,yBAAyB,CAAC;IAEnE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3B,IAAI,IAA6B,CAAC;QAClC,IAAI,CAAC;YACD,IAAI,GAAG,UAAU,EAAE,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,0DAA0D;YAC1D,QAAQ,CAAC,kBAAkB,QAAQ,wBAAyB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,mBAAmB,CAAC,MAAM,EAAE;YACxB,SAAS;YACT,WAAW;YACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,QAAQ;gBACR,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,IAAI,IAAI,EAAE;aACnB,CAAC;SACL,CAAC,CAAC;IACP,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,OAAO;QACH,IAAI,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;KACnC,CAAC;AACN,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,kBAAkB,CAAC,OAA6B;IAC5D,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { IMetadataProvider, UserInfo } from '@memberjunction/core';
|
|
2
|
+
/**
|
|
3
|
+
* Grace period after a run reaches a terminal state before its conversation detail is considered
|
|
4
|
+
* abandoned. The normal path closes the detail moments after the run finishes; this waits well past
|
|
5
|
+
* that so a reconcile can never race a completion that is already on its way.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ORPHAN_DETAIL_GRACE_MS: number;
|
|
8
|
+
/**
|
|
9
|
+
* Close conversation details left `In-Progress` by a run that is already over (MJ #4222).
|
|
10
|
+
*
|
|
11
|
+
* WHY THIS EXISTS. `AgentRunner` closes the detail as the final step of a run, so a process that
|
|
12
|
+
* dies mid-run never reaches it. The agent-run watchdog repairs the RUN — force-failing it once the
|
|
13
|
+
* heartbeat goes stale — but nothing repairs the detail, and the detail is the row the chat renders
|
|
14
|
+
* from. The result is durable state that disagrees with itself: a terminal run beside a message
|
|
15
|
+
* that still says it is being generated, spinning forever for anyone who opens it.
|
|
16
|
+
*
|
|
17
|
+
* WHY NOT IN THE SWEEP PROC. `spSweepStaleAIAgentRuns` is a single set-based UPDATE, and extending
|
|
18
|
+
* it to the detail would be the obvious fix. It would also be the wrong one: `MJ: Conversation
|
|
19
|
+
* Details` declares `TrustServerCacheCompletely`, so the server's RunView cache relies on
|
|
20
|
+
* `BaseEntity` events for invalidation and a stored procedure fires none. The row would change
|
|
21
|
+
* while every instance kept serving `In-Progress` from cache — a worse failure than the one being
|
|
22
|
+
* fixed, because reconciliation itself would read the stale value back. Going through
|
|
23
|
+
* `BaseEntity.Save()` costs a per-row write and buys correct invalidation everywhere.
|
|
24
|
+
*
|
|
25
|
+
* Idempotent and safe to run concurrently on several instances: the write is a no-op once the
|
|
26
|
+
* status is terminal, and each pass re-reads state before deciding.
|
|
27
|
+
*
|
|
28
|
+
* @returns How many details were closed.
|
|
29
|
+
*/
|
|
30
|
+
export declare function ReconcileOrphanedConversationDetails(provider: IMetadataProvider, contextUser: UserInfo, graceMs?: number): Promise<number>;
|
|
31
|
+
//# sourceMappingURL=OrphanedConversationDetailReconciler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrphanedConversationDetailReconciler.d.ts","sourceRoot":"","sources":["../../src/generic/OrphanedConversationDetailReconciler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGxE;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAgB,CAAC;AAiBpD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,oCAAoC,CACtD,QAAQ,EAAE,iBAAiB,EAC3B,WAAW,EAAE,QAAQ,EACrB,OAAO,GAAE,MAA+B,GACzC,OAAO,CAAC,MAAM,CAAC,CAkGjB"}
|