@memberjunction/server 6.1.4 → 6.2.0-edge.1

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.
Files changed (435) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/agentSessions/ReturningVisitorRecap.d.ts +2 -0
  3. package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
  4. package/dist/agentSessions/ReturningVisitorRecap.js +5 -1
  5. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  6. package/dist/agentSessions/SessionManager.js +2 -2
  7. package/dist/agentSessions/remoteBrowserGoalEngine.d.ts +8 -0
  8. package/dist/agentSessions/remoteBrowserGoalEngine.d.ts.map +1 -1
  9. package/dist/agentSessions/remoteBrowserGoalEngine.js +21 -5
  10. package/dist/agentSessions/remoteBrowserGoalEngine.js.map +1 -1
  11. package/dist/auth/AuthProviderCatalogRouter.d.ts +2 -0
  12. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  13. package/dist/auth/AuthProviderCatalogRouter.js +5 -1
  14. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  15. package/dist/auth/exampleNewUserSubClass.js +2 -1
  16. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  17. package/dist/auth/index.d.ts +20 -1
  18. package/dist/auth/index.d.ts.map +1 -1
  19. package/dist/auth/index.js +20 -10
  20. package/dist/auth/index.js.map +1 -1
  21. package/dist/auth/initializeProviders.d.ts +8 -0
  22. package/dist/auth/initializeProviders.d.ts.map +1 -1
  23. package/dist/auth/initializeProviders.js +21 -5
  24. package/dist/auth/initializeProviders.js.map +1 -1
  25. package/dist/auth/magicLink/MagicLinkRouter.d.ts +9 -0
  26. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  27. package/dist/auth/magicLink/MagicLinkRouter.js +22 -10
  28. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  29. package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
  30. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  31. package/dist/auth/magicLink/MagicLinkService.js +65 -51
  32. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  33. package/dist/auth/magicLink/index.d.ts +2 -2
  34. package/dist/auth/magicLink/index.d.ts.map +1 -1
  35. package/dist/auth/magicLink/index.js +2 -2
  36. package/dist/auth/magicLink/index.js.map +1 -1
  37. package/dist/auth/magicLink/magicLinkCore.d.ts +54 -33
  38. package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
  39. package/dist/auth/magicLink/magicLinkCore.js +61 -61
  40. package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
  41. package/dist/auth/magicLink/redeemLanding.d.ts +4 -0
  42. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  43. package/dist/auth/magicLink/redeemLanding.js +12 -4
  44. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  45. package/dist/auth/magicLink/types.d.ts +4 -4
  46. package/dist/auth/principals.d.ts +2 -0
  47. package/dist/auth/principals.d.ts.map +1 -1
  48. package/dist/auth/principals.js +6 -2
  49. package/dist/auth/principals.js.map +1 -1
  50. package/dist/cache.d.ts +2 -0
  51. package/dist/cache.d.ts.map +1 -1
  52. package/dist/cache.js +3 -1
  53. package/dist/cache.js.map +1 -1
  54. package/dist/config.d.ts +293 -2
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +11 -4
  57. package/dist/config.js.map +1 -1
  58. package/dist/context.d.ts +20 -0
  59. package/dist/context.d.ts.map +1 -1
  60. package/dist/context.js +27 -19
  61. package/dist/context.js.map +1 -1
  62. package/dist/directives/Public.d.ts +2 -0
  63. package/dist/directives/Public.d.ts.map +1 -1
  64. package/dist/directives/Public.js +3 -1
  65. package/dist/directives/Public.js.map +1 -1
  66. package/dist/directives/RequireSystemUser.d.ts +2 -0
  67. package/dist/directives/RequireSystemUser.d.ts.map +1 -1
  68. package/dist/directives/RequireSystemUser.js +3 -1
  69. package/dist/directives/RequireSystemUser.js.map +1 -1
  70. package/dist/generated/graphql-schemas/__mj.d.ts +266 -4
  71. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  72. package/dist/generated/graphql-schemas/__mj.js +1304 -0
  73. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  74. package/dist/generic/CacheInvalidationResolver.d.ts +8 -2
  75. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  76. package/dist/generic/CacheInvalidationResolver.js +7 -3
  77. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  78. package/dist/generic/FireAndForgetHeartbeat.d.ts +3 -1
  79. package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
  80. package/dist/generic/FireAndForgetHeartbeat.js +8 -4
  81. package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
  82. package/dist/generic/PushStatusResolver.d.ts +10 -1
  83. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  84. package/dist/generic/PushStatusResolver.js +11 -3
  85. package/dist/generic/PushStatusResolver.js.map +1 -1
  86. package/dist/generic/ResolverBase.d.ts +27 -1
  87. package/dist/generic/ResolverBase.d.ts.map +1 -1
  88. package/dist/generic/ResolverBase.js +64 -6
  89. package/dist/generic/ResolverBase.js.map +1 -1
  90. package/dist/index.d.ts +6 -0
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +29 -6
  93. package/dist/index.js.map +1 -1
  94. package/dist/integration/CustomColumnPromoter.d.ts +2 -0
  95. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  96. package/dist/integration/CustomColumnPromoter.js +5 -1
  97. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  98. package/dist/integration/EntityMapLifecycle.d.ts +4 -0
  99. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  100. package/dist/integration/EntityMapLifecycle.js +10 -2
  101. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  102. package/dist/logging/NoLog.d.ts +4 -0
  103. package/dist/logging/NoLog.d.ts.map +1 -1
  104. package/dist/logging/NoLog.js +10 -2
  105. package/dist/logging/NoLog.js.map +1 -1
  106. package/dist/logging/StartupLogger.d.ts +2 -0
  107. package/dist/logging/StartupLogger.d.ts.map +1 -1
  108. package/dist/logging/StartupLogger.js +5 -1
  109. package/dist/logging/StartupLogger.js.map +1 -1
  110. package/dist/logging/bootAudit.d.ts +11 -7
  111. package/dist/logging/bootAudit.d.ts.map +1 -1
  112. package/dist/logging/bootAudit.js +15 -7
  113. package/dist/logging/bootAudit.js.map +1 -1
  114. package/dist/logging/boundaryLogPayload.d.ts +4 -0
  115. package/dist/logging/boundaryLogPayload.d.ts.map +1 -1
  116. package/dist/logging/boundaryLogPayload.js +5 -1
  117. package/dist/logging/boundaryLogPayload.js.map +1 -1
  118. package/dist/logging/secretRedactor.d.ts +2 -0
  119. package/dist/logging/secretRedactor.d.ts.map +1 -1
  120. package/dist/logging/secretRedactor.js +8 -4
  121. package/dist/logging/secretRedactor.js.map +1 -1
  122. package/dist/logging/shortenForLog.d.ts +2 -0
  123. package/dist/logging/shortenForLog.d.ts.map +1 -1
  124. package/dist/logging/shortenForLog.js +7 -3
  125. package/dist/logging/shortenForLog.js.map +1 -1
  126. package/dist/logging/variablesLoggingMiddleware.d.ts +2 -0
  127. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  128. package/dist/logging/variablesLoggingMiddleware.js +8 -6
  129. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  130. package/dist/metadataRefreshSignal.d.ts +19 -0
  131. package/dist/metadataRefreshSignal.d.ts.map +1 -0
  132. package/dist/metadataRefreshSignal.js +45 -0
  133. package/dist/metadataRefreshSignal.js.map +1 -0
  134. package/dist/middleware/MJTenantFilterMiddleware.js +4 -4
  135. package/dist/multiTenancy/index.d.ts +8 -0
  136. package/dist/multiTenancy/index.d.ts.map +1 -1
  137. package/dist/multiTenancy/index.js +21 -5
  138. package/dist/multiTenancy/index.js.map +1 -1
  139. package/dist/realtimeWidget/WidgetRouter.d.ts +5 -0
  140. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  141. package/dist/realtimeWidget/WidgetRouter.js +14 -10
  142. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  143. package/dist/realtimeWidget/WidgetSessionService.d.ts +6 -6
  144. package/dist/realtimeWidget/WidgetSessionService.js +27 -27
  145. package/dist/realtimeWidget/host-identity.d.ts +5 -1
  146. package/dist/realtimeWidget/host-identity.d.ts.map +1 -1
  147. package/dist/realtimeWidget/host-identity.js +11 -3
  148. package/dist/realtimeWidget/host-identity.js.map +1 -1
  149. package/dist/realtimeWidget/index.d.ts +2 -2
  150. package/dist/realtimeWidget/index.d.ts.map +1 -1
  151. package/dist/realtimeWidget/index.js +2 -2
  152. package/dist/realtimeWidget/index.js.map +1 -1
  153. package/dist/realtimeWidget/visitorIdentity.d.ts +21 -1
  154. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  155. package/dist/realtimeWidget/visitorIdentity.js +16 -4
  156. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  157. package/dist/realtimeWidget/widgetCore.d.ts +48 -0
  158. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  159. package/dist/realtimeWidget/widgetCore.js +38 -10
  160. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  161. package/dist/realtimeWidget/widgetGuestElevation.d.ts +10 -6
  162. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  163. package/dist/realtimeWidget/widgetGuestElevation.js +14 -6
  164. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  165. package/dist/resolvers/AdhocQueryResolver.js +3 -3
  166. package/dist/resolvers/FetchEntityVectorsResolver.js +2 -2
  167. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  168. package/dist/resolvers/FileResolver.js +3 -3
  169. package/dist/resolvers/GeoResolver.d.ts +2 -2
  170. package/dist/resolvers/GeoResolver.js +4 -4
  171. package/dist/resolvers/GetDataResolver.d.ts +14 -0
  172. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  173. package/dist/resolvers/GetDataResolver.js +43 -15
  174. package/dist/resolvers/GetDataResolver.js.map +1 -1
  175. package/dist/resolvers/IntegrationDiscoveryResolver.js +2 -2
  176. package/dist/resolvers/ListOperationsResolver.d.ts +20 -0
  177. package/dist/resolvers/ListOperationsResolver.d.ts.map +1 -1
  178. package/dist/resolvers/ListOperationsResolver.js +68 -28
  179. package/dist/resolvers/ListOperationsResolver.js.map +1 -1
  180. package/dist/resolvers/MCPResolver.d.ts +11 -1
  181. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  182. package/dist/resolvers/MCPResolver.js +7 -3
  183. package/dist/resolvers/MCPResolver.js.map +1 -1
  184. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  185. package/dist/resolvers/QuerySystemUserResolver.js +2 -1
  186. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  187. package/dist/resolvers/RealtimeBridgeResolver.js +3 -3
  188. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +37 -0
  189. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  190. package/dist/resolvers/RealtimeClientSessionResolver.js +101 -11
  191. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  192. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -5
  193. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -4
  194. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  195. package/dist/resolvers/RunAIAgentResolver.js +74 -42
  196. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  197. package/dist/resolvers/RunAIPromptResolver.d.ts +1 -1
  198. package/dist/resolvers/RunAIPromptResolver.js +2 -2
  199. package/dist/resolvers/RunTestResolver.js +5 -5
  200. package/dist/resolvers/SearchEntitiesResolver.d.ts.map +1 -1
  201. package/dist/resolvers/SearchEntitiesResolver.js +3 -1
  202. package/dist/resolvers/SearchEntitiesResolver.js.map +1 -1
  203. package/dist/resolvers/SearchKnowledgeResolver.d.ts +1 -0
  204. package/dist/resolvers/SearchKnowledgeResolver.d.ts.map +1 -1
  205. package/dist/resolvers/SearchKnowledgeResolver.js +5 -0
  206. package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
  207. package/dist/resolvers/SearchKnowledgeSystemUserResolver.d.ts.map +1 -1
  208. package/dist/resolvers/SearchKnowledgeSystemUserResolver.js +1 -0
  209. package/dist/resolvers/SearchKnowledgeSystemUserResolver.js.map +1 -1
  210. package/dist/resolvers/SqlLoggingConfigResolver.d.ts +8 -4
  211. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  212. package/dist/resolvers/SqlLoggingConfigResolver.js +5 -5
  213. package/dist/resolvers/TaskGraphFrameResolver.d.ts +8 -1
  214. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  215. package/dist/resolvers/TaskGraphFrameResolver.js +6 -2
  216. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  217. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  218. package/dist/resolvers/TransactionGroupResolver.js +53 -4
  219. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  220. package/dist/resolvers/adhoc-query-helpers.d.ts +6 -0
  221. package/dist/resolvers/adhoc-query-helpers.d.ts.map +1 -1
  222. package/dist/resolvers/adhoc-query-helpers.js +10 -2
  223. package/dist/resolvers/adhoc-query-helpers.js.map +1 -1
  224. package/dist/resolvers/artifact-routing.d.ts +8 -8
  225. package/dist/resolvers/artifact-routing.js +2 -2
  226. package/dist/resolvers/artifact-routing.js.map +1 -1
  227. package/dist/resolvers/meetingRecordingRegistration.d.ts +10 -2
  228. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  229. package/dist/resolvers/meetingRecordingRegistration.js +24 -8
  230. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  231. package/dist/resolvers/peaksSidecar.d.ts +4 -0
  232. package/dist/resolvers/peaksSidecar.d.ts.map +1 -1
  233. package/dist/resolvers/peaksSidecar.js +10 -2
  234. package/dist/resolvers/peaksSidecar.js.map +1 -1
  235. package/dist/rest/EntityCRUDHandler.d.ts +28 -0
  236. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  237. package/dist/rest/EntityCRUDHandler.js +20 -4
  238. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  239. package/dist/rest/MediaStreamHandler.d.ts +2 -0
  240. package/dist/rest/MediaStreamHandler.d.ts.map +1 -1
  241. package/dist/rest/MediaStreamHandler.js +10 -6
  242. package/dist/rest/MediaStreamHandler.js.map +1 -1
  243. package/dist/rest/OAuthCallbackHandler.d.ts +9 -0
  244. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  245. package/dist/rest/OAuthCallbackHandler.js +15 -3
  246. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  247. package/dist/rest/RESTEndpointHandler.d.ts +6 -4
  248. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  249. package/dist/rest/RESTEndpointHandler.js +15 -11
  250. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  251. package/dist/rest/RealtimeSdpBrokerHandler.d.ts +5 -1
  252. package/dist/rest/RealtimeSdpBrokerHandler.d.ts.map +1 -1
  253. package/dist/rest/RealtimeSdpBrokerHandler.js +12 -4
  254. package/dist/rest/RealtimeSdpBrokerHandler.js.map +1 -1
  255. package/dist/rest/SignatureWebhookHandler.d.ts +2 -0
  256. package/dist/rest/SignatureWebhookHandler.d.ts.map +1 -1
  257. package/dist/rest/SignatureWebhookHandler.js +5 -1
  258. package/dist/rest/SignatureWebhookHandler.js.map +1 -1
  259. package/dist/rest/UploadTokenManager.d.ts +24 -8
  260. package/dist/rest/UploadTokenManager.d.ts.map +1 -1
  261. package/dist/rest/UploadTokenManager.js +53 -21
  262. package/dist/rest/UploadTokenManager.js.map +1 -1
  263. package/dist/rest/ViewOperationsHandler.d.ts +20 -0
  264. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  265. package/dist/rest/ViewOperationsHandler.js +20 -4
  266. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  267. package/dist/rest/mediaRange.d.ts +4 -0
  268. package/dist/rest/mediaRange.d.ts.map +1 -1
  269. package/dist/rest/mediaRange.js +10 -2
  270. package/dist/rest/mediaRange.js.map +1 -1
  271. package/dist/rest/setupRESTEndpoints.d.ts +4 -0
  272. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  273. package/dist/rest/setupRESTEndpoints.js +13 -7
  274. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  275. package/dist/serverExtensionReservedRoots.d.ts +2 -0
  276. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  277. package/dist/serverExtensionReservedRoots.js +5 -1
  278. package/dist/serverExtensionReservedRoots.js.map +1 -1
  279. package/dist/services/MJStorageBlobStore.d.ts +41 -0
  280. package/dist/services/MJStorageBlobStore.d.ts.map +1 -0
  281. package/dist/services/MJStorageBlobStore.js +160 -0
  282. package/dist/services/MJStorageBlobStore.js.map +1 -0
  283. package/dist/services/TaskGraphActionRunner.d.ts +13 -8
  284. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  285. package/dist/services/TaskGraphActionRunner.js +16 -15
  286. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  287. package/dist/types.d.ts +2 -0
  288. package/dist/types.d.ts.map +1 -1
  289. package/dist/types.js +7 -3
  290. package/dist/types.js.map +1 -1
  291. package/dist/util.d.ts +12 -3
  292. package/dist/util.d.ts.map +1 -1
  293. package/dist/util.js +19 -8
  294. package/dist/util.js.map +1 -1
  295. package/package.json +92 -92
  296. package/src/__tests__/FileResolverPeaks.test.ts +13 -13
  297. package/src/__tests__/ListOperationsResolver.test.ts +17 -17
  298. package/src/__tests__/MediaStreamHandler.test.ts +28 -28
  299. package/src/__tests__/NoLog.test.ts +11 -11
  300. package/src/__tests__/PrimaryKeyAlwaysMapped.test.ts +10 -10
  301. package/src/__tests__/RESTEndpointHandler.test.ts +14 -14
  302. package/src/__tests__/RealtimeBridgeResolver.test.ts +4 -2
  303. package/src/__tests__/RealtimeClientSessionResolver.test.ts +229 -0
  304. package/src/__tests__/RealtimeSdpBrokerHandler.test.ts +6 -6
  305. package/src/__tests__/RefreshAdoptsNewColumns.test.ts +8 -8
  306. package/src/__tests__/RemoteBrowserGoalEngine.test.ts +18 -18
  307. package/src/__tests__/ResolverBase.isaPromotionCreate.test.ts +412 -0
  308. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +228 -0
  309. package/src/__tests__/SearchEntitiesResolver.readOnlyFallback.test.ts +78 -0
  310. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +129 -0
  311. package/src/__tests__/TaskGraphFrameResolver.test.ts +2 -2
  312. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +290 -0
  313. package/src/__tests__/WidgetSessionService.test.ts +8 -4
  314. package/src/__tests__/adhoc-query-helpers.test.ts +21 -21
  315. package/src/__tests__/bootAudit.test.ts +11 -11
  316. package/src/__tests__/boundaryLogPayload.test.ts +6 -6
  317. package/src/__tests__/databaseAbstraction.test.ts +12 -6
  318. package/src/__tests__/getDataTokenRedaction.test.ts +7 -7
  319. package/src/__tests__/initializeProviders.refresh.test.ts +4 -4
  320. package/src/__tests__/magicLink.test.ts +73 -134
  321. package/src/__tests__/magicLinkService.consume.test.ts +224 -0
  322. package/src/__tests__/meetingRecordingRegistration.test.ts +12 -12
  323. package/src/__tests__/metadataRefreshSignal.test.ts +78 -0
  324. package/src/__tests__/multiTenancy.security.test.ts +40 -40
  325. package/src/__tests__/multiTenancy.test.ts +18 -18
  326. package/src/__tests__/newUsers.test.ts +24 -23
  327. package/src/__tests__/principals.test.ts +22 -22
  328. package/src/__tests__/pushStatusResolver.filter.test.ts +8 -8
  329. package/src/__tests__/secretRedactor.failOpen.test.ts +12 -12
  330. package/src/__tests__/secretRedactor.test.ts +12 -12
  331. package/src/__tests__/serverExtensionReservedRoots.test.ts +7 -7
  332. package/src/__tests__/subscriptionRedaction.test.ts +5 -5
  333. package/src/__tests__/unifiedAuth.test.ts +15 -9
  334. package/src/__tests__/visitorIdentity.resolve.test.ts +6 -6
  335. package/src/__tests__/widget.test.ts +45 -45
  336. package/src/__tests__/widgetGuestElevation.test.ts +7 -7
  337. package/src/__tests__/widgetHostIdentity.test.ts +14 -14
  338. package/src/agentSessions/ReturningVisitorRecap.ts +12 -1
  339. package/src/agentSessions/SessionManager.ts +2 -2
  340. package/src/agentSessions/remoteBrowserGoalEngine.ts +30 -5
  341. package/src/auth/AuthProviderCatalogRouter.ts +6 -1
  342. package/src/auth/__tests__/backward-compatibility.test.ts +3 -3
  343. package/src/auth/exampleNewUserSubClass.ts +2 -2
  344. package/src/auth/index.ts +43 -28
  345. package/src/auth/initializeProviders.ts +25 -5
  346. package/src/auth/magicLink/MagicLinkRouter.ts +28 -10
  347. package/src/auth/magicLink/MagicLinkService.ts +71 -52
  348. package/src/auth/magicLink/index.ts +7 -7
  349. package/src/auth/magicLink/magicLinkCore.ts +96 -64
  350. package/src/auth/magicLink/redeemLanding.ts +14 -4
  351. package/src/auth/magicLink/types.ts +54 -54
  352. package/src/auth/newUsers.ts +1 -1
  353. package/src/auth/principals.ts +11 -2
  354. package/src/cache.ts +4 -1
  355. package/src/config.ts +14 -4
  356. package/src/context.ts +37 -24
  357. package/src/directives/Public.ts +4 -1
  358. package/src/directives/RequireSystemUser.ts +4 -1
  359. package/src/generated/graphql-schemas/__mj.ts +933 -5
  360. package/src/generic/CacheInvalidationResolver.ts +12 -4
  361. package/src/generic/FireAndForgetHeartbeat.ts +19 -14
  362. package/src/generic/PushStatusResolver.ts +21 -7
  363. package/src/generic/ResolverBase.ts +66 -5
  364. package/src/generic/RunViewResolver.ts +22 -22
  365. package/src/generic/__tests__/FireAndForgetHeartbeat.test.ts +7 -7
  366. package/src/index.ts +34 -7
  367. package/src/integration/CustomColumnPromoter.ts +6 -1
  368. package/src/integration/EntityMapLifecycle.ts +20 -2
  369. package/src/logging/NoLog.ts +16 -2
  370. package/src/logging/StartupLogger.ts +6 -1
  371. package/src/logging/bootAudit.ts +26 -16
  372. package/src/logging/boundaryLogPayload.ts +8 -1
  373. package/src/logging/secretRedactor.ts +14 -9
  374. package/src/logging/shortenForLog.ts +8 -3
  375. package/src/logging/variablesLoggingMiddleware.ts +9 -6
  376. package/src/metadataRefreshSignal.ts +45 -0
  377. package/src/middleware/MJTenantFilterMiddleware.ts +4 -4
  378. package/src/multiTenancy/index.ts +29 -5
  379. package/src/realtimeWidget/WidgetRouter.ts +15 -10
  380. package/src/realtimeWidget/WidgetSessionService.ts +76 -76
  381. package/src/realtimeWidget/host-identity.ts +24 -10
  382. package/src/realtimeWidget/index.ts +3 -3
  383. package/src/realtimeWidget/visitorIdentity.ts +39 -8
  384. package/src/realtimeWidget/widgetCore.ts +75 -10
  385. package/src/realtimeWidget/widgetGuestElevation.ts +25 -12
  386. package/src/resolvers/AdhocQueryResolver.ts +3 -3
  387. package/src/resolvers/AgentSessionResolver.ts +3 -3
  388. package/src/resolvers/ColorResolver.ts +6 -6
  389. package/src/resolvers/ComponentRegistryResolver.ts +36 -36
  390. package/src/resolvers/EntityCommunicationsResolver.ts +4 -4
  391. package/src/resolvers/ExecuteRemoteOperationResolver.ts +9 -9
  392. package/src/resolvers/FetchEntityVectorsResolver.ts +2 -2
  393. package/src/resolvers/FileResolver.ts +42 -42
  394. package/src/resolvers/GeoResolver.ts +4 -4
  395. package/src/resolvers/GetDataResolver.ts +50 -15
  396. package/src/resolvers/IntegrationDiscoveryResolver.ts +2 -2
  397. package/src/resolvers/ListOperationsResolver.ts +78 -28
  398. package/src/resolvers/MCPResolver.ts +30 -15
  399. package/src/resolvers/QueryResolver.ts +13 -13
  400. package/src/resolvers/QuerySystemUserResolver.ts +2 -1
  401. package/src/resolvers/RealtimeBridgeResolver.ts +3 -3
  402. package/src/resolvers/RealtimeClientSessionResolver.ts +126 -13
  403. package/src/resolvers/RemoteBrowserActionResolver.ts +5 -5
  404. package/src/resolvers/RunAIAgentResolver.ts +118 -76
  405. package/src/resolvers/RunAIPromptResolver.ts +22 -22
  406. package/src/resolvers/RunTemplateResolver.ts +4 -4
  407. package/src/resolvers/RunTestResolver.ts +25 -25
  408. package/src/resolvers/SearchEntitiesResolver.ts +3 -1
  409. package/src/resolvers/SearchKnowledgeResolver.ts +4 -0
  410. package/src/resolvers/SearchKnowledgeSystemUserResolver.ts +1 -0
  411. package/src/resolvers/SqlLoggingConfigResolver.ts +56 -56
  412. package/src/resolvers/TaskGraphFrameResolver.ts +37 -28
  413. package/src/resolvers/TelemetryResolver.ts +79 -79
  414. package/src/resolvers/TransactionGroupResolver.ts +57 -4
  415. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +40 -38
  416. package/src/resolvers/__tests__/artifact-routing.test.ts +23 -23
  417. package/src/resolvers/adhoc-query-helpers.ts +19 -2
  418. package/src/resolvers/artifact-routing.ts +19 -19
  419. package/src/resolvers/meetingRecordingRegistration.ts +44 -10
  420. package/src/resolvers/peaksSidecar.ts +12 -2
  421. package/src/rest/EntityCRUDHandler.ts +24 -4
  422. package/src/rest/MediaStreamHandler.ts +11 -6
  423. package/src/rest/OAuthCallbackHandler.ts +25 -7
  424. package/src/rest/RESTEndpointHandler.ts +20 -15
  425. package/src/rest/RealtimeSdpBrokerHandler.ts +14 -4
  426. package/src/rest/SignatureWebhookHandler.ts +6 -1
  427. package/src/rest/UploadTokenManager.ts +66 -30
  428. package/src/rest/ViewOperationsHandler.ts +24 -4
  429. package/src/rest/mediaRange.ts +16 -6
  430. package/src/rest/setupRESTEndpoints.ts +24 -12
  431. package/src/serverExtensionReservedRoots.ts +6 -1
  432. package/src/services/MJStorageBlobStore.ts +209 -0
  433. package/src/services/TaskGraphActionRunner.ts +16 -15
  434. package/src/types.ts +21 -16
  435. package/src/util.ts +22 -9
