@memberjunction/server 6.2.0-edge.3 → 6.2.0-edge.5
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 +20 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/BridgeHostInstance.d.ts +25 -0
- package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -0
- package/dist/agentSessions/BridgeHostInstance.js +30 -0
- package/dist/agentSessions/BridgeHostInstance.js.map +1 -0
- package/dist/agentSessions/HostInstance.d.ts +75 -11
- package/dist/agentSessions/HostInstance.d.ts.map +1 -1
- package/dist/agentSessions/HostInstance.js +99 -28
- package/dist/agentSessions/HostInstance.js.map +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.js +7 -3
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +236 -27
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +682 -54
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +48 -3
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +112 -9
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/agentSessions/SessionRunIDVerifier.d.ts +63 -0
- package/dist/agentSessions/SessionRunIDVerifier.d.ts.map +1 -0
- package/dist/agentSessions/SessionRunIDVerifier.js +129 -0
- package/dist/agentSessions/SessionRunIDVerifier.js.map +1 -0
- package/dist/agentSessions/index.d.ts +2 -0
- package/dist/agentSessions/index.d.ts.map +1 -1
- package/dist/agentSessions/index.js +10 -3
- package/dist/agentSessions/index.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 +25 -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/actionAuthorization.d.ts +40 -0
- package/dist/auth/actionAuthorization.d.ts.map +1 -0
- package/dist/auth/actionAuthorization.js +94 -0
- package/dist/auth/actionAuthorization.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 +4 -10
- package/dist/auth/index.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/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +6 -3
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/newUsers.d.ts +10 -0
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +80 -11
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/config.d.ts +2514 -22
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +166 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +8 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +14 -11
- 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 +142 -0
- package/dist/coreRoutes.js.map +1 -0
- package/dist/generated/graphql-schemas/__mj.d.ts +504 -3
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +2456 -7
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +43 -8
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +59 -19
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/PushStatusResolver.js +1 -1
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +123 -48
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +293 -305
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +16 -0
- package/dist/generic/RunViewResolver.js.map +1 -1
- 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 +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +219 -278
- package/dist/index.js.map +1 -1
- package/dist/isolatedProvider.d.ts +20 -0
- package/dist/isolatedProvider.d.ts.map +1 -0
- package/dist/isolatedProvider.js +22 -0
- package/dist/isolatedProvider.js.map +1 -0
- 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/realtimeProxy/RealtimeProxyServer.d.ts +44 -4
- package/dist/realtimeProxy/RealtimeProxyServer.d.ts.map +1 -1
- package/dist/realtimeProxy/RealtimeProxyServer.js +121 -16
- package/dist/realtimeProxy/RealtimeProxyServer.js.map +1 -1
- package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts +171 -0
- package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts.map +1 -0
- package/dist/realtimeProxy/RealtimeRelayTunnel.js +532 -0
- package/dist/realtimeProxy/RealtimeRelayTunnel.js.map +1 -0
- package/dist/realtimeSessions/RealtimeSessionEventService.d.ts +148 -0
- package/dist/realtimeSessions/RealtimeSessionEventService.d.ts.map +1 -0
- package/dist/realtimeSessions/RealtimeSessionEventService.js +191 -0
- package/dist/realtimeSessions/RealtimeSessionEventService.js.map +1 -0
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts +66 -0
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -0
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js +139 -0
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts +38 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.js +99 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -0
- 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 +61 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js +149 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -0
- package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts +57 -0
- package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts.map +1 -0
- package/dist/realtimeSessions/SlidingWindowRateLimiter.js +69 -0
- package/dist/realtimeSessions/SlidingWindowRateLimiter.js.map +1 -0
- package/dist/realtimeSessions/index.d.ts +19 -0
- package/dist/realtimeSessions/index.d.ts.map +1 -0
- package/dist/realtimeSessions/index.js +19 -0
- package/dist/realtimeSessions/index.js.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +30 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js +47 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
- package/dist/realtimeSessions/sessionAccess.d.ts +92 -0
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
- package/dist/realtimeSessions/sessionAccess.js +94 -0
- package/dist/realtimeSessions/sessionAccess.js.map +1 -0
- package/dist/realtimeSessions/sessionConfigStamps.d.ts +70 -0
- package/dist/realtimeSessions/sessionConfigStamps.d.ts.map +1 -0
- package/dist/realtimeSessions/sessionConfigStamps.js +93 -0
- package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -0
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts +65 -0
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -0
- package/dist/realtimeSessions/subscriptionAuthorization.js +71 -0
- package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -0
- package/dist/realtimeSessions/verificationCore.d.ts +243 -0
- package/dist/realtimeSessions/verificationCore.d.ts.map +1 -0
- package/dist/realtimeSessions/verificationCore.js +356 -0
- package/dist/realtimeSessions/verificationCore.js.map +1 -0
- package/dist/realtimeSessions/verificationPages.d.ts +66 -0
- package/dist/realtimeSessions/verificationPages.d.ts.map +1 -0
- package/dist/realtimeSessions/verificationPages.js +110 -0
- package/dist/realtimeSessions/verificationPages.js.map +1 -0
- package/dist/realtimeSessions/verificationPolicy.d.ts +147 -0
- package/dist/realtimeSessions/verificationPolicy.d.ts.map +1 -0
- package/dist/realtimeSessions/verificationPolicy.js +249 -0
- package/dist/realtimeSessions/verificationPolicy.js.map +1 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts +263 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -0
- package/dist/realtimeSessions/verificationWorkflow.js +435 -0
- package/dist/realtimeSessions/verificationWorkflow.js.map +1 -0
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +20 -2
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +31 -2
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +31 -5
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +75 -14
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts +14 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +21 -5
- package/dist/resolvers/AdhocQueryResolver.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/CacheStatsResolver.d.ts +27 -0
- package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -1
- package/dist/resolvers/CacheStatsResolver.js +113 -2
- package/dist/resolvers/CacheStatsResolver.js.map +1 -1
- package/dist/resolvers/ClientToolRequestResolver.d.ts +4 -2
- package/dist/resolvers/ClientToolRequestResolver.d.ts.map +1 -1
- package/dist/resolvers/ClientToolRequestResolver.js +28 -10
- package/dist/resolvers/ClientToolRequestResolver.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/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 +27 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +148 -2
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +82 -11
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +279 -101
- 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/HumanHandoffResolver.d.ts.map +1 -1
- package/dist/resolvers/HumanHandoffResolver.js +7 -1
- package/dist/resolvers/HumanHandoffResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +4 -2
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +9 -4
- package/dist/resolvers/MCPResolver.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 +13 -0
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts +54 -2
- package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +155 -10
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +157 -33
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +404 -116
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RealtimeSessionEventsResolver.d.ts +61 -0
- package/dist/resolvers/RealtimeSessionEventsResolver.d.ts.map +1 -0
- package/dist/resolvers/RealtimeSessionEventsResolver.js +130 -0
- package/dist/resolvers/RealtimeSessionEventsResolver.js.map +1 -0
- package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts +85 -0
- package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts.map +1 -0
- package/dist/resolvers/RealtimeSessionVerificationResolver.js +188 -0
- package/dist/resolvers/RealtimeSessionVerificationResolver.js.map +1 -0
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +10 -0
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +100 -14
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +12 -11
- package/dist/resolvers/RunTemplateResolver.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 +6 -2
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +2 -0
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +23 -6
- package/dist/resolvers/SyncRolesUsersResolver.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 +65 -13
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +19 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +102 -24
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserAvatarResolver.d.ts +16 -0
- package/dist/resolvers/UserAvatarResolver.d.ts.map +1 -0
- package/dist/resolvers/UserAvatarResolver.js +124 -0
- package/dist/resolvers/UserAvatarResolver.js.map +1 -0
- package/dist/resolvers/UserResolver.d.ts.map +1 -1
- package/dist/resolvers/UserResolver.js +2 -17
- package/dist/resolvers/UserResolver.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/resolvers/agentVisionConsentAudit.d.ts +37 -0
- package/dist/resolvers/agentVisionConsentAudit.d.ts.map +1 -0
- package/dist/resolvers/agentVisionConsentAudit.js +63 -0
- package/dist/resolvers/agentVisionConsentAudit.js.map +1 -0
- package/dist/resolvers/avatarInputValidation.d.ts +40 -0
- package/dist/resolvers/avatarInputValidation.d.ts.map +1 -0
- package/dist/resolvers/avatarInputValidation.js +97 -0
- package/dist/resolvers/avatarInputValidation.js.map +1 -0
- package/dist/resolvers/currentUserRoles.d.ts +29 -0
- package/dist/resolvers/currentUserRoles.d.ts.map +1 -1
- package/dist/resolvers/currentUserRoles.js +30 -0
- package/dist/resolvers/currentUserRoles.js.map +1 -1
- package/dist/resolvers/meetings/meetingMutations.d.ts +6 -0
- package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -1
- package/dist/resolvers/meetings/meetingMutations.js +21 -0
- package/dist/resolvers/meetings/meetingMutations.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 +3 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +21 -12
- 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/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 +57 -4
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +607 -18
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/sharedCache.d.ts +105 -0
- package/dist/sharedCache.d.ts.map +1 -0
- package/dist/sharedCache.js +279 -0
- package/dist/sharedCache.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +99 -96
- package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
- package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
- package/src/__tests__/BridgeHostInstance.test.ts +232 -0
- package/src/__tests__/ClientToolRequestResolver.test.ts +116 -0
- package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
- package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +433 -0
- package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
- package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
- package/src/__tests__/HostInstance.test.ts +84 -0
- package/src/__tests__/HumanHandoffResolver.test.ts +17 -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__/MeetingResolver.test.ts +75 -1
- package/src/__tests__/RealtimeBridgeResolver.test.ts +415 -6
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +682 -58
- package/src/__tests__/RealtimeProxyServer.test.ts +16 -1
- package/src/__tests__/RealtimeRelay.test.ts +876 -0
- package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
- package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
- package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
- 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 +212 -6
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
- package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +170 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +6 -4
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +258 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +166 -0
- package/src/__tests__/RunTemplateResolver.test.ts +132 -0
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +63 -0
- package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
- package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
- package/src/__tests__/SessionJanitor.test.ts +1203 -21
- package/src/__tests__/SessionManager.test.ts +240 -17
- package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
- package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
- package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +403 -22
- package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
- package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
- package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
- package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
- package/src/__tests__/UserAvatarResolver.test.ts +255 -0
- package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
- package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
- package/src/__tests__/actionAuthorization.test.ts +130 -0
- package/src/__tests__/agent-run-data-guard.test.ts +130 -0
- package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
- package/src/__tests__/apiRootBoot.test.ts +202 -0
- package/src/__tests__/avatarInputValidation.test.ts +160 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +64 -0
- package/src/__tests__/conversationRunEvents.test.ts +56 -14
- package/src/__tests__/globalCors.test.ts +217 -0
- package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
- package/src/__tests__/magicLinkService.consume.test.ts +6 -0
- package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -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__/newUsers.template.test.ts +151 -0
- package/src/__tests__/newUsers.test.ts +74 -5
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +17 -2
- package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +7 -0
- package/src/__tests__/realtimeRecordingHandler.test.ts +652 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionEventService.test.ts +201 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +215 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionVerificationResolver.test.ts +102 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionVerificationService.test.ts +349 -0
- package/src/__tests__/realtimeSessions/RealtimeVerifyRouter.test.ts +131 -0
- package/src/__tests__/realtimeSessions/SlidingWindowRateLimiter.test.ts +56 -0
- package/src/__tests__/realtimeSessions/helpers.ts +4 -0
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +129 -0
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +124 -0
- package/src/__tests__/realtimeSessions/verificationCore.test.ts +355 -0
- package/src/__tests__/realtimeSessions/verificationPages.test.ts +84 -0
- package/src/__tests__/realtimeSessions/verificationPolicy.test.ts +226 -0
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +633 -0
- package/src/__tests__/resolverBase.fls.test.ts +87 -4
- package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
- package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -96
- package/src/__tests__/sharedCache.test.ts +312 -0
- package/src/__tests__/widgetGuestElevation.test.ts +44 -0
- package/src/agentSessions/BridgeHostInstance.ts +32 -0
- package/src/agentSessions/HostInstance.ts +124 -28
- package/src/agentSessions/ReturningVisitorRecap.ts +7 -3
- package/src/agentSessions/SessionJanitor.ts +821 -59
- package/src/agentSessions/SessionManager.ts +138 -26
- package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
- package/src/agentSessions/index.ts +10 -3
- package/src/apiRoot.ts +78 -0
- package/src/auth/AuthProviderCatalogRouter.ts +26 -0
- package/src/auth/LoginScreenEngine.ts +50 -0
- package/src/auth/actionAuthorization.ts +116 -0
- package/src/auth/index.ts +4 -8
- package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
- package/src/auth/magicLink/MagicLinkService.ts +6 -3
- package/src/auth/newUsers.ts +99 -11
- package/src/config.ts +171 -5
- package/src/context.ts +15 -10
- package/src/coreRoutes.ts +166 -0
- package/src/generated/graphql-schemas/__mj.ts +1815 -57
- package/src/generic/CacheInvalidationResolver.ts +73 -18
- package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
- package/src/generic/PushStatusResolver.ts +1 -1
- package/src/generic/ResolverBase.ts +335 -326
- package/src/generic/RunViewResolver.ts +21 -0
- package/src/globalCors.ts +71 -0
- package/src/index.ts +231 -300
- package/src/isolatedProvider.ts +22 -0
- package/src/multiTenancy/index.ts +24 -2
- package/src/realtimeProxy/RealtimeProxyServer.ts +148 -16
- package/src/realtimeProxy/RealtimeRelayTunnel.ts +645 -0
- package/src/realtimeSessions/README.md +179 -0
- package/src/realtimeSessions/RealtimeSessionEventService.ts +274 -0
- package/src/realtimeSessions/RealtimeSessionVerificationService.ts +168 -0
- package/src/realtimeSessions/RealtimeVerifyRouter.ts +109 -0
- package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
- package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
- package/src/realtimeSessions/index.ts +18 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +55 -0
- package/src/realtimeSessions/sessionAccess.ts +145 -0
- package/src/realtimeSessions/sessionConfigStamps.ts +123 -0
- package/src/realtimeSessions/subscriptionAuthorization.ts +116 -0
- package/src/realtimeSessions/verificationCore.ts +502 -0
- package/src/realtimeSessions/verificationPages.ts +149 -0
- package/src/realtimeSessions/verificationPolicy.ts +321 -0
- package/src/realtimeSessions/verificationWorkflow.ts +702 -0
- package/src/realtimeWidget/widgetGuestElevation.ts +34 -2
- package/src/resolvers/ActionResolver.ts +84 -21
- package/src/resolvers/AdhocQueryResolver.ts +24 -6
- package/src/resolvers/ArtifactFileResolver.ts +9 -8
- package/src/resolvers/CacheStatsResolver.ts +89 -2
- package/src/resolvers/ClientToolRequestResolver.ts +25 -7
- package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
- package/src/resolvers/DatasetResolver.ts +70 -10
- package/src/resolvers/EntityRecordNameResolver.ts +3 -2
- package/src/resolvers/FetchEntityVectorsResolver.ts +179 -2
- package/src/resolvers/FileResolver.ts +321 -106
- package/src/resolvers/GetDataContextDataResolver.ts +139 -41
- package/src/resolvers/GetDataResolver.ts +6 -3
- package/src/resolvers/HumanHandoffResolver.ts +8 -0
- package/src/resolvers/IntegrationDiscoveryResolver.ts +4 -2
- package/src/resolvers/MCPResolver.ts +8 -5
- package/src/resolvers/QueryResolver.ts +11 -0
- package/src/resolvers/RealtimeBridgeResolver.ts +163 -11
- package/src/resolvers/RealtimeClientSessionResolver.ts +511 -129
- package/src/resolvers/RealtimeSessionEventsResolver.ts +133 -0
- package/src/resolvers/RealtimeSessionVerificationResolver.ts +174 -0
- package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
- package/src/resolvers/RunAIAgentResolver.ts +116 -14
- package/src/resolvers/RunTemplateResolver.ts +13 -12
- package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
- package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
- package/src/resolvers/SyncDataResolver.ts +6 -2
- package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
- package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
- package/src/resolvers/TestQuerySQLResolver.ts +68 -13
- package/src/resolvers/TransactionGroupResolver.ts +131 -27
- package/src/resolvers/UserAvatarResolver.ts +111 -0
- package/src/resolvers/UserResolver.ts +2 -16
- package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
- package/src/resolvers/agent-run-data-guard.ts +89 -0
- package/src/resolvers/agentVisionConsentAudit.ts +82 -0
- package/src/resolvers/avatarInputValidation.ts +123 -0
- package/src/resolvers/currentUserRoles.ts +32 -1
- package/src/resolvers/meetings/meetingMutations.ts +21 -0
- package/src/rest/RealtimeRecordingHandler.ts +464 -0
- package/src/rest/ViewOperationsHandler.ts +29 -13
- package/src/rest/setupRESTEndpoints.ts +6 -0
- package/src/serverExtensionReservedRoots.ts +14 -17
- 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 +713 -17
- package/src/sharedCache.ts +305 -0
- package/src/types.ts +7 -0
|
@@ -9,11 +9,28 @@
|
|
|
9
9
|
* compare-and-swap that marks a completion delivered; an escaping error would either abort that
|
|
10
10
|
* guard or leave the graph looking undelivered and re-notifying on every later sweep.
|
|
11
11
|
*/
|
|
12
|
+
import 'reflect-metadata';
|
|
12
13
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
13
14
|
|
|
15
|
+
const { fromMetadataProvider, runAgent, processAgentArtifacts } = vi.hoisted(() => ({
|
|
16
|
+
fromMetadataProvider: vi.fn(),
|
|
17
|
+
runAgent: vi.fn(),
|
|
18
|
+
processAgentArtifacts: vi.fn(),
|
|
19
|
+
}));
|
|
20
|
+
|
|
14
21
|
vi.mock('@memberjunction/core', () => ({
|
|
15
22
|
LogError: vi.fn(),
|
|
16
23
|
LogStatus: vi.fn(),
|
|
24
|
+
RunView: {
|
|
25
|
+
FromMetadataProvider: fromMetadataProvider,
|
|
26
|
+
},
|
|
27
|
+
}));
|
|
28
|
+
|
|
29
|
+
vi.mock('@memberjunction/generic-database-provider', () => ({
|
|
30
|
+
UserCache: {
|
|
31
|
+
Instance: { Users: [{ ID: 'owner-user-99', Email: 'owner@example.com' }] },
|
|
32
|
+
Users: [{ ID: 'owner-user-99', Email: 'owner@example.com' }],
|
|
33
|
+
},
|
|
17
34
|
}));
|
|
18
35
|
|
|
19
36
|
vi.mock('@memberjunction/core-entities', () => ({
|
|
@@ -24,21 +41,27 @@ vi.mock('@memberjunction/core-entities', () => ({
|
|
|
24
41
|
vi.mock('@memberjunction/ai-core-plus', () => ({ MJAIAgentEntityExtended: class {} }));
|
|
25
42
|
vi.mock('@memberjunction/ai', () => ({ ChatMessageRole: { user: 'user' } }));
|
|
26
43
|
|
|
27
|
-
const runAgent = vi.fn().mockResolvedValue({ success: true });
|
|
28
44
|
vi.mock('@memberjunction/ai-agents', () => ({
|
|
29
|
-
AgentRunner: class {
|
|
45
|
+
AgentRunner: class {
|
|
46
|
+
RunAgent = runAgent;
|
|
47
|
+
ProcessAgentArtifacts = processAgentArtifacts;
|
|
48
|
+
},
|
|
30
49
|
}));
|
|
31
50
|
|
|
32
51
|
import { TaskGraphContinuationDeliverer } from '../services/TaskGraphContinuationDeliverer';
|
|
33
52
|
import type { TaskContinuationParams } from '@memberjunction/task-graph';
|
|
34
53
|
import type { UserInfo } from '@memberjunction/core';
|
|
54
|
+
import type { PubSubEngine } from 'type-graphql';
|
|
35
55
|
|
|
36
56
|
/** A conversation-detail row that can be loaded (the source) and saved (the reply). */
|
|
37
|
-
function detailRow(over: Partial<{ loads: boolean; saves: boolean; conversationID: string }> = {}) {
|
|
38
|
-
const { loads = true, saves = true, conversationID = 'conv-1' } = over;
|
|
57
|
+
function detailRow(over: Partial<{ loads: boolean; saves: boolean; conversationID: string; branchID: string | null }> = {}) {
|
|
58
|
+
const { loads = true, saves = true, conversationID = 'conv-1', branchID = null } = over;
|
|
39
59
|
return {
|
|
60
|
+
ID: 'reply-detail-1',
|
|
40
61
|
ConversationID: conversationID,
|
|
62
|
+
BranchID: branchID as string | null,
|
|
41
63
|
Role: '', Status: '', HiddenToUser: true, Message: '',
|
|
64
|
+
AgentID: null as string | null,
|
|
42
65
|
NewRecord: vi.fn(),
|
|
43
66
|
Load: vi.fn().mockResolvedValue(loads),
|
|
44
67
|
Save: vi.fn().mockResolvedValue(saves),
|
|
@@ -51,17 +74,21 @@ function harness(over: Parameters<typeof detailRow>[0] = {}) {
|
|
|
51
74
|
const provider = {
|
|
52
75
|
GetEntityObject: vi.fn().mockImplementation(async () => {
|
|
53
76
|
const row = detailRow(over);
|
|
77
|
+
if (rows.length > 0) {
|
|
78
|
+
row.BranchID = 'stale';
|
|
79
|
+
}
|
|
54
80
|
rows.push(row);
|
|
55
81
|
return row;
|
|
56
82
|
}),
|
|
57
83
|
};
|
|
58
84
|
const providerFactory = { CreateProvider: vi.fn().mockResolvedValue(provider) };
|
|
85
|
+
const pubSub = { publish: vi.fn().mockResolvedValue(undefined) } as unknown as PubSubEngine;
|
|
59
86
|
const deliverer = new TaskGraphContinuationDeliverer(
|
|
60
87
|
providerFactory as never,
|
|
61
88
|
{ ID: 'user-1' } as UserInfo,
|
|
89
|
+
pubSub,
|
|
62
90
|
);
|
|
63
|
-
|
|
64
|
-
return { deliverer, providerFactory, provider, rows, reply: () => rows[1] };
|
|
91
|
+
return { deliverer, providerFactory, provider, rows, pubSub, reply: () => rows[1] };
|
|
65
92
|
}
|
|
66
93
|
|
|
67
94
|
const params = (over: Partial<TaskContinuationParams> = {}): TaskContinuationParams => ({
|
|
@@ -78,10 +105,21 @@ const params = (over: Partial<TaskContinuationParams> = {}): TaskContinuationPar
|
|
|
78
105
|
...over,
|
|
79
106
|
});
|
|
80
107
|
|
|
81
|
-
beforeEach(() =>
|
|
108
|
+
beforeEach(() => {
|
|
109
|
+
vi.clearAllMocks();
|
|
110
|
+
fromMetadataProvider.mockReturnValue({
|
|
111
|
+
RunView: vi.fn().mockResolvedValue({ Success: false, Results: [] }),
|
|
112
|
+
});
|
|
113
|
+
runAgent.mockResolvedValue({
|
|
114
|
+
success: true,
|
|
115
|
+
payload: 'Synthesized workflow outcome',
|
|
116
|
+
agentRun: { ID: 'cont-run-1', Message: 'Synthesized workflow outcome' },
|
|
117
|
+
});
|
|
118
|
+
processAgentArtifacts.mockResolvedValue(undefined);
|
|
119
|
+
});
|
|
82
120
|
|
|
83
121
|
describe('posting the outcome', () => {
|
|
84
|
-
it('writes an AI-role message into the graph\'s conversation', async () => {
|
|
122
|
+
it('writes an AI-role message into the graph\'s conversation and broadcasts completion via pubSub', async () => {
|
|
85
123
|
const h = harness();
|
|
86
124
|
await h.deliverer.PostMessage(params());
|
|
87
125
|
|
|
@@ -91,6 +129,7 @@ describe('posting the outcome', () => {
|
|
|
91
129
|
expect(reply.Role).toBe('AI');
|
|
92
130
|
expect(reply.Status).toBe('Complete');
|
|
93
131
|
expect(reply.HiddenToUser).toBe(false);
|
|
132
|
+
expect(h.pubSub.publish).toHaveBeenCalledTimes(2);
|
|
94
133
|
});
|
|
95
134
|
|
|
96
135
|
it('names the workflow and carries the roll-up', async () => {
|
|
@@ -101,8 +140,6 @@ describe('posting the outcome', () => {
|
|
|
101
140
|
});
|
|
102
141
|
|
|
103
142
|
it('lists each step, not just an aggregate status', async () => {
|
|
104
|
-
// A graph where nine of ten steps succeeded is a materially different message from one that
|
|
105
|
-
// failed outright, and the roll-up alone cannot say which step went wrong.
|
|
106
143
|
const h = harness();
|
|
107
144
|
await h.deliverer.PostMessage(params({
|
|
108
145
|
Tasks: [
|
|
@@ -125,13 +162,22 @@ describe('posting the outcome', () => {
|
|
|
125
162
|
const message = h.reply().Message;
|
|
126
163
|
expect(message).toContain('Step 0');
|
|
127
164
|
expect(message).not.toContain('Step 49');
|
|
128
|
-
// The count is stated rather than silently dropped — the task rows remain the full record.
|
|
129
165
|
expect(message).toContain('30 more');
|
|
130
166
|
});
|
|
131
167
|
|
|
168
|
+
it('posts into the fork of the message that started the graph', async () => {
|
|
169
|
+
const h = harness({ branchID: 'T1' });
|
|
170
|
+
await h.deliverer.PostMessage(params());
|
|
171
|
+
expect(h.reply().BranchID).toBe('T1');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('posts into Main when that message is in Main', async () => {
|
|
175
|
+
const h = harness();
|
|
176
|
+
await h.deliverer.PostMessage(params());
|
|
177
|
+
expect(h.reply().BranchID).toBeNull();
|
|
178
|
+
});
|
|
179
|
+
|
|
132
180
|
it('mints a fresh provider per delivery', async () => {
|
|
133
|
-
// Deliveries run outside any request and concurrently with task execution; a shared provider
|
|
134
|
-
// would share one transaction scope across unrelated work.
|
|
135
181
|
const h = harness();
|
|
136
182
|
await h.deliverer.PostMessage(params());
|
|
137
183
|
expect(h.providerFactory.CreateProvider).toHaveBeenCalledTimes(1);
|
|
@@ -140,8 +186,6 @@ describe('posting the outcome', () => {
|
|
|
140
186
|
|
|
141
187
|
describe('it never throws — the dispatcher marks delivery inside a CAS guard', () => {
|
|
142
188
|
it('does nothing for a headless graph, without treating it as an error', async () => {
|
|
143
|
-
// A graph submitted by a schedule, an entity-change trigger or an API call has no
|
|
144
|
-
// conversation to answer. Most workflows are in this shape.
|
|
145
189
|
const h = harness();
|
|
146
190
|
await expect(h.deliverer.PostMessage(params({ ConversationDetailID: null }))).resolves.toBeUndefined();
|
|
147
191
|
expect(h.providerFactory.CreateProvider).not.toHaveBeenCalled();
|
|
@@ -150,7 +194,7 @@ describe('it never throws — the dispatcher marks delivery inside a CAS guard',
|
|
|
150
194
|
it('survives a conversation detail that will not load', async () => {
|
|
151
195
|
const h = harness({ loads: false });
|
|
152
196
|
await expect(h.deliverer.PostMessage(params())).resolves.toBeUndefined();
|
|
153
|
-
expect(h.rows.length).toBe(1);
|
|
197
|
+
expect(h.rows.length).toBe(1);
|
|
154
198
|
});
|
|
155
199
|
|
|
156
200
|
it('survives a failed save', async () => {
|
|
@@ -168,7 +212,6 @@ describe('it never throws — the dispatcher marks delivery inside a CAS guard',
|
|
|
168
212
|
});
|
|
169
213
|
|
|
170
214
|
describe('Reinvoke — restarting the submitting agent', () => {
|
|
171
|
-
/** A provider that hands out loadable agent-run and agent rows, then the reply detail. */
|
|
172
215
|
function reinvokeHarness(over: { runLoads?: boolean; agentLoads?: boolean } = {}) {
|
|
173
216
|
const { runLoads = true, agentLoads = true } = over;
|
|
174
217
|
const rows: Array<Record<string, unknown>> = [];
|
|
@@ -191,14 +234,16 @@ describe('Reinvoke — restarting the submitting agent', () => {
|
|
|
191
234
|
return detail;
|
|
192
235
|
}),
|
|
193
236
|
};
|
|
237
|
+
const pubSub = { publish: vi.fn().mockResolvedValue(undefined) } as unknown as PubSubEngine;
|
|
194
238
|
const deliverer = new TaskGraphContinuationDeliverer(
|
|
195
239
|
{ CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
|
|
196
240
|
{ ID: 'user-1' } as UserInfo,
|
|
241
|
+
pubSub,
|
|
197
242
|
);
|
|
198
|
-
return { deliverer, provider, rows };
|
|
243
|
+
return { deliverer, provider, rows, pubSub };
|
|
199
244
|
}
|
|
200
245
|
|
|
201
|
-
it('starts the submitting agent a fresh turn carrying the outcome', async () => {
|
|
246
|
+
it('starts the submitting agent a fresh turn carrying the outcome, saves reply detail, processes artifacts, and publishes completion', async () => {
|
|
202
247
|
const h = reinvokeHarness();
|
|
203
248
|
await h.deliverer.Reinvoke(params());
|
|
204
249
|
|
|
@@ -206,11 +251,17 @@ describe('Reinvoke — restarting the submitting agent', () => {
|
|
|
206
251
|
const call = runAgent.mock.calls[0][0];
|
|
207
252
|
expect(call.agent.ID).toBe('agent-1');
|
|
208
253
|
expect(call.conversationMessages[0].content).toContain('Weekly digest');
|
|
254
|
+
expect(call.conversationDetailId).toBe('reply-detail-1');
|
|
255
|
+
|
|
256
|
+
const reply = h.rows[3] as ReturnType<typeof detailRow>;
|
|
257
|
+
expect(reply.Role).toBe('AI');
|
|
258
|
+
expect(reply.Status).toBe('Complete');
|
|
259
|
+
expect(reply.Message).toBe('Synthesized workflow outcome');
|
|
260
|
+
expect(processAgentArtifacts).toHaveBeenCalledTimes(1);
|
|
261
|
+
expect(h.pubSub.publish).toHaveBeenCalledTimes(2);
|
|
209
262
|
});
|
|
210
263
|
|
|
211
264
|
it('stamps depth + 1 — the value that makes MAX_REINVOKE_DEPTH real', async () => {
|
|
212
|
-
// Without this the next graph the restarted run submits begins the chain at zero again, and
|
|
213
|
-
// the cap can never fire. It is the whole reason ContinuationDepth exists as a column.
|
|
214
265
|
const h = reinvokeHarness();
|
|
215
266
|
await h.deliverer.Reinvoke(params({ ReinvokeDepth: 3 }));
|
|
216
267
|
expect(runAgent.mock.calls[0][0].continuationDepth).toBe(4);
|
|
@@ -223,7 +274,6 @@ describe('Reinvoke — restarting the submitting agent', () => {
|
|
|
223
274
|
});
|
|
224
275
|
|
|
225
276
|
it('falls back to posting when the graph records no submitting run', async () => {
|
|
226
|
-
// A schedule- or trigger-started graph has no turn to continue.
|
|
227
277
|
const h = reinvokeHarness();
|
|
228
278
|
await h.deliverer.Reinvoke(params({ SubmittedByAgentRunID: null }));
|
|
229
279
|
expect(runAgent).not.toHaveBeenCalled();
|
|
@@ -247,3 +297,334 @@ describe('Reinvoke — restarting the submitting agent', () => {
|
|
|
247
297
|
await expect(h.deliverer.Reinvoke(params())).resolves.toBeUndefined();
|
|
248
298
|
});
|
|
249
299
|
});
|
|
300
|
+
|
|
301
|
+
describe('Reinvoke — on the fork of the message that started the graph', () => {
|
|
302
|
+
function forkHarness(originBranch: string | null) {
|
|
303
|
+
const provider = {
|
|
304
|
+
GetEntityObject: vi.fn().mockImplementation(async (name: string) => {
|
|
305
|
+
if (name === 'MJ: AI Agent Runs') return { AgentID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
|
|
306
|
+
if (name === 'MJ: AI Agents') return { ID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
|
|
307
|
+
return detailRow({ branchID: originBranch });
|
|
308
|
+
}),
|
|
309
|
+
};
|
|
310
|
+
return new TaskGraphContinuationDeliverer(
|
|
311
|
+
{ CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
|
|
312
|
+
{ ID: 'user-1' } as UserInfo,
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
it('runs the reinvoked agent on that fork, as PostMessage posts into it', async () => {
|
|
317
|
+
await forkHarness('T1').Reinvoke(params());
|
|
318
|
+
|
|
319
|
+
expect(runAgent).toHaveBeenCalledTimes(1);
|
|
320
|
+
expect(runAgent.mock.calls[0][0].ConversationBranchID).toBe('T1');
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('leaves the branch unset when that message is in Main', async () => {
|
|
324
|
+
await forkHarness(null).Reinvoke(params());
|
|
325
|
+
|
|
326
|
+
expect(runAgent).toHaveBeenCalledTimes(1);
|
|
327
|
+
expect(runAgent.mock.calls[0][0].ConversationBranchID).toBeUndefined();
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it('enriches placeholder "output available (...)" task summaries with OutputPayload excerpts from MJ: Tasks', async () => {
|
|
331
|
+
const { RunView } = await import('@memberjunction/core');
|
|
332
|
+
vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
|
|
333
|
+
RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
|
|
334
|
+
if (rvParams.EntityName === 'MJ: Tasks') {
|
|
335
|
+
return {
|
|
336
|
+
Success: true,
|
|
337
|
+
Results: [
|
|
338
|
+
{
|
|
339
|
+
ID: 't1',
|
|
340
|
+
Name: 'Generate Schema Count Query',
|
|
341
|
+
OutputPayload: JSON.stringify({
|
|
342
|
+
title: 'Entity Counts by Schema',
|
|
343
|
+
request: 'SELECT SchemaName, COUNT(*) AS EntityCount FROM __mj.vwEntities GROUP BY SchemaName',
|
|
344
|
+
}),
|
|
345
|
+
},
|
|
346
|
+
],
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
return { Success: false, Results: [] };
|
|
350
|
+
}),
|
|
351
|
+
} as never);
|
|
352
|
+
|
|
353
|
+
await forkHarness(null).Reinvoke(
|
|
354
|
+
params({
|
|
355
|
+
Tasks: [
|
|
356
|
+
{ TaskID: 't1', Name: 'Generate Schema Count Query', Status: 'Complete', Summary: 'output available (180 chars)' },
|
|
357
|
+
],
|
|
358
|
+
}),
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
expect(runAgent).toHaveBeenCalledTimes(1);
|
|
362
|
+
const sentContent = runAgent.mock.calls[0][0].conversationMessages[0].content as string;
|
|
363
|
+
expect(sentContent).toContain('Title: Entity Counts by Schema');
|
|
364
|
+
expect(sentContent).toContain('SELECT SchemaName, COUNT(*) AS EntityCount FROM __mj.vwEntities GROUP BY SchemaName');
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it('updates the originating message in-place when no intervening messages were sent (IsLatest = true)', async () => {
|
|
368
|
+
const { RunView } = await import('@memberjunction/core');
|
|
369
|
+
vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
|
|
370
|
+
RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
|
|
371
|
+
if (rvParams.EntityName === 'MJ: Conversation Details') {
|
|
372
|
+
return {
|
|
373
|
+
Success: true,
|
|
374
|
+
Results: [{ ID: 'detail-1' }],
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
return { Success: false, Results: [] };
|
|
378
|
+
}),
|
|
379
|
+
} as never);
|
|
380
|
+
|
|
381
|
+
const originDetail = {
|
|
382
|
+
...detailRow(),
|
|
383
|
+
ID: 'detail-1',
|
|
384
|
+
Message: "Started **Weekly digest** — 2 task(s) running. I'll follow up when it finishes.",
|
|
385
|
+
};
|
|
386
|
+
const createdDetails: Array<ReturnType<typeof detailRow>> = [];
|
|
387
|
+
const provider = {
|
|
388
|
+
GetEntityObject: vi.fn().mockImplementation(async (name: string) => {
|
|
389
|
+
if (name === 'MJ: AI Agent Runs') return { AgentID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
|
|
390
|
+
if (name === 'MJ: AI Agents') return { ID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
|
|
391
|
+
if (createdDetails.length === 0) {
|
|
392
|
+
createdDetails.push(originDetail);
|
|
393
|
+
return originDetail;
|
|
394
|
+
}
|
|
395
|
+
const next = detailRow();
|
|
396
|
+
createdDetails.push(next);
|
|
397
|
+
return next;
|
|
398
|
+
}),
|
|
399
|
+
};
|
|
400
|
+
const pubSub = { publish: vi.fn().mockResolvedValue(undefined) } as unknown as PubSubEngine;
|
|
401
|
+
const deliverer = new TaskGraphContinuationDeliverer(
|
|
402
|
+
{ CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
|
|
403
|
+
{ ID: 'user-1' } as UserInfo,
|
|
404
|
+
pubSub,
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
await deliverer.Reinvoke(params());
|
|
408
|
+
|
|
409
|
+
// Only the originating detail was loaded and updated in-place — no second detail row created!
|
|
410
|
+
expect(createdDetails.length).toBe(1);
|
|
411
|
+
expect(originDetail.NewRecord).not.toHaveBeenCalled();
|
|
412
|
+
expect(originDetail.Message).toBe('Synthesized workflow outcome');
|
|
413
|
+
expect(originDetail.Status).toBe('Complete');
|
|
414
|
+
expect(runAgent.mock.calls[0][0].conversationDetailId).toBe('detail-1');
|
|
415
|
+
expect(runAgent.mock.calls[0][0].inputArtifacts).toEqual([]);
|
|
416
|
+
expect(pubSub.publish).toHaveBeenCalledTimes(1);
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
it('creates a bottom continuation reply with ParentID = originDetailId and updates the origin message note when intervening messages exist (IsLatest = false)', async () => {
|
|
420
|
+
const { RunView } = await import('@memberjunction/core');
|
|
421
|
+
vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
|
|
422
|
+
RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
|
|
423
|
+
if (rvParams.EntityName === 'MJ: Conversation Details') {
|
|
424
|
+
return {
|
|
425
|
+
Success: true,
|
|
426
|
+
Results: [{ ID: 'intervening-user-msg-2' }],
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
return { Success: false, Results: [] };
|
|
430
|
+
}),
|
|
431
|
+
} as never);
|
|
432
|
+
|
|
433
|
+
const originDetail = {
|
|
434
|
+
...detailRow(),
|
|
435
|
+
ID: 'detail-1',
|
|
436
|
+
ParentID: null as string | null,
|
|
437
|
+
Message: "Started **Weekly digest** — 2 task(s) running. I'll follow up when it finishes.",
|
|
438
|
+
};
|
|
439
|
+
const replyDetail = {
|
|
440
|
+
...detailRow(),
|
|
441
|
+
ID: 'bottom-reply-3',
|
|
442
|
+
ParentID: null as string | null,
|
|
443
|
+
};
|
|
444
|
+
let detailCallCount = 0;
|
|
445
|
+
const provider = {
|
|
446
|
+
GetEntityObject: vi.fn().mockImplementation(async (name: string) => {
|
|
447
|
+
if (name === 'MJ: AI Agent Runs') return { AgentID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
|
|
448
|
+
if (name === 'MJ: AI Agents') return { ID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
|
|
449
|
+
detailCallCount++;
|
|
450
|
+
return detailCallCount === 1 ? originDetail : replyDetail;
|
|
451
|
+
}),
|
|
452
|
+
};
|
|
453
|
+
const pubSub = { publish: vi.fn().mockResolvedValue(undefined) } as unknown as PubSubEngine;
|
|
454
|
+
const deliverer = new TaskGraphContinuationDeliverer(
|
|
455
|
+
{ CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
|
|
456
|
+
{ ID: 'user-1' } as UserInfo,
|
|
457
|
+
pubSub,
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
await deliverer.Reinvoke(params());
|
|
461
|
+
|
|
462
|
+
expect(replyDetail.NewRecord).toHaveBeenCalledTimes(1);
|
|
463
|
+
expect(replyDetail.ParentID).toBe('detail-1');
|
|
464
|
+
expect(replyDetail.Message).toBe('Synthesized workflow outcome');
|
|
465
|
+
expect(originDetail.Message).toContain('*(✅ **Weekly digest** completed — synthesized results posted below.)*');
|
|
466
|
+
expect(originDetail.Message).not.toContain("I'll follow up when it finishes");
|
|
467
|
+
expect(pubSub.publish).toHaveBeenCalledTimes(2);
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
it('strips inherited upstream payload keys across DAG steps and extracts nested synthesis and report fields', async () => {
|
|
471
|
+
const { RunView } = await import('@memberjunction/core');
|
|
472
|
+
const step1Payload = {
|
|
473
|
+
queryName: 'Annual Order Counts',
|
|
474
|
+
sql: 'SELECT YEAR(OrderDate) AS OrderYear, COUNT(*) AS OrderCount FROM Orders GROUP BY YEAR(OrderDate)',
|
|
475
|
+
explanation: 'Counts orders grouped by year.',
|
|
476
|
+
};
|
|
477
|
+
const step2Payload = {
|
|
478
|
+
...step1Payload,
|
|
479
|
+
synthesis: {
|
|
480
|
+
executiveSummary: 'Order volume grew 22% YoY between 2022 and 2025.',
|
|
481
|
+
keyFindings: ['2024 peak growth', 'Steady enterprise retention'],
|
|
482
|
+
},
|
|
483
|
+
};
|
|
484
|
+
const step3Payload = {
|
|
485
|
+
...step2Payload,
|
|
486
|
+
report: {
|
|
487
|
+
name: 'Annual Order Trend Executive Report',
|
|
488
|
+
description: 'Board-ready HTML report covering annual order volume and YoY trajectory.',
|
|
489
|
+
html: '<h1>Annual Order Trend</h1><p>Executive overview of multi-year order growth.</p>',
|
|
490
|
+
},
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
|
|
494
|
+
RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
|
|
495
|
+
if (rvParams.EntityName === 'MJ: Tasks') {
|
|
496
|
+
return {
|
|
497
|
+
Success: true,
|
|
498
|
+
Results: [
|
|
499
|
+
{ ID: 't1', Name: 'Step 1: Query', OutputPayload: JSON.stringify(step1Payload) },
|
|
500
|
+
{ ID: 't2', Name: 'Step 2: Strategy', OutputPayload: JSON.stringify(step2Payload) },
|
|
501
|
+
{ ID: 't3', Name: 'Step 3: Report', OutputPayload: JSON.stringify(step3Payload) },
|
|
502
|
+
],
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
return { Success: false, Results: [] };
|
|
506
|
+
}),
|
|
507
|
+
} as never);
|
|
508
|
+
|
|
509
|
+
await forkHarness(null).Reinvoke(
|
|
510
|
+
params({
|
|
511
|
+
Tasks: [
|
|
512
|
+
{ TaskID: 't1', Name: 'Step 1: Query', Status: 'Complete', Summary: 'output available (180 chars)' },
|
|
513
|
+
{ TaskID: 't2', Name: 'Step 2: Strategy', Status: 'Complete', Summary: 'output available (320 chars)' },
|
|
514
|
+
{ TaskID: 't3', Name: 'Step 3: Report', Status: 'Complete', Summary: 'output available (540 chars)' },
|
|
515
|
+
],
|
|
516
|
+
}),
|
|
517
|
+
);
|
|
518
|
+
|
|
519
|
+
const sentContent = runAgent.mock.calls[0][0].conversationMessages[0].content as string;
|
|
520
|
+
expect(sentContent).toContain('Title: Annual Order Counts');
|
|
521
|
+
expect(sentContent).toContain('Executive Summary: Order volume grew 22% YoY between 2022 and 2025.');
|
|
522
|
+
expect(sentContent).toContain('Report Title: Annual Order Trend Executive Report');
|
|
523
|
+
expect(sentContent).toContain('Report Summary: Board-ready HTML report covering annual order volume and YoY trajectory.');
|
|
524
|
+
// Step 1's SQL should only appear once (under Step 1), not duplicated under Step 2 and Step 3!
|
|
525
|
+
const sqlOccurrences = sentContent.split('SELECT YEAR(OrderDate) AS OrderYear').length - 1;
|
|
526
|
+
expect(sqlOccurrences).toBe(1);
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
it('walks up ParentRunID so a sub-agent (Workflow Planner) submission reinvokes the root conversation agent (Sage) as the conversation owner', async () => {
|
|
530
|
+
const subAgentRun = {
|
|
531
|
+
ID: 'subagent-planner-run',
|
|
532
|
+
AgentID: 'workflow-planner-agent-id',
|
|
533
|
+
ParentRunID: 'root-sage-run',
|
|
534
|
+
UserID: null as string | null,
|
|
535
|
+
Load: vi.fn().mockResolvedValue(true),
|
|
536
|
+
};
|
|
537
|
+
const rootSageRun = {
|
|
538
|
+
ID: 'root-sage-run',
|
|
539
|
+
AgentID: 'sage-agent-id',
|
|
540
|
+
ParentRunID: null as string | null,
|
|
541
|
+
UserID: 'owner-user-99',
|
|
542
|
+
Load: vi.fn().mockResolvedValue(true),
|
|
543
|
+
};
|
|
544
|
+
const sageAgent = {
|
|
545
|
+
ID: 'sage-agent-id',
|
|
546
|
+
Name: 'Sage',
|
|
547
|
+
Load: vi.fn().mockResolvedValue(true),
|
|
548
|
+
};
|
|
549
|
+
const detail = detailRow();
|
|
550
|
+
let runCallCount = 0;
|
|
551
|
+
const detailUsers: Array<UserInfo | undefined> = [];
|
|
552
|
+
|
|
553
|
+
const provider = {
|
|
554
|
+
GetEntityObject: vi.fn().mockImplementation(async (name: string, user?: UserInfo) => {
|
|
555
|
+
if (name === 'MJ: AI Agent Runs') {
|
|
556
|
+
runCallCount++;
|
|
557
|
+
return runCallCount === 1 ? subAgentRun : rootSageRun;
|
|
558
|
+
}
|
|
559
|
+
if (name === 'MJ: AI Agents') {
|
|
560
|
+
return sageAgent;
|
|
561
|
+
}
|
|
562
|
+
detailUsers.push(user);
|
|
563
|
+
return detail;
|
|
564
|
+
}),
|
|
565
|
+
};
|
|
566
|
+
|
|
567
|
+
const deliverer = new TaskGraphContinuationDeliverer(
|
|
568
|
+
{ CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
|
|
569
|
+
{ ID: 'system-user' } as UserInfo,
|
|
570
|
+
);
|
|
571
|
+
|
|
572
|
+
await deliverer.Reinvoke(params({ SubmittedByAgentRunID: 'subagent-planner-run' }));
|
|
573
|
+
|
|
574
|
+
expect(subAgentRun.Load).toHaveBeenCalledWith('subagent-planner-run');
|
|
575
|
+
expect(rootSageRun.Load).toHaveBeenCalledWith('root-sage-run');
|
|
576
|
+
expect(sageAgent.Load).toHaveBeenCalledWith('sage-agent-id');
|
|
577
|
+
expect(runAgent).toHaveBeenCalledTimes(1);
|
|
578
|
+
expect(runAgent.mock.calls[0][0].agent.ID).toBe('sage-agent-id');
|
|
579
|
+
expect(runAgent.mock.calls[0][0].contextUser.ID).toBe('owner-user-99');
|
|
580
|
+
expect(detailUsers[0]?.ID).toBe('owner-user-99');
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
it('enriches Skipped steps with their unmet dependency Condition from MJ: Task Dependencies', async () => {
|
|
584
|
+
const { RunView } = await import('@memberjunction/core');
|
|
585
|
+
vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
|
|
586
|
+
RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
|
|
587
|
+
if (rvParams.EntityName === 'MJ: Tasks') {
|
|
588
|
+
return {
|
|
589
|
+
Success: true,
|
|
590
|
+
Results: [
|
|
591
|
+
{ ID: 't1', Name: 'Build Query', Status: 'Complete', OutputPayload: JSON.stringify({ queryName: 'Users by Role' }) },
|
|
592
|
+
{ ID: 't2', Name: 'Run Query', Status: 'Complete', OutputPayload: JSON.stringify({ summary: 'Built query blueprint without live execution' }) },
|
|
593
|
+
{ ID: 't3', Name: 'Analyze Results', Status: 'Skipped', OutputPayload: null },
|
|
594
|
+
],
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
if (rvParams.EntityName === 'MJ: Task Dependencies') {
|
|
598
|
+
return {
|
|
599
|
+
Success: true,
|
|
600
|
+
Results: [
|
|
601
|
+
{
|
|
602
|
+
TaskID: 't3',
|
|
603
|
+
DependsOnTaskID: 't2',
|
|
604
|
+
Condition: 'output.rowCount > 0',
|
|
605
|
+
},
|
|
606
|
+
],
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
return { Success: false, Results: [] };
|
|
610
|
+
}),
|
|
611
|
+
} as never);
|
|
612
|
+
|
|
613
|
+
await forkHarness(null).Reinvoke(
|
|
614
|
+
params({
|
|
615
|
+
Tasks: [
|
|
616
|
+
{ TaskID: 't1', Name: 'Build Query', Status: 'Complete' },
|
|
617
|
+
{ TaskID: 't2', Name: 'Run Query', Status: 'Complete' },
|
|
618
|
+
{ TaskID: 't3', Name: 'Analyze Results', Status: 'Skipped' },
|
|
619
|
+
],
|
|
620
|
+
Summary: '2 of 3 steps completed (1 skipped).',
|
|
621
|
+
}),
|
|
622
|
+
);
|
|
623
|
+
|
|
624
|
+
const sentContent = runAgent.mock.calls[0][0].conversationMessages[0].content as string;
|
|
625
|
+
expect(sentContent).toContain('- ⏭️ **Analyze Results** — Skipped: branch condition `output.rowCount > 0` on "Run Query" evaluated to false');
|
|
626
|
+
expect(sentContent).toContain('briefly explaining any conditional steps that were skipped');
|
|
627
|
+
});
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
|
|
@@ -133,4 +133,26 @@ describe('TaskGraphFrameBroadcaster', () => {
|
|
|
133
133
|
expect(p.CompletedCount).toBe(7);
|
|
134
134
|
expect(p.TotalCount).toBe(7);
|
|
135
135
|
});
|
|
136
|
+
|
|
137
|
+
it('bridges frames onto PUSH_STATUS_UPDATES_TOPIC when bridgeToPushStatus is enabled', () => {
|
|
138
|
+
new TaskGraphFrameBroadcaster(pubSub, true).OnFrame(
|
|
139
|
+
frame({ Kind: 'TaskCompleted', Status: 'Complete', CompletedCount: 1, TotalCount: 2 }),
|
|
140
|
+
);
|
|
141
|
+
expect(published).toHaveLength(2);
|
|
142
|
+
expect(published[0][0]).toBe(TASK_GRAPH_FRAMES_TOPIC);
|
|
143
|
+
expect(published[1][0]).toBe('PUSH_STATUS_UPDATES');
|
|
144
|
+
const pushPayload = published[1][1] as { sessionId: string; ownerUserId: string; message: string };
|
|
145
|
+
expect(pushPayload.sessionId).toBe('*');
|
|
146
|
+
expect(pushPayload.ownerUserId).toBe(OWNER);
|
|
147
|
+
const parsed = JSON.parse(pushPayload.message) as {
|
|
148
|
+
type: string;
|
|
149
|
+
status: string;
|
|
150
|
+
data: { Status: string; TaskID: string };
|
|
151
|
+
};
|
|
152
|
+
expect(parsed.type).toBe('TaskGraphFrame');
|
|
153
|
+
expect(parsed.status).toBe('ok');
|
|
154
|
+
expect(parsed.data.Status).toBe('Complete');
|
|
155
|
+
expect(parsed.data.TaskID).toBe('task-1');
|
|
156
|
+
});
|
|
136
157
|
});
|
|
158
|
+
|