@memberjunction/server 6.2.0-edge.3 → 6.2.0-edge.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/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 +173 -25
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +452 -54
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +43 -2
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +99 -8
- 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/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.map +1 -1
- package/dist/auth/index.js +3 -10
- package/dist/auth/index.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 +2378 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +123 -0
- 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/generated/graphql-schemas/__mj.d.ts +135 -0
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +706 -0
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +20 -4
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +39 -10
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +4 -0
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -131
- 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/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 +138 -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 +98 -0
- package/dist/realtimeSessions/RealtimeVerifyRouter.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 +17 -0
- package/dist/realtimeSessions/index.d.ts.map +1 -0
- package/dist/realtimeSessions/index.js +17 -0
- package/dist/realtimeSessions/index.js.map +1 -0
- package/dist/realtimeSessions/sessionAccess.d.ts +86 -0
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
- package/dist/realtimeSessions/sessionAccess.js +90 -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/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/FetchEntityVectorsResolver.d.ts +12 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +83 -2
- package/dist/resolvers/FetchEntityVectorsResolver.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/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +9 -4
- package/dist/resolvers/MCPResolver.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 +155 -25
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +394 -90
- 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 +68 -11
- 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/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/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/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/services/TaskGraphContinuationDeliverer.d.ts +4 -3
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +13 -7
- 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 +276 -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 +97 -95
- 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__/FetchEntityVectorsResolver.test.ts +285 -0
- package/src/__tests__/HostInstance.test.ts +84 -0
- package/src/__tests__/HumanHandoffResolver.test.ts +17 -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__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
- package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +6 -3
- package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +169 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +4 -4
- 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__/SessionJanitor.test.ts +845 -18
- package/src/__tests__/SessionManager.test.ts +213 -17
- package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
- package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +50 -3
- package/src/__tests__/UserAvatarResolver.test.ts +255 -0
- package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
- package/src/__tests__/actionAuthorization.test.ts +130 -0
- package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
- package/src/__tests__/avatarInputValidation.test.ts +160 -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__/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__/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__/serverExtensionReservedRoots.test.ts +2 -0
- package/src/__tests__/sharedCache.test.ts +310 -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 +543 -57
- package/src/agentSessions/SessionManager.ts +125 -25
- package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
- package/src/agentSessions/index.ts +10 -3
- package/src/auth/actionAuthorization.ts +116 -0
- package/src/auth/index.ts +3 -8
- package/src/auth/magicLink/MagicLinkService.ts +6 -3
- package/src/auth/newUsers.ts +99 -11
- package/src/config.ts +125 -0
- package/src/context.ts +15 -10
- package/src/generated/graphql-schemas/__mj.ts +496 -1
- package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
- package/src/generic/ResolverBase.ts +39 -9
- package/src/generic/RunViewResolver.ts +4 -0
- package/src/index.ts +132 -143
- package/src/isolatedProvider.ts +22 -0
- 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 +167 -0
- package/src/realtimeSessions/RealtimeVerifyRouter.ts +108 -0
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
- package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
- package/src/realtimeSessions/index.ts +16 -0
- package/src/realtimeSessions/sessionAccess.ts +141 -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/CacheStatsResolver.ts +89 -2
- package/src/resolvers/ClientToolRequestResolver.ts +25 -7
- package/src/resolvers/FetchEntityVectorsResolver.ts +97 -2
- package/src/resolvers/HumanHandoffResolver.ts +8 -0
- package/src/resolvers/MCPResolver.ts +8 -5
- package/src/resolvers/RealtimeBridgeResolver.ts +163 -11
- package/src/resolvers/RealtimeClientSessionResolver.ts +501 -96
- 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 +78 -11
- package/src/resolvers/RunTemplateResolver.ts +13 -12
- package/src/resolvers/SyncDataResolver.ts +6 -2
- package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
- package/src/resolvers/UserAvatarResolver.ts +111 -0
- package/src/resolvers/UserResolver.ts +2 -16
- 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/services/TaskGraphContinuationDeliverer.ts +13 -7
- package/src/sharedCache.ts +302 -0
- package/src/types.ts +7 -0
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A realtime session's `Config` JSON is writable by the session owner: the UI and Widget Guest
|
|
3
|
+
* roles hold Create/Update on `MJ: AI Agent Sessions`, row-scoped only to their own sessions. These
|
|
4
|
+
* tests edit `Config` the way such an owner could and check that the relay mutations do not take
|
|
5
|
+
* authority from it: the target agent is re-authorized for the caller, direct actions are not read
|
|
6
|
+
* from it, and run ids are used only when they are records of the session. They also check that
|
|
7
|
+
* scope-limited callers get no direct actions, because a scoped anonymous caller's relay runs as the
|
|
8
|
+
* system user.
|
|
9
|
+
*/
|
|
10
|
+
// type-graphql decorators on the resolver need the reflect-metadata polyfill loaded first.
|
|
11
|
+
import 'reflect-metadata';
|
|
12
|
+
|
|
13
|
+
import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest';
|
|
14
|
+
|
|
15
|
+
const hasPermissionMock = vi.fn(async (_agentID: string, _user?: unknown, _permission?: string): Promise<boolean> => true);
|
|
16
|
+
vi.mock('@memberjunction/ai-engine-base', () => ({
|
|
17
|
+
AIAgentPermissionHelper: {
|
|
18
|
+
HasPermission: (agentID: string, user: unknown, permission: string) => hasPermissionMock(agentID, user, permission),
|
|
19
|
+
},
|
|
20
|
+
AIEngineBase: {
|
|
21
|
+
GetProviderInstance: vi.fn(),
|
|
22
|
+
},
|
|
23
|
+
}));
|
|
24
|
+
|
|
25
|
+
vi.mock('@memberjunction/aiengine', () => ({
|
|
26
|
+
AIEngine: {
|
|
27
|
+
Instance: {
|
|
28
|
+
Config: vi.fn(async () => undefined),
|
|
29
|
+
Agents: [],
|
|
30
|
+
AgentTypes: [],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
}));
|
|
34
|
+
|
|
35
|
+
const executeRelayedToolMock = vi.fn();
|
|
36
|
+
const appendPromptRunMessageMock = vi.fn<RealtimeClientSessionService['AppendPromptRunMessage']>(async () => true);
|
|
37
|
+
const accumulatePromptRunUsageMock = vi.fn<RealtimeClientSessionService['AccumulatePromptRunUsage']>(async () => true);
|
|
38
|
+
vi.mock('@memberjunction/ai-agents', async (importOriginal) => {
|
|
39
|
+
const actual = await importOriginal<Record<string, unknown>>();
|
|
40
|
+
return {
|
|
41
|
+
...actual,
|
|
42
|
+
RealtimeClientSessionService: class {
|
|
43
|
+
ExecuteRelayedTool = executeRelayedToolMock;
|
|
44
|
+
AppendPromptRunMessage = appendPromptRunMessageMock;
|
|
45
|
+
AccumulatePromptRunUsage = accumulatePromptRunUsageMock;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const heartbeatMock = vi.fn(async () => true);
|
|
51
|
+
vi.mock('../agentSessions/index.js', () => ({
|
|
52
|
+
SessionManager: class {
|
|
53
|
+
Heartbeat = heartbeatMock;
|
|
54
|
+
},
|
|
55
|
+
}));
|
|
56
|
+
|
|
57
|
+
let currentProvider: unknown;
|
|
58
|
+
vi.mock('../util.js', () => ({
|
|
59
|
+
GetReadWriteProvider: () => currentProvider,
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
const getSystemUserMock = vi.fn<() => UserInfo | undefined>();
|
|
63
|
+
vi.mock('@memberjunction/generic-database-provider', async (importOriginal) => {
|
|
64
|
+
const actual = await importOriginal<Record<string, unknown>>();
|
|
65
|
+
return {
|
|
66
|
+
...actual,
|
|
67
|
+
UserCache: {
|
|
68
|
+
get Instance() {
|
|
69
|
+
return { GetSystemUser: getSystemUserMock };
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
import { RealtimeClientSessionResolver } from '../resolvers/RealtimeClientSessionResolver.js';
|
|
76
|
+
import type { AppContext } from '../types.js';
|
|
77
|
+
import { IsPlatformSQL, type RunViewParams, type RunViewResult, type UserInfo } from '@memberjunction/core';
|
|
78
|
+
import type { ExecuteRelayedToolInput, RealtimeClientSessionService } from '@memberjunction/ai-agents';
|
|
79
|
+
import type { PubSubEngine } from 'type-graphql';
|
|
80
|
+
|
|
81
|
+
const SESSION_ID = 'c3c3c3c3-0000-4000-8000-000000000001';
|
|
82
|
+
const USER_ID = 'c3c3c3c3-0000-4000-8000-000000000002';
|
|
83
|
+
const TARGET_ID = 'c3c3c3c3-0000-4000-8000-000000000003';
|
|
84
|
+
const OTHER_AGENT_ID = 'c3c3c3c3-0000-4000-8000-000000000004';
|
|
85
|
+
const CO_RUN_ID = 'c3c3c3c3-0000-4000-8000-000000000005';
|
|
86
|
+
const PROMPT_RUN_ID = 'c3c3c3c3-0000-4000-8000-000000000006';
|
|
87
|
+
const STEP_ID = 'c3c3c3c3-0000-4000-8000-000000000007';
|
|
88
|
+
const PAUSED_RUN_ID = 'c3c3c3c3-0000-4000-8000-000000000008';
|
|
89
|
+
/** A run that exists, but belongs to someone else's session. */
|
|
90
|
+
const FOREIGN_RUN_ID = 'c3c3c3c3-0000-4000-8000-0000000000f1';
|
|
91
|
+
/** Harmless text that is not a UUID and would change the meaning of a quoted filter. */
|
|
92
|
+
const NOT_A_UUID = "x' OR '1'='1";
|
|
93
|
+
|
|
94
|
+
const USER = { ID: USER_ID, Email: 'owner@example.com' };
|
|
95
|
+
|
|
96
|
+
interface FakeEntity {
|
|
97
|
+
[key: string]: unknown;
|
|
98
|
+
Save: () => Promise<boolean>;
|
|
99
|
+
Load: (id: string) => Promise<boolean>;
|
|
100
|
+
NewRecord: () => void;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Rows the fake RunView returns, keyed by entity name. */
|
|
104
|
+
type FakeRows = Record<string, Array<Record<string, unknown>>>;
|
|
105
|
+
|
|
106
|
+
/** The fake provider's `RunView`: it returns the rows for the requested entity. */
|
|
107
|
+
type FakeRunView = (params: RunViewParams) => Promise<RunViewResult<Record<string, unknown>>>;
|
|
108
|
+
|
|
109
|
+
function makeSession(config: Record<string, unknown>, overrides: Partial<FakeEntity> = {}): FakeEntity {
|
|
110
|
+
return {
|
|
111
|
+
ID: SESSION_ID,
|
|
112
|
+
Status: 'Active',
|
|
113
|
+
UserID: USER_ID,
|
|
114
|
+
ConversationID: 'c3c3c3c3-0000-4000-8000-0000000000c1',
|
|
115
|
+
Config_: JSON.stringify(config),
|
|
116
|
+
Save: vi.fn(async () => true),
|
|
117
|
+
Load: vi.fn(async () => true),
|
|
118
|
+
NewRecord: vi.fn(),
|
|
119
|
+
LatestResult: null,
|
|
120
|
+
...overrides,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function makeDetail(): FakeEntity {
|
|
125
|
+
return { ID: 'c3c3c3c3-0000-4000-8000-0000000000d1', Save: vi.fn(async () => true), Load: vi.fn(async () => true), NewRecord: vi.fn() };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** A provider serving the session plus view rows per entity name; `runView` records every view run. */
|
|
129
|
+
function makeProvider(session: FakeEntity, rows: FakeRows = {}): { runView: Mock<FakeRunView> } {
|
|
130
|
+
const runView = vi.fn<FakeRunView>(async (params) => {
|
|
131
|
+
const results = rows[params.EntityName ?? ''] ?? [];
|
|
132
|
+
return { Success: true, Results: results, RowCount: results.length, TotalRowCount: results.length, ExecutionTime: 0, ErrorMessage: '' };
|
|
133
|
+
});
|
|
134
|
+
currentProvider = {
|
|
135
|
+
GetEntityObject: vi.fn(async (name: string) => (name === 'MJ: AI Agent Sessions' ? session : makeDetail())),
|
|
136
|
+
RunView: runView,
|
|
137
|
+
RunViews: vi.fn(async (paramsList: RunViewParams[]) => Promise.all(paramsList.map((params) => runView(params)))),
|
|
138
|
+
};
|
|
139
|
+
return { runView };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Rows that make every run id in `ids` a record of this session. */
|
|
143
|
+
function sessionRuns(...ids: string[]): FakeRows {
|
|
144
|
+
return { 'MJ: AI Agent Runs': ids.map((ID) => ({ ID })) };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function makeResolver(user: object = USER): RealtimeClientSessionResolver {
|
|
148
|
+
const resolver = new RealtimeClientSessionResolver();
|
|
149
|
+
(resolver as unknown as { GetUserFromPayload: () => unknown }).GetUserFromPayload = () => user;
|
|
150
|
+
return resolver;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function makeCtx(): AppContext {
|
|
154
|
+
return { userPayload: { sessionId: 'c3-pubsub-session' }, providers: [] } as unknown as AppContext;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function makePubSub(): PubSubEngine {
|
|
158
|
+
return { publish: vi.fn(async () => undefined) } as unknown as PubSubEngine;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function relay(resolver: RealtimeClientSessionResolver): Promise<string> {
|
|
162
|
+
return relayTool(resolver, 'invoke-target-agent', '{"request":"hi"}');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function relayTool(resolver: RealtimeClientSessionResolver, toolName: string, argsJson = '{}'): Promise<string> {
|
|
166
|
+
return resolver.ExecuteRealtimeSessionTool(SESSION_ID, 'call-1', toolName, argsJson, makeCtx(), makePubSub());
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** A scoped anonymous magic-link caller: the relay runs its work as the system user. */
|
|
170
|
+
const SCOPED_ANONYMOUS = { ID: USER_ID, Email: 'guest@magic-link.local', IsMagicLinkAnonymous: true, MagicLinkScope: { ResourceID: 'c3-scope' } };
|
|
171
|
+
/** A public web-widget guest: anonymous, but not elevated. */
|
|
172
|
+
const WIDGET_GUEST = { ID: USER_ID, Email: 'guest@widget.local', IsMagicLinkAnonymous: true, WidgetGuestContext: { WidgetID: 'c3c3c3c3-0000-4000-8000-0000000000b1' } };
|
|
173
|
+
/** A resource-scoped magic-link session: a normal role pinned to one shared resource. */
|
|
174
|
+
const RESOURCE_SCOPED = { ID: USER_ID, Email: 'invitee@example.com', MagicLinkScope: { ResourceID: 'c3-shared-resource' } };
|
|
175
|
+
const SYSTEM_USER = { ID: 'c3c3c3c3-0000-4000-8000-0000000000aa', Email: 'system@example.com' } as UserInfo;
|
|
176
|
+
|
|
177
|
+
function relayInput(): ExecuteRelayedToolInput {
|
|
178
|
+
return executeRelayedToolMock.mock.calls[0][0] as ExecuteRelayedToolInput;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/** The SQL text of each filter the fake RunView received, with every variant of a platform-specific filter. */
|
|
182
|
+
function issuedFilters(runView: Mock<FakeRunView>): string[] {
|
|
183
|
+
return runView.mock.calls.map(([params]) => {
|
|
184
|
+
const filter = params.ExtraFilter;
|
|
185
|
+
return IsPlatformSQL(filter) ? [filter.default, filter.sqlserver, filter.postgresql].join('\n') : (filter ?? '');
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
beforeEach(() => {
|
|
190
|
+
hasPermissionMock.mockReset();
|
|
191
|
+
hasPermissionMock.mockImplementation(async () => true);
|
|
192
|
+
executeRelayedToolMock.mockReset();
|
|
193
|
+
executeRelayedToolMock.mockResolvedValue({ ResultJson: '{"ok":true}', Success: true });
|
|
194
|
+
appendPromptRunMessageMock.mockReset();
|
|
195
|
+
appendPromptRunMessageMock.mockResolvedValue(true);
|
|
196
|
+
accumulatePromptRunUsageMock.mockReset();
|
|
197
|
+
accumulatePromptRunUsageMock.mockResolvedValue(true);
|
|
198
|
+
heartbeatMock.mockClear();
|
|
199
|
+
getSystemUserMock.mockReset();
|
|
200
|
+
getSystemUserMock.mockReturnValue(undefined);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
describe('ExecuteRealtimeSessionTool — target agent named in Config', () => {
|
|
204
|
+
it('refuses to relay when the caller cannot run the target agent in the session config', async () => {
|
|
205
|
+
hasPermissionMock.mockImplementation(async (agentID: string) => agentID !== OTHER_AGENT_ID);
|
|
206
|
+
makeProvider(makeSession({ targetAgentID: OTHER_AGENT_ID }));
|
|
207
|
+
|
|
208
|
+
await expect(relay(makeResolver())).rejects.toThrow(/not authorized/i);
|
|
209
|
+
expect(executeRelayedToolMock).not.toHaveBeenCalled();
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('refuses before elevating a scoped anonymous caller to the system user', async () => {
|
|
213
|
+
getSystemUserMock.mockReturnValue(SYSTEM_USER);
|
|
214
|
+
hasPermissionMock.mockImplementation(async (agentID: string) => agentID !== OTHER_AGENT_ID);
|
|
215
|
+
makeProvider(makeSession({ targetAgentID: OTHER_AGENT_ID }));
|
|
216
|
+
|
|
217
|
+
await expect(relay(makeResolver(SCOPED_ANONYMOUS))).rejects.toThrow(/not authorized/i);
|
|
218
|
+
expect(executeRelayedToolMock).not.toHaveBeenCalled();
|
|
219
|
+
// CanRun was asked about the caller, never the system user.
|
|
220
|
+
expect(hasPermissionMock).toHaveBeenCalledWith(OTHER_AGENT_ID, SCOPED_ANONYMOUS, 'run');
|
|
221
|
+
expect(hasPermissionMock.mock.calls.every(([, user]) => user === SCOPED_ANONYMOUS)).toBe(true);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it('relays when the caller can run the target agent', async () => {
|
|
225
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID }));
|
|
226
|
+
|
|
227
|
+
await expect(relay(makeResolver())).resolves.toBe('{"ok":true}');
|
|
228
|
+
expect(relayInput().TargetAgentID).toBe(TARGET_ID);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
describe('ExecuteRealtimeSessionTool — direct actions for scope-limited callers', () => {
|
|
233
|
+
function refusal(resultJson: string): { success: boolean; output: string } {
|
|
234
|
+
return JSON.parse(resultJson) as { success: boolean; output: string };
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
it('refuses a direct action from a scoped anonymous caller before elevating it to the system user', async () => {
|
|
238
|
+
getSystemUserMock.mockReturnValue(SYSTEM_USER);
|
|
239
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID }));
|
|
240
|
+
|
|
241
|
+
const result = refusal(await relayTool(makeResolver(SCOPED_ANONYMOUS), 'Get_Record', '{"EntityName":"MJ: Users"}'));
|
|
242
|
+
|
|
243
|
+
expect(result.success).toBe(false);
|
|
244
|
+
expect(result.output).toContain('invoke-target-agent');
|
|
245
|
+
expect(executeRelayedToolMock).not.toHaveBeenCalled();
|
|
246
|
+
// The refusal is decided on the caller: the system user was never even looked up.
|
|
247
|
+
expect(getSystemUserMock).not.toHaveBeenCalled();
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it('refuses a direct action from a public web-widget guest', async () => {
|
|
251
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID }));
|
|
252
|
+
|
|
253
|
+
const result = refusal(await relayTool(makeResolver(WIDGET_GUEST), 'Get_Record'));
|
|
254
|
+
|
|
255
|
+
expect(result.success).toBe(false);
|
|
256
|
+
expect(executeRelayedToolMock).not.toHaveBeenCalled();
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it('refuses a direct action from a resource-scoped magic-link session', async () => {
|
|
260
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID }));
|
|
261
|
+
|
|
262
|
+
const result = refusal(await relayTool(makeResolver(RESOURCE_SCOPED), 'Get_Record'));
|
|
263
|
+
|
|
264
|
+
expect(result.success).toBe(false);
|
|
265
|
+
expect(executeRelayedToolMock).not.toHaveBeenCalled();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
it('still delegates invoke-target-agent for a scoped anonymous caller', async () => {
|
|
269
|
+
getSystemUserMock.mockReturnValue(SYSTEM_USER);
|
|
270
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID }));
|
|
271
|
+
|
|
272
|
+
await expect(relay(makeResolver(SCOPED_ANONYMOUS))).resolves.toBe('{"ok":true}');
|
|
273
|
+
expect(executeRelayedToolMock).toHaveBeenCalledTimes(1);
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it('still relays a direct action for a caller that is not scope-limited', async () => {
|
|
277
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID }));
|
|
278
|
+
|
|
279
|
+
await expect(relayTool(makeResolver(), 'Get_Record')).resolves.toBe('{"ok":true}');
|
|
280
|
+
expect(executeRelayedToolMock).toHaveBeenCalledTimes(1);
|
|
281
|
+
expect(executeRelayedToolMock.mock.calls[0][1]).toBe(USER);
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
describe('ExecuteRealtimeSessionTool — directActions in Config', () => {
|
|
286
|
+
it('does not hand the directActions stored in the session config to the relay', async () => {
|
|
287
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID, directActions: { enabled: true, actionNames: ['*'] } }));
|
|
288
|
+
|
|
289
|
+
await relay(makeResolver());
|
|
290
|
+
|
|
291
|
+
expect(relayInput().DirectActions).toBeUndefined();
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
describe('ExecuteRealtimeSessionTool — run ids in Config', () => {
|
|
296
|
+
it('drops run ids that are not UUIDs, and never puts them in a filter', async () => {
|
|
297
|
+
const { runView } = makeProvider(makeSession({ targetAgentID: TARGET_ID, coAgentRunID: NOT_A_UUID, pendingFeedbackRunID: NOT_A_UUID }));
|
|
298
|
+
|
|
299
|
+
await relay(makeResolver());
|
|
300
|
+
|
|
301
|
+
expect(relayInput().ParentRunID).toBeUndefined();
|
|
302
|
+
expect(relayInput().ResumeRunID).toBeUndefined();
|
|
303
|
+
expect(issuedFilters(runView).filter((f) => f.includes(NOT_A_UUID))).toEqual([]);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it('drops run ids that are not records of this session', async () => {
|
|
307
|
+
const { runView } = makeProvider(
|
|
308
|
+
makeSession({ targetAgentID: TARGET_ID, coAgentRunID: FOREIGN_RUN_ID, pendingFeedbackRunID: FOREIGN_RUN_ID }),
|
|
309
|
+
);
|
|
310
|
+
|
|
311
|
+
await relay(makeResolver());
|
|
312
|
+
|
|
313
|
+
expect(relayInput().ParentRunID).toBeUndefined();
|
|
314
|
+
expect(relayInput().ResumeRunID).toBeUndefined();
|
|
315
|
+
expect(issuedFilters(runView).some((f) => f.includes(`AgentSessionID='${SESSION_ID}'`))).toBe(true);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
it('passes run ids that are records of this session', async () => {
|
|
319
|
+
makeProvider(
|
|
320
|
+
makeSession({ targetAgentID: TARGET_ID, coAgentRunID: CO_RUN_ID, pendingFeedbackRunID: PAUSED_RUN_ID }),
|
|
321
|
+
sessionRuns(CO_RUN_ID, PAUSED_RUN_ID),
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
await relay(makeResolver());
|
|
325
|
+
|
|
326
|
+
expect(relayInput().ParentRunID).toBe(CO_RUN_ID);
|
|
327
|
+
expect(relayInput().ResumeRunID).toBe(PAUSED_RUN_ID);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it('stops passing run ids that stopped being records of this session since the last relay', async () => {
|
|
331
|
+
const rows = sessionRuns(CO_RUN_ID, PAUSED_RUN_ID);
|
|
332
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID, coAgentRunID: CO_RUN_ID, pendingFeedbackRunID: PAUSED_RUN_ID }), rows);
|
|
333
|
+
// The delegated run pauses again, so the session config still names it on the next relay.
|
|
334
|
+
executeRelayedToolMock.mockResolvedValue({ ResultJson: '{"ok":true}', Success: true, PausedRunID: PAUSED_RUN_ID });
|
|
335
|
+
const resolver = makeResolver();
|
|
336
|
+
|
|
337
|
+
await relay(resolver);
|
|
338
|
+
// Both runs are moved to another session between the relays.
|
|
339
|
+
rows['MJ: AI Agent Runs'] = [];
|
|
340
|
+
await relay(resolver);
|
|
341
|
+
|
|
342
|
+
const [first, second] = executeRelayedToolMock.mock.calls.map(([input]) => input as ExecuteRelayedToolInput);
|
|
343
|
+
expect(first.ParentRunID).toBe(CO_RUN_ID);
|
|
344
|
+
expect(first.ResumeRunID).toBe(PAUSED_RUN_ID);
|
|
345
|
+
expect(second.ParentRunID).toBeUndefined();
|
|
346
|
+
expect(second.ResumeRunID).toBeUndefined();
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
describe('prompt-run mirrors — promptRunID in Config', () => {
|
|
351
|
+
const PROMPT_STEP_ROWS: FakeRows = {
|
|
352
|
+
...sessionRuns(CO_RUN_ID),
|
|
353
|
+
'MJ: AI Agent Run Steps': [{ ID: STEP_ID, StepType: 'Prompt', TargetLogID: PROMPT_RUN_ID }],
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
it('RelayRealtimeUsage does not write to a prompt run that is not this session\'s', async () => {
|
|
357
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID, coAgentRunID: CO_RUN_ID, promptRunID: FOREIGN_RUN_ID }), sessionRuns(CO_RUN_ID));
|
|
358
|
+
|
|
359
|
+
const out = await makeResolver().RelayRealtimeUsage(SESSION_ID, 10, 5, makeCtx());
|
|
360
|
+
|
|
361
|
+
expect(out).toBe(false);
|
|
362
|
+
expect(accumulatePromptRunUsageMock).not.toHaveBeenCalled();
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('RelayRealtimeTranscript does not append to a prompt run that is not this session\'s', async () => {
|
|
366
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID, coAgentRunID: CO_RUN_ID, promptRunID: FOREIGN_RUN_ID }), sessionRuns(CO_RUN_ID));
|
|
367
|
+
|
|
368
|
+
const out = await makeResolver().RelayRealtimeTranscript(SESSION_ID, 'User', 'hello', makeCtx());
|
|
369
|
+
|
|
370
|
+
expect(out).toBe(true);
|
|
371
|
+
expect(appendPromptRunMessageMock).not.toHaveBeenCalled();
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
it('RelayRealtimeUsage writes to the prompt run of this session\'s co-agent run', async () => {
|
|
375
|
+
makeProvider(makeSession({ targetAgentID: TARGET_ID, coAgentRunID: CO_RUN_ID, promptRunID: PROMPT_RUN_ID }), PROMPT_STEP_ROWS);
|
|
376
|
+
|
|
377
|
+
const out = await makeResolver().RelayRealtimeUsage(SESSION_ID, 10, 5, makeCtx());
|
|
378
|
+
|
|
379
|
+
expect(out).toBe(true);
|
|
380
|
+
expect(accumulatePromptRunUsageMock).toHaveBeenCalledTimes(1);
|
|
381
|
+
expect(accumulatePromptRunUsageMock.mock.calls[0][0]).toBe(PROMPT_RUN_ID);
|
|
382
|
+
});
|
|
383
|
+
});
|