@@ -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
- parseAllowedOrigins,
6
- isOriginAllowed,
7
- isModalityEnabled,
8
- evaluateWidgetMint,
9
- buildWidgetGuestClaims,
10
- looksLikeBot,
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(parseAllowedOrigins('["https://a.com","https://b.com"]')).toEqual(['https://a.com', 'https://b.com']);
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(parseAllowedOrigins('https://a.com, https://b.com')).toEqual(['https://a.com', 'https://b.com']);
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(parseAllowedOrigins('["HTTPS://Acme.COM/"]')).toEqual(['https://acme.com']);
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(parseAllowedOrigins(null)).toEqual([]);
29
- expect(parseAllowedOrigins(' ')).toEqual([]);
30
- expect(parseAllowedOrigins('{"not":"an-array"}')).toEqual([]);
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(isOriginAllowed('https://acme.com', allowed)).toBe(true);
39
- expect(isOriginAllowed('HTTPS://ACME.COM/', allowed)).toBe(true);
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(isOriginAllowed('https://evil.com', allowed)).toBe(false);
44
- expect(isOriginAllowed('https://sub.acme.com', allowed)).toBe(false);
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(isOriginAllowed(undefined, allowed)).toBe(false);
49
- expect(isOriginAllowed('', allowed)).toBe(false);
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(isOriginAllowed('https://acme.com', [])).toBe(false);
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(isModalityEnabled('Both', 'Text')).toBe(true);
60
- expect(isModalityEnabled('Both', 'Voice')).toBe(true);
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(isModalityEnabled('Text', 'Text')).toBe(true);
64
- expect(isModalityEnabled('Text', 'Voice')).toBe(false);
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(isModalityEnabled('Voice', 'Voice')).toBe(true);
68
- expect(isModalityEnabled('Voice', 'Text')).toBe(false);
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(evaluateWidgetMint(base, 'https://acme.com')).toEqual({ ok: true });
76
+ expect(EvaluateWidgetMint(base, 'https://acme.com')).toEqual({ ok: true });
77
77
  });
