@memberjunction/server 6.2.0-edge.4 → 6.2.0-edge.6
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 +47 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +91 -30
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +311 -81
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +17 -3
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +44 -10
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/apiRoot.d.ts +32 -0
- package/dist/apiRoot.d.ts.map +1 -0
- package/dist/apiRoot.js +67 -0
- package/dist/apiRoot.js.map +1 -0
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +27 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/LoginScreenEngine.d.ts +22 -0
- package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
- package/dist/auth/LoginScreenEngine.js +57 -0
- package/dist/auth/LoginScreenEngine.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +52 -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/magicLink/MagicLinkKeys.d.ts +2 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +12 -0
- package/dist/auth/magicLink/types.d.ts.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/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 +632 -22
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +104 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +3 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -8
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +29 -0
- package/dist/coreRoutes.d.ts.map +1 -0
- package/dist/coreRoutes.js +156 -0
- package/dist/coreRoutes.js.map +1 -0
- package/dist/generated/graphql-schemas/__mj.d.ts +1016 -29
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +5125 -434
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +85 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +175 -60
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
- 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 +94 -12
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +168 -69
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +464 -405
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +11 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +91 -13
- 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/globalCors.d.ts +33 -0
- package/dist/globalCors.d.ts.map +1 -0
- package/dist/globalCors.js +58 -0
- package/dist/globalCors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +230 -222
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +6 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- 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/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +22 -2
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
- 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/index.d.ts +2 -0
- package/dist/realtimeSessions/index.d.ts.map +1 -1
- package/dist/realtimeSessions/index.js +2 -0
- package/dist/realtimeSessions/index.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +32 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js +56 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
- package/dist/realtimeSessions/sessionAccess.d.ts +91 -8
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +127 -20
- 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 +201 -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/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +17 -1
- 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 +2 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- 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 +40 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.js +9 -7
- package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts +24 -3
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +57 -8
- package/dist/resolvers/DatasetResolver.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/EntityRecordNameResolver.d.ts +2 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +3 -2
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +46 -3
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +211 -50
- 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 +87 -11
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +292 -105
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +117 -38
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +6 -3
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +49 -9
- package/dist/resolvers/IntegrationDiscoveryResolver.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 +2 -0
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +33 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +15 -6
- 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/RealtimeClientSessionResolver.d.ts +18 -10
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +92 -54
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +241 -67
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +4 -4
- 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/SearchKnowledgeStreamResolver.d.ts +12 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
- package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
- package/dist/resolvers/SqlLoggingConfigResolver.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/TaskGraphFrameResolver.d.ts +2 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +66 -13
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +34 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +150 -27
- 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/agent-run-data-guard.d.ts +31 -0
- package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
- package/dist/resolvers/agent-run-data-guard.js +72 -0
- package/dist/resolvers/agent-run-data-guard.js.map +1 -0
- 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/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 +49 -0
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
- package/dist/rest/RealtimeRecordingHandler.js +383 -0
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts +9 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +43 -17
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +6 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +6 -0
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverExtensionReservedRoots.d.ts +12 -10
- package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
- package/dist/serverExtensionReservedRoots.js +14 -17
- package/dist/serverExtensionReservedRoots.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/MJStorageBlobStore.d.ts +8 -1
- package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
- package/dist/services/MJStorageBlobStore.js +25 -19
- package/dist/services/MJStorageBlobStore.js.map +1 -1
- package/dist/services/StartTaskGraphDispatcher.js +2 -2
- package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +5 -3
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +27 -5
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +157 -9
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +59 -2
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +626 -16
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/sharedCache.d.ts.map +1 -1
- package/dist/sharedCache.js +3 -0
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +23 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +99 -98
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -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 +137 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +369 -18
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
- package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
- package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
- package/src/__tests__/LoginScreenEngine.test.ts +86 -0
- package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
- package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
- package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
- package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +243 -7
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -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 +69 -13
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +20 -28
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +264 -0
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
- package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
- package/src/__tests__/SessionJanitor.test.ts +365 -10
- package/src/__tests__/SessionManager.test.ts +122 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
- package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +468 -23
- package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
- package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
- package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/agent-run-data-guard.test.ts +130 -0
- package/src/__tests__/apiRootBoot.test.ts +202 -0
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +109 -0
- package/src/__tests__/conversationRunEvents.test.ts +56 -14
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +217 -0
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
- package/src/__tests__/multiTenancy.security.test.ts +51 -0
- package/src/__tests__/multiTenancy.test.ts +1 -1
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +64 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +669 -0
- 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 +146 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- 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__/serverExtensionHostOverlay.test.ts +66 -0
- package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/sharedCache.test.ts +5 -3
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +28 -0
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/SessionJanitor.ts +369 -93
- package/src/agentSessions/SessionManager.ts +45 -10
- package/src/apiRoot.ts +78 -0
- package/src/auth/AuthProviderCatalogRouter.ts +29 -0
- package/src/auth/LoginScreenEngine.ts +50 -0
- package/src/auth/index.ts +57 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
- package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
- package/src/auth/magicLink/types.ts +10 -0
- package/src/auth/sessionUserClone.ts +3 -2
- 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 +115 -5
- package/src/context.ts +32 -8
- package/src/coreRoutes.ts +181 -0
- package/src/generated/graphql-schemas/__mj.ts +3684 -284
- package/src/generic/CacheInvalidationResolver.ts +172 -60
- package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +109 -12
- package/src/generic/ResolverBase.ts +540 -431
- package/src/generic/RunViewResolver.ts +97 -15
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/globalCors.ts +71 -0
- package/src/index.ts +239 -238
- package/src/integration/CustomColumnPromoter.ts +6 -1
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/multiTenancy/index.ts +24 -2
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
- package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
- package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/index.ts +2 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +69 -0
- package/src/realtimeSessions/sessionAccess.ts +183 -23
- 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 +252 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/widgetCore.ts +30 -1
- package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
- 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 +46 -18
- package/src/resolvers/ArtifactFileResolver.ts +9 -8
- package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
- package/src/resolvers/DatasetResolver.ts +70 -10
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/EntityRecordNameResolver.ts +3 -2
- package/src/resolvers/FetchEntityVectorsResolver.ts +248 -55
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +334 -109
- package/src/resolvers/GetDataContextDataResolver.ts +139 -41
- package/src/resolvers/GetDataResolver.ts +6 -3
- package/src/resolvers/IntegrationDiscoveryResolver.ts +53 -9
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +31 -6
- package/src/resolvers/QuerySystemUserResolver.ts +15 -6
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +114 -66
- package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
- package/src/resolvers/RunAIAgentResolver.ts +296 -85
- package/src/resolvers/RunTemplateResolver.ts +6 -4
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
- package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
- package/src/resolvers/TestQuerySQLResolver.ts +69 -13
- package/src/resolvers/TransactionGroupResolver.ts +185 -30
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/resolvers/agent-run-data-guard.ts +89 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +467 -0
- package/src/rest/ViewOperationsHandler.ts +52 -18
- package/src/rest/setupRESTEndpoints.ts +6 -0
- package/src/serverExtensionReservedRoots.ts +14 -17
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/MJStorageBlobStore.ts +31 -30
- package/src/services/StartTaskGraphDispatcher.ts +2 -2
- package/src/services/TaskGraphActionRunner.ts +25 -5
- package/src/services/TaskGraphAgentRunner.ts +188 -11
- package/src/services/TaskGraphContinuationDeliverer.ts +738 -16
- package/src/sharedCache.ts +3 -0
- package/src/types.ts +23 -1
|
@@ -15,14 +15,18 @@ 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
17
|
import { AgentRunner, ArtifactToolManager } from '@memberjunction/ai-agents';
|
|
18
|
-
import { MJAIAgentRunEntityExtended, ConversationUtility } from '@memberjunction/ai-core-plus';
|
|
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';
|
|
29
|
+
import { IsTrustedAgentRunCaller } from './agent-run-data-guard.js';
|
|
26
30
|
import { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';
|
|
27
31
|
import { GetAttachmentService } from '@memberjunction/aiengine';
|
|
28
32
|
import { NotificationEngine } from '@memberjunction/notifications';
|
|
@@ -211,7 +215,7 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
211
215
|
* Sanitize ExecuteAgentResult for JSON serialization
|
|
212
216
|
* Removes circular references and non-serializable objects
|
|
213
217
|
*/
|
|
214
|
-
sanitizeAgentResult(result) {
|
|
218
|
+
sanitizeAgentResult(result, recipient) {
|
|
215
219
|
const sanitized = {
|
|
216
220
|
success: result.success,
|
|
217
221
|
payload: result.payload,
|
|
@@ -226,8 +230,9 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
226
230
|
};
|
|
227
231
|
// Safely extract agent run data using GetAll() for proper serialization
|
|
228
232
|
if (result.agentRun && typeof result.agentRun.GetAll === 'function') {
|
|
229
|
-
//
|
|
230
|
-
|
|
233
|
+
// GetAll() for the full serialized object including extended properties, projected for
|
|
234
|
+
// the recipient: the run comes from the agent engine, not from a load bound to them
|
|
235
|
+
sanitized.agentRun = ProjectEntityObjectForCaller(result.agentRun, recipient);
|
|
231
236
|
}
|
|
232
237
|
else {
|
|
233
238
|
// shouldn't ever get here
|
|
@@ -280,6 +285,13 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
280
285
|
if (agentEntity.Status !== 'Active') {
|
|
281
286
|
throw new Error(`AI Agent "${agentEntity.Name}" is not active (Status: ${agentEntity.Status})`);
|
|
282
287
|
}
|
|
288
|
+
// Enforce agent run permissions for the calling user
|
|
289
|
+
if (currentUser && typeof AIEngine.Instance.CanUserRunAgent === 'function') {
|
|
290
|
+
const canRun = await AIEngine.Instance.CanUserRunAgent(agentEntity.ID, currentUser);
|
|
291
|
+
if (!canRun) {
|
|
292
|
+
throw new Error(`User does not have permission to run AI Agent "${agentEntity.Name}" (${agentEntity.ID})`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
283
295
|
return agentEntity;
|
|
284
296
|
}
|
|
285
297
|
/**
|
|
@@ -303,8 +315,13 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
303
315
|
/** History floor for a conversation run — threaded into ExecuteAgentParams.ConversationHistoryFrom,
|
|
304
316
|
* so the framework's own conversation reads (retrieval tools, artifacts, compaction) honour it too. */
|
|
305
317
|
conversationHistoryFrom,
|
|
318
|
+
/** ExecuteAgentParams.TrustReservedRunData: true only for a caller IsTrustedAgentRunCaller accepts. */
|
|
319
|
+
trustReservedRunData = false,
|
|
306
320
|
/** The conversation branch of the run — threaded into ExecuteAgentParams.ConversationBranchID. */
|
|
307
|
-
conversationBranchId
|
|
321
|
+
conversationBranchId,
|
|
322
|
+
/** The reply row this request created on the server for the run (`conversationDetailId` is its ID). The run
|
|
323
|
+
* writes into this instance, so its writes carry the server-authored marker and the user it was made as. */
|
|
324
|
+
replyDetail) {
|
|
308
325
|
const startTime = Date.now();
|
|
309
326
|
// Best-effort handle for persistInFlightAgentFailure. Populated from a
|
|
310
327
|
// progress event carrying metadata.agentRun, or from the successful
|
|
@@ -312,6 +329,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
312
329
|
// run is not marked Failed — the early-failure case we most want to
|
|
313
330
|
// persist, but we have no run object yet.
|
|
314
331
|
const agentRunRef = runRef ?? { current: null };
|
|
332
|
+
// The publisher owns every status message, including the failure completion the catch below sends.
|
|
333
|
+
const statusPublisher = new AgentRunStatusPublisher(pubSub, userPayload, sessionId, conversationDetailId);
|
|
315
334
|
try {
|
|
316
335
|
LogStatus(`=== RUNNING AI AGENT FOR ID: ${agentId} ===`);
|
|
317
336
|
// Parse and validate messages
|
|
@@ -336,9 +355,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
336
355
|
// singleton's transaction state with concurrent requests (e.g. conversation deletes).
|
|
337
356
|
const agentRunner = new AgentRunner(p);
|
|
338
357
|
console.log(`🚀 Starting agent execution with sessionId: ${sessionId}`);
|
|
339
|
-
// The
|
|
340
|
-
//
|
|
341
|
-
const statusPublisher = new AgentRunStatusPublisher(pubSub, userPayload, sessionId);
|
|
358
|
+
// The resolver still copies the run into agentRunRef, including noise steps, for the
|
|
359
|
+
// fire-and-forget liveness pulse.
|
|
342
360
|
const publishProgress = statusPublisher.OnProgress;
|
|
343
361
|
// Execute the agent in conversation context - handles conversation, artifacts, etc.
|
|
344
362
|
const conversationResult = await agentRunner.RunAgentInConversation({
|
|
@@ -364,15 +382,20 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
364
382
|
ConversationHistoryFrom: conversationHistoryFrom,
|
|
365
383
|
...(conversationBranchId ? { ConversationBranchID: conversationBranchId } : {}),
|
|
366
384
|
data: parsedData,
|
|
385
|
+
// Whether the run may read the reserved data keys (scope, agent-type params); BaseAgent drops them otherwise.
|
|
386
|
+
TrustReservedRunData: trustReservedRunData,
|
|
367
387
|
context: {
|
|
368
388
|
dataSource: dataSource
|
|
369
389
|
}
|
|
370
390
|
}, {
|
|
371
391
|
conversationDetailId: conversationDetailId, // Use existing if provided
|
|
392
|
+
agentResponseDetail: replyDetail, // the reply row this request created, when it did
|
|
372
393
|
conversationId: conversationId, // LATENCY OPT #2: pre-resolved to skip redundant load in AgentRunner
|
|
373
394
|
userMessage: userMessage, // Provide user message when conversationDetailId not provided
|
|
374
395
|
createArtifacts: createArtifacts || false,
|
|
375
|
-
sourceArtifactId: sourceArtifactId
|
|
396
|
+
sourceArtifactId: sourceArtifactId,
|
|
397
|
+
// A widget guest runs as the system user, but its conversation stays the guest's to write (MJ#4791).
|
|
398
|
+
ConversationWriter: userPayload.ElevatedFrom,
|
|
376
399
|
});
|
|
377
400
|
const result = conversationResult.agentResult;
|
|
378
401
|
// Use agent response detail ID if available, otherwise fall back to user message detail ID
|
|
@@ -412,7 +435,7 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
412
435
|
await Promise.all(postExecutionOps);
|
|
413
436
|
}
|
|
414
437
|
// Create sanitized payload for JSON serialization
|
|
415
|
-
const sanitizedResult = this.sanitizeAgentResult(result);
|
|
438
|
+
const sanitizedResult = this.sanitizeAgentResult(result, currentUser);
|
|
416
439
|
const returnResult = JSON.stringify(sanitizedResult);
|
|
417
440
|
// Publish final events with enriched result data for fire-and-forget clients
|
|
418
441
|
statusPublisher.PublishFinal(result, result.agentRun?.ConversationDetailID, returnResult);
|
|
@@ -433,10 +456,17 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
433
456
|
catch (error) {
|
|
434
457
|
const executionTime = Date.now() - startTime;
|
|
435
458
|
LogError(`AI Agent run failed:`, undefined, error);
|
|
436
|
-
|
|
459
|
+
// Never dereference a non-Error throw: this catch must not itself throw, since executeAIAgent resolves on
|
|
460
|
+
// every failure (executeAgentInBackground relies on it).
|
|
461
|
+
const errorMessage = (error instanceof Error && error.message) || 'Unknown error occurred';
|
|
437
462
|
// Fire-and-forget clients otherwise leave the run Running and the
|
|
438
463
|
// conversation detail In-Progress (Explorer red-pill timer).
|
|
439
|
-
await this.persistInFlightAgentFailure(p, userPayload, agentRunRef.current, conversationDetailId, errorMessage);
|
|
464
|
+
await this.persistInFlightAgentFailure(p, userPayload, agentRunRef.current, conversationDetailId, errorMessage, replyDetail);
|
|
465
|
+
// A fire-and-forget client has only this message to learn the run ended: without it, it waits out its
|
|
466
|
+
// idle timeout and then reconciles the run as a success. Published after the rows are closed, so a
|
|
467
|
+
// client that reloads the reply on this message reads the error. PublishFinal is the try's last step
|
|
468
|
+
// that can throw, so a run gets one completion or the other, never both.
|
|
469
|
+
statusPublisher.PublishFailure(conversationDetailId, errorMessage);
|
|
440
470
|
const errorResult = {
|
|
441
471
|
success: false,
|
|
442
472
|
errorMessage,
|
|
@@ -454,7 +484,9 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
454
484
|
* When executeAIAgent throws after the run/detail exist, close them so Explorer
|
|
455
485
|
* does not leave a red-pill timer on Status=Running / ConversationDetail In-Progress.
|
|
456
486
|
*/
|
|
457
|
-
async persistInFlightAgentFailure(provider, userPayload, run, conversationDetailId, errorMessage
|
|
487
|
+
async persistInFlightAgentFailure(provider, userPayload, run, conversationDetailId, errorMessage,
|
|
488
|
+
/** The run's reply row, when this request created it: written in place, as the server. */
|
|
489
|
+
replyDetail) {
|
|
458
490
|
try {
|
|
459
491
|
if (run && run.Status === 'Running') {
|
|
460
492
|
await run.EnsureSaveComplete();
|
|
@@ -470,7 +502,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
470
502
|
return;
|
|
471
503
|
}
|
|
472
504
|
if (conversationDetailId) {
|
|
473
|
-
const detail = await provider.GetEntityObject('MJ: Conversation Details', user);
|
|
505
|
+
const detail = replyDetail ?? await provider.GetEntityObject('MJ: Conversation Details', user);
|
|
506
|
+
await detail.EnsureSaveComplete(); // the run may still be saving into the same reply instance
|
|
474
507
|
if (await detail.Load(conversationDetailId) && detail.Status === 'In-Progress') {
|
|
475
508
|
await detail.EnsureSaveComplete();
|
|
476
509
|
detail.Status = 'Error';
|
|
@@ -495,10 +528,13 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
495
528
|
// Check API key scope authorization for agent execution
|
|
496
529
|
await this.CheckAPIKeyScopeAuthorization('agent:execute', agentId, userPayload);
|
|
497
530
|
const p = GetReadWriteProvider(providers);
|
|
531
|
+
// Only the system user or an API key holding the agent:trusted scope may set a run's scope and agent-type
|
|
532
|
+
// params through data; for anyone else BaseAgent drops those keys (ExecuteAgentParams.TrustReservedRunData).
|
|
533
|
+
const trustRunData = await IsTrustedAgentRunCaller({ UserPayload: userPayload, IsWidgetGuestRun: false, AgentID: agentId });
|
|
498
534
|
if (fireAndForget) {
|
|
499
535
|
// Fire-and-forget mode: start execution in background, return immediately.
|
|
500
536
|
// The client will receive the result via WebSocket PubSub completion event.
|
|
501
|
-
this.executeAgentInBackground(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, undefined /*conversationId*/, planMode, requestedSkillIDs, taskGraphDebug);
|
|
537
|
+
this.executeAgentInBackground(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, undefined /*conversationId*/, planMode, requestedSkillIDs, taskGraphDebug, undefined /*conversationHistoryFrom*/, trustRunData);
|
|
502
538
|
LogStatus(`🔥 Fire-and-forget: Agent ${agentId} execution started in background for session ${sessionId}`);
|
|
503
539
|
return {
|
|
504
540
|
success: true,
|
|
@@ -508,7 +544,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
508
544
|
// Synchronous mode (default): wait for execution to complete
|
|
509
545
|
return this.executeAIAgent(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, templateData, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, undefined, // conversationId (not pre-resolved on this path)
|
|
510
546
|
undefined, // runRef
|
|
511
|
-
planMode, requestedSkillIDs, taskGraphDebug
|
|
547
|
+
planMode, requestedSkillIDs, taskGraphDebug, undefined, // conversationHistoryFrom
|
|
548
|
+
trustRunData);
|
|
512
549
|
}
|
|
513
550
|
/**
|
|
514
551
|
* System user query for running AI agents with elevated privileges.
|
|
@@ -516,9 +553,14 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
516
553
|
*/
|
|
517
554
|
async RunAIAgentSystemUser(agentId, { userPayload, providers, dataSource }, messagesJson, sessionId, pubSub, data, payload, templateData, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts, createNotification, sourceArtifactId, sourceArtifactVersionId, planMode, requestedSkillIDs) {
|
|
518
555
|
const p = GetReadWriteProvider(providers);
|
|
556
|
+
// @RequireSystemUser admits only the system user, whom the rule trusts; it is still asked, so every
|
|
557
|
+
// resolver entry that takes a client's data decides the same way.
|
|
558
|
+
const trustRunData = await IsTrustedAgentRunCaller({ UserPayload: userPayload, IsWidgetGuestRun: false, AgentID: agentId });
|
|
519
559
|
return this.executeAIAgent(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, templateData, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, undefined, // conversationId (not pre-resolved on this path)
|
|
520
560
|
undefined, // runRef
|
|
521
|
-
planMode, requestedSkillIDs
|
|
561
|
+
planMode, requestedSkillIDs, undefined, // taskGraphDebug
|
|
562
|
+
undefined, // conversationHistoryFrom
|
|
563
|
+
trustRunData);
|
|
522
564
|
}
|
|
523
565
|
/**
|
|
524
566
|
* Create a user notification for agent completion with artifact
|
|
@@ -720,16 +762,25 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
720
762
|
}
|
|
721
763
|
}
|
|
722
764
|
/**
|
|
723
|
-
*
|
|
724
|
-
*
|
|
765
|
+
* Runs an agent's turn in a conversation: the server loads the history (attachments included, so the client never
|
|
766
|
+
* sends them), creates the agent's reply row, and runs the agent into it.
|
|
767
|
+
*
|
|
768
|
+
* Only the server writes agent replies (A19). The reply row (`Role` `AI`, In-Progress, its `ParentID` the user's
|
|
769
|
+
* message) is created here, as the person asking, before the run starts. In fire-and-forget mode the
|
|
770
|
+
* acknowledgement names it, `{ accepted, fireAndForget, conversationDetailId, createdAt }`, and is returned before
|
|
771
|
+
* the run publishes anything; every progress, streaming and completion message carries the same
|
|
772
|
+
* `conversationDetailId`. In synchronous mode the result's `agentRun.ConversationDetailID` names it.
|
|
773
|
+
*
|
|
774
|
+
* Threading, both optional: `replyParentId` puts the reply under another message of the same conversation the
|
|
775
|
+
* caller can read (MJ's chat threads a delegate's reply under the manager's); `announcedByAgentId` has the server
|
|
776
|
+
* first post that agent's fixed line "Continuing with **{agent}** for refinement..." and thread the reply under
|
|
777
|
+
* it, and the acknowledgement then also carries `announcementDetailId`.
|
|
725
778
|
*
|
|
726
|
-
* @param
|
|
779
|
+
* @param userMessageId - The person's message this turn answers, already saved.
|
|
727
780
|
* @param agentId - The agent to execute
|
|
728
781
|
* @param maxHistoryMessages - Maximum number of history messages to include (default: 20)
|
|
729
782
|
*/
|
|
730
|
-
async RunAIAgentFromConversationDetail(
|
|
731
|
-
// Check API key scope authorization for agent execution
|
|
732
|
-
await this.CheckAPIKeyScopeAuthorization('agent:execute', agentId, userPayload);
|
|
783
|
+
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) {
|
|
733
784
|
const p = GetReadWriteProvider(providers);
|
|
734
785
|
const currentUser = this.GetUserFromPayload(userPayload);
|
|
735
786
|
if (!currentUser) {
|
|
@@ -744,33 +795,50 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
744
795
|
// AUTHORITATIVELY from the widget instance (never the client-supplied arg) — so a guest needs
|
|
745
796
|
// no grants to WRITE the AI run entities and cannot run an arbitrary agent under elevation.
|
|
746
797
|
// Conversation OWNERSHIP is still enforced under the guest principal below: the guest loads its
|
|
747
|
-
// own ConversationDetail through
|
|
748
|
-
//
|
|
798
|
+
// own ConversationDetail through its role's RLS filters, and startConversationTurn then checks
|
|
799
|
+
// the conversation's scope stamp against the visitor (MJ#6032), so a detail id from another
|
|
800
|
+
// visitor's session is refused before any elevated work happens. The reply row is written
|
|
801
|
+
// as the guest too, never as the elevated principal, which owns no guest's conversation.
|
|
749
802
|
const widgetElevation = await ResolveWidgetGuestRunContext(userPayload, p);
|
|
750
803
|
const effectiveAgentId = widgetElevation ? widgetElevation.PinnedAgentId : agentId;
|
|
804
|
+
// Check API key scope authorization for agent execution against the resolved agent id.
|
|
805
|
+
await this.CheckAPIKeyScopeAuthorization('agent:execute', effectiveAgentId, userPayload);
|
|
806
|
+
// A widget guest has one pinned agent and never posts a continuation announcement as another agent;
|
|
807
|
+
// an API-key caller must hold agent:execute for the announcing agent as well as the running agent.
|
|
808
|
+
const effectiveAnnouncedByAgentId = widgetElevation ? undefined : announcedByAgentId;
|
|
809
|
+
if (effectiveAnnouncedByAgentId) {
|
|
810
|
+
await this.CheckAPIKeyScopeAuthorization('agent:execute', effectiveAnnouncedByAgentId, userPayload);
|
|
811
|
+
}
|
|
751
812
|
const effectiveUserPayload = widgetElevation ? ElevateUserPayload(userPayload, widgetElevation.ElevatedUser) : userPayload;
|
|
813
|
+
// Only the system user or an API key holding the agent:trusted scope may set a run's scope and agent-type
|
|
814
|
+
// params through data (ExecuteAgentParams.TrustReservedRunData). Judged on the caller's own payload: a widget
|
|
815
|
+
// guest runs under an elevated server principal but is never trusted.
|
|
816
|
+
const trustRunData = await IsTrustedAgentRunCaller({
|
|
817
|
+
UserPayload: userPayload, IsWidgetGuestRun: widgetElevation !== null, AgentID: agentId,
|
|
818
|
+
});
|
|
752
819
|
try {
|
|
753
820
|
// Parsed before anything loads: a floor the caller asked for must never be dropped.
|
|
754
821
|
const historyFrom = parseAgentHistoryFrom(agentHistoryFrom);
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
}
|
|
764
|
-
const
|
|
765
|
-
// The branch the
|
|
766
|
-
|
|
822
|
+
const turn = await this.startConversationTurn(p, currentUser, {
|
|
823
|
+
UserMessageId: userMessageId,
|
|
824
|
+
AgentId: effectiveAgentId,
|
|
825
|
+
MaxHistoryMessages: maxHistoryMessages || 20,
|
|
826
|
+
HistoryFrom: historyFrom,
|
|
827
|
+
ReplyParentId: replyParentId,
|
|
828
|
+
AnnouncedByAgentId: effectiveAnnouncedByAgentId,
|
|
829
|
+
ReplyBranchId: replyBranchId
|
|
830
|
+
});
|
|
831
|
+
const reply = turn.Reply;
|
|
832
|
+
// The turn's branch (the message's own branch, or a validated fork whose path holds the message)
|
|
833
|
+
// decides which path the run reads.
|
|
834
|
+
const branchId = turn.BranchId;
|
|
767
835
|
// A turn that follows a run the user STOPPED continues that run rather than starting
|
|
768
836
|
// over: chain it by LastRunID (the chat client never sends one) and, when the caller
|
|
769
837
|
// supplied no payload, roll the stopped run's FinalPayload into this run's start.
|
|
770
838
|
let effectiveLastRunId = lastRunId;
|
|
771
839
|
let effectiveAutoPopulate = autoPopulateLastRunPayload;
|
|
772
840
|
if (!effectiveLastRunId) {
|
|
773
|
-
const stoppedRunId = await this.findUserStoppedPredecessorRunId(
|
|
841
|
+
const stoppedRunId = await this.findUserStoppedPredecessorRunId(turn.ConversationId, effectiveAgentId, branchId, currentUser, p);
|
|
774
842
|
if (stoppedRunId) {
|
|
775
843
|
effectiveLastRunId = stoppedRunId;
|
|
776
844
|
if (effectiveAutoPopulate === undefined && payload == null) {
|
|
@@ -779,30 +847,29 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
779
847
|
LogStatus(`↩️ Continuing from user-stopped run ${stoppedRunId} (chained by LastRunID)`);
|
|
780
848
|
}
|
|
781
849
|
}
|
|
782
|
-
// Load conversation history with attachments from DB
|
|
783
|
-
const messages = await this.loadConversationHistoryWithAttachments(conversationId, currentUser, maxHistoryMessages || 20, p,
|
|
784
|
-
// The UI creates the agent-response placeholder row ('⏳ ...') before invoking
|
|
785
|
-
// this mutation — exclude it so the model never sees an empty assistant turn.
|
|
786
|
-
[conversationDetailId], historyFrom, branchId);
|
|
787
|
-
// Convert to JSON string for the existing executeAIAgent method
|
|
788
|
-
const messagesJson = JSON.stringify(messages);
|
|
789
850
|
if (fireAndForget) {
|
|
790
851
|
// Fire-and-forget mode: start execution in background, return immediately.
|
|
791
852
|
// The client will receive the result via WebSocket PubSub completion event.
|
|
792
|
-
this.executeAgentInBackground(p, dataSource, effectiveAgentId, effectiveUserPayload,
|
|
793
|
-
historyFrom, branchId);
|
|
853
|
+
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
|
|
854
|
+
historyFrom, trustRunData, branchId, reply);
|
|
794
855
|
LogStatus(`🔥 Fire-and-forget: Agent ${effectiveAgentId} execution started in background for session ${sessionId}`);
|
|
795
856
|
return {
|
|
796
857
|
success: true,
|
|
797
|
-
result: JSON.stringify({
|
|
858
|
+
result: JSON.stringify({
|
|
859
|
+
accepted: true,
|
|
860
|
+
fireAndForget: true,
|
|
861
|
+
conversationDetailId: reply.ID,
|
|
862
|
+
createdAt: reply.__mj_CreatedAt,
|
|
863
|
+
...(turn.Announcement ? { announcementDetailId: turn.Announcement.ID } : {})
|
|
864
|
+
})
|
|
798
865
|
};
|
|
799
866
|
}
|
|
800
867
|
// Synchronous mode (default): wait for execution to complete
|
|
801
|
-
return this.executeAIAgent(p, dataSource, effectiveAgentId, effectiveUserPayload,
|
|
802
|
-
effectiveLastRunId, effectiveAutoPopulate, configurationId,
|
|
868
|
+
return this.executeAIAgent(p, dataSource, effectiveAgentId, effectiveUserPayload, turn.MessagesJson, sessionId, pubSub, data, payload, undefined, // templateData
|
|
869
|
+
effectiveLastRunId, effectiveAutoPopulate, configurationId, reply.ID, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, turn.ConversationId, // LATENCY OPT #2: pass pre-resolved conversationId
|
|
803
870
|
undefined, // runRef
|
|
804
871
|
planMode, requestedSkillIDs, undefined, // taskGraphDebug
|
|
805
|
-
historyFrom, branchId);
|
|
872
|
+
historyFrom, trustRunData, branchId, reply);
|
|
806
873
|
}
|
|
807
874
|
catch (error) {
|
|
808
875
|
const errorMessage = error.message || 'Unknown error loading conversation history';
|
|
@@ -814,6 +881,110 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
814
881
|
};
|
|
815
882
|
}
|
|
816
883
|
}
|
|
884
|
+
/**
|
|
885
|
+
* Everything a conversation turn needs before its agent runs: the user's message (read as the caller, so a
|
|
886
|
+
* message they can't see is "not found", and for an anonymous visitor also checked against the conversation's
|
|
887
|
+
* scope stamp), the conversation history, the optional announcement line, and the reply
|
|
888
|
+
* row, created last so the history never holds the empty reply. Every row is written as `user`, the person asking,
|
|
889
|
+
* and marked as server-authored by {@link AgentRunner.CreateAgentReplyDetail}.
|
|
890
|
+
*/
|
|
891
|
+
async startConversationTurn(p, user, request) {
|
|
892
|
+
// LATENCY OPTIMIZATION (Opt #2 + #3): the user's message is loaded once here for its conversation and
|
|
893
|
+
// branch, which are threaded through the call chain rather than reloaded downstream.
|
|
894
|
+
const placement = await this.loadPlacementOf(p, user, request.UserMessageId);
|
|
895
|
+
const conversationId = placement.ConversationId;
|
|
896
|
+
// Loading the message as the caller is the whole ownership check for a named user. It is not for an
|
|
897
|
+
// anonymous visitor: every visitor is the one shared Anonymous user, so under a guest role whose row
|
|
898
|
+
// filters key on UserID another visitor's message loads fine (MJ#6032). The conversation's scope stamp
|
|
899
|
+
// decides instead, exactly as it does for the realtime gates — and before any row is written.
|
|
900
|
+
const access = await AuthorizeConversationTurn(conversationId, user, p);
|
|
901
|
+
if (!access.Allowed) {
|
|
902
|
+
LogError(`RunAIAgentFromConversationDetail: anonymous visitor ${user.AnonymousVisitorID ?? '(no visitor id)'} refused a turn in conversation ${conversationId} (${access.Reason})`);
|
|
903
|
+
throw new Error('Not authorized: you do not own this conversation');
|
|
904
|
+
}
|
|
905
|
+
const branchId = request.ReplyBranchId
|
|
906
|
+
? await this.validateReplyBranch(p, user, conversationId, placement, request.ReplyBranchId)
|
|
907
|
+
: placement.BranchId;
|
|
908
|
+
const parentId = request.ReplyParentId
|
|
909
|
+
? await this.validateReplyParent(p, user, request.ReplyParentId, conversationId)
|
|
910
|
+
: request.UserMessageId;
|
|
911
|
+
const messages = await this.loadConversationHistoryWithAttachments(conversationId, user, request.MaxHistoryMessages, p, undefined, request.HistoryFrom, branchId);
|
|
912
|
+
const runner = new AgentRunner(p);
|
|
913
|
+
const announcement = request.AnnouncedByAgentId
|
|
914
|
+
? await this.postContinuationAnnouncement(runner, user, conversationId, branchId, parentId, request.AnnouncedByAgentId, request.AgentId)
|
|
915
|
+
: undefined;
|
|
916
|
+
const reply = await runner.CreateAgentReplyDetail({
|
|
917
|
+
conversationId,
|
|
918
|
+
branchId,
|
|
919
|
+
agentId: request.AgentId,
|
|
920
|
+
contextUser: user,
|
|
921
|
+
parentId: announcement?.ID ?? parentId,
|
|
922
|
+
provider: p
|
|
923
|
+
});
|
|
924
|
+
return { ConversationId: conversationId, BranchId: branchId, MessagesJson: JSON.stringify(messages), Reply: reply, Announcement: announcement };
|
|
925
|
+
}
|
|
926
|
+
/** The conversation, branch (null is Main) and sequence of a message, read as `user`; throws when they can't read it. */
|
|
927
|
+
async loadPlacementOf(p, user, messageId) {
|
|
928
|
+
const message = await p.GetEntityObject('MJ: Conversation Details', user);
|
|
929
|
+
if (!await message.Load(messageId)) {
|
|
930
|
+
throw new Error(`Conversation detail ${messageId} not found`);
|
|
931
|
+
}
|
|
932
|
+
return { ConversationId: message.ConversationID, BranchId: message.BranchID ?? null, Sequence: message.Sequence ?? -1 };
|
|
933
|
+
}
|
|
934
|
+
/**
|
|
935
|
+
* When a turn forks from an earlier message (such as Regenerate), the reply and history run on the fork while the
|
|
936
|
+
* user's message stays on the branch it was written on. Checks that `replyBranchId` is a branch of the turn's
|
|
937
|
+
* conversation whose path holds the user's message (`IsRowOnBranchPath` rather than exact `ForkFromSequence`
|
|
938
|
+
* equality is deliberate: `ConversationEngine.ForkPointFrom` sets `ForkFromSequence = message.Sequence` and the
|
|
939
|
+
* fork belongs to this conversation); returns `replyBranchId`, or throws before any row is created.
|
|
940
|
+
*/
|
|
941
|
+
async validateReplyBranch(p, user, conversationId, userMessage, replyBranchId) {
|
|
942
|
+
if (UUIDsEqual(replyBranchId, userMessage.BranchId)) {
|
|
943
|
+
return replyBranchId;
|
|
944
|
+
}
|
|
945
|
+
if (userMessage.Sequence < 0) {
|
|
946
|
+
throw new Error(`Conversation detail is not on branch ${replyBranchId}'s path, so the reply cannot be written on that branch`);
|
|
947
|
+
}
|
|
948
|
+
const branches = await ConversationEngine.LoadBranchesFresh(conversationId, user, p);
|
|
949
|
+
const chain = ConversationEngine.BuildBranchChain(branches, replyBranchId);
|
|
950
|
+
if (!ConversationEngine.IsRowOnBranchPath({ BranchID: userMessage.BranchId, Sequence: userMessage.Sequence }, chain)) {
|
|
951
|
+
throw new Error(`Conversation detail is not on branch ${replyBranchId}'s path, so the reply cannot be written on that branch`);
|
|
952
|
+
}
|
|
953
|
+
return replyBranchId;
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
956
|
+
* A reply's parent is part of what the reply says, so the server sets it, from a checked input: a message the
|
|
957
|
+
* caller can read, in the turn's own conversation. Returns its ID; throws otherwise.
|
|
958
|
+
*/
|
|
959
|
+
async validateReplyParent(p, user, parentId, conversationId) {
|
|
960
|
+
const { ConversationId: parentConversationId } = await this.loadPlacementOf(p, user, parentId);
|
|
961
|
+
if (!UUIDsEqual(parentConversationId, conversationId)) {
|
|
962
|
+
throw new Error(`Conversation detail ${parentId} is not in this turn's conversation, so the reply cannot thread under it`);
|
|
963
|
+
}
|
|
964
|
+
return parentId;
|
|
965
|
+
}
|
|
966
|
+
/**
|
|
967
|
+
* Posts the announcing agent's line, "Continuing with **{agent}** for refinement...", as a completed reply of the
|
|
968
|
+
* announcing agent. Its text is fixed and names the agent from metadata, so a caller chooses only whether it is
|
|
969
|
+
* posted and by which active agent, never what it says.
|
|
970
|
+
*/
|
|
971
|
+
async postContinuationAnnouncement(runner, user, conversationId, branchId, parentId, announcerId, agentId) {
|
|
972
|
+
await AIEngine.Instance.Config(false, user);
|
|
973
|
+
const announcer = AIEngine.Instance.GetAgentByID(announcerId);
|
|
974
|
+
if (!announcer || announcer.Status !== 'Active') {
|
|
975
|
+
throw new Error(`Agent ${announcerId} cannot announce the turn: it is not an active agent`);
|
|
976
|
+
}
|
|
977
|
+
const agentName = AIEngine.Instance.GetAgentByID(agentId)?.Name ?? 'the agent';
|
|
978
|
+
return runner.CreateAgentReplyDetail({
|
|
979
|
+
conversationId,
|
|
980
|
+
branchId,
|
|
981
|
+
agentId: announcer.ID,
|
|
982
|
+
contextUser: user,
|
|
983
|
+
parentId,
|
|
984
|
+
message: ContinuationAnnouncementText(agentName),
|
|
985
|
+
status: 'Complete'
|
|
986
|
+
});
|
|
987
|
+
}
|
|
817
988
|
/**
|
|
818
989
|
* Respond to a pending AIAgentRequest from the dashboard or API.
|
|
819
990
|
* Updates the request record with the response and optionally spawns a
|
|
@@ -958,9 +1129,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
958
1129
|
}
|
|
959
1130
|
/**
|
|
960
1131
|
* Execute agent in background (fire-and-forget).
|
|
961
|
-
*
|
|
962
|
-
*
|
|
963
|
-
* has already been sent.
|
|
1132
|
+
* The client learns the outcome only from the run's completion status message (executeAIAgent publishes it,
|
|
1133
|
+
* failure included), since the HTTP response has already been sent. A liveness pulse runs until the run ends.
|
|
964
1134
|
*/
|
|
965
1135
|
executeAgentInBackground(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts = false, createNotification = false, sourceArtifactId, sourceArtifactVersionId,
|
|
966
1136
|
/** LATENCY OPT #2: Pre-resolved conversationId avoids redundant DB load in AgentRunner */
|
|
@@ -971,28 +1141,29 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
|
|
|
971
1141
|
requestedSkillIDs, taskGraphDebug,
|
|
972
1142
|
/** History floor — threaded through to ExecuteAgentParams.ConversationHistoryFrom. */
|
|
973
1143
|
conversationHistoryFrom,
|
|
1144
|
+
/** ExecuteAgentParams.TrustReservedRunData — see executeAIAgent. */
|
|
1145
|
+
trustReservedRunData = false,
|
|
974
1146
|
/** The conversation branch of the run — threaded through to ExecuteAgentParams.ConversationBranchID. */
|
|
975
|
-
conversationBranchId
|
|
1147
|
+
conversationBranchId,
|
|
1148
|
+
/** The reply row this request created for the run — see executeAIAgent. */
|
|
1149
|
+
replyDetail) {
|
|
976
1150
|
// Ref the liveness pulse reads to enrich heartbeats once the run is created.
|
|
977
1151
|
const runRef = { current: null };
|
|
978
1152
|
const pulse = StartLivenessPulse({
|
|
979
1153
|
pubSub,
|
|
980
1154
|
sessionId,
|
|
981
|
-
ownerUserId: userPayload
|
|
1155
|
+
ownerUserId: StatusUpdateOwnerID(userPayload),
|
|
982
1156
|
resolver: 'RunAIAgentResolver',
|
|
983
1157
|
readStatus: () => runRef.current
|
|
984
1158
|
? { runId: runRef.current.ID, status: runRef.current.Status }
|
|
985
1159
|
: undefined,
|
|
986
1160
|
});
|
|
987
|
-
//
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
//
|
|
991
|
-
|
|
992
|
-
LogError(`🔥 Fire-and-forget
|
|
993
|
-
// Publish error completion event so the client knows the agent failed.
|
|
994
|
-
// The publisher is created inside executeAIAgent, which rejected before returning one.
|
|
995
|
-
new AgentRunStatusPublisher(pubSub, userPayload, sessionId).PublishFailure(conversationDetailId, errorMessage);
|
|
1161
|
+
// executeAIAgent resolves on every failure and publishes the run's completion itself (PublishFinal, or
|
|
1162
|
+
// PublishFailure from its catch), so nothing here publishes one.
|
|
1163
|
+
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) => {
|
|
1164
|
+
// Only a broken executeAIAgent contract lands here. Logged rather than left as an unhandled rejection;
|
|
1165
|
+
// no completion is published, because executeAIAgent may already have sent one.
|
|
1166
|
+
LogError(`🔥 Fire-and-forget run of agent ${agentId} for session ${sessionId} rejected, which executeAIAgent never should`, undefined, error);
|
|
996
1167
|
}).finally(() => pulse.Stop());
|
|
997
1168
|
}
|
|
998
1169
|
/**
|
|
@@ -1289,7 +1460,7 @@ __decorate([
|
|
|
1289
1460
|
], RunAIAgentResolver.prototype, "RunAIAgentSystemUser", null);
|
|
1290
1461
|
__decorate([
|
|
1291
1462
|
Mutation(() => AIAgentRunResult),
|
|
1292
|
-
__param(0, Arg('
|
|
1463
|
+
__param(0, Arg('userMessageId')),
|
|
1293
1464
|
__param(1, Arg('agentId')),
|
|
1294
1465
|
__param(2, Ctx()),
|
|
1295
1466
|
__param(3, Arg('sessionId')),
|
|
@@ -1308,8 +1479,11 @@ __decorate([
|
|
|
1308
1479
|
__param(16, Arg('planMode', { nullable: true })),
|
|
1309
1480
|
__param(17, Arg('requestedSkillIDs', () => [String], { nullable: true })),
|
|
1310
1481
|
__param(18, Arg('agentHistoryFrom', { nullable: true })),
|
|
1482
|
+
__param(19, Arg('replyParentId', { nullable: true })),
|
|
1483
|
+
__param(20, Arg('announcedByAgentId', { nullable: true })),
|
|
1484
|
+
__param(21, Arg('replyBranchId', { nullable: true })),
|
|
1311
1485
|
__metadata("design:type", Function),
|
|
1312
|
-
__metadata("design:paramtypes", [String, String, Object, String, PubSubEngine, Number, String, String, String, Boolean, String, Boolean, Boolean, String, String, Boolean, Boolean, Array, String]),
|
|
1486
|
+
__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]),
|
|
1313
1487
|
__metadata("design:returntype", Promise)
|
|
1314
1488
|
], RunAIAgentResolver.prototype, "RunAIAgentFromConversationDetail", null);
|
|
1315
1489
|
__decorate([
|