@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
|
@@ -571,25 +571,18 @@ export class RunAIPromptResolver extends ResolverBase {
|
|
|
571
571
|
}
|
|
572
572
|
|
|
573
573
|
/**
|
|
574
|
-
*
|
|
574
|
+
* Selects a local embedding model by size: `'small'` is the lowest-PowerRank active local model;
|
|
575
|
+
* `'medium'` and anything else is the platform default (`AIEngine.DefaultLocalEmbeddingModel`).
|
|
576
|
+
* Picking by position in the list would shift whenever a model is added.
|
|
575
577
|
* @private
|
|
576
578
|
*/
|
|
577
579
|
private selectEmbeddingModelBySize(modelSize: string): MJAIModelEntityExtended {
|
|
578
|
-
const
|
|
579
|
-
|
|
580
|
-
if (!
|
|
580
|
+
const engine = AIEngine.Instance;
|
|
581
|
+
const model = modelSize === 'small' ? engine.LowestPowerLocalEmbeddingModel : engine.DefaultLocalEmbeddingModel;
|
|
582
|
+
if (!model) {
|
|
581
583
|
throw new Error('No local embedding models available');
|
|
582
584
|
}
|
|
583
|
-
|
|
584
|
-
// Models are already sorted by PowerRank (highest first)
|
|
585
|
-
switch (modelSize) {
|
|
586
|
-
case 'small':
|
|
587
|
-
return localModels[localModels.length - 1]; // Lowest power
|
|
588
|
-
case 'medium':
|
|
589
|
-
default:
|
|
590
|
-
const midIndex = Math.floor(localModels.length / 2);
|
|
591
|
-
return localModels[midIndex] || localModels[0];
|
|
592
|
-
}
|
|
585
|
+
return model;
|
|
593
586
|
}
|
|
594
587
|
|
|
595
588
|
/**
|
|
@@ -825,7 +818,8 @@ export class RunAIPromptResolver extends ResolverBase {
|
|
|
825
818
|
async EmbedText(
|
|
826
819
|
@Arg('textToEmbed', () => [String]) textToEmbed: string[],
|
|
827
820
|
@Arg('modelSize') modelSize: string,
|
|
828
|
-
@Ctx() { userPayload }: { userPayload: UserPayload }
|
|
821
|
+
@Ctx() { userPayload }: { userPayload: UserPayload },
|
|
822
|
+
@Arg('inputType', { nullable: true, description: "'query' for search text, 'document' (default) for text that is stored and compared" }) inputType?: string
|
|
829
823
|
): Promise<EmbedTextResult> {
|
|
830
824
|
// Check API key scope authorization for embedding generation
|
|
831
825
|
await this.CheckAPIKeyScopeAuthorization('embedding:generate', '*', userPayload);
|
|
@@ -847,6 +841,11 @@ export class RunAIPromptResolver extends ResolverBase {
|
|
|
847
841
|
// Ensure AI Engine is configured
|
|
848
842
|
await AIEngine.Instance.Config(false, currentUser);
|
|
849
843
|
|
|
844
|
+
const role = inputType === 'query' || inputType === 'document' ? inputType : undefined;
|
|
845
|
+
if (inputType != null && !role) {
|
|
846
|
+
return { embeddings: [], modelName: 'Unknown', vectorDimensions: 0, error: `inputType must be 'query' or 'document'` };
|
|
847
|
+
}
|
|
848
|
+
|
|
850
849
|
// Select embedding model by size
|
|
851
850
|
const model = this.selectEmbeddingModelBySize(modelSize);
|
|
852
851
|
|
|
@@ -863,7 +862,7 @@ export class RunAIPromptResolver extends ResolverBase {
|
|
|
863
862
|
}
|
|
864
863
|
|
|
865
864
|
// Use AIEngine's EmbedText method
|
|
866
|
-
const result = await AIEngine.Instance.EmbedText(model, text);
|
|
865
|
+
const result = await AIEngine.Instance.EmbedText(model, text, undefined, { inputType: role });
|
|
867
866
|
|
|
868
867
|
if (result && result.vector && result.vector.length > 0) {
|
|
869
868
|
embeddings.push(result.vector);
|
|
@@ -904,9 +903,10 @@ export class RunAIPromptResolver extends ResolverBase {
|
|
|
904
903
|
async EmbedTextSystemUser(
|
|
905
904
|
@Arg('textToEmbed', () => [String]) textToEmbed: string[],
|
|
906
905
|
@Arg('modelSize') modelSize: string,
|
|
907
|
-
@Ctx() { userPayload }: { userPayload: UserPayload }
|
|
906
|
+
@Ctx() { userPayload }: { userPayload: UserPayload },
|
|
907
|
+
@Arg('inputType', { nullable: true, description: "'query' for search text, 'document' (default) for text that is stored and compared" }) inputType?: string
|
|
908
908
|
): Promise<EmbedTextResult> {
|
|
909
909
|
// Reuse the same logic as the regular mutation
|
|
910
|
-
return this.EmbedText(textToEmbed, modelSize, { userPayload });
|
|
910
|
+
return this.EmbedText(textToEmbed, modelSize, { userPayload }, inputType);
|
|
911
911
|
}
|
|
912
912
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Resolver, Mutation, Arg, Ctx, ObjectType, Field } from 'type-graphql';
|
|
2
2
|
import { AppContext, UserPayload } from '../types.js';
|
|
3
3
|
import { LogError, LogStatus, Metadata, RunView } from '@memberjunction/core';
|
|
4
|
+
import { EscapeSQLString } from '@memberjunction/global';
|
|
4
5
|
import { MJTemplateContentEntity, MJTemplateEntityExtended } from '@memberjunction/core-entities';
|
|
5
6
|
import { GetTemplateRunRefusal, TemplateEngineServer } from '@memberjunction/templates';
|
|
6
7
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
@@ -84,12 +85,13 @@ export class RunTemplateResolver extends ResolverBase {
|
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
// Load template content (get the first/highest priority content)
|
|
87
|
-
const rv =
|
|
88
|
+
const rv = RunView.FromMetadataProvider(p);
|
|
88
89
|
const templateContentResult = await rv.RunView<MJTemplateContentEntity>({
|
|
89
90
|
EntityName: 'MJ: Template Contents',
|
|
90
|
-
ExtraFilter: `TemplateID = '${
|
|
91
|
+
ExtraFilter: `TemplateID = '${EscapeSQLString(templateEntity.ID)}'`,
|
|
91
92
|
OrderBy: 'Priority ASC',
|
|
92
93
|
MaxRows: 1,
|
|
94
|
+
SkipTotalRowCount: true,
|
|
93
95
|
ResultType: 'entity_object'
|
|
94
96
|
}, currentUser);
|
|
95
97
|
|
|
@@ -102,12 +104,14 @@ export class RunTemplateResolver extends ResolverBase {
|
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
// Configure and render the template
|
|
105
|
-
await TemplateEngineServer.Instance.Config(true /*always refresh to get latest templates*/, currentUser);
|
|
107
|
+
await TemplateEngineServer.Instance.Config(true /*always refresh to get latest templates*/, currentUser, p);
|
|
106
108
|
const result = await TemplateEngineServer.Instance.RenderTemplate(
|
|
107
109
|
templateEntity,
|
|
108
110
|
templateContentResult.Results[0],
|
|
109
|
-
data,
|
|
110
|
-
true // skip validation for execution
|
|
111
|
+
data,
|
|
112
|
+
true, // skip validation for execution
|
|
113
|
+
undefined,
|
|
114
|
+
{ ContextUser: currentUser },
|
|
111
115
|
);
|
|
112
116
|
|
|
113
117
|
const executionTime = Date.now() - startTime;
|
|
@@ -15,6 +15,7 @@ import { AppContext, UserPayload } from '../types.js';
|
|
|
15
15
|
import { LogError, LogStatus, UserInfo } from '@memberjunction/core';
|
|
16
16
|
import { TestEngine } from '@memberjunction/testing-engine';
|
|
17
17
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
18
|
+
import { ProjectEntityObjectForCaller, ProjectableEntityObject } from '../generic/fieldSecurityTransport.js';
|
|
18
19
|
import { StartLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
|
|
19
20
|
import { TestRunVariables, TestLogMessage, TestRunResult as EngineTestRunResult } from '@memberjunction/testing-engine-base';
|
|
20
21
|
|
|
@@ -447,7 +448,8 @@ export class RunTestResolver extends ResolverBase {
|
|
|
447
448
|
testRunId: (testRun as { ID?: string })?.ID || testId,
|
|
448
449
|
type: 'progress',
|
|
449
450
|
testRun: testRun && typeof (testRun as { GetAll?: () => Record<string, unknown> }).GetAll === 'function'
|
|
450
|
-
|
|
451
|
+
// projected for the recipient: the run object comes from the test engine, not a load bound to them
|
|
452
|
+
? ProjectEntityObjectForCaller(testRun as unknown as ProjectableEntityObject, userPayload.userRecord)
|
|
451
453
|
: undefined,
|
|
452
454
|
progress: {
|
|
453
455
|
currentStep: progress.step,
|
|
@@ -319,6 +319,7 @@ export class SyncDataResolver {
|
|
|
319
319
|
}
|
|
320
320
|
else {
|
|
321
321
|
// pass back the full record as it was JUST BEFORE the delete, often quite useful on the other end
|
|
322
|
+
// fls-guard: system-user-only resolver (@RequireSystemUser)
|
|
322
323
|
result.RecordJSON = await altKeyResult.GetDataObjectJSON({
|
|
323
324
|
includeRelatedEntityData: false,
|
|
324
325
|
excludeFields: [],
|
|
@@ -337,6 +338,7 @@ export class SyncDataResolver {
|
|
|
337
338
|
}
|
|
338
339
|
else if (await entityObject.InnerLoad(pk)) {
|
|
339
340
|
// pass back the full record as it was JUST BEFORE the delete, often quite useful on the other end
|
|
341
|
+
// fls-guard: system-user-only resolver (@RequireSystemUser)
|
|
340
342
|
result.RecordJSON = await entityObject.GetDataObjectJSON({
|
|
341
343
|
includeRelatedEntityData: false,
|
|
342
344
|
excludeFields: [],
|
|
@@ -368,6 +370,7 @@ export class SyncDataResolver {
|
|
|
368
370
|
result.Success = true;
|
|
369
371
|
result.PrimaryKey = new CompositeKey(entityObject.PrimaryKeys.map((pk) => ({FieldName: pk.Name, Value: pk.Value})));
|
|
370
372
|
// pass back the full record AFTER the sync, that's often quite useful on the other end
|
|
373
|
+
// fls-guard: system-user-only resolver (@RequireSystemUser)
|
|
371
374
|
result.RecordJSON = await entityObject.GetDataObjectJSON({
|
|
372
375
|
includeRelatedEntityData: false,
|
|
373
376
|
excludeFields: [],
|
|
@@ -411,6 +414,7 @@ export class SyncDataResolver {
|
|
|
411
414
|
result.PrimaryKey = new CompositeKey(entityObject.PrimaryKeys.map((pk) => ({FieldName: pk.Name, Value: pk.Value})));
|
|
412
415
|
}
|
|
413
416
|
// pass back the full record AFTER the sync, that's often quite useful on the other end
|
|
417
|
+
// fls-guard: system-user-only resolver (@RequireSystemUser)
|
|
414
418
|
result.RecordJSON = await entityObject.GetDataObjectJSON({
|
|
415
419
|
includeRelatedEntityData: false,
|
|
416
420
|
excludeFields: [],
|
|
@@ -151,6 +151,7 @@ export class TestQuerySQLResolver extends ResolverBase {
|
|
|
151
151
|
|
|
152
152
|
return {
|
|
153
153
|
Success: result.Success,
|
|
154
|
+
// fls-guard: query rows; the SQL is refused before it runs if it reads a field the caller is denied
|
|
154
155
|
Results: result.Results ? JSON.stringify(result.Results) : undefined,
|
|
155
156
|
RowCount: result.RowCount,
|
|
156
157
|
ExecutionTime: result.ExecutionTime,
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Arg, Ctx, Field, InputType, Int, Mutation, ObjectType, registerEnumType } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import { CompositeKey, EntityInfo, IMetadataProvider, KeyValuePair, LogError, Metadata, TransactionVariable, TransactionGroupBase, BaseEntity,
|
|
3
|
+
import { AssertClientInputWritableForUser, CompositeKey, EntityInfo, IMetadataProvider, KeyValuePair, LogError, Metadata, RecordChangeMetadataSource, TransactionVariable, TransactionGroupBase, BaseEntity, UserInfo } from '@memberjunction/core';
|
|
4
4
|
import { SafeJSONParse, ValuesEqual } from '@memberjunction/global';
|
|
5
5
|
import { GetReadWriteProvider } from '../util.js';
|
|
6
6
|
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
7
|
+
import { ProjectValuesForCaller } from '../generic/fieldSecurityTransport.js';
|
|
7
8
|
|
|
8
9
|
export enum TransactionVariableType {
|
|
9
10
|
Define = "Define",
|
|
@@ -148,16 +149,18 @@ export class TransactionResolver extends ResolverBase {
|
|
|
148
149
|
// BEFORE any Save()/Delete() runs below: a 'Use' variable sets its field at Submit(), after
|
|
149
150
|
// every server-side write check has passed, so an entity whose check depends on a field's
|
|
150
151
|
// final value must be able to see that a variable will set it.
|
|
152
|
+
const user: UserInfo = context.userPayload.userRecord;
|
|
151
153
|
for (const item of group.Items) {
|
|
152
|
-
entityObjects.push(await md.GetEntityObject(item.EntityName,
|
|
154
|
+
entityObjects.push(await md.GetEntityObject(item.EntityName, user));
|
|
153
155
|
}
|
|
156
|
+
this.AssertNetworkInputWritable(group, entityObjects, user);
|
|
154
157
|
this.AddNetworkVariables(group, entityObjects, tg);
|
|
155
158
|
|
|
156
159
|
for (const [index, item] of group.Items.entries()) {
|
|
157
160
|
const entity = entityObjects[index];
|
|
158
161
|
|
|
159
162
|
// get the values from the payload
|
|
160
|
-
const itemValues = SafeJSONParse(item.EntityObjectJSON);
|
|
163
|
+
const itemValues = SafeJSONParse<Record<string, unknown>>(item.EntityObjectJSON) ?? {};
|
|
161
164
|
// build a primary key for the item
|
|
162
165
|
const pkey = new CompositeKey(entity.PrimaryKeys.map(pk => {
|
|
163
166
|
const kv = new KeyValuePair();
|
|
@@ -171,8 +174,10 @@ export class TransactionResolver extends ResolverBase {
|
|
|
171
174
|
if (item.OperationType === "Update") {
|
|
172
175
|
await entity.InnerLoad(pkey);
|
|
173
176
|
if (typeof entity.GetDataObject === 'function') {
|
|
177
|
+
// fls-guard: pre-update snapshot; projected before the delta is built
|
|
174
178
|
preUpdateValues.set(index, await entity.GetDataObject());
|
|
175
179
|
} else if (typeof entity.GetAll === 'function') {
|
|
180
|
+
// fls-guard: pre-update snapshot; projected before the delta is built
|
|
176
181
|
preUpdateValues.set(index, { ...(entity.GetAll() as Record<string, unknown>) });
|
|
177
182
|
}
|
|
178
183
|
}
|
|
@@ -197,6 +202,7 @@ export class TransactionResolver extends ResolverBase {
|
|
|
197
202
|
// Awaiting costs nothing here — DataObjectParams defaults
|
|
198
203
|
// includeRelatedEntityData to false, which guards the method's only awaited
|
|
199
204
|
// work, so with no params this is GetAll() plus a filter loop.
|
|
205
|
+
// fls-guard: projected in PrepareReturnValue
|
|
200
206
|
objectValues.push(await entity.GetDataObject());
|
|
201
207
|
entity.TransactionGroup = tg;
|
|
202
208
|
if (!await entity.Delete()) {
|
|
@@ -221,17 +227,17 @@ export class TransactionResolver extends ResolverBase {
|
|
|
221
227
|
`TransactionResolver::ExecuteTransactionGroup --- ${refusals.length} of ${group.Items.length} ` +
|
|
222
228
|
`item(s) were refused, so the group was not submitted:\n${refusals.join('\n')}`
|
|
223
229
|
);
|
|
224
|
-
return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues);
|
|
230
|
+
return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues, md, user);
|
|
225
231
|
}
|
|
226
232
|
|
|
227
233
|
// after all that, we are ready to roll, so let's run the TG
|
|
228
234
|
if (await tg.Submit()) {
|
|
229
235
|
// success!
|
|
230
|
-
return await this.PrepareReturnValue(true, entityObjects, objectValues, group, preUpdateValues);
|
|
236
|
+
return await this.PrepareReturnValue(true, entityObjects, objectValues, group, preUpdateValues, md, user);
|
|
231
237
|
}
|
|
232
238
|
else {
|
|
233
239
|
// failure, send back the results
|
|
234
|
-
return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues);
|
|
240
|
+
return await this.PrepareReturnValue(false, entityObjects, objectValues, group, preUpdateValues, md, user);
|
|
235
241
|
}
|
|
236
242
|
}
|
|
237
243
|
catch (err) {
|
|
@@ -240,6 +246,32 @@ export class TransactionResolver extends ResolverBase {
|
|
|
240
246
|
}
|
|
241
247
|
}
|
|
242
248
|
|
|
249
|
+
/**
|
|
250
|
+
* Field-level security gate on everything the client sent, run before any item is applied.
|
|
251
|
+
*
|
|
252
|
+
* Each create or update payload must name only fields the caller may read, and so must every transaction
|
|
253
|
+
* variable: a `Define` on a denied field would copy its value into another item's readable
|
|
254
|
+
* field at `Submit()`, and a `Use` would write it. A key that names no field is refused with
|
|
255
|
+
* the same message as a denied one (see `AssertClientInputWritableForUser`). Callers denied
|
|
256
|
+
* nothing on an entity are not affected. A delete payload is not gated: only its primary key
|
|
257
|
+
* is read, and the record is loaded from the database.
|
|
258
|
+
*/
|
|
259
|
+
protected AssertNetworkInputWritable(group: TransactionInputType, entityObjects: BaseEntity[], user: UserInfo): void {
|
|
260
|
+
for (const [index, item] of group.Items.entries()) {
|
|
261
|
+
if (item.OperationType === TransactionOperationType.Delete) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const values = SafeJSONParse<Record<string, unknown>>(item.EntityObjectJSON);
|
|
265
|
+
AssertClientInputWritableForUser(entityObjects[index]?.EntityInfo, values, user);
|
|
266
|
+
}
|
|
267
|
+
for (const networkVar of group.Variables ?? []) {
|
|
268
|
+
const target = entityObjects[networkVar.ItemIndex];
|
|
269
|
+
if (target && networkVar.FieldName) {
|
|
270
|
+
AssertClientInputWritableForUser(target.EntityInfo, { [networkVar.FieldName]: null }, user);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
243
275
|
/**
|
|
244
276
|
* Adds the network payload's variables to the group, mapping each one's item index to the entity
|
|
245
277
|
* object built for that item.
|
|
@@ -261,13 +293,18 @@ export class TransactionResolver extends ResolverBase {
|
|
|
261
293
|
entityObjects: BaseEntity[],
|
|
262
294
|
objectValues: unknown[],
|
|
263
295
|
group: TransactionInputType,
|
|
264
|
-
preUpdateValues?: Map<number, Record<string, unknown
|
|
296
|
+
preUpdateValues?: Map<number, Record<string, unknown>>,
|
|
297
|
+
provider?: RecordChangeMetadataSource,
|
|
298
|
+
user?: UserInfo
|
|
265
299
|
): Promise<TransactionOutputType> {
|
|
266
300
|
const jsonResults = [];
|
|
267
301
|
for (let i = 0; i < group.Items.length; i++) {
|
|
268
302
|
const item = group.Items[i];
|
|
303
|
+
const project = (values: Record<string, unknown>) =>
|
|
304
|
+
ProjectValuesForCaller(entityObjects[i]?.EntityInfo, values, user, provider);
|
|
269
305
|
if (item.OperationType === 'Delete') {
|
|
270
|
-
|
|
306
|
+
const deleted = objectValues[i];
|
|
307
|
+
jsonResults.push(JSON.stringify(deleted && typeof deleted === 'object' ? project(deleted as Record<string, unknown>) : deleted));
|
|
271
308
|
}
|
|
272
309
|
else if (item.OperationType === 'Update') {
|
|
273
310
|
jsonResults.push(
|
|
@@ -276,13 +313,15 @@ export class TransactionResolver extends ResolverBase {
|
|
|
276
313
|
objectValues[i],
|
|
277
314
|
preUpdateValues?.get(i),
|
|
278
315
|
group,
|
|
279
|
-
i
|
|
316
|
+
i,
|
|
317
|
+
project
|
|
280
318
|
)
|
|
281
319
|
);
|
|
282
320
|
}
|
|
283
321
|
else {
|
|
284
|
-
// create, return what is in the database
|
|
285
|
-
|
|
322
|
+
// create, return what is in the database, as the caller may read it
|
|
323
|
+
// fls-guard: projected by project()
|
|
324
|
+
jsonResults.push(JSON.stringify(project(await entityObjects[i].GetDataObject())));
|
|
286
325
|
}
|
|
287
326
|
}
|
|
288
327
|
|
|
@@ -303,20 +342,32 @@ export class TransactionResolver extends ResolverBase {
|
|
|
303
342
|
* - Any field whose post-save value differs from its pre-update DB snapshot (`preSaveValues`),
|
|
304
343
|
* capturing virtual fields, triggers, or server-side `BeforeSave()` mutations automatically
|
|
305
344
|
* while omitting unchanged columns.
|
|
345
|
+
*
|
|
346
|
+
* Both rows are projected for the caller BEFORE they are compared. Comparing a full-width
|
|
347
|
+
* post-save row against a snapshot taken from a narrowed load would count every denied value
|
|
348
|
+
* as changed, and the delta would then deliver exactly the values the caller may not read.
|
|
306
349
|
*/
|
|
307
350
|
private async serializeUpdateReturnValue(
|
|
308
351
|
entity: BaseEntity,
|
|
309
352
|
sentValues: unknown,
|
|
310
353
|
preSaveValues: Record<string, unknown> | undefined,
|
|
311
354
|
group: TransactionInputType,
|
|
312
|
-
itemIndex: number
|
|
355
|
+
itemIndex: number,
|
|
356
|
+
project: (values: Record<string, unknown>) => Record<string, unknown>
|
|
313
357
|
): Promise<string> {
|
|
314
|
-
const
|
|
358
|
+
const rawDataObj: Record<string, unknown> | null = typeof entity.GetDataObject === 'function'
|
|
359
|
+
// fls-guard: projected by project() below
|
|
315
360
|
? (await entity.GetDataObject() as Record<string, unknown>)
|
|
361
|
+
// fls-guard: projected by project() below
|
|
316
362
|
: SafeJSONParse<Record<string, unknown>>(await entity.GetDataObjectJSON());
|
|
317
|
-
if (!
|
|
318
|
-
return
|
|
363
|
+
if (!rawDataObj || typeof rawDataObj !== 'object') {
|
|
364
|
+
return JSON.stringify(rawDataObj);
|
|
365
|
+
}
|
|
366
|
+
const fullDataObj = project(rawDataObj);
|
|
367
|
+
if (!sentValues || typeof sentValues !== 'object') {
|
|
368
|
+
return JSON.stringify(fullDataObj);
|
|
319
369
|
}
|
|
370
|
+
preSaveValues = preSaveValues ? project(preSaveValues) : preSaveValues;
|
|
320
371
|
|
|
321
372
|
const sentRecord = sentValues as Record<string, unknown>;
|
|
322
373
|
const includeKeys = new Set<string>([
|
|
@@ -5,6 +5,7 @@ import { MJUserView_, MJUserViewResolverBase } from '../generated/generated.js';
|
|
|
5
5
|
import { UserResolver } from './UserResolver.js';
|
|
6
6
|
import { MJUserViewEntity, MJUserViewEntityExtended } from '@memberjunction/core-entities';
|
|
7
7
|
import { GetReadOnlyProvider, GetReadWriteProvider } from '../util.js';
|
|
8
|
+
import { ProjectEntityObjectForCaller } from '../generic/fieldSecurityTransport.js';
|
|
8
9
|
|
|
9
10
|
@Resolver(MJUserView_)
|
|
10
11
|
export class UserViewResolver extends MJUserViewResolverBase {
|
|
@@ -63,7 +64,7 @@ export class UserViewResolver extends MJUserViewResolverBase {
|
|
|
63
64
|
await viewEntity.UpdateWhereClause(true); // force regeneration regardless of dirty state — that is the whole point of this endpoint
|
|
64
65
|
|
|
65
66
|
if (await viewEntity.Save()) {
|
|
66
|
-
return viewEntity
|
|
67
|
+
return ProjectEntityObjectForCaller(viewEntity, u, p);
|
|
67
68
|
} else {
|
|
68
69
|
throw new Error('Failed to update where clause');
|
|
69
70
|
}
|
|
@@ -23,6 +23,8 @@ vi.mock('../../auth/index.js', () => ({ GetSystemUser: vi.fn(),
|
|
|
23
23
|
vi.mock('mssql', () => ({ default: { Request: vi.fn() } }));
|
|
24
24
|
|
|
25
25
|
import {
|
|
26
|
+
GetDataResolver,
|
|
27
|
+
GetDataInputType,
|
|
26
28
|
RegisterAccessToken,
|
|
27
29
|
DeleteAccessToken,
|
|
28
30
|
TokenExists,
|
|
@@ -31,6 +33,7 @@ import {
|
|
|
31
33
|
PruneExpiredTokens,
|
|
32
34
|
GetAccessTokenCount,
|
|
33
35
|
} from '../GetDataResolver.js';
|
|
36
|
+
import type { AppContext } from '../../types.js';
|
|
34
37
|
|
|
35
38
|
// ---------------------------------------------------------------------------
|
|
36
39
|
// Regression coverage for a memory leak (Memory Leak Audit Round 7, Critical):
|
|
@@ -137,4 +140,53 @@ describe('GetDataResolver access-token lifecycle', () => {
|
|
|
137
140
|
expect(GetAccessTokenCount()).toBeLessThan(before + 51);
|
|
138
141
|
expect(TokenExists(survivorToken)).toBe(true);
|
|
139
142
|
});
|
|
143
|
+
|
|
144
|
+
it('never leaks raw secret token values in thrown or returned error messages', async () => {
|
|
145
|
+
const duplicateSecret = `secret-dup-${uniqueToken()}`;
|
|
146
|
+
RegisterAccessToken(duplicateSecret, 60_000);
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
RegisterAccessToken(duplicateSecret, 60_000);
|
|
150
|
+
expect.unreachable('Expected duplicate registration to throw');
|
|
151
|
+
} catch (err) {
|
|
152
|
+
expect((err as Error).message).not.toContain(duplicateSecret);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const missingSecret = `secret-missing-${uniqueToken()}`;
|
|
156
|
+
try {
|
|
157
|
+
DeleteAccessToken(missingSecret);
|
|
158
|
+
expect.unreachable('Expected deleting unknown token to throw');
|
|
159
|
+
} catch (err) {
|
|
160
|
+
expect((err as Error).message).not.toContain(missingSecret);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
RecordTokenUse(missingSecret, {});
|
|
165
|
+
expect.unreachable('Expected recording unknown token use to throw');
|
|
166
|
+
} catch (err) {
|
|
167
|
+
expect((err as Error).message).not.toContain(missingSecret);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const resolver = new GetDataResolver();
|
|
171
|
+
const input = new GetDataInputType();
|
|
172
|
+
input.Token = missingSecret;
|
|
173
|
+
input.Queries = ['SELECT 1'];
|
|
174
|
+
const output = await resolver.GetData(input, { dataSources: [] } as Partial<AppContext> as AppContext);
|
|
175
|
+
expect(output.Success).toBe(false);
|
|
176
|
+
expect(JSON.stringify(output.ErrorMessages)).not.toContain(missingSecret);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('rejects empty tokens and near-miss prefix tokens across multiple active slots', () => {
|
|
180
|
+
const first = `slot-a-${uniqueToken()}`;
|
|
181
|
+
const second = `slot-b-${uniqueToken()}`;
|
|
182
|
+
RegisterAccessToken(first, 60_000);
|
|
183
|
+
RegisterAccessToken(second, 60_000);
|
|
184
|
+
|
|
185
|
+
expect(IsTokenValid('')).toBe(false);
|
|
186
|
+
expect(TokenExists('')).toBe(false);
|
|
187
|
+
expect(IsTokenValid(first.slice(0, -1))).toBe(false);
|
|
188
|
+
expect(IsTokenValid(`${second}-extra`)).toBe(false);
|
|
189
|
+
expect(IsTokenValid(first)).toBe(true);
|
|
190
|
+
expect(IsTokenValid(second)).toBe(true);
|
|
191
|
+
});
|
|
140
192
|
});
|
|
@@ -90,4 +90,47 @@ describe('RecordDependencyResolver', () => {
|
|
|
90
90
|
expect(result[0].IsSoftLink).toBeUndefined();
|
|
91
91
|
expect(result[0].EntityIDFieldName).toBeUndefined();
|
|
92
92
|
});
|
|
93
|
+
|
|
94
|
+
it('forwards contextUser and options to provider and maps FieldDisplayName', async () => {
|
|
95
|
+
const mockDep: RecordDependency = {
|
|
96
|
+
EntityName: 'Users',
|
|
97
|
+
RelatedEntityName: 'MJ: Task Links',
|
|
98
|
+
FieldName: 'RecordID',
|
|
99
|
+
FieldDisplayName: 'Linked Record',
|
|
100
|
+
PrimaryKey: new CompositeKey([new KeyValuePair('ID', 'TL-200')]),
|
|
101
|
+
IsSoftLink: true,
|
|
102
|
+
EntityIDFieldName: 'EntityID',
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const getRecordDepsSpy = vi.fn().mockResolvedValue([mockDep]);
|
|
106
|
+
const mockProvider = {
|
|
107
|
+
GetRecordDependencies: getRecordDepsSpy,
|
|
108
|
+
} as unknown as IMetadataProvider;
|
|
109
|
+
|
|
110
|
+
vi.mocked(GetReadOnlyProvider).mockReturnValue(mockProvider as never);
|
|
111
|
+
|
|
112
|
+
const resolver = new RecordDependencyResolver();
|
|
113
|
+
const mockUser = { ID: 'u-1', Email: 'test@example.com' };
|
|
114
|
+
const mockContext = {
|
|
115
|
+
dataSource: {},
|
|
116
|
+
userPayload: { userRecord: mockUser },
|
|
117
|
+
providers: [],
|
|
118
|
+
} as unknown as AppContext;
|
|
119
|
+
const mockPubSub = {} as PubSubEngine;
|
|
120
|
+
const options = { LinkType: 'soft' as const, IncludeSystemEntities: false };
|
|
121
|
+
|
|
122
|
+
const result = await resolver.GetRecordDependencies(
|
|
123
|
+
'Users',
|
|
124
|
+
{ KeyValuePairs: [{ FieldName: 'ID', Value: 'USER-1' }] },
|
|
125
|
+
mockContext,
|
|
126
|
+
mockPubSub,
|
|
127
|
+
options
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
expect(getRecordDepsSpy).toHaveBeenCalledTimes(1);
|
|
131
|
+
expect(getRecordDepsSpy.mock.calls[0][0]).toBe('Users');
|
|
132
|
+
expect(getRecordDepsSpy.mock.calls[0][2]).toBe(mockUser);
|
|
133
|
+
expect(getRecordDepsSpy.mock.calls[0][3]).toEqual(options);
|
|
134
|
+
expect(result[0].FieldDisplayName).toBe('Linked Record');
|
|
135
|
+
});
|
|
93
136
|
});
|
|
@@ -268,6 +268,7 @@ async function findConversationByEgressID(egressID: string, contextUser: UserInf
|
|
|
268
268
|
Fields: ['ID'],
|
|
269
269
|
OrderBy: '__mj_CreatedAt DESC',
|
|
270
270
|
MaxRows: 1,
|
|
271
|
+
SkipTotalRowCount: true,
|
|
271
272
|
ResultType: 'simple',
|
|
272
273
|
},
|
|
273
274
|
contextUser,
|
|
@@ -288,6 +289,7 @@ async function findConversationByRoomName(roomName: string, contextUser: UserInf
|
|
|
288
289
|
Fields: ['ID'],
|
|
289
290
|
OrderBy: '__mj_CreatedAt DESC',
|
|
290
291
|
MaxRows: 1,
|
|
292
|
+
SkipTotalRowCount: true,
|
|
291
293
|
ResultType: 'simple',
|
|
292
294
|
},
|
|
293
295
|
contextUser,
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
-
BaseEntity, CompositeKey, EntityDeleteOptions, EntityPermissionType,
|
|
2
|
+
AssertClientInputWritableForUser, BaseEntity, CompositeKey, EntityDeleteOptions, EntityPermissionType,
|
|
3
3
|
EntitySaveOptions, LogError, Metadata, UserInfo
|
|
4
4
|
} from '@memberjunction/core';
|
|
5
|
+
import { ProjectValuesForCaller } from '../generic/fieldSecurityTransport.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* Entity CRUD Implementation Functions for REST endpoints
|
|
@@ -42,6 +43,9 @@ export class EntityCRUDHandler {
|
|
|
42
43
|
delete data.options;
|
|
43
44
|
}
|
|
44
45
|
|
|
46
|
+
// Field-level security: refuse a key the caller may not read, or that names no field
|
|
47
|
+
AssertClientInputWritableForUser(entity.EntityInfo, data, user);
|
|
48
|
+
|
|
45
49
|
// Set values on the entity
|
|
46
50
|
for (const key in data) {
|
|
47
51
|
entity.Set(key, data[key]);
|
|
@@ -70,7 +74,7 @@ export class EntityCRUDHandler {
|
|
|
70
74
|
}
|
|
71
75
|
|
|
72
76
|
// Get entity data for response
|
|
73
|
-
const entityData = await
|
|
77
|
+
const entityData = await this.responseData(entity, user, md);
|
|
74
78
|
return { success: true, entity: entityData };
|
|
75
79
|
} catch (error: any) {
|
|
76
80
|
LogError(error);
|
|
@@ -114,7 +118,7 @@ export class EntityCRUDHandler {
|
|
|
114
118
|
}
|
|
115
119
|
|
|
116
120
|
// Get entity data for response
|
|
117
|
-
const entityData = await
|
|
121
|
+
const entityData = await this.responseData(entity, user, md);
|
|
118
122
|
return { success: true, entity: entityData };
|
|
119
123
|
} catch (error: any) {
|
|
120
124
|
LogError(error);
|
|
@@ -171,6 +175,9 @@ export class EntityCRUDHandler {
|
|
|
171
175
|
delete data.options;
|
|
172
176
|
}
|
|
173
177
|
|
|
178
|
+
// Field-level security: refuse a key the caller may not read, or that names no field
|
|
179
|
+
AssertClientInputWritableForUser(entity.EntityInfo, data, user);
|
|
180
|
+
|
|
174
181
|
// Update entity with new values
|
|
175
182
|
for (const key in data) {
|
|
176
183
|
entity.Set(key, data[key]);
|
|
@@ -179,7 +186,7 @@ export class EntityCRUDHandler {
|
|
|
179
186
|
// Check if entity is dirty
|
|
180
187
|
if (!entity.Dirty && !options.IgnoreDirtyState) {
|
|
181
188
|
// Nothing changed, return success
|
|
182
|
-
const entityData = await
|
|
189
|
+
const entityData = await this.responseData(entity, user, md);
|
|
183
190
|
return { success: true, entity: entityData };
|
|
184
191
|
}
|
|
185
192
|
|
|
@@ -206,7 +213,7 @@ export class EntityCRUDHandler {
|
|
|
206
213
|
}
|
|
207
214
|
|
|
208
215
|
// Get entity data for response
|
|
209
|
-
const entityData = await
|
|
216
|
+
const entityData = await this.responseData(entity, user, md);
|
|
210
217
|
return { success: true, entity: entityData };
|
|
211
218
|
} catch (error: any) {
|
|
212
219
|
LogError(error);
|
|
@@ -273,6 +280,16 @@ export class EntityCRUDHandler {
|
|
|
273
280
|
return this.DeleteEntity(entityName, id, options, user);
|
|
274
281
|
}
|
|
275
282
|
|
|
283
|
+
/**
|
|
284
|
+
* The record's field values for the response, reduced to what `user` may READ. An entity
|
|
285
|
+
* object built for a restricted user holds no denied value already; this is the backstop for
|
|
286
|
+
* one that does.
|
|
287
|
+
*/
|
|
288
|
+
private static async responseData(entity: BaseEntity, user: UserInfo, md: Metadata): Promise<Record<string, unknown>> {
|
|
289
|
+
// fls-guard: projected by ProjectValuesForCaller
|
|
290
|
+
return ProjectValuesForCaller(entity.EntityInfo, await entity.GetDataObject() as Record<string, unknown>, user, md);
|
|
291
|
+
}
|
|
292
|
+
|
|
276
293
|
/**
|
|
277
294
|
* Build the record key from the `:id` path segment. A single-column key (any column name) is
|
|
278
295
|
* the bare value; a composite key is the URL-encoded `Field1|Value1||Field2|Value2` segment.
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import { BaseSingleton } from '@memberjunction/global';
|
|
20
20
|
import { LogStatus } from '@memberjunction/core';
|
|
21
|
-
import { randomBytes } from 'node:crypto';
|
|
21
|
+
import { createHmac, randomBytes } from 'node:crypto';
|
|
22
22
|
import jwt from 'jsonwebtoken';
|
|
23
23
|
|
|
24
24
|
/** The token's `typ` claim — the route rejects any token whose `typ` differs. */
|
|
@@ -78,7 +78,11 @@ export class MediaAccessKeyManager extends BaseSingleton<MediaAccessKeyManager>
|
|
|
78
78
|
}
|
|
79
79
|
const configured = process.env.MJ_BASE_ENCRYPTION_KEY?.trim();
|
|
80
80
|
if (configured) {
|
|
81
|
-
|
|
81
|
+
// Key separation: never sign tokens with the field-encryption master key itself. Derive a
|
|
82
|
+
// dedicated HS256 signing key (HKDF-style HMAC expand) so a token-signing compromise and the
|
|
83
|
+
// data-at-rest key stay decoupled. Tokens are short-lived, so changing the derivation only
|
|
84
|
+
// invalidates in-flight URLs, exactly like a restart on the ephemeral path below.
|
|
85
|
+
this.secret = createHmac('sha256', configured).update('mj-media-access-token-signing-v1').digest('base64');
|
|
82
86
|
} else {
|
|
83
87
|
this.secret = randomBytes(32).toString('base64');
|
|
84
88
|
LogStatus(
|