78
78
 
79
79
  it('rejects a disabled widget', () => {
80
- expect(evaluateWidgetMint({ ...base, Status: 'Disabled' }, 'https://acme.com')).toEqual({
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(evaluateWidgetMint(base, 'https://evil.com')).toEqual({ ok: false, errorCode: 'origin_not_allowed' });
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(evaluateWidgetMint(base, undefined)).toEqual({ ok: false, errorCode: 'origin_not_allowed' });
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 = buildWidgetGuestClaims(args);
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 = buildWidgetGuestClaims(args);
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 = buildWidgetGuestClaims(args);
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 = buildWidgetGuestClaims(args);
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 = buildWidgetGuestClaims({
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 = buildWidgetGuestClaims({
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(looksLikeBot(undefined)).toBe(true);
188
- expect(looksLikeBot(null)).toBe(true);
189
- expect(looksLikeBot(' ')).toBe(true);
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(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);
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(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);
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
- resolveWidgetGuestRunContext,
17
- elevateUserPayload,
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 resolveWidgetGuestRunContext(payloadWith({ IsMagicLinkAnonymous: false }), providerStub);
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 resolveWidgetGuestRunContext(
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 resolveWidgetGuestRunContext({ email: '', userRecord: undefined, sessionId: 's' }, providerStub);
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 = elevateUserPayload(guestPayload, systemUser);
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
- elevateUserPayload(guestPayload, systemUser);
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 { verifyHostAssertion, extractHostIdentity } from '../realtimeWidget/host-identity.js';
5
- import { buildWidgetGuestClaims } from '../realtimeWidget/widgetCore.js';
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 = verifyHostAssertion(token, kp.publicPem, WIDGET_KEY);
26
+ const result = VerifyHostAssertion(token, kp.publicPem, WIDGET_KEY);
27
27
  expect(result.ok).toBe(true);
28
28
  if (result.ok) {
29
- expect(result.identity).toMatchObject({ email: 'jane@acme.com', firstName: 'Jane', lastName: 'Doe', hostUserId: 'host-123' });
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(verifyHostAssertion(undefined, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'missing' });
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(verifyHostAssertion(token, undefined, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'no_key' });
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(verifyHostAssertion(token, other.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'bad_signature' });
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(verifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'bad_signature' });
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(verifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'expired' });
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(verifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'no_email' });
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(verifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'expired' });
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(verifyHostAssertion(token, kp.publicPem, WIDGET_KEY)).toEqual({ ok: false, errorCode: 'expired' });
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 = buildWidgetGuestClaims({
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 = extractHostIdentity({ email: 'a@b.com', firstName: 'Al', lastName: 'Bo' });
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 writeReturningVisitorRecap(
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 { writeReturningVisitorRecap } from './ReturningVisitorRecap.js';
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 writeReturningVisitorRecap(session.ConversationID, session.AgentID, contextUser, provider);
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 buildMJGoalParams(params: RunComputerUseParams, contextUser?: UserInfo, agentRunID?: string, agentRunStepID?: string): MJRunComputerUseParams {
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(buildMJGoalParams(params, this.ContextUser, this.AgentRunID, this.AgentRunStepID));
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 extractCoAgentRunID(configJson: string | null | undefined): string | undefined {
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 beginBrowserGoalStep(
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 finalizeBrowserGoalStep(step: MJAIAgentRunStepEntity | null, result: RemoteBrowserGoalResult): Promise<void> {
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 createAuthProviderCatalogRouter(): Router {
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 { initializeAuthProviders } from '../initializeProviders';
15
+ import { InitializeAuthProviders } from '../initializeProviders';
16
16
 
17
17
  /**
18
18
  * Test suite for backward compatibility of the new auth provider system
@@ -31,7 +31,7 @@ describe('Authentication Provider Backward Compatibility', () => {
31
31
 
32
32
  describe('Configuration-Based Provider Initialization', () => {
33
33
  it('should initialize with no providers when config is empty', () => {
34
- initializeAuthProviders();
34
+ InitializeAuthProviders();
35
35
 
36
36
  // With empty authProviders array, no providers should be registered
37
37
  expect(factory.hasProviders()).toBe(false);
@@ -53,7 +53,7 @@ describe('Authentication Provider Backward Compatibility', () => {
53
53
  expect(factory.hasProviders()).toBe(true);
54
54
 
55
55
  // Re-initialize clears everything
56
- initializeAuthProviders();
56
+ InitializeAuthProviders();
57
57
  expect(factory.hasProviders()).toBe(false);
58
58
  });
59
59
  });
@@ -1,4 +1,4 @@
1
- import { RegisterClass } from '@memberjunction/global';
1
+ import { EscapeSQLString, RegisterClass } from '@memberjunction/global';
2
2
  import { Metadata, RunView, LogError, EntitySaveOptions } from '@memberjunction/core';
3
3
  import { NewUserBase } from './newUsers.js';
4
4
  import { ResolveConfiguredPrincipal } from './principals.js';
@@ -43,7 +43,7 @@ export class ExampleNewUserSubClass extends NewUserBase {
43
43
  const viewResults = await rv.RunView(
44
44
  {
45
45
  EntityName: 'Persons',
46
- ExtraFilter: `Email = '${email}'`,
46
+ ExtraFilter: `Email = '${EscapeSQLString(email)}'`,
47
47
  },
48
48
  contextUser
49
49
  );