@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
|
@@ -25,79 +25,79 @@ import { configInfo } from '../config.js';
|
|
|
25
25
|
@ObjectType()
|
|
26
26
|
class ComponentSpecWithHashType {
|
|
27
27
|
@Field(() => String, { nullable: true })
|
|
28
|
-
specification?: string; // JSON string of ComponentSpec
|
|
28
|
+
specification?: string; // JSON string of ComponentSpec — case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
29
29
|
|
|
30
30
|
@Field(() => String)
|
|
31
|
-
hash: string;
|
|
31
|
+
hash: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
32
32
|
|
|
33
33
|
@Field(() => Boolean)
|
|
34
|
-
notModified: boolean;
|
|
34
|
+
notModified: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
35
35
|
|
|
36
36
|
@Field(() => String, { nullable: true })
|
|
37
|
-
message?: string;
|
|
37
|
+
message?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
@InputType()
|
|
41
41
|
class SearchRegistryComponentsInput {
|
|
42
42
|
@Field({ nullable: true })
|
|
43
|
-
registryId?: string;
|
|
43
|
+
registryId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
44
44
|
|
|
45
45
|
@Field({ nullable: true })
|
|
46
|
-
namespace?: string;
|
|
46
|
+
namespace?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
47
47
|
|
|
48
48
|
@Field({ nullable: true })
|
|
49
|
-
query?: string;
|
|
49
|
+
query?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
50
50
|
|
|
51
51
|
@Field({ nullable: true })
|
|
52
|
-
type?: string;
|
|
52
|
+
type?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
53
53
|
|
|
54
54
|
@Field(() => [String], { nullable: true })
|
|
55
|
-
tags?: string[];
|
|
55
|
+
tags?: string[]; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
56
56
|
|
|
57
57
|
@Field({ nullable: true })
|
|
58
|
-
limit?: number;
|
|
58
|
+
limit?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
59
59
|
|
|
60
60
|
@Field({ nullable: true })
|
|
61
|
-
offset?: number;
|
|
61
|
+
offset?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
@ObjectType()
|
|
65
65
|
class RegistryComponentSearchResultType {
|
|
66
66
|
@Field(() => [String])
|
|
67
|
-
components: string[]; // Array of JSON strings of ComponentSpec
|
|
67
|
+
components: string[]; // Array of JSON strings of ComponentSpec — case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
68
68
|
|
|
69
69
|
@Field()
|
|
70
|
-
total: number;
|
|
70
|
+
total: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
71
71
|
|
|
72
72
|
@Field()
|
|
73
|
-
offset: number;
|
|
73
|
+
offset: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
74
74
|
|
|
75
75
|
@Field()
|
|
76
|
-
limit: number;
|
|
76
|
+
limit: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
@ObjectType()
|
|
80
80
|
class ComponentDependencyTreeType {
|
|
81
81
|
@Field()
|
|
82
|
-
componentId: string;
|
|
82
|
+
componentId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
83
83
|
|
|
84
84
|
@Field({ nullable: true })
|
|
85
|
-
name?: string;
|
|
85
|
+
name?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
86
86
|
|
|
87
87
|
@Field({ nullable: true })
|
|
88
|
-
namespace?: string;
|
|
88
|
+
namespace?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
89
89
|
|
|
90
90
|
@Field({ nullable: true })
|
|
91
|
-
version?: string;
|
|
91
|
+
version?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
92
92
|
|
|
93
93
|
@Field({ nullable: true })
|
|
94
|
-
circular?: boolean;
|
|
94
|
+
circular?: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
95
95
|
|
|
96
96
|
@Field({ nullable: true })
|
|
97
|
-
totalCount?: number;
|
|
97
|
+
totalCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
98
98
|
|
|
99
99
|
@Field(() => [ComponentDependencyTreeType], { nullable: true })
|
|
100
|
-
dependencies?: ComponentDependencyTreeType[];
|
|
100
|
+
dependencies?: ComponentDependencyTreeType[]; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
/**
|
|
@@ -107,37 +107,37 @@ class ComponentDependencyTreeType {
|
|
|
107
107
|
@InputType()
|
|
108
108
|
class ComponentFeedbackInput {
|
|
109
109
|
@Field()
|
|
110
|
-
componentName: string;
|
|
110
|
+
componentName: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
111
111
|
|
|
112
112
|
@Field()
|
|
113
|
-
componentNamespace: string;
|
|
113
|
+
componentNamespace: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
114
114
|
|
|
115
115
|
@Field({ nullable: true })
|
|
116
|
-
componentVersion?: string;
|
|
116
|
+
componentVersion?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
117
117
|
|
|
118
118
|
@Field({ nullable: true })
|
|
119
|
-
registryName?: string;
|
|
119
|
+
registryName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
120
120
|
|
|
121
121
|
@Field()
|
|
122
|
-
rating: number;
|
|
122
|
+
rating: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
123
123
|
|
|
124
124
|
@Field({ nullable: true })
|
|
125
|
-
feedbackType?: string;
|
|
125
|
+
feedbackType?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
126
126
|
|
|
127
127
|
@Field({ nullable: true })
|
|
128
|
-
comments?: string;
|
|
128
|
+
comments?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
129
129
|
|
|
130
130
|
@Field({ nullable: true })
|
|
131
|
-
conversationID?: string;
|
|
131
|
+
conversationID?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
132
132
|
|
|
133
133
|
@Field({ nullable: true })
|
|
134
|
-
conversationDetailID?: string;
|
|
134
|
+
conversationDetailID?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
135
135
|
|
|
136
136
|
@Field({ nullable: true })
|
|
137
|
-
reportID?: string;
|
|
137
|
+
reportID?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
138
138
|
|
|
139
139
|
@Field({ nullable: true })
|
|
140
|
-
dashboardID?: string;
|
|
140
|
+
dashboardID?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
/**
|
|
@@ -146,13 +146,13 @@ class ComponentFeedbackInput {
|
|
|
146
146
|
@ObjectType()
|
|
147
147
|
class ComponentFeedbackResponse {
|
|
148
148
|
@Field()
|
|
149
|
-
success: boolean;
|
|
149
|
+
success: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
150
150
|
|
|
151
151
|
@Field({ nullable: true })
|
|
152
|
-
feedbackID?: string;
|
|
152
|
+
feedbackID?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
153
153
|
|
|
154
154
|
@Field({ nullable: true })
|
|
155
|
-
error?: string;
|
|
155
|
+
error?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
/**
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
import { Arg, Ctx, Field, Int, ObjectType, Query, Resolver } from 'type-graphql';
|
|
2
|
+
import { RunView } from '@memberjunction/core';
|
|
3
|
+
import { EscapeSQLString } from '@memberjunction/global';
|
|
4
|
+
import type { IMetadataProvider, UserInfo } from '@memberjunction/core';
|
|
5
|
+
import type { MJAIAgentRunEntity, MJAIAgentRunStepEntity, MJConversationDetailEntity } from '@memberjunction/core-entities';
|
|
6
|
+
import type { AppContext } from '../types.js';
|
|
7
|
+
import { GetReadOnlyProvider } from '../util.js';
|
|
8
|
+
|
|
9
|
+
/** The run columns the tail reads. */
|
|
10
|
+
type TailRunRow = Pick<MJAIAgentRunEntity, 'ID' | 'Status' | 'Result'>;
|
|
11
|
+
|
|
12
|
+
/** The step columns an event carries. The large data columns are never read. */
|
|
13
|
+
type TailStepRow = Pick<
|
|
14
|
+
MJAIAgentRunStepEntity,
|
|
15
|
+
'StepNumber' | 'StepType' | 'StepName' | 'Status' | 'Success' | 'ErrorMessage' | 'StartedAt' | 'CompletedAt'
|
|
16
|
+
>;
|
|
17
|
+
|
|
18
|
+
const RUN_FIELDS: (keyof TailRunRow)[] = ['ID', 'Status', 'Result'];
|
|
19
|
+
const STEP_FIELDS: (keyof TailStepRow)[] = [
|
|
20
|
+
'StepNumber', 'StepType', 'StepName', 'Status', 'Success', 'ErrorMessage', 'StartedAt', 'CompletedAt',
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* One step of an agent run, projected for the client's progress view.
|
|
25
|
+
*
|
|
26
|
+
* Carries metadata only. `InputData`, `OutputData` and the payload snapshots are
|
|
27
|
+
* deliberately excluded: they are the largest columns on the row and a run can hold
|
|
28
|
+
* hundreds of steps, so including them would let a single tail call return tens of
|
|
29
|
+
* megabytes. The final result is delivered once, via `FinalPayload`, when the run
|
|
30
|
+
* reaches a terminal state.
|
|
31
|
+
*/
|
|
32
|
+
@ObjectType()
|
|
33
|
+
export class ConversationRunEvent {
|
|
34
|
+
/** Monotonic position within the run. The cursor a client pages from. */
|
|
35
|
+
@Field(() => Int)
|
|
36
|
+
Seq: number;
|
|
37
|
+
|
|
38
|
+
@Field(() => String)
|
|
39
|
+
StepType: string;
|
|
40
|
+
|
|
41
|
+
@Field(() => String)
|
|
42
|
+
StepName: string;
|
|
43
|
+
|
|
44
|
+
@Field(() => String)
|
|
45
|
+
Status: string;
|
|
46
|
+
|
|
47
|
+
@Field(() => Boolean, { nullable: true })
|
|
48
|
+
Success?: boolean;
|
|
49
|
+
|
|
50
|
+
@Field(() => String, { nullable: true })
|
|
51
|
+
ErrorMessage?: string;
|
|
52
|
+
|
|
53
|
+
@Field(() => Date)
|
|
54
|
+
StartedAt: Date;
|
|
55
|
+
|
|
56
|
+
@Field(() => Date, { nullable: true })
|
|
57
|
+
CompletedAt?: Date;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Result of a tail call. */
|
|
61
|
+
@ObjectType()
|
|
62
|
+
export class ConversationRunEventsOutput {
|
|
63
|
+
@Field(() => Boolean)
|
|
64
|
+
Success: boolean;
|
|
65
|
+
|
|
66
|
+
@Field(() => String)
|
|
67
|
+
Message: string;
|
|
68
|
+
|
|
69
|
+
@Field(() => [ConversationRunEvent])
|
|
70
|
+
Events: ConversationRunEvent[];
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Highest `Seq` the caller has now seen. Pass it back as `sinceSeq` on the next call.
|
|
74
|
+
* Echoes the request's `sinceSeq` when nothing new has landed, so a client that polls
|
|
75
|
+
* a quiet run never rewinds.
|
|
76
|
+
*/
|
|
77
|
+
@Field(() => Int)
|
|
78
|
+
LatestSeq: number;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* True while the run is still executing, including a run `Paused` on a workflow that is still
|
|
82
|
+
* running. False means terminal — stop tailing, and `FinalPayload` / `RunStatus` hold the
|
|
83
|
+
* outcome. A failed call (`Success` false) reports true, because it knows nothing about the run.
|
|
84
|
+
*/
|
|
85
|
+
@Field(() => Boolean)
|
|
86
|
+
IsInFlight: boolean;
|
|
87
|
+
|
|
88
|
+
@Field(() => String, { nullable: true })
|
|
89
|
+
RunID?: string;
|
|
90
|
+
|
|
91
|
+
@Field(() => String, { nullable: true })
|
|
92
|
+
RunStatus?: string;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The run's answer, returned only once the run is terminal.
|
|
96
|
+
*
|
|
97
|
+
* Sourced from `AIAgentRun.Result`, falling back to the conversation detail's message because
|
|
98
|
+
* `Result` is agent-dependent and null on many successful runs. Still nullable: a caller must
|
|
99
|
+
* decide a message is finished from {@link IsInFlight} / {@link DetailStatus}, never from the
|
|
100
|
+
* presence of this field, or it will wait forever on an agent that writes neither.
|
|
101
|
+
*/
|
|
102
|
+
@Field(() => String, { nullable: true })
|
|
103
|
+
FinalPayload?: string;
|
|
104
|
+
|
|
105
|
+
/** `ConversationDetail.Status` — the value the chat UI renders from. */
|
|
106
|
+
@Field(() => String, { nullable: true })
|
|
107
|
+
DetailStatus?: string;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Every read here sets `BypassCache`. This is the last-resort recovery path, and the rows it
|
|
112
|
+
* judges are written by callers that fire no cache invalidation — `spSweepStaleAIAgentRuns`
|
|
113
|
+
* force-fails a run with a direct set-based UPDATE. `TrustServerCacheCompletely` defaults on, so
|
|
114
|
+
* a cached read would keep reporting a swept run as `Running` and recovery would never fire.
|
|
115
|
+
*/
|
|
116
|
+
|
|
117
|
+
/** Ceiling on events returned per call. A client with a gap larger than this pages. */
|
|
118
|
+
const MAX_EVENTS_PER_TAIL = 200;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Run statuses that mean execution is still in progress. `Paused` is a run parked on a workflow
|
|
122
|
+
* that is still executing; the orphan reconciler and the process panel treat it the same way.
|
|
123
|
+
*/
|
|
124
|
+
const IN_FLIGHT_STATUSES: MJAIAgentRunEntity['Status'][] = ['Running', 'Paused'];
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Durable, resumable read of an agent run's progress (MJ #4222).
|
|
128
|
+
*
|
|
129
|
+
* The `statusUpdates` subscription is the only live path a conversation has, and it has no
|
|
130
|
+
* replay: the server topic is an in-memory PubSub and the client subject is explicitly
|
|
131
|
+
* unbuffered. Anything published while a socket is half-open is gone, and the client cannot
|
|
132
|
+
* tell the difference between "nothing happened" and "I missed everything".
|
|
133
|
+
*
|
|
134
|
+
* This query is the durable counterpart, mirroring `IntegrationTailRunEvents` — the same
|
|
135
|
+
* shape the integration subsystem already uses, where the subscription is a latency
|
|
136
|
+
* optimization over a log rather than the only delivery path. A client keeps the `LatestSeq`
|
|
137
|
+
* it has seen and re-reads from there after any interruption.
|
|
138
|
+
*
|
|
139
|
+
* It is a READ MODEL over tables that already exist. `AIAgentRunStep` rows are inserted when
|
|
140
|
+
* a step starts and updated when it finishes, so progress is visible mid-run, and
|
|
141
|
+
* `StepNumber` is already monotonic per run. No new table and no migration.
|
|
142
|
+
*
|
|
143
|
+
* Authorization is delegated to `RunView` executed as the calling user, so MJ's existing
|
|
144
|
+
* row-level security decides what is visible. A caller who cannot read the conversation
|
|
145
|
+
* detail gets the same answer as one asking about a detail that does not exist.
|
|
146
|
+
*/
|
|
147
|
+
@Resolver()
|
|
148
|
+
export class ConversationRunEventsResolver {
|
|
149
|
+
@Query(() => ConversationRunEventsOutput)
|
|
150
|
+
async TailConversationEvents(
|
|
151
|
+
@Arg('conversationDetailID', () => String) conversationDetailID: string,
|
|
152
|
+
@Ctx() ctx: AppContext,
|
|
153
|
+
@Arg('sinceSeq', () => Int, { defaultValue: 0 }) sinceSeq?: number
|
|
154
|
+
): Promise<ConversationRunEventsOutput> {
|
|
155
|
+
const from = Math.max(0, sinceSeq ?? 0);
|
|
156
|
+
const empty = (message: string): ConversationRunEventsOutput => ({
|
|
157
|
+
Success: false,
|
|
158
|
+
Message: message,
|
|
159
|
+
Events: [],
|
|
160
|
+
LatestSeq: from,
|
|
161
|
+
IsInFlight: true,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
try {
|
|
165
|
+
const user = ctx.userPayload?.userRecord;
|
|
166
|
+
if (!user) {
|
|
167
|
+
return empty('User is not authenticated');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const provider = GetReadOnlyProvider(ctx.providers, { allowFallbackToReadWrite: true });
|
|
171
|
+
const detail = await this.loadDetail(provider, conversationDetailID, user);
|
|
172
|
+
if (!detail) {
|
|
173
|
+
// Not found and not authorized are deliberately indistinguishable — answering
|
|
174
|
+
// "exists but denied" would confirm the id to someone probing for one.
|
|
175
|
+
return empty(`Conversation detail '${conversationDetailID}' not found`);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const run = await this.loadLatestRun(provider, conversationDetailID, user);
|
|
179
|
+
if (!run) {
|
|
180
|
+
// The mutation is acknowledged before the run row exists, so this is an
|
|
181
|
+
// ordinary early-poll result, not an error. Reported as success with nothing
|
|
182
|
+
// to show so a client does not treat a race as a failure.
|
|
183
|
+
return {
|
|
184
|
+
Success: true,
|
|
185
|
+
Message: 'No agent run yet for this conversation detail',
|
|
186
|
+
Events: [],
|
|
187
|
+
LatestSeq: from,
|
|
188
|
+
IsInFlight: false,
|
|
189
|
+
DetailStatus: detail.Status ?? undefined,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const isInFlight = IN_FLIGHT_STATUSES.includes(run.Status);
|
|
194
|
+
const steps = await this.loadSteps(provider, run.ID, from, user);
|
|
195
|
+
const events = steps.map((s) => this.toEvent(s));
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
Success: true,
|
|
199
|
+
Message: `${events.length} event(s)`,
|
|
200
|
+
Events: events,
|
|
201
|
+
// Never rewind: a quiet run returns the cursor the caller already held.
|
|
202
|
+
LatestSeq: events.length > 0 ? events[events.length - 1].Seq : from,
|
|
203
|
+
IsInFlight: isInFlight,
|
|
204
|
+
RunID: run.ID,
|
|
205
|
+
RunStatus: run.Status,
|
|
206
|
+
// Only meaningful once terminal; sending it mid-run would hand the client a
|
|
207
|
+
// partial payload it could mistake for the final answer.
|
|
208
|
+
//
|
|
209
|
+
// `AIAgentRun.Result` is agent-dependent — it is null on a large share of
|
|
210
|
+
// genuinely successful runs — so the conversation detail's own message is the
|
|
211
|
+
// fallback. That is the text the chat renders, so it is the answer a caller
|
|
212
|
+
// waiting on this field actually wants.
|
|
213
|
+
FinalPayload: isInFlight ? undefined : (run.Result ?? detail.Message ?? undefined),
|
|
214
|
+
DetailStatus: detail.Status ?? undefined,
|
|
215
|
+
};
|
|
216
|
+
} catch (e) {
|
|
217
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
218
|
+
return empty(`TailConversationEvents failed: ${message}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/** Loads the conversation detail as the calling user; null when absent or not permitted. */
|
|
223
|
+
private async loadDetail(
|
|
224
|
+
provider: IMetadataProvider,
|
|
225
|
+
conversationDetailID: string,
|
|
226
|
+
user: UserInfo
|
|
227
|
+
): Promise<MJConversationDetailEntity | undefined> {
|
|
228
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
229
|
+
const result = await rv.RunView<MJConversationDetailEntity>(
|
|
230
|
+
{
|
|
231
|
+
EntityName: 'MJ: Conversation Details',
|
|
232
|
+
ExtraFilter: `ID='${this.escape(conversationDetailID)}'`,
|
|
233
|
+
MaxRows: 1,
|
|
234
|
+
ResultType: 'entity_object',
|
|
235
|
+
BypassCache: true,
|
|
236
|
+
},
|
|
237
|
+
user
|
|
238
|
+
);
|
|
239
|
+
return result.Success ? result.Results?.[0] : undefined;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Newest run for the detail. A conversation detail can be retried, and the latest run is
|
|
244
|
+
* the one the UI is showing.
|
|
245
|
+
*/
|
|
246
|
+
private async loadLatestRun(
|
|
247
|
+
provider: IMetadataProvider,
|
|
248
|
+
conversationDetailID: string,
|
|
249
|
+
user: UserInfo
|
|
250
|
+
): Promise<TailRunRow | undefined> {
|
|
251
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
252
|
+
const result = await rv.RunView<TailRunRow>(
|
|
253
|
+
{
|
|
254
|
+
EntityName: 'MJ: AI Agent Runs',
|
|
255
|
+
ExtraFilter: `ConversationDetailID='${this.escape(conversationDetailID)}'`,
|
|
256
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
257
|
+
MaxRows: 1,
|
|
258
|
+
Fields: RUN_FIELDS,
|
|
259
|
+
ResultType: 'simple',
|
|
260
|
+
BypassCache: true,
|
|
261
|
+
},
|
|
262
|
+
user
|
|
263
|
+
);
|
|
264
|
+
return result.Success ? result.Results?.[0] : undefined;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/** Steps after `sinceSeq`, oldest first, bounded by {@link MAX_EVENTS_PER_TAIL}. */
|
|
268
|
+
private async loadSteps(
|
|
269
|
+
provider: IMetadataProvider,
|
|
270
|
+
agentRunID: string,
|
|
271
|
+
sinceSeq: number,
|
|
272
|
+
user: UserInfo
|
|
273
|
+
): Promise<TailStepRow[]> {
|
|
274
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
275
|
+
const result = await rv.RunView<TailStepRow>(
|
|
276
|
+
{
|
|
277
|
+
EntityName: 'MJ: AI Agent Run Steps',
|
|
278
|
+
ExtraFilter: `AgentRunID='${this.escape(agentRunID)}' AND StepNumber > ${Math.floor(sinceSeq)}`,
|
|
279
|
+
OrderBy: 'StepNumber ASC',
|
|
280
|
+
MaxRows: MAX_EVENTS_PER_TAIL,
|
|
281
|
+
Fields: STEP_FIELDS,
|
|
282
|
+
ResultType: 'simple',
|
|
283
|
+
BypassCache: true,
|
|
284
|
+
},
|
|
285
|
+
user
|
|
286
|
+
);
|
|
287
|
+
return result.Success ? (result.Results ?? []) : [];
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** Projects a plain step row to an event. Plain rows may carry dates as strings. */
|
|
291
|
+
private toEvent(step: TailStepRow): ConversationRunEvent {
|
|
292
|
+
return {
|
|
293
|
+
Seq: step.StepNumber,
|
|
294
|
+
StepType: step.StepType,
|
|
295
|
+
StepName: step.StepName,
|
|
296
|
+
Status: step.Status,
|
|
297
|
+
Success: step.Success ?? undefined,
|
|
298
|
+
ErrorMessage: step.ErrorMessage ?? undefined,
|
|
299
|
+
StartedAt: new Date(step.StartedAt),
|
|
300
|
+
CompletedAt: step.CompletedAt != null ? new Date(step.CompletedAt) : undefined,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/** Escapes a value for the `ExtraFilter` string. Ids are UUIDs, but never trust the shape. */
|
|
305
|
+
private escape(value: string): string {
|
|
306
|
+
return EscapeSQLString(value);
|
|
307
|
+
}
|
|
308
|
+
}
|