@memberjunction/server 6.2.0-edge.4 → 6.2.0-edge.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +91 -30
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +311 -81
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +17 -3
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +44 -10
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/apiRoot.d.ts +32 -0
- package/dist/apiRoot.d.ts.map +1 -0
- package/dist/apiRoot.js +67 -0
- package/dist/apiRoot.js.map +1 -0
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +27 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/LoginScreenEngine.d.ts +22 -0
- package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
- package/dist/auth/LoginScreenEngine.js +57 -0
- package/dist/auth/LoginScreenEngine.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +52 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +10 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +37 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/localDevAuth.d.ts +79 -0
- package/dist/auth/localDevAuth.d.ts.map +1 -0
- package/dist/auth/localDevAuth.js +439 -0
- package/dist/auth/localDevAuth.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +2 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +12 -0
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.d.ts +1 -1
- package/dist/auth/sessionUserClone.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.js +3 -2
- package/dist/auth/sessionUserClone.js.map +1 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
- package/dist/broadcast/index.d.ts +6 -0
- package/dist/broadcast/index.d.ts.map +1 -0
- package/dist/broadcast/index.js +6 -0
- package/dist/broadcast/index.js.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
- package/dist/cache.d.ts +3 -2
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +632 -22
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +104 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +3 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -8
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +29 -0
- package/dist/coreRoutes.d.ts.map +1 -0
- package/dist/coreRoutes.js +156 -0
- package/dist/coreRoutes.js.map +1 -0
- package/dist/generated/graphql-schemas/__mj.d.ts +1016 -29
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +5125 -434
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +85 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +175 -60
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/PubSubManager.d.ts +10 -0
- package/dist/generic/PubSubManager.d.ts.map +1 -1
- package/dist/generic/PubSubManager.js +44 -1
- package/dist/generic/PubSubManager.js.map +1 -1
- package/dist/generic/PushStatusResolver.d.ts +39 -6
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +94 -12
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +168 -69
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +464 -405
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +11 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +91 -13
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
- package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
- package/dist/generic/actionOutputFieldSecurity.js +47 -0
- package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
- package/dist/generic/fieldSecurityTransport.d.ts +30 -0
- package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
- package/dist/generic/fieldSecurityTransport.js +30 -0
- package/dist/generic/fieldSecurityTransport.js.map +1 -0
- package/dist/globalCors.d.ts +33 -0
- package/dist/globalCors.d.ts.map +1 -0
- package/dist/globalCors.js +58 -0
- package/dist/globalCors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +230 -222
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +6 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +50 -1
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +22 -2
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
- package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
- package/dist/realtimeSessions/index.d.ts +2 -0
- package/dist/realtimeSessions/index.d.ts.map +1 -1
- package/dist/realtimeSessions/index.js +2 -0
- package/dist/realtimeSessions/index.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +32 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js +56 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
- package/dist/realtimeSessions/sessionAccess.d.ts +91 -8
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +127 -20
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
- package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.js +19 -3
- package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
- package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +201 -19
- package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
- package/dist/realtimeWidget/host-identity.d.ts +1 -1
- package/dist/realtimeWidget/host-identity.js +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +17 -1
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +19 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +63 -12
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +1 -0
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +40 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.js +9 -7
- package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts +24 -3
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +57 -8
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
- package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +3 -2
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +46 -3
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +211 -50
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -0
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +87 -11
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +292 -105
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +117 -38
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +6 -3
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +49 -9
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +31 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
- package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.js +5 -3
- package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts +2 -0
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +33 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +15 -6
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RSUResolver.d.ts.map +1 -1
- package/dist/resolvers/RSUResolver.js +12 -0
- package/dist/resolvers/RSUResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +18 -10
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +92 -54
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +241 -67
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +4 -4
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTestResolver.js +3 -1
- package/dist/resolvers/RunTestResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
- package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +4 -0
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +66 -13
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +34 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +150 -27
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js +2 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
- package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
- package/dist/resolvers/agent-run-data-guard.js +72 -0
- package/dist/resolvers/agent-run-data-guard.js.map +1 -0
- package/dist/rest/EntityCRUDHandler.d.ts +6 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +19 -5
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +8 -5
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
- package/dist/rest/RealtimeRecordingHandler.js +383 -0
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts +9 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +43 -17
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +6 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +6 -0
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverExtensionReservedRoots.d.ts +12 -10
- package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
- package/dist/serverExtensionReservedRoots.js +14 -17
- package/dist/serverExtensionReservedRoots.js.map +1 -1
- package/dist/serverRoleConfigUnits.d.ts +29 -0
- package/dist/serverRoleConfigUnits.d.ts.map +1 -0
- package/dist/serverRoleConfigUnits.js +33 -0
- package/dist/serverRoleConfigUnits.js.map +1 -0
- package/dist/services/MJStorageBlobStore.d.ts +8 -1
- package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
- package/dist/services/MJStorageBlobStore.js +25 -19
- package/dist/services/MJStorageBlobStore.js.map +1 -1
- package/dist/services/StartTaskGraphDispatcher.js +2 -2
- package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +5 -3
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +27 -5
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +157 -9
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +59 -2
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +626 -16
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/sharedCache.d.ts.map +1 -1
- package/dist/sharedCache.js +3 -0
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +23 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +99 -98
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
- package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +369 -18
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
- package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
- package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
- package/src/__tests__/LoginScreenEngine.test.ts +86 -0
- package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
- package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
- package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
- package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +243 -7
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
- package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
- package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +69 -13
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +20 -28
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +264 -0
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
- package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
- package/src/__tests__/SessionJanitor.test.ts +365 -10
- package/src/__tests__/SessionManager.test.ts +122 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
- package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +468 -23
- package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
- package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
- package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/agent-run-data-guard.test.ts +130 -0
- package/src/__tests__/apiRootBoot.test.ts +202 -0
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +109 -0
- package/src/__tests__/conversationRunEvents.test.ts +56 -14
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +217 -0
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
- package/src/__tests__/multiTenancy.security.test.ts +51 -0
- package/src/__tests__/multiTenancy.test.ts +1 -1
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +64 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +669 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +146 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
- package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
- package/src/__tests__/resolverBase.fls.test.ts +146 -97
- package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
- package/src/__tests__/runParamsTimeZone.test.ts +179 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
- package/src/__tests__/runViewProperties.test.ts +114 -0
- package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
- package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
- package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
- package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/sharedCache.test.ts +5 -3
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +28 -0
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/SessionJanitor.ts +369 -93
- package/src/agentSessions/SessionManager.ts +45 -10
- package/src/apiRoot.ts +78 -0
- package/src/auth/AuthProviderCatalogRouter.ts +29 -0
- package/src/auth/LoginScreenEngine.ts +50 -0
- package/src/auth/index.ts +57 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
- package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
- package/src/auth/magicLink/types.ts +10 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
- package/src/broadcast/index.ts +5 -0
- package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
- package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
- package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
- package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
- package/src/cache.ts +2 -1
- package/src/config.ts +115 -5
- package/src/context.ts +32 -8
- package/src/coreRoutes.ts +181 -0
- package/src/generated/graphql-schemas/__mj.ts +3684 -284
- package/src/generic/CacheInvalidationResolver.ts +172 -60
- package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +109 -12
- package/src/generic/ResolverBase.ts +540 -431
- package/src/generic/RunViewResolver.ts +97 -15
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/globalCors.ts +71 -0
- package/src/index.ts +239 -238
- package/src/integration/CustomColumnPromoter.ts +6 -1
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/multiTenancy/index.ts +24 -2
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
- package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
- package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/index.ts +2 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +69 -0
- package/src/realtimeSessions/sessionAccess.ts +183 -23
- package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
- package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
- package/src/realtimeSessions/verificationWorkflow.ts +3 -1
- package/src/realtimeWidget/WidgetRouter.ts +22 -4
- package/src/realtimeWidget/WidgetSessionService.ts +252 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/widgetCore.ts +30 -1
- package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
- package/src/resolvers/ActionResolver.ts +78 -15
- package/src/resolvers/AdhocQueryResolver.ts +1 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
- package/src/resolvers/AgentSessionResolver.ts +46 -18
- package/src/resolvers/ArtifactFileResolver.ts +9 -8
- package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
- package/src/resolvers/DatasetResolver.ts +70 -10
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/EntityRecordNameResolver.ts +3 -2
- package/src/resolvers/FetchEntityVectorsResolver.ts +248 -55
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +334 -109
- package/src/resolvers/GetDataContextDataResolver.ts +139 -41
- package/src/resolvers/GetDataResolver.ts +6 -3
- package/src/resolvers/IntegrationDiscoveryResolver.ts +53 -9
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +31 -6
- package/src/resolvers/QuerySystemUserResolver.ts +15 -6
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +114 -66
- package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
- package/src/resolvers/RunAIAgentResolver.ts +296 -85
- package/src/resolvers/RunTemplateResolver.ts +6 -4
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
- package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
- package/src/resolvers/TestQuerySQLResolver.ts +69 -13
- package/src/resolvers/TransactionGroupResolver.ts +185 -30
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/resolvers/agent-run-data-guard.ts +89 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +467 -0
- package/src/rest/ViewOperationsHandler.ts +52 -18
- package/src/rest/setupRESTEndpoints.ts +6 -0
- package/src/serverExtensionReservedRoots.ts +14 -17
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/MJStorageBlobStore.ts +31 -30
- package/src/services/StartTaskGraphDispatcher.ts +2 -2
- package/src/services/TaskGraphActionRunner.ts +25 -5
- package/src/services/TaskGraphAgentRunner.ts +188 -11
- package/src/services/TaskGraphContinuationDeliverer.ts +738 -16
- package/src/sharedCache.ts +3 -0
- package/src/types.ts +23 -1
|
@@ -9,13 +9,17 @@
|
|
|
9
9
|
* ## The two ownership rules
|
|
10
10
|
*
|
|
11
11
|
* 1. **Owner.** The session's `UserID` must be the caller's user.
|
|
12
|
-
* 2. **Scope.** A *named* user is fully identified by (1). An **anonymous widget guest
|
|
13
|
-
* every
|
|
14
|
-
* address any other
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
12
|
+
* 2. **Scope.** A *named* user is fully identified by (1). An **anonymous visitor** (widget guest or
|
|
13
|
+
* anonymous magic-link invitee) is not: every one authenticates as the one shared Anonymous user, so
|
|
14
|
+
* (1) alone would let any visitor address any other visitor's session. What separates them is the
|
|
15
|
+
* scope identity {@link ResolveSessionScopeIdentity} reads off the signed token — the resource scope
|
|
16
|
+
* (`MagicLinkScope.ResourceID`) when the token carries one, else the per-token `mj_sid`
|
|
17
|
+
* (`AnonymousVisitorID`). `SessionManager` stamps that same value onto the session's Conversation as
|
|
18
|
+
* `ExternalID`, so a principal with a scope identity must match it, and an anonymous principal with
|
|
19
|
+
* none is refused outright — it cannot be told apart from every other anonymous principal.
|
|
20
|
+
* One allowance: a NAMED principal with a resource scope may also use its own session whose
|
|
21
|
+
* conversation carries no stamp at all, when it could read that conversation (see the comment in
|
|
22
|
+
* {@link AuthorizeSessionAccess}).
|
|
19
23
|
*
|
|
20
24
|
* The decision is deliberately pure (no I/O) so it can be applied identically to a freshly loaded
|
|
21
25
|
* row at subscribe time and to the owner/scope snapshot carried inside each published event.
|
|
@@ -41,14 +45,22 @@ export interface SessionAccessSubject {
|
|
|
41
45
|
* could not be loaded.
|
|
42
46
|
*/
|
|
43
47
|
ConversationExternalID: string | null | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* True when the conversation was loaded under the CALLER's identity (so its row-level security allowed
|
|
50
|
+
* the read). Only consulted for a named principal with a resource scope on a conversation that carries
|
|
51
|
+
* no `ExternalID`; omitted means unknown and is treated as unreadable (fail closed).
|
|
52
|
+
*/
|
|
53
|
+
ConversationReadable?: boolean;
|
|
44
54
|
}
|
|
45
55
|
|
|
46
56
|
/** What the decision needs to know about the caller (a subset of `UserInfo`). */
|
|
47
57
|
export interface SessionAccessPrincipal {
|
|
48
58
|
/** The caller's user id. */
|
|
49
59
|
ID: string;
|
|
50
|
-
/** True for the shared-Anonymous-user principal of a public-widget guest. */
|
|
60
|
+
/** True for the shared-Anonymous-user principal of a public-widget guest or anonymous magic-link invitee. */
|
|
51
61
|
IsMagicLinkAnonymous?: boolean;
|
|
62
|
+
/** Per-visitor session identity (`mj_sid`) for an anonymous principal. */
|
|
63
|
+
AnonymousVisitorID?: string;
|
|
52
64
|
/** The signed per-session scope carried by the caller's token, when any. */
|
|
53
65
|
MagicLinkScope?: { ResourceID?: string } | undefined;
|
|
54
66
|
}
|
|
@@ -57,7 +69,29 @@ export interface SessionAccessPrincipal {
|
|
|
57
69
|
export type SessionAccessRefusal = 'not_owner' | 'scope_missing' | 'scope_mismatch';
|
|
58
70
|
|
|
59
71
|
/** Outcome of {@link AuthorizeSessionAccess}. */
|
|
60
|
-
export type SessionAccessDecision =
|
|
72
|
+
export type SessionAccessDecision =
|
|
73
|
+
| { Allowed: true; Reason?: undefined }
|
|
74
|
+
| { Allowed: false; Reason: SessionAccessRefusal };
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The scope identity a session is keyed on for `principal` — the one value `SessionManager` stamps as
|
|
78
|
+
* the session conversation's `ExternalID` and {@link AuthorizeSessionAccess} compares against it.
|
|
79
|
+
*
|
|
80
|
+
* - The token's resource scope (`MagicLinkScope.ResourceID`) when it carries one. A widget guest's
|
|
81
|
+
* resource scope IS its `mj_sid`; an anonymous magic-link invite with a `ResourceID` (e.g. a Caliber
|
|
82
|
+
* Invite Scope, one per subject) shares that scope across its redemptions by design, and the
|
|
83
|
+
* `{{ScopeResourceID}}` RLS filters key on the same value, so the visitor can read its own rows.
|
|
84
|
+
* - Otherwise, for an anonymous principal, the per-token `mj_sid` (`AnonymousVisitorID`), which tells two
|
|
85
|
+
* redemptions of an unscoped multi-use invite apart.
|
|
86
|
+
* - Otherwise `undefined` (a named user without a resource scope).
|
|
87
|
+
*/
|
|
88
|
+
export function ResolveSessionScopeIdentity(principal: SessionAccessPrincipal): string | undefined {
|
|
89
|
+
const resourceId = principal.MagicLinkScope?.ResourceID;
|
|
90
|
+
if (resourceId) {
|
|
91
|
+
return resourceId;
|
|
92
|
+
}
|
|
93
|
+
return principal.IsMagicLinkAnonymous ? principal.AnonymousVisitorID || undefined : undefined;
|
|
94
|
+
}
|
|
61
95
|
|
|
62
96
|
/**
|
|
63
97
|
* Decides whether `principal` may address the session described by `subject`.
|
|
@@ -74,14 +108,26 @@ export function AuthorizeSessionAccess(
|
|
|
74
108
|
if (!principal?.ID || !subject.SessionUserID || !UUIDsEqual(subject.SessionUserID, principal.ID)) {
|
|
75
109
|
return { Allowed: false, Reason: 'not_owner' };
|
|
76
110
|
}
|
|
77
|
-
const scopeId = principal
|
|
111
|
+
const scopeId = ResolveSessionScopeIdentity(principal);
|
|
78
112
|
if (!scopeId) {
|
|
79
|
-
//
|
|
80
|
-
//
|
|
113
|
+
// A named user without a scope is identified by the owner check alone; an anonymous principal
|
|
114
|
+
// without one cannot be told apart from any other anonymous principal.
|
|
81
115
|
return principal.IsMagicLinkAnonymous ? { Allowed: false, Reason: 'scope_missing' } : { Allowed: true };
|
|
82
116
|
}
|
|
83
117
|
// Scope ids are opaque base64url strings (case-significant), so compare exactly — not UUIDsEqual.
|
|
84
|
-
|
|
118
|
+
if (subject.ConversationExternalID === scopeId) {
|
|
119
|
+
return { Allowed: true };
|
|
120
|
+
}
|
|
121
|
+
// A named user is identified by the owner check; its scope only keeps one link's sessions apart from
|
|
122
|
+
// the same person's other links (magic links resolve the user by email, so one person can hold several).
|
|
123
|
+
// A conversation with no stamp belongs to no link (one started from the Conversations app), so the owner
|
|
124
|
+
// may use it when its own row-level security let it read the conversation. `ExternalID` is not stamped
|
|
125
|
+
// here because other features own that column on their conversations (meeting room names, for example).
|
|
126
|
+
// An anonymous visitor gets no such allowance: the stamp is the only thing that identifies it.
|
|
127
|
+
if (!principal.IsMagicLinkAnonymous && subject.ConversationExternalID === null && subject.ConversationReadable === true) {
|
|
128
|
+
return { Allowed: true };
|
|
129
|
+
}
|
|
130
|
+
return { Allowed: false, Reason: 'scope_mismatch' };
|
|
85
131
|
}
|
|
86
132
|
|
|
87
133
|
/** A session row together with the one fact about its conversation the decision needs. */
|
|
@@ -90,6 +136,8 @@ export interface LoadedSessionForAccess {
|
|
|
90
136
|
Session: MJAIAgentSessionEntity;
|
|
91
137
|
/** The session's conversation `ExternalID` (anonymous scope id), or null. */
|
|
92
138
|
ConversationExternalID: string | null;
|
|
139
|
+
/** Whether the caller could read the session's conversation (false when there is none). */
|
|
140
|
+
ConversationReadable: boolean;
|
|
93
141
|
}
|
|
94
142
|
|
|
95
143
|
/**
|
|
@@ -115,27 +163,139 @@ export async function LoadSessionForAccess(
|
|
|
115
163
|
if (!(await session.Load(agentSessionId))) {
|
|
116
164
|
return null;
|
|
117
165
|
}
|
|
118
|
-
|
|
166
|
+
const conversation = await LoadSessionConversationScope(session, contextUser, provider);
|
|
167
|
+
return { Session: session, ConversationExternalID: conversation.ExternalID, ConversationReadable: conversation.Readable };
|
|
119
168
|
}
|
|
120
169
|
|
|
121
|
-
/**
|
|
122
|
-
|
|
170
|
+
/** What the caller could learn about a session's conversation: the scope half of {@link SessionAccessSubject}. */
|
|
171
|
+
export interface SessionConversationScope {
|
|
172
|
+
/** The conversation's `ExternalID` (the anonymous scope id), or null when it has none or was not read. */
|
|
173
|
+
ExternalID: string | null;
|
|
174
|
+
/** Whether the caller could read the conversation (false when the session has none). */
|
|
175
|
+
Readable: boolean;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** {@link SessionConversationScope} plus the conversation's owner, for a conversation addressed without a session. */
|
|
179
|
+
export interface ConversationScope extends SessionConversationScope {
|
|
180
|
+
/** `Conversation.UserID`, or null when the conversation was not read. */
|
|
181
|
+
UserID: string | null;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Reads an already-loaded session's conversation under `contextUser` (so its row-level security applies).
|
|
186
|
+
* A missing conversation, a refused read and a failed read (logged) all report `Readable: false`. For
|
|
187
|
+
* callers that loaded the session through another gate and only need the scope half of
|
|
188
|
+
* {@link AuthorizeSessionAccess}'s subject.
|
|
189
|
+
*/
|
|
190
|
+
export async function LoadSessionConversationScope(
|
|
123
191
|
session: MJAIAgentSessionEntity,
|
|
124
192
|
contextUser: UserInfo,
|
|
125
193
|
provider: IMetadataProvider,
|
|
126
|
-
): Promise<
|
|
194
|
+
): Promise<SessionConversationScope> {
|
|
127
195
|
if (!session.ConversationID) {
|
|
128
|
-
return null;
|
|
196
|
+
return { ExternalID: null, Readable: false };
|
|
197
|
+
}
|
|
198
|
+
const { ExternalID, Readable } = await LoadConversationScope(session.ConversationID, contextUser, provider);
|
|
199
|
+
return { ExternalID, Readable };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Reads a conversation's owner and scope id under `contextUser` (so its row-level security applies), for a
|
|
204
|
+
* caller that addresses the conversation directly rather than through a session — a text agent turn, for
|
|
205
|
+
* example, whose only handle is a message in it. Together with the caller's principal this is exactly the
|
|
206
|
+
* subject {@link AuthorizeSessionAccess} decides on: `SessionUserID` is the conversation's owner, since the
|
|
207
|
+
* session a conversation belongs to is owned by the same user.
|
|
208
|
+
*
|
|
209
|
+
* An empty id, a missing conversation, a refused read and a failed read (logged) all report
|
|
210
|
+
* `Readable: false` with no owner, which {@link AuthorizeSessionAccess} then refuses for any scoped caller.
|
|
211
|
+
*/
|
|
212
|
+
export async function LoadConversationScope(
|
|
213
|
+
conversationId: string | null | undefined,
|
|
214
|
+
contextUser: UserInfo,
|
|
215
|
+
provider: IMetadataProvider,
|
|
216
|
+
): Promise<ConversationScope> {
|
|
217
|
+
const unreadable: ConversationScope = { UserID: null, ExternalID: null, Readable: false };
|
|
218
|
+
if (!conversationId) {
|
|
219
|
+
return unreadable;
|
|
129
220
|
}
|
|
130
221
|
try {
|
|
131
222
|
const conversation = await provider.GetEntityObject<MJConversationEntity>(CONVERSATION_ENTITY, contextUser);
|
|
132
|
-
if (!(await conversation.Load(
|
|
133
|
-
return
|
|
223
|
+
if (!(await conversation.Load(conversationId))) {
|
|
224
|
+
return unreadable;
|
|
134
225
|
}
|
|
135
|
-
return conversation.ExternalID ?? null;
|
|
226
|
+
return { UserID: conversation.UserID ?? null, ExternalID: conversation.ExternalID ?? null, Readable: true };
|
|
136
227
|
} catch (error) {
|
|
137
228
|
const message = error instanceof Error ? error.message : String(error);
|
|
138
|
-
LogError(`
|
|
139
|
-
return
|
|
229
|
+
LogError(`LoadConversationScope: could not read conversation ${conversationId} for user ${contextUser?.ID}: ${message}`);
|
|
230
|
+
return unreadable;
|
|
140
231
|
}
|
|
141
232
|
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Who may run a conversation turn (a text agent turn, addressed by a message in the conversation) in
|
|
236
|
+
* `conversationId`, decided the same way as session access.
|
|
237
|
+
*
|
|
238
|
+
* A NAMED principal is allowed without a read: its entity permissions and row filters already decided
|
|
239
|
+
* whether it could load the message, and a named user is fully identified by its `UserID`. An ANONYMOUS
|
|
240
|
+
* principal is not (see the module doc), so the conversation is read as the caller and
|
|
241
|
+
* {@link AuthorizeSessionAccess} compares its scope id with the conversation's stamp — the same
|
|
242
|
+
* decision #5997 applies to the realtime gates, so the text and voice paths agree on ownership.
|
|
243
|
+
* An unreadable conversation refuses (`not_owner`, there is no owner to match).
|
|
244
|
+
*/
|
|
245
|
+
export async function AuthorizeConversationTurn(
|
|
246
|
+
conversationId: string,
|
|
247
|
+
principal: UserInfo,
|
|
248
|
+
provider: IMetadataProvider,
|
|
249
|
+
): Promise<SessionAccessDecision> {
|
|
250
|
+
if (!principal?.IsMagicLinkAnonymous) {
|
|
251
|
+
return { Allowed: true };
|
|
252
|
+
}
|
|
253
|
+
const scope = await LoadConversationScope(conversationId, principal, provider);
|
|
254
|
+
return AuthorizeSessionAccess(
|
|
255
|
+
{ SessionUserID: scope.UserID ?? '', ConversationExternalID: scope.ExternalID, ConversationReadable: scope.Readable },
|
|
256
|
+
principal,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Whether an anonymous caller owns any of a LiveKit room's agent sessions — the check MJServer registers with
|
|
262
|
+
* `RoomAuthorizationService.SetAnonymousSessionOwnerCheck` (`@memberjunction/livekit-room-server` cannot import
|
|
263
|
+
* this package). Each session is loaded as the caller (its row-level security applies) and decided by
|
|
264
|
+
* {@link AuthorizeSessionAccess}, the same decision every realtime gate makes, so a room admits exactly the visitor
|
|
265
|
+
* whose scope id its session's conversation carries (MJ#6044). Nothing to read, or no provider: refused.
|
|
266
|
+
*/
|
|
267
|
+
export async function AuthorizeAnonymousRoomSessions(
|
|
268
|
+
agentSessionIds: string[],
|
|
269
|
+
user: UserInfo,
|
|
270
|
+
provider: IMetadataProvider | undefined,
|
|
271
|
+
): Promise<boolean> {
|
|
272
|
+
if (agentSessionIds.length === 0 || !provider) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
for (const agentSessionId of agentSessionIds) {
|
|
276
|
+
const loaded = await LoadSessionForAccess(agentSessionId, user, provider);
|
|
277
|
+
if (!loaded) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const decision = AuthorizeSessionAccess(
|
|
281
|
+
{ SessionUserID: loaded.Session.UserID, ConversationExternalID: loaded.ConversationExternalID, ConversationReadable: loaded.ConversationReadable },
|
|
282
|
+
user,
|
|
283
|
+
);
|
|
284
|
+
if (decision.Allowed) {
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* The session conversation's `ExternalID` alone; null when there is none or it cannot be read.
|
|
293
|
+
* Prefer {@link LoadSessionConversationScope}, which also says whether the read succeeded.
|
|
294
|
+
*/
|
|
295
|
+
export async function LoadSessionConversationExternalID(
|
|
296
|
+
session: MJAIAgentSessionEntity,
|
|
297
|
+
contextUser: UserInfo,
|
|
298
|
+
provider: IMetadataProvider,
|
|
299
|
+
): Promise<string | null> {
|
|
300
|
+
return (await LoadSessionConversationScope(session, contextUser, provider)).ExternalID;
|
|
301
|
+
}
|
|
@@ -113,7 +113,7 @@ export async function LoadInheritedVerifiedIdentity(
|
|
|
113
113
|
return undefined;
|
|
114
114
|
}
|
|
115
115
|
const decision = AuthorizeSessionAccess(
|
|
116
|
-
{ SessionUserID: prior.Session.UserID, ConversationExternalID: prior.ConversationExternalID },
|
|
116
|
+
{ SessionUserID: prior.Session.UserID, ConversationExternalID: prior.ConversationExternalID, ConversationReadable: prior.ConversationReadable },
|
|
117
117
|
contextUser,
|
|
118
118
|
);
|
|
119
119
|
if (decision.Allowed === false) {
|
|
@@ -61,7 +61,9 @@ export function RealtimeSessionEventsFilter(data: {
|
|
|
61
61
|
return false;
|
|
62
62
|
}
|
|
63
63
|
const decision = AuthorizeSessionAccess(
|
|
64
|
-
|
|
64
|
+
// Readability is per caller and was proven when this subscription opened (it only receives events for
|
|
65
|
+
// that one session); the snapshot carries just the stamp, so a null ScopeKey stays usable by that owner.
|
|
66
|
+
{ SessionUserID: payload.OwnerUserID, ConversationExternalID: payload.ScopeKey, ConversationReadable: true },
|
|
65
67
|
connectionPrincipal(context),
|
|
66
68
|
);
|
|
67
69
|
return decision.Allowed;
|
|
@@ -105,7 +107,7 @@ export async function AuthorizeRealtimeSessionSubscription(
|
|
|
105
107
|
throw new Error(REFUSAL_MESSAGE);
|
|
106
108
|
}
|
|
107
109
|
const decision = AuthorizeSessionAccess(
|
|
108
|
-
{ SessionUserID: loaded.Session.UserID, ConversationExternalID: loaded.ConversationExternalID },
|
|
110
|
+
{ SessionUserID: loaded.Session.UserID, ConversationExternalID: loaded.ConversationExternalID, ConversationReadable: loaded.ConversationReadable },
|
|
109
111
|
principal,
|
|
110
112
|
);
|
|
111
113
|
if (decision.Allowed === false) {
|
|
@@ -90,6 +90,8 @@ export interface SessionSnapshot {
|
|
|
90
90
|
OwnerUserID: string;
|
|
91
91
|
/** `Conversation.ExternalID` (anonymous scope id), or null. */
|
|
92
92
|
ConversationExternalID: string | null;
|
|
93
|
+
/** Whether the caller could read the session's conversation. */
|
|
94
|
+
ConversationReadable: boolean;
|
|
93
95
|
Status: 'Active' | 'Idle' | 'Closed';
|
|
94
96
|
/** `AIAgentSession.Config` as stored. */
|
|
95
97
|
ConfigRaw: string | null;
|
|
@@ -660,7 +662,7 @@ export class RealtimeSessionVerificationWorkflow {
|
|
|
660
662
|
return notFound;
|
|
661
663
|
}
|
|
662
664
|
const decision = AuthorizeSessionAccess(
|
|
663
|
-
{ SessionUserID: session.OwnerUserID, ConversationExternalID: session.ConversationExternalID },
|
|
665
|
+
{ SessionUserID: session.OwnerUserID, ConversationExternalID: session.ConversationExternalID, ConversationReadable: session.ConversationReadable },
|
|
664
666
|
caller.ContextUser,
|
|
665
667
|
);
|
|
666
668
|
if (decision.Allowed === false) {
|
|
@@ -13,10 +13,11 @@
|
|
|
13
13
|
import { Router, json, type Request, type Response } from 'express';
|
|
14
14
|
import { rateLimit, ipKeyGenerator } from 'express-rate-limit';
|
|
15
15
|
import { LogStatus } from '@memberjunction/core';
|
|
16
|
+
import type { ProofPublicJwk } from '@memberjunction/global';
|
|
16
17
|
import { configInfo, type WidgetConfig } from '../config.js';
|
|
17
18
|
import { MagicLinkKeyManager } from '../auth/magicLink/MagicLinkKeys.js';
|
|
18
19
|
import { RegisterMagicLinkAuthProvider } from '../auth/magicLink/MagicLinkRouter.js';
|
|
19
|
-
import { WidgetSessionService, type MintGuestSessionResult } from './WidgetSessionService.js';
|
|
20
|
+
import { WidgetSessionService, WIDGET_REFRESH_PATH, type MintGuestSessionResult } from './WidgetSessionService.js';
|
|
20
21
|
import { LooksLikeBot } from './widgetCore.js';
|
|
21
22
|
|
|
22
23
|
/** The mount path for the widget public router (`/widget`). */
|
|
@@ -54,7 +55,9 @@ function ensureWidgetSigning(publicUrl: string, widgetConfig: WidgetConfig): voi
|
|
|
54
55
|
export function CreateWidgetHandler(publicUrl: string, config: WidgetConfig): { publicRouter: Router; authenticatedRouter: Router } {
|
|
55
56
|
ensureWidgetSigning(publicUrl, config);
|
|
56
57
|
|
|
57
|
-
|
|
58
|
+
// A widget may hand an anonymous guest only a scope-isolated role (MJ#6043); the opt-in list is the one
|
|
59
|
+
// magic-link invites already use, so an admin declares "safe for anonymous visitors" in one place.
|
|
60
|
+
const service = new WidgetSessionService(publicUrl, config, { GrantableRoleNames: configInfo.magicLink?.grantableRoleNames ?? [] });
|
|
58
61
|
|
|
59
62
|
// Per-instance DYNAMIC mint limiter (W6 hardening): keyed by (widgetKey + IP) so each widget
|
|
60
63
|
// deployment gets its own bucket and one abusive IP can't exhaust a shared instance's budget for
|
|
@@ -80,7 +83,7 @@ export function CreateWidgetHandler(publicUrl: string, config: WidgetConfig): {
|
|
|
80
83
|
await handleMint(service, req, res, false);
|
|
81
84
|
});
|
|
82
85
|
|
|
83
|
-
publicRouter.post(
|
|
86
|
+
publicRouter.post(WIDGET_REFRESH_PATH, json(), mintLimiter, async (req: Request, res: Response) => {
|
|
84
87
|
await handleMint(service, req, res, true);
|
|
85
88
|
});
|
|
86
89
|
|
|
@@ -171,14 +174,26 @@ async function handleUpgrade(service: WidgetSessionService, req: Request, res: R
|
|
|
171
174
|
res.status(status).json(result);
|
|
172
175
|
}
|
|
173
176
|
|
|
177
|
+
/** Extracts a raw JWT from an `Authorization: Bearer <token>` header, or undefined when absent/malformed. */
|
|
178
|
+
function extractBearerToken(authHeader: string | undefined): string | undefined {
|
|
179
|
+
if (!authHeader) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
const match = /^Bearer\s+(\S+)$/i.exec(authHeader.trim());
|
|
183
|
+
const token = match?.[1]?.trim();
|
|
184
|
+
return token && token.length > 0 ? token : undefined;
|
|
185
|
+
}
|
|
186
|
+
|
|
174
187
|
/** Shared mint/refresh handler — parses the request, calls the service, maps the status. */
|
|
175
188
|
async function handleMint(service: WidgetSessionService, req: Request, res: Response, refresh: boolean): Promise<void> {
|
|
176
|
-
const body = (req.body ?? {}) as { widgetKey?: string; hostAssertion?: string; visitorKey?: string };
|
|
189
|
+
const body = (req.body ?? {}) as { widgetKey?: string; hostAssertion?: string; visitorKey?: string; proofKey?: unknown };
|
|
177
190
|
const widgetKey = typeof body.widgetKey === 'string' ? body.widgetKey : '';
|
|
178
191
|
if (!widgetKey) {
|
|
179
192
|
res.status(400).json({ success: false, errorCode: 'not_found', error: 'widgetKey is required.' });
|
|
180
193
|
return;
|
|
181
194
|
}
|
|
195
|
+
// The service validates the key's shape (ToProofPublicJwk) and refuses anything that is not a public P-256 JWK.
|
|
196
|
+
const proofKey = body.proofKey === undefined ? undefined : (body.proofKey as ProofPublicJwk);
|
|
182
197
|
|
|
183
198
|
// W6 hardening: coarse bot/automation rejection before any DB lookup or token mint. Returns the same
|
|
184
199
|
// 403 as a policy rejection so a probe can't distinguish "bot-blocked" from "bad key/origin".
|
|
@@ -193,6 +208,9 @@ async function handleMint(service: WidgetSessionService, req: Request, res: Resp
|
|
|
193
208
|
origin,
|
|
194
209
|
hostAssertion: typeof body.hostAssertion === 'string' ? body.hostAssertion : undefined,
|
|
195
210
|
visitorKey: typeof body.visitorKey === 'string' ? body.visitorKey : undefined,
|
|
211
|
+
BearerToken: refresh ? extractBearerToken(req.get('authorization')) : undefined,
|
|
212
|
+
Proof: refresh ? req.get('dpop') : undefined,
|
|
213
|
+
ProofKey: refresh ? undefined : proofKey,
|
|
196
214
|
audit: { ipAddress: req.ip, userAgent: req.get('user-agent') ?? undefined, origin },
|
|
197
215
|
};
|
|
198
216
|
const result = refresh ? await service.RefreshGuestSession(input) : await service.MintGuestSession(input);
|