@memberjunction/server 6.2.0-edge.0 → 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 (403) 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/index.d.ts +20 -1
  16. package/dist/auth/index.d.ts.map +1 -1
  17. package/dist/auth/index.js +20 -10
  18. package/dist/auth/index.js.map +1 -1
  19. package/dist/auth/initializeProviders.d.ts +8 -0
  20. package/dist/auth/initializeProviders.d.ts.map +1 -1
  21. package/dist/auth/initializeProviders.js +21 -5
  22. package/dist/auth/initializeProviders.js.map +1 -1
  23. package/dist/auth/magicLink/MagicLinkRouter.d.ts +9 -0
  24. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  25. package/dist/auth/magicLink/MagicLinkRouter.js +22 -10
  26. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  27. package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
  28. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  29. package/dist/auth/magicLink/MagicLinkService.js +65 -51
  30. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  31. package/dist/auth/magicLink/index.d.ts +2 -2
  32. package/dist/auth/magicLink/index.d.ts.map +1 -1
  33. package/dist/auth/magicLink/index.js +2 -2
  34. package/dist/auth/magicLink/index.js.map +1 -1
  35. package/dist/auth/magicLink/magicLinkCore.d.ts +54 -33
  36. package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
  37. package/dist/auth/magicLink/magicLinkCore.js +61 -61
  38. package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
  39. package/dist/auth/magicLink/redeemLanding.d.ts +4 -0
  40. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  41. package/dist/auth/magicLink/redeemLanding.js +12 -4
  42. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  43. package/dist/auth/magicLink/types.d.ts +4 -4
  44. package/dist/auth/principals.d.ts +2 -0
  45. package/dist/auth/principals.d.ts.map +1 -1
  46. package/dist/auth/principals.js +6 -2
  47. package/dist/auth/principals.js.map +1 -1
  48. package/dist/cache.d.ts +2 -0
  49. package/dist/cache.d.ts.map +1 -1
  50. package/dist/cache.js +3 -1
  51. package/dist/cache.js.map +1 -1
  52. package/dist/config.d.ts +346 -2
  53. package/dist/config.d.ts.map +1 -1
  54. package/dist/config.js +34 -4
  55. package/dist/config.js.map +1 -1
  56. package/dist/context.d.ts +20 -0
  57. package/dist/context.d.ts.map +1 -1
  58. package/dist/context.js +27 -19
  59. package/dist/context.js.map +1 -1
  60. package/dist/directives/Public.d.ts +2 -0
  61. package/dist/directives/Public.d.ts.map +1 -1
  62. package/dist/directives/Public.js +3 -1
  63. package/dist/directives/Public.js.map +1 -1
  64. package/dist/directives/RequireSystemUser.d.ts +2 -0
  65. package/dist/directives/RequireSystemUser.d.ts.map +1 -1
  66. package/dist/directives/RequireSystemUser.js +3 -1
  67. package/dist/directives/RequireSystemUser.js.map +1 -1
  68. package/dist/generated/graphql-schemas/__mj.d.ts +11 -0
  69. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  70. package/dist/generated/graphql-schemas/__mj.js +48 -0
  71. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  72. package/dist/generic/CacheInvalidationResolver.d.ts +94 -4
  73. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  74. package/dist/generic/CacheInvalidationResolver.js +122 -3
  75. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  76. package/dist/generic/DeleteOptionsInput.d.ts +8 -1
  77. package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
  78. package/dist/generic/DeleteOptionsInput.js +1 -1
  79. package/dist/generic/DeleteOptionsInput.js.map +1 -1
  80. package/dist/generic/FireAndForgetHeartbeat.d.ts +3 -1
  81. package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
  82. package/dist/generic/FireAndForgetHeartbeat.js +8 -4
  83. package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
  84. package/dist/generic/PushStatusResolver.d.ts +10 -1
  85. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  86. package/dist/generic/PushStatusResolver.js +11 -3
  87. package/dist/generic/PushStatusResolver.js.map +1 -1
  88. package/dist/generic/ResolverBase.d.ts +5 -1
  89. package/dist/generic/ResolverBase.d.ts.map +1 -1
  90. package/dist/generic/ResolverBase.js +15 -8
  91. package/dist/generic/ResolverBase.js.map +1 -1
  92. package/dist/index.d.ts +6 -0
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +30 -9
  95. package/dist/index.js.map +1 -1
  96. package/dist/integration/CustomColumnPromoter.d.ts +2 -0
  97. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  98. package/dist/integration/CustomColumnPromoter.js +5 -1
  99. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  100. package/dist/integration/EntityMapLifecycle.d.ts +4 -0
  101. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  102. package/dist/integration/EntityMapLifecycle.js +10 -2
  103. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  104. package/dist/logging/NoLog.d.ts +4 -0
  105. package/dist/logging/NoLog.d.ts.map +1 -1
  106. package/dist/logging/NoLog.js +10 -2
  107. package/dist/logging/NoLog.js.map +1 -1
  108. package/dist/logging/StartupLogger.d.ts +2 -0
  109. package/dist/logging/StartupLogger.d.ts.map +1 -1
  110. package/dist/logging/StartupLogger.js +5 -1
  111. package/dist/logging/StartupLogger.js.map +1 -1
  112. package/dist/logging/bootAudit.d.ts +11 -7
  113. package/dist/logging/bootAudit.d.ts.map +1 -1
  114. package/dist/logging/bootAudit.js +15 -7
  115. package/dist/logging/bootAudit.js.map +1 -1
  116. package/dist/logging/boundaryLogPayload.d.ts +4 -0
  117. package/dist/logging/boundaryLogPayload.d.ts.map +1 -1
  118. package/dist/logging/boundaryLogPayload.js +5 -1
  119. package/dist/logging/boundaryLogPayload.js.map +1 -1
  120. package/dist/logging/secretRedactor.d.ts +2 -0
  121. package/dist/logging/secretRedactor.d.ts.map +1 -1
  122. package/dist/logging/secretRedactor.js +8 -4
  123. package/dist/logging/secretRedactor.js.map +1 -1
  124. package/dist/logging/shortenForLog.d.ts +2 -0
  125. package/dist/logging/shortenForLog.d.ts.map +1 -1
  126. package/dist/logging/shortenForLog.js +7 -3
  127. package/dist/logging/shortenForLog.js.map +1 -1
  128. package/dist/logging/variablesLoggingMiddleware.d.ts +2 -0
  129. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  130. package/dist/logging/variablesLoggingMiddleware.js +8 -6
  131. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  132. package/dist/metadataRefreshSignal.d.ts +19 -0
  133. package/dist/metadataRefreshSignal.d.ts.map +1 -0
  134. package/dist/metadataRefreshSignal.js +45 -0
  135. package/dist/metadataRefreshSignal.js.map +1 -0
  136. package/dist/middleware/MJTenantFilterMiddleware.js +4 -4
  137. package/dist/multiTenancy/index.d.ts +8 -0
  138. package/dist/multiTenancy/index.d.ts.map +1 -1
  139. package/dist/multiTenancy/index.js +21 -5
  140. package/dist/multiTenancy/index.js.map +1 -1
  141. package/dist/realtimeWidget/WidgetRouter.d.ts +5 -0
  142. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  143. package/dist/realtimeWidget/WidgetRouter.js +14 -10
  144. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  145. package/dist/realtimeWidget/WidgetSessionService.d.ts +6 -6
  146. package/dist/realtimeWidget/WidgetSessionService.js +27 -27
  147. package/dist/realtimeWidget/host-identity.d.ts +5 -1
  148. package/dist/realtimeWidget/host-identity.d.ts.map +1 -1
  149. package/dist/realtimeWidget/host-identity.js +11 -3
  150. package/dist/realtimeWidget/host-identity.js.map +1 -1
  151. package/dist/realtimeWidget/index.d.ts +2 -2
  152. package/dist/realtimeWidget/index.d.ts.map +1 -1
  153. package/dist/realtimeWidget/index.js +2 -2
  154. package/dist/realtimeWidget/index.js.map +1 -1
  155. package/dist/realtimeWidget/visitorIdentity.d.ts +21 -1
  156. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  157. package/dist/realtimeWidget/visitorIdentity.js +16 -4
  158. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  159. package/dist/realtimeWidget/widgetCore.d.ts +48 -0
  160. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  161. package/dist/realtimeWidget/widgetCore.js +38 -10
  162. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  163. package/dist/realtimeWidget/widgetGuestElevation.d.ts +10 -6
  164. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  165. package/dist/realtimeWidget/widgetGuestElevation.js +14 -6
  166. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  167. package/dist/resolvers/AdhocQueryResolver.js +3 -3
  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/RealtimeBridgeResolver.js +3 -3
  185. package/dist/resolvers/RealtimeClientSessionResolver.js +3 -3
  186. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -5
  187. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -4
  188. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  189. package/dist/resolvers/RunAIAgentResolver.js +69 -38
  190. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  191. package/dist/resolvers/RunAIPromptResolver.d.ts +1 -1
  192. package/dist/resolvers/RunAIPromptResolver.js +2 -2
  193. package/dist/resolvers/RunTestResolver.js +5 -5
  194. package/dist/resolvers/SqlLoggingConfigResolver.d.ts +8 -4
  195. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  196. package/dist/resolvers/SqlLoggingConfigResolver.js +5 -5
  197. package/dist/resolvers/TaskGraphFrameResolver.d.ts +8 -1
  198. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  199. package/dist/resolvers/TaskGraphFrameResolver.js +6 -2
  200. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  201. package/dist/resolvers/adhoc-query-helpers.d.ts +6 -0
  202. package/dist/resolvers/adhoc-query-helpers.d.ts.map +1 -1
  203. package/dist/resolvers/adhoc-query-helpers.js +10 -2
  204. package/dist/resolvers/adhoc-query-helpers.js.map +1 -1
  205. package/dist/resolvers/artifact-routing.d.ts +8 -8
  206. package/dist/resolvers/artifact-routing.js +2 -2
  207. package/dist/resolvers/artifact-routing.js.map +1 -1
  208. package/dist/resolvers/meetingRecordingRegistration.d.ts +10 -2
  209. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  210. package/dist/resolvers/meetingRecordingRegistration.js +24 -8
  211. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  212. package/dist/resolvers/peaksSidecar.d.ts +4 -0
  213. package/dist/resolvers/peaksSidecar.d.ts.map +1 -1
  214. package/dist/resolvers/peaksSidecar.js +10 -2
  215. package/dist/resolvers/peaksSidecar.js.map +1 -1
  216. package/dist/rest/EntityCRUDHandler.d.ts +28 -0
  217. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  218. package/dist/rest/EntityCRUDHandler.js +20 -4
  219. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  220. package/dist/rest/MediaStreamHandler.d.ts +2 -0
  221. package/dist/rest/MediaStreamHandler.d.ts.map +1 -1
  222. package/dist/rest/MediaStreamHandler.js +10 -6
  223. package/dist/rest/MediaStreamHandler.js.map +1 -1
  224. package/dist/rest/OAuthCallbackHandler.d.ts +9 -0
  225. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  226. package/dist/rest/OAuthCallbackHandler.js +15 -3
  227. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  228. package/dist/rest/RESTEndpointHandler.d.ts +6 -4
  229. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  230. package/dist/rest/RESTEndpointHandler.js +15 -11
  231. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  232. package/dist/rest/RealtimeSdpBrokerHandler.d.ts +5 -1
  233. package/dist/rest/RealtimeSdpBrokerHandler.d.ts.map +1 -1
  234. package/dist/rest/RealtimeSdpBrokerHandler.js +12 -4
  235. package/dist/rest/RealtimeSdpBrokerHandler.js.map +1 -1
  236. package/dist/rest/SignatureWebhookHandler.d.ts +2 -0
  237. package/dist/rest/SignatureWebhookHandler.d.ts.map +1 -1
  238. package/dist/rest/SignatureWebhookHandler.js +5 -1
  239. package/dist/rest/SignatureWebhookHandler.js.map +1 -1
  240. package/dist/rest/UploadTokenManager.d.ts +24 -8
  241. package/dist/rest/UploadTokenManager.d.ts.map +1 -1
  242. package/dist/rest/UploadTokenManager.js +53 -21
  243. package/dist/rest/UploadTokenManager.js.map +1 -1
  244. package/dist/rest/ViewOperationsHandler.d.ts +20 -0
  245. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  246. package/dist/rest/ViewOperationsHandler.js +20 -4
  247. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  248. package/dist/rest/mediaRange.d.ts +4 -0
  249. package/dist/rest/mediaRange.d.ts.map +1 -1
  250. package/dist/rest/mediaRange.js +10 -2
  251. package/dist/rest/mediaRange.js.map +1 -1
  252. package/dist/rest/setupRESTEndpoints.d.ts +4 -0
  253. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  254. package/dist/rest/setupRESTEndpoints.js +13 -7
  255. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  256. package/dist/serverExtensionReservedRoots.d.ts +2 -0
  257. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  258. package/dist/serverExtensionReservedRoots.js +5 -1
  259. package/dist/serverExtensionReservedRoots.js.map +1 -1
  260. package/dist/services/TaskGraphActionRunner.d.ts +13 -8
  261. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  262. package/dist/services/TaskGraphActionRunner.js +16 -15
  263. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  264. package/dist/types.d.ts +2 -0
  265. package/dist/types.d.ts.map +1 -1
  266. package/dist/types.js +7 -3
  267. package/dist/types.js.map +1 -1
  268. package/dist/util.d.ts +6 -0
  269. package/dist/util.d.ts.map +1 -1
  270. package/dist/util.js +13 -5
  271. package/dist/util.js.map +1 -1
  272. package/package.json +92 -92
  273. package/src/__tests__/DeleteOptionsInput.wireShape.test.ts +62 -0
  274. package/src/__tests__/FileResolverPeaks.test.ts +13 -13
  275. package/src/__tests__/ListOperationsResolver.test.ts +17 -17
  276. package/src/__tests__/MediaStreamHandler.test.ts +28 -28
  277. package/src/__tests__/NoLog.test.ts +11 -11
  278. package/src/__tests__/PrimaryKeyAlwaysMapped.test.ts +10 -10
  279. package/src/__tests__/RESTEndpointHandler.test.ts +14 -14
  280. package/src/__tests__/RealtimeBridgeResolver.test.ts +4 -2
  281. package/src/__tests__/RealtimeSdpBrokerHandler.test.ts +6 -6
  282. package/src/__tests__/RefreshAdoptsNewColumns.test.ts +8 -8
  283. package/src/__tests__/RemoteBrowserGoalEngine.test.ts +18 -18
  284. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +228 -0
  285. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +129 -0
  286. package/src/__tests__/TaskGraphFrameResolver.test.ts +2 -2
  287. package/src/__tests__/WidgetSessionService.test.ts +8 -4
  288. package/src/__tests__/adhoc-query-helpers.test.ts +21 -21
  289. package/src/__tests__/bootAudit.test.ts +11 -11
  290. package/src/__tests__/boundaryLogPayload.test.ts +6 -6
  291. package/src/__tests__/cacheInvalidationRecordData.test.ts +177 -0
  292. package/src/__tests__/databaseAbstraction.test.ts +12 -6
  293. package/src/__tests__/getDataTokenRedaction.test.ts +7 -7
  294. package/src/__tests__/initializeProviders.refresh.test.ts +4 -4
  295. package/src/__tests__/magicLink.test.ts +73 -134
  296. package/src/__tests__/magicLinkService.consume.test.ts +224 -0
  297. package/src/__tests__/meetingRecordingRegistration.test.ts +12 -12
  298. package/src/__tests__/metadataRefreshSignal.test.ts +78 -0
  299. package/src/__tests__/multiTenancy.security.test.ts +40 -40
  300. package/src/__tests__/multiTenancy.test.ts +18 -18
  301. package/src/__tests__/newUsers.test.ts +24 -23
  302. package/src/__tests__/principals.test.ts +22 -22
  303. package/src/__tests__/pushStatusResolver.filter.test.ts +8 -8
  304. package/src/__tests__/secretRedactor.failOpen.test.ts +12 -12
  305. package/src/__tests__/secretRedactor.test.ts +12 -12
  306. package/src/__tests__/serverExtensionReservedRoots.test.ts +7 -7
  307. package/src/__tests__/subscriptionRedaction.test.ts +5 -5
  308. package/src/__tests__/unifiedAuth.test.ts +15 -9
  309. package/src/__tests__/visitorIdentity.resolve.test.ts +6 -6
  310. package/src/__tests__/widget.test.ts +45 -45
  311. package/src/__tests__/widgetGuestElevation.test.ts +7 -7
  312. package/src/__tests__/widgetHostIdentity.test.ts +14 -14
  313. package/src/agentSessions/ReturningVisitorRecap.ts +12 -1
  314. package/src/agentSessions/SessionManager.ts +2 -2
  315. package/src/agentSessions/remoteBrowserGoalEngine.ts +30 -5
  316. package/src/auth/AuthProviderCatalogRouter.ts +6 -1
  317. package/src/auth/__tests__/backward-compatibility.test.ts +3 -3
  318. package/src/auth/index.ts +43 -28
  319. package/src/auth/initializeProviders.ts +25 -5
  320. package/src/auth/magicLink/MagicLinkRouter.ts +28 -10
  321. package/src/auth/magicLink/MagicLinkService.ts +71 -52
  322. package/src/auth/magicLink/index.ts +7 -7
  323. package/src/auth/magicLink/magicLinkCore.ts +96 -64
  324. package/src/auth/magicLink/redeemLanding.ts +14 -4
  325. package/src/auth/magicLink/types.ts +54 -54
  326. package/src/auth/newUsers.ts +1 -1
  327. package/src/auth/principals.ts +11 -2
  328. package/src/cache.ts +4 -1
  329. package/src/config.ts +37 -4
  330. package/src/context.ts +37 -24
  331. package/src/directives/Public.ts +4 -1
  332. package/src/directives/RequireSystemUser.ts +4 -1
  333. package/src/generated/graphql-schemas/__mj.ts +37 -0
  334. package/src/generic/CacheInvalidationResolver.ts +148 -4
  335. package/src/generic/DeleteOptionsInput.ts +9 -2
  336. package/src/generic/FireAndForgetHeartbeat.ts +19 -14
  337. package/src/generic/PushStatusResolver.ts +21 -7
  338. package/src/generic/ResolverBase.ts +16 -8
  339. package/src/generic/RunViewResolver.ts +22 -22
  340. package/src/generic/__tests__/FireAndForgetHeartbeat.test.ts +7 -7
  341. package/src/index.ts +35 -9
  342. package/src/integration/CustomColumnPromoter.ts +6 -1
  343. package/src/integration/EntityMapLifecycle.ts +20 -2
  344. package/src/logging/NoLog.ts +16 -2
  345. package/src/logging/StartupLogger.ts +6 -1
  346. package/src/logging/bootAudit.ts +26 -16
  347. package/src/logging/boundaryLogPayload.ts +8 -1
  348. package/src/logging/secretRedactor.ts +14 -9
  349. package/src/logging/shortenForLog.ts +8 -3
  350. package/src/logging/variablesLoggingMiddleware.ts +9 -6
  351. package/src/metadataRefreshSignal.ts +45 -0
  352. package/src/middleware/MJTenantFilterMiddleware.ts +4 -4
  353. package/src/multiTenancy/index.ts +29 -5
  354. package/src/realtimeWidget/WidgetRouter.ts +15 -10
  355. package/src/realtimeWidget/WidgetSessionService.ts +76 -76
  356. package/src/realtimeWidget/host-identity.ts +24 -10
  357. package/src/realtimeWidget/index.ts +3 -3
  358. package/src/realtimeWidget/visitorIdentity.ts +39 -8
  359. package/src/realtimeWidget/widgetCore.ts +75 -10
  360. package/src/realtimeWidget/widgetGuestElevation.ts +25 -12
  361. package/src/resolvers/AdhocQueryResolver.ts +3 -3
  362. package/src/resolvers/AgentSessionResolver.ts +3 -3
  363. package/src/resolvers/ColorResolver.ts +6 -6
  364. package/src/resolvers/ComponentRegistryResolver.ts +36 -36
  365. package/src/resolvers/EntityCommunicationsResolver.ts +4 -4
  366. package/src/resolvers/ExecuteRemoteOperationResolver.ts +9 -9
  367. package/src/resolvers/FileResolver.ts +42 -42
  368. package/src/resolvers/GeoResolver.ts +4 -4
  369. package/src/resolvers/GetDataResolver.ts +50 -15
  370. package/src/resolvers/IntegrationDiscoveryResolver.ts +2 -2
  371. package/src/resolvers/ListOperationsResolver.ts +78 -28
  372. package/src/resolvers/MCPResolver.ts +30 -15
  373. package/src/resolvers/QueryResolver.ts +13 -13
  374. package/src/resolvers/RealtimeBridgeResolver.ts +3 -3
  375. package/src/resolvers/RealtimeClientSessionResolver.ts +3 -3
  376. package/src/resolvers/RemoteBrowserActionResolver.ts +5 -5
  377. package/src/resolvers/RunAIAgentResolver.ts +113 -72
  378. package/src/resolvers/RunAIPromptResolver.ts +22 -22
  379. package/src/resolvers/RunTemplateResolver.ts +4 -4
  380. package/src/resolvers/RunTestResolver.ts +25 -25
  381. package/src/resolvers/SqlLoggingConfigResolver.ts +56 -56
  382. package/src/resolvers/TaskGraphFrameResolver.ts +37 -28
  383. package/src/resolvers/TelemetryResolver.ts +79 -79
  384. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +40 -38
  385. package/src/resolvers/__tests__/artifact-routing.test.ts +23 -23
  386. package/src/resolvers/adhoc-query-helpers.ts +19 -2
  387. package/src/resolvers/artifact-routing.ts +19 -19
  388. package/src/resolvers/meetingRecordingRegistration.ts +44 -10
  389. package/src/resolvers/peaksSidecar.ts +12 -2
  390. package/src/rest/EntityCRUDHandler.ts +24 -4
  391. package/src/rest/MediaStreamHandler.ts +11 -6
  392. package/src/rest/OAuthCallbackHandler.ts +25 -7
  393. package/src/rest/RESTEndpointHandler.ts +20 -15
  394. package/src/rest/RealtimeSdpBrokerHandler.ts +14 -4
  395. package/src/rest/SignatureWebhookHandler.ts +6 -1
  396. package/src/rest/UploadTokenManager.ts +66 -30
  397. package/src/rest/ViewOperationsHandler.ts +24 -4
  398. package/src/rest/mediaRange.ts +16 -6
  399. package/src/rest/setupRESTEndpoints.ts +24 -12
  400. package/src/serverExtensionReservedRoots.ts +6 -1
  401. package/src/services/TaskGraphActionRunner.ts +16 -15
  402. package/src/types.ts +21 -16
  403. package/src/util.ts +16 -6
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { buildBoundaryLogPayload } from '../logging/boundaryLogPayload.js';
2
+ import { BuildBoundaryLogPayload } from '../logging/boundaryLogPayload.js';
3
3
 
