@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
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* @module @memberjunction/server/widget
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { BuildSessionClaims } from '../auth/magicLink/magicLinkCore.js';
|
|
16
16
|
import type { MagicLinkJWTClaims } from '../auth/magicLink/types.js';
|
|
17
17
|
|
|
18
18
|
/**
|
|
@@ -46,7 +46,7 @@ export interface WidgetInstanceEligibilityInput {
|
|
|
46
46
|
* comma-separated string (tolerated). Returns an empty array for null/blank/garbage
|
|
47
47
|
* — which makes the allowlist FAIL-CLOSED (no origin is allowed) by construction.
|
|
48
48
|
*/
|
|
49
|
-
export function
|
|
49
|
+
export function ParseAllowedOrigins(allowedOrigins: string | null | undefined): string[] {
|
|
50
50
|
const raw = allowedOrigins?.trim();
|
|
51
51
|
if (!raw) {
|
|
52
52
|
return [];
|
|
@@ -64,6 +64,11 @@ export function parseAllowedOrigins(allowedOrigins: string | null | undefined):
|
|
|
64
64
|
return list.filter((s): s is string => typeof s === 'string').map(normalizeOrigin).filter((s): s is string => !!s);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
/** @deprecated Use {@link ParseAllowedOrigins}. */
|
|
68
|
+
export function parseAllowedOrigins(allowedOrigins: string | null | undefined): string[] {
|
|
69
|
+
return ParseAllowedOrigins(allowedOrigins);
|
|
70
|
+
}
|
|
71
|
+
|
|
67
72
|
/** Lowercases + trims an origin and strips a trailing slash for stable comparison. */
|
|
68
73
|
function normalizeOrigin(origin: string): string {
|
|
69
74
|
return origin.trim().toLowerCase().replace(/\/+$/, '');
|
|
@@ -74,7 +79,7 @@ function normalizeOrigin(origin: string): string {
|
|
|
74
79
|
* JSON array (preferred, e.g. `["Whiteboard"]`) or a comma-separated string (tolerated). Returns an
|
|
75
80
|
* empty array for null/blank/garbage — the backwards-compatible default (no channels attached).
|
|
76
81
|
*/
|
|
77
|
-
export function
|
|
82
|
+
export function ParseEnabledChannels(enabledChannels: string | null | undefined): string[] {
|
|
78
83
|
const raw = enabledChannels?.trim();
|
|
79
84
|
if (!raw) {
|
|
80
85
|
return [];
|
|
@@ -89,12 +94,17 @@ export function parseEnabledChannels(enabledChannels: string | null | undefined)
|
|
|
89
94
|
}
|
|
90
95
|
}
|
|
91
96
|
|
|
97
|
+
/** @deprecated Use {@link ParseEnabledChannels}. */
|
|
98
|
+
export function parseEnabledChannels(enabledChannels: string | null | undefined): string[] {
|
|
99
|
+
return ParseEnabledChannels(enabledChannels);
|
|
100
|
+
}
|
|
101
|
+
|
|
92
102
|
/**
|
|
93
103
|
* FAIL-CLOSED origin check. The request's `Origin` header must exactly match one of
|
|
94
104
|
* the widget's allowed origins (after normalization). A missing request origin, or
|
|
95
105
|
* an empty allowlist, is rejected — a public mint endpoint must never accept "*".
|
|
96
106
|
*/
|
|
97
|
-
export function
|
|
107
|
+
export function IsOriginAllowed(requestOrigin: string | null | undefined, allowedOrigins: readonly string[]): boolean {
|
|
98
108
|
if (!requestOrigin || allowedOrigins.length === 0) {
|
|
99
109
|
return false;
|
|
100
110
|
}
|
|
@@ -102,8 +112,13 @@ export function isOriginAllowed(requestOrigin: string | null | undefined, allowe
|
|
|
102
112
|
return allowedOrigins.some((o) => o === candidate);
|
|
103
113
|
}
|
|
104
114
|
|
|
115
|
+
/** @deprecated Use {@link IsOriginAllowed}. */
|
|
116
|
+
export function isOriginAllowed(requestOrigin: string | null | undefined, allowedOrigins: readonly string[]): boolean {
|
|
117
|
+
return IsOriginAllowed(requestOrigin, allowedOrigins);
|
|
118
|
+
}
|
|
119
|
+
|
|
105
120
|
/** True when the requested modality (or the widget's default render) is enabled by the instance. */
|
|
106
|
-
export function
|
|
121
|
+
export function IsModalityEnabled(widgetModality: string, requested: 'Text' | 'Voice'): boolean {
|
|
107
122
|
const m = widgetModality.trim().toLowerCase();
|
|
108
123
|
if (m === 'both') {
|
|
109
124
|
return true;
|
|
@@ -111,25 +126,38 @@ export function isModalityEnabled(widgetModality: string, requested: 'Text' | 'V
|
|
|
111
126
|
return m === requested.toLowerCase();
|
|
112
127
|
}
|
|
113
128
|
|
|
129
|
+
/** @deprecated Use {@link IsModalityEnabled}. */
|
|
130
|
+
export function isModalityEnabled(widgetModality: string, requested: 'Text' | 'Voice'): boolean {
|
|
131
|
+
return IsModalityEnabled(widgetModality, requested);
|
|
132
|
+
}
|
|
133
|
+
|
|
114
134
|
/**
|
|
115
135
|
* Pure eligibility check for a mint: the widget must be Active and the request's
|
|
116
136
|
* origin must be on the allowlist. Returns an error code on the first failure so the
|
|
117
137
|
* router can map it to a precise HTTP status. Modality is checked separately by the
|
|
118
138
|
* voice path (W4) since a text mint is always permitted for an enabled widget.
|
|
119
139
|
*/
|
|
120
|
-
export function
|
|
140
|
+
export function EvaluateWidgetMint(
|
|
121
141
|
widget: WidgetInstanceEligibilityInput,
|
|
122
142
|
requestOrigin: string | null | undefined,
|
|
123
143
|
): { ok: boolean; errorCode?: WidgetMintErrorCode } {
|
|
124
144
|
if (widget.Status.trim().toLowerCase() !== 'active') {
|
|
125
145
|
return { ok: false, errorCode: 'disabled' };
|
|
126
146
|
}
|
|
127
|
-
if (!
|
|
147
|
+
if (!IsOriginAllowed(requestOrigin, ParseAllowedOrigins(widget.AllowedOrigins))) {
|
|
128
148
|
return { ok: false, errorCode: 'origin_not_allowed' };
|
|
129
149
|
}
|
|
130
150
|
return { ok: true };
|
|
131
151
|
}
|
|
132
152
|
|
|
153
|
+
/** @deprecated Use {@link EvaluateWidgetMint}. */
|
|
154
|
+
export function evaluateWidgetMint(
|
|
155
|
+
widget: WidgetInstanceEligibilityInput,
|
|
156
|
+
requestOrigin: string | null | undefined,
|
|
157
|
+
): { ok: boolean; errorCode?: WidgetMintErrorCode } {
|
|
158
|
+
return EvaluateWidgetMint(widget, requestOrigin);
|
|
159
|
+
}
|
|
160
|
+
|
|
133
161
|
/**
|
|
134
162
|
* Known automated-client User-Agent substrings (lowercased). A public mint endpoint is a cheap
|
|
135
163
|
* target for crawlers and scripted abuse; this catches the obvious non-browser callers. It is a
|
|
@@ -148,7 +176,7 @@ const BOT_USER_AGENT_MARKERS = [
|
|
|
148
176
|
* known automation marker. Deliberately conservative to avoid false positives on real browsers; pair
|
|
149
177
|
* with the origin allowlist + rate limits, which are the hard controls.
|
|
150
178
|
*/
|
|
151
|
-
export function
|
|
179
|
+
export function LooksLikeBot(userAgent: string | null | undefined): boolean {
|
|
152
180
|
const ua = (userAgent ?? '').trim().toLowerCase();
|
|
153
181
|
if (!ua) {
|
|
154
182
|
return true;
|
|
@@ -156,6 +184,11 @@ export function looksLikeBot(userAgent: string | null | undefined): boolean {
|
|
|
156
184
|
return BOT_USER_AGENT_MARKERS.some((marker) => ua.includes(marker));
|
|
157
185
|
}
|
|
158
186
|
|
|
187
|
+
/** @deprecated Use {@link LooksLikeBot}. */
|
|
188
|
+
export function looksLikeBot(userAgent: string | null | undefined): boolean {
|
|
189
|
+
return LooksLikeBot(userAgent);
|
|
190
|
+
}
|
|
191
|
+
|
|
159
192
|
/**
|
|
160
193
|
* Builds the guest-session JWT claims for a widget visitor. Reuses magic-link's
|
|
161
194
|
* `buildSessionClaims` (anonymous mode → the shared Anonymous principal + claims-based
|
|
@@ -163,7 +196,7 @@ export function looksLikeBot(userAgent: string | null | undefined): boolean {
|
|
|
163
196
|
* principal is locked to one widget instance. The role name carried here is the
|
|
164
197
|
* widget's restricted guest role (D5 backstop).
|
|
165
198
|
*/
|
|
166
|
-
export function
|
|
199
|
+
export function BuildWidgetGuestClaims(args: {
|
|
167
200
|
issuer: string;
|
|
168
201
|
audience: string;
|
|
169
202
|
widgetId: string;
|
|
@@ -191,7 +224,7 @@ export function buildWidgetGuestClaims(args: {
|
|
|
191
224
|
linkedRecordId?: string;
|
|
192
225
|
};
|
|
193
226
|
}): MagicLinkJWTClaims {
|
|
194
|
-
const claims =
|
|
227
|
+
const claims = BuildSessionClaims({
|
|
195
228
|
issuer: args.issuer,
|
|
196
229
|
audience: args.audience,
|
|
197
230
|
// No invite row for a direct-mint guest; the opaque session id stands in as the
|
|
@@ -229,3 +262,35 @@ export function buildWidgetGuestClaims(args: {
|
|
|
229
262
|
}
|
|
230
263
|
return claims;
|
|
231
264
|
}
|
|
265
|
+
|
|
266
|
+
/** @deprecated Use {@link BuildWidgetGuestClaims}. */
|
|
267
|
+
export function buildWidgetGuestClaims(args: {
|
|
268
|
+
issuer: string;
|
|
269
|
+
audience: string;
|
|
270
|
+
widgetId: string;
|
|
271
|
+
sessionId: string;
|
|
272
|
+
anonymousEmail: string;
|
|
273
|
+
applicationId: string;
|
|
274
|
+
guestRoleName: string;
|
|
275
|
+
nowSeconds: number;
|
|
276
|
+
ttlSeconds: number;
|
|
277
|
+
/**
|
|
278
|
+
* Host-asserted identity for a `host-identity` session. Its email/name are carried as
|
|
279
|
+
* INFORMATIONAL claims only — the principal-resolving `email`/`sub` remain the shared
|
|
280
|
+
* Anonymous principal, so a host can never escalate a guest into a real account.
|
|
281
|
+
*/
|
|
282
|
+
hostIdentity?: { email: string; firstName?: string; lastName?: string };
|
|
283
|
+
/**
|
|
284
|
+
* Returning-visitor anchor + linked identity (RV1/RV2/RV4) carried as claims so the VOICE path
|
|
285
|
+
* (server-created conversation) stamps the same fields the text path stamps client-side. Set only
|
|
286
|
+
* when the widget remembers returning visitors. Omitted ⇒ no returning-visitor claims (default off).
|
|
287
|
+
*/
|
|
288
|
+
returningVisitor?: {
|
|
289
|
+
visitorKey?: string;
|
|
290
|
+
lastConversationId?: string;
|
|
291
|
+
linkedEntityId?: string;
|
|
292
|
+
linkedRecordId?: string;
|
|
293
|
+
};
|
|
294
|
+
}): MagicLinkJWTClaims {
|
|
295
|
+
return BuildWidgetGuestClaims(args);
|
|
296
|
+
}
|
|
@@ -22,19 +22,19 @@ const WIDGET_ENTITY = 'MJ: Conversation Widget Instances';
|
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Resolved elevation context for a widget-guest agent run. Returned only when the request is a
|
|
25
|
-
* widget guest; the dispatch resolver runs the agent under {@link WidgetGuestRunContext.
|
|
26
|
-
* with {@link WidgetGuestRunContext.
|
|
25
|
+
* widget guest; the dispatch resolver runs the agent under {@link WidgetGuestRunContext.ElevatedUser}
|
|
26
|
+
* with {@link WidgetGuestRunContext.PinnedAgentId} (authoritative), keeping ownership checks under
|
|
27
27
|
* the guest principal.
|
|
28
28
|
*/
|
|
29
29
|
export interface WidgetGuestRunContext {
|
|
30
30
|
/** The trusted server principal under which the agent run (and its run-entity writes) executes. */
|
|
31
|
-
|
|
31
|
+
ElevatedUser: UserInfo;
|
|
32
32
|
/** The widget instance the guest session is bound to (authoritative config). */
|
|
33
|
-
|
|
33
|
+
Widget: MJConversationWidgetInstanceEntity;
|
|
34
34
|
/** The authoritative pinned support agent id — overrides any client-supplied agent id (D5). */
|
|
35
|
-
|
|
35
|
+
PinnedAgentId: string;
|
|
36
36
|
/** The guest's per-session scope id (Conversation.ExternalID), used to validate conversation ownership. */
|
|
37
|
-
|
|
37
|
+
SessionScopeId?: string;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
@@ -47,7 +47,7 @@ export interface WidgetGuestRunContext {
|
|
|
47
47
|
* Never throws: a resolution failure (no system user, widget not found, read error) returns `null`,
|
|
48
48
|
* so the caller falls back to the normal (guest-principal) path rather than failing the request.
|
|
49
49
|
*/
|
|
50
|
-
export async function
|
|
50
|
+
export async function ResolveWidgetGuestRunContext(
|
|
51
51
|
userPayload: UserPayload,
|
|
52
52
|
provider: DatabaseProviderBase,
|
|
53
53
|
): Promise<WidgetGuestRunContext | null> {
|
|
@@ -70,13 +70,21 @@ export async function resolveWidgetGuestRunContext(
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
return {
|
|
73
|
-
elevatedUser,
|
|
74
|
-
widget,
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
ElevatedUser: elevatedUser,
|
|
74
|
+
Widget: widget,
|
|
75
|
+
PinnedAgentId: widget.PinnedAgentID,
|
|
76
|
+
SessionScopeId: guest.MagicLinkScope?.ResourceID,
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
/** @deprecated Use {@link ResolveWidgetGuestRunContext}. */
|
|
81
|
+
export async function resolveWidgetGuestRunContext(
|
|
82
|
+
userPayload: UserPayload,
|
|
83
|
+
provider: DatabaseProviderBase,
|
|
84
|
+
): Promise<WidgetGuestRunContext | null> {
|
|
85
|
+
return ResolveWidgetGuestRunContext(userPayload, provider);
|
|
86
|
+
}
|
|
87
|
+
|
|
80
88
|
/**
|
|
81
89
|
* Returns the identity a realtime session's AI-RUN-ENTITY work (delegated tool dispatch +
|
|
82
90
|
* observability run creation/append/finalize) should execute as: the trusted SYSTEM principal when
|
|
@@ -123,7 +131,7 @@ export function ResolveScopedAnonymousRunUser(contextUser: UserInfo): UserInfo {
|
|
|
123
131
|
* preserving the guest's `sessionId` — so progress/streaming PubSub still routes to the guest's
|
|
124
132
|
* live websocket, but all AI run-entity writes happen under the trusted server principal.
|
|
125
133
|
*/
|
|
126
|
-
export function
|
|
134
|
+
export function ElevateUserPayload(userPayload: UserPayload, elevatedUser: UserInfo): UserPayload {
|
|
127
135
|
return {
|
|
128
136
|
...userPayload,
|
|
129
137
|
email: elevatedUser.Email,
|
|
@@ -132,6 +140,11 @@ export function elevateUserPayload(userPayload: UserPayload, elevatedUser: UserI
|
|
|
132
140
|
};
|
|
133
141
|
}
|
|
134
142
|
|
|
143
|
+
/** @deprecated Use {@link ElevateUserPayload}. */
|
|
144
|
+
export function elevateUserPayload(userPayload: UserPayload, elevatedUser: UserInfo): UserPayload {
|
|
145
|
+
return ElevateUserPayload(userPayload, elevatedUser);
|
|
146
|
+
}
|
|
147
|
+
|
|
135
148
|
/** Loads a single widget instance by id under the elevated principal (read-only). */
|
|
136
149
|
async function loadWidgetById(
|
|
137
150
|
widgetId: string,
|
|
@@ -7,7 +7,7 @@ import { GetReadOnlyDataSource, GetReadOnlyProvider } from '../util.js';
|
|
|
7
7
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
8
8
|
import { IsScopeLimitedPrincipal } from '../auth/scopeLimitedPrincipal.js';
|
|
9
9
|
import { RunQueryResultType } from './QueryResolver.js';
|
|
10
|
-
import {
|
|
10
|
+
import { ExactTotalFromPage, ResolveAdhocTotalRowCount } from './adhoc-query-helpers.js';
|
|
11
11
|
import sql from 'mssql';
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -200,7 +200,7 @@ export class AdhocQueryResolver extends ResolverBase {
|
|
|
200
200
|
const recordset = (dataResult.recordset ?? []) as Record<string, unknown>[];
|
|
201
201
|
|
|
202
202
|
// Total already known from the page alone (unpaged, or a short page)? Skip the count.
|
|
203
|
-
const exact =
|
|
203
|
+
const exact = ExactTotalFromPage(startRow, recordset.length, maxRows);
|
|
204
204
|
if (exact != null || !countSQL) {
|
|
205
205
|
return { recordset, totalRowCount: exact ?? recordset.length };
|
|
206
206
|
}
|
|
@@ -209,7 +209,7 @@ export class AdhocQueryResolver extends ResolverBase {
|
|
|
209
209
|
const lowerBound = startRow + recordset.length;
|
|
210
210
|
try {
|
|
211
211
|
const countResult = await this.runSqlWithDeadline<{ TotalRowCount: number }>(ds, countSQL, deadline);
|
|
212
|
-
return { recordset, totalRowCount:
|
|
212
|
+
return { recordset, totalRowCount: ResolveAdhocTotalRowCount(countResult.recordset, lowerBound) };
|
|
213
213
|
} catch (countErr) {
|
|
214
214
|
const msg = countErr instanceof Error ? countErr.message : String(countErr);
|
|
215
215
|
LogError(`Ad-hoc query row-count failed; reporting a lower-bound total (${lowerBound}). ${msg}`);
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Publishes one agent run's live status on the caller's session.
|
|
3
|
+
*
|
|
4
|
+
* `RunAIAgentResolver` uses this for every status it sends. A host whose
|
|
5
|
+
* `AgentTurnHandler` answers with an In-Progress reply uses the same publisher,
|
|
6
|
+
* on that caller's session, so the chat follows the turn: significant-step
|
|
7
|
+
* progress, streamed text, the partial result, and the completion. When the
|
|
8
|
+
* turn throws instead of returning a result, call `PublishFailure` with the
|
|
9
|
+
* reply row's id and the error.
|
|
10
|
+
*/
|
|
11
|
+
import type { PubSubEngine } from 'type-graphql';
|
|
12
|
+
import type {
|
|
13
|
+
AgentExecutionProgressCallback,
|
|
14
|
+
AgentExecutionStreamingCallback,
|
|
15
|
+
ExecuteAgentResult,
|
|
16
|
+
} from '@memberjunction/ai-core-plus';
|
|
17
|
+
import type { UserPayload } from '../types.js';
|
|
18
|
+
import { PublishStatusUpdate } from '../generic/PushStatusResolver.js';
|
|
19
|
+
|
|
20
|
+
const SIGNIFICANT_STEPS = ['prompt_execution', 'action_execution', 'subagent_execution', 'decision_processing'];
|
|
21
|
+
|
|
22
|
+
/** The run fields the published messages read. Entities and test fakes both satisfy this. */
|
|
23
|
+
interface StatusRun {
|
|
24
|
+
ID?: string;
|
|
25
|
+
ConversationDetailID?: string;
|
|
26
|
+
ErrorMessage?: string;
|
|
27
|
+
Steps?: Array<{ StepName?: string }>;
|
|
28
|
+
GetAll?: () => unknown;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class AgentRunStatusPublisher {
|
|
32
|
+
private run: StatusRun | null = null;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @param sessionId Session stamped on the message body. Defaults to the payload's session.
|
|
36
|
+
* The push itself is always addressed to `userPayload.sessionId`, matching the resolver.
|
|
37
|
+
*/
|
|
38
|
+
constructor(
|
|
39
|
+
private readonly pubSub: PubSubEngine,
|
|
40
|
+
private readonly userPayload: UserPayload,
|
|
41
|
+
private readonly sessionId: string = userPayload.sessionId,
|
|
42
|
+
) {}
|
|
43
|
+
|
|
44
|
+
/** Latest run observed from a progress event, including steps that are not published. */
|
|
45
|
+
public get AgentRun(): StatusRun | null {
|
|
46
|
+
return this.run;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** AgentRunner's progress callback. Noise steps are kept for {@link AgentRun} and not published. */
|
|
50
|
+
public get OnProgress(): AgentExecutionProgressCallback {
|
|
51
|
+
return (progress) => {
|
|
52
|
+
const fromEvent = progress.metadata?.agentRun as StatusRun | undefined;
|
|
53
|
+
if (fromEvent) {
|
|
54
|
+
this.run = fromEvent;
|
|
55
|
+
}
|
|
56
|
+
if (!SIGNIFICANT_STEPS.includes(progress.step)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const agentRun = fromEvent || this.run;
|
|
60
|
+
if (!agentRun?.ID) {
|
|
61
|
+
// A host that streams before the first progress event otherwise sees nothing and no reason.
|
|
62
|
+
console.error('❌ No agent run available for progress callback');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.publish('ExecutionProgress', {
|
|
66
|
+
sessionId: this.sessionId,
|
|
67
|
+
agentRunId: agentRun.ID,
|
|
68
|
+
type: 'progress',
|
|
69
|
+
agentRun: agentRun.GetAll ? agentRun.GetAll() : agentRun,
|
|
70
|
+
progress: {
|
|
71
|
+
currentStep: progress.step,
|
|
72
|
+
percentage: progress.percentage,
|
|
73
|
+
message: progress.message,
|
|
74
|
+
agentName: progress.metadata?.agentName,
|
|
75
|
+
agentType: progress.metadata?.agentType,
|
|
76
|
+
stepCount: progress.metadata?.stepCount,
|
|
77
|
+
hierarchicalStep: progress.metadata?.hierarchicalStep,
|
|
78
|
+
},
|
|
79
|
+
timestamp: new Date(),
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** AgentRunner's streaming callback. Publishes nothing until a progress event has carried the run. */
|
|
85
|
+
public get OnStreaming(): AgentExecutionStreamingCallback {
|
|
86
|
+
return (chunk) => {
|
|
87
|
+
const agentRun = this.run;
|
|
88
|
+
if (!agentRun?.ID) {
|
|
89
|
+
console.error('❌ No agent run available for streaming callback');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.publish('StreamingContent', {
|
|
93
|
+
sessionId: this.sessionId,
|
|
94
|
+
agentRunId: agentRun.ID,
|
|
95
|
+
type: 'streaming',
|
|
96
|
+
agentRun: agentRun.GetAll ? agentRun.GetAll() : agentRun,
|
|
97
|
+
streaming: {
|
|
98
|
+
content: chunk.content,
|
|
99
|
+
isPartial: !chunk.isComplete,
|
|
100
|
+
stepName: chunk.stepType,
|
|
101
|
+
agentName: chunk.modelName,
|
|
102
|
+
kind: chunk.kind,
|
|
103
|
+
},
|
|
104
|
+
timestamp: new Date(),
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The partial result, then the completion. `conversationDetailId` is the reply row the
|
|
111
|
+
* chat should update. When omitted, the completion uses the run's own detail id.
|
|
112
|
+
*/
|
|
113
|
+
public PublishFinal(result: ExecuteAgentResult, conversationDetailId?: string, resultJson?: string): void {
|
|
114
|
+
const agentRun = result.agentRun as StatusRun | undefined;
|
|
115
|
+
if (agentRun?.ID) {
|
|
116
|
+
let lastStep = 'Completed';
|
|
117
|
+
const steps = agentRun.Steps;
|
|
118
|
+
if (steps && steps.length > 0) {
|
|
119
|
+
lastStep = steps[steps.length - 1]?.StepName || 'Completed';
|
|
120
|
+
}
|
|
121
|
+
this.publish('StreamingContent', {
|
|
122
|
+
sessionId: this.sessionId,
|
|
123
|
+
agentRunId: agentRun.ID,
|
|
124
|
+
type: 'partial_result',
|
|
125
|
+
partialResult: {
|
|
126
|
+
currentStep: lastStep,
|
|
127
|
+
partialOutput: result.payload || undefined,
|
|
128
|
+
},
|
|
129
|
+
timestamp: new Date(),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
this.publish('StreamingContent', {
|
|
133
|
+
sessionId: this.sessionId,
|
|
134
|
+
agentRunId: agentRun?.ID || 'unknown',
|
|
135
|
+
type: 'complete',
|
|
136
|
+
timestamp: new Date(),
|
|
137
|
+
conversationDetailId: conversationDetailId || agentRun?.ConversationDetailID,
|
|
138
|
+
success: result.success,
|
|
139
|
+
errorMessage: agentRun?.ErrorMessage || undefined,
|
|
140
|
+
result: resultJson || undefined,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Completion for a failure that has no run. The fire-and-forget path uses this when
|
|
146
|
+
* `executeAIAgent` rejects. A host uses it the same way: when the turn throws
|
|
147
|
+
* instead of returning a result, call `PublishFailure` with the reply row's id
|
|
148
|
+
* and the error. That completion is what tells the chat the reply finished.
|
|
149
|
+
*/
|
|
150
|
+
public PublishFailure(conversationDetailId: string | undefined, errorMessage: string): void {
|
|
151
|
+
this.publish('StreamingContent', {
|
|
152
|
+
sessionId: this.sessionId,
|
|
153
|
+
agentRunId: 'unknown',
|
|
154
|
+
type: 'complete',
|
|
155
|
+
timestamp: new Date(),
|
|
156
|
+
conversationDetailId,
|
|
157
|
+
success: false,
|
|
158
|
+
errorMessage,
|
|
159
|
+
result: JSON.stringify({ success: false, errorMessage }),
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private publish(type: 'ExecutionProgress' | 'StreamingContent', data: unknown): void {
|
|
164
|
+
PublishStatusUpdate(this.pubSub, {
|
|
165
|
+
sessionId: this.userPayload.sessionId,
|
|
166
|
+
ownerUserId: this.userPayload?.userRecord?.ID ?? '',
|
|
167
|
+
message: JSON.stringify({
|
|
168
|
+
resolver: 'RunAIAgentResolver',
|
|
169
|
+
type,
|
|
170
|
+
status: 'ok',
|
|
171
|
+
data,
|
|
172
|
+
}),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -25,15 +25,15 @@ import { SessionManager, SessionAuthorizationError } from '../agentSessions/inde
|
|
|
25
25
|
export class StartAgentSessionResult {
|
|
26
26
|
/** ID of the newly created session. */
|
|
27
27
|
@Field()
|
|
28
|
-
agentSessionId: string;
|
|
28
|
+
agentSessionId: string; // 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
|
/** Lifecycle status of the session (always `Active` on a successful start). */
|
|
31
31
|
@Field()
|
|
32
|
-
status: string;
|
|
32
|
+
status: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
33
33
|
|
|
34
34
|
/** ID of the conversation the session is attached to (supplied or freshly created). */
|
|
35
35
|
@Field()
|
|
36
|
-
conversationId: string;
|
|
36
|
+
conversationId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
@@ -10,22 +10,22 @@ export class Color {
|
|
|
10
10
|
|
|
11
11
|
@Field(() => String)
|
|
12
12
|
@Public()
|
|
13
|
-
name: string;
|
|
13
|
+
name: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
14
14
|
|
|
15
15
|
@Field(() => String)
|
|
16
16
|
@Public()
|
|
17
|
-
createdZ: string;
|
|
17
|
+
createdZ: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
@ObjectType()
|
|
21
21
|
export class ColorNotification {
|
|
22
22
|
@Public()
|
|
23
23
|
@Field(() => String, { nullable: true })
|
|
24
|
-
message?: string;
|
|
24
|
+
message?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
25
25
|
|
|
26
26
|
@Public()
|
|
27
27
|
@Field((_type) => Date)
|
|
28
|
-
date!: Date;
|
|
28
|
+
date!: Date; // 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
|
|
|
31
31
|
export interface ColorNotificationPayload {
|
|
@@ -36,13 +36,13 @@ export interface ColorNotificationPayload {
|
|
|
36
36
|
export class ColorResolver {
|
|
37
37
|
@Subscription(() => ColorNotification, { topics: 'COLOR' })
|
|
38
38
|
@Public()
|
|
39
|
-
colorSubscription(@Root() { message }: ColorNotificationPayload): ColorNotification {
|
|
39
|
+
colorSubscription(@Root() { message }: ColorNotificationPayload): ColorNotification { // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
40
40
|
return { message, date: new Date() };
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
@Query(() => [Color])
|
|
44
44
|
@Public()
|
|
45
|
-
async colors(@Ctx() _ctx: AppContext, @PubSub() pubSub: PubSubEngine) {
|
|
45
|
+
async colors(@Ctx() _ctx: AppContext, @PubSub() pubSub: PubSubEngine) { // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
46
46
|
const createdZ = new Date().toISOString();
|
|
47
47
|
|
|
48
48
|
pubSub.publish('COLOR', {
|