@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
|
@@ -12,9 +12,12 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @module @memberjunction/server
|
|
14
14
|
*/
|
|
15
|
-
import { LogError, LogStatus } from '@memberjunction/core';
|
|
15
|
+
import { LogError, LogStatus, RunView } from '@memberjunction/core';
|
|
16
|
+
import { UserCache } from '@memberjunction/generic-database-provider';
|
|
17
|
+
import { UUIDsEqual } from '@memberjunction/global';
|
|
16
18
|
import { AgentRunner } from '@memberjunction/ai-agents';
|
|
17
19
|
import { ChatMessageRole } from '@memberjunction/ai';
|
|
20
|
+
import { PublishStatusUpdate } from '../generic/PushStatusResolver.js';
|
|
18
21
|
/** How many per-task lines a posted summary shows before collapsing the rest into a count. */
|
|
19
22
|
const MAX_LISTED_TASKS = 20;
|
|
20
23
|
/**
|
|
@@ -35,9 +38,10 @@ export class TaskGraphContinuationDeliverer {
|
|
|
35
38
|
* does: deliveries run outside any request and concurrently with task execution, so
|
|
36
39
|
* sharing one provider would share one transaction scope across unrelated work.
|
|
37
40
|
*/
|
|
38
|
-
constructor(providerFactory, contextUser) {
|
|
41
|
+
constructor(providerFactory, contextUser, pubSub) {
|
|
39
42
|
this.providerFactory = providerFactory;
|
|
40
43
|
this.contextUser = contextUser;
|
|
44
|
+
this.pubSub = pubSub;
|
|
41
45
|
}
|
|
42
46
|
/**
|
|
43
47
|
* Posts the roll-up as an AI-role message in the graph's conversation, on the fork of the
|
|
@@ -56,24 +60,50 @@ export class TaskGraphContinuationDeliverer {
|
|
|
56
60
|
return;
|
|
57
61
|
}
|
|
58
62
|
const provider = await this.providerFactory.CreateProvider();
|
|
59
|
-
|
|
63
|
+
// Written as the person who submitted the graph, marked as the server's: the conversation detail gate lets
|
|
64
|
+
// only a marked server write create or update an agent's reply, and only in a conversation its user owns or
|
|
65
|
+
// holds an Edit grant on. Not as the conversation's owner: `TaskGraph.Submit` takes any conversation detail
|
|
66
|
+
// ID, so writing as the owner would let anyone who can submit a graph post into a conversation they can't reach.
|
|
67
|
+
const writer = this.resolveSubmitter(params.SubmittedByUserID);
|
|
68
|
+
const origin = await this.resolveOrigin(params.ConversationDetailID, provider, writer.ID);
|
|
60
69
|
if (!origin) {
|
|
61
70
|
LogError(`[TaskGraphContinuationDeliverer] Conversation detail ${params.ConversationDetailID} could not be loaded — ` +
|
|
62
71
|
`"${params.WorkflowName}" has nowhere to post its outcome.`);
|
|
63
72
|
return;
|
|
64
73
|
}
|
|
65
|
-
const
|
|
74
|
+
const enrichedParams = await this.enrichTasksWithOutputs(params, provider);
|
|
75
|
+
const renderedOutcome = this.renderMessage(enrichedParams);
|
|
76
|
+
if (origin.IsLatest) {
|
|
77
|
+
// No intervening messages were sent while the workflow ran: update the originating
|
|
78
|
+
// message in-place so the single conversation turn holds the progress card, step
|
|
79
|
+
// artifacts, and final outcome together.
|
|
80
|
+
origin.OriginDetail.Status = 'Complete';
|
|
81
|
+
origin.OriginDetail.Message = renderedOutcome;
|
|
82
|
+
if (!(await origin.OriginDetail.Save())) {
|
|
83
|
+
LogError(`[TaskGraphContinuationDeliverer] Could not update in-place outcome of "${params.WorkflowName}": ` +
|
|
84
|
+
`${origin.OriginDetail.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.publishCompletion(origin.OwnerUserID, params.ConversationDetailID, params.ConversationDetailID, origin.ConversationID, params.SubmittedByAgentRunID ?? 'task-graph', true);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const detail = await provider.GetEntityObject('MJ: Conversation Details', writer);
|
|
66
91
|
detail.NewRecord();
|
|
92
|
+
detail.MarkServerAuthoredReply();
|
|
67
93
|
detail.ConversationID = origin.ConversationID;
|
|
68
94
|
detail.BranchID = origin.BranchID;
|
|
95
|
+
detail.ParentID = params.ConversationDetailID;
|
|
69
96
|
detail.Role = 'AI';
|
|
70
97
|
detail.Status = 'Complete';
|
|
71
98
|
detail.HiddenToUser = false;
|
|
72
|
-
detail.Message =
|
|
99
|
+
detail.Message = renderedOutcome;
|
|
73
100
|
if (!(await detail.Save())) {
|
|
74
101
|
LogError(`[TaskGraphContinuationDeliverer] Could not post the outcome of "${params.WorkflowName}": ` +
|
|
75
102
|
`${detail.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
103
|
+
return;
|
|
76
104
|
}
|
|
105
|
+
await this.markOriginDetailCompleted(origin.OriginDetail, params.WorkflowName);
|
|
106
|
+
this.publishCompletion(origin.OwnerUserID, detail.ID || params.ConversationDetailID, params.ConversationDetailID, origin.ConversationID, params.SubmittedByAgentRunID ?? 'task-graph', true);
|
|
77
107
|
}
|
|
78
108
|
catch (e) {
|
|
79
109
|
LogError(`[TaskGraphContinuationDeliverer] Posting the outcome of "${params.WorkflowName}" threw`, undefined, e);
|
|
@@ -105,25 +135,142 @@ export class TaskGraphContinuationDeliverer {
|
|
|
105
135
|
await this.PostMessage(params);
|
|
106
136
|
return;
|
|
107
137
|
}
|
|
138
|
+
// When a sub-agent (e.g., Workflow Planner) submitted the workflow on behalf of a parent
|
|
139
|
+
// conversation agent (e.g., Sage), walk up `ParentRunID` so the root conversation agent
|
|
140
|
+
// synthesizes the final response to the user.
|
|
141
|
+
let targetRun = priorRun;
|
|
142
|
+
const initialRunId = (priorRun.ID || params.SubmittedByAgentRunID).toLowerCase();
|
|
143
|
+
const visitedRunIDs = new Set([initialRunId]);
|
|
144
|
+
while (targetRun.ParentRunID && !visitedRunIDs.has(targetRun.ParentRunID.toLowerCase()) && visitedRunIDs.size < 10) {
|
|
145
|
+
visitedRunIDs.add(targetRun.ParentRunID.toLowerCase());
|
|
146
|
+
const parentRun = await provider.GetEntityObject('MJ: AI Agent Runs', this.contextUser);
|
|
147
|
+
if (await parentRun.Load(targetRun.ParentRunID)) {
|
|
148
|
+
targetRun = parentRun;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
108
154
|
const agent = await provider.GetEntityObject('MJ: AI Agents', this.contextUser);
|
|
109
|
-
if (!(await agent.Load(
|
|
110
|
-
LogError(`[TaskGraphContinuationDeliverer] Agent ${
|
|
155
|
+
if (!(await agent.Load(targetRun.AgentID))) {
|
|
156
|
+
LogError(`[TaskGraphContinuationDeliverer] Agent ${targetRun.AgentID} could not be loaded — posting "${params.WorkflowName}" instead.`);
|
|
111
157
|
await this.PostMessage(params);
|
|
112
158
|
return;
|
|
113
159
|
}
|
|
114
160
|
// Run on the fork of the message that started the graph, as PostMessage posts into it:
|
|
115
161
|
// RunAgent derives the conversation from the detail, but not the fork.
|
|
116
|
-
const
|
|
117
|
-
|
|
162
|
+
const runUserId = targetRun.UserID || priorRun.UserID || params.SubmittedByUserID;
|
|
163
|
+
const origin = params.ConversationDetailID
|
|
164
|
+
? await this.resolveOrigin(params.ConversationDetailID, provider, runUserId)
|
|
165
|
+
: null;
|
|
166
|
+
const ownerUserId = runUserId || origin?.OwnerUserID || this.contextUser.ID;
|
|
167
|
+
const actingUser = this.resolveActingUser(ownerUserId);
|
|
168
|
+
// Adaptive delivery:
|
|
169
|
+
// - When the originating workflow message is still the latest message in the conversation
|
|
170
|
+
// (origin.IsLatest === true), update it in-place so the single turn carries the workflow
|
|
171
|
+
// progress card, step artifacts, and synthesized narrative together.
|
|
172
|
+
// - When intervening messages were sent while the workflow ran (origin.IsLatest === false),
|
|
173
|
+
// create a bottom continuation message linked via ParentID = params.ConversationDetailID
|
|
174
|
+
// and update the originating message's stale "I'll follow up..." copy.
|
|
175
|
+
let replyDetail = null;
|
|
176
|
+
let replySaved = false;
|
|
177
|
+
if (origin?.ConversationID) {
|
|
178
|
+
if (origin.IsLatest) {
|
|
179
|
+
replyDetail = origin.OriginDetail;
|
|
180
|
+
replySaved = true;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
replyDetail = await provider.GetEntityObject('MJ: Conversation Details', actingUser);
|
|
184
|
+
replyDetail.NewRecord();
|
|
185
|
+
replyDetail.MarkServerAuthoredReply();
|
|
186
|
+
replyDetail.ConversationID = origin.ConversationID;
|
|
187
|
+
replyDetail.BranchID = origin.BranchID;
|
|
188
|
+
replyDetail.ParentID = params.ConversationDetailID;
|
|
189
|
+
replyDetail.Role = 'AI';
|
|
190
|
+
replyDetail.Status = 'In-Progress';
|
|
191
|
+
replyDetail.HiddenToUser = false;
|
|
192
|
+
replyDetail.AgentID = agent.ID;
|
|
193
|
+
replyDetail.Message = `⏳ Synthesizing results from **${params.WorkflowName}**...`;
|
|
194
|
+
replySaved = await replyDetail.Save();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const targetDetailId = origin?.IsLatest
|
|
198
|
+
? (params.ConversationDetailID ?? replyDetail?.ID ?? undefined)
|
|
199
|
+
: ((replyDetail && replySaved && replyDetail.ID)
|
|
200
|
+
? replyDetail.ID
|
|
201
|
+
: (params.ConversationDetailID ?? undefined));
|
|
202
|
+
const enrichedParams = await this.enrichTasksWithOutputs(params, provider);
|
|
203
|
+
const renderedContinuationMessage = this.renderMessage(enrichedParams);
|
|
204
|
+
const runner = new AgentRunner(provider);
|
|
205
|
+
const result = await runner.RunAgent({
|
|
118
206
|
agent,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
207
|
+
provider,
|
|
208
|
+
conversationMessages: [{
|
|
209
|
+
role: ChatMessageRole.user,
|
|
210
|
+
content: `${renderedContinuationMessage}\n\n` +
|
|
211
|
+
`Please synthesize ALL workflow steps above into a clear, direct, comprehensive final response for the user (covering every completed step's findings, SQL queries, data tables, strategic analysis, and report summaries, and briefly explaining any conditional steps that were skipped because their prerequisite condition was not met).`,
|
|
212
|
+
}],
|
|
213
|
+
// Prevent the continuation synthesis turn from auto-hydrating an unrelated artifact
|
|
214
|
+
// or prior scratch payload into payload, while still recording LastRunID lineage.
|
|
215
|
+
inputArtifacts: [],
|
|
216
|
+
payload: {},
|
|
217
|
+
lastRunId: targetRun.ID,
|
|
218
|
+
contextUser: actingUser,
|
|
219
|
+
conversationId: origin?.ConversationID ?? undefined,
|
|
220
|
+
conversationDetailId: targetDetailId,
|
|
122
221
|
ConversationBranchID: origin?.BranchID ?? undefined,
|
|
123
222
|
// The load-bearing value: without it the next graph this run submits restarts the
|
|
124
223
|
// chain at zero and the cap never fires.
|
|
125
224
|
continuationDepth: params.ReinvokeDepth + 1,
|
|
126
225
|
});
|
|
226
|
+
if (replyDetail && replySaved) {
|
|
227
|
+
const succeeded = result?.success !== false;
|
|
228
|
+
replyDetail.Status = succeeded ? 'Complete' : 'Error';
|
|
229
|
+
replyDetail.Message = result?.agentRun?.Message || renderedContinuationMessage;
|
|
230
|
+
if (result?.responseForm) {
|
|
231
|
+
replyDetail.ResponseForm = JSON.stringify(result.responseForm);
|
|
232
|
+
}
|
|
233
|
+
if (result?.actionableCommands && result.actionableCommands.length > 0) {
|
|
234
|
+
replyDetail.ActionableCommands = JSON.stringify(result.actionableCommands);
|
|
235
|
+
}
|
|
236
|
+
if (result?.automaticCommands && result.automaticCommands.length > 0) {
|
|
237
|
+
replyDetail.AutomaticCommands = JSON.stringify(result.automaticCommands);
|
|
238
|
+
}
|
|
239
|
+
if (!(await replyDetail.Save())) {
|
|
240
|
+
LogError(`[TaskGraphContinuationDeliverer] Could not save synthesized reply for "${params.WorkflowName}": ` +
|
|
241
|
+
`${replyDetail.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
242
|
+
}
|
|
243
|
+
if (!origin?.IsLatest && origin?.OriginDetail) {
|
|
244
|
+
await this.markOriginDetailCompleted(origin.OriginDetail, params.WorkflowName);
|
|
245
|
+
}
|
|
246
|
+
const artifactTargetDetailId = targetDetailId ?? replyDetail.ID;
|
|
247
|
+
const hasNonEmptyPayload = result?.payload != null &&
|
|
248
|
+
(typeof result.payload !== 'object' ||
|
|
249
|
+
Array.isArray(result.payload) ||
|
|
250
|
+
Object.keys(result.payload).length > 0);
|
|
251
|
+
if (succeeded &&
|
|
252
|
+
hasNonEmptyPayload &&
|
|
253
|
+
artifactTargetDetailId &&
|
|
254
|
+
result.artifactDirective?.behavior !== 'suppress' &&
|
|
255
|
+
typeof runner.ProcessAgentArtifacts === 'function') {
|
|
256
|
+
try {
|
|
257
|
+
await runner.ProcessAgentArtifacts(result, artifactTargetDetailId, undefined, actingUser, provider);
|
|
258
|
+
}
|
|
259
|
+
catch (artifactErr) {
|
|
260
|
+
LogError(`[TaskGraphContinuationDeliverer] Artifact creation for "${params.WorkflowName}" failed (non-fatal)`, undefined, artifactErr);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (origin) {
|
|
265
|
+
// When updating the originating message in-place (origin.IsLatest === true),
|
|
266
|
+
// keep the completion event pointed at the primary orchestrating run (targetRun.ID)
|
|
267
|
+
// so the message's gear icon opens the full workflow-orchestrating run rather than
|
|
268
|
+
// the 2-step post-workflow synthesis run.
|
|
269
|
+
const completionRunId = origin.IsLatest
|
|
270
|
+
? (targetRun.ID || result?.agentRun?.ID || params.SubmittedByAgentRunID)
|
|
271
|
+
: (result?.agentRun?.ID ?? params.SubmittedByAgentRunID);
|
|
272
|
+
this.publishCompletion(ownerUserId, targetDetailId ?? params.ConversationDetailID ?? '', params.ConversationDetailID, origin.ConversationID, completionRunId, result?.success !== false);
|
|
273
|
+
}
|
|
127
274
|
}
|
|
128
275
|
catch (e) {
|
|
129
276
|
// FALL BACK, don't just log (C3). Both load-failure paths above already post instead of
|
|
@@ -140,10 +287,472 @@ export class TaskGraphContinuationDeliverer {
|
|
|
140
287
|
}
|
|
141
288
|
}
|
|
142
289
|
}
|
|
143
|
-
/**
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
290
|
+
/**
|
|
291
|
+
* The person who submitted the graph; the deliverer's own user when the graph records no submitter or they are not
|
|
292
|
+
* in the user cache (the gate then decides, and refuses a conversation that user cannot write to).
|
|
293
|
+
*/
|
|
294
|
+
resolveSubmitter(submittedByUserID) {
|
|
295
|
+
if (!submittedByUserID) {
|
|
296
|
+
return this.contextUser;
|
|
297
|
+
}
|
|
298
|
+
const users = UserCache.Instance?.Users ?? UserCache.Users ?? [];
|
|
299
|
+
return users.find((u) => UUIDsEqual(u.ID, submittedByUserID)) ?? this.contextUser;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Broadcasts a completion event on `PUSH_STATUS_UPDATES_TOPIC` so open conversation tabs
|
|
303
|
+
* immediately reload both the originating workflow message and the newly posted continuation reply.
|
|
304
|
+
*/
|
|
305
|
+
publishCompletion(ownerUserId, replyDetailId, originDetailId, conversationId, agentRunId, success) {
|
|
306
|
+
if (!this.pubSub || !ownerUserId)
|
|
307
|
+
return;
|
|
308
|
+
try {
|
|
309
|
+
if (originDetailId && originDetailId !== replyDetailId) {
|
|
310
|
+
PublishStatusUpdate(this.pubSub, {
|
|
311
|
+
sessionId: '*',
|
|
312
|
+
ownerUserId,
|
|
313
|
+
message: JSON.stringify({
|
|
314
|
+
resolver: 'RunAIAgentResolver',
|
|
315
|
+
type: 'StreamingContent',
|
|
316
|
+
status: 'ok',
|
|
317
|
+
data: {
|
|
318
|
+
type: 'complete',
|
|
319
|
+
conversationDetailId: originDetailId,
|
|
320
|
+
conversationId,
|
|
321
|
+
agentRunId,
|
|
322
|
+
success,
|
|
323
|
+
timestamp: new Date(),
|
|
324
|
+
},
|
|
325
|
+
}),
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
if (replyDetailId) {
|
|
329
|
+
PublishStatusUpdate(this.pubSub, {
|
|
330
|
+
sessionId: '*',
|
|
331
|
+
ownerUserId,
|
|
332
|
+
message: JSON.stringify({
|
|
333
|
+
resolver: 'RunAIAgentResolver',
|
|
334
|
+
type: 'StreamingContent',
|
|
335
|
+
status: 'ok',
|
|
336
|
+
data: {
|
|
337
|
+
type: 'complete',
|
|
338
|
+
conversationDetailId: replyDetailId,
|
|
339
|
+
originConversationDetailId: originDetailId,
|
|
340
|
+
conversationId,
|
|
341
|
+
agentRunId,
|
|
342
|
+
success,
|
|
343
|
+
timestamp: new Date(),
|
|
344
|
+
},
|
|
345
|
+
}),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
LogError(`[TaskGraphContinuationDeliverer] Failed to publish completion notification (ignored)`, undefined, err);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* The conversation, fork (null is Main), owner user, loaded entity, and whether the originating
|
|
355
|
+
* detail is still the latest visible message in the conversation; null when it cannot be loaded.
|
|
356
|
+
*/
|
|
357
|
+
async resolveOrigin(conversationDetailID, provider, fallbackOwnerUserId) {
|
|
358
|
+
const initialUser = this.resolveActingUser(fallbackOwnerUserId);
|
|
359
|
+
let detail = await provider.GetEntityObject('MJ: Conversation Details', initialUser);
|
|
360
|
+
if (!(await detail.Load(conversationDetailID))) {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
let ownerUserId = fallbackOwnerUserId || detail.UserID || null;
|
|
364
|
+
if (!ownerUserId && detail.ConversationID) {
|
|
365
|
+
ownerUserId = await this.lookupConversationOwnerId(detail.ConversationID, provider);
|
|
366
|
+
}
|
|
367
|
+
const resolvedOwnerUserId = ownerUserId || this.contextUser.ID;
|
|
368
|
+
if (!fallbackOwnerUserId && !UUIDsEqual(resolvedOwnerUserId, initialUser.ID)) {
|
|
369
|
+
const ownerUser = this.resolveActingUser(resolvedOwnerUserId);
|
|
370
|
+
if (!UUIDsEqual(ownerUser.ID, initialUser.ID)) {
|
|
371
|
+
const reloaded = await provider.GetEntityObject('MJ: Conversation Details', ownerUser);
|
|
372
|
+
if (await reloaded.Load(conversationDetailID)) {
|
|
373
|
+
detail = reloaded;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Mark the originating detail as server-authored when it is the workflow status or planning AI/error reply.
|
|
378
|
+
const role = detail.Role?.trim().toLowerCase();
|
|
379
|
+
if (!role || role === 'ai' || role === 'error') {
|
|
380
|
+
detail.MarkServerAuthoredReply();
|
|
381
|
+
}
|
|
382
|
+
const branchId = detail.BranchID ?? null;
|
|
383
|
+
const isLatest = detail.ConversationID
|
|
384
|
+
? await this.isLatestConversationMessage(detail.ConversationID, branchId, conversationDetailID, provider)
|
|
385
|
+
: false;
|
|
386
|
+
return {
|
|
387
|
+
ConversationID: detail.ConversationID,
|
|
388
|
+
BranchID: branchId,
|
|
389
|
+
OwnerUserID: resolvedOwnerUserId,
|
|
390
|
+
OriginDetail: detail,
|
|
391
|
+
IsLatest: isLatest,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Returns `true` when `originDetailId` is the newest visible message on its conversation branch,
|
|
396
|
+
* meaning no intervening messages were posted while the workflow ran in the background.
|
|
397
|
+
*/
|
|
398
|
+
async isLatestConversationMessage(conversationId, branchId, originDetailId, provider) {
|
|
399
|
+
try {
|
|
400
|
+
const safeConvId = conversationId.replace(/'/g, "''");
|
|
401
|
+
const branchPredicate = branchId
|
|
402
|
+
? `BranchID='${branchId.replace(/'/g, "''")}'`
|
|
403
|
+
: `BranchID IS NULL`;
|
|
404
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
405
|
+
const res = await rv.RunView({
|
|
406
|
+
EntityName: 'MJ: Conversation Details',
|
|
407
|
+
ExtraFilter: `ConversationID='${safeConvId}' AND ${branchPredicate} AND (HiddenToUser = 0 OR HiddenToUser IS NULL)`,
|
|
408
|
+
Fields: ['ID'],
|
|
409
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
410
|
+
MaxRows: 1,
|
|
411
|
+
ResultType: 'simple',
|
|
412
|
+
BypassCache: true,
|
|
413
|
+
}, this.contextUser);
|
|
414
|
+
if (res.Success && res.Results && res.Results.length > 0 && res.Results[0].ID) {
|
|
415
|
+
return UUIDsEqual(res.Results[0].ID, originDetailId);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
catch {
|
|
419
|
+
// Fall back to false when RunView is unavailable.
|
|
420
|
+
}
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Replaces the originating message's stale "I'll follow up when it finishes" copy with a clean
|
|
425
|
+
* completion note when the workflow outcome was delivered in a separate bottom continuation message.
|
|
426
|
+
*/
|
|
427
|
+
async markOriginDetailCompleted(originDetail, workflowName) {
|
|
428
|
+
try {
|
|
429
|
+
const currentMsg = originDetail.Message || '';
|
|
430
|
+
const completionNote = `*(✅ **${workflowName}** completed — synthesized results posted below.)*`;
|
|
431
|
+
if (!currentMsg.includes(completionNote)) {
|
|
432
|
+
const cleaned = currentMsg
|
|
433
|
+
.replace(/\s*I['’]ll follow up when it finishes\.?/gi, '')
|
|
434
|
+
.trim();
|
|
435
|
+
originDetail.Message = cleaned
|
|
436
|
+
? `${cleaned}\n\n${completionNote}`
|
|
437
|
+
: completionNote;
|
|
438
|
+
originDetail.Status = 'Complete';
|
|
439
|
+
if (!(await originDetail.Save())) {
|
|
440
|
+
LogError(`[TaskGraphContinuationDeliverer] Could not update originating detail for "${workflowName}": ` +
|
|
441
|
+
`${originDetail.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
// Non-fatal if origin detail note update fails.
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Looks up the conversation owner's `UserID` from `MJ: Conversations` when the originating
|
|
451
|
+
* `MJ: Conversation Details` row is an AI message (`detail.UserID === null`).
|
|
452
|
+
*/
|
|
453
|
+
async lookupConversationOwnerId(conversationId, provider) {
|
|
454
|
+
try {
|
|
455
|
+
const safeId = conversationId.replace(/'/g, "''");
|
|
456
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
457
|
+
const res = await rv.RunView({
|
|
458
|
+
EntityName: 'MJ: Conversations',
|
|
459
|
+
ExtraFilter: `ID='${safeId}'`,
|
|
460
|
+
Fields: ['ID', 'UserID'],
|
|
461
|
+
ResultType: 'simple',
|
|
462
|
+
}, this.contextUser);
|
|
463
|
+
if (res.Success && res.Results && res.Results.length > 0 && res.Results[0].UserID) {
|
|
464
|
+
return res.Results[0].UserID;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
catch {
|
|
468
|
+
// Fall back to contextUser when provider is a lightweight test harness without RunView.
|
|
469
|
+
}
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Resolves the conversation owner's `UserInfo` from `UserCache` so `MJConversationDetailEntityExtended`
|
|
474
|
+
* ownership checks and artifact ownership succeed. Falls back to `this.contextUser` when not cached.
|
|
475
|
+
*/
|
|
476
|
+
resolveActingUser(ownerUserId) {
|
|
477
|
+
if (!ownerUserId) {
|
|
478
|
+
return this.contextUser;
|
|
479
|
+
}
|
|
480
|
+
try {
|
|
481
|
+
const users = UserCache.Instance?.Users ?? UserCache.Users ?? [];
|
|
482
|
+
const matched = users.find((u) => UUIDsEqual(u.ID, ownerUserId));
|
|
483
|
+
if (matched) {
|
|
484
|
+
return matched;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
// Fall back to contextUser when UserCache is not initialized.
|
|
489
|
+
}
|
|
490
|
+
return this.contextUser;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Loads child task `OutputPayload` rows for `params.ParentTaskID`, strips upstream payload keys
|
|
494
|
+
* inherited unchanged via `TaskGraphDispatcher.applyStepOutputMapping`, and replaces generic
|
|
495
|
+
* `"output available (N chars)"` summaries with readable output excerpts so both `PostMessage`
|
|
496
|
+
* and `Reinvoke` carry each step's own concrete results into the conversation.
|
|
497
|
+
*/
|
|
498
|
+
async enrichTasksWithOutputs(params, provider) {
|
|
499
|
+
if (!params.ParentTaskID || params.Tasks.length === 0) {
|
|
500
|
+
return params;
|
|
501
|
+
}
|
|
502
|
+
try {
|
|
503
|
+
const safeParentId = params.ParentTaskID.replace(/'/g, "''");
|
|
504
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
505
|
+
const res = await rv.RunView({
|
|
506
|
+
EntityName: 'MJ: Tasks',
|
|
507
|
+
ExtraFilter: `ParentID='${safeParentId}'`,
|
|
508
|
+
Fields: ['ID', 'Name', 'OutputPayload'],
|
|
509
|
+
ResultType: 'simple',
|
|
510
|
+
BypassCache: true,
|
|
511
|
+
}, this.contextUser);
|
|
512
|
+
const outputById = new Map();
|
|
513
|
+
const nameById = new Map();
|
|
514
|
+
for (const row of res.Results ?? []) {
|
|
515
|
+
if (row.ID) {
|
|
516
|
+
const lower = row.ID.toLowerCase();
|
|
517
|
+
if (row.Name) {
|
|
518
|
+
nameById.set(lower, row.Name);
|
|
519
|
+
}
|
|
520
|
+
if (row.OutputPayload) {
|
|
521
|
+
outputById.set(lower, row.OutputPayload);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
for (const t of params.Tasks) {
|
|
526
|
+
if (t.TaskID && t.Name && !nameById.has(t.TaskID.toLowerCase())) {
|
|
527
|
+
nameById.set(t.TaskID.toLowerCase(), t.Name);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
const skippedReasonById = await this.resolveSkippedTaskReasons(params, rv, nameById);
|
|
531
|
+
if (outputById.size === 0 && skippedReasonById.size === 0) {
|
|
532
|
+
return params;
|
|
533
|
+
}
|
|
534
|
+
const seenUpstreamKeyValues = new Map();
|
|
535
|
+
return {
|
|
536
|
+
...params,
|
|
537
|
+
Tasks: params.Tasks.map((task) => {
|
|
538
|
+
const lowerId = task.TaskID.toLowerCase();
|
|
539
|
+
if (task.Status === 'Skipped' && !task.Summary) {
|
|
540
|
+
const skipReason = skippedReasonById.get(lowerId);
|
|
541
|
+
if (skipReason) {
|
|
542
|
+
return { ...task, Summary: skipReason };
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
const rawOutput = outputById.get(lowerId);
|
|
546
|
+
if (!rawOutput) {
|
|
547
|
+
return task;
|
|
548
|
+
}
|
|
549
|
+
const deltaOutput = this.stripInheritedUpstreamKeys(rawOutput, seenUpstreamKeyValues);
|
|
550
|
+
const isPlaceholderSummary = !task.Summary || task.Summary.startsWith('output available (');
|
|
551
|
+
if (!isPlaceholderSummary) {
|
|
552
|
+
return task;
|
|
553
|
+
}
|
|
554
|
+
const excerpt = this.extractOutputExcerpt(deltaOutput);
|
|
555
|
+
return excerpt ? { ...task, Summary: excerpt } : task;
|
|
556
|
+
}),
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
return params;
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Resolves a human-readable explanation for each `Skipped` task in `params.Tasks` by inspecting
|
|
565
|
+
* its `MJ: Task Dependencies` (`Condition` and upstream prerequisite status).
|
|
566
|
+
*/
|
|
567
|
+
async resolveSkippedTaskReasons(params, rv, nameById) {
|
|
568
|
+
const reasons = new Map();
|
|
569
|
+
const skippedTasks = params.Tasks.filter((t) => t.Status === 'Skipped' && Boolean(t.TaskID));
|
|
570
|
+
if (skippedTasks.length === 0) {
|
|
571
|
+
return reasons;
|
|
572
|
+
}
|
|
573
|
+
try {
|
|
574
|
+
const quotedIds = skippedTasks
|
|
575
|
+
.map((t) => `'${t.TaskID.replace(/'/g, "''")}'`)
|
|
576
|
+
.join(',');
|
|
577
|
+
const depRes = await rv.RunView({
|
|
578
|
+
EntityName: 'MJ: Task Dependencies',
|
|
579
|
+
ExtraFilter: `TaskID IN (${quotedIds})`,
|
|
580
|
+
Fields: ['TaskID', 'DependsOnTaskID', 'Condition'],
|
|
581
|
+
ResultType: 'simple',
|
|
582
|
+
BypassCache: true,
|
|
583
|
+
}, this.contextUser);
|
|
584
|
+
const statusById = new Map();
|
|
585
|
+
for (const t of params.Tasks) {
|
|
586
|
+
if (t.TaskID) {
|
|
587
|
+
statusById.set(t.TaskID.toLowerCase(), t.Status);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
const depsByTask = new Map();
|
|
591
|
+
for (const dep of depRes.Results ?? []) {
|
|
592
|
+
if (!dep.TaskID)
|
|
593
|
+
continue;
|
|
594
|
+
const key = dep.TaskID.toLowerCase();
|
|
595
|
+
const list = depsByTask.get(key) ?? [];
|
|
596
|
+
list.push(dep);
|
|
597
|
+
depsByTask.set(key, list);
|
|
598
|
+
}
|
|
599
|
+
for (const skipped of skippedTasks) {
|
|
600
|
+
const lower = skipped.TaskID.toLowerCase();
|
|
601
|
+
const deps = depsByTask.get(lower) ?? [];
|
|
602
|
+
const parts = [];
|
|
603
|
+
for (const dep of deps) {
|
|
604
|
+
const prereqKey = dep.DependsOnTaskID?.toLowerCase() ?? '';
|
|
605
|
+
const prereqName = nameById.get(prereqKey);
|
|
606
|
+
const prereqStatus = statusById.get(prereqKey);
|
|
607
|
+
if (dep.Condition && dep.Condition.trim()) {
|
|
608
|
+
parts.push(prereqName
|
|
609
|
+
? `branch condition \`${dep.Condition.trim()}\` on "${prereqName}" evaluated to false`
|
|
610
|
+
: `branch condition \`${dep.Condition.trim()}\` evaluated to false`);
|
|
611
|
+
}
|
|
612
|
+
else if (prereqStatus === 'Skipped' || prereqStatus === 'Failed') {
|
|
613
|
+
parts.push(prereqName
|
|
614
|
+
? `prerequisite "${prereqName}" was ${prereqStatus}`
|
|
615
|
+
: `prerequisite task was ${prereqStatus}`);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
reasons.set(lower, parts.length > 0
|
|
619
|
+
? parts.join('; ')
|
|
620
|
+
: 'prerequisite branch condition evaluated to false');
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
catch {
|
|
624
|
+
// Optional dependency lookup; return empty map on failure.
|
|
625
|
+
}
|
|
626
|
+
return reasons;
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Removes top-level JSON keys from `rawOutput` whose serialized value is identical to an
|
|
630
|
+
* earlier step's output in the same workflow (`TaskGraphDispatcher.applyStepOutputMapping`
|
|
631
|
+
* merges `{ ...payload, ...output }`), while recording this step's keys for downstream steps.
|
|
632
|
+
*/
|
|
633
|
+
stripInheritedUpstreamKeys(rawOutput, seenUpstreamKeyValues) {
|
|
634
|
+
try {
|
|
635
|
+
const parsed = JSON.parse(rawOutput.trim());
|
|
636
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
637
|
+
const delta = {};
|
|
638
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
639
|
+
const serializedVal = JSON.stringify(value);
|
|
640
|
+
if (seenUpstreamKeyValues.get(key) !== serializedVal) {
|
|
641
|
+
delta[key] = value;
|
|
642
|
+
}
|
|
643
|
+
seenUpstreamKeyValues.set(key, serializedVal);
|
|
644
|
+
}
|
|
645
|
+
if (Object.keys(delta).length > 0) {
|
|
646
|
+
return JSON.stringify(delta);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
catch {
|
|
651
|
+
// Non-JSON output; return as-is.
|
|
652
|
+
}
|
|
653
|
+
return rawOutput;
|
|
654
|
+
}
|
|
655
|
+
/**
|
|
656
|
+
* Extracts a human-readable excerpt from a task's serialized `OutputPayload` (up to 2,500 chars).
|
|
657
|
+
*/
|
|
658
|
+
extractOutputExcerpt(rawOutput) {
|
|
659
|
+
const maxChars = 2500;
|
|
660
|
+
const trimmed = rawOutput.trim();
|
|
661
|
+
if (!trimmed) {
|
|
662
|
+
return '';
|
|
663
|
+
}
|
|
664
|
+
try {
|
|
665
|
+
const parsed = JSON.parse(trimmed);
|
|
666
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
667
|
+
const sections = [];
|
|
668
|
+
const titleText = parsed.title ?? parsed.queryName ?? parsed.savedQueryName;
|
|
669
|
+
if (typeof titleText === 'string' && titleText.trim()) {
|
|
670
|
+
sections.push(`Title: ${titleText.trim()}`);
|
|
671
|
+
}
|
|
672
|
+
if (typeof parsed.message === 'string' && parsed.message.trim()) {
|
|
673
|
+
sections.push(parsed.message.trim());
|
|
674
|
+
}
|
|
675
|
+
const summaryText = parsed.summary ?? parsed.description ?? parsed.interpretation;
|
|
676
|
+
if (typeof summaryText === 'string' && summaryText.trim()) {
|
|
677
|
+
sections.push(summaryText.trim());
|
|
678
|
+
}
|
|
679
|
+
if (typeof parsed.explanation === 'string' && parsed.explanation.trim()) {
|
|
680
|
+
sections.push(`Explanation: ${parsed.explanation.trim()}`);
|
|
681
|
+
}
|
|
682
|
+
if (typeof parsed.analysis === 'string' && parsed.analysis.trim()) {
|
|
683
|
+
sections.push(`Analysis: ${parsed.analysis.trim()}`);
|
|
684
|
+
}
|
|
685
|
+
const sqlText = parsed.request ?? parsed.sql;
|
|
686
|
+
if (typeof sqlText === 'string' && sqlText.trim()) {
|
|
687
|
+
sections.push(`SQL / Request:\n\`\`\`sql\n${sqlText.trim()}\n\`\`\``);
|
|
688
|
+
}
|
|
689
|
+
if (typeof parsed.plan === 'string' && parsed.plan.trim()) {
|
|
690
|
+
sections.push(parsed.plan.trim());
|
|
691
|
+
}
|
|
692
|
+
// Nested synthesis object (e.g., Research Agent / Query Strategist)
|
|
693
|
+
const synthesis = (typeof parsed.synthesis === 'object' && parsed.synthesis !== null && !Array.isArray(parsed.synthesis))
|
|
694
|
+
? parsed.synthesis
|
|
695
|
+
: undefined;
|
|
696
|
+
if (synthesis) {
|
|
697
|
+
if (typeof synthesis.executiveSummary === 'string' && synthesis.executiveSummary.trim()) {
|
|
698
|
+
sections.push(`Executive Summary: ${synthesis.executiveSummary.trim()}`);
|
|
699
|
+
}
|
|
700
|
+
if (Array.isArray(synthesis.keyFindings) && synthesis.keyFindings.length > 0) {
|
|
701
|
+
sections.push(`Key Findings: ${JSON.stringify(synthesis.keyFindings.slice(0, 10))}`);
|
|
702
|
+
}
|
|
703
|
+
if (Array.isArray(synthesis.recommendations) && synthesis.recommendations.length > 0) {
|
|
704
|
+
sections.push(`Recommendations: ${JSON.stringify(synthesis.recommendations.slice(0, 10))}`);
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
// Nested report object (e.g., Research Report Writer)
|
|
708
|
+
const report = (typeof parsed.report === 'object' && parsed.report !== null && !Array.isArray(parsed.report))
|
|
709
|
+
? parsed.report
|
|
710
|
+
: undefined;
|
|
711
|
+
if (report) {
|
|
712
|
+
if (typeof report.name === 'string' && report.name.trim()) {
|
|
713
|
+
sections.push(`Report Title: ${report.name.trim()}`);
|
|
714
|
+
}
|
|
715
|
+
if (typeof report.description === 'string' && report.description.trim()) {
|
|
716
|
+
sections.push(`Report Summary: ${report.description.trim()}`);
|
|
717
|
+
}
|
|
718
|
+
if (typeof report.html === 'string' && report.html.trim()) {
|
|
719
|
+
const plainReportText = report.html
|
|
720
|
+
.replace(/<style[\s\S]*?<\/style>/gi, ' ')
|
|
721
|
+
.replace(/<script[\s\S]*?<\/script>/gi, ' ')
|
|
722
|
+
.replace(/<[^>]+>/g, ' ')
|
|
723
|
+
.replace(/\s+/g, ' ')
|
|
724
|
+
.trim();
|
|
725
|
+
if (plainReportText) {
|
|
726
|
+
sections.push(`Report Excerpt: ${plainReportText.slice(0, 1000)}`);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
// Action output fields (Result / result / output / value)
|
|
731
|
+
const actionOutput = parsed.Result ?? parsed.result ?? parsed.output ?? parsed.value;
|
|
732
|
+
if (actionOutput !== undefined && actionOutput !== null) {
|
|
733
|
+
const formattedActionOutput = typeof actionOutput === 'string'
|
|
734
|
+
? actionOutput.trim()
|
|
735
|
+
: JSON.stringify(actionOutput);
|
|
736
|
+
if (formattedActionOutput) {
|
|
737
|
+
sections.push(`Result: ${formattedActionOutput}`);
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
if (Array.isArray(parsed.rows) && parsed.rows.length > 0) {
|
|
741
|
+
sections.push(`Sample Rows (${parsed.rows.length} total): ${JSON.stringify(parsed.rows.slice(0, 10))}`);
|
|
742
|
+
}
|
|
743
|
+
if (parsed.decisions !== undefined && parsed.decisions !== null && sections.length === 0) {
|
|
744
|
+
sections.push(`Decisions: ${JSON.stringify(parsed.decisions)}`);
|
|
745
|
+
}
|
|
746
|
+
if (sections.length > 0) {
|
|
747
|
+
const combined = sections.join('\n\n');
|
|
748
|
+
return combined.length > maxChars ? `${combined.slice(0, maxChars)}…` : combined;
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
catch {
|
|
753
|
+
// Fall through to raw string truncation when OutputPayload is not JSON.
|
|
754
|
+
}
|
|
755
|
+
return trimmed.length > maxChars ? `${trimmed.slice(0, maxChars)}…` : trimmed;
|
|
147
756
|
}
|
|
148
757
|
/**
|
|
149
758
|
* Renders the outcome as Markdown.
|
|
@@ -172,6 +781,7 @@ export class TaskGraphContinuationDeliverer {
|
|
|
172
781
|
case 'Complete': return '✅';
|
|
173
782
|
case 'Failed': return '❌';
|
|
174
783
|
case 'Cancelled': return '⊘';
|
|
784
|
+
case 'Skipped': return '⏭️';
|
|
175
785
|
default: return '•';
|
|
176
786
|
}
|
|
177
787
|
}
|