4
4
  /**
5
5
  * Guards the load-bearing #2638 fix: the always-on GraphQL boundary log line emits the
@@ -10,22 +10,22 @@ import { buildBoundaryLogPayload } from '../logging/boundaryLogPayload.js';
10
10
  */
11
11
  describe('buildBoundaryLogPayload', () => {
12
12
  it('returns operation name only', () => {
13
- expect(buildBoundaryLogPayload('CreateMJCredential')).toEqual({ operationName: 'CreateMJCredential' });
13
+ expect(BuildBoundaryLogPayload('CreateMJCredential')).toEqual({ operationName: 'CreateMJCredential' });
14
14
  });
15
15
 
16
16
  it('never includes a `variables` key', () => {
17
- const payload = buildBoundaryLogPayload('RunViewsWithCacheCheck');
17
+ const payload = BuildBoundaryLogPayload('RunViewsWithCacheCheck');
18
18
  expect('variables' in payload).toBe(false);
19
19
  });
20
20
 
21
21
  it('serialized form contains no value content — only the operation name', () => {
22
22
  // Even if someone passes a secret-shaped operation name, nothing but the name is emitted.
23
- const serialized = JSON.stringify(buildBoundaryLogPayload('SomeOp'));
23
+ const serialized = JSON.stringify(BuildBoundaryLogPayload('SomeOp'));
24
24
  expect(serialized).toBe('{"operationName":"SomeOp"}');
25
25
  });
26
26
 
27
27
  it('handles undefined operation name (non-named operations)', () => {
28
- expect(buildBoundaryLogPayload(undefined)).toEqual({ operationName: undefined });
29
- expect('variables' in buildBoundaryLogPayload(undefined)).toBe(false);
28
+ expect(BuildBoundaryLogPayload(undefined)).toEqual({ operationName: undefined });
29
+ expect('variables' in BuildBoundaryLogPayload(undefined)).toBe(false);
30
30
  });
31
31
  });
