@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
|
@@ -4,14 +4,15 @@ import { DatabaseProviderBase, LogError, LogStatus, Metadata, RunView, UserInfo,
|
|
|
4
4
|
import { MJConversationDetailEntity, MJConversationDetailAttachmentEntity, MJConversationDetailArtifactEntity, MJArtifactVersionEntity, MJAIAgentRequestEntity, ArtifactMetadataEngine, ConversationEngine } from '@memberjunction/core-entities';
|
|
5
5
|
import { RouteArtifact } from './artifact-routing.js';
|
|
6
6
|
import { AgentRunner, ArtifactToolManager } from '@memberjunction/ai-agents';
|
|
7
|
-
import { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended, ExecuteAgentResult, ConversationUtility, AttachmentData
|
|
7
|
+
import { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended, ExecuteAgentResult, ConversationUtility, AttachmentData } from '@memberjunction/ai-core-plus';
|
|
8
8
|
import { AIEngine } from '@memberjunction/aiengine';
|
|
9
9
|
import { ChatMessage, ChatMessageContent } from '@memberjunction/ai';
|
|
10
10
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
11
|
-
import {
|
|
11
|
+
import { AgentRunStatusPublisher } from './AgentRunStatusPublisher.js';
|
|
12
|
+
import { StartLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
|
|
12
13
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
13
14
|
import { GetReadWriteProvider } from '../util.js';
|
|
14
|
-
import {
|
|
15
|
+
import { ResolveWidgetGuestRunContext, ElevateUserPayload } from '../realtimeWidget/widgetGuestElevation.js';
|
|
15
16
|
import { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';
|
|
16
17
|
import { GetAttachmentService } from '@memberjunction/aiengine';
|
|
17
18
|
import { NotificationEngine } from '@memberjunction/notifications';
|
|
@@ -25,58 +26,63 @@ import { NotificationEngine } from '@memberjunction/notifications';
|
|
|
25
26
|
*/
|
|
26
27
|
const INLINE_SIZE_CAP = 100 * 1024;
|
|
27
28
|
|
|
29
|
+
/** Progress metadata is an untyped bag. A run is an object that carries an ID field. */
|
|
30
|
+
function isAgentRunEntity(value: unknown): value is MJAIAgentRunEntityExtended {
|
|
31
|
+
return typeof value === 'object' && value !== null && 'ID' in value;
|
|
32
|
+
}
|
|
33
|
+
|
|
28
34
|
@ObjectType()
|
|
29
35
|
export class AIAgentRunResult {
|
|
30
36
|
@Field()
|
|
31
|
-
success: boolean;
|
|
37
|
+
success: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
32
38
|
|
|
33
39
|
@Field({ nullable: true })
|
|
34
|
-
errorMessage?: string;
|
|
40
|
+
errorMessage?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
35
41
|
|
|
36
42
|
@Field({ nullable: true })
|
|
37
|
-
executionTimeMs?: number;
|
|
43
|
+
executionTimeMs?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
38
44
|
|
|
39
45
|
@Field()
|
|
40
|
-
result: string; // JSON serialized ExecuteAgentResult with scalars only
|
|
46
|
+
result: string; // JSON serialized ExecuteAgentResult with scalars only — case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
@ObjectType()
|
|
44
50
|
export class AgentExecutionProgress {
|
|
45
51
|
@Field()
|
|
46
|
-
currentStep: string;
|
|
52
|
+
currentStep: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
47
53
|
|
|
48
54
|
@Field({ nullable: true })
|
|
49
|
-
percentage?: number;
|
|
55
|
+
percentage?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
50
56
|
|
|
51
57
|
@Field()
|
|
52
|
-
message: string;
|
|
58
|
+
message: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
53
59
|
|
|
54
60
|
@Field({ nullable: true })
|
|
55
|
-
agentName?: string;
|
|
61
|
+
agentName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
56
62
|
|
|
57
63
|
@Field({ nullable: true })
|
|
58
|
-
agentType?: string;
|
|
64
|
+
agentType?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
59
65
|
|
|
60
66
|
@Field({ nullable: true })
|
|
61
|
-
stepCount?: number;
|
|
67
|
+
stepCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
62
68
|
|
|
63
69
|
@Field({ nullable: true })
|
|
64
|
-
hierarchicalStep?: string;
|
|
70
|
+
hierarchicalStep?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
65
71
|
}
|
|
66
72
|
|
|
67
73
|
@ObjectType()
|
|
68
74
|
export class AgentStreamingContent {
|
|
69
75
|
@Field()
|
|
70
|
-
content: string;
|
|
76
|
+
content: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
71
77
|
|
|
72
78
|
@Field()
|
|
73
|
-
isPartial: boolean;
|
|
79
|
+
isPartial: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
74
80
|
|
|
75
81
|
@Field({ nullable: true })
|
|
76
|
-
stepName?: string;
|
|
82
|
+
stepName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
77
83
|
|
|
78
84
|
@Field({ nullable: true })
|
|
79
|
-
agentName?: string;
|
|
85
|
+
agentName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
80
86
|
|
|
81
87
|
/**
|
|
82
88
|
* Content discriminator passed through from the agent's streaming chunk (see
|
|
@@ -87,73 +93,73 @@ export class AgentStreamingContent {
|
|
|
87
93
|
* rendered by the conversation client.
|
|
88
94
|
*/
|
|
89
95
|
@Field({ nullable: true })
|
|
90
|
-
kind?: string;
|
|
96
|
+
kind?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
91
97
|
}
|
|
92
98
|
|
|
93
99
|
@ObjectType()
|
|
94
100
|
export class AgentExecutionStepSummary {
|
|
95
101
|
@Field()
|
|
96
|
-
stepId: string;
|
|
102
|
+
stepId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
97
103
|
|
|
98
104
|
@Field()
|
|
99
|
-
stepName: string;
|
|
105
|
+
stepName: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
100
106
|
|
|
101
107
|
@Field({ nullable: true })
|
|
102
|
-
agentName?: string;
|
|
108
|
+
agentName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
103
109
|
|
|
104
110
|
@Field({ nullable: true })
|
|
105
|
-
agentType?: string;
|
|
111
|
+
agentType?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
106
112
|
|
|
107
113
|
@Field()
|
|
108
|
-
startTime: Date;
|
|
114
|
+
startTime: Date; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
109
115
|
|
|
110
116
|
@Field({ nullable: true })
|
|
111
|
-
endTime?: Date;
|
|
117
|
+
endTime?: Date; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
112
118
|
|
|
113
119
|
@Field()
|
|
114
|
-
status: string;
|
|
120
|
+
status: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
115
121
|
|
|
116
122
|
@Field({ nullable: true })
|
|
117
|
-
result?: string;
|
|
123
|
+
result?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
118
124
|
}
|
|
119
125
|
|
|
120
126
|
@ObjectType()
|
|
121
127
|
export class AgentPartialResult {
|
|
122
128
|
@Field()
|
|
123
|
-
currentStep: string;
|
|
129
|
+
currentStep: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
124
130
|
|
|
125
131
|
@Field({ nullable: true })
|
|
126
|
-
partialOutput?: string;
|
|
132
|
+
partialOutput?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
127
133
|
}
|
|
128
134
|
|
|
129
135
|
@ObjectType()
|
|
130
136
|
export class AgentExecutionStreamMessage {
|
|
131
137
|
@Field(() => ID)
|
|
132
|
-
sessionId: string;
|
|
138
|
+
sessionId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
133
139
|
|
|
134
140
|
@Field(() => ID)
|
|
135
|
-
agentRunId: string;
|
|
141
|
+
agentRunId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
136
142
|
|
|
137
143
|
@Field()
|
|
138
|
-
type: 'progress' | 'streaming' | 'partial_result' | 'complete';
|
|
144
|
+
type: 'progress' | 'streaming' | 'partial_result' | 'complete'; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
139
145
|
|
|
140
146
|
@Field({ nullable: true })
|
|
141
|
-
progress?: AgentExecutionProgress;
|
|
147
|
+
progress?: AgentExecutionProgress; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
142
148
|
|
|
143
149
|
@Field({ nullable: true })
|
|
144
|
-
streaming?: AgentStreamingContent;
|
|
150
|
+
streaming?: AgentStreamingContent; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
145
151
|
|
|
146
152
|
@Field({ nullable: true })
|
|
147
|
-
partialResult?: AgentPartialResult;
|
|
153
|
+
partialResult?: AgentPartialResult; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
148
154
|
|
|
149
155
|
@Field()
|
|
150
|
-
timestamp: Date;
|
|
156
|
+
timestamp: Date; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
151
157
|
|
|
152
158
|
// Not a GraphQL field - used internally for streaming
|
|
153
|
-
agentRun?: any;
|
|
159
|
+
agentRun?: any; // case-violation-ok-legacy-back-compat: an accessor cannot be optional, so a stub would turn this into a required member
|
|
154
160
|
|
|
155
161
|
// Not a GraphQL field - used for completion routing to correct conversation detail
|
|
156
|
-
conversationDetailId?: string;
|
|
162
|
+
conversationDetailId?: string; // case-violation-ok-legacy-back-compat: an accessor cannot be optional, so a stub would turn this into a required member
|
|
157
163
|
}
|
|
158
164
|
|
|
159
165
|
|
|
@@ -249,111 +255,6 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
249
255
|
return agentEntity;
|
|
250
256
|
}
|
|
251
257
|
|
|
252
|
-
/**
|
|
253
|
-
* Create streaming progress callback
|
|
254
|
-
*/
|
|
255
|
-
private createProgressCallback(pubSub: PubSubEngine, sessionId: string, userPayload: UserPayload, agentRunRef: { current: any }) {
|
|
256
|
-
return (progress: any) => {
|
|
257
|
-
// Capture the agent run into the ref as soon as any progress event carries it (even
|
|
258
|
-
// "noise" steps), so the fire-and-forget liveness pulse can read its id/status mid-run
|
|
259
|
-
// rather than only after RunAgentInConversation returns.
|
|
260
|
-
if (progress.metadata?.agentRun) {
|
|
261
|
-
agentRunRef.current = progress.metadata.agentRun;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// Only publish progress for significant steps (not initialization noise)
|
|
265
|
-
const significantSteps = ['prompt_execution', 'action_execution', 'subagent_execution', 'decision_processing'];
|
|
266
|
-
if (!significantSteps.includes(progress.step)) {
|
|
267
|
-
console.log(`🔇 Skipping noise progress: ${progress.step}`);
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Get the agent run from the progress metadata or use the ref
|
|
272
|
-
const agentRun = progress.metadata?.agentRun || agentRunRef.current;
|
|
273
|
-
if (!agentRun) {
|
|
274
|
-
console.error('❌ No agent run available for progress callback');
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
console.log('📡 Publishing progress update:', {
|
|
279
|
-
step: progress.step,
|
|
280
|
-
percentage: progress.percentage,
|
|
281
|
-
message: progress.message,
|
|
282
|
-
sessionId,
|
|
283
|
-
agentRunId: agentRun.ID
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
// Publish progress updates with the full serialized agent run
|
|
287
|
-
const progressMsg: AgentExecutionStreamMessage = {
|
|
288
|
-
sessionId,
|
|
289
|
-
agentRunId: agentRun.ID,
|
|
290
|
-
type: 'progress',
|
|
291
|
-
agentRun: agentRun.GetAll(), // Serialize the full agent run
|
|
292
|
-
progress: {
|
|
293
|
-
currentStep: progress.step,
|
|
294
|
-
percentage: progress.percentage,
|
|
295
|
-
message: progress.message,
|
|
296
|
-
agentName: (progress.metadata as any)?.agentName || undefined,
|
|
297
|
-
agentType: (progress.metadata as any)?.agentType || undefined,
|
|
298
|
-
stepCount: (progress.metadata as any)?.stepCount || undefined,
|
|
299
|
-
hierarchicalStep: (progress.metadata as any)?.hierarchicalStep || undefined
|
|
300
|
-
},
|
|
301
|
-
timestamp: new Date()
|
|
302
|
-
};
|
|
303
|
-
this.PublishProgressUpdate(pubSub, progressMsg, userPayload);
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
private PublishProgressUpdate(pubSub: PubSubEngine, data: any, userPayload: UserPayload) {
|
|
308
|
-
this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
|
|
309
|
-
resolver: 'RunAIAgentResolver',
|
|
310
|
-
type: 'ExecutionProgress',
|
|
311
|
-
status: 'ok',
|
|
312
|
-
data,
|
|
313
|
-
}), userPayload);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
private PublishStreamingUpdate(pubSub: PubSubEngine, data: any, userPayload: UserPayload) {
|
|
318
|
-
this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
|
|
319
|
-
resolver: 'RunAIAgentResolver',
|
|
320
|
-
type: 'StreamingContent',
|
|
321
|
-
status: 'ok',
|
|
322
|
-
data,
|
|
323
|
-
}), userPayload);
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
/**
|
|
327
|
-
* Create streaming content callback
|
|
328
|
-
*/
|
|
329
|
-
private createStreamingCallback(pubSub: PubSubEngine, sessionId: string, userPayload: UserPayload, agentRunRef: { current: MJAIAgentRunEntityExtended | null }): AgentExecutionStreamingCallback {
|
|
330
|
-
return (chunk) => {
|
|
331
|
-
// Use the agent run from the ref
|
|
332
|
-
const agentRun = agentRunRef.current;
|
|
333
|
-
if (!agentRun) {
|
|
334
|
-
console.error('❌ No agent run available for streaming callback');
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
// Publish streaming content with the full serialized agent run
|
|
339
|
-
const streamMsg: AgentExecutionStreamMessage = {
|
|
340
|
-
sessionId,
|
|
341
|
-
agentRunId: agentRun.ID,
|
|
342
|
-
type: 'streaming',
|
|
343
|
-
agentRun: agentRun.GetAll(), // Include the full serialized agent run
|
|
344
|
-
streaming: {
|
|
345
|
-
content: chunk.content,
|
|
346
|
-
isPartial: !chunk.isComplete,
|
|
347
|
-
stepName: chunk.stepType,
|
|
348
|
-
agentName: chunk.modelName,
|
|
349
|
-
kind: chunk.kind
|
|
350
|
-
},
|
|
351
|
-
timestamp: new Date()
|
|
352
|
-
};
|
|
353
|
-
this.PublishStreamingUpdate(pubSub, streamMsg, userPayload);
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
|
|
357
258
|
/**
|
|
358
259
|
* Internal method that handles the core AI agent execution logic.
|
|
359
260
|
* This method is called by both the regular and system user resolvers.
|
|
@@ -389,7 +290,10 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
389
290
|
* The framework intersects them with the agent's accepted skills AND the user's Run permission. */
|
|
390
291
|
requestedSkillIDs?: string[],
|
|
391
292
|
/** JSON `{ paused?: boolean }` — seeds `$.debug` on a submitted task graph at insert. */
|
|
392
|
-
taskGraphDebug?: string
|
|
293
|
+
taskGraphDebug?: string,
|
|
294
|
+
/** History floor for a conversation run — threaded into ExecuteAgentParams.ConversationHistoryFrom,
|
|
295
|
+
* so the framework's own conversation reads (retrieval tools, artifacts, compaction) honour it too. */
|
|
296
|
+
conversationHistoryFrom?: Date
|
|
393
297
|
): Promise<AIAgentRunResult> {
|
|
394
298
|
const startTime = Date.now();
|
|
395
299
|
// Best-effort handle for persistInFlightAgentFailure. Populated from a
|
|
@@ -431,6 +335,11 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
431
335
|
|
|
432
336
|
console.log(`🚀 Starting agent execution with sessionId: ${sessionId}`);
|
|
433
337
|
|
|
338
|
+
// The publisher owns every status message. The resolver still copies the run into
|
|
339
|
+
// agentRunRef, including noise steps, for the fire-and-forget liveness pulse.
|
|
340
|
+
const statusPublisher = new AgentRunStatusPublisher(pubSub, userPayload, sessionId);
|
|
341
|
+
const publishProgress = statusPublisher.OnProgress;
|
|
342
|
+
|
|
434
343
|
// Execute the agent in conversation context - handles conversation, artifacts, etc.
|
|
435
344
|
const conversationResult = await agentRunner.RunAgentInConversation({
|
|
436
345
|
agent: agentEntity,
|
|
@@ -438,14 +347,21 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
438
347
|
payload: payload ? SafeJSONParse(payload) : undefined,
|
|
439
348
|
contextUser: currentUser,
|
|
440
349
|
sessionID: sessionId,
|
|
441
|
-
onProgress:
|
|
442
|
-
|
|
350
|
+
onProgress: (progress) => {
|
|
351
|
+
const fromEvent = progress.metadata?.agentRun;
|
|
352
|
+
if (isAgentRunEntity(fromEvent)) {
|
|
353
|
+
agentRunRef.current = fromEvent;
|
|
354
|
+
}
|
|
355
|
+
publishProgress(progress);
|
|
356
|
+
},
|
|
357
|
+
onStreaming: statusPublisher.OnStreaming,
|
|
443
358
|
lastRunId: lastRunId,
|
|
444
359
|
autoPopulateLastRunPayload: autoPopulateLastRunPayload,
|
|
445
360
|
configurationId: configurationId,
|
|
446
361
|
planMode: planMode,
|
|
447
362
|
requestedSkillIDs: requestedSkillIDs,
|
|
448
363
|
taskGraphDebug: parseTaskGraphDebug(taskGraphDebug),
|
|
364
|
+
ConversationHistoryFrom: conversationHistoryFrom,
|
|
449
365
|
data: parsedData,
|
|
450
366
|
context: {
|
|
451
367
|
dataSource: dataSource
|
|
@@ -522,7 +438,7 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
522
438
|
const returnResult = JSON.stringify(sanitizedResult);
|
|
523
439
|
|
|
524
440
|
// Publish final events with enriched result data for fire-and-forget clients
|
|
525
|
-
|
|
441
|
+
statusPublisher.PublishFinal(result, result.agentRun?.ConversationDetailID, returnResult);
|
|
526
442
|
|
|
527
443
|
// Log completion
|
|
528
444
|
if (result.success) {
|
|
@@ -598,7 +514,10 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
598
514
|
detail.Message = errorMessage;
|
|
599
515
|
detail.Error = errorMessage;
|
|
600
516
|
if (!(await detail.Save())) {
|
|
601
|
-
LogError(
|
|
517
|
+
LogError(
|
|
518
|
+
`Failed to persist Error on conversation detail ${conversationDetailId}: ` +
|
|
519
|
+
`${detail.LatestResult?.CompleteMessage?.trim() || 'no failure detail recorded'}`,
|
|
520
|
+
);
|
|
602
521
|
}
|
|
603
522
|
}
|
|
604
523
|
}
|
|
@@ -607,58 +526,6 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
607
526
|
}
|
|
608
527
|
}
|
|
609
528
|
|
|
610
|
-
/**
|
|
611
|
-
* Publish final streaming events (partial result and completion).
|
|
612
|
-
* The completion event includes the full result JSON so clients using
|
|
613
|
-
* fire-and-forget mode can receive the result via WebSocket.
|
|
614
|
-
*/
|
|
615
|
-
private publishFinalEvents(
|
|
616
|
-
pubSub: PubSubEngine,
|
|
617
|
-
sessionId: string,
|
|
618
|
-
userPayload: UserPayload,
|
|
619
|
-
result: ExecuteAgentResult,
|
|
620
|
-
resultJson?: string
|
|
621
|
-
) {
|
|
622
|
-
if (result.agentRun) {
|
|
623
|
-
// Get the last step from agent run
|
|
624
|
-
let lastStep = 'Completed';
|
|
625
|
-
if (result.agentRun?.Steps && result.agentRun.Steps.length > 0) {
|
|
626
|
-
// Get the last step from the Steps array
|
|
627
|
-
const lastStepEntity = result.agentRun.Steps[result.agentRun.Steps.length - 1];
|
|
628
|
-
lastStep = lastStepEntity?.StepName || 'Completed';
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
// Publish partial result
|
|
632
|
-
const partialResult: AgentPartialResult = {
|
|
633
|
-
currentStep: lastStep,
|
|
634
|
-
partialOutput: result.payload || undefined
|
|
635
|
-
};
|
|
636
|
-
|
|
637
|
-
const partialMsg: AgentExecutionStreamMessage = {
|
|
638
|
-
sessionId,
|
|
639
|
-
agentRunId: result.agentRun.ID,
|
|
640
|
-
type: 'partial_result',
|
|
641
|
-
partialResult,
|
|
642
|
-
timestamp: new Date()
|
|
643
|
-
};
|
|
644
|
-
this.PublishStreamingUpdate(pubSub, partialMsg, userPayload);
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
// Publish completion with conversationDetailId for client-side routing.
|
|
648
|
-
// Include result data so fire-and-forget clients can receive the full result via WebSocket.
|
|
649
|
-
const completionData: Record<string, unknown> = {
|
|
650
|
-
sessionId,
|
|
651
|
-
agentRunId: result.agentRun?.ID || 'unknown',
|
|
652
|
-
type: 'complete',
|
|
653
|
-
timestamp: new Date(),
|
|
654
|
-
conversationDetailId: result.agentRun?.ConversationDetailID,
|
|
655
|
-
success: result.success,
|
|
656
|
-
errorMessage: result.agentRun?.ErrorMessage || undefined,
|
|
657
|
-
result: resultJson || undefined
|
|
658
|
-
};
|
|
659
|
-
this.PublishStreamingUpdate(pubSub, completionData, userPayload);
|
|
660
|
-
}
|
|
661
|
-
|
|
662
529
|
/**
|
|
663
530
|
* Public mutation for regular users to run AI agents with authentication.
|
|
664
531
|
* Supports fire-and-forget mode to avoid Azure proxy timeouts on long-running agent executions.
|
|
@@ -1017,7 +884,13 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1017
884
|
@Arg('sourceArtifactVersionId', { nullable: true }) sourceArtifactVersionId?: string,
|
|
1018
885
|
@Arg('fireAndForget', { nullable: true }) fireAndForget?: boolean,
|
|
1019
886
|
@Arg('planMode', { nullable: true }) planMode?: boolean,
|
|
1020
|
-
@Arg('requestedSkillIDs', () => [String], { nullable: true }) requestedSkillIDs?: string[]
|
|
887
|
+
@Arg('requestedSkillIDs', () => [String], { nullable: true }) requestedSkillIDs?: string[],
|
|
888
|
+
/** History floor: an ISO-8601 timestamp, the first moment of the conversation this run may
|
|
889
|
+
* read. The history is loaded from there and no summary of earlier messages is used, and the
|
|
890
|
+
* run's own conversation reads honour it too. Omitted (clients send it only when set, so an
|
|
891
|
+
* older client never does), the run reads the whole conversation as before. An unreadable
|
|
892
|
+
* value fails the request rather than being dropped. */
|
|
893
|
+
@Arg('agentHistoryFrom', { nullable: true }) agentHistoryFrom?: string
|
|
1021
894
|
): Promise<AIAgentRunResult> {
|
|
1022
895
|
// Check API key scope authorization for agent execution
|
|
1023
896
|
await this.CheckAPIKeyScopeAuthorization('agent:execute', agentId, userPayload);
|
|
@@ -1040,11 +913,14 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1040
913
|
// Conversation OWNERSHIP is still enforced under the guest principal below: the guest loads its
|
|
1041
914
|
// own ConversationDetail through the Widget Guest RLS filters, so a detail id from another
|
|
1042
915
|
// session resolves to "not found" before any elevated work happens.
|
|
1043
|
-
const widgetElevation = await
|
|
1044
|
-
const effectiveAgentId = widgetElevation ? widgetElevation.
|
|
1045
|
-
const effectiveUserPayload = widgetElevation ?
|
|
916
|
+
const widgetElevation = await ResolveWidgetGuestRunContext(userPayload, p);
|
|
917
|
+
const effectiveAgentId = widgetElevation ? widgetElevation.PinnedAgentId : agentId;
|
|
918
|
+
const effectiveUserPayload = widgetElevation ? ElevateUserPayload(userPayload, widgetElevation.ElevatedUser) : userPayload;
|
|
1046
919
|
|
|
1047
920
|
try {
|
|
921
|
+
// Parsed before anything loads: a floor the caller asked for must never be dropped.
|
|
922
|
+
const historyFrom = parseAgentHistoryFrom(agentHistoryFrom);
|
|
923
|
+
|
|
1048
924
|
// LATENCY OPTIMIZATION (Opt #2 + #3): Load ConversationDetail once here to extract
|
|
1049
925
|
// conversationId, then pass it downstream. Previously this record was loaded multiple
|
|
1050
926
|
// times: once in loadConversationHistoryWithAttachments (just to get conversationId),
|
|
@@ -1067,7 +943,8 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1067
943
|
p,
|
|
1068
944
|
// The UI creates the agent-response placeholder row ('⏳ ...') before invoking
|
|
1069
945
|
// this mutation — exclude it so the model never sees an empty assistant turn.
|
|
1070
|
-
[conversationDetailId]
|
|
946
|
+
[conversationDetailId],
|
|
947
|
+
historyFrom
|
|
1071
948
|
);
|
|
1072
949
|
|
|
1073
950
|
// Convert to JSON string for the existing executeAIAgent method
|
|
@@ -1080,7 +957,9 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1080
957
|
p, dataSource, effectiveAgentId, effectiveUserPayload, messagesJson, sessionId, pubSub,
|
|
1081
958
|
data, payload, lastRunId, autoPopulateLastRunPayload, configurationId,
|
|
1082
959
|
conversationDetailId, createArtifacts || false, createNotification || false,
|
|
1083
|
-
sourceArtifactId, sourceArtifactVersionId, conversationId, planMode, requestedSkillIDs
|
|
960
|
+
sourceArtifactId, sourceArtifactVersionId, conversationId, planMode, requestedSkillIDs,
|
|
961
|
+
undefined, // taskGraphDebug
|
|
962
|
+
historyFrom
|
|
1084
963
|
);
|
|
1085
964
|
|
|
1086
965
|
LogStatus(`🔥 Fire-and-forget: Agent ${effectiveAgentId} execution started in background for session ${sessionId}`);
|
|
@@ -1114,7 +993,9 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1114
993
|
conversationId, // LATENCY OPT #2: pass pre-resolved conversationId
|
|
1115
994
|
undefined, // runRef
|
|
1116
995
|
planMode,
|
|
1117
|
-
requestedSkillIDs
|
|
996
|
+
requestedSkillIDs,
|
|
997
|
+
undefined, // taskGraphDebug
|
|
998
|
+
historyFrom
|
|
1118
999
|
);
|
|
1119
1000
|
} catch (error) {
|
|
1120
1001
|
const errorMessage = (error as Error).message || 'Unknown error loading conversation history';
|
|
@@ -1334,11 +1215,13 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1334
1215
|
planMode?: boolean,
|
|
1335
1216
|
/** Skill IDs the user requested — threaded through to ExecuteAgentParams.requestedSkillIDs. */
|
|
1336
1217
|
requestedSkillIDs?: string[],
|
|
1337
|
-
taskGraphDebug?: string
|
|
1218
|
+
taskGraphDebug?: string,
|
|
1219
|
+
/** History floor — threaded through to ExecuteAgentParams.ConversationHistoryFrom. */
|
|
1220
|
+
conversationHistoryFrom?: Date
|
|
1338
1221
|
): void {
|
|
1339
1222
|
// Ref the liveness pulse reads to enrich heartbeats once the run is created.
|
|
1340
1223
|
const runRef: { current: MJAIAgentRunEntityExtended | null } = { current: null };
|
|
1341
|
-
const pulse =
|
|
1224
|
+
const pulse = StartLivenessPulse({
|
|
1342
1225
|
pubSub,
|
|
1343
1226
|
sessionId,
|
|
1344
1227
|
ownerUserId: userPayload.userRecord.ID,
|
|
@@ -1353,26 +1236,18 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1353
1236
|
p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub,
|
|
1354
1237
|
data, payload, undefined, lastRunId, autoPopulateLastRunPayload,
|
|
1355
1238
|
configurationId, conversationDetailId, createArtifacts, createNotification,
|
|
1356
|
-
sourceArtifactId, sourceArtifactVersionId, conversationId, runRef, planMode, requestedSkillIDs, taskGraphDebug
|
|
1239
|
+
sourceArtifactId, sourceArtifactVersionId, conversationId, runRef, planMode, requestedSkillIDs, taskGraphDebug,
|
|
1240
|
+
conversationHistoryFrom
|
|
1357
1241
|
).catch((error: unknown) => {
|
|
1358
1242
|
// Background execution failed unexpectedly (executeAIAgent has its own try-catch,
|
|
1359
1243
|
// so this would only fire for truly unexpected errors).
|
|
1360
1244
|
const errorMessage = (error instanceof Error) ? error.message : 'Unknown background execution error';
|
|
1361
1245
|
LogError(`🔥 Fire-and-forget background execution failed: ${errorMessage}`, undefined, error);
|
|
1362
1246
|
|
|
1363
|
-
// Publish error completion event so the client knows the agent failed
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
type: 'complete',
|
|
1368
|
-
timestamp: new Date(),
|
|
1369
|
-
conversationDetailId,
|
|
1370
|
-
success: false,
|
|
1371
|
-
errorMessage,
|
|
1372
|
-
result: JSON.stringify({ success: false, errorMessage })
|
|
1373
|
-
};
|
|
1374
|
-
this.PublishStreamingUpdate(pubSub, errorCompletionData, userPayload);
|
|
1375
|
-
}).finally(() => pulse.stop());
|
|
1247
|
+
// Publish error completion event so the client knows the agent failed.
|
|
1248
|
+
// The publisher is created inside executeAIAgent, which rejected before returning one.
|
|
1249
|
+
new AgentRunStatusPublisher(pubSub, userPayload, sessionId).PublishFailure(conversationDetailId, errorMessage);
|
|
1250
|
+
}).finally(() => pulse.Stop());
|
|
1376
1251
|
}
|
|
1377
1252
|
|
|
1378
1253
|
/**
|
|
@@ -1389,7 +1264,7 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1389
1264
|
*
|
|
1390
1265
|
* Opt #8: Switched from ResultType 'entity_object' to 'simple' with explicit Fields.
|
|
1391
1266
|
* The history query only needs the window-assembly fields (ConversationWindowFields:
|
|
1392
|
-
* ID, Sequence, Role, Message, SummaryOfEarlierConversation) from each
|
|
1267
|
+
* ID, Sequence, Role, Message, SummaryOfEarlierConversation, __mj_CreatedAt) from each
|
|
1393
1268
|
* ConversationDetail record. Using 'entity_object' created full BaseEntity instances
|
|
1394
1269
|
* with getters/setters, dirty tracking, and validation — none of which are needed for
|
|
1395
1270
|
* read-only history assembly. The 'simple' result type returns plain JS objects,
|
|
@@ -1400,13 +1275,15 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1400
1275
|
contextUser: UserInfo,
|
|
1401
1276
|
maxMessages: number,
|
|
1402
1277
|
provider: IMetadataProvider,
|
|
1403
|
-
excludeDetailIds?: string[]
|
|
1278
|
+
excludeDetailIds?: string[],
|
|
1279
|
+
/** History floor: only rows written at or after it are loaded, and no summary is used. */
|
|
1280
|
+
historyFrom?: Date
|
|
1404
1281
|
): Promise<ChatMessage[]> {
|
|
1405
1282
|
// Context windowing (summary boundary + raw tail, or legacy last-N when no
|
|
1406
1283
|
// summary exists) shares ONE fold implementation with all other callers —
|
|
1407
1284
|
// ConversationEngine.AssembleContextWindow — and the ROWS come from the
|
|
1408
1285
|
// single-sourced fresh-per-request loader (same one the compaction pass uses).
|
|
1409
|
-
//
|
|
1286
|
+
// Four deliberate properties vs. the engine's cached GetAgentContextWindow:
|
|
1410
1287
|
// 1. Entity RLS applies (the engine path loads via a stored query with no
|
|
1411
1288
|
// row-level security — wrong for guest/widget-scoped users), and the
|
|
1412
1289
|
// process-global per-conversation cache — keyed by conversation, not user —
|
|
@@ -1415,10 +1292,13 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1415
1292
|
// cross-server staleness (a warm cache misses rows written by other nodes).
|
|
1416
1293
|
// 3. Load failure THROWS → the mutation fails, instead of silently running
|
|
1417
1294
|
// the agent against zero history.
|
|
1418
|
-
|
|
1295
|
+
// 4. A history floor (`historyFrom`) is applied in the query, so rows before it never
|
|
1296
|
+
// leave the database, and again in the assembly, which then skips the summary.
|
|
1297
|
+
const rows = await ConversationEngine.LoadWindowRowsFresh(conversationId, contextUser, provider, historyFrom);
|
|
1419
1298
|
const window = ConversationEngine.AssembleContextWindow(rows, {
|
|
1420
1299
|
maxTailMessages: maxMessages,
|
|
1421
|
-
excludeDetailIds
|
|
1300
|
+
excludeDetailIds,
|
|
1301
|
+
historyFrom
|
|
1422
1302
|
});
|
|
1423
1303
|
|
|
1424
1304
|
// Batch load input artifacts for the windowed messages. Since the backfill migration
|
|
@@ -1477,20 +1357,20 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1477
1357
|
const artifactType = ArtifactMetadataEngine.Instance.GetArtifactTypeByMimeType(artifactMime, ext);
|
|
1478
1358
|
|
|
1479
1359
|
const decision = RouteArtifact({
|
|
1480
|
-
|
|
1481
|
-
|
|
1360
|
+
TypeDefault: artifactType?.DefaultDeliveryMode ?? 'ToolsOnly',
|
|
1361
|
+
ForceToolsOnly: artifactVersion.ForceToolsOnly,
|
|
1482
1362
|
mimeType: artifactMime,
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1363
|
+
SizeBytes: artifactVersion.ContentSizeBytes ?? 0,
|
|
1364
|
+
InlineSizeCap: INLINE_SIZE_CAP,
|
|
1365
|
+
ModelSupportsModality: () => true,
|
|
1366
|
+
ModelName: '<resolver>',
|
|
1367
|
+
ArtifactTypeName: artifactType?.Name ?? artifactMime,
|
|
1488
1368
|
});
|
|
1489
1369
|
|
|
1490
1370
|
if (artifactVersion.ContentMode === 'File' && artifactVersion.FileID) {
|
|
1491
1371
|
if (decision.delivery !== 'inline') {
|
|
1492
|
-
if (decision.delivery === 'tools' && decision.
|
|
1493
|
-
LogStatus(`[RunAIAgentResolver] ${decision.
|
|
1372
|
+
if (decision.delivery === 'tools' && decision.Annotation) {
|
|
1373
|
+
LogStatus(`[RunAIAgentResolver] ${decision.Annotation}`);
|
|
1494
1374
|
}
|
|
1495
1375
|
continue;
|
|
1496
1376
|
}
|
|
@@ -1508,8 +1388,8 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1508
1388
|
// Text-mode artifact (ContentMode = 'Text'). Honor the
|
|
1509
1389
|
// routing decision the same way as for file-mode.
|
|
1510
1390
|
if (decision.delivery !== 'inline') {
|
|
1511
|
-
if (decision.delivery === 'tools' && decision.
|
|
1512
|
-
LogStatus(`[RunAIAgentResolver] ${decision.
|
|
1391
|
+
if (decision.delivery === 'tools' && decision.Annotation) {
|
|
1392
|
+
LogStatus(`[RunAIAgentResolver] ${decision.Annotation}`);
|
|
1513
1393
|
}
|
|
1514
1394
|
continue;
|
|
1515
1395
|
}
|
|
@@ -1648,6 +1528,21 @@ export class RunAIAgentResolver extends ResolverBase {
|
|
|
1648
1528
|
|
|
1649
1529
|
}
|
|
1650
1530
|
|
|
1531
|
+
/**
|
|
1532
|
+
* Reads the `agentHistoryFrom` argument of `RunAIAgentFromConversationDetail`: an ISO-8601
|
|
1533
|
+
* timestamp. Absent means no floor. A value that is present but not a timestamp throws — a
|
|
1534
|
+
* floor the caller asked for must fail the request, never be dropped, since dropping it lets
|
|
1535
|
+
* the run read the history it was meant to keep out.
|
|
1536
|
+
*/
|
|
1537
|
+
function parseAgentHistoryFrom(raw?: string | null): Date | undefined {
|
|
1538
|
+
if (raw == null) return undefined;
|
|
1539
|
+
const parsed = new Date(raw);
|
|
1540
|
+
if (Number.isNaN(parsed.getTime())) {
|
|
1541
|
+
throw new Error(`agentHistoryFrom must be an ISO-8601 timestamp; received "${raw}"`);
|
|
1542
|
+
}
|
|
1543
|
+
return parsed;
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1651
1546
|
function parseTaskGraphDebug(raw?: string): { paused?: boolean } | undefined {
|
|
1652
1547
|
if (!raw) return undefined;
|
|
1653
1548
|
const parsed: unknown = SafeJSONParse(raw);
|