@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserResolver.js","sourceRoot":"","sources":["../../src/resolvers/UserResolver.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAc,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAwB,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC7H,OAAO,EAAqB,OAAO,EAAY,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B;;;;;GAKG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,OAAO;CAG3C,CAAA;AADC;IADC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;;8CACN;AAFV,eAAe;IAD3B,UAAU,EAAE;GACA,eAAe,CAG3B;;AAaM,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,kBAAkB;IAG5C,AAAN,KAAK,CAAC,WAAW,CAAQ,OAAmB;QAC1C,MAAM,IAAI,CAAC,6BAA6B,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAEhF,IAAI,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC;YAClD,MAAM,QAAQ,GAAG
|
|
1
|
+
{"version":3,"file":"UserResolver.js","sourceRoot":"","sources":["../../src/resolvers/UserResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { UserPayload } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The API-key scope (`MJ: API Scopes.FullPath`) that makes an `mj_sk_*` key a trusted integration for reserved run
|
|
4
|
+
* data. Checked against the agent being run, so a key can be trusted for some agents only. `full_access` does not
|
|
5
|
+
* imply it: the key must hold this scope itself.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TRUSTED_RUN_DATA_SCOPE = "agent:trusted";
|
|
8
|
+
/** Who sent a run's `data`, as far as {@link IsTrustedAgentRunCaller} needs to know. */
|
|
9
|
+
export interface ClientAgentRunCaller {
|
|
10
|
+
/**
|
|
11
|
+
* The request's authenticated payload, BEFORE any widget-guest elevation. `isSystemUser` is set only by
|
|
12
|
+
* the system API key (and by widget elevation, which {@link IsWidgetGuestRun} overrides); `apiKeyHash`
|
|
13
|
+
* only by an `mj_sk_*` user API key.
|
|
14
|
+
*/
|
|
15
|
+
UserPayload: Pick<UserPayload, 'email' | 'isSystemUser' | 'apiKeyHash'>;
|
|
16
|
+
/** True when the run executes under the widget-guest elevated principal. Such a run is never trusted. */
|
|
17
|
+
IsWidgetGuestRun: boolean;
|
|
18
|
+
/** The agent the caller asked to run: the resource the {@link TRUSTED_RUN_DATA_SCOPE} check is made against. */
|
|
19
|
+
AgentID: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Whether a caller may set the reserved run-data keys — the value the agent-run resolvers pass as
|
|
23
|
+
* `ExecuteAgentParams.TrustReservedRunData`: the system user, or an API key that holds
|
|
24
|
+
* {@link TRUSTED_RUN_DATA_SCOPE} for this agent, and never a widget-guest run, whatever principal it was elevated to.
|
|
25
|
+
* A key without the scope is treated like the browser session of the user it belongs to.
|
|
26
|
+
*
|
|
27
|
+
* @param caller - Who sent the run's `data`.
|
|
28
|
+
* @returns `true` when the run may read the reserved keys from `data`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function IsTrustedAgentRunCaller(caller: ClientAgentRunCaller): Promise<boolean>;
|
|
31
|
+
//# sourceMappingURL=agent-run-data-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-run-data-guard.d.ts","sourceRoot":"","sources":["../../src/resolvers/agent-run-data-guard.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AAEtD,wFAAwF;AACxF,MAAM,WAAW,oBAAoB;IACjC;;;;OAIG;IACH,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,cAAc,GAAG,YAAY,CAAC,CAAC;IACxE,yGAAyG;IACzG,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gHAAgH;IAChH,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAS5F"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Decides which callers of the agent-run resolvers may set a run's scope or agent-type parameters
|
|
3
|
+
* through the free-form `data` argument.
|
|
4
|
+
*
|
|
5
|
+
* `BaseAgent` and `AgentRunner` read a few `ExecuteAgentParams.data` keys (`RESERVED_AGENT_RUN_DATA_KEYS` in
|
|
6
|
+
* `@memberjunction/ai-core-plus`) as fallbacks that change what a run is, not just what its prompt says:
|
|
7
|
+
* - `PrimaryScopeEntityName`, `PrimaryScopeRecordID`, `SecondaryScopes` decide the run's scope: which
|
|
8
|
+
* notes and examples memory is injected, the pre-execution RAG search context, the scoped prompt parts
|
|
9
|
+
* and run settings, the scope columns written on the `MJ: AI Agent Runs` row, and what sub-agents
|
|
10
|
+
* inherit. On a widget-guest run an explicit scope also beats the returning-visitor scope.
|
|
11
|
+
* - `__agentTypePromptParams` is the highest-precedence agent-type parameter layer. It can turn on the
|
|
12
|
+
* Loop type's `enableTaskGraphs` capability, and switch decisions on or off.
|
|
13
|
+
*
|
|
14
|
+
* The rule lives with the run, not here: `BaseAgent.Execute` drops those keys from every run's `data` unless the
|
|
15
|
+
* params set `ExecuteAgentParams.TrustReservedRunData`. The resolvers set that marker for the callers
|
|
16
|
+
* {@link IsTrustedAgentRunCaller} accepts — the system user, and an `mj_sk_*` API key that holds the
|
|
17
|
+
* {@link TRUSTED_RUN_DATA_SCOPE} scope — and never for a browser or a widget guest. Any user who may create API
|
|
18
|
+
* keys can mint one for themselves, so a key alone is not enough: an administrator grants the scope. Explorer never
|
|
19
|
+
* sends these keys. Everything else in `data` (template data, `conversationId`, `appContext`, `clientTools`, ...)
|
|
20
|
+
* reaches the run unchanged either way.
|
|
21
|
+
*
|
|
22
|
+
* @module @memberjunction/server/resolvers
|
|
23
|
+
*/
|
|
24
|
+
import { LogError } from '@memberjunction/core';
|
|
25
|
+
import { GetAPIKeyEngine } from '@memberjunction/api-keys';
|
|
26
|
+
import { UserCache } from '@memberjunction/generic-database-provider';
|
|
27
|
+
/**
|
|
28
|
+
* The API-key scope (`MJ: API Scopes.FullPath`) that makes an `mj_sk_*` key a trusted integration for reserved run
|
|
29
|
+
* data. Checked against the agent being run, so a key can be trusted for some agents only. `full_access` does not
|
|
30
|
+
* imply it: the key must hold this scope itself.
|
|
31
|
+
*/
|
|
32
|
+
export const TRUSTED_RUN_DATA_SCOPE = 'agent:trusted';
|
|
33
|
+
/**
|
|
34
|
+
* Whether a caller may set the reserved run-data keys — the value the agent-run resolvers pass as
|
|
35
|
+
* `ExecuteAgentParams.TrustReservedRunData`: the system user, or an API key that holds
|
|
36
|
+
* {@link TRUSTED_RUN_DATA_SCOPE} for this agent, and never a widget-guest run, whatever principal it was elevated to.
|
|
37
|
+
* A key without the scope is treated like the browser session of the user it belongs to.
|
|
38
|
+
*
|
|
39
|
+
* @param caller - Who sent the run's `data`.
|
|
40
|
+
* @returns `true` when the run may read the reserved keys from `data`.
|
|
41
|
+
*/
|
|
42
|
+
export async function IsTrustedAgentRunCaller(caller) {
|
|
43
|
+
if (caller.IsWidgetGuestRun) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (caller.UserPayload.isSystemUser === true) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
const apiKeyHash = caller.UserPayload.apiKeyHash;
|
|
50
|
+
return apiKeyHash ? keyHoldsTrustedRunDataScope(apiKeyHash, caller.AgentID) : false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Whether the key explicitly holds {@link TRUSTED_RUN_DATA_SCOPE} for the agent. A key-level rule must match: an
|
|
54
|
+
* allow that comes from scope enforcement being switched off, or from `defaultBehaviorNoScopes: 'allow'`, matches
|
|
55
|
+
* no rule and does not count. Any failure counts as not held.
|
|
56
|
+
*/
|
|
57
|
+
async function keyHoldsTrustedRunDataScope(apiKeyHash, agentID) {
|
|
58
|
+
try {
|
|
59
|
+
const systemUser = UserCache.Instance.GetSystemUser();
|
|
60
|
+
if (!systemUser) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// A probe, not an access decision (the run goes ahead either way), so it is not written to the usage log.
|
|
64
|
+
const result = await GetAPIKeyEngine().Authorize(apiKeyHash, 'MJAPI', TRUSTED_RUN_DATA_SCOPE, agentID, systemUser, { endpoint: '/graphql', method: 'POST' }, { skipLogging: true });
|
|
65
|
+
return result.Allowed && result.MatchedKeyRule != null;
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
LogError(`IsTrustedAgentRunCaller: the ${TRUSTED_RUN_DATA_SCOPE} check failed; the run is not trusted: ${e}`);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=agent-run-data-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-run-data-guard.js","sourceRoot":"","sources":["../../src/resolvers/agent-run-data-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAGtE;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,eAAe,CAAC;AAgBtD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAA4B;IACtE,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,CAAC,WAAW,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC;IACjD,OAAO,UAAU,CAAC,CAAC,CAAC,2BAA2B,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACxF,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,2BAA2B,CAAC,UAAkB,EAAE,OAAe;IAC1E,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QACtD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,0GAA0G;QAC1G,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,UAAU,EAC7G,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC;IAC3D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,QAAQ,CAAC,gCAAgC,sBAAsB,0CAA0C,CAAC,EAAE,CAAC,CAAC;QAC9G,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The audit trail for agent-vision consent: one `MJ: Audit Logs` row each time a person allows, or stops
|
|
3
|
+
* letting, agents see their camera and shared screen in a meeting room, including when LiveKit refuses the change.
|
|
4
|
+
*
|
|
5
|
+
* The row is saved by the system user, as MJ's other server-written audit rows are, because the person may not be
|
|
6
|
+
* allowed to create audit rows themselves; `UserID` and `RecordID` are the person. When the audit log type has not
|
|
7
|
+
* been seeded, the entry goes to the server log instead, so a choice is never left unrecorded.
|
|
8
|
+
*
|
|
9
|
+
* Invoked from `RealtimeBridgeResolver.SetLiveKitAgentVision`.
|
|
10
|
+
*
|
|
11
|
+
* @module @memberjunction/server
|
|
12
|
+
*/
|
|
13
|
+
import { type IMetadataProvider, type UserInfo } from '@memberjunction/core';
|
|
14
|
+
/** The seeded audit log type (see `metadata/audit-log-types/.realtime-session-audit-types.json`). */
|
|
15
|
+
export declare const REALTIME_AGENT_VISION_CONSENT_AUDIT_TYPE = "Realtime Agent Vision Consent";
|
|
16
|
+
/** One consent change to record. */
|
|
17
|
+
export interface AgentVisionConsentEntry {
|
|
18
|
+
/** The person who chose. */
|
|
19
|
+
User: UserInfo;
|
|
20
|
+
/** The room they chose for. */
|
|
21
|
+
RoomName: string;
|
|
22
|
+
/** `true` to let agents see their camera and shared screen, `false` to stop. */
|
|
23
|
+
Allow: boolean;
|
|
24
|
+
/** Whether LiveKit applied the change. */
|
|
25
|
+
Applied: boolean;
|
|
26
|
+
/** Why it was not applied. */
|
|
27
|
+
ErrorMessage?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Writes the audit row for one consent change. Never throws: a failure to audit is logged, and the person's choice
|
|
31
|
+
* stands as LiveKit applied it.
|
|
32
|
+
*
|
|
33
|
+
* @param entry The change to record.
|
|
34
|
+
* @param provider The request's provider.
|
|
35
|
+
*/
|
|
36
|
+
export declare function WriteAgentVisionConsentAudit(entry: AgentVisionConsentEntry, provider: IMetadataProvider | null): Promise<void>;
|
|
37
|
+
//# sourceMappingURL=agentVisionConsentAudit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentVisionConsentAudit.d.ts","sourceRoot":"","sources":["../../src/resolvers/agentVisionConsentAudit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAY,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAIvF,qGAAqG;AACrG,eAAO,MAAM,wCAAwC,kCAAkC,CAAC;AAKxF,oCAAoC;AACpC,MAAM,WAAW,uBAAuB;IACtC,4BAA4B;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,KAAK,EAAE,OAAO,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBpI"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview The audit trail for agent-vision consent: one `MJ: Audit Logs` row each time a person allows, or stops
|
|
3
|
+
* letting, agents see their camera and shared screen in a meeting room, including when LiveKit refuses the change.
|
|
4
|
+
*
|
|
5
|
+
* The row is saved by the system user, as MJ's other server-written audit rows are, because the person may not be
|
|
6
|
+
* allowed to create audit rows themselves; `UserID` and `RecordID` are the person. When the audit log type has not
|
|
7
|
+
* been seeded, the entry goes to the server log instead, so a choice is never left unrecorded.
|
|
8
|
+
*
|
|
9
|
+
* Invoked from `RealtimeBridgeResolver.SetLiveKitAgentVision`.
|
|
10
|
+
*
|
|
11
|
+
* @module @memberjunction/server
|
|
12
|
+
*/
|
|
13
|
+
import { LogError } from '@memberjunction/core';
|
|
14
|
+
import { UserCache } from '@memberjunction/generic-database-provider';
|
|
15
|
+
/** The seeded audit log type (see `metadata/audit-log-types/.realtime-session-audit-types.json`). */
|
|
16
|
+
export const REALTIME_AGENT_VISION_CONSENT_AUDIT_TYPE = 'Realtime Agent Vision Consent';
|
|
17
|
+
const AUDIT_LOG_ENTITY = 'MJ: Audit Logs';
|
|
18
|
+
const USERS_ENTITY = 'MJ: Users';
|
|
19
|
+
/**
|
|
20
|
+
* Writes the audit row for one consent change. Never throws: a failure to audit is logged, and the person's choice
|
|
21
|
+
* stands as LiveKit applied it.
|
|
22
|
+
*
|
|
23
|
+
* @param entry The change to record.
|
|
24
|
+
* @param provider The request's provider.
|
|
25
|
+
*/
|
|
26
|
+
export async function WriteAgentVisionConsentAudit(entry, provider) {
|
|
27
|
+
try {
|
|
28
|
+
const writer = UserCache.Instance.GetSystemUser();
|
|
29
|
+
const type = provider?.AuditLogTypes?.find((t) => t.Name?.trim().toLowerCase() === REALTIME_AGENT_VISION_CONSENT_AUDIT_TYPE.toLowerCase());
|
|
30
|
+
if (!provider || !writer || !type) {
|
|
31
|
+
LogError(`Agent vision consent not audited (${missingReason(provider, writer)}): user ${entry.User.ID}: ${describeChange(entry)}`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const row = await provider.GetEntityObject(AUDIT_LOG_ENTITY, writer);
|
|
35
|
+
row.NewRecord();
|
|
36
|
+
row.UserID = entry.User.ID;
|
|
37
|
+
row.AuditLogTypeID = type.ID;
|
|
38
|
+
row.Status = entry.Applied ? 'Success' : 'Failed';
|
|
39
|
+
row.EntityID = provider.EntityByName(USERS_ENTITY)?.ID ?? null;
|
|
40
|
+
row.RecordID = entry.User.ID;
|
|
41
|
+
row.Description = describeChange(entry);
|
|
42
|
+
row.Details = JSON.stringify({ roomName: entry.RoomName, allow: entry.Allow, error: entry.ErrorMessage ?? null });
|
|
43
|
+
if (!(await row.Save())) {
|
|
44
|
+
LogError(`Agent vision consent audit row not saved for user ${entry.User.ID}: ${row.LatestResult?.CompleteMessage ?? 'unknown error'}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
LogError(`Agent vision consent audit write threw for user ${entry.User.ID}: ${error instanceof Error ? error.message : String(error)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Why the audit row can't be written: no provider, no system user, or the audit log type isn't seeded. */
|
|
52
|
+
function missingReason(provider, writer) {
|
|
53
|
+
if (!provider) {
|
|
54
|
+
return 'no provider';
|
|
55
|
+
}
|
|
56
|
+
return writer ? `audit log type '${REALTIME_AGENT_VISION_CONSENT_AUDIT_TYPE}' is not seeded` : 'no system user';
|
|
57
|
+
}
|
|
58
|
+
/** One line saying what the person chose, and whether it was applied. */
|
|
59
|
+
function describeChange(entry) {
|
|
60
|
+
const choice = entry.Allow ? 'Let agents see their camera and shared screen' : 'Stopped letting agents see their camera and shared screen';
|
|
61
|
+
return `${choice} in room ${entry.RoomName}${entry.Applied ? '' : ' (not applied)'}.`;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=agentVisionConsentAudit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentVisionConsentAudit.js","sourceRoot":"","sources":["../../src/resolvers/agentVisionConsentAudit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Trust-boundary validation for the self-service avatar mutation
|
|
3
|
+
* (`UpdateMyAvatar` in `UserAvatarResolver`).
|
|
4
|
+
*
|
|
5
|
+
* The browser checks these values too, but its URL check is `new URL(...)`, which happily accepts
|
|
6
|
+
* `javascript:` and every `data:` type. The server is the boundary, so everything that reaches
|
|
7
|
+
* `MJ: Users.UserImageURL` / `UserImageIconClass` through the mutation passes through here first.
|
|
8
|
+
*
|
|
9
|
+
* Pure: no I/O, no provider, no entity — so it is unit-testable on its own.
|
|
10
|
+
*
|
|
11
|
+
* @module @memberjunction/server/resolvers/avatarInputValidation
|
|
12
|
+
*/
|
|
13
|
+
/** Largest DECODED image accepted in a `data:` URI. Matches the Explorer upload cap. */
|
|
14
|
+
export declare const AVATAR_MAX_IMAGE_BYTES: number;
|
|
15
|
+
/** Longest `http:` / `https:` image URL accepted. */
|
|
16
|
+
export declare const AVATAR_MAX_URL_LENGTH = 2048;
|
|
17
|
+
/** Longest icon class string accepted. */
|
|
18
|
+
export declare const AVATAR_MAX_ICON_CLASS_LENGTH = 100;
|
|
19
|
+
/** The outcome of {@link ValidateAvatarInput}. Empty strings are normalised to `null` (clear). */
|
|
20
|
+
export interface AvatarInputValidationResult {
|
|
21
|
+
Valid: boolean;
|
|
22
|
+
/** Why the input was refused. Set only when `Valid` is false. */
|
|
23
|
+
ErrorMessage?: string;
|
|
24
|
+
/** The value to store in `UserImageURL`; `null` clears it. */
|
|
25
|
+
ImageURL: string | null;
|
|
26
|
+
/** The value to store in `UserImageIconClass`; `null` clears it. */
|
|
27
|
+
IconClass: string | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validates a requested avatar. Null or empty values clear the corresponding column, so both
|
|
31
|
+
* null is a valid "revert to default".
|
|
32
|
+
*
|
|
33
|
+
* - `imageURL`: a `data:image/(png|jpeg|jpg|gif|webp);base64,...` URI whose decoded size is at most
|
|
34
|
+
* {@link AVATAR_MAX_IMAGE_BYTES}, or an absolute `http:`/`https:` URL of at most
|
|
35
|
+
* {@link AVATAR_MAX_URL_LENGTH} characters with no whitespace. Everything else is refused.
|
|
36
|
+
* - `iconClass`: at most {@link AVATAR_MAX_ICON_CLASS_LENGTH} characters of `[a-z0-9 -]`,
|
|
37
|
+
* containing at least one `fa-` token.
|
|
38
|
+
*/
|
|
39
|
+
export declare function ValidateAvatarInput(imageURL: string | null | undefined, iconClass: string | null | undefined): AvatarInputValidationResult;
|
|
40
|
+
//# sourceMappingURL=avatarInputValidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatarInputValidation.d.ts","sourceRoot":"","sources":["../../src/resolvers/avatarInputValidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,wFAAwF;AACxF,eAAO,MAAM,sBAAsB,QAAa,CAAC;AAEjD,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,0CAA0C;AAC1C,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAehD,kGAAkG;AAClG,MAAM,WAAW,2BAA2B;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oEAAoE;IACpE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACrC,2BAA2B,CAK7B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Trust-boundary validation for the self-service avatar mutation
|
|
3
|
+
* (`UpdateMyAvatar` in `UserAvatarResolver`).
|
|
4
|
+
*
|
|
5
|
+
* The browser checks these values too, but its URL check is `new URL(...)`, which happily accepts
|
|
6
|
+
* `javascript:` and every `data:` type. The server is the boundary, so everything that reaches
|
|
7
|
+
* `MJ: Users.UserImageURL` / `UserImageIconClass` through the mutation passes through here first.
|
|
8
|
+
*
|
|
9
|
+
* Pure: no I/O, no provider, no entity — so it is unit-testable on its own.
|
|
10
|
+
*
|
|
11
|
+
* @module @memberjunction/server/resolvers/avatarInputValidation
|
|
12
|
+
*/
|
|
13
|
+
/** Largest DECODED image accepted in a `data:` URI. Matches the Explorer upload cap. */
|
|
14
|
+
export const AVATAR_MAX_IMAGE_BYTES = 200 * 1024;
|
|
15
|
+
/** Longest `http:` / `https:` image URL accepted. */
|
|
16
|
+
export const AVATAR_MAX_URL_LENGTH = 2048;
|
|
17
|
+
/** Longest icon class string accepted. */
|
|
18
|
+
export const AVATAR_MAX_ICON_CLASS_LENGTH = 100;
|
|
19
|
+
/**
|
|
20
|
+
* Longest `data:` value that can still decode to {@link AVATAR_MAX_IMAGE_BYTES}: the longest accepted
|
|
21
|
+
* prefix plus the padded base64 payload. Anything longer is refused before the pattern scans it.
|
|
22
|
+
*/
|
|
23
|
+
const AVATAR_MAX_DATA_URI_LENGTH = 'data:image/jpeg;base64,'.length + Math.ceil(AVATAR_MAX_IMAGE_BYTES / 3) * 4;
|
|
24
|
+
/** `data:image/<raster type>;base64,<payload>` — SVG is deliberately absent (it can carry script). */
|
|
25
|
+
const DATA_URI_PATTERN = /^data:image\/(png|jpeg|jpg|gif|webp);base64,([A-Za-z0-9+/]+={0,2})$/;
|
|
26
|
+
/** Lower-case Font Awesome class lists only, e.g. `fa-solid fa-user`. */
|
|
27
|
+
const ICON_CLASS_PATTERN = /^[a-z0-9 -]+$/;
|
|
28
|
+
const FA_TOKEN_PATTERN = /^fa-[a-z0-9-]+$/;
|
|
29
|
+
/**
|
|
30
|
+
* Validates a requested avatar. Null or empty values clear the corresponding column, so both
|
|
31
|
+
* null is a valid "revert to default".
|
|
32
|
+
*
|
|
33
|
+
* - `imageURL`: a `data:image/(png|jpeg|jpg|gif|webp);base64,...` URI whose decoded size is at most
|
|
34
|
+
* {@link AVATAR_MAX_IMAGE_BYTES}, or an absolute `http:`/`https:` URL of at most
|
|
35
|
+
* {@link AVATAR_MAX_URL_LENGTH} characters with no whitespace. Everything else is refused.
|
|
36
|
+
* - `iconClass`: at most {@link AVATAR_MAX_ICON_CLASS_LENGTH} characters of `[a-z0-9 -]`,
|
|
37
|
+
* containing at least one `fa-` token.
|
|
38
|
+
*/
|
|
39
|
+
export function ValidateAvatarInput(imageURL, iconClass) {
|
|
40
|
+
const image = imageURL ? imageURL : null;
|
|
41
|
+
const icon = iconClass ? iconClass : null;
|
|
42
|
+
const error = (image === null ? undefined : imageUrlError(image)) ?? (icon === null ? undefined : iconClassError(icon));
|
|
43
|
+
return error ? { Valid: false, ErrorMessage: error, ImageURL: null, IconClass: null } : { Valid: true, ImageURL: image, IconClass: icon };
|
|
44
|
+
}
|
|
45
|
+
/** Returns why an image value is refused, or `undefined` when it is acceptable. */
|
|
46
|
+
function imageUrlError(value) {
|
|
47
|
+
if (value.startsWith('data:')) {
|
|
48
|
+
return dataUriError(value);
|
|
49
|
+
}
|
|
50
|
+
return httpUrlError(value);
|
|
51
|
+
}
|
|
52
|
+
function dataUriError(value) {
|
|
53
|
+
if (value.length > AVATAR_MAX_DATA_URI_LENGTH) {
|
|
54
|
+
return tooLargeError(Math.floor((value.length * 3) / 4));
|
|
55
|
+
}
|
|
56
|
+
const match = DATA_URI_PATTERN.exec(value);
|
|
57
|
+
if (!match || match[2].length % 4 !== 0) {
|
|
58
|
+
return 'Avatar image must be a base64 PNG, JPEG, GIF or WEBP data URI.';
|
|
59
|
+
}
|
|
60
|
+
const decodedBytes = decodedBase64Length(match[2]);
|
|
61
|
+
return decodedBytes > AVATAR_MAX_IMAGE_BYTES ? tooLargeError(decodedBytes) : undefined;
|
|
62
|
+
}
|
|
63
|
+
function tooLargeError(bytes) {
|
|
64
|
+
return `Avatar image must be ${AVATAR_MAX_IMAGE_BYTES / 1024}KB or smaller (this one is about ${Math.ceil(bytes / 1024)}KB).`;
|
|
65
|
+
}
|
|
66
|
+
/** Decoded byte length of a padded base64 string, without decoding it. */
|
|
67
|
+
function decodedBase64Length(base64) {
|
|
68
|
+
const padding = base64.endsWith('==') ? 2 : base64.endsWith('=') ? 1 : 0;
|
|
69
|
+
return (base64.length / 4) * 3 - padding;
|
|
70
|
+
}
|
|
71
|
+
function httpUrlError(value) {
|
|
72
|
+
const refusal = 'Avatar image URL must be an absolute http or https URL.';
|
|
73
|
+
if (value.length > AVATAR_MAX_URL_LENGTH) {
|
|
74
|
+
return `Avatar image URL must be ${AVATAR_MAX_URL_LENGTH} characters or fewer.`;
|
|
75
|
+
}
|
|
76
|
+
if (/\s/.test(value) || !/^https?:\/\//i.test(value)) {
|
|
77
|
+
return refusal;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const url = new URL(value);
|
|
81
|
+
return url.protocol === 'http:' || url.protocol === 'https:' ? undefined : refusal;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return refusal;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Returns why an icon class is refused, or `undefined` when it is acceptable. */
|
|
88
|
+
function iconClassError(value) {
|
|
89
|
+
const valid = value.length <= AVATAR_MAX_ICON_CLASS_LENGTH &&
|
|
90
|
+
ICON_CLASS_PATTERN.test(value) &&
|
|
91
|
+
value.split(' ').some((token) => FA_TOKEN_PATTERN.test(token));
|
|
92
|
+
return valid
|
|
93
|
+
? undefined
|
|
94
|
+
: `Avatar icon must be a Font Awesome class list (lower-case letters, digits, spaces and hyphens, ` +
|
|
95
|
+
`${AVATAR_MAX_ICON_CLASS_LENGTH} characters or fewer, including an fa- class).`;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=avatarInputValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatarInputValidation.js","sourceRoot":"","sources":["../../src/resolvers/avatarInputValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,37 @@
|
|
|
1
|
+
import { UserInfo } from '@memberjunction/core';
|
|
1
2
|
/**
|
|
2
3
|
* Guards and filter builders for CurrentUser role loading.
|
|
3
4
|
* Kept out of UserResolver so the login-adjacent failure modes are unit-testable
|
|
4
5
|
* without importing generated GraphQL types or the Apollo config bootstrap.
|
|
5
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* The session user's own fields, as CurrentUser returns them. The client asks for every field of
|
|
9
|
+
* `UserInfo` (GraphQLDataProvider builds its query from it), so each one belongs here; anything
|
|
10
|
+
* left out reaches the client as null (as IsTemplate once did, hiding the template-user banner).
|
|
11
|
+
*/
|
|
12
|
+
export declare function SessionUserFields(userRecord: UserInfo): {
|
|
13
|
+
ID: string;
|
|
14
|
+
Name: string;
|
|
15
|
+
FirstName: string;
|
|
16
|
+
LastName: string;
|
|
17
|
+
Title: string;
|
|
18
|
+
Email: string;
|
|
19
|
+
Type: string;
|
|
20
|
+
IsActive: boolean;
|
|
21
|
+
IsTemplate: boolean;
|
|
22
|
+
LinkedRecordType: "None" | "Other" | "Employee";
|
|
23
|
+
EmployeeID: number;
|
|
24
|
+
LinkedEntityID: number;
|
|
25
|
+
LinkedEntityRecordID: number;
|
|
26
|
+
__mj_CreatedAt: Date;
|
|
27
|
+
__mj_UpdatedAt: Date;
|
|
28
|
+
FirstLast: string;
|
|
29
|
+
EmployeeFirstLast: string;
|
|
30
|
+
EmployeeEmail: string;
|
|
31
|
+
EmployeeTitle: string;
|
|
32
|
+
EmployeeSupervisor: string;
|
|
33
|
+
EmployeeSupervisorEmail: string;
|
|
34
|
+
};
|
|
6
35
|
export declare function RequireLoadedUser<T extends {
|
|
7
36
|
ID?: string;
|
|
8
37
|
}>(user: T | null | undefined, email: string | undefined): T & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currentUserRoles.d.ts","sourceRoot":"","sources":["../../src/resolvers/currentUserRoles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"currentUserRoles.d.ts","sourceRoot":"","sources":["../../src/resolvers/currentUserRoles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;GAIG;AAEH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;EAwBrD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACzD,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAKpB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,CAKnE;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,CAKxE;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC1D,MAAM,EAAE,MAAM,GACb,IAAI,CAMN"}
|
|
@@ -4,6 +4,36 @@ import { LogError } from '@memberjunction/core';
|
|
|
4
4
|
* Kept out of UserResolver so the login-adjacent failure modes are unit-testable
|
|
5
5
|
* without importing generated GraphQL types or the Apollo config bootstrap.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* The session user's own fields, as CurrentUser returns them. The client asks for every field of
|
|
9
|
+
* `UserInfo` (GraphQLDataProvider builds its query from it), so each one belongs here; anything
|
|
10
|
+
* left out reaches the client as null (as IsTemplate once did, hiding the template-user banner).
|
|
11
|
+
*/
|
|
12
|
+
export function SessionUserFields(userRecord) {
|
|
13
|
+
return {
|
|
14
|
+
ID: userRecord.ID,
|
|
15
|
+
Name: userRecord.Name,
|
|
16
|
+
FirstName: userRecord.FirstName,
|
|
17
|
+
LastName: userRecord.LastName,
|
|
18
|
+
Title: userRecord.Title,
|
|
19
|
+
Email: userRecord.Email,
|
|
20
|
+
Type: userRecord.Type,
|
|
21
|
+
IsActive: userRecord.IsActive,
|
|
22
|
+
IsTemplate: userRecord.IsTemplate,
|
|
23
|
+
LinkedRecordType: userRecord.LinkedRecordType,
|
|
24
|
+
EmployeeID: userRecord.EmployeeID,
|
|
25
|
+
LinkedEntityID: userRecord.LinkedEntityID,
|
|
26
|
+
LinkedEntityRecordID: userRecord.LinkedEntityRecordID,
|
|
27
|
+
__mj_CreatedAt: userRecord.__mj_CreatedAt,
|
|
28
|
+
__mj_UpdatedAt: userRecord.__mj_UpdatedAt,
|
|
29
|
+
FirstLast: userRecord.FirstLast,
|
|
30
|
+
EmployeeFirstLast: userRecord.EmployeeFirstLast,
|
|
31
|
+
EmployeeEmail: userRecord.EmployeeEmail,
|
|
32
|
+
EmployeeTitle: userRecord.EmployeeTitle,
|
|
33
|
+
EmployeeSupervisor: userRecord.EmployeeSupervisor,
|
|
34
|
+
EmployeeSupervisorEmail: userRecord.EmployeeSupervisorEmail,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
7
37
|
export function RequireLoadedUser(user, email) {
|
|
8
38
|
if (!user?.ID) {
|
|
9
39
|
throw new Error(`CurrentUser: no user found for email '${email ?? ''}'`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currentUserRoles.js","sourceRoot":"","sources":["../../src/resolvers/currentUserRoles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"currentUserRoles.js","sourceRoot":"","sources":["../../src/resolvers/currentUserRoles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAE1D;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAoB;IACpD,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,EAAE;QACjB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,oBAAoB,EAAE,UAAU,CAAC,oBAAoB;QACrD,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;QAC/C,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,uBAAuB,EAAE,UAAU,CAAC,uBAAuB;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAA0B,EAC1B,KAAyB;IAEzB,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAA0B,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAI,IAA0B;IAC9D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAI,QAA8B;IACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,OAAO,WAAW,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAA0D,EAC1D,MAAc;IAEd,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,eAAe,CAAC;QACvD,QAAQ,CAAC,8CAA8C,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
|
|
@@ -5,6 +5,12 @@ import * as defaultHelpers from './meetingHelpers.js';
|
|
|
5
5
|
export type MeetingHelpers = typeof defaultHelpers;
|
|
6
6
|
export declare function ExecuteCreateMeeting(provider: IMetadataProvider, user: UserInfo, input: CreateMeetingInput, helpers?: Partial<MeetingHelpers>): Promise<MeetingResult>;
|
|
7
7
|
export declare function ExecuteUpdateMeeting(provider: IMetadataProvider, user: UserInfo, input: UpdateMeetingInput, helpers?: Partial<MeetingHelpers>): Promise<MeetingResult>;
|
|
8
|
+
/**
|
|
9
|
+
* Starts a meeting for the `StartMeeting` mutation (`MeetingResolver`): marks it `Live`, ensures its Interaction, starts
|
|
10
|
+
* each agent participant in the room under an agent session created for it, starts an automatic recording, and mints the
|
|
11
|
+
* caller's client token. An agent that fails to start doesn't fail the meeting; the session created for it is closed
|
|
12
|
+
* (`Error`).
|
|
13
|
+
*/
|
|
8
14
|
export declare function ExecuteStartMeeting(provider: IMetadataProvider, user: UserInfo, meetingID: string, sessionManager: SessionManager, helpers?: Partial<MeetingHelpers>): Promise<StartMeetingResult>;
|
|
9
15
|
export declare function ExecuteEndMeeting(provider: IMetadataProvider, user: UserInfo, meetingID: string, helpers?: Partial<MeetingHelpers>): Promise<MeetingResult>;
|
|
10
16
|
export declare function ExecuteCancelMeeting(provider: IMetadataProvider, user: UserInfo, meetingID: string, helpers?: Partial<MeetingHelpers>): Promise<MeetingResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meetingMutations.d.ts","sourceRoot":"","sources":["../../../src/resolvers/meetings/meetingMutations.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAGjB,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAY9B,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC;AAMnD,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAoHxB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CA6IxB;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"meetingMutations.d.ts","sourceRoot":"","sources":["../../../src/resolvers/meetings/meetingMutations.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EAGjB,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAY9B,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC;AAMnD,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAoHxB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CA6IxB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAkG7B;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAwCxB;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,gBAAgB,EACvB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC,CAiDxB"}
|
|
@@ -235,6 +235,12 @@ export async function ExecuteUpdateMeeting(provider, user, input, helpers) {
|
|
|
235
235
|
return { Success: false, ErrorMessage: msg };
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
|
+
/**
|
|
239
|
+
* Starts a meeting for the `StartMeeting` mutation (`MeetingResolver`): marks it `Live`, ensures its Interaction, starts
|
|
240
|
+
* each agent participant in the room under an agent session created for it, starts an automatic recording, and mints the
|
|
241
|
+
* caller's client token. An agent that fails to start doesn't fail the meeting; the session created for it is closed
|
|
242
|
+
* (`Error`).
|
|
243
|
+
*/
|
|
238
244
|
export async function ExecuteStartMeeting(provider, user, meetingID, sessionManager, helpers) {
|
|
239
245
|
const h = resolveHelpers(helpers);
|
|
240
246
|
try {
|
|
@@ -261,8 +267,11 @@ export async function ExecuteStartMeeting(provider, user, meetingID, sessionMana
|
|
|
261
267
|
const participants = await h.LoadParticipants(meeting.ID, user, provider);
|
|
262
268
|
const agentParticipants = participants.filter((p) => p.Role === 'Agent' && p.AgentID);
|
|
263
269
|
for (const ap of agentParticipants) {
|
|
270
|
+
// Set once this agent's session exists, so a start that fails after it was created can close it.
|
|
271
|
+
let createdSessionID;
|
|
264
272
|
try {
|
|
265
273
|
const createdSession = await sessionManager.CreateSession({ agentID: ap.AgentID, userID: user.ID }, user, provider);
|
|
274
|
+
createdSessionID = createdSession.ID;
|
|
266
275
|
await LiveKitAgentRoomCoordinator.Instance.StartAgentRoomSession({
|
|
267
276
|
AgentSessionID: createdSession.ID,
|
|
268
277
|
RoomName: meeting.RoomName,
|
|
@@ -271,10 +280,22 @@ export async function ExecuteStartMeeting(provider, user, meetingID, sessionMana
|
|
|
271
280
|
MetadataProvider: provider,
|
|
272
281
|
TurnMode: 'Active',
|
|
273
282
|
TurnAddressing: 'Auto',
|
|
283
|
+
// The session exists for this agent's time in the room alone: it closes when the agent leaves (the meeting is
|
|
284
|
+
// ended, everyone leaves, the agent is stopped), not when the janitor finds it idle.
|
|
285
|
+
Host: {
|
|
286
|
+
OnSessionEnded: async (reason) => {
|
|
287
|
+
await sessionManager.CloseSessionForEndedBridge(createdSession.ID, reason, user, provider);
|
|
288
|
+
},
|
|
289
|
+
},
|
|
274
290
|
});
|
|
275
291
|
}
|
|
276
292
|
catch (agentErr) {
|
|
277
293
|
LogError(`[MeetingResolver] Failed to start agent participant ${ap.AgentID} in room ${meeting.RoomName}: ${agentErr instanceof Error ? agentErr.message : String(agentErr)}`);
|
|
294
|
+
// The agent never joined, so the hook above never runs: close its session now (Error), not when the janitor finds
|
|
295
|
+
// it idle. The coordinator has already closed any model session the start opened (#5308).
|
|
296
|
+
if (createdSessionID) {
|
|
297
|
+
await sessionManager.CloseSessionForFailedStart(createdSessionID, user, provider);
|
|
298
|
+
}
|
|
278
299
|
}
|
|
279
300
|
}
|
|
280
301
|
// 3. Initiate recording if RecordingPolicy is 'Automatic'
|