@memberjunction/server 6.2.0-edge.0 → 6.2.0-edge.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.d.ts +2 -0
- package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
- package/dist/agentSessions/ReturningVisitorRecap.js +5 -1
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionManager.js +2 -2
- package/dist/agentSessions/remoteBrowserGoalEngine.d.ts +8 -0
- package/dist/agentSessions/remoteBrowserGoalEngine.d.ts.map +1 -1
- package/dist/agentSessions/remoteBrowserGoalEngine.js +21 -5
- package/dist/agentSessions/remoteBrowserGoalEngine.js.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.d.ts +2 -0
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +5 -1
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/index.d.ts +20 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +20 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +8 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +21 -5
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts +9 -0
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +22 -10
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +65 -51
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/index.d.ts +2 -2
- package/dist/auth/magicLink/index.d.ts.map +1 -1
- package/dist/auth/magicLink/index.js +2 -2
- package/dist/auth/magicLink/index.js.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.d.ts +54 -33
- package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
- package/dist/auth/magicLink/magicLinkCore.js +61 -61
- package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
- package/dist/auth/magicLink/redeemLanding.d.ts +4 -0
- package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
- package/dist/auth/magicLink/redeemLanding.js +12 -4
- package/dist/auth/magicLink/redeemLanding.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +4 -4
- package/dist/auth/principals.d.ts +2 -0
- package/dist/auth/principals.d.ts.map +1 -1
- package/dist/auth/principals.js +6 -2
- package/dist/auth/principals.js.map +1 -1
- package/dist/cache.d.ts +2 -0
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +3 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +346 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +34 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +20 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -19
- package/dist/context.js.map +1 -1
- package/dist/directives/Public.d.ts +2 -0
- package/dist/directives/Public.d.ts.map +1 -1
- package/dist/directives/Public.js +3 -1
- package/dist/directives/Public.js.map +1 -1
- package/dist/directives/RequireSystemUser.d.ts +2 -0
- package/dist/directives/RequireSystemUser.d.ts.map +1 -1
- package/dist/directives/RequireSystemUser.js +3 -1
- package/dist/directives/RequireSystemUser.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +1021 -0
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +7368 -2145
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +94 -4
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +122 -3
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/DeleteOptionsInput.d.ts +8 -1
- package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
- package/dist/generic/DeleteOptionsInput.js +1 -1
- package/dist/generic/DeleteOptionsInput.js.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.d.ts +18 -2
- package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
- package/dist/generic/FireAndForgetHeartbeat.js +24 -6
- package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +31 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js +215 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -0
- package/dist/generic/PushStatusResolver.d.ts +48 -1
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +95 -4
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +18 -2
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +64 -55
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +120 -11
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts +2 -0
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +5 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/integration/EntityMapLifecycle.d.ts +4 -0
- package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
- package/dist/integration/EntityMapLifecycle.js +10 -2
- package/dist/integration/EntityMapLifecycle.js.map +1 -1
- package/dist/logging/NoLog.d.ts +4 -0
- package/dist/logging/NoLog.d.ts.map +1 -1
- package/dist/logging/NoLog.js +10 -2
- package/dist/logging/NoLog.js.map +1 -1
- package/dist/logging/StartupLogger.d.ts +2 -0
- package/dist/logging/StartupLogger.d.ts.map +1 -1
- package/dist/logging/StartupLogger.js +5 -1
- package/dist/logging/StartupLogger.js.map +1 -1
- package/dist/logging/bootAudit.d.ts +11 -7
- package/dist/logging/bootAudit.d.ts.map +1 -1
- package/dist/logging/bootAudit.js +15 -7
- package/dist/logging/bootAudit.js.map +1 -1
- package/dist/logging/boundaryLogPayload.d.ts +4 -0
- package/dist/logging/boundaryLogPayload.d.ts.map +1 -1
- package/dist/logging/boundaryLogPayload.js +5 -1
- package/dist/logging/boundaryLogPayload.js.map +1 -1
- package/dist/logging/secretRedactor.d.ts +2 -0
- package/dist/logging/secretRedactor.d.ts.map +1 -1
- package/dist/logging/secretRedactor.js +8 -4
- package/dist/logging/secretRedactor.js.map +1 -1
- package/dist/logging/shortenForLog.d.ts +2 -0
- package/dist/logging/shortenForLog.d.ts.map +1 -1
- package/dist/logging/shortenForLog.js +7 -3
- package/dist/logging/shortenForLog.js.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.d.ts +2 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +8 -6
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/metadataRefreshSignal.d.ts +19 -0
- package/dist/metadataRefreshSignal.d.ts.map +1 -0
- package/dist/metadataRefreshSignal.js +45 -0
- package/dist/metadataRefreshSignal.js.map +1 -0
- package/dist/middleware/MJTenantFilterMiddleware.js +4 -4
- package/dist/multiTenancy/index.d.ts +8 -0
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +21 -5
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.d.ts +5 -0
- package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.js +14 -10
- package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts +6 -6
- package/dist/realtimeWidget/WidgetSessionService.js +27 -27
- package/dist/realtimeWidget/host-identity.d.ts +5 -1
- package/dist/realtimeWidget/host-identity.d.ts.map +1 -1
- package/dist/realtimeWidget/host-identity.js +11 -3
- package/dist/realtimeWidget/host-identity.js.map +1 -1
- package/dist/realtimeWidget/index.d.ts +2 -2
- package/dist/realtimeWidget/index.d.ts.map +1 -1
- package/dist/realtimeWidget/index.js +2 -2
- package/dist/realtimeWidget/index.js.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.d.ts +21 -1
- package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.js +16 -4
- package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +48 -0
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +38 -10
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +10 -6
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +14 -6
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +3 -3
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +55 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -0
- package/dist/resolvers/AgentRunStatusPublisher.js +141 -0
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +90 -0
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -0
- package/dist/resolvers/ConversationRunEventsResolver.js +283 -0
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts +98 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.d.ts.map +1 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js +227 -0
- package/dist/resolvers/DuplicateEntryCheckResolver.js.map +1 -0
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +2 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.js +3 -3
- package/dist/resolvers/GeoResolver.d.ts +2 -2
- package/dist/resolvers/GeoResolver.js +4 -4
- package/dist/resolvers/GetDataResolver.d.ts +14 -0
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +43 -15
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +2 -2
- package/dist/resolvers/ListOperationsResolver.d.ts +20 -0
- package/dist/resolvers/ListOperationsResolver.d.ts.map +1 -1
- package/dist/resolvers/ListOperationsResolver.js +68 -28
- package/dist/resolvers/ListOperationsResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts +11 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +7 -3
- package/dist/resolvers/MCPResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +7 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +16 -2
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +3 -3
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +44 -6
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +93 -37
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +5 -5
- package/dist/resolvers/RunAIAgentResolver.d.ts +8 -18
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +85 -184
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +2 -2
- package/dist/resolvers/RunDecisionResolver.d.ts +149 -0
- package/dist/resolvers/RunDecisionResolver.d.ts.map +1 -0
- package/dist/resolvers/RunDecisionResolver.js +396 -0
- package/dist/resolvers/RunDecisionResolver.js.map +1 -0
- package/dist/resolvers/RunTestResolver.js +5 -5
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts +8 -4
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +5 -5
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +8 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.js +6 -2
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
- package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
- package/dist/resolvers/VectorizeEntityResolver.js +14 -10
- package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
- package/dist/resolvers/adhoc-query-helpers.d.ts +6 -0
- package/dist/resolvers/adhoc-query-helpers.d.ts.map +1 -1
- package/dist/resolvers/adhoc-query-helpers.js +10 -2
- package/dist/resolvers/adhoc-query-helpers.js.map +1 -1
- package/dist/resolvers/artifact-routing.d.ts +8 -8
- package/dist/resolvers/artifact-routing.js +2 -2
- package/dist/resolvers/artifact-routing.js.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.d.ts +10 -2
- package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.js +24 -8
- package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
- package/dist/resolvers/peaksSidecar.d.ts +4 -0
- package/dist/resolvers/peaksSidecar.d.ts.map +1 -1
- package/dist/resolvers/peaksSidecar.js +10 -2
- package/dist/resolvers/peaksSidecar.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +28 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +20 -4
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/MediaStreamHandler.d.ts +2 -0
- package/dist/rest/MediaStreamHandler.d.ts.map +1 -1
- package/dist/rest/MediaStreamHandler.js +10 -6
- package/dist/rest/MediaStreamHandler.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts +9 -0
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +15 -3
- package/dist/rest/OAuthCallbackHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts +6 -4
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +15 -11
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeSdpBrokerHandler.d.ts +5 -1
- package/dist/rest/RealtimeSdpBrokerHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeSdpBrokerHandler.js +12 -4
- package/dist/rest/RealtimeSdpBrokerHandler.js.map +1 -1
- package/dist/rest/SignatureWebhookHandler.d.ts +2 -0
- package/dist/rest/SignatureWebhookHandler.d.ts.map +1 -1
- package/dist/rest/SignatureWebhookHandler.js +5 -1
- package/dist/rest/SignatureWebhookHandler.js.map +1 -1
- package/dist/rest/UploadTokenManager.d.ts +24 -8
- package/dist/rest/UploadTokenManager.d.ts.map +1 -1
- package/dist/rest/UploadTokenManager.js +53 -21
- package/dist/rest/UploadTokenManager.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +20 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +20 -4
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/mediaRange.d.ts +4 -0
- package/dist/rest/mediaRange.d.ts.map +1 -1
- package/dist/rest/mediaRange.js +10 -2
- package/dist/rest/mediaRange.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +4 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +13 -7
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverExtensionReservedRoots.d.ts +2 -0
- package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
- package/dist/serverExtensionReservedRoots.js +5 -1
- package/dist/serverExtensionReservedRoots.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +13 -8
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +16 -15
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -3
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +6 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +13 -5
- package/dist/util.js.map +1 -1
- package/package.json +94 -92
- package/src/__tests__/AgentRunStatusPublisher.test.ts +175 -0
- package/src/__tests__/DeleteOptionsInput.wireShape.test.ts +62 -0
- package/src/__tests__/DuplicateEntryCheckResolver.test.ts +300 -0
- package/src/__tests__/FileResolverPeaks.test.ts +13 -13
- package/src/__tests__/ListOperationsResolver.test.ts +17 -17
- package/src/__tests__/MediaStreamHandler.test.ts +28 -28
- package/src/__tests__/NoLog.test.ts +11 -11
- package/src/__tests__/PrimaryKeyAlwaysMapped.test.ts +10 -10
- package/src/__tests__/RESTEndpointHandler.test.ts +14 -14
- package/src/__tests__/RealtimeBridgeResolver.test.ts +4 -2
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
- package/src/__tests__/RealtimeSdpBrokerHandler.test.ts +6 -6
- package/src/__tests__/RefreshAdoptsNewColumns.test.ts +8 -8
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +7 -1
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +7 -1
- package/src/__tests__/RemoteBrowserGoalEngine.test.ts +18 -18
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +7 -1
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +52 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +398 -0
- package/src/__tests__/RunAIAgentResolver.streaming.test.ts +18 -27
- package/src/__tests__/RunDecisionResolver.test.ts +699 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +131 -0
- package/src/__tests__/TaskGraphFrameResolver.test.ts +2 -2
- package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
- package/src/__tests__/WidgetSessionService.test.ts +8 -4
- package/src/__tests__/adhoc-query-helpers.test.ts +21 -21
- package/src/__tests__/bootAudit.test.ts +11 -11
- package/src/__tests__/boundaryLogPayload.test.ts +6 -6
- package/src/__tests__/cacheInvalidationRecordData.test.ts +177 -0
- package/src/__tests__/conversationRunEvents.test.ts +399 -0
- package/src/__tests__/databaseAbstraction.test.ts +12 -6
- package/src/__tests__/getDataTokenRedaction.test.ts +7 -7
- package/src/__tests__/initializeProviders.refresh.test.ts +4 -4
- package/src/__tests__/magicLink.test.ts +73 -134
- package/src/__tests__/magicLinkService.consume.test.ts +224 -0
- package/src/__tests__/meetingRecordingRegistration.test.ts +12 -12
- package/src/__tests__/metadataRefreshSignal.test.ts +78 -0
- package/src/__tests__/multiTenancy.security.test.ts +40 -40
- package/src/__tests__/multiTenancy.test.ts +18 -18
- package/src/__tests__/newUsers.test.ts +24 -23
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +283 -0
- package/src/__tests__/principals.test.ts +22 -22
- package/src/__tests__/pushStatusFanOut.test.ts +206 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +8 -8
- package/src/__tests__/secretRedactor.failOpen.test.ts +12 -12
- package/src/__tests__/secretRedactor.test.ts +12 -12
- package/src/__tests__/serverExtensionReservedRoots.test.ts +7 -7
- package/src/__tests__/subscriptionRedaction.test.ts +5 -5
- package/src/__tests__/unifiedAuth.test.ts +15 -9
- package/src/__tests__/visitorIdentity.resolve.test.ts +6 -6
- package/src/__tests__/widget.test.ts +45 -45
- package/src/__tests__/widgetGuestElevation.test.ts +7 -7
- package/src/__tests__/widgetHostIdentity.test.ts +14 -14
- package/src/agentSessions/ReturningVisitorRecap.ts +12 -1
- package/src/agentSessions/SessionManager.ts +2 -2
- package/src/agentSessions/remoteBrowserGoalEngine.ts +30 -5
- package/src/auth/AuthProviderCatalogRouter.ts +6 -1
- package/src/auth/__tests__/backward-compatibility.test.ts +4 -3
- package/src/auth/index.ts +43 -28
- package/src/auth/initializeProviders.ts +25 -5
- package/src/auth/magicLink/MagicLinkRouter.ts +28 -10
- package/src/auth/magicLink/MagicLinkService.ts +71 -52
- package/src/auth/magicLink/index.ts +7 -7
- package/src/auth/magicLink/magicLinkCore.ts +96 -64
- package/src/auth/magicLink/redeemLanding.ts +14 -4
- package/src/auth/magicLink/types.ts +54 -54
- package/src/auth/newUsers.ts +1 -1
- package/src/auth/principals.ts +11 -2
- package/src/cache.ts +4 -1
- package/src/config.ts +37 -4
- package/src/context.ts +37 -24
- package/src/directives/Public.ts +4 -1
- package/src/directives/RequireSystemUser.ts +4 -1
- package/src/generated/graphql-schemas/__mj.ts +3674 -4
- package/src/generic/CacheInvalidationResolver.ts +148 -4
- package/src/generic/DeleteOptionsInput.ts +9 -2
- package/src/generic/FireAndForgetHeartbeat.ts +35 -16
- package/src/generic/OrphanedConversationDetailReconciler.ts +267 -0
- package/src/generic/PushStatusResolver.ts +118 -8
- package/src/generic/ResolverBase.ts +65 -57
- package/src/generic/RunViewResolver.ts +22 -22
- package/src/generic/__tests__/FireAndForgetHeartbeat.test.ts +7 -7
- package/src/index.ts +137 -11
- package/src/integration/CustomColumnPromoter.ts +6 -1
- package/src/integration/EntityMapLifecycle.ts +20 -2
- package/src/logging/NoLog.ts +16 -2
- package/src/logging/StartupLogger.ts +6 -1
- package/src/logging/bootAudit.ts +26 -16
- package/src/logging/boundaryLogPayload.ts +8 -1
- package/src/logging/secretRedactor.ts +14 -9
- package/src/logging/shortenForLog.ts +8 -3
- package/src/logging/variablesLoggingMiddleware.ts +9 -6
- package/src/metadataRefreshSignal.ts +45 -0
- package/src/middleware/MJTenantFilterMiddleware.ts +4 -4
- package/src/multiTenancy/index.ts +29 -5
- package/src/realtimeWidget/WidgetRouter.ts +15 -10
- package/src/realtimeWidget/WidgetSessionService.ts +76 -76
- package/src/realtimeWidget/host-identity.ts +24 -10
- package/src/realtimeWidget/index.ts +3 -3
- package/src/realtimeWidget/visitorIdentity.ts +39 -8
- package/src/realtimeWidget/widgetCore.ts +75 -10
- package/src/realtimeWidget/widgetGuestElevation.ts +25 -12
- package/src/resolvers/AdhocQueryResolver.ts +3 -3
- package/src/resolvers/AgentRunStatusPublisher.ts +175 -0
- package/src/resolvers/AgentSessionResolver.ts +3 -3
- package/src/resolvers/ColorResolver.ts +6 -6
- package/src/resolvers/ComponentRegistryResolver.ts +36 -36
- package/src/resolvers/ConversationRunEventsResolver.ts +308 -0
- package/src/resolvers/DuplicateEntryCheckResolver.ts +232 -0
- package/src/resolvers/EntityCommunicationsResolver.ts +4 -4
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +9 -9
- package/src/resolvers/FetchEntityVectorsResolver.ts +2 -1
- package/src/resolvers/FileResolver.ts +42 -42
- package/src/resolvers/GeoResolver.ts +4 -4
- package/src/resolvers/GetDataResolver.ts +50 -15
- package/src/resolvers/IntegrationDiscoveryResolver.ts +2 -2
- package/src/resolvers/ListOperationsResolver.ts +78 -28
- package/src/resolvers/MCPResolver.ts +30 -15
- package/src/resolvers/MergeRecordsResolver.ts +14 -2
- package/src/resolvers/QueryResolver.ts +13 -13
- package/src/resolvers/RealtimeBridgeResolver.ts +3 -3
- package/src/resolvers/RealtimeClientSessionResolver.ts +96 -38
- package/src/resolvers/RemoteBrowserActionResolver.ts +5 -5
- package/src/resolvers/RunAIAgentResolver.ts +134 -239
- package/src/resolvers/RunAIPromptResolver.ts +22 -22
- package/src/resolvers/RunDecisionResolver.ts +435 -0
- package/src/resolvers/RunTemplateResolver.ts +4 -4
- package/src/resolvers/RunTestResolver.ts +25 -25
- package/src/resolvers/SqlLoggingConfigResolver.ts +56 -56
- package/src/resolvers/TaskGraphFrameResolver.ts +37 -28
- package/src/resolvers/TelemetryResolver.ts +79 -79
- package/src/resolvers/VectorizeEntityResolver.ts +16 -11
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +40 -38
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +93 -0
- package/src/resolvers/__tests__/artifact-routing.test.ts +23 -23
- package/src/resolvers/adhoc-query-helpers.ts +19 -2
- package/src/resolvers/artifact-routing.ts +19 -19
- package/src/resolvers/meetingRecordingRegistration.ts +44 -10
- package/src/resolvers/peaksSidecar.ts +12 -2
- package/src/rest/EntityCRUDHandler.ts +24 -4
- package/src/rest/MediaStreamHandler.ts +11 -6
- package/src/rest/OAuthCallbackHandler.ts +25 -7
- package/src/rest/RESTEndpointHandler.ts +20 -15
- package/src/rest/RealtimeSdpBrokerHandler.ts +14 -4
- package/src/rest/SignatureWebhookHandler.ts +6 -1
- package/src/rest/UploadTokenManager.ts +66 -30
- package/src/rest/ViewOperationsHandler.ts +24 -4
- package/src/rest/mediaRange.ts +16 -6
- package/src/rest/setupRESTEndpoints.ts +24 -12
- package/src/serverExtensionReservedRoots.ts +6 -1
- package/src/services/TaskGraphActionRunner.ts +16 -15
- package/src/types.ts +21 -16
- package/src/util.ts +16 -6
|
@@ -2,32 +2,32 @@ import { describe, it, expect } from 'vitest';
|
|
|
2
2
|
import jwt from 'jsonwebtoken';
|
|
3
3
|
import { createPublicKey } from 'node:crypto';
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
ParseAllowedOrigins,
|
|
6
|
+
IsOriginAllowed,
|
|
7
|
+
IsModalityEnabled,
|
|
8
|
+
EvaluateWidgetMint,
|
|
9
|
+
BuildWidgetGuestClaims,
|
|
10
|
+
LooksLikeBot,
|
|
11
11
|
} from '../realtimeWidget/widgetCore.js';
|
|
12
12
|
import { MagicLinkKeyManager } from '../auth/magicLink/MagicLinkKeys.js';
|
|
13
13
|
|
|
14
14
|
describe('widget core — parseAllowedOrigins', () => {
|
|
15
15
|
it('parses a JSON array of origins', () => {
|
|
16
|
-
expect(
|
|
16
|
+
expect(ParseAllowedOrigins('["https://a.com","https://b.com"]')).toEqual(['https://a.com', 'https://b.com']);
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
it('tolerates a comma-separated string', () => {
|
|
20
|
-
expect(
|
|
20
|
+
expect(ParseAllowedOrigins('https://a.com, https://b.com')).toEqual(['https://a.com', 'https://b.com']);
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
it('normalizes case and strips trailing slashes', () => {
|
|
24
|
-
expect(
|
|
24
|
+
expect(ParseAllowedOrigins('["HTTPS://Acme.COM/"]')).toEqual(['https://acme.com']);
|
|
25
25
|
});
|
|
26
26
|
|
|
27
27
|
it('returns empty (fail-closed) for null / blank / non-array JSON', () => {
|
|
28
|
-
expect(
|
|
29
|
-
expect(
|
|
30
|
-
expect(
|
|
28
|
+
expect(ParseAllowedOrigins(null)).toEqual([]);
|
|
29
|
+
expect(ParseAllowedOrigins(' ')).toEqual([]);
|
|
30
|
+
expect(ParseAllowedOrigins('{"not":"an-array"}')).toEqual([]);
|
|
31
31
|
});
|
|
32
32
|
});
|
|
33
33
|
|
|
@@ -35,37 +35,37 @@ describe('widget core — isOriginAllowed (fail-closed)', () => {
|
|
|
35
35
|
const allowed = ['https://acme.com', 'https://www.acme.com'];
|
|
36
36
|
|
|
37
37
|
it('accepts an exact (normalized) match', () => {
|
|
38
|
-
expect(
|
|
39
|
-
expect(
|
|
38
|
+
expect(IsOriginAllowed('https://acme.com', allowed)).toBe(true);
|
|
39
|
+
expect(IsOriginAllowed('HTTPS://ACME.COM/', allowed)).toBe(true);
|
|
40
40
|
});
|
|
41
41
|
|
|
42
42
|
it('rejects a non-listed origin', () => {
|
|
43
|
-
expect(
|
|
44
|
-
expect(
|
|
43
|
+
expect(IsOriginAllowed('https://evil.com', allowed)).toBe(false);
|
|
44
|
+
expect(IsOriginAllowed('https://sub.acme.com', allowed)).toBe(false);
|
|
45
45
|
});
|
|
46
46
|
|
|
47
47
|
it('rejects a missing request origin', () => {
|
|
48
|
-
expect(
|
|
49
|
-
expect(
|
|
48
|
+
expect(IsOriginAllowed(undefined, allowed)).toBe(false);
|
|
49
|
+
expect(IsOriginAllowed('', allowed)).toBe(false);
|
|
50
50
|
});
|
|
51
51
|
|
|
52
52
|
it('rejects everything when the allowlist is empty (never "*")', () => {
|
|
53
|
-
expect(
|
|
53
|
+
expect(IsOriginAllowed('https://acme.com', [])).toBe(false);
|
|
54
54
|
});
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
describe('widget core — isModalityEnabled', () => {
|
|
58
58
|
it('Both enables text and voice', () => {
|
|
59
|
-
expect(
|
|
60
|
-
expect(
|
|
59
|
+
expect(IsModalityEnabled('Both', 'Text')).toBe(true);
|
|
60
|
+
expect(IsModalityEnabled('Both', 'Voice')).toBe(true);
|
|
61
61
|
});
|
|
62
62
|
it('Text enables only text', () => {
|
|
63
|
-
expect(
|
|
64
|
-
expect(
|
|
63
|
+
expect(IsModalityEnabled('Text', 'Text')).toBe(true);
|
|
64
|
+
expect(IsModalityEnabled('Text', 'Voice')).toBe(false);
|
|
65
65
|
});
|
|
66
66
|
it('Voice enables only voice', () => {
|
|
67
|
-
expect(
|
|
68
|
-
expect(
|
|
67
|
+
expect(IsModalityEnabled('Voice', 'Voice')).toBe(true);
|
|
68
|
+
expect(IsModalityEnabled('Voice', 'Text')).toBe(false);
|
|
69
69
|
});
|
|
70
70
|
});
|
|
71
71
|
|
|
@@ -73,22 +73,22 @@ describe('widget core — evaluateWidgetMint', () => {
|
|
|
73
73
|
const base = { Status: 'Active', AllowedOrigins: '["https://acme.com"]', Modality: 'Both' };
|
|
74
74
|
|
|
75
75
|
it('passes for an active widget from an allowed origin', () => {
|
|
76
|
-
expect(
|
|
76
|
+
expect(EvaluateWidgetMint(base, 'https://acme.com')).toEqual({ ok: true });
|
|
77
77
|
});
|
|
78
78
|
|
|
79
79
|
it('rejects a disabled widget', () => {
|
|
80
|
-
expect(
|
|
80
|
+
expect(EvaluateWidgetMint({ ...base, Status: 'Disabled' }, 'https://acme.com')).toEqual({
|
|
81
81
|
ok: false,
|
|
82
82
|
errorCode: 'disabled',
|
|
83
83
|
});
|
|
84
84
|
});
|
|
85
85
|
|
|
86
86
|
it('rejects a disallowed origin', () => {
|
|
87
|
-
expect(
|
|
87
|
+
expect(EvaluateWidgetMint(base, 'https://evil.com')).toEqual({ ok: false, errorCode: 'origin_not_allowed' });
|
|
88
88
|
});
|
|
89
89
|
|
|
90
90
|
it('rejects a missing origin (fail-closed)', () => {
|
|
91
|
-
expect(
|
|
91
|
+
expect(EvaluateWidgetMint(base, undefined)).toEqual({ ok: false, errorCode: 'origin_not_allowed' });
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
94
|
|
|
@@ -106,14 +106,14 @@ describe('widget core — buildWidgetGuestClaims', () => {
|
|
|
106
106
|
};
|
|
107
107
|
|
|
108
108
|
it('marks the session anonymous + magic-link and binds the widget id', () => {
|
|
109
|
-
const claims =
|
|
109
|
+
const claims = BuildWidgetGuestClaims(args);
|
|
110
110
|
expect(claims.mj_anon).toBe(true);
|
|
111
111
|
expect(claims.mj_magic_link).toBe(true);
|
|
112
112
|
expect(claims.mj_widget_id).toBe('WIDGET-123');
|
|
113
113
|
});
|
|
114
114
|
|
|
115
115
|
it('scopes to the application + guest role and the configured anon email', () => {
|
|
116
|
-
const claims =
|
|
116
|
+
const claims = BuildWidgetGuestClaims(args);
|
|
117
117
|
expect(claims.mj_app_id).toBe('APP-1');
|
|
118
118
|
expect(claims.mj_role).toBe('Widget Guest');
|
|
119
119
|
expect(claims.email).toBe('anonymous@magic-link.local');
|
|
@@ -122,13 +122,13 @@ describe('widget core — buildWidgetGuestClaims', () => {
|
|
|
122
122
|
});
|
|
123
123
|
|
|
124
124
|
it('carries a single scope entry for the guest grant', () => {
|
|
125
|
-
const claims =
|
|
125
|
+
const claims = BuildWidgetGuestClaims(args);
|
|
126
126
|
expect(claims.mj_scopes).toHaveLength(1);
|
|
127
127
|
expect(claims.mj_scopes?.[0]).toMatchObject({ appId: 'APP-1', role: 'Widget Guest' });
|
|
128
128
|
});
|
|
129
129
|
|
|
130
130
|
it('sets exp = iat + ttl', () => {
|
|
131
|
-
const claims =
|
|
131
|
+
const claims = BuildWidgetGuestClaims(args);
|
|
132
132
|
expect(claims.iat).toBe(1_000_000);
|
|
133
133
|
expect(claims.exp).toBe(1_000_900);
|
|
134
134
|
});
|
|
@@ -139,7 +139,7 @@ describe('widget core — RS256 sign + verify roundtrip (reuses MagicLinkKeyMana
|
|
|
139
139
|
const km = MagicLinkKeyManager.Instance;
|
|
140
140
|
km.Initialize(); // ephemeral keypair (idempotent if already initialized in-process)
|
|
141
141
|
|
|
142
|
-
const claims =
|
|
142
|
+
const claims = BuildWidgetGuestClaims({
|
|
143
143
|
issuer: 'https://mj.example.com',
|
|
144
144
|
audience: 'mj-magic-link',
|
|
145
145
|
widgetId: 'WIDGET-XYZ',
|
|
@@ -164,7 +164,7 @@ describe('widget core — RS256 sign + verify roundtrip (reuses MagicLinkKeyMana
|
|
|
164
164
|
it('rejects a tampered widget token', () => {
|
|
165
165
|
const km = MagicLinkKeyManager.Instance;
|
|
166
166
|
km.Initialize();
|
|
167
|
-
const claims =
|
|
167
|
+
const claims = BuildWidgetGuestClaims({
|
|
168
168
|
issuer: 'https://mj.example.com',
|
|
169
169
|
audience: 'mj-magic-link',
|
|
170
170
|
widgetId: 'W',
|
|
@@ -184,21 +184,21 @@ describe('widget core — RS256 sign + verify roundtrip (reuses MagicLinkKeyMana
|
|
|
184
184
|
|
|
185
185
|
describe('widget core — looksLikeBot (W6 mint heuristic)', () => {
|
|
186
186
|
it('flags a missing / blank user-agent as a bot', () => {
|
|
187
|
-
expect(
|
|
188
|
-
expect(
|
|
189
|
-
expect(
|
|
187
|
+
expect(LooksLikeBot(undefined)).toBe(true);
|
|
188
|
+
expect(LooksLikeBot(null)).toBe(true);
|
|
189
|
+
expect(LooksLikeBot(' ')).toBe(true);
|
|
190
190
|
});
|
|
191
191
|
|
|
192
192
|
it('flags known automation user-agents', () => {
|
|
193
|
-
expect(
|
|
194
|
-
expect(
|
|
195
|
-
expect(
|
|
196
|
-
expect(
|
|
197
|
-
expect(
|
|
193
|
+
expect(LooksLikeBot('curl/8.4.0')).toBe(true);
|
|
194
|
+
expect(LooksLikeBot('python-requests/2.31')).toBe(true);
|
|
195
|
+
expect(LooksLikeBot('Googlebot/2.1 (+http://www.google.com/bot.html)')).toBe(true);
|
|
196
|
+
expect(LooksLikeBot('Mozilla/5.0 (compatible; bingbot/2.0)')).toBe(true);
|
|
197
|
+
expect(LooksLikeBot('HeadlessChrome/120.0.0.0')).toBe(true);
|
|
198
198
|
});
|
|
199
199
|
|
|
200
200
|
it('allows real browser user-agents', () => {
|
|
201
|
-
expect(
|
|
202
|
-
expect(
|
|
201
|
+
expect(LooksLikeBot('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36')).toBe(false);
|
|
202
|
+
expect(LooksLikeBot('Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Version/17.0 Mobile/15E148 Safari/604.1')).toBe(false);
|
|
203
203
|
});
|
|
204
204
|
});
|
|
@@ -13,8 +13,8 @@ vi.mock('@memberjunction/generic-database-provider', () => ({
|
|
|
13
13
|
}));
|
|
14
14
|
|
|
15
15
|
import {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
ResolveWidgetGuestRunContext,
|
|
17
|
+
ElevateUserPayload,
|
|
18
18
|
ResolveScopedAnonymousRunUser,
|
|
19
19
|
} from '../realtimeWidget/widgetGuestElevation.js';
|
|
20
20
|
import type { UserPayload } from '../types.js';
|
|
@@ -29,12 +29,12 @@ function payloadWith(userRecord: Partial<UserInfo>): UserPayload {
|
|
|
29
29
|
|
|
30
30
|
describe('widgetGuestElevation — resolveWidgetGuestRunContext (guard paths, no DB)', () => {
|
|
31
31
|
it('returns null for a normal authenticated user (not anonymous)', async () => {
|
|
32
|
-
const result = await
|
|
32
|
+
const result = await ResolveWidgetGuestRunContext(payloadWith({ IsMagicLinkAnonymous: false }), providerStub);
|
|
33
33
|
expect(result).toBeNull();
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
it('returns null for an anonymous magic-link session that is NOT a widget guest (no WidgetGuestContext)', async () => {
|
|
37
|
-
const result = await
|
|
37
|
+
const result = await ResolveWidgetGuestRunContext(
|
|
38
38
|
payloadWith({ IsMagicLinkAnonymous: true, WidgetGuestContext: undefined }),
|
|
39
39
|
providerStub,
|
|
40
40
|
);
|
|
@@ -42,7 +42,7 @@ describe('widgetGuestElevation — resolveWidgetGuestRunContext (guard paths, no
|
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
it('returns null when userRecord is absent', async () => {
|
|
45
|
-
const result = await
|
|
45
|
+
const result = await ResolveWidgetGuestRunContext({ email: '', userRecord: undefined, sessionId: 's' }, providerStub);
|
|
46
46
|
expect(result).toBeNull();
|
|
47
47
|
});
|
|
48
48
|
});
|
|
@@ -104,7 +104,7 @@ describe('widgetGuestElevation — elevateUserPayload', () => {
|
|
|
104
104
|
const guestPayload = payloadWith({ IsMagicLinkAnonymous: true });
|
|
105
105
|
const systemUser = { Email: 'system@system.org' } as UserInfo;
|
|
106
106
|
|
|
107
|
-
const elevated =
|
|
107
|
+
const elevated = ElevateUserPayload(guestPayload, systemUser);
|
|
108
108
|
|
|
109
109
|
expect(elevated.userRecord).toBe(systemUser);
|
|
110
110
|
expect(elevated.email).toBe('system@system.org');
|
|
@@ -117,7 +117,7 @@ describe('widgetGuestElevation — elevateUserPayload', () => {
|
|
|
117
117
|
const guestPayload = payloadWith({ IsMagicLinkAnonymous: true });
|
|
118
118
|
const systemUser = { Email: 'system@system.org' } as UserInfo;
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
ElevateUserPayload(guestPayload, systemUser);
|
|
121
121
|
|
|
122
122
|
expect(guestPayload.isSystemUser).toBeUndefined();
|
|
123
123
|
expect(guestPayload.email).toBe('anonymous@magic-link.local');
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
2
|
import jwt from 'jsonwebtoken';
|
|
3
3
|
import { generateKeyPairSync } from 'node:crypto';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { VerifyHostAssertion, ExtractHostIdentity } from '../realtimeWidget/host-identity.js';
|
|
5
|
+
import { BuildWidgetGuestClaims } from '../realtimeWidget/widgetCore.js';
|
|
6
6
|
|
|
7
7
|
/** A throwaway RSA keypair for signing test host assertions. */
|
|
8
8
|
function keypair(): { privatePem: string; publicPem: string } {
|
|
@@ -23,54 +23,54 @@ describe('verifyHostAssertion', () => {
|
|
|
23
23
|
it('accepts a valid host assertion and extracts the identity', () => {
|
|
24
24
|
const kp = keypair();
|
|
25
25
|
const token = sign(kp.privatePem, { email: 'jane@acme.com', given_name: 'Jane', family_name: 'Doe', sub: 'host-123' });
|
|
26
|
-
const result =
|
|
26
|
+
const result = VerifyHostAssertion(token, kp.publicPem, WIDGET_KEY);
|
|
27
27
|
expect(result.ok).toBe(true);
|
|
28
28
|
if (result.ok) {
|
|
29
|
-
expect(result.
|
|
29
|
+
expect(result.Identity).toMatchObject({ email: 'jane@acme.com', firstName: 'Jane', lastName: 'Doe', hostUserId: 'host-123' });
|
|
30
30
|
}
|
|
31
31
|
});
|
|
32
32
|
|
|
33
33
|
it('rejects a missing assertion', () => {
|
|
34
34
|
const kp = keypair();
|
|
35
|
-
expect(
|
|
35
|
+
expect(VerifyHostAssertion(undefined, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'missing' });
|
|
36
36
|
});
|
|
37
37
|
|
|
38
38
|
it('rejects when no host key is configured (fail-closed)', () => {
|
|
39
39
|
const kp = keypair();
|
|
40
40
|
const token = sign(kp.privatePem, { email: 'x@y.com' });
|
|
41
|
-
expect(
|
|
41
|
+
expect(VerifyHostAssertion(token, undefined, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'no_key' });
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
it('rejects a signature from the wrong key', () => {
|
|
45
45
|
const signer = keypair();
|
|
46
46
|
const other = keypair();
|
|
47
47
|
const token = sign(signer.privatePem, { email: 'x@y.com' });
|
|
48
|
-
expect(
|
|
48
|
+
expect(VerifyHostAssertion(token, other.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'bad_signature' });
|
|
49
49
|
});
|
|
50
50
|
|
|
51
51
|
it('rejects a wrong-audience assertion', () => {
|
|
52
52
|
const kp = keypair();
|
|
53
53
|
const token = sign(kp.privatePem, { email: 'x@y.com' }, { audience: 'pk_live_someone_else' });
|
|
54
|
-
expect(
|
|
54
|
+
expect(VerifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'bad_signature' });
|
|
55
55
|
});
|
|
56
56
|
|
|
57
57
|
it('rejects an expired assertion', () => {
|
|
58
58
|
const kp = keypair();
|
|
59
59
|
const token = sign(kp.privatePem, { email: 'x@y.com' }, { expiresIn: -10 });
|
|
60
|
-
expect(
|
|
60
|
+
expect(VerifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'expired' });
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
it('rejects an assertion with no email', () => {
|
|
64
64
|
const kp = keypair();
|
|
65
65
|
const token = sign(kp.privatePem, { given_name: 'NoEmail' });
|
|
66
|
-
expect(
|
|
66
|
+
expect(VerifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'no_email' });
|
|
67
67
|
});
|
|
68
68
|
|
|
69
69
|
it('rejects an assertion with no exp (unbounded lifetime)', () => {
|
|
70
70
|
const kp = keypair();
|
|
71
71
|
// Sign directly with no expiresIn so the token carries iat but no exp.
|
|
72
72
|
const token = jwt.sign({ email: 'x@y.com' }, kp.privatePem, { algorithm: 'RS256', audience: WIDGET_KEY });
|
|
73
|
-
expect(
|
|
73
|
+
expect(VerifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'expired' });
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
it('rejects an assertion older than the maxAge cap even when its exp is still in the future', () => {
|
|
@@ -81,13 +81,13 @@ describe('verifyHostAssertion', () => {
|
|
|
81
81
|
algorithm: 'RS256',
|
|
82
82
|
audience: WIDGET_KEY,
|
|
83
83
|
});
|
|
84
|
-
expect(
|
|
84
|
+
expect(VerifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'expired' });
|
|
85
85
|
});
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
describe('buildWidgetGuestClaims with hostIdentity', () => {
|
|
89
89
|
it('carries the host identity as INFORMATIONAL claims but keeps the Anonymous principal email', () => {
|
|
90
|
-
const claims =
|
|
90
|
+
const claims = BuildWidgetGuestClaims({
|
|
91
91
|
issuer: 'iss',
|
|
92
92
|
audience: 'mj-magic-link',
|
|
93
93
|
widgetId: 'W',
|
|
@@ -111,7 +111,7 @@ describe('buildWidgetGuestClaims with hostIdentity', () => {
|
|
|
111
111
|
|
|
112
112
|
describe('extractHostIdentity', () => {
|
|
113
113
|
it('tolerates firstName/lastName fallbacks', () => {
|
|
114
|
-
const id =
|
|
114
|
+
const id = ExtractHostIdentity({ email: 'a@b.com', firstName: 'Al', lastName: 'Bo' });
|
|
115
115
|
expect(id).toMatchObject({ email: 'a@b.com', firstName: 'Al', lastName: 'Bo' });
|
|
116
116
|
});
|
|
117
117
|
});
|
|
@@ -52,7 +52,7 @@ const MAX_TRANSCRIPT_TURNS = 60;
|
|
|
52
52
|
* `ExpiresAt` that many days out (the Memory Manager's decay phase reaps expired notes). Omit/0
|
|
53
53
|
* for no expiry (system default retention applies).
|
|
54
54
|
*/
|
|
55
|
-
export async function
|
|
55
|
+
export async function WriteReturningVisitorRecap(
|
|
56
56
|
conversationId: string | null | undefined,
|
|
57
57
|
agentId: string | null | undefined,
|
|
58
58
|
contextUser: UserInfo,
|
|
@@ -101,6 +101,17 @@ export async function writeReturningVisitorRecap(
|
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
/** @deprecated Use {@link WriteReturningVisitorRecap}. */
|
|
105
|
+
export async function writeReturningVisitorRecap(
|
|
106
|
+
conversationId: string | null | undefined,
|
|
107
|
+
agentId: string | null | undefined,
|
|
108
|
+
contextUser: UserInfo,
|
|
109
|
+
provider: IMetadataProvider,
|
|
110
|
+
retentionDays?: number | null,
|
|
111
|
+
): Promise<void> {
|
|
112
|
+
return WriteReturningVisitorRecap(conversationId, agentId, contextUser, provider, retentionDays);
|
|
113
|
+
}
|
|
114
|
+
|
|
104
115
|
/** The polymorphic scope a recap note is filed under. */
|
|
105
116
|
interface RecapScope {
|
|
106
117
|
entityId: string;
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import { AIAgentPermissionHelper } from '@memberjunction/ai-engine-base';
|
|
9
9
|
import { RealtimeClientSessionService, RealtimeChannelServerHost } from '@memberjunction/ai-agents';
|
|
10
10
|
import { GetHostInstanceID } from './HostInstance.js';
|
|
11
|
-
import {
|
|
11
|
+
import { WriteReturningVisitorRecap } from './ReturningVisitorRecap.js';
|
|
12
12
|
import { ResolveScopedAnonymousRunUser } from '../realtimeWidget/widgetGuestElevation.js';
|
|
13
13
|
|
|
14
14
|
/** Entity names — centralised so the `MJ:`-prefix convention is applied in exactly one place. */
|
|
@@ -207,7 +207,7 @@ export class SessionManager {
|
|
|
207
207
|
// Returning-visitor recap (RV2): if this session's conversation is returning-visitor-enabled,
|
|
208
208
|
// summarize it into an Active memory note so the visitor's next session opens with prior context.
|
|
209
209
|
// Best-effort + no-op for non-returning-visitor conversations; never blocks teardown.
|
|
210
|
-
await
|
|
210
|
+
await WriteReturningVisitorRecap(session.ConversationID, session.AgentID, contextUser, provider);
|
|
211
211
|
return true;
|
|
212
212
|
}
|
|
213
213
|
|
|
@@ -34,7 +34,7 @@ import { buildProgressNote, CdpRemoteBrowserSession, type ComputerUseGoalProgres
|
|
|
34
34
|
* @param agentRunStepID Optional parent agent-run-step id (nests a child prompt step per prompt under it).
|
|
35
35
|
* @returns The MJ-aware params to hand to `MJComputerUseEngine.Run`.
|
|
36
36
|
*/
|
|
37
|
-
export function
|
|
37
|
+
export function BuildMJGoalParams(params: RunComputerUseParams, contextUser?: UserInfo, agentRunID?: string, agentRunStepID?: string): MJRunComputerUseParams {
|
|
38
38
|
const mjParams = Object.assign(new MJRunComputerUseParams(), params);
|
|
39
39
|
mjParams.ContextUser = contextUser;
|
|
40
40
|
mjParams.AgentRunId = agentRunID;
|
|
@@ -42,6 +42,11 @@ export function buildMJGoalParams(params: RunComputerUseParams, contextUser?: Us
|
|
|
42
42
|
return mjParams;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/** @deprecated Use {@link BuildMJGoalParams}. */
|
|
46
|
+
export function buildMJGoalParams(params: RunComputerUseParams, contextUser?: UserInfo, agentRunID?: string, agentRunStepID?: string): MJRunComputerUseParams {
|
|
47
|
+
return BuildMJGoalParams(params, contextUser, agentRunID, agentRunStepID);
|
|
48
|
+
}
|
|
49
|
+
|
|
45
50
|
/**
|
|
46
51
|
* The MJ-aware goal engine bound in production. Extends {@link MJComputerUseEngine} (prompt-runner routing,
|
|
47
52
|
* vision-model auto-selection, credential resolution, media persistence) and satisfies the
|
|
@@ -75,7 +80,7 @@ export class MJProgressComputerUseEngine extends MJComputerUseEngine implements
|
|
|
75
80
|
* @returns The computer-use run result.
|
|
76
81
|
*/
|
|
77
82
|
public override async Run(params: RunComputerUseParams): Promise<ComputerUseResult> {
|
|
78
|
-
return super.Run(
|
|
83
|
+
return super.Run(BuildMJGoalParams(params, this.ContextUser, this.AgentRunID, this.AgentRunStepID));
|
|
79
84
|
}
|
|
80
85
|
|
|
81
86
|
protected override onStepComplete(step: StepRecord, params: MJRunComputerUseParams): void {
|
|
@@ -92,7 +97,7 @@ export class MJProgressComputerUseEngine extends MJComputerUseEngine implements
|
|
|
92
97
|
* @param configJson The session's `Config_` string.
|
|
93
98
|
* @returns The co-agent run id, or `undefined`.
|
|
94
99
|
*/
|
|
95
|
-
export function
|
|
100
|
+
export function ExtractCoAgentRunID(configJson: string | null | undefined): string | undefined {
|
|
96
101
|
if (!configJson) {
|
|
97
102
|
return undefined;
|
|
98
103
|
}
|
|
@@ -104,6 +109,11 @@ export function extractCoAgentRunID(configJson: string | null | undefined): stri
|
|
|
104
109
|
}
|
|
105
110
|
}
|
|
106
111
|
|
|
112
|
+
/** @deprecated Use {@link ExtractCoAgentRunID}. */
|
|
113
|
+
export function extractCoAgentRunID(configJson: string | null | undefined): string | undefined {
|
|
114
|
+
return ExtractCoAgentRunID(configJson);
|
|
115
|
+
}
|
|
116
|
+
|
|
107
117
|
/** Truncates a goal to a step-name-friendly length. */
|
|
108
118
|
function goalStepName(goal: string): string {
|
|
109
119
|
const trimmed = goal.trim();
|
|
@@ -122,7 +132,7 @@ function goalStepName(goal: string): string {
|
|
|
122
132
|
* @param goal The natural-language goal (becomes the step name).
|
|
123
133
|
* @returns The saved parent step (to finalize + nest under), or `null`.
|
|
124
134
|
*/
|
|
125
|
-
export async function
|
|
135
|
+
export async function BeginBrowserGoalStep(
|
|
126
136
|
provider: IMetadataProvider,
|
|
127
137
|
contextUser: UserInfo | undefined,
|
|
128
138
|
coAgentRunID: string | undefined,
|
|
@@ -152,6 +162,16 @@ export async function beginBrowserGoalStep(
|
|
|
152
162
|
}
|
|
153
163
|
}
|
|
154
164
|
|
|
165
|
+
/** @deprecated Use {@link BeginBrowserGoalStep}. */
|
|
166
|
+
export async function beginBrowserGoalStep(
|
|
167
|
+
provider: IMetadataProvider,
|
|
168
|
+
contextUser: UserInfo | undefined,
|
|
169
|
+
coAgentRunID: string | undefined,
|
|
170
|
+
goal: string,
|
|
171
|
+
): Promise<MJAIAgentRunStepEntity | null> {
|
|
172
|
+
return BeginBrowserGoalStep(provider, contextUser, coAgentRunID, goal);
|
|
173
|
+
}
|
|
174
|
+
|
|
155
175
|
/**
|
|
156
176
|
* Finalizes the parent browser-goal step from the goal outcome — `Completed`/`Failed` with an `OutputData`
|
|
157
177
|
* envelope of strategy/status/step-count/url. A no-op when `step` is `null`. Best-effort (logged, never thrown).
|
|
@@ -159,7 +179,7 @@ export async function beginBrowserGoalStep(
|
|
|
159
179
|
* @param step The parent step from {@link beginBrowserGoalStep} (or `null`).
|
|
160
180
|
* @param result The goal outcome.
|
|
161
181
|
*/
|
|
162
|
-
export async function
|
|
182
|
+
export async function FinalizeBrowserGoalStep(step: MJAIAgentRunStepEntity | null, result: RemoteBrowserGoalResult): Promise<void> {
|
|
163
183
|
if (!step) {
|
|
164
184
|
return;
|
|
165
185
|
}
|
|
@@ -177,6 +197,11 @@ export async function finalizeBrowserGoalStep(step: MJAIAgentRunStepEntity | nul
|
|
|
177
197
|
}
|
|
178
198
|
}
|
|
179
199
|
|
|
200
|
+
/** @deprecated Use {@link FinalizeBrowserGoalStep}. */
|
|
201
|
+
export async function finalizeBrowserGoalStep(step: MJAIAgentRunStepEntity | null, result: RemoteBrowserGoalResult): Promise<void> {
|
|
202
|
+
return FinalizeBrowserGoalStep(step, result);
|
|
203
|
+
}
|
|
204
|
+
|
|
180
205
|
/**
|
|
181
206
|
* Binds the CDP goal-engine factory to {@link MJProgressComputerUseEngine}. Idempotent and safe to call at
|
|
182
207
|
* startup; failures are logged (never thrown) so a binding hiccup can't abort server boot — goal runs would
|
|
@@ -48,7 +48,7 @@ const CACHE_MAX_AGE_SECONDS = 60;
|
|
|
48
48
|
* list so the browser falls back to its compiled `AUTH_TYPE` and the user can still sign in.
|
|
49
49
|
* Returning 500 would take the login screen down for a problem the client can route around.
|
|
50
50
|
*/
|
|
51
|
-
export function
|
|
51
|
+
export function CreateAuthProviderCatalogRouter(): Router {
|
|
52
52
|
const router = Router();
|
|
53
53
|
|
|
54
54
|
const limiter = rateLimit({
|
|
@@ -74,3 +74,8 @@ export function createAuthProviderCatalogRouter(): Router {
|
|
|
74
74
|
|
|
75
75
|
return router;
|
|
76
76
|
}
|
|
77
|
+
|
|
78
|
+
/** @deprecated Use {@link CreateAuthProviderCatalogRouter}. */
|
|
79
|
+
export function createAuthProviderCatalogRouter(): Router {
|
|
80
|
+
return CreateAuthProviderCatalogRouter();
|
|
81
|
+
}
|
|
@@ -12,7 +12,7 @@ vi.mock('../../config', () => ({
|
|
|
12
12
|
}));
|
|
13
13
|
|
|
14
14
|
import { AuthProviderFactory, IAuthProvider } from '@memberjunction/auth-providers';
|
|
15
|
-
import {
|
|
15
|
+
import { InitializeAuthProviders } from '../initializeProviders';
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Test suite for backward compatibility of the new auth provider system
|
|
@@ -21,6 +21,7 @@ describe('Authentication Provider Backward Compatibility', () => {
|
|
|
21
21
|
let factory: AuthProviderFactory;
|
|
22
22
|
|
|
23
23
|
beforeEach(() => {
|
|
24
|
+
vi.spyOn(AuthProviderFactory, 'DiscoverFromEnvironment').mockReturnValue([]);
|
|
24
25
|
factory = AuthProviderFactory.Instance;
|
|
25
26
|
factory.clear();
|
|
26
27
|
});
|
|
@@ -31,7 +32,7 @@ describe('Authentication Provider Backward Compatibility', () => {
|
|
|
31
32
|
|
|
32
33
|
describe('Configuration-Based Provider Initialization', () => {
|
|
33
34
|
it('should initialize with no providers when config is empty', () => {
|
|
34
|
-
|
|
35
|
+
InitializeAuthProviders();
|
|
35
36
|
|
|
36
37
|
// With empty authProviders array, no providers should be registered
|
|
37
38
|
expect(factory.hasProviders()).toBe(false);
|
|
@@ -53,7 +54,7 @@ describe('Authentication Provider Backward Compatibility', () => {
|
|
|
53
54
|
expect(factory.hasProviders()).toBe(true);
|
|
54
55
|
|
|
55
56
|
// Re-initialize clears everything
|
|
56
|
-
|
|
57
|
+
InitializeAuthProviders();
|
|
57
58
|
expect(factory.hasProviders()).toBe(false);
|
|
58
59
|
});
|
|
59
60
|
});
|