@memberjunction/server 6.2.0-edge.5 → 6.2.0-edge.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
- package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
- package/dist/agentSessions/BridgeHostInstance.js +14 -4
- package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
- package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
- package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
- package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
- package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +34 -11
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +88 -44
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +29 -9
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +62 -16
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
- package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
- package/dist/agentSessions/conversationBrowsers.js +118 -0
- package/dist/agentSessions/conversationBrowsers.js.map +1 -0
- package/dist/agentSessions/sessionDeadline.d.ts +43 -0
- package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
- package/dist/agentSessions/sessionDeadline.js +68 -0
- package/dist/agentSessions/sessionDeadline.js.map +1 -0
- package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
- package/dist/auth/APIKeyScopeAuth.js +5 -4
- package/dist/auth/APIKeyScopeAuth.js.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +2 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +51 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +10 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +37 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/localDevAuth.d.ts +79 -0
- package/dist/auth/localDevAuth.d.ts.map +1 -0
- package/dist/auth/localDevAuth.js +439 -0
- package/dist/auth/localDevAuth.js.map +1 -0
- package/dist/auth/loginEmailResolution.d.ts +41 -0
- package/dist/auth/loginEmailResolution.d.ts.map +1 -0
- package/dist/auth/loginEmailResolution.js +47 -0
- package/dist/auth/loginEmailResolution.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +221 -9
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/index.d.ts +1 -1
- package/dist/auth/magicLink/index.d.ts.map +1 -1
- package/dist/auth/magicLink/index.js +1 -1
- package/dist/auth/magicLink/index.js.map +1 -1
- package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
- package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
- package/dist/auth/magicLink/redeemLanding.js +7 -4
- package/dist/auth/magicLink/redeemLanding.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +39 -3
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/magicLink/types.js +0 -4
- package/dist/auth/magicLink/types.js.map +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +1 -0
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/auth/sessionUserClone.d.ts +1 -1
- package/dist/auth/sessionUserClone.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.js +3 -2
- package/dist/auth/sessionUserClone.js.map +1 -1
- package/dist/backgroundSweepConfigUnits.d.ts +231 -0
- package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
- package/dist/backgroundSweepConfigUnits.js +180 -0
- package/dist/backgroundSweepConfigUnits.js.map +1 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
- package/dist/broadcast/index.d.ts +6 -0
- package/dist/broadcast/index.d.ts.map +1 -0
- package/dist/broadcast/index.js +6 -0
- package/dist/broadcast/index.js.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
- package/dist/cache.d.ts +3 -2
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +1402 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +5 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +64 -12
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +3 -1
- package/dist/coreRoutes.d.ts.map +1 -1
- package/dist/coreRoutes.js +20 -4
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +4167 -62
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +154 -79
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/PubSubManager.d.ts +10 -0
- package/dist/generic/PubSubManager.d.ts.map +1 -1
- package/dist/generic/PubSubManager.js +44 -1
- package/dist/generic/PubSubManager.js.map +1 -1
- package/dist/generic/PushStatusResolver.d.ts +39 -6
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +93 -11
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +114 -29
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +509 -220
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +15 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +126 -20
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
- package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
- package/dist/generic/actionOutputFieldSecurity.js +47 -0
- package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
- package/dist/generic/fieldSecurityTransport.d.ts +30 -0
- package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
- package/dist/generic/fieldSecurityTransport.js +30 -0
- package/dist/generic/fieldSecurityTransport.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +262 -84
- package/dist/index.js.map +1 -1
- package/dist/integration/ConnectionPause.d.ts +121 -0
- package/dist/integration/ConnectionPause.d.ts.map +1 -0
- package/dist/integration/ConnectionPause.js +183 -0
- package/dist/integration/ConnectionPause.js.map +1 -0
- package/dist/integration/CustomColumnPromoter.d.ts +72 -6
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +93 -47
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/integration/EntityMapLifecycle.d.ts +78 -4
- package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
- package/dist/integration/EntityMapLifecycle.js +199 -5
- package/dist/integration/EntityMapLifecycle.js.map +1 -1
- package/dist/integration/InactiveRowWarnings.d.ts +31 -0
- package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
- package/dist/integration/InactiveRowWarnings.js +29 -0
- package/dist/integration/InactiveRowWarnings.js.map +1 -1
- package/dist/integration/ObjectNamesByID.d.ts +28 -0
- package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
- package/dist/integration/ObjectNamesByID.js +87 -0
- package/dist/integration/ObjectNamesByID.js.map +1 -0
- package/dist/integration/PostRestartIntrospect.d.ts +26 -0
- package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
- package/dist/integration/PostRestartIntrospect.js +27 -0
- package/dist/integration/PostRestartIntrospect.js.map +1 -0
- package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
- package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
- package/dist/integration/RSUPostRestartProgress.js +323 -0
- package/dist/integration/RSUPostRestartProgress.js.map +1 -0
- package/dist/integration/RSUProgressBridge.d.ts +41 -2
- package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
- package/dist/integration/RSUProgressBridge.js +84 -1
- package/dist/integration/RSUProgressBridge.js.map +1 -1
- package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
- package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
- package/dist/integration/RunArtifactAuthorization.js +45 -0
- package/dist/integration/RunArtifactAuthorization.js.map +1 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
- package/dist/integration/SchemaRefreshLaunch.js +3 -2
- package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
- package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
- package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
- package/dist/integration/ScopedFieldsForBuild.js +91 -0
- package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
- package/dist/integration/TargetConfigGuard.d.ts +40 -0
- package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
- package/dist/integration/TargetConfigGuard.js +40 -0
- package/dist/integration/TargetConfigGuard.js.map +1 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +50 -1
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
- package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +8 -6
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +147 -22
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
- package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.js +19 -3
- package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
- package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +203 -19
- package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
- package/dist/realtimeWidget/host-identity.d.ts +1 -1
- package/dist/realtimeWidget/host-identity.js +1 -1
- package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.js +1 -0
- package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +21 -8
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +3 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/requestOrigin.d.ts +22 -0
- package/dist/requestOrigin.d.ts.map +1 -0
- package/dist/requestOrigin.js +60 -0
- package/dist/requestOrigin.js.map +1 -0
- package/dist/resolvers/ActionResolver.d.ts +19 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +63 -12
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +1 -0
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +44 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.js +2 -1
- package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
- package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
- package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +6 -0
- package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
- package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
- package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -0
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +5 -0
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +13 -4
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +34 -13
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +13 -2
- package/dist/resolvers/MCPResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +31 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
- package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.js +5 -3
- package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +20 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +184 -88
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RSUResolver.d.ts.map +1 -1
- package/dist/resolvers/RSUResolver.js +12 -0
- package/dist/resolvers/RSUResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +388 -125
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +19 -18
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +7 -5
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTestResolver.js +3 -1
- package/dist/resolvers/RunTestResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +4 -0
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +1 -0
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +60 -15
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js +2 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.js +2 -0
- package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +6 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +19 -5
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/MediaAccessKeys.d.ts.map +1 -1
- package/dist/rest/MediaAccessKeys.js +6 -2
- package/dist/rest/MediaAccessKeys.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +11 -5
- package/dist/rest/OAuthCallbackHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +8 -5
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +6 -8
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +6 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +24 -6
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +3 -1
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +11 -2
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverRoleConfigUnits.d.ts +29 -0
- package/dist/serverRoleConfigUnits.d.ts.map +1 -0
- package/dist/serverRoleConfigUnits.js +33 -0
- package/dist/serverRoleConfigUnits.js.map +1 -0
- package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +2 -26
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +38 -0
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/services/WorkQueueHostService.d.ts +2 -1
- package/dist/services/WorkQueueHostService.d.ts.map +1 -1
- package/dist/services/WorkQueueHostService.js +19 -4
- package/dist/services/WorkQueueHostService.js.map +1 -1
- package/dist/services/workQueueConfig.d.ts +2 -2
- package/dist/services/workQueueConfig.js +5 -5
- package/dist/services/workQueueConfig.js.map +1 -1
- package/dist/sharedCache.js +1 -1
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +40 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +98 -98
- package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/ActiveOperations.test.ts +68 -0
- package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
- package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +150 -0
- package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
- package/src/__tests__/BatchApplyParity.test.ts +109 -0
- package/src/__tests__/BridgeHostInstance.test.ts +42 -0
- package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
- package/src/__tests__/ConnectionPause.test.ts +192 -0
- package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
- package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
- package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
- package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
- package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
- package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
- package/src/__tests__/MagicLinkKeys.test.ts +102 -0
- package/src/__tests__/MediaAccessKeys.test.ts +57 -10
- package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
- package/src/__tests__/ObjectNamesByID.test.ts +176 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
- package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
- package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
- package/src/__tests__/RSUProgressBridge.test.ts +188 -5
- package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
- package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
- package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
- package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -1
- package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
- package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +72 -13
- package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
- package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
- package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
- package/src/__tests__/SessionJanitor.test.ts +195 -4
- package/src/__tests__/SessionManager.test.ts +164 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
- package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/WorkQueueHostService.test.ts +25 -7
- package/src/__tests__/apiRootBoot.test.ts +1 -1
- package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
- package/src/__tests__/contextRequestOrigin.test.ts +105 -0
- package/src/__tests__/conversationBrowsers.test.ts +62 -0
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +3 -3
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
- package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
- package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +224 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/requestOrigin.test.ts +104 -0
- package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
- package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
- package/src/__tests__/resolverBase.fls.test.ts +146 -97
- package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
- package/src/__tests__/runParamsTimeZone.test.ts +179 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
- package/src/__tests__/runViewProperties.test.ts +114 -0
- package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
- package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
- package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
- package/src/__tests__/sessionDeadline.test.ts +51 -0
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/sharedCache.test.ts +11 -0
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +101 -1
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/BridgeHostInstance.ts +20 -5
- package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
- package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
- package/src/agentSessions/SessionJanitor.ts +95 -45
- package/src/agentSessions/SessionManager.ts +73 -20
- package/src/agentSessions/conversationBrowsers.ts +143 -0
- package/src/agentSessions/sessionDeadline.ts +81 -0
- package/src/auth/APIKeyScopeAuth.ts +5 -4
- package/src/auth/AuthProviderCatalogRouter.ts +3 -0
- package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
- package/src/auth/index.ts +56 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/loginEmailResolution.ts +67 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
- package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
- package/src/auth/magicLink/MagicLinkService.ts +250 -10
- package/src/auth/magicLink/index.ts +1 -1
- package/src/auth/magicLink/redeemLanding.ts +7 -4
- package/src/auth/magicLink/types.ts +38 -3
- package/src/auth/newUsers.ts +1 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/backgroundSweepConfigUnits.ts +213 -0
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
- package/src/broadcast/index.ts +5 -0
- package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
- package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
- package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
- package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
- package/src/cache.ts +2 -1
- package/src/config.ts +138 -0
- package/src/context.ts +71 -14
- package/src/coreRoutes.ts +29 -7
- package/src/generated/graphql-schemas/__mj.ts +4145 -1193
- package/src/generic/CacheInvalidationResolver.ts +135 -78
- package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +108 -11
- package/src/generic/ResolverBase.ts +635 -234
- package/src/generic/RunViewResolver.ts +176 -64
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/index.ts +310 -85
- package/src/integration/ConnectionPause.ts +222 -0
- package/src/integration/CustomColumnPromoter.ts +129 -54
- package/src/integration/EntityMapLifecycle.ts +229 -6
- package/src/integration/InactiveRowWarnings.ts +50 -0
- package/src/integration/ObjectNamesByID.ts +97 -0
- package/src/integration/PostRestartIntrospect.ts +49 -0
- package/src/integration/RSUPostRestartProgress.ts +359 -0
- package/src/integration/RSUProgressBridge.ts +85 -2
- package/src/integration/RunArtifactAuthorization.ts +65 -0
- package/src/integration/SchemaRefreshLaunch.ts +12 -2
- package/src/integration/ScopedFieldsForBuild.ts +113 -0
- package/src/integration/TargetConfigGuard.ts +71 -0
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
- package/src/realtimeSessions/sessionAccess.ts +211 -25
- package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
- package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
- package/src/realtimeSessions/verificationWorkflow.ts +3 -1
- package/src/realtimeWidget/WidgetRouter.ts +22 -4
- package/src/realtimeWidget/WidgetSessionService.ts +254 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/visitorIdentity.ts +1 -0
- package/src/realtimeWidget/widgetCore.ts +34 -9
- package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
- package/src/requestOrigin.ts +64 -0
- package/src/resolvers/ActionResolver.ts +78 -15
- package/src/resolvers/AdhocQueryResolver.ts +1 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
- package/src/resolvers/AgentSessionResolver.ts +50 -18
- package/src/resolvers/AutotagPipelineResolver.ts +2 -1
- package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
- package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +14 -4
- package/src/resolvers/GetDataResolver.ts +35 -13
- package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
- package/src/resolvers/MCPResolver.ts +15 -2
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +20 -6
- package/src/resolvers/QuerySystemUserResolver.ts +207 -99
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
- package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
- package/src/resolvers/RunAIAgentResolver.ts +518 -163
- package/src/resolvers/RunAIPromptResolver.ts +18 -18
- package/src/resolvers/RunTemplateResolver.ts +9 -5
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TestQuerySQLResolver.ts +1 -0
- package/src/resolvers/TransactionGroupResolver.ts +66 -15
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/resolvers/meetingRecordingRegistration.ts +2 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/MediaAccessKeys.ts +6 -2
- package/src/rest/OAuthCallbackHandler.ts +13 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +9 -10
- package/src/rest/ViewOperationsHandler.ts +26 -7
- package/src/rest/setupRESTEndpoints.ts +11 -2
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
- package/src/services/TaskGraphActionRunner.ts +2 -23
- package/src/services/TaskGraphAgentRunner.ts +43 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
- package/src/services/WorkQueueHostService.ts +26 -4
- package/src/services/workQueueConfig.ts +5 -5
- package/src/sharedCache.ts +1 -1
- package/src/types.ts +41 -1
- package/src/services/TaskOrchestration-Integration.md +0 -188
|
@@ -14,17 +14,20 @@ import { Resolver, Mutation, Query, Arg, Ctx, ObjectType, Field, PubSub, PubSubE
|
|
|
14
14
|
import { LogError, LogStatus, RunView } from '@memberjunction/core';
|
|
15
15
|
import { ArtifactMetadataEngine, ConversationEngine } from '@memberjunction/core-entities';
|
|
16
16
|
import { RouteArtifact } from './artifact-routing.js';
|
|
17
|
-
import { AgentRunner, ArtifactToolManager } from '@memberjunction/ai-agents';
|
|
18
|
-
import { MJAIAgentRunEntityExtended, ConversationUtility } from '@memberjunction/ai-core-plus';
|
|
17
|
+
import { AgentRunner, ArtifactToolManager, CanAgentOwnSubAgentConsults, LoadOpenSubAgentConsults, HostAllowedAgentIDs } from '@memberjunction/ai-agents';
|
|
18
|
+
import { MJAIAgentRunEntityExtended, ConversationUtility, ContinuationAnnouncementText } from '@memberjunction/ai-core-plus';
|
|
19
19
|
import { AIEngine } from '@memberjunction/aiengine';
|
|
20
20
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
21
21
|
import { AgentRunStatusPublisher } from './AgentRunStatusPublisher.js';
|
|
22
|
+
import { ProjectEntityObjectForCaller } from '../generic/fieldSecurityTransport.js';
|
|
22
23
|
import { StartLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
|
|
24
|
+
import { StatusUpdateOwnerID } from '../generic/PushStatusResolver.js';
|
|
23
25
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
24
26
|
import { GetReadWriteProvider } from '../util.js';
|
|
25
27
|
import { ResolveWidgetGuestRunContext, ElevateUserPayload } from '../realtimeWidget/widgetGuestElevation.js';
|
|
28
|
+
import { AuthorizeConversationTurn } from '../realtimeSessions/sessionAccess.js';
|
|
26
29
|
import { IsTrustedAgentRunCaller } from './agent-run-data-guard.js';
|
|
27
|
-
import { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';
|
|
30
|
+
import { EscapeSQLString, IsValidUUID, SafeJSONParse, UUIDsEqual } from '@memberjunction/global';
|
|
28
31
|
import { GetAttachmentService } from '@memberjunction/aiengine';
|
|
29
32
|
import { NotificationEngine } from '@memberjunction/notifications';
|
|
30
33
|
/**
|
|
@@ -208,11 +211,20 @@ AgentExecutionStreamMessage = __decorate([
|
|
|
208
211
|
], AgentExecutionStreamMessage);
|
|
209
212
|
export { AgentExecutionStreamMessage };
|
|
210
213
|
let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
214
|
+
constructor() {
|
|
215
|
+
super(...arguments);
|
|
216
|
+
/**
|
|
217
|
+
* Tracks `userPayload` instances originating from interactive user mutations (`RunAIAgent` and
|
|
218
|
+
* `RunAIAgentFromConversationDetail` without API key or widget guest elevation) that may expose
|
|
219
|
+
* `Handoff` and follow returned handoff decisions.
|
|
220
|
+
*/
|
|
221
|
+
this.handoffEligiblePayloads = new WeakSet();
|
|
222
|
+
}
|
|
211
223
|
/**
|
|
212
224
|
* Sanitize ExecuteAgentResult for JSON serialization
|
|
213
225
|
* Removes circular references and non-serializable objects
|
|
214
226
|
*/
|
|
215
|
-
sanitizeAgentResult(result) {
|
|
227
|
+
sanitizeAgentResult(result, recipient) {
|
|
216
228
|
const sanitized = {
|
|
217
229
|
success: result.success,
|
|
218
230
|
payload: result.payload,
|
|
@@ -223,12 +235,14 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
223
235
|
finalStep: result.agentRun?.FinalStep,
|
|
224
236
|
cancelled: result.agentRun?.Status === 'Cancelled',
|
|
225
237
|
cancellationReason: result.agentRun?.CancellationReason,
|
|
226
|
-
feedbackRequestId: result.feedbackRequestId
|
|
238
|
+
feedbackRequestId: result.feedbackRequestId,
|
|
239
|
+
handoff: result.handoff
|
|
227
240
|
};
|
|
228
241
|
// Safely extract agent run data using GetAll() for proper serialization
|
|
229
242
|
if (result.agentRun && typeof result.agentRun.GetAll === 'function') {
|
|
230
|
-
//
|
|
231
|
-
|
|
243
|
+
// GetAll() for the full serialized object including extended properties, projected for
|
|
244
|
+
// the recipient: the run comes from the agent engine, not from a load bound to them
|
|
245
|
+
sanitized.agentRun = ProjectEntityObjectForCaller(result.agentRun, recipient);
|
|
232
246
|
}
|
|
233
247
|
else {
|
|
234
248
|
// shouldn't ever get here
|
|
@@ -314,7 +328,12 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
314
328
|
/** ExecuteAgentParams.TrustReservedRunData: true only for a caller IsTrustedAgentRunCaller accepts. */
|
|
315
329
|
trustReservedRunData = false,
|
|
316
330
|
/** The conversation branch of the run — threaded into ExecuteAgentParams.ConversationBranchID. */
|
|
317
|
-
conversationBranchId
|
|
331
|
+
conversationBranchId,
|
|
332
|
+
/** The reply row this request created on the server for the run (`conversationDetailId` is its ID). The run
|
|
333
|
+
* writes into this instance, so its writes carry the server-authored marker and the user it was made as. */
|
|
334
|
+
replyDetail,
|
|
335
|
+
/** Optional explicit handoff override; defaults to whether the caller registered `userPayload` as interactive. */
|
|
336
|
+
followHandoffs) {
|
|
318
337
|
const startTime = Date.now();
|
|
319
338
|
// Best-effort handle for persistInFlightAgentFailure. Populated from a
|
|
320
339
|
// progress event carrying metadata.agentRun, or from the successful
|
|
@@ -322,6 +341,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
322
341
|
// run is not marked Failed — the early-failure case we most want to
|
|
323
342
|
// persist, but we have no run object yet.
|
|
324
343
|
const agentRunRef = runRef ?? { current: null };
|
|
344
|
+
// The publisher owns every status message, including the failure completion the catch below sends.
|
|
345
|
+
const statusPublisher = new AgentRunStatusPublisher(pubSub, userPayload, sessionId, conversationDetailId);
|
|
325
346
|
try {
|
|
326
347
|
LogStatus(`=== RUNNING AI AGENT FOR ID: ${agentId} ===`);
|
|
327
348
|
// Parse and validate messages
|
|
@@ -348,12 +369,17 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
348
369
|
console.log(`🚀 Starting agent execution with sessionId: ${sessionId}`);
|
|
349
370
|
// The publisher owns every status message. The resolver still copies the run into
|
|
350
371
|
// agentRunRef, including noise steps, for the fire-and-forget liveness pulse.
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
//
|
|
354
|
-
|
|
372
|
+
const sourcePublisher = statusPublisher;
|
|
373
|
+
let currentPublisher = sourcePublisher;
|
|
374
|
+
// A widget- or guest-hosted run must not get a handoffChain unless the host also passes an
|
|
375
|
+
// allow-list under trusted run data.
|
|
376
|
+
const effectiveFollowHandoffs = followHandoffs ?? this.handoffEligiblePayloads.has(userPayload);
|
|
377
|
+
const isGuestOrWidgetUser = Boolean(currentUser.IsMagicLinkAnonymous || currentUser.WidgetGuestContext);
|
|
378
|
+
const allowHandoff = effectiveFollowHandoffs && (!isGuestOrWidgetUser
|
|
379
|
+
|| (trustReservedRunData && HostAllowedAgentIDs(parsedData) !== undefined));
|
|
380
|
+
const sourceParams = {
|
|
355
381
|
agent: agentEntity,
|
|
356
|
-
conversationMessages: parsedMessages,
|
|
382
|
+
conversationMessages: [...parsedMessages],
|
|
357
383
|
payload: payload ? SafeJSONParse(payload) : undefined,
|
|
358
384
|
contextUser: currentUser,
|
|
359
385
|
sessionID: sessionId,
|
|
@@ -362,9 +388,9 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
362
388
|
if (isAgentRunEntity(fromEvent)) {
|
|
363
389
|
agentRunRef.current = fromEvent;
|
|
364
390
|
}
|
|
365
|
-
|
|
391
|
+
sourcePublisher.OnProgress(progress);
|
|
366
392
|
},
|
|
367
|
-
onStreaming:
|
|
393
|
+
onStreaming: sourcePublisher.OnStreaming,
|
|
368
394
|
lastRunId: lastRunId,
|
|
369
395
|
autoPopulateLastRunPayload: autoPopulateLastRunPayload,
|
|
370
396
|
configurationId: configurationId,
|
|
@@ -373,20 +399,26 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
373
399
|
taskGraphDebug: parseTaskGraphDebug(taskGraphDebug),
|
|
374
400
|
ConversationHistoryFrom: conversationHistoryFrom,
|
|
375
401
|
...(conversationBranchId ? { ConversationBranchID: conversationBranchId } : {}),
|
|
402
|
+
...(allowHandoff ? { handoffChain: [] } : {}),
|
|
376
403
|
data: parsedData,
|
|
377
404
|
// Whether the run may read the reserved data keys (scope, agent-type params); BaseAgent drops them otherwise.
|
|
378
405
|
TrustReservedRunData: trustReservedRunData,
|
|
379
406
|
context: {
|
|
380
407
|
dataSource: dataSource
|
|
381
408
|
}
|
|
382
|
-
}
|
|
409
|
+
};
|
|
410
|
+
// Execute the agent in conversation context - handles conversation, artifacts, etc.
|
|
411
|
+
const conversationResult = await agentRunner.RunAgentInConversation(sourceParams, {
|
|
383
412
|
conversationDetailId: conversationDetailId, // Use existing if provided
|
|
413
|
+
agentResponseDetail: replyDetail, // the reply row this request created, when it did
|
|
384
414
|
conversationId: conversationId, // LATENCY OPT #2: pre-resolved to skip redundant load in AgentRunner
|
|
385
415
|
userMessage: userMessage, // Provide user message when conversationDetailId not provided
|
|
386
416
|
createArtifacts: createArtifacts || false,
|
|
387
|
-
sourceArtifactId: sourceArtifactId
|
|
417
|
+
sourceArtifactId: sourceArtifactId,
|
|
418
|
+
// A widget guest runs as the system user, but its conversation stays the guest's to write (MJ#4791).
|
|
419
|
+
ConversationWriter: userPayload.ElevatedFrom,
|
|
388
420
|
});
|
|
389
|
-
|
|
421
|
+
let result = conversationResult.agentResult;
|
|
390
422
|
// Use agent response detail ID if available, otherwise fall back to user message detail ID
|
|
391
423
|
const finalConversationDetailId = conversationResult.agentResponseDetailId || conversationResult.userMessageDetailId;
|
|
392
424
|
const artifactInfo = conversationResult.artifactInfo;
|
|
@@ -394,40 +426,70 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
394
426
|
if (result.agentRun) {
|
|
395
427
|
agentRunRef.current = result.agentRun;
|
|
396
428
|
}
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
429
|
+
await this.runPostExecutionNotifications(result, artifactInfo, conversationResult.conversationId, finalConversationDetailId, lastRunId, userMessage, createNotification, currentUser, pubSub, userPayload, p);
|
|
430
|
+
let handoffPublishedFinal = false;
|
|
431
|
+
if (allowHandoff && result.handoff && conversationResult.conversationId && conversationResult.agentResponseDetailId) {
|
|
432
|
+
const outcomes = await agentRunner.FollowHandoffs({
|
|
433
|
+
params: { ...sourceParams, conversationMessages: parsedMessages },
|
|
434
|
+
sourceResult: result,
|
|
435
|
+
conversationId: conversationResult.conversationId,
|
|
436
|
+
sourceConversationDetailId: conversationResult.agentResponseDetailId,
|
|
437
|
+
createArtifacts: createArtifacts || false,
|
|
438
|
+
ConversationWriter: userPayload.ElevatedFrom,
|
|
439
|
+
sourceConversationDetail: replyDetail,
|
|
440
|
+
hooks: {
|
|
441
|
+
OnHopStart: (hop, previousRun) => {
|
|
442
|
+
const prevSanitized = JSON.stringify(this.sanitizeAgentResult(previousRun.agentResult, currentUser));
|
|
443
|
+
currentPublisher.PublishFinal(previousRun.agentResult, previousRun.agentResult.agentRun?.ConversationDetailID ?? previousRun.conversationDetailId, prevSanitized);
|
|
444
|
+
currentPublisher = new AgentRunStatusPublisher(pubSub, userPayload, sessionId, hop.targetConversationDetailId);
|
|
445
|
+
return {
|
|
446
|
+
onProgress: (progress) => {
|
|
447
|
+
const fromEvent = progress.metadata?.agentRun;
|
|
448
|
+
if (isAgentRunEntity(fromEvent)) {
|
|
449
|
+
agentRunRef.current = fromEvent;
|
|
450
|
+
}
|
|
451
|
+
currentPublisher.OnProgress(progress);
|
|
452
|
+
},
|
|
453
|
+
onStreaming: currentPublisher.OnStreaming,
|
|
454
|
+
};
|
|
455
|
+
},
|
|
456
|
+
OnHopEnd: async (_hop, outcome) => {
|
|
457
|
+
if (!outcome.agentResult) {
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
if (outcome.agentResult.agentRun) {
|
|
461
|
+
agentRunRef.current = outcome.agentResult.agentRun;
|
|
462
|
+
}
|
|
463
|
+
await this.runPostExecutionNotifications(outcome.agentResult, outcome.artifactInfo, conversationResult.conversationId, outcome.targetConversationDetailId, undefined, undefined, createNotification, currentUser, pubSub, userPayload, p);
|
|
464
|
+
},
|
|
465
|
+
},
|
|
466
|
+
});
|
|
467
|
+
const lastOutcome = outcomes[outcomes.length - 1];
|
|
468
|
+
if (lastOutcome?.error) {
|
|
469
|
+
const executionTime = Date.now() - startTime;
|
|
470
|
+
currentPublisher.PublishFailure(lastOutcome.targetConversationDetailId, lastOutcome.error);
|
|
471
|
+
LogError(`AI Agent handoff hop failed: ${lastOutcome.error}`);
|
|
472
|
+
return {
|
|
473
|
+
success: false,
|
|
474
|
+
errorMessage: lastOutcome.error,
|
|
475
|
+
executionTimeMs: executionTime,
|
|
476
|
+
result: JSON.stringify({ success: false, errorMessage: lastOutcome.error })
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
if (lastOutcome?.agentResult) {
|
|
480
|
+
const lastHopSanitized = JSON.stringify(this.sanitizeAgentResult(lastOutcome.agentResult, currentUser));
|
|
481
|
+
currentPublisher.PublishFinal(lastOutcome.agentResult, lastOutcome.agentResult.agentRun?.ConversationDetailID ?? lastOutcome.targetConversationDetailId, lastHopSanitized);
|
|
482
|
+
handoffPublishedFinal = true;
|
|
483
|
+
}
|
|
425
484
|
}
|
|
426
|
-
|
|
427
|
-
|
|
485
|
+
const executionTime = Date.now() - startTime;
|
|
486
|
+
// Create sanitized payload for JSON serialization (always tied to the source detail)
|
|
487
|
+
const sanitizedResult = this.sanitizeAgentResult(result, currentUser);
|
|
428
488
|
const returnResult = JSON.stringify(sanitizedResult);
|
|
429
|
-
// Publish final events with enriched result data
|
|
430
|
-
|
|
489
|
+
// Publish final events with enriched result data when no handoff hop already finalized via OnHopStart
|
|
490
|
+
if (!handoffPublishedFinal) {
|
|
491
|
+
currentPublisher.PublishFinal(result, result.agentRun?.ConversationDetailID, returnResult);
|
|
492
|
+
}
|
|
431
493
|
// Log completion
|
|
432
494
|
if (result.success) {
|
|
433
495
|
LogStatus(`=== AI AGENT RUN COMPLETED FOR: ${agentEntity.Name} (${executionTime}ms) ===`);
|
|
@@ -445,10 +507,17 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
445
507
|
catch (error) {
|
|
446
508
|
const executionTime = Date.now() - startTime;
|
|
447
509
|
LogError(`AI Agent run failed:`, undefined, error);
|
|
448
|
-
|
|
510
|
+
// Never dereference a non-Error throw: this catch must not itself throw, since executeAIAgent resolves on
|
|
511
|
+
// every failure (executeAgentInBackground relies on it).
|
|
512
|
+
const errorMessage = (error instanceof Error && error.message) || 'Unknown error occurred';
|
|
449
513
|
// Fire-and-forget clients otherwise leave the run Running and the
|
|
450
514
|
// conversation detail In-Progress (Explorer red-pill timer).
|
|
451
|
-
await this.persistInFlightAgentFailure(p, userPayload, agentRunRef.current, conversationDetailId, errorMessage);
|
|
515
|
+
await this.persistInFlightAgentFailure(p, userPayload, agentRunRef.current, conversationDetailId, errorMessage, replyDetail);
|
|
516
|
+
// A fire-and-forget client has only this message to learn the run ended: without it, it waits out its
|
|
517
|
+
// idle timeout and then reconciles the run as a success. Published after the rows are closed, so a
|
|
518
|
+
// client that reloads the reply on this message reads the error. PublishFinal is the try's last step
|
|
519
|
+
// that can throw, so a run gets one completion or the other, never both.
|
|
520
|
+
statusPublisher.PublishFailure(conversationDetailId, errorMessage);
|
|
452
521
|
const errorResult = {
|
|
453
522
|
success: false,
|
|
454
523
|
errorMessage,
|
|
@@ -462,11 +531,45 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
462
531
|
};
|
|
463
532
|
}
|
|
464
533
|
}
|
|
534
|
+
/**
|
|
535
|
+
* LATENCY OPTIMIZATION (Opt #6): Runs the three independent post-execution notification/sync
|
|
536
|
+
* operations in parallel via `Promise.all` (shared by the initial run and each handoff hop):
|
|
537
|
+
* 1. `syncFeedbackRequestFromConversation` — links a prior Chat-step feedback request to the new run.
|
|
538
|
+
* 2. `sendFeedbackRequestNotification` — sends an in-app/email/SMS notification when paused for human input.
|
|
539
|
+
* 3. `createCompletionNotification` — sends an in-app/email/SMS notification when an artifact was created.
|
|
540
|
+
*/
|
|
541
|
+
async runPostExecutionNotifications(result, artifactInfo, conversationId, conversationDetailId, lastRunId, userMessage, createNotification, currentUser, pubSub, userPayload, provider) {
|
|
542
|
+
const postExecutionOps = [];
|
|
543
|
+
if (lastRunId && result.agentRun?.ID) {
|
|
544
|
+
postExecutionOps.push(this.syncFeedbackRequestFromConversation(lastRunId, result.agentRun.ID, userMessage, currentUser, provider));
|
|
545
|
+
}
|
|
546
|
+
if (result.feedbackRequestId) {
|
|
547
|
+
postExecutionOps.push(this.sendFeedbackRequestNotification(result, currentUser, pubSub, userPayload));
|
|
548
|
+
}
|
|
549
|
+
if (createNotification
|
|
550
|
+
&& result.success
|
|
551
|
+
&& artifactInfo
|
|
552
|
+
&& artifactInfo.artifactId
|
|
553
|
+
&& artifactInfo.versionId
|
|
554
|
+
&& artifactInfo.versionNumber
|
|
555
|
+
&& conversationDetailId) {
|
|
556
|
+
postExecutionOps.push(this.createCompletionNotification(result.agentRun, {
|
|
557
|
+
artifactId: artifactInfo.artifactId,
|
|
558
|
+
versionId: artifactInfo.versionId,
|
|
559
|
+
versionNumber: artifactInfo.versionNumber
|
|
560
|
+
}, conversationId, conversationDetailId, currentUser, pubSub, userPayload));
|
|
561
|
+
}
|
|
562
|
+
if (postExecutionOps.length > 0) {
|
|
563
|
+
await Promise.all(postExecutionOps);
|
|
564
|
+
}
|
|
565
|
+
}
|
|
465
566
|
/**
|
|
466
567
|
* When executeAIAgent throws after the run/detail exist, close them so Explorer
|
|
467
568
|
* does not leave a red-pill timer on Status=Running / ConversationDetail In-Progress.
|
|
468
569
|
*/
|
|
469
|
-
async persistInFlightAgentFailure(provider, userPayload, run, conversationDetailId, errorMessage
|
|
570
|
+
async persistInFlightAgentFailure(provider, userPayload, run, conversationDetailId, errorMessage,
|
|
571
|
+
/** The run's reply row, when this request created it: written in place, as the server. */
|
|
572
|
+
replyDetail) {
|
|
470
573
|
try {
|
|
471
574
|
if (run && run.Status === 'Running') {
|
|
472
575
|
await run.EnsureSaveComplete();
|
|
@@ -482,7 +585,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
482
585
|
return;
|
|
483
586
|
}
|
|
484
587
|
if (conversationDetailId) {
|
|
485
|
-
const detail = await provider.GetEntityObject('MJ: Conversation Details', user);
|
|
588
|
+
const detail = replyDetail ?? await provider.GetEntityObject('MJ: Conversation Details', user);
|
|
589
|
+
await detail.EnsureSaveComplete(); // the run may still be saving into the same reply instance
|
|
486
590
|
if (await detail.Load(conversationDetailId) && detail.Status === 'In-Progress') {
|
|
487
591
|
await detail.EnsureSaveComplete();
|
|
488
592
|
detail.Status = 'Error';
|
|
@@ -510,6 +614,9 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
510
614
|
// Only the system user or an API key holding the agent:trusted scope may set a run's scope and agent-type
|
|
511
615
|
// params through data; for anyone else BaseAgent drops those keys (ExecuteAgentParams.TrustReservedRunData).
|
|
512
616
|
const trustRunData = await IsTrustedAgentRunCaller({ UserPayload: userPayload, IsWidgetGuestRun: false, AgentID: agentId });
|
|
617
|
+
if (!userPayload.apiKeyHash) {
|
|
618
|
+
this.handoffEligiblePayloads.add(userPayload);
|
|
619
|
+
}
|
|
513
620
|
if (fireAndForget) {
|
|
514
621
|
// Fire-and-forget mode: start execution in background, return immediately.
|
|
515
622
|
// The client will receive the result via WebSocket PubSub completion event.
|
|
@@ -620,15 +727,17 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
620
727
|
}
|
|
621
728
|
}
|
|
622
729
|
/**
|
|
623
|
-
*
|
|
624
|
-
*
|
|
625
|
-
*
|
|
626
|
-
*
|
|
627
|
-
*
|
|
628
|
-
*
|
|
629
|
-
*
|
|
730
|
+
* Discovers whether this agent's newest root run on this conversation/branch path should be
|
|
731
|
+
* chained by `LastRunID` on a chat-thread reply — either because the user stopped it
|
|
732
|
+
* (`reason: 'stopped'`) or because it paused on `FinalStep === 'Chat'` with one or more
|
|
733
|
+
* unanswered sub-agent consultations (`reason: 'open-consult'`).
|
|
734
|
+
*
|
|
735
|
+
* The query spans the runs that could be the predecessor (settled, or stopped by the user)
|
|
736
|
+
* and the newest decides, so a stopped or paused-consult run that a later settled run already
|
|
737
|
+
* followed is not chained to again. Fail-soft: a lookup failure means no chaining, never a
|
|
738
|
+
* failed turn.
|
|
630
739
|
*/
|
|
631
|
-
async
|
|
740
|
+
async findChainablePredecessor(conversationId, agentId, branchId, contextUser, provider) {
|
|
632
741
|
try {
|
|
633
742
|
// The run must have replied on this turn's branch path: a run stopped on a sibling branch is not
|
|
634
743
|
// this path's history. The trunk needs no branch rows; a branch needs them to walk its ancestry.
|
|
@@ -639,16 +748,29 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
639
748
|
ExtraFilter: MJAIAgentRunEntityExtended.BuildStoppedPredecessorFilter(conversationId, agentId, branchId, branches),
|
|
640
749
|
OrderBy: '__mj_CreatedAt DESC',
|
|
641
750
|
MaxRows: 1,
|
|
642
|
-
|
|
751
|
+
SkipTotalRowCount: true,
|
|
752
|
+
Fields: ['ID', 'Status', 'CancellationReason', 'FinalStep'],
|
|
643
753
|
ResultType: 'simple',
|
|
644
|
-
// The row this looks for was written by the Stop button moments ago; read the database, not a cache.
|
|
754
|
+
// The row this looks for was written by the Stop button or a Chat pause moments ago; read the database, not a cache.
|
|
645
755
|
BypassCache: true,
|
|
646
756
|
}, contextUser);
|
|
647
757
|
const run = newest.Success ? newest.Results?.[0] : undefined;
|
|
648
|
-
|
|
758
|
+
if (!run) {
|
|
759
|
+
return null;
|
|
760
|
+
}
|
|
761
|
+
if (MJAIAgentRunEntityExtended.IsUserStopped(run.Status, run.CancellationReason)) {
|
|
762
|
+
return { runId: run.ID, reason: 'stopped' };
|
|
763
|
+
}
|
|
764
|
+
if (run.FinalStep === 'Chat' && CanAgentOwnSubAgentConsults(agentId)) {
|
|
765
|
+
const open = await LoadOpenSubAgentConsults(provider, run.ID, contextUser);
|
|
766
|
+
if (open.length > 0) {
|
|
767
|
+
return { runId: run.ID, reason: 'open-consult' };
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
return null;
|
|
649
771
|
}
|
|
650
772
|
catch (error) {
|
|
651
|
-
LogError(`
|
|
773
|
+
LogError(`findChainablePredecessor failed; the turn runs unchained: ${error instanceof Error ? error.message : String(error)}`);
|
|
652
774
|
return null;
|
|
653
775
|
}
|
|
654
776
|
}
|
|
@@ -661,11 +783,16 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
661
783
|
*/
|
|
662
784
|
async syncFeedbackRequestFromConversation(lastRunId, newRunId, userMessage, contextUser, provider) {
|
|
663
785
|
try {
|
|
786
|
+
const trimmedLastRunId = typeof lastRunId === 'string' ? lastRunId.trim() : '';
|
|
787
|
+
if (!IsValidUUID(trimmedLastRunId)) {
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
664
790
|
const rv = RunView.FromMetadataProvider(provider);
|
|
665
791
|
const result = await rv.RunView({
|
|
666
792
|
EntityName: 'MJ: AI Agent Requests',
|
|
667
|
-
ExtraFilter: `OriginatingAgentRunID='${
|
|
793
|
+
ExtraFilter: `OriginatingAgentRunID='${EscapeSQLString(trimmedLastRunId)}' AND Status='Requested'`,
|
|
668
794
|
MaxRows: 1,
|
|
795
|
+
SkipTotalRowCount: true,
|
|
669
796
|
ResultType: 'entity_object'
|
|
670
797
|
}, contextUser);
|
|
671
798
|
if (!result.Success || !result.Results || result.Results.length === 0) {
|
|
@@ -741,16 +868,25 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
741
868
|
}
|
|
742
869
|
}
|
|
743
870
|
/**
|
|
744
|
-
*
|
|
745
|
-
*
|
|
871
|
+
* Runs an agent's turn in a conversation: the server loads the history (attachments included, so the client never
|
|
872
|
+
* sends them), creates the agent's reply row, and runs the agent into it.
|
|
746
873
|
*
|
|
747
|
-
*
|
|
874
|
+
* Only the server writes agent replies (A19). The reply row (`Role` `AI`, In-Progress, its `ParentID` the user's
|
|
875
|
+
* message) is created here, as the person asking, before the run starts. In fire-and-forget mode the
|
|
876
|
+
* acknowledgement names it, `{ accepted, fireAndForget, conversationDetailId, createdAt }`, and is returned before
|
|
877
|
+
* the run publishes anything; every progress, streaming and completion message carries the same
|
|
878
|
+
* `conversationDetailId`. In synchronous mode the result's `agentRun.ConversationDetailID` names it.
|
|
879
|
+
*
|
|
880
|
+
* Threading, both optional: `replyParentId` puts the reply under another message of the same conversation the
|
|
881
|
+
* caller can read (MJ's chat threads a delegate's reply under the manager's); `announcedByAgentId` has the server
|
|
882
|
+
* first post that agent's fixed line "Continuing with **{agent}** for refinement..." and thread the reply under
|
|
883
|
+
* it, and the acknowledgement then also carries `announcementDetailId`.
|
|
884
|
+
*
|
|
885
|
+
* @param userMessageId - The person's message this turn answers, already saved.
|
|
748
886
|
* @param agentId - The agent to execute
|
|
749
887
|
* @param maxHistoryMessages - Maximum number of history messages to include (default: 20)
|
|
750
888
|
*/
|
|
751
|
-
async RunAIAgentFromConversationDetail(
|
|
752
|
-
// Check API key scope authorization for agent execution
|
|
753
|
-
await this.CheckAPIKeyScopeAuthorization('agent:execute', agentId, userPayload);
|
|
889
|
+
async RunAIAgentFromConversationDetail(userMessageId, agentId, { userPayload, providers, dataSource }, sessionId, pubSub, maxHistoryMessages, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, createArtifacts, createNotification, sourceArtifactId, sourceArtifactVersionId, fireAndForget, planMode, requestedSkillIDs, agentHistoryFrom, replyParentId, announcedByAgentId, replyBranchId) {
|
|
754
890
|
const p = GetReadWriteProvider(providers);
|
|
755
891
|
const currentUser = this.GetUserFromPayload(userPayload);
|
|
756
892
|
if (!currentUser) {
|
|
@@ -765,10 +901,20 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
765
901
|
// AUTHORITATIVELY from the widget instance (never the client-supplied arg) — so a guest needs
|
|
766
902
|
// no grants to WRITE the AI run entities and cannot run an arbitrary agent under elevation.
|
|
767
903
|
// Conversation OWNERSHIP is still enforced under the guest principal below: the guest loads its
|
|
768
|
-
// own ConversationDetail through
|
|
769
|
-
//
|
|
904
|
+
// own ConversationDetail through its role's RLS filters, and startConversationTurn then checks
|
|
905
|
+
// the conversation's scope stamp against the visitor (MJ#6032), so a detail id from another
|
|
906
|
+
// visitor's session is refused before any elevated work happens. The reply row is written
|
|
907
|
+
// as the guest too, never as the elevated principal, which owns no guest's conversation.
|
|
770
908
|
const widgetElevation = await ResolveWidgetGuestRunContext(userPayload, p);
|
|
771
909
|
const effectiveAgentId = widgetElevation ? widgetElevation.PinnedAgentId : agentId;
|
|
910
|
+
// Check API key scope authorization for agent execution against the resolved agent id.
|
|
911
|
+
await this.CheckAPIKeyScopeAuthorization('agent:execute', effectiveAgentId, userPayload);
|
|
912
|
+
// A widget guest has one pinned agent and never posts a continuation announcement as another agent;
|
|
913
|
+
// an API-key caller must hold agent:execute for the announcing agent as well as the running agent.
|
|
914
|
+
const effectiveAnnouncedByAgentId = widgetElevation ? undefined : announcedByAgentId;
|
|
915
|
+
if (effectiveAnnouncedByAgentId) {
|
|
916
|
+
await this.CheckAPIKeyScopeAuthorization('agent:execute', effectiveAnnouncedByAgentId, userPayload);
|
|
917
|
+
}
|
|
772
918
|
const effectiveUserPayload = widgetElevation ? ElevateUserPayload(userPayload, widgetElevation.ElevatedUser) : userPayload;
|
|
773
919
|
// Only the system user or an API key holding the agent:trusted scope may set a run's scope and agent-type
|
|
774
920
|
// params through data (ExecuteAgentParams.TrustReservedRunData). Judged on the caller's own payload: a widget
|
|
@@ -776,60 +922,69 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
776
922
|
const trustRunData = await IsTrustedAgentRunCaller({
|
|
777
923
|
UserPayload: userPayload, IsWidgetGuestRun: widgetElevation !== null, AgentID: agentId,
|
|
778
924
|
});
|
|
925
|
+
if (!userPayload.apiKeyHash && !widgetElevation) {
|
|
926
|
+
this.handoffEligiblePayloads.add(effectiveUserPayload);
|
|
927
|
+
}
|
|
779
928
|
try {
|
|
780
929
|
// Parsed before anything loads: a floor the caller asked for must never be dropped.
|
|
781
930
|
const historyFrom = parseAgentHistoryFrom(agentHistoryFrom);
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
}
|
|
791
|
-
const
|
|
792
|
-
// The branch the
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
//
|
|
796
|
-
//
|
|
931
|
+
const turn = await this.startConversationTurn(p, currentUser, {
|
|
932
|
+
UserMessageId: userMessageId,
|
|
933
|
+
AgentId: effectiveAgentId,
|
|
934
|
+
MaxHistoryMessages: maxHistoryMessages || 20,
|
|
935
|
+
HistoryFrom: historyFrom,
|
|
936
|
+
ReplyParentId: replyParentId,
|
|
937
|
+
AnnouncedByAgentId: effectiveAnnouncedByAgentId,
|
|
938
|
+
ReplyBranchId: replyBranchId
|
|
939
|
+
});
|
|
940
|
+
const reply = turn.Reply;
|
|
941
|
+
// The turn's branch (the message's own branch, or a validated fork whose path holds the message)
|
|
942
|
+
// decides which path the run reads.
|
|
943
|
+
const branchId = turn.BranchId;
|
|
944
|
+
// A turn that follows a run the user STOPPED or a run paused on FinalStep === 'Chat'
|
|
945
|
+
// with an open sub-agent consult continues that run rather than starting over: chain it
|
|
946
|
+
// by LastRunID (the chat client never sends one) and, when the caller supplied no
|
|
947
|
+
// payload, roll the prior run's FinalPayload into this run's start.
|
|
797
948
|
let effectiveLastRunId = lastRunId;
|
|
798
949
|
let effectiveAutoPopulate = autoPopulateLastRunPayload;
|
|
799
950
|
if (!effectiveLastRunId) {
|
|
800
|
-
const
|
|
801
|
-
if (
|
|
802
|
-
effectiveLastRunId =
|
|
951
|
+
const chainable = await this.findChainablePredecessor(turn.ConversationId, effectiveAgentId, branchId, currentUser, p);
|
|
952
|
+
if (chainable) {
|
|
953
|
+
effectiveLastRunId = chainable.runId;
|
|
803
954
|
if (effectiveAutoPopulate === undefined && payload == null) {
|
|
804
955
|
effectiveAutoPopulate = true;
|
|
805
956
|
}
|
|
806
|
-
|
|
957
|
+
if (chainable.reason === 'stopped') {
|
|
958
|
+
LogStatus(`↩️ Continuing from user-stopped run ${chainable.runId} (chained by LastRunID)`);
|
|
959
|
+
}
|
|
960
|
+
else {
|
|
961
|
+
LogStatus(`Resuming open sub-agent consult(s) from run ${chainable.runId} (chained by LastRunID)`);
|
|
962
|
+
}
|
|
807
963
|
}
|
|
808
964
|
}
|
|
809
|
-
// Load conversation history with attachments from DB
|
|
810
|
-
const messages = await this.loadConversationHistoryWithAttachments(conversationId, currentUser, maxHistoryMessages || 20, p,
|
|
811
|
-
// The UI creates the agent-response placeholder row ('⏳ ...') before invoking
|
|
812
|
-
// this mutation — exclude it so the model never sees an empty assistant turn.
|
|
813
|
-
[conversationDetailId], historyFrom, branchId);
|
|
814
|
-
// Convert to JSON string for the existing executeAIAgent method
|
|
815
|
-
const messagesJson = JSON.stringify(messages);
|
|
816
965
|
if (fireAndForget) {
|
|
817
966
|
// Fire-and-forget mode: start execution in background, return immediately.
|
|
818
967
|
// The client will receive the result via WebSocket PubSub completion event.
|
|
819
|
-
this.executeAgentInBackground(p, dataSource, effectiveAgentId, effectiveUserPayload,
|
|
820
|
-
historyFrom, trustRunData, branchId);
|
|
968
|
+
this.executeAgentInBackground(p, dataSource, effectiveAgentId, effectiveUserPayload, turn.MessagesJson, sessionId, pubSub, data, payload, effectiveLastRunId, effectiveAutoPopulate, configurationId, reply.ID, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, turn.ConversationId, planMode, requestedSkillIDs, undefined, // taskGraphDebug
|
|
969
|
+
historyFrom, trustRunData, branchId, reply);
|
|
821
970
|
LogStatus(`🔥 Fire-and-forget: Agent ${effectiveAgentId} execution started in background for session ${sessionId}`);
|
|
822
971
|
return {
|
|
823
972
|
success: true,
|
|
824
|
-
result: JSON.stringify({
|
|
973
|
+
result: JSON.stringify({
|
|
974
|
+
accepted: true,
|
|
975
|
+
fireAndForget: true,
|
|
976
|
+
conversationDetailId: reply.ID,
|
|
977
|
+
createdAt: reply.__mj_CreatedAt,
|
|
978
|
+
...(turn.Announcement ? { announcementDetailId: turn.Announcement.ID } : {})
|
|
979
|
+
})
|
|
825
980
|
};
|
|
826
981
|
}
|
|
827
982
|
// Synchronous mode (default): wait for execution to complete
|
|
828
|
-
return this.executeAIAgent(p, dataSource, effectiveAgentId, effectiveUserPayload,
|
|
829
|
-
effectiveLastRunId, effectiveAutoPopulate, configurationId,
|
|
983
|
+
return this.executeAIAgent(p, dataSource, effectiveAgentId, effectiveUserPayload, turn.MessagesJson, sessionId, pubSub, data, payload, undefined, // templateData
|
|
984
|
+
effectiveLastRunId, effectiveAutoPopulate, configurationId, reply.ID, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, turn.ConversationId, // LATENCY OPT #2: pass pre-resolved conversationId
|
|
830
985
|
undefined, // runRef
|
|
831
986
|
planMode, requestedSkillIDs, undefined, // taskGraphDebug
|
|
832
|
-
historyFrom, trustRunData, branchId);
|
|
987
|
+
historyFrom, trustRunData, branchId, reply);
|
|
833
988
|
}
|
|
834
989
|
catch (error) {
|
|
835
990
|
const errorMessage = error.message || 'Unknown error loading conversation history';
|
|
@@ -841,6 +996,110 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
841
996
|
};
|
|
842
997
|
}
|
|
843
998
|
}
|
|
999
|
+
/**
|
|
1000
|
+
* Everything a conversation turn needs before its agent runs: the user's message (read as the caller, so a
|
|
1001
|
+
* message they can't see is "not found", and for an anonymous visitor also checked against the conversation's
|
|
1002
|
+
* scope stamp), the conversation history, the optional announcement line, and the reply
|
|
1003
|
+
* row, created last so the history never holds the empty reply. Every row is written as `user`, the person asking,
|
|
1004
|
+
* and marked as server-authored by {@link AgentRunner.CreateAgentReplyDetail}.
|
|
1005
|
+
*/
|
|
1006
|
+
async startConversationTurn(p, user, request) {
|
|
1007
|
+
// LATENCY OPTIMIZATION (Opt #2 + #3): the user's message is loaded once here for its conversation and
|
|
1008
|
+
// branch, which are threaded through the call chain rather than reloaded downstream.
|
|
1009
|
+
const placement = await this.loadPlacementOf(p, user, request.UserMessageId);
|
|
1010
|
+
const conversationId = placement.ConversationId;
|
|
1011
|
+
// Loading the message as the caller is the whole ownership check for a named user. It is not for an
|
|
1012
|
+
// anonymous visitor: every visitor is the one shared Anonymous user, so under a guest role whose row
|
|
1013
|
+
// filters key on UserID another visitor's message loads fine (MJ#6032). The conversation's scope stamp
|
|
1014
|
+
// decides instead, exactly as it does for the realtime gates — and before any row is written.
|
|
1015
|
+
const access = await AuthorizeConversationTurn(conversationId, user, p);
|
|
1016
|
+
if (!access.Allowed) {
|
|
1017
|
+
LogError(`RunAIAgentFromConversationDetail: anonymous visitor ${user.AnonymousVisitorID ?? '(no visitor id)'} refused a turn in conversation ${conversationId} (${access.Reason})`);
|
|
1018
|
+
throw new Error('Not authorized: you do not own this conversation');
|
|
1019
|
+
}
|
|
1020
|
+
const branchId = request.ReplyBranchId
|
|
1021
|
+
? await this.validateReplyBranch(p, user, conversationId, placement, request.ReplyBranchId)
|
|
1022
|
+
: placement.BranchId;
|
|
1023
|
+
const parentId = request.ReplyParentId
|
|
1024
|
+
? await this.validateReplyParent(p, user, request.ReplyParentId, conversationId)
|
|
1025
|
+
: request.UserMessageId;
|
|
1026
|
+
const messages = await this.loadConversationHistoryWithAttachments(conversationId, user, request.MaxHistoryMessages, p, undefined, request.HistoryFrom, branchId);
|
|
1027
|
+
const runner = new AgentRunner(p);
|
|
1028
|
+
const announcement = request.AnnouncedByAgentId
|
|
1029
|
+
? await this.postContinuationAnnouncement(runner, user, conversationId, branchId, parentId, request.AnnouncedByAgentId, request.AgentId)
|
|
1030
|
+
: undefined;
|
|
1031
|
+
const reply = await runner.CreateAgentReplyDetail({
|
|
1032
|
+
conversationId,
|
|
1033
|
+
branchId,
|
|
1034
|
+
agentId: request.AgentId,
|
|
1035
|
+
contextUser: user,
|
|
1036
|
+
parentId: announcement?.ID ?? parentId,
|
|
1037
|
+
provider: p
|
|
1038
|
+
});
|
|
1039
|
+
return { ConversationId: conversationId, BranchId: branchId, MessagesJson: JSON.stringify(messages), Reply: reply, Announcement: announcement };
|
|
1040
|
+
}
|
|
1041
|
+
/** The conversation, branch (null is Main) and sequence of a message, read as `user`; throws when they can't read it. */
|
|
1042
|
+
async loadPlacementOf(p, user, messageId) {
|
|
1043
|
+
const message = await p.GetEntityObject('MJ: Conversation Details', user);
|
|
1044
|
+
if (!await message.Load(messageId)) {
|
|
1045
|
+
throw new Error(`Conversation detail ${messageId} not found`);
|
|
1046
|
+
}
|
|
1047
|
+
return { ConversationId: message.ConversationID, BranchId: message.BranchID ?? null, Sequence: message.Sequence ?? -1 };
|
|
1048
|
+
}
|
|
1049
|
+
/**
|
|
1050
|
+
* When a turn forks from an earlier message (such as Regenerate), the reply and history run on the fork while the
|
|
1051
|
+
* user's message stays on the branch it was written on. Checks that `replyBranchId` is a branch of the turn's
|
|
1052
|
+
* conversation whose path holds the user's message (`IsRowOnBranchPath` rather than exact `ForkFromSequence`
|
|
1053
|
+
* equality is deliberate: `ConversationEngine.ForkPointFrom` sets `ForkFromSequence = message.Sequence` and the
|
|
1054
|
+
* fork belongs to this conversation); returns `replyBranchId`, or throws before any row is created.
|
|
1055
|
+
*/
|
|
1056
|
+
async validateReplyBranch(p, user, conversationId, userMessage, replyBranchId) {
|
|
1057
|
+
if (UUIDsEqual(replyBranchId, userMessage.BranchId)) {
|
|
1058
|
+
return replyBranchId;
|
|
1059
|
+
}
|
|
1060
|
+
if (userMessage.Sequence < 0) {
|
|
1061
|
+
throw new Error(`Conversation detail is not on branch ${replyBranchId}'s path, so the reply cannot be written on that branch`);
|
|
1062
|
+
}
|
|
1063
|
+
const branches = await ConversationEngine.LoadBranchesFresh(conversationId, user, p);
|
|
1064
|
+
const chain = ConversationEngine.BuildBranchChain(branches, replyBranchId);
|
|
1065
|
+
if (!ConversationEngine.IsRowOnBranchPath({ BranchID: userMessage.BranchId, Sequence: userMessage.Sequence }, chain)) {
|
|
1066
|
+
throw new Error(`Conversation detail is not on branch ${replyBranchId}'s path, so the reply cannot be written on that branch`);
|
|
1067
|
+
}
|
|
1068
|
+
return replyBranchId;
|
|
1069
|
+
}
|
|
1070
|
+
/**
|
|
1071
|
+
* A reply's parent is part of what the reply says, so the server sets it, from a checked input: a message the
|
|
1072
|
+
* caller can read, in the turn's own conversation. Returns its ID; throws otherwise.
|
|
1073
|
+
*/
|
|
1074
|
+
async validateReplyParent(p, user, parentId, conversationId) {
|
|
1075
|
+
const { ConversationId: parentConversationId } = await this.loadPlacementOf(p, user, parentId);
|
|
1076
|
+
if (!UUIDsEqual(parentConversationId, conversationId)) {
|
|
1077
|
+
throw new Error(`Conversation detail ${parentId} is not in this turn's conversation, so the reply cannot thread under it`);
|
|
1078
|
+
}
|
|
1079
|
+
return parentId;
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* Posts the announcing agent's line, "Continuing with **{agent}** for refinement...", as a completed reply of the
|
|
1083
|
+
* announcing agent. Its text is fixed and names the agent from metadata, so a caller chooses only whether it is
|
|
1084
|
+
* posted and by which active agent, never what it says.
|
|
1085
|
+
*/
|
|
1086
|
+
async postContinuationAnnouncement(runner, user, conversationId, branchId, parentId, announcerId, agentId) {
|
|
1087
|
+
await AIEngine.Instance.Config(false, user);
|
|
1088
|
+
const announcer = AIEngine.Instance.GetAgentByID(announcerId);
|
|
1089
|
+
if (!announcer || announcer.Status !== 'Active') {
|
|
1090
|
+
throw new Error(`Agent ${announcerId} cannot announce the turn: it is not an active agent`);
|
|
1091
|
+
}
|
|
1092
|
+
const agentName = AIEngine.Instance.GetAgentByID(agentId)?.Name ?? 'the agent';
|
|
1093
|
+
return runner.CreateAgentReplyDetail({
|
|
1094
|
+
conversationId,
|
|
1095
|
+
branchId,
|
|
1096
|
+
agentId: announcer.ID,
|
|
1097
|
+
contextUser: user,
|
|
1098
|
+
parentId,
|
|
1099
|
+
message: ContinuationAnnouncementText(agentName),
|
|
1100
|
+
status: 'Complete'
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
844
1103
|
/**
|
|
845
1104
|
* Respond to a pending AIAgentRequest from the dashboard or API.
|
|
846
1105
|
* Updates the request record with the response and optionally spawns a
|
|
@@ -985,9 +1244,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
985
1244
|
}
|
|
986
1245
|
/**
|
|
987
1246
|
* Execute agent in background (fire-and-forget).
|
|
988
|
-
*
|
|
989
|
-
*
|
|
990
|
-
* has already been sent.
|
|
1247
|
+
* The client learns the outcome only from the run's completion status message (executeAIAgent publishes it,
|
|
1248
|
+
* failure included), since the HTTP response has already been sent. A liveness pulse runs until the run ends.
|
|
991
1249
|
*/
|
|
992
1250
|
executeAgentInBackground(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts = false, createNotification = false, sourceArtifactId, sourceArtifactVersionId,
|
|
993
1251
|
/** LATENCY OPT #2: Pre-resolved conversationId avoids redundant DB load in AgentRunner */
|
|
@@ -1001,27 +1259,26 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
1001
1259
|
/** ExecuteAgentParams.TrustReservedRunData — see executeAIAgent. */
|
|
1002
1260
|
trustReservedRunData = false,
|
|
1003
1261
|
/** The conversation branch of the run — threaded through to ExecuteAgentParams.ConversationBranchID. */
|
|
1004
|
-
conversationBranchId
|
|
1262
|
+
conversationBranchId,
|
|
1263
|
+
/** The reply row this request created for the run — see executeAIAgent. */
|
|
1264
|
+
replyDetail) {
|
|
1005
1265
|
// Ref the liveness pulse reads to enrich heartbeats once the run is created.
|
|
1006
1266
|
const runRef = { current: null };
|
|
1007
1267
|
const pulse = StartLivenessPulse({
|
|
1008
1268
|
pubSub,
|
|
1009
1269
|
sessionId,
|
|
1010
|
-
ownerUserId: userPayload
|
|
1270
|
+
ownerUserId: StatusUpdateOwnerID(userPayload),
|
|
1011
1271
|
resolver: 'RunAIAgentResolver',
|
|
1012
1272
|
readStatus: () => runRef.current
|
|
1013
1273
|
? { runId: runRef.current.ID, status: runRef.current.Status }
|
|
1014
1274
|
: undefined,
|
|
1015
1275
|
});
|
|
1016
|
-
//
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
//
|
|
1020
|
-
|
|
1021
|
-
LogError(`🔥 Fire-and-forget
|
|
1022
|
-
// Publish error completion event so the client knows the agent failed.
|
|
1023
|
-
// The publisher is created inside executeAIAgent, which rejected before returning one.
|
|
1024
|
-
new AgentRunStatusPublisher(pubSub, userPayload, sessionId).PublishFailure(conversationDetailId, errorMessage);
|
|
1276
|
+
// executeAIAgent resolves on every failure and publishes the run's completion itself (PublishFinal, or
|
|
1277
|
+
// PublishFailure from its catch), so nothing here publishes one.
|
|
1278
|
+
this.executeAIAgent(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, undefined, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts, createNotification, sourceArtifactId, sourceArtifactVersionId, conversationId, runRef, planMode, requestedSkillIDs, taskGraphDebug, conversationHistoryFrom, trustReservedRunData, conversationBranchId, replyDetail).catch((error) => {
|
|
1279
|
+
// Only a broken executeAIAgent contract lands here. Logged rather than left as an unhandled rejection;
|
|
1280
|
+
// no completion is published, because executeAIAgent may already have sent one.
|
|
1281
|
+
LogError(`🔥 Fire-and-forget run of agent ${agentId} for session ${sessionId} rejected, which executeAIAgent never should`, undefined, error);
|
|
1025
1282
|
}).finally(() => pulse.Stop());
|
|
1026
1283
|
}
|
|
1027
1284
|
/**
|
|
@@ -1048,7 +1305,9 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
1048
1305
|
/** History floor: only rows written at or after it are loaded, and no summary is used. */
|
|
1049
1306
|
historyFrom,
|
|
1050
1307
|
/** The branch whose path to load; null reads the trunk. */
|
|
1051
|
-
branchId
|
|
1308
|
+
branchId,
|
|
1309
|
+
/** Speaker attribution mode forwarded to `ConversationEngine.AssembleContextWindow`. */
|
|
1310
|
+
speakerAttribution) {
|
|
1052
1311
|
// Context windowing (summary boundary + raw tail, or legacy last-N when no
|
|
1053
1312
|
// summary exists) shares ONE fold implementation with all other callers —
|
|
1054
1313
|
// ConversationEngine.AssembleContextWindow — and the ROWS come from the
|
|
@@ -1068,7 +1327,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
1068
1327
|
const window = ConversationEngine.AssembleContextWindow(rows, {
|
|
1069
1328
|
maxTailMessages: maxMessages,
|
|
1070
1329
|
excludeDetailIds,
|
|
1071
|
-
historyFrom
|
|
1330
|
+
historyFrom,
|
|
1331
|
+
speakerAttribution
|
|
1072
1332
|
});
|
|
1073
1333
|
// Batch load input artifacts for the windowed messages. Since the backfill migration
|
|
1074
1334
|
// (V202605271400__Backfill_Attachment_Artifacts) converted all legacy
|
|
@@ -1318,7 +1578,7 @@ __decorate([
|
|
|
1318
1578
|
], RunAIAgentResolver.prototype, "RunAIAgentSystemUser", null);
|
|
1319
1579
|
__decorate([
|
|
1320
1580
|
Mutation(() => AIAgentRunResult),
|
|
1321
|
-
__param(0, Arg('
|
|
1581
|
+
__param(0, Arg('userMessageId')),
|
|
1322
1582
|
__param(1, Arg('agentId')),
|
|
1323
1583
|
__param(2, Ctx()),
|
|
1324
1584
|
__param(3, Arg('sessionId')),
|
|
@@ -1337,8 +1597,11 @@ __decorate([
|
|
|
1337
1597
|
__param(16, Arg('planMode', { nullable: true })),
|
|
1338
1598
|
__param(17, Arg('requestedSkillIDs', () => [String], { nullable: true })),
|
|
1339
1599
|
__param(18, Arg('agentHistoryFrom', { nullable: true })),
|
|
1600
|
+
__param(19, Arg('replyParentId', { nullable: true })),
|
|
1601
|
+
__param(20, Arg('announcedByAgentId', { nullable: true })),
|
|
1602
|
+
__param(21, Arg('replyBranchId', { nullable: true })),
|
|
1340
1603
|
__metadata("design:type", Function),
|
|
1341
|
-
__metadata("design:paramtypes", [String, String, Object, String, PubSubEngine, Number, String, String, String, Boolean, String, Boolean, Boolean, String, String, Boolean, Boolean, Array, String]),
|
|
1604
|
+
__metadata("design:paramtypes", [String, String, Object, String, PubSubEngine, Number, String, String, String, Boolean, String, Boolean, Boolean, String, String, Boolean, Boolean, Array, String, String, String, String]),
|
|
1342
1605
|
__metadata("design:returntype", Promise)
|
|
1343
1606
|
], RunAIAgentResolver.prototype, "RunAIAgentFromConversationDetail", null);
|
|
1344
1607
|
__decorate([
|