@@ -0,0 +1,177 @@
1
+ // The gate lives beside the subscription it protects, and that module carries type-graphql
2
+ // decorators — so the metadata shim has to be in place before it is imported.
3
+ import 'reflect-metadata';
4
+ import { afterEach, describe, expect, it, vi } from 'vitest';
5
+ import {
6
+ ConfigureRecordDataBroadcast,
7
+ MayBroadcastRecordData,
8
+ } from '../generic/CacheInvalidationResolver.js';
9
+
10
+ /**
11
+ * The cache-invalidation subscription is delivered to every connected client with no per-user
12
+ * filter, so anything `MayBroadcastRecordData` lets through is readable by every signed-in session
13
+ * regardless of row-level security or any tenant scoping a consumer applies on the read path.
14
+ *
15
+ * The important case is the DEFAULT: an untouched deployment must broadcast no row data at all,
16
+ * because that is the configuration everyone upgrades into.
17
+ */
18
+ describe('MayBroadcastRecordData', () => {
19
+ afterEach(() => ConfigureRecordDataBroadcast([]));
20
+
21
+ it('broadcasts nothing before anything has configured it', () => {
22
+ // No ConfigureRecordDataBroadcast call at all — the state a process starts in, and the state it
23
+ // stays in if bootstrap ever stops calling it. Failing closed there is the whole point.
24
+ expect(MayBroadcastRecordData('Users')).toBe(false);
25
+ expect(MayBroadcastRecordData('AI Models')).toBe(false);
26
+ });
27
+
28
+ it('broadcasts nothing when the deployment has not opted in', () => {
29
+ ConfigureRecordDataBroadcast([]);
30
+ expect(MayBroadcastRecordData('Users')).toBe(false);
31
+ });
32
+
33
+ it('broadcasts nothing when the config value is absent', () => {
34
+ ConfigureRecordDataBroadcast(undefined);
35
+ expect(MayBroadcastRecordData('Users')).toBe(false);
36
+ });
37
+
38
+ it('allows exactly the entities named, and no others', () => {
39
+ ConfigureRecordDataBroadcast(['AI Models']);
40
+ expect(MayBroadcastRecordData('AI Models')).toBe(true);
41
+ expect(MayBroadcastRecordData('Users')).toBe(false);
42
+ expect(MayBroadcastRecordData('AI Model Vendors')).toBe(false);
43
+ // The allowlisted name as a SUBSTRING of another entity must not carry it in. Written this way
44
+ // deliberately: 'AI Model Vendors' above does not contain 'AI Models', so it passes against a
45
+ // loose `includes` match too and proves nothing — a substring mutation survived it.
46
+ expect(MayBroadcastRecordData('Archived AI Models 2024')).toBe(false);
47
+ // ...and the reverse direction, where the entity name is a substring of the allowlisted one.
48
+ expect(MayBroadcastRecordData('AI Model')).toBe(false);
49
+ });
50
+
51
+ it('matches entity names case- and whitespace-insensitively', () => {
52
+ ConfigureRecordDataBroadcast([' ai models ']);
53
+ expect(MayBroadcastRecordData('AI Models')).toBe(true);
54
+ });
55
+
56
+ it("restores the previous broadcast-everything behaviour only on an explicit '*'", () => {
57
+ ConfigureRecordDataBroadcast(['*']);
58
+ expect(MayBroadcastRecordData('Users')).toBe(true);
59
+ expect(MayBroadcastRecordData('Organization Person Roles')).toBe(true);
60
+ });
61
+ });
62
+
63
+ /**
64
+ * Importing this module must not drag server config loading in with it.
65
+ *
66
+ * The first version of this change read `configInfo` at module scope. `config.ts` runs
67
+ * `loadConfig()` on import, so every test that touched the resolver — directly or through
68
+ * ResolverBase — died at import with "Configuration validation failed". CI caught it; this keeps
69
+ * it caught.
70
+ */
71
+ describe('CacheInvalidationResolver module surface', () => {
72
+ it('imports without any server configuration present', async () => {
73
+ await expect(import('../generic/CacheInvalidationResolver.js')).resolves.toBeDefined();
74
+ });
75
+ });
76
+
77
+ /**
78
+ * The allowlist is normalised where it enters, not where it is compared.
79
+ *
80
+ * Raised in review: the wildcard was matched raw while entity names were trimmed and lowercased,
81
+ * so a hand-edited `[' * ']` matched neither branch and silently opted nothing in — a config that
82
+ * reads as "broadcast everything" while the gate stayed fully closed.
83
+ */
84
+ describe('allowlist normalisation', () => {
85
+ afterEach(() => ConfigureRecordDataBroadcast([]));
86
+
87
+ it("honours a wildcard written with surrounding whitespace", () => {
88
+ ConfigureRecordDataBroadcast([' * ']);
89
+ expect(MayBroadcastRecordData('Users')).toBe(true);
90
+ });
91
+
92
+ it('ignores blank entries rather than letting one match something', () => {
93
+ ConfigureRecordDataBroadcast(['', ' ']);
94
+ expect(MayBroadcastRecordData('Users')).toBe(false);
95
+ // A blank entry must not become a wildcard by accident either.
96
+ expect(MayBroadcastRecordData('')).toBe(false);
97
+ });
98
+
99
+ it('still matches a normal name written with odd casing and padding', () => {
100
+ ConfigureRecordDataBroadcast([' AI MODELS ']);
101
+ expect(MayBroadcastRecordData('ai models')).toBe(true);
102
+ expect(MayBroadcastRecordData('Users')).toBe(false);
103
+ });
104
+ });
105
+
106
+ /**
107
+ * Entity-level delivery filtering, raised in review.
108
+ *
109
+ * An event for an entity a session cannot read at all tells that session the record exists, its
110
+ * stable key and when it changed — and the session could never have read it, so withholding costs
111
+ * nothing. This does NOT close the row-level case: two sessions that both hold read permission on
112
+ * an entity still see each other's keys. That is tracked separately and deliberately not faked
113
+ * green here.
114
+ */
115
+ describe('cacheInvalidationFilter', () => {
116
+ const event = (entityName: string) => ({
117
+ entityName,
118
+ primaryKeyValues: '[{"FieldName":"ID","Value":"r1"}]',
119
+ action: 'save',
120
+ sourceServerId: 's1',
121
+ timestamp: new Date(),
122
+ });
123
+ const session = (userRecord: unknown) => ({ userPayload: { userRecord } });
124
+
125
+ const withEntities = async (entities: Array<{ Name: string; CanRead: boolean }>) => {
126
+ vi.resetModules();
127
+ vi.doMock('@memberjunction/core', () => ({
128
+ Metadata: class {
129
+ get Entities() {
130
+ return entities.map((e) => ({
131
+ Name: e.Name,
132
+ GetUserPermisions: () => ({ CanRead: e.CanRead }),
133
+ }));
134
+ }
135
+ // The real one is case-insensitive and trims — the filter relies on that, so the mock does too.
136
+ EntityByName(name: string) {
137
+ const key = name.trim().toLowerCase();
138
+ return this.Entities.find((e) => e.Name.toLowerCase() === key);
139
+ }
140
+ },
141
+ }));
142
+ return (await import('../generic/CacheInvalidationResolver.js')).cacheInvalidationFilter;
143
+ };
144
+
145
+ afterEach(() => vi.doUnmock('@memberjunction/core'));
146
+
147
+ it('delivers an event for an entity the session may read', async () => {
148
+ const filter = await withEntities([{ Name: 'AI Models', CanRead: true }]);
149
+ expect(filter({ payload: event('AI Models') as never, context: session({ ID: 'u1' }) })).toBe(true);
150
+ });
151
+
152
+ it('withholds an event for an entity the session may NOT read', async () => {
153
+ const filter = await withEntities([{ Name: 'Users', CanRead: false }]);
154
+ expect(filter({ payload: event('Users') as never, context: session({ ID: 'u1' }) })).toBe(false);
155
+ });
156
+
157
+ it('fails closed when the connection carries no user', async () => {
158
+ // onConnect rejects a socket whose token does not validate, so this should not arise — and it
159
+ // is the case least deserving of an unfiltered firehose if it does.
160
+ const filter = await withEntities([{ Name: 'AI Models', CanRead: true }]);
161
+ expect(filter({ payload: event('AI Models') as never, context: undefined })).toBe(false);
162
+ expect(filter({ payload: event('AI Models') as never, context: session(undefined) })).toBe(false);
163
+ });
164
+
165
+ it('delivers when the entity is unknown to this server, rather than silently going stale', async () => {
166
+ // Deliberately the opposite choice: a name absent from metadata cannot be permission-checked,
167
+ // and withholding would stop invalidating a legitimately cacheable entity — a correctness bug
168
+ // in place of a disclosure one.
169
+ const filter = await withEntities([{ Name: 'AI Models', CanRead: true }]);
170
+ expect(filter({ payload: event('Some Entity This Server Never Heard Of') as never, context: session({ ID: 'u1' }) })).toBe(true);
171
+ });
172
+
173
+ it('withholds an event with no entity name', async () => {
174
+ const filter = await withEntities([{ Name: 'AI Models', CanRead: true }]);
175
+ expect(filter({ payload: { ...event(''), entityName: '' } as never, context: session({ ID: 'u1' }) })).toBe(false);
176
+ });
177
+ });
@@ -66,11 +66,16 @@ vi.mock('mssql', () => {
66
66
  // We must also mock the auth module and its transitive deps so that importing
67
67
  // individual source files does not trigger type-graphql or reflect-metadata.
68
68
  vi.mock('../auth/index', () => ({
69
- getSigningKeys: vi.fn(),
70
- getSystemUser: vi.fn(),
71
- getValidationOptions: vi.fn(),
72
- verifyUserRecord: vi.fn(),
73
- extractUserInfoFromPayload: vi.fn(),
69
+ GetSigningKeys: vi.fn(),
70
+ get getSigningKeys() { return this.GetSigningKeys; },
71
+ GetSystemUser: vi.fn(),
72
+ get getSystemUser() { return this.GetSystemUser; },
73
+ GetValidationOptions: vi.fn(),
74
+ get getValidationOptions() { return this.GetValidationOptions; },
75
+ VerifyUserRecord: vi.fn(),
76
+ get verifyUserRecord() { return this.VerifyUserRecord; },
77
+ ExtractUserInfoFromPayload: vi.fn(),
78
+ get extractUserInfoFromPayload() { return this.ExtractUserInfoFromPayload; },
74
79
  TokenExpiredError: class TokenExpiredError extends Error {},
75
80
  AuthProviderFactory: { getInstance: vi.fn(() => ({ getByIssuer: vi.fn() })) },
76
81
  IAuthProvider: {},
@@ -82,7 +87,8 @@ vi.mock('../auth/AuthProviderFactory', () => ({
82
87
  }));
83
88
 
84
89
  vi.mock('../cache', () => ({
85
- authCache: new Map(),
90
+ AuthCache: new Map(),
91
+ get authCache() { return this.AuthCache; },
86
92
  }));
87
93
 
88
94
  vi.mock('@memberjunction/core', () => ({
@@ -1,8 +1,8 @@
1
1
  import 'reflect-metadata';
2
2
  import { describe, it, expect } from 'vitest';
3
3
  import type { IMetadataProvider } from '@memberjunction/core';
4
- import { redactArg } from '../logging/secretRedactor.js';
5
- import { NoLog, getNoLogFields } from '../logging/NoLog.js';
4
+ import { RedactArg } from '../logging/secretRedactor.js';
5
+ import { NoLog, GetNoLogFields } from '../logging/NoLog.js';
6
6
 
7
7
  /**
8
8
  * Test 4 (unit form): the `@NoLog`-decorated `Token` field on GetDataInputType is redacted
@@ -27,7 +27,7 @@ describe('Test 4: GetData Token redaction via field-level @NoLog', () => {
27
27
  const provider = { Entities: [] } as unknown as IMetadataProvider;
28
28
 
29
29
  it('getNoLogFields picks up the Token field mark', () => {
30
- const fields = getNoLogFields(GetDataInputType);
30
+ const fields = GetNoLogFields(GetDataInputType);
31
31
  expect(fields.has('Token')).toBe(true);
32
32
  expect(fields.has('Queries')).toBe(false);
33
33
  });
@@ -40,12 +40,12 @@ describe('Test 4: GetData Token redaction via field-level @NoLog', () => {
40
40
  Entities: [{ ClassName: 'Something', EncryptedFields: [] }],
41
41
  } as unknown as IMetadataProvider;
42
42
 
43
- const result = redactArg({
43
+ const result = RedactArg({
44
44
  inputTypeName: 'GetDataInput', // not entity-bound — regex won't match
45
45
  rawValue: { Token: 'FAKE_SYSTEM_TOKEN_DO_NOT_USE', Queries: ['SELECT 1', 'SELECT 2'] },
46
46
  provider: providerWithEntities,
47
47
  noLogParameter: false,
48
- noLogFields: getNoLogFields(GetDataInputType),
48
+ noLogFields: GetNoLogFields(GetDataInputType),
49
49
  });
50
50
 
51
51
  expect(result).toEqual({ Token: '<redacted>', Queries: ['SELECT 1', 'SELECT 2'] });
@@ -58,7 +58,7 @@ describe('Test 4: GetData Token redaction via field-level @NoLog', () => {
58
58
  Entities: [{ ClassName: 'GetDataThing', EncryptedFields: [] }],
59
59
  } as unknown as IMetadataProvider;
60
60
 
61
- const result = redactArg({
61
+ const result = RedactArg({
62
62
  inputTypeName: 'CreateGetDataThingInput',
63
63
  rawValue: { Token: 'FAKE_SYSTEM_TOKEN_DO_NOT_USE', Queries: ['SELECT 1'] },
64
64
  provider: providerWithEntity,
@@ -72,7 +72,7 @@ describe('Test 4: GetData Token redaction via field-level @NoLog', () => {
72
72
 
73
73
  it('parameter-level @NoLog masks the entire arg regardless of shape', () => {
74
74
  // If Token were a top-level @Arg with @NoLog (parameter form), noLogParameter=true masks it whole.
75
- const result = redactArg({
75
+ const result = RedactArg({
76
76
  inputTypeName: 'String',
77
77
  rawValue: 'FAKE_SYSTEM_TOKEN_DO_NOT_USE',
78
78
  provider,
@@ -78,7 +78,7 @@ vi.mock('@memberjunction/core', () => {
78
78
  });
79
79
 
80
80
  import { AuthProviderEngine } from '../auth/AuthProviderEngine.js';
81
- import { refreshAuthProviders } from '../auth/initializeProviders.js';
81
+ import { RefreshAuthProviders } from '../auth/initializeProviders.js';
82
82
 
83
83
  /** Minimal stand-in for a generated MJAuthenticationProviderEntity row. */
84
84
  function metadataRow(name: string, driverClass: string) {
@@ -106,7 +106,7 @@ beforeEach(() => {
106
106
 
107
107
  describe('refreshAuthProviders', () => {
108
108
  it('re-registers the config-declared providers after clearing, so a refresh cannot lock config-path users out', async () => {
109
- await refreshAuthProviders();
109
+ await RefreshAuthProviders();
110
110
 
111
111
  expect(clearMock).toHaveBeenCalledTimes(1);
112
112
  expect(createProviderMock).toHaveBeenCalledWith(expect.objectContaining({ name: 'config-okta' }));
@@ -124,7 +124,7 @@ describe('refreshAuthProviders', () => {
124
124
  });
125
125
 
126
126
  try {
127
- await expect(refreshAuthProviders()).rejects.toThrow('PermissionConstrainedError');
127
+ await expect(RefreshAuthProviders()).rejects.toThrow('PermissionConstrainedError');
128
128
  expect(clearMock).not.toHaveBeenCalled();
129
129
  expect(registerMock).not.toHaveBeenCalled();
130
130
  } finally {
@@ -135,7 +135,7 @@ describe('refreshAuthProviders', () => {
135
135
  it('layers the metadata rows on top of the config-declared providers, in that order', async () => {
136
136
  (AuthProviderEngine.Instance as unknown as { _providers: unknown[] })._providers = [metadataRow('Catalog WorkOS', 'workos')];
137
137
 
138
- const count = await refreshAuthProviders();
138
+ const count = await RefreshAuthProviders();
139
139
 
140
140
  expect(count).toBe(1);
141
141
  expect(registerMock).toHaveBeenCalledTimes(2);