@memberjunction/server 6.2.0-edge.5 → 6.2.0-edge.7
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 +96 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
- package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
- package/dist/agentSessions/BridgeHostInstance.js +14 -4
- package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
- package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
- package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
- package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
- package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +34 -11
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +88 -44
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +29 -9
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +62 -16
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
- package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
- package/dist/agentSessions/conversationBrowsers.js +118 -0
- package/dist/agentSessions/conversationBrowsers.js.map +1 -0
- package/dist/agentSessions/sessionDeadline.d.ts +43 -0
- package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
- package/dist/agentSessions/sessionDeadline.js +68 -0
- package/dist/agentSessions/sessionDeadline.js.map +1 -0
- package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
- package/dist/auth/APIKeyScopeAuth.js +5 -4
- package/dist/auth/APIKeyScopeAuth.js.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +2 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +51 -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/loginEmailResolution.d.ts +41 -0
- package/dist/auth/loginEmailResolution.d.ts.map +1 -0
- package/dist/auth/loginEmailResolution.js +47 -0
- package/dist/auth/loginEmailResolution.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +221 -9
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/index.d.ts +1 -1
- package/dist/auth/magicLink/index.d.ts.map +1 -1
- package/dist/auth/magicLink/index.js +1 -1
- package/dist/auth/magicLink/index.js.map +1 -1
- package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
- package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
- package/dist/auth/magicLink/redeemLanding.js +7 -4
- package/dist/auth/magicLink/redeemLanding.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +39 -3
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/magicLink/types.js +0 -4
- package/dist/auth/magicLink/types.js.map +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +1 -0
- package/dist/auth/newUsers.js.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/backgroundSweepConfigUnits.d.ts +231 -0
- package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
- package/dist/backgroundSweepConfigUnits.js +180 -0
- package/dist/backgroundSweepConfigUnits.js.map +1 -0
- 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 +1402 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +5 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +64 -12
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +3 -1
- package/dist/coreRoutes.d.ts.map +1 -1
- package/dist/coreRoutes.js +20 -4
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +4167 -62
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +154 -79
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
- 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 +93 -11
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +114 -29
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +509 -220
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +15 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +126 -20
- 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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +262 -84
- package/dist/index.js.map +1 -1
- package/dist/integration/ConnectionPause.d.ts +121 -0
- package/dist/integration/ConnectionPause.d.ts.map +1 -0
- package/dist/integration/ConnectionPause.js +183 -0
- package/dist/integration/ConnectionPause.js.map +1 -0
- package/dist/integration/CustomColumnPromoter.d.ts +72 -6
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +93 -47
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/integration/EntityMapLifecycle.d.ts +78 -4
- package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
- package/dist/integration/EntityMapLifecycle.js +199 -5
- package/dist/integration/EntityMapLifecycle.js.map +1 -1
- package/dist/integration/InactiveRowWarnings.d.ts +31 -0
- package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
- package/dist/integration/InactiveRowWarnings.js +29 -0
- package/dist/integration/InactiveRowWarnings.js.map +1 -1
- package/dist/integration/ObjectNamesByID.d.ts +28 -0
- package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
- package/dist/integration/ObjectNamesByID.js +87 -0
- package/dist/integration/ObjectNamesByID.js.map +1 -0
- package/dist/integration/PostRestartIntrospect.d.ts +26 -0
- package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
- package/dist/integration/PostRestartIntrospect.js +27 -0
- package/dist/integration/PostRestartIntrospect.js.map +1 -0
- package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
- package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
- package/dist/integration/RSUPostRestartProgress.js +323 -0
- package/dist/integration/RSUPostRestartProgress.js.map +1 -0
- package/dist/integration/RSUProgressBridge.d.ts +41 -2
- package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
- package/dist/integration/RSUProgressBridge.js +84 -1
- package/dist/integration/RSUProgressBridge.js.map +1 -1
- package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
- package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
- package/dist/integration/RunArtifactAuthorization.js +45 -0
- package/dist/integration/RunArtifactAuthorization.js.map +1 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
- package/dist/integration/SchemaRefreshLaunch.js +3 -2
- package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
- package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
- package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
- package/dist/integration/ScopedFieldsForBuild.js +91 -0
- package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
- package/dist/integration/TargetConfigGuard.d.ts +40 -0
- package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
- package/dist/integration/TargetConfigGuard.js +40 -0
- package/dist/integration/TargetConfigGuard.js.map +1 -0
- 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/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/ownedRealtimeSession.d.ts +8 -6
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +147 -22
- 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 +203 -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/visitorIdentity.d.ts.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.js +1 -0
- package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +21 -8
- 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 +3 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/requestOrigin.d.ts +22 -0
- package/dist/requestOrigin.d.ts.map +1 -0
- package/dist/requestOrigin.js +60 -0
- package/dist/requestOrigin.js.map +1 -0
- 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 +44 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.js +2 -1
- package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
- package/dist/resolvers/ConversationRunEventsResolver.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/ExecuteRemoteOperationResolver.d.ts +6 -0
- package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
- package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
- package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
- 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 +5 -0
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +13 -4
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +34 -13
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +13 -2
- package/dist/resolvers/MCPResolver.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.map +1 -1
- package/dist/resolvers/QueryResolver.js +20 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +184 -88
- 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/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +388 -125
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +19 -18
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +7 -5
- 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/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +4 -0
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +1 -0
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +60 -15
- 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/meetingRecordingRegistration.d.ts.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.js +2 -0
- package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
- 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/MediaAccessKeys.d.ts.map +1 -1
- package/dist/rest/MediaAccessKeys.js +6 -2
- package/dist/rest/MediaAccessKeys.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +11 -5
- package/dist/rest/OAuthCallbackHandler.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 +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +6 -8
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +6 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +24 -6
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +3 -1
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +11 -2
- package/dist/rest/setupRESTEndpoints.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/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +2 -26
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +38 -0
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/services/WorkQueueHostService.d.ts +2 -1
- package/dist/services/WorkQueueHostService.d.ts.map +1 -1
- package/dist/services/WorkQueueHostService.js +19 -4
- package/dist/services/WorkQueueHostService.js.map +1 -1
- package/dist/services/workQueueConfig.d.ts +2 -2
- package/dist/services/workQueueConfig.js +5 -5
- package/dist/services/workQueueConfig.js.map +1 -1
- package/dist/sharedCache.js +1 -1
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +40 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +98 -98
- package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/ActiveOperations.test.ts +68 -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 +150 -0
- package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
- package/src/__tests__/BatchApplyParity.test.ts +109 -0
- package/src/__tests__/BridgeHostInstance.test.ts +42 -0
- package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
- package/src/__tests__/ConnectionPause.test.ts +192 -0
- package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
- package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
- package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
- package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
- package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
- package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
- package/src/__tests__/MagicLinkKeys.test.ts +102 -0
- package/src/__tests__/MediaAccessKeys.test.ts +57 -10
- package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
- package/src/__tests__/ObjectNamesByID.test.ts +176 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
- package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
- package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
- package/src/__tests__/RSUProgressBridge.test.ts +188 -5
- package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
- package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
- package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
- package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -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 +72 -13
- package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
- package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
- package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
- package/src/__tests__/SessionJanitor.test.ts +195 -4
- package/src/__tests__/SessionManager.test.ts +164 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
- package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/WorkQueueHostService.test.ts +25 -7
- package/src/__tests__/apiRootBoot.test.ts +1 -1
- package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
- package/src/__tests__/contextRequestOrigin.test.ts +105 -0
- package/src/__tests__/conversationBrowsers.test.ts +62 -0
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +3 -3
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
- package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
- 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 +224 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/requestOrigin.test.ts +104 -0
- 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__/securityHardeningPr6034.test.ts +120 -0
- package/src/__tests__/sessionDeadline.test.ts +51 -0
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/sharedCache.test.ts +11 -0
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +101 -1
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/BridgeHostInstance.ts +20 -5
- package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
- package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
- package/src/agentSessions/SessionJanitor.ts +95 -45
- package/src/agentSessions/SessionManager.ts +73 -20
- package/src/agentSessions/conversationBrowsers.ts +143 -0
- package/src/agentSessions/sessionDeadline.ts +81 -0
- package/src/auth/APIKeyScopeAuth.ts +5 -4
- package/src/auth/AuthProviderCatalogRouter.ts +3 -0
- package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
- package/src/auth/index.ts +56 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/loginEmailResolution.ts +67 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
- package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
- package/src/auth/magicLink/MagicLinkService.ts +250 -10
- package/src/auth/magicLink/index.ts +1 -1
- package/src/auth/magicLink/redeemLanding.ts +7 -4
- package/src/auth/magicLink/types.ts +38 -3
- package/src/auth/newUsers.ts +1 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/backgroundSweepConfigUnits.ts +213 -0
- 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 +138 -0
- package/src/context.ts +71 -14
- package/src/coreRoutes.ts +29 -7
- package/src/generated/graphql-schemas/__mj.ts +4145 -1193
- package/src/generic/CacheInvalidationResolver.ts +135 -78
- package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +108 -11
- package/src/generic/ResolverBase.ts +635 -234
- package/src/generic/RunViewResolver.ts +176 -64
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/index.ts +310 -85
- package/src/integration/ConnectionPause.ts +222 -0
- package/src/integration/CustomColumnPromoter.ts +129 -54
- package/src/integration/EntityMapLifecycle.ts +229 -6
- package/src/integration/InactiveRowWarnings.ts +50 -0
- package/src/integration/ObjectNamesByID.ts +97 -0
- package/src/integration/PostRestartIntrospect.ts +49 -0
- package/src/integration/RSUPostRestartProgress.ts +359 -0
- package/src/integration/RSUProgressBridge.ts +85 -2
- package/src/integration/RunArtifactAuthorization.ts +65 -0
- package/src/integration/SchemaRefreshLaunch.ts +12 -2
- package/src/integration/ScopedFieldsForBuild.ts +113 -0
- package/src/integration/TargetConfigGuard.ts +71 -0
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
- package/src/realtimeSessions/sessionAccess.ts +211 -25
- 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 +254 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/visitorIdentity.ts +1 -0
- package/src/realtimeWidget/widgetCore.ts +34 -9
- package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
- package/src/requestOrigin.ts +64 -0
- 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 +50 -18
- package/src/resolvers/AutotagPipelineResolver.ts +2 -1
- package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
- package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +14 -4
- package/src/resolvers/GetDataResolver.ts +35 -13
- package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
- package/src/resolvers/MCPResolver.ts +15 -2
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +20 -6
- package/src/resolvers/QuerySystemUserResolver.ts +207 -99
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
- package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
- package/src/resolvers/RunAIAgentResolver.ts +518 -163
- package/src/resolvers/RunAIPromptResolver.ts +18 -18
- package/src/resolvers/RunTemplateResolver.ts +9 -5
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TestQuerySQLResolver.ts +1 -0
- package/src/resolvers/TransactionGroupResolver.ts +66 -15
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/resolvers/meetingRecordingRegistration.ts +2 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/MediaAccessKeys.ts +6 -2
- package/src/rest/OAuthCallbackHandler.ts +13 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +9 -10
- package/src/rest/ViewOperationsHandler.ts +26 -7
- package/src/rest/setupRESTEndpoints.ts +11 -2
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
- package/src/services/TaskGraphActionRunner.ts +2 -23
- package/src/services/TaskGraphAgentRunner.ts +43 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
- package/src/services/WorkQueueHostService.ts +26 -4
- package/src/services/workQueueConfig.ts +5 -5
- package/src/sharedCache.ts +1 -1
- package/src/types.ts +41 -1
- package/src/services/TaskOrchestration-Integration.md +0 -188
|
@@ -12,13 +12,13 @@ const REMOTE_OP_PROGRESS_TOPIC = 'RemoteOperationProgress';
|
|
|
12
12
|
/** Input for the generic Remote Operation transport mutation. */
|
|
13
13
|
@InputType()
|
|
14
14
|
export class ExecuteRemoteOperationInput {
|
|
15
|
-
@Field()
|
|
15
|
+
@Field(() => String)
|
|
16
16
|
operationKey: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
17
17
|
|
|
18
|
-
@Field()
|
|
18
|
+
@Field(() => String)
|
|
19
19
|
inputJSON: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
20
20
|
|
|
21
|
-
@Field()
|
|
21
|
+
@Field(() => String)
|
|
22
22
|
invokeMode: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
23
23
|
|
|
24
24
|
/**
|
|
@@ -28,16 +28,24 @@ export class ExecuteRemoteOperationInput {
|
|
|
28
28
|
*/
|
|
29
29
|
@Field(() => String, { nullable: true })
|
|
30
30
|
progressChannelId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Optional structural contract fingerprint emitted by CodeGen (or supplied by the caller).
|
|
34
|
+
* When provided, the server rejects requests whose fingerprint diverges from the server's
|
|
35
|
+
* active operation contract with `ResultCode = 'CONTRACT_MISMATCH'`.
|
|
36
|
+
*/
|
|
37
|
+
@Field(() => String, { nullable: true })
|
|
38
|
+
contractFingerprint?: string; // case-violation-ok-legacy-back-compat: matches camelCase GraphQL input field convention on ExecuteRemoteOperationInput
|
|
31
39
|
}
|
|
32
40
|
|
|
33
41
|
/** A single streamed progress envelope delivered over the `RemoteOperationProgress` subscription. */
|
|
34
42
|
@ObjectType()
|
|
35
43
|
export class RemoteOperationProgressNotification {
|
|
36
|
-
@Field()
|
|
44
|
+
@Field(() => String)
|
|
37
45
|
ChannelId: string;
|
|
38
46
|
|
|
39
47
|
/** JSON-serialized {@link RemoteOpProgress}. */
|
|
40
|
-
@Field()
|
|
48
|
+
@Field(() => String)
|
|
41
49
|
ProgressJSON: string;
|
|
42
50
|
}
|
|
43
51
|
|
|
@@ -71,7 +79,7 @@ export class ExecuteRemoteOperationResultType {
|
|
|
71
79
|
export class ExecuteRemoteOperationResolver extends ResolverBase {
|
|
72
80
|
@Mutation(() => ExecuteRemoteOperationResultType)
|
|
73
81
|
async ExecuteRemoteOperation(
|
|
74
|
-
@Arg('input') input: ExecuteRemoteOperationInput,
|
|
82
|
+
@Arg('input', () => ExecuteRemoteOperationInput) input: ExecuteRemoteOperationInput,
|
|
75
83
|
@Ctx() ctx: AppContext,
|
|
76
84
|
@PubSub() pubSub: PubSubEngine,
|
|
77
85
|
): Promise<ExecuteRemoteOperationResultType> {
|
|
@@ -111,9 +119,24 @@ export class ExecuteRemoteOperationResolver extends ResolverBase {
|
|
|
111
119
|
return fail(invokability.ResultCode ?? 'OPERATION_UNAVAILABLE', invokability.Reason ?? `Operation '${key}' is unavailable`);
|
|
112
120
|
}
|
|
113
121
|
|
|
114
|
-
|
|
122
|
+
// (5) Contract fingerprint gate: when the client sends a contractFingerprint, verify it against
|
|
123
|
+
// the active server operation's ContractFingerprint (or metadata-derived fingerprint) so stale
|
|
124
|
+
// client bundles fail loudly with CONTRACT_MISMATCH rather than mis-deserializing.
|
|
125
|
+
const clientFingerprint = input.contractFingerprint?.trim();
|
|
126
|
+
if (clientFingerprint) {
|
|
127
|
+
const expectedFingerprint =
|
|
128
|
+
opDecl?.ContractFingerprint ?? RemoteOperationEngineBase.Instance.GetContractFingerprint(key);
|
|
129
|
+
if (expectedFingerprint && clientFingerprint !== expectedFingerprint) {
|
|
130
|
+
return fail(
|
|
131
|
+
'CONTRACT_MISMATCH',
|
|
132
|
+
`Contract fingerprint mismatch for operation '${key}' (client='${clientFingerprint}', server='${expectedFingerprint}')`,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let parsedInput: object | string | number | boolean | null;
|
|
115
138
|
try {
|
|
116
|
-
parsedInput = input.inputJSON ? JSON.parse(input.inputJSON) : {};
|
|
139
|
+
parsedInput = input.inputJSON ? (JSON.parse(input.inputJSON) as object | string | number | boolean | null) : {};
|
|
117
140
|
} catch (e) {
|
|
118
141
|
return fail('INVALID_INPUT_JSON', `Invalid input JSON: ${e instanceof Error ? e.message : String(e)}`);
|
|
119
142
|
}
|
|
@@ -127,7 +150,16 @@ export class ExecuteRemoteOperationResolver extends ResolverBase {
|
|
|
127
150
|
: undefined;
|
|
128
151
|
|
|
129
152
|
// Route through the per-request provider (server in-process path; runs the op's Authorize + InternalExecute).
|
|
130
|
-
const result = await provider.RouteOperation(key, parsedInput, {
|
|
153
|
+
const result = await provider.RouteOperation(key, parsedInput, {
|
|
154
|
+
user,
|
|
155
|
+
mode: input.invokeMode as RemoteOpInvokeMode,
|
|
156
|
+
onProgress,
|
|
157
|
+
contractFingerprint: clientFingerprint,
|
|
158
|
+
requestOrigin: ctx.RequestOrigin,
|
|
159
|
+
clientIp: ctx.ClientIp,
|
|
160
|
+
sessionId: ctx.userPayload?.sessionId,
|
|
161
|
+
apiKeyHash: ctx.userPayload?.apiKeyHash,
|
|
162
|
+
});
|
|
131
163
|
|
|
132
164
|
return {
|
|
133
165
|
success: result.Success,
|
|
@@ -50,6 +50,12 @@ type LabelledVector = { row: StoredVectorRow; labels: Record<string, string> };
|
|
|
50
50
|
/** Most Entity Record Document IDs named in one `ID IN (...)` filter when fetching VectorJSON. */
|
|
51
51
|
const VECTOR_FETCH_CHUNK_SIZE = 1000;
|
|
52
52
|
|
|
53
|
+
/** Most record keys named in one view when checking which matched records the caller may read. */
|
|
54
|
+
const READABLE_KEY_CHECK_CHUNK_SIZE = 1000;
|
|
55
|
+
|
|
56
|
+
/** A match returned by an external vector index's `QueryIndex`. */
|
|
57
|
+
type IndexMatch = { id: string; values?: number[]; metadata?: Record<string, unknown>; score?: number };
|
|
58
|
+
|
|
53
59
|
/* ───── Resolver ───── */
|
|
54
60
|
|
|
55
61
|
@Resolver()
|
|
@@ -70,15 +76,18 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
70
76
|
}
|
|
71
77
|
|
|
72
78
|
const limit = maxRecords ?? 1000;
|
|
79
|
+
// Every read runs on this request's provider.
|
|
80
|
+
const md = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? Metadata.Provider;
|
|
81
|
+
const rv = RunView.FromMetadataProvider(md);
|
|
73
82
|
|
|
74
83
|
// Step 1: Load the EntityDocument
|
|
75
|
-
const entityDoc = await this.loadEntityDocument(entityDocumentID, currentUser);
|
|
84
|
+
const entityDoc = await this.loadEntityDocument(entityDocumentID, currentUser, rv);
|
|
76
85
|
if (!entityDoc) {
|
|
77
86
|
return this.errorResult(`EntityDocument not found: ${entityDocumentID}`, startTime);
|
|
78
87
|
}
|
|
79
88
|
|
|
80
89
|
// Step 2: Resolve the VectorIndex
|
|
81
|
-
const vectorIndex = await this.resolveVectorIndex(entityDoc, currentUser);
|
|
90
|
+
const vectorIndex = await this.resolveVectorIndex(entityDoc, currentUser, rv);
|
|
82
91
|
if (!vectorIndex) {
|
|
83
92
|
return this.errorResult(
|
|
84
93
|
`Could not resolve VectorIndex for EntityDocument "${entityDoc.Name}"`,
|
|
@@ -87,7 +96,7 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
87
96
|
}
|
|
88
97
|
|
|
89
98
|
// Step 3: Create VectorDB provider instance
|
|
90
|
-
const vectorDBInstance = await this.createVectorDBInstance(vectorIndex, currentUser);
|
|
99
|
+
const vectorDBInstance = await this.createVectorDBInstance(vectorIndex, currentUser, rv);
|
|
91
100
|
if (!vectorDBInstance) {
|
|
92
101
|
return this.errorResult(
|
|
93
102
|
`Could not create VectorDB provider for index "${vectorIndex.Name}"`,
|
|
@@ -100,12 +109,21 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
100
109
|
// document ID rather than the index name, and return matches without vector values.
|
|
101
110
|
// Read the stored Entity Record Document rows instead.
|
|
102
111
|
if (vectorDBInstance.QueryKeyIsEntityDocumentID) {
|
|
103
|
-
const
|
|
104
|
-
const results = await this.fetchStoredVectors(entityDoc, limit, filter, currentUser, md);
|
|
112
|
+
const results = await this.fetchStoredVectors(entityDoc, limit, filter, currentUser, md, rv);
|
|
105
113
|
LogStatus(`FetchEntityVectors: Loaded ${results.length} stored vectors for entity "${entityDoc.Entity}" in ${Date.now() - startTime}ms`);
|
|
106
114
|
return { Success: true, Results: results, TotalCount: results.length, ElapsedMs: Date.now() - startTime };
|
|
107
115
|
}
|
|
108
116
|
|
|
117
|
+
// The external index was built under whoever ran the sync and is not filtered for this
|
|
118
|
+
// caller, so check here that they may read the source entity at all.
|
|
119
|
+
const entityInfo = this.readableEntity(entityDoc.Entity, currentUser, md);
|
|
120
|
+
if (!entityInfo) {
|
|
121
|
+
return this.errorResult(
|
|
122
|
+
`Entity "${entityDoc.Entity}" does not exist or you do not have permission to read it`,
|
|
123
|
+
startTime
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
109
127
|
// Step 4: Query with zero vector + Entity metadata filter.
|
|
110
128
|
// Pinecone's list API doesn't support metadata filtering, but query does.
|
|
111
129
|
// A zero vector returns results in arbitrary order (similarity is meaningless),
|
|
@@ -136,12 +154,15 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
136
154
|
);
|
|
137
155
|
}
|
|
138
156
|
|
|
139
|
-
// Step 5:
|
|
140
|
-
|
|
157
|
+
// Step 5: Keep only matches for records this caller may read (the index is not filtered
|
|
158
|
+
// by row-level security), then convert them without the fields this caller may not read
|
|
159
|
+
const allMatches = (queryResponse.data as { matches?: IndexMatch[] }).matches ?? [];
|
|
160
|
+
const matches = await this.readableMatches(entityInfo, allMatches, currentUser, rv);
|
|
161
|
+
const denied = entityInfo.GetDeniedReadFields(currentUser);
|
|
141
162
|
const results: EntityVectorItem[] = matches.map(match => ({
|
|
142
163
|
ID: match.id,
|
|
143
164
|
Values: match.values ?? [],
|
|
144
|
-
Metadata: JSON.stringify(match.metadata ?? {}),
|
|
165
|
+
Metadata: JSON.stringify(this.withoutDeniedFields(match.metadata ?? {}, denied)),
|
|
145
166
|
}));
|
|
146
167
|
LogStatus(`FetchEntityVectors: Queried ${results.length} vectors for entity "${entityName}" in ${Date.now() - startTime}ms`);
|
|
147
168
|
|
|
@@ -158,12 +179,100 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
158
179
|
}
|
|
159
180
|
}
|
|
160
181
|
|
|
182
|
+
/**
|
|
183
|
+
* The entity's metadata when `contextUser` may read it, else null — whether it is missing or
|
|
184
|
+
* unreadable is deliberately not distinguished.
|
|
185
|
+
*/
|
|
186
|
+
private readableEntity(entityName: string, contextUser: UserInfo, md: IMetadataProvider): EntityInfo | null {
|
|
187
|
+
const entityInfo = md.EntityByName(entityName);
|
|
188
|
+
if (!entityInfo) return null;
|
|
189
|
+
return entityInfo.GetUserPermisions(contextUser)?.CanRead ? entityInfo : null;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The matches whose record `contextUser` may read, in their original order. A match is kept only
|
|
194
|
+
* when its `RecordID` metadata names a key of the entity and a view run as `contextUser` returns
|
|
195
|
+
* that record; a match without a usable record ID cannot be checked, so it is dropped.
|
|
196
|
+
*/
|
|
197
|
+
private async readableMatches(entityInfo: EntityInfo, matches: IndexMatch[], contextUser: UserInfo, rv: RunView): Promise<IndexMatch[]> {
|
|
198
|
+
const keyed = matches
|
|
199
|
+
.map(match => ({ match, key: this.matchRecordKey(entityInfo, match) }))
|
|
200
|
+
.filter((m): m is { match: IndexMatch; key: CompositeKey } => m.key !== null);
|
|
201
|
+
if (keyed.length === 0) return [];
|
|
202
|
+
const readable = await this.loadReadableKeys(entityInfo, keyed.map(k => k.key), contextUser, rv);
|
|
203
|
+
return keyed.filter(k => readable.has(this.canonicalKey(k.key))).map(k => k.match);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** The record key a match's `RecordID` metadata names, or null when it names no key of the entity. */
|
|
207
|
+
private matchRecordKey(entityInfo: EntityInfo, match: IndexMatch): CompositeKey | null {
|
|
208
|
+
const recordID = match.metadata?.RecordID;
|
|
209
|
+
if (typeof recordID !== 'string' || recordID.length === 0) return null;
|
|
210
|
+
try {
|
|
211
|
+
return CompositeKey.FromRecordID(entityInfo, recordID);
|
|
212
|
+
} catch {
|
|
213
|
+
return null; // field names that are not the entity's primary key: never put into SQL
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* The canonical forms of the keys among `keys` whose record a view run as `contextUser` returns.
|
|
219
|
+
* The keys are checked in lists of at most {@link READABLE_KEY_CHECK_CHUNK_SIZE}, all sent in one
|
|
220
|
+
* `RunViews` batch.
|
|
221
|
+
*/
|
|
222
|
+
private async loadReadableKeys(entityInfo: EntityInfo, keys: CompositeKey[], contextUser: UserInfo, rv: RunView): Promise<Set<string>> {
|
|
223
|
+
const views: RunViewParams[] = [];
|
|
224
|
+
for (let i = 0; i < keys.length; i += READABLE_KEY_CHECK_CHUNK_SIZE) {
|
|
225
|
+
views.push({
|
|
226
|
+
EntityName: entityInfo.Name,
|
|
227
|
+
ExtraFilter: this.keyFilter(entityInfo, keys.slice(i, i + READABLE_KEY_CHECK_CHUNK_SIZE)),
|
|
228
|
+
Fields: entityInfo.PrimaryKeys.map(pk => pk.Name),
|
|
229
|
+
IgnoreMaxRows: true,
|
|
230
|
+
BypassCache: true, // one-off key lists: a cache slot per call would only hold memory
|
|
231
|
+
ResultType: 'simple',
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
const readable = new Set<string>();
|
|
235
|
+
const results = await rv.RunViews<Record<string, unknown>>(views, contextUser);
|
|
236
|
+
for (const result of results) {
|
|
237
|
+
if (!result.Success) {
|
|
238
|
+
throw new Error(`Failed to check access to "${entityInfo.Name}" records: ${result.ErrorMessage}`);
|
|
239
|
+
}
|
|
240
|
+
for (const row of result.Results) {
|
|
241
|
+
readable.add(this.canonicalKey(CompositeKey.FromEntityRecord(entityInfo, row)));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return readable;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** A filter matching exactly `keys`: `PK IN (...)` for a single-column key, one clause per key otherwise. */
|
|
248
|
+
private keyFilter(entityInfo: EntityInfo, keys: CompositeKey[]): string {
|
|
249
|
+
if (entityInfo.PrimaryKeys.length === 1) {
|
|
250
|
+
const values = keys.map(k => `'${EscapeSQLString(String(k.KeyValuePairs[0].Value))}'`).join(',');
|
|
251
|
+
return `${entityInfo.FirstPrimaryKey.Name} IN (${values})`; // first-pk-ok: single-column key, checked above
|
|
252
|
+
}
|
|
253
|
+
return keys.map(k => `(${k.ToWhereClause()})`).join(' OR ');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** A key's field names and values, lower-cased, so keys from the index and from a view compare equal. */
|
|
257
|
+
private canonicalKey(key: CompositeKey): string {
|
|
258
|
+
return key.KeyValuePairs.map(kv => `${kv.FieldName.toLowerCase()}|${String(kv.Value).toLowerCase()}`).join('||');
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* A copy of a vector's metadata without the keys naming fields in `denied` (lowercased field
|
|
263
|
+
* names, as `EntityInfo.GetDeniedReadFields` returns them), compared case-insensitively.
|
|
264
|
+
*/
|
|
265
|
+
private withoutDeniedFields(metadata: Record<string, unknown>, denied: Set<string>): Record<string, unknown> {
|
|
266
|
+
if (denied.size === 0) return metadata;
|
|
267
|
+
return Object.fromEntries(Object.entries(metadata).filter(([key]) => !denied.has(key.toLowerCase())));
|
|
268
|
+
}
|
|
269
|
+
|
|
161
270
|
/** Load EntityDocument by ID */
|
|
162
271
|
private async loadEntityDocument(
|
|
163
272
|
entityDocumentID: string,
|
|
164
|
-
contextUser: UserInfo
|
|
273
|
+
contextUser: UserInfo,
|
|
274
|
+
rv: RunView
|
|
165
275
|
): Promise<MJEntityDocumentEntity | null> {
|
|
166
|
-
const rv = new RunView();
|
|
167
276
|
const result = await rv.RunView<MJEntityDocumentEntity>({
|
|
168
277
|
EntityName: 'MJ: Entity Documents',
|
|
169
278
|
ExtraFilter: `ID='${EscapeSQLString(entityDocumentID)}'`,
|
|
@@ -183,9 +292,9 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
183
292
|
*/
|
|
184
293
|
private async resolveVectorIndex(
|
|
185
294
|
entityDoc: MJEntityDocumentEntity,
|
|
186
|
-
contextUser: UserInfo
|
|
295
|
+
contextUser: UserInfo,
|
|
296
|
+
rv: RunView
|
|
187
297
|
): Promise<MJVectorIndexEntity | null> {
|
|
188
|
-
const rv = new RunView();
|
|
189
298
|
|
|
190
299
|
// If the EntityDocument has an explicit VectorIndexID, use it directly
|
|
191
300
|
if (entityDoc.VectorIndexID) {
|
|
@@ -222,9 +331,9 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
222
331
|
/** Create a VectorDBBase provider instance for a given VectorIndex */
|
|
223
332
|
private async createVectorDBInstance(
|
|
224
333
|
vectorIndex: MJVectorIndexEntity,
|
|
225
|
-
contextUser: UserInfo
|
|
334
|
+
contextUser: UserInfo,
|
|
335
|
+
rv: RunView
|
|
226
336
|
): Promise<VectorDBBase | null> {
|
|
227
|
-
const rv = new RunView();
|
|
228
337
|
const dbResult = await rv.RunView<MJVectorDatabaseEntity>({
|
|
229
338
|
EntityName: 'MJ: Vector Databases',
|
|
230
339
|
ExtraFilter: `ID='${vectorIndex.VectorDatabaseID}'`,
|
|
@@ -258,19 +367,20 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
258
367
|
limit: number,
|
|
259
368
|
filter: string | undefined,
|
|
260
369
|
contextUser: UserInfo,
|
|
261
|
-
md: IMetadataProvider
|
|
370
|
+
md: IMetadataProvider,
|
|
371
|
+
rv: RunView
|
|
262
372
|
): Promise<EntityVectorItem[]> {
|
|
263
373
|
const entityInfo = md.EntityByName(entityDoc.Entity);
|
|
264
374
|
if (!entityInfo) {
|
|
265
375
|
throw new Error(`Entity "${entityDoc.Entity}" not found in metadata`);
|
|
266
376
|
}
|
|
267
377
|
const nameFields = this.labelFieldNames(entityInfo);
|
|
268
|
-
const { records, vectors } = await this.loadRecordsAndStoredVectors(entityInfo, entityDoc, nameFields, filter, contextUser);
|
|
378
|
+
const { records, vectors } = await this.loadRecordsAndStoredVectors(entityInfo, entityDoc, nameFields, filter, contextUser, rv);
|
|
269
379
|
const labelsByRecordID = this.mapRecordLabels(entityInfo, nameFields, records);
|
|
270
380
|
|
|
271
381
|
// VectorJSON is the heavy column: list without it, then fetch it only for the items returned.
|
|
272
382
|
const chosen = this.selectLabelledVectors(vectors, labelsByRecordID, limit);
|
|
273
|
-
const valuesByID = await this.loadVectorValues(chosen.map(c => c.row.ID), contextUser);
|
|
383
|
+
const valuesByID = await this.loadVectorValues(chosen.map(c => c.row.ID), contextUser, rv);
|
|
274
384
|
|
|
275
385
|
const results: EntityVectorItem[] = [];
|
|
276
386
|
for (const { row, labels } of chosen) {
|
|
@@ -305,7 +415,7 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
305
415
|
* Fetch `VectorJSON` for the given Entity Record Document IDs, keyed by ID. The ID lists are
|
|
306
416
|
* capped at {@link VECTOR_FETCH_CHUNK_SIZE} per view and all sent in one `RunViews` batch.
|
|
307
417
|
*/
|
|
308
|
-
private async loadVectorValues(ids: string[], contextUser: UserInfo): Promise<Map<string, string>> {
|
|
418
|
+
private async loadVectorValues(ids: string[], contextUser: UserInfo, rv: RunView): Promise<Map<string, string>> {
|
|
309
419
|
const valuesByID = new Map<string, string>();
|
|
310
420
|
if (ids.length === 0) return valuesByID;
|
|
311
421
|
|
|
@@ -321,7 +431,7 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
321
431
|
ResultType: 'simple',
|
|
322
432
|
});
|
|
323
433
|
}
|
|
324
|
-
const results = await
|
|
434
|
+
const results = await rv.RunViews<{ ID: string; VectorJSON: string | null }>(views, contextUser);
|
|
325
435
|
for (const result of results) {
|
|
326
436
|
if (!result.Success) {
|
|
327
437
|
throw new Error(`Failed to load vector values: ${result.ErrorMessage}`);
|
|
@@ -352,10 +462,11 @@ export class FetchEntityVectorsResolver extends ResolverBase {
|
|
|
352
462
|
entityDoc: MJEntityDocumentEntity,
|
|
353
463
|
nameFields: string[],
|
|
354
464
|
filter: string | undefined,
|
|
355
|
-
contextUser: UserInfo
|
|
465
|
+
contextUser: UserInfo,
|
|
466
|
+
rv: RunView
|
|
356
467
|
): Promise<{ records: Record<string, unknown>[]; vectors: StoredVectorRow[] }> {
|
|
357
468
|
const keyFields = entityInfo.PrimaryKeys.map(pk => pk.Name);
|
|
358
|
-
const [recordResult, docResult] = await
|
|
469
|
+
const [recordResult, docResult] = await rv.RunViews<Record<string, unknown>>([
|
|
359
470
|
{
|
|
360
471
|
EntityName: entityInfo.Name,
|
|
361
472
|
ExtraFilter: filter || undefined,
|
|
@@ -34,6 +34,7 @@ export class FileCategoryResolver extends FileCategoryResolverBase {
|
|
|
34
34
|
fileCategoryEntity.CheckPermissions(EntityPermissionType.Delete, true);
|
|
35
35
|
|
|
36
36
|
await fileCategoryEntity.Load(ID);
|
|
37
|
+
// fls-guard: loaded as the caller; width follows its user
|
|
37
38
|
const returnValue = fileCategoryEntity.GetAll();
|
|
38
39
|
|
|
39
40
|
// Any files using the deleted category fall back to its parent
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityPermissionType, FieldValueCollection, EntitySaveOptions, IMetadataProvider, LogError, UserInfo } from '@memberjunction/core';
|
|
1
|
+
import { AssertClientInputWritableForUser, EntityPermissionType, FieldValueCollection, EntitySaveOptions, IMetadataProvider, LogError, UserInfo } from '@memberjunction/core';
|
|
2
2
|
import { NormalizeUUID } from '@memberjunction/global';
|
|
3
3
|
import { MJFileEntity, MJFileStorageProviderEntity, MJFileStorageAccountEntity } from '@memberjunction/core-entities';
|
|
4
4
|
import {
|
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
import { CreateMJFileInput, MJFileResolver as FileResolverBase, MJFile_, UpdateMJFileInput } from '../generated/generated.js';
|
|
48
48
|
import { FieldMapper } from '@memberjunction/graphql-dataprovider';
|
|
49
49
|
import { GetReadOnlyProvider } from '../util.js';
|
|
50
|
+
import { ProjectEntityObjectForCaller, ProjectableEntityObject } from '../generic/fieldSecurityTransport.js';
|
|
50
51
|
import { MediaAccessKeyManager } from '../rest/MediaAccessKeys.js';
|
|
51
52
|
import { UploadTokenManager } from '../rest/UploadTokenManager.js';
|
|
52
53
|
import { DeriveSidecarPath, ParsePeaksSidecar } from './peaksSidecar.js';
|
|
@@ -666,6 +667,8 @@ export class FileResolver extends FileResolverBase {
|
|
|
666
667
|
const fileEntity = await provider.GetEntityObject<MJFileEntity>('MJ: Files', user);
|
|
667
668
|
const providerEntity = await provider.GetEntityObject<MJFileStorageProviderEntity>('MJ: File Storage Providers', user);
|
|
668
669
|
fileEntity.CheckPermissions(EntityPermissionType.Create, true);
|
|
670
|
+
// Field-level security: refuse a key the caller may not read, or that names no field, before anything else
|
|
671
|
+
AssertClientInputWritableForUser(fileEntity.EntityInfo, { ...input }, user);
|
|
669
672
|
|
|
670
673
|
// The upload URL signs an overwrite of `Name` (and the row will point at `ProviderKey`): Write on the account the
|
|
671
674
|
// provider resolves to, and the tracked-file rule on both keys, as for every other route that writes an object.
|
|
@@ -693,7 +696,7 @@ export class FileResolver extends FileResolverBase {
|
|
|
693
696
|
if (!saved) {
|
|
694
697
|
console.error('[CreateFile] File save failed:', fileEntity.LatestResult?.CompleteMessage);
|
|
695
698
|
}
|
|
696
|
-
const File =
|
|
699
|
+
const File = this.fileResponse(fileEntity, user, provider);
|
|
697
700
|
|
|
698
701
|
return { File, UploadUrl, NameExists };
|
|
699
702
|
}
|
|
@@ -760,8 +763,7 @@ export class FileResolver extends FileResolverBase {
|
|
|
760
763
|
});
|
|
761
764
|
|
|
762
765
|
const loaded = await fileEntity.Load(uploadResult.FileID);
|
|
763
|
-
const
|
|
764
|
-
const File = loaded ? (mapper.MapFields({ ...fileEntity.GetAll() }) as unknown as MJFile_) : undefined;
|
|
766
|
+
const File = loaded ? (this.fileResponse(fileEntity, user, provider) as unknown as MJFile_) : undefined;
|
|
765
767
|
|
|
766
768
|
return {
|
|
767
769
|
Success: true,
|
|
@@ -778,6 +780,14 @@ export class FileResolver extends FileResolverBase {
|
|
|
778
780
|
}
|
|
779
781
|
}
|
|
780
782
|
|
|
783
|
+
/**
|
|
784
|
+
* The file record for a response: its field values as the caller may read them, in GraphQL field
|
|
785
|
+
* names. The record was just saved or reloaded, and a save re-reads the whole row.
|
|
786
|
+
*/
|
|
787
|
+
private fileResponse(fileEntity: ProjectableEntityObject, user: UserInfo, provider: IMetadataProvider): Record<string, unknown> {
|
|
788
|
+
return new FieldMapper().MapFields({ ...ProjectEntityObjectForCaller(fileEntity, user, provider) });
|
|
789
|
+
}
|
|
790
|
+
|
|
781
791
|
/**
|
|
782
792
|
* The account an upload will land in: the requested one, else the engine's default (the first active account) —
|
|
783
793
|
* returned as an explicit ID so the account the gate checks is the account `UploadFile` uses. A requested ID is
|
|
@@ -6,6 +6,7 @@ import { QueryCompositionEngine } from '@memberjunction/generic-database-provide
|
|
|
6
6
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
7
7
|
import { NoLog } from '../logging/NoLog.js';
|
|
8
8
|
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
+
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
9
10
|
import { GetReadOnlyDataSource, GetReadOnlyProvider } from '../util.js';
|
|
10
11
|
import { GetDbType } from '../index.js';
|
|
11
12
|
import { GetSystemUser } from '../auth/index.js';
|
|
@@ -125,9 +126,9 @@ export class GetDataResolver {
|
|
|
125
126
|
});
|
|
126
127
|
LogStatus(`GetData invoked: ${input.Queries.length} queries`);
|
|
127
128
|
|
|
128
|
-
// validate the token
|
|
129
|
+
// validate the token (never echo the raw token into error messages or logs — Token is @NoLog)
|
|
129
130
|
if (!IsTokenValid(input.Token)) {
|
|
130
|
-
throw new Error(
|
|
131
|
+
throw new Error('Access token is not valid or has expired');
|
|
131
132
|
}
|
|
132
133
|
|
|
133
134
|
// Use the read-only connection for executing queries
|
|
@@ -296,6 +297,26 @@ export class GetDataAccessToken {
|
|
|
296
297
|
const __accessTokens: GetDataAccessToken[] = [];
|
|
297
298
|
const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
|
|
298
299
|
|
|
300
|
+
/**
|
|
301
|
+
* Non-short-circuiting constant-time scan over active access tokens: hashes the presented token
|
|
302
|
+
* once and compares against every stored token digest with `timingSafeEqual` without breaking early,
|
|
303
|
+
* so neither prefix similarity, token length, nor array index leaks through timing.
|
|
304
|
+
*/
|
|
305
|
+
function findMatchingAccessTokenIndex(token: string): number {
|
|
306
|
+
if (typeof token !== 'string' || token.length === 0) {
|
|
307
|
+
return -1;
|
|
308
|
+
}
|
|
309
|
+
const targetDigest = createHash('sha256').update(token).digest();
|
|
310
|
+
let matchedIndex = -1;
|
|
311
|
+
for (let i = 0; i < __accessTokens.length; i++) {
|
|
312
|
+
const candidateDigest = createHash('sha256').update(__accessTokens[i].Token).digest();
|
|
313
|
+
if (timingSafeEqual(candidateDigest, targetDigest)) {
|
|
314
|
+
matchedIndex = i;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return matchedIndex;
|
|
318
|
+
}
|
|
319
|
+
|
|
299
320
|
/**
|
|
300
321
|
* Removes every token whose `ExpiresAt` has already passed (and its `TokenUses`
|
|
301
322
|
* log along with it). Without this sweep `__accessTokens` grows forever — nothing
|
|
@@ -339,7 +360,7 @@ export function RegisterAccessToken(token?: string, lifeSpan: number = __default
|
|
|
339
360
|
|
|
340
361
|
if (TokenExists(tokenToUse)) {
|
|
341
362
|
// should never happen if we used the uuidv4() function but could happen if someone tries to use a custom token
|
|
342
|
-
throw new Error(
|
|
363
|
+
throw new Error('Access token already exists');
|
|
343
364
|
}
|
|
344
365
|
|
|
345
366
|
const newToken = new GetDataAccessToken();
|
|
@@ -356,12 +377,12 @@ export function registerAccessToken(token?: string, lifeSpan: number = __default
|
|
|
356
377
|
return RegisterAccessToken(token, lifeSpan, requestorPayload);
|
|
357
378
|
}
|
|
358
379
|
export function DeleteAccessToken(token: string) {
|
|
359
|
-
const index =
|
|
380
|
+
const index = findMatchingAccessTokenIndex(token);
|
|
360
381
|
if (index >= 0) {
|
|
361
382
|
__accessTokens.splice(index, 1);
|
|
362
383
|
}
|
|
363
384
|
else {
|
|
364
|
-
throw new Error(
|
|
385
|
+
throw new Error('Access token does not exist');
|
|
365
386
|
}
|
|
366
387
|
}
|
|
367
388
|
|
|
@@ -370,7 +391,7 @@ export function deleteAccessToken(token: string) {
|
|
|
370
391
|
return DeleteAccessToken(token);
|
|
371
392
|
}
|
|
372
393
|
export function TokenExists(token: string) {
|
|
373
|
-
return
|
|
394
|
+
return findMatchingAccessTokenIndex(token) >= 0;
|
|
374
395
|
}
|
|
375
396
|
|
|
376
397
|
/** @deprecated Use {@link TokenExists}. */
|
|
@@ -378,9 +399,9 @@ export function tokenExists(token: string) {
|
|
|
378
399
|
return TokenExists(token);
|
|
379
400
|
}
|
|
380
401
|
export function IsTokenValid(token: string) {
|
|
381
|
-
const
|
|
382
|
-
if (
|
|
383
|
-
return
|
|
402
|
+
const index = findMatchingAccessTokenIndex(token);
|
|
403
|
+
if (index >= 0) {
|
|
404
|
+
return __accessTokens[index].ExpiresAt > new Date();
|
|
384
405
|
}
|
|
385
406
|
return false;
|
|
386
407
|
}
|
|
@@ -390,15 +411,16 @@ export function isTokenValid(token: string) {
|
|
|
390
411
|
return IsTokenValid(token);
|
|
391
412
|
}
|
|
392
413
|
export function RecordTokenUse(token: string, usePayload: any) {
|
|
393
|
-
const
|
|
394
|
-
if (
|
|
414
|
+
const index = findMatchingAccessTokenIndex(token);
|
|
415
|
+
if (index >= 0) {
|
|
416
|
+
const t = __accessTokens[index];
|
|
395
417
|
if (!t.TokenUses) {
|
|
396
418
|
t.TokenUses = [];
|
|
397
419
|
}
|
|
398
|
-
t.TokenUses.push({ Token:
|
|
420
|
+
t.TokenUses.push({ Token: t.Token, UsedAt: new Date(), UsePayload: usePayload });
|
|
399
421
|
}
|
|
400
422
|
else {
|
|
401
|
-
throw new Error(
|
|
423
|
+
throw new Error('Access token does not exist');
|
|
402
424
|
}
|
|
403
425
|
}
|
|
404
426
|
|