@memberjunction/server 6.2.0-edge.3 → 6.2.0-edge.5

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 (543) hide show
  1. package/README.md +20 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +25 -0
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -0
  5. package/dist/agentSessions/BridgeHostInstance.js +30 -0
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -0
  7. package/dist/agentSessions/HostInstance.d.ts +75 -11
  8. package/dist/agentSessions/HostInstance.d.ts.map +1 -1
  9. package/dist/agentSessions/HostInstance.js +99 -28
  10. package/dist/agentSessions/HostInstance.js.map +1 -1
  11. package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
  12. package/dist/agentSessions/ReturningVisitorRecap.js +7 -3
  13. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  14. package/dist/agentSessions/SessionJanitor.d.ts +236 -27
  15. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  16. package/dist/agentSessions/SessionJanitor.js +682 -54
  17. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  18. package/dist/agentSessions/SessionManager.d.ts +48 -3
  19. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  20. package/dist/agentSessions/SessionManager.js +112 -9
  21. package/dist/agentSessions/SessionManager.js.map +1 -1
  22. package/dist/agentSessions/SessionRunIDVerifier.d.ts +63 -0
  23. package/dist/agentSessions/SessionRunIDVerifier.d.ts.map +1 -0
  24. package/dist/agentSessions/SessionRunIDVerifier.js +129 -0
  25. package/dist/agentSessions/SessionRunIDVerifier.js.map +1 -0
  26. package/dist/agentSessions/index.d.ts +2 -0
  27. package/dist/agentSessions/index.d.ts.map +1 -1
  28. package/dist/agentSessions/index.js +10 -3
  29. package/dist/agentSessions/index.js.map +1 -1
  30. package/dist/apiRoot.d.ts +32 -0
  31. package/dist/apiRoot.d.ts.map +1 -0
  32. package/dist/apiRoot.js +67 -0
  33. package/dist/apiRoot.js.map +1 -0
  34. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  35. package/dist/auth/AuthProviderCatalogRouter.js +25 -0
  36. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  37. package/dist/auth/LoginScreenEngine.d.ts +22 -0
  38. package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
  39. package/dist/auth/LoginScreenEngine.js +57 -0
  40. package/dist/auth/LoginScreenEngine.js.map +1 -0
  41. package/dist/auth/actionAuthorization.d.ts +40 -0
  42. package/dist/auth/actionAuthorization.d.ts.map +1 -0
  43. package/dist/auth/actionAuthorization.js +94 -0
  44. package/dist/auth/actionAuthorization.js.map +1 -0
  45. package/dist/auth/index.d.ts +1 -0
  46. package/dist/auth/index.d.ts.map +1 -1
  47. package/dist/auth/index.js +4 -10
  48. package/dist/auth/index.js.map +1 -1
  49. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  50. package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
  51. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  52. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  53. package/dist/auth/magicLink/MagicLinkService.js +6 -3
  54. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  55. package/dist/auth/newUsers.d.ts +10 -0
  56. package/dist/auth/newUsers.d.ts.map +1 -1
  57. package/dist/auth/newUsers.js +80 -11
  58. package/dist/auth/newUsers.js.map +1 -1
  59. package/dist/config.d.ts +2514 -22
  60. package/dist/config.d.ts.map +1 -1
  61. package/dist/config.js +166 -4
  62. package/dist/config.js.map +1 -1
  63. package/dist/context.d.ts +8 -0
  64. package/dist/context.d.ts.map +1 -1
  65. package/dist/context.js +14 -11
  66. package/dist/context.js.map +1 -1
  67. package/dist/coreRoutes.d.ts +29 -0
  68. package/dist/coreRoutes.d.ts.map +1 -0
  69. package/dist/coreRoutes.js +142 -0
  70. package/dist/coreRoutes.js.map +1 -0
  71. package/dist/generated/graphql-schemas/__mj.d.ts +504 -3
  72. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  73. package/dist/generated/graphql-schemas/__mj.js +2456 -7
  74. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  75. package/dist/generic/CacheInvalidationResolver.d.ts +43 -8
  76. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  77. package/dist/generic/CacheInvalidationResolver.js +59 -19
  78. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  79. package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
  80. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  81. package/dist/generic/PushStatusResolver.js +1 -1
  82. package/dist/generic/PushStatusResolver.js.map +1 -1
  83. package/dist/generic/ResolverBase.d.ts +123 -48
  84. package/dist/generic/ResolverBase.d.ts.map +1 -1
  85. package/dist/generic/ResolverBase.js +293 -305
  86. package/dist/generic/ResolverBase.js.map +1 -1
  87. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  88. package/dist/generic/RunViewResolver.js +16 -0
  89. package/dist/generic/RunViewResolver.js.map +1 -1
  90. package/dist/globalCors.d.ts +33 -0
  91. package/dist/globalCors.d.ts.map +1 -0
  92. package/dist/globalCors.js +58 -0
  93. package/dist/globalCors.js.map +1 -0
  94. package/dist/index.d.ts +17 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +219 -278
  97. package/dist/index.js.map +1 -1
  98. package/dist/isolatedProvider.d.ts +20 -0
  99. package/dist/isolatedProvider.d.ts.map +1 -0
  100. package/dist/isolatedProvider.js +22 -0
  101. package/dist/isolatedProvider.js.map +1 -0
  102. package/dist/multiTenancy/index.d.ts.map +1 -1
  103. package/dist/multiTenancy/index.js +22 -2
  104. package/dist/multiTenancy/index.js.map +1 -1
  105. package/dist/realtimeProxy/RealtimeProxyServer.d.ts +44 -4
  106. package/dist/realtimeProxy/RealtimeProxyServer.d.ts.map +1 -1
  107. package/dist/realtimeProxy/RealtimeProxyServer.js +121 -16
  108. package/dist/realtimeProxy/RealtimeProxyServer.js.map +1 -1
  109. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts +171 -0
  110. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts.map +1 -0
  111. package/dist/realtimeProxy/RealtimeRelayTunnel.js +532 -0
  112. package/dist/realtimeProxy/RealtimeRelayTunnel.js.map +1 -0
  113. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts +148 -0
  114. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts.map +1 -0
  115. package/dist/realtimeSessions/RealtimeSessionEventService.js +191 -0
  116. package/dist/realtimeSessions/RealtimeSessionEventService.js.map +1 -0
  117. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts +66 -0
  118. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -0
  119. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +139 -0
  120. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -0
  121. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts +38 -0
  122. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -0
  123. package/dist/realtimeSessions/RealtimeVerifyRouter.js +99 -0
  124. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -0
  125. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
  126. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
  127. package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
  128. package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
  129. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts +61 -0
  130. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -0
  131. package/dist/realtimeSessions/SessionVerificationPortsBase.js +149 -0
  132. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -0
  133. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts +57 -0
  134. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts.map +1 -0
  135. package/dist/realtimeSessions/SlidingWindowRateLimiter.js +69 -0
  136. package/dist/realtimeSessions/SlidingWindowRateLimiter.js.map +1 -0
  137. package/dist/realtimeSessions/index.d.ts +19 -0
  138. package/dist/realtimeSessions/index.d.ts.map +1 -0
  139. package/dist/realtimeSessions/index.js +19 -0
  140. package/dist/realtimeSessions/index.js.map +1 -0
  141. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +30 -0
  142. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
  143. package/dist/realtimeSessions/ownedRealtimeSession.js +47 -0
  144. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
  145. package/dist/realtimeSessions/sessionAccess.d.ts +92 -0
  146. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
  147. package/dist/realtimeSessions/sessionAccess.js +94 -0
  148. package/dist/realtimeSessions/sessionAccess.js.map +1 -0
  149. package/dist/realtimeSessions/sessionConfigStamps.d.ts +70 -0
  150. package/dist/realtimeSessions/sessionConfigStamps.d.ts.map +1 -0
  151. package/dist/realtimeSessions/sessionConfigStamps.js +93 -0
  152. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -0
  153. package/dist/realtimeSessions/subscriptionAuthorization.d.ts +65 -0
  154. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -0
  155. package/dist/realtimeSessions/subscriptionAuthorization.js +71 -0
  156. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -0
  157. package/dist/realtimeSessions/verificationCore.d.ts +243 -0
  158. package/dist/realtimeSessions/verificationCore.d.ts.map +1 -0
  159. package/dist/realtimeSessions/verificationCore.js +356 -0
  160. package/dist/realtimeSessions/verificationCore.js.map +1 -0
  161. package/dist/realtimeSessions/verificationPages.d.ts +66 -0
  162. package/dist/realtimeSessions/verificationPages.d.ts.map +1 -0
  163. package/dist/realtimeSessions/verificationPages.js +110 -0
  164. package/dist/realtimeSessions/verificationPages.js.map +1 -0
  165. package/dist/realtimeSessions/verificationPolicy.d.ts +147 -0
  166. package/dist/realtimeSessions/verificationPolicy.d.ts.map +1 -0
  167. package/dist/realtimeSessions/verificationPolicy.js +249 -0
  168. package/dist/realtimeSessions/verificationPolicy.js.map +1 -0
  169. package/dist/realtimeSessions/verificationWorkflow.d.ts +263 -0
  170. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -0
  171. package/dist/realtimeSessions/verificationWorkflow.js +435 -0
  172. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -0
  173. package/dist/realtimeWidget/widgetGuestElevation.d.ts +20 -2
  174. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  175. package/dist/realtimeWidget/widgetGuestElevation.js +31 -2
  176. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  177. package/dist/resolvers/ActionResolver.d.ts +31 -5
  178. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  179. package/dist/resolvers/ActionResolver.js +75 -14
  180. package/dist/resolvers/ActionResolver.js.map +1 -1
  181. package/dist/resolvers/AdhocQueryResolver.d.ts +14 -1
  182. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  183. package/dist/resolvers/AdhocQueryResolver.js +21 -5
  184. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  185. package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
  186. package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
  187. package/dist/resolvers/ArtifactFileResolver.js +9 -7
  188. package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
  189. package/dist/resolvers/CacheStatsResolver.d.ts +27 -0
  190. package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -1
  191. package/dist/resolvers/CacheStatsResolver.js +113 -2
  192. package/dist/resolvers/CacheStatsResolver.js.map +1 -1
  193. package/dist/resolvers/ClientToolRequestResolver.d.ts +4 -2
  194. package/dist/resolvers/ClientToolRequestResolver.d.ts.map +1 -1
  195. package/dist/resolvers/ClientToolRequestResolver.js +28 -10
  196. package/dist/resolvers/ClientToolRequestResolver.js.map +1 -1
  197. package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
  198. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  199. package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
  200. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  201. package/dist/resolvers/DatasetResolver.d.ts +24 -3
  202. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  203. package/dist/resolvers/DatasetResolver.js +57 -8
  204. package/dist/resolvers/DatasetResolver.js.map +1 -1
  205. package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
  206. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  207. package/dist/resolvers/EntityRecordNameResolver.js +3 -2
  208. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  209. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +27 -1
  210. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  211. package/dist/resolvers/FetchEntityVectorsResolver.js +148 -2
  212. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  213. package/dist/resolvers/FileResolver.d.ts +82 -11
  214. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  215. package/dist/resolvers/FileResolver.js +279 -101
  216. package/dist/resolvers/FileResolver.js.map +1 -1
  217. package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
  218. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  219. package/dist/resolvers/GetDataContextDataResolver.js +117 -38
  220. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  221. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  222. package/dist/resolvers/GetDataResolver.js +6 -3
  223. package/dist/resolvers/GetDataResolver.js.map +1 -1
  224. package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -1
  225. package/dist/resolvers/HumanHandoffResolver.js +7 -1
  226. package/dist/resolvers/HumanHandoffResolver.js.map +1 -1
  227. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  228. package/dist/resolvers/IntegrationDiscoveryResolver.js +4 -2
  229. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  230. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  231. package/dist/resolvers/MCPResolver.js +9 -4
  232. package/dist/resolvers/MCPResolver.js.map +1 -1
  233. package/dist/resolvers/QueryResolver.d.ts +2 -0
  234. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  235. package/dist/resolvers/QueryResolver.js +13 -0
  236. package/dist/resolvers/QueryResolver.js.map +1 -1
  237. package/dist/resolvers/RealtimeBridgeResolver.d.ts +54 -2
  238. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  239. package/dist/resolvers/RealtimeBridgeResolver.js +155 -10
  240. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  241. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +157 -33
  242. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  243. package/dist/resolvers/RealtimeClientSessionResolver.js +404 -116
  244. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  245. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts +61 -0
  246. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts.map +1 -0
  247. package/dist/resolvers/RealtimeSessionEventsResolver.js +130 -0
  248. package/dist/resolvers/RealtimeSessionEventsResolver.js.map +1 -0
  249. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts +85 -0
  250. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts.map +1 -0
  251. package/dist/resolvers/RealtimeSessionVerificationResolver.js +188 -0
  252. package/dist/resolvers/RealtimeSessionVerificationResolver.js.map +1 -0
  253. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
  254. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  255. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
  256. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  257. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -0
  258. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  259. package/dist/resolvers/RunAIAgentResolver.js +100 -14
  260. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  261. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  262. package/dist/resolvers/RunTemplateResolver.js +12 -11
  263. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  264. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
  265. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
  266. package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
  267. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  268. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  269. package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
  270. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  271. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  272. package/dist/resolvers/SyncDataResolver.js +6 -2
  273. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  274. package/dist/resolvers/SyncRolesUsersResolver.d.ts +2 -0
  275. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  276. package/dist/resolvers/SyncRolesUsersResolver.js +23 -6
  277. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  278. package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
  279. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  280. package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
  281. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  282. package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
  283. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  284. package/dist/resolvers/TestQuerySQLResolver.js +65 -13
  285. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  286. package/dist/resolvers/TransactionGroupResolver.d.ts +19 -2
  287. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  288. package/dist/resolvers/TransactionGroupResolver.js +102 -24
  289. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  290. package/dist/resolvers/UserAvatarResolver.d.ts +16 -0
  291. package/dist/resolvers/UserAvatarResolver.d.ts.map +1 -0
  292. package/dist/resolvers/UserAvatarResolver.js +124 -0
  293. package/dist/resolvers/UserAvatarResolver.js.map +1 -0
  294. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  295. package/dist/resolvers/UserResolver.js +2 -17
  296. package/dist/resolvers/UserResolver.js.map +1 -1
  297. package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
  298. package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
  299. package/dist/resolvers/agent-run-data-guard.js +72 -0
  300. package/dist/resolvers/agent-run-data-guard.js.map +1 -0
  301. package/dist/resolvers/agentVisionConsentAudit.d.ts +37 -0
  302. package/dist/resolvers/agentVisionConsentAudit.d.ts.map +1 -0
  303. package/dist/resolvers/agentVisionConsentAudit.js +63 -0
  304. package/dist/resolvers/agentVisionConsentAudit.js.map +1 -0
  305. package/dist/resolvers/avatarInputValidation.d.ts +40 -0
  306. package/dist/resolvers/avatarInputValidation.d.ts.map +1 -0
  307. package/dist/resolvers/avatarInputValidation.js +97 -0
  308. package/dist/resolvers/avatarInputValidation.js.map +1 -0
  309. package/dist/resolvers/currentUserRoles.d.ts +29 -0
  310. package/dist/resolvers/currentUserRoles.d.ts.map +1 -1
  311. package/dist/resolvers/currentUserRoles.js +30 -0
  312. package/dist/resolvers/currentUserRoles.js.map +1 -1
  313. package/dist/resolvers/meetings/meetingMutations.d.ts +6 -0
  314. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -1
  315. package/dist/resolvers/meetings/meetingMutations.js +21 -0
  316. package/dist/resolvers/meetings/meetingMutations.js.map +1 -1
  317. package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
  318. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
  319. package/dist/rest/RealtimeRecordingHandler.js +383 -0
  320. package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
  321. package/dist/rest/ViewOperationsHandler.d.ts +3 -1
  322. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  323. package/dist/rest/ViewOperationsHandler.js +21 -12
  324. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  325. package/dist/rest/setupRESTEndpoints.d.ts +6 -0
  326. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  327. package/dist/rest/setupRESTEndpoints.js +6 -0
  328. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  329. package/dist/serverExtensionReservedRoots.d.ts +12 -10
  330. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  331. package/dist/serverExtensionReservedRoots.js +14 -17
  332. package/dist/serverExtensionReservedRoots.js.map +1 -1
  333. package/dist/services/MJStorageBlobStore.d.ts +8 -1
  334. package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
  335. package/dist/services/MJStorageBlobStore.js +25 -19
  336. package/dist/services/MJStorageBlobStore.js.map +1 -1
  337. package/dist/services/StartTaskGraphDispatcher.js +2 -2
  338. package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
  339. package/dist/services/TaskGraphActionRunner.d.ts +5 -3
  340. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  341. package/dist/services/TaskGraphActionRunner.js +27 -5
  342. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  343. package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
  344. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  345. package/dist/services/TaskGraphAgentRunner.js +157 -9
  346. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  347. package/dist/services/TaskGraphContinuationDeliverer.d.ts +57 -4
  348. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  349. package/dist/services/TaskGraphContinuationDeliverer.js +607 -18
  350. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  351. package/dist/sharedCache.d.ts +105 -0
  352. package/dist/sharedCache.d.ts.map +1 -0
  353. package/dist/sharedCache.js +279 -0
  354. package/dist/sharedCache.js.map +1 -0
  355. package/dist/types.d.ts +6 -0
  356. package/dist/types.d.ts.map +1 -1
  357. package/dist/types.js.map +1 -1
  358. package/package.json +99 -96
  359. package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
  360. package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
  361. package/src/__tests__/BridgeHostInstance.test.ts +232 -0
  362. package/src/__tests__/ClientToolRequestResolver.test.ts +116 -0
  363. package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
  364. package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
  365. package/src/__tests__/FetchEntityVectorsResolver.test.ts +433 -0
  366. package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
  367. package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
  368. package/src/__tests__/HostInstance.test.ts +84 -0
  369. package/src/__tests__/HumanHandoffResolver.test.ts +17 -0
  370. package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
  371. package/src/__tests__/LoginScreenEngine.test.ts +86 -0
  372. package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
  373. package/src/__tests__/MeetingResolver.test.ts +75 -1
  374. package/src/__tests__/RealtimeBridgeResolver.test.ts +415 -6
  375. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
  376. package/src/__tests__/RealtimeClientSessionResolver.test.ts +682 -58
  377. package/src/__tests__/RealtimeProxyServer.test.ts +16 -1
  378. package/src/__tests__/RealtimeRelay.test.ts +876 -0
  379. package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
  380. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
  381. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
  382. package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
  383. package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
  384. package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
  385. package/src/__tests__/ResolverBase.clientOldValues.test.ts +212 -6
  386. package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
  387. package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
  388. package/src/__tests__/RunAIAgentResolver.branch.test.ts +170 -0
  389. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +6 -4
  390. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +258 -0
  391. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +166 -0
  392. package/src/__tests__/RunTemplateResolver.test.ts +132 -0
  393. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +63 -0
  394. package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
  395. package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
  396. package/src/__tests__/SessionJanitor.test.ts +1203 -21
  397. package/src/__tests__/SessionManager.test.ts +240 -17
  398. package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
  399. package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
  400. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
  401. package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
  402. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +403 -22
  403. package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
  404. package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
  405. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
  406. package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
  407. package/src/__tests__/UserAvatarResolver.test.ts +255 -0
  408. package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
  409. package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
  410. package/src/__tests__/actionAuthorization.test.ts +130 -0
  411. package/src/__tests__/agent-run-data-guard.test.ts +130 -0
  412. package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
  413. package/src/__tests__/apiRootBoot.test.ts +202 -0
  414. package/src/__tests__/avatarInputValidation.test.ts +160 -0
  415. package/src/__tests__/cacheInvalidationRecordData.test.ts +64 -0
  416. package/src/__tests__/conversationRunEvents.test.ts +56 -14
  417. package/src/__tests__/globalCors.test.ts +217 -0
  418. package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
  419. package/src/__tests__/magicLinkService.consume.test.ts +6 -0
  420. package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -0
  421. package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
  422. package/src/__tests__/multiTenancy.security.test.ts +51 -0
  423. package/src/__tests__/multiTenancy.test.ts +1 -1
  424. package/src/__tests__/newUsers.template.test.ts +151 -0
  425. package/src/__tests__/newUsers.test.ts +74 -5
  426. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +17 -2
  427. package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
  428. package/src/__tests__/pushStatusResolver.filter.test.ts +7 -0
  429. package/src/__tests__/realtimeRecordingHandler.test.ts +652 -0
  430. package/src/__tests__/realtimeSessions/RealtimeSessionEventService.test.ts +201 -0
  431. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +215 -0
  432. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationResolver.test.ts +102 -0
  433. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationService.test.ts +349 -0
  434. package/src/__tests__/realtimeSessions/RealtimeVerifyRouter.test.ts +131 -0
  435. package/src/__tests__/realtimeSessions/SlidingWindowRateLimiter.test.ts +56 -0
  436. package/src/__tests__/realtimeSessions/helpers.ts +4 -0
  437. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +129 -0
  438. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +124 -0
  439. package/src/__tests__/realtimeSessions/verificationCore.test.ts +355 -0
  440. package/src/__tests__/realtimeSessions/verificationPages.test.ts +84 -0
  441. package/src/__tests__/realtimeSessions/verificationPolicy.test.ts +226 -0
  442. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +633 -0
  443. package/src/__tests__/resolverBase.fls.test.ts +87 -4
  444. package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
  445. package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -96
  446. package/src/__tests__/sharedCache.test.ts +312 -0
  447. package/src/__tests__/widgetGuestElevation.test.ts +44 -0
  448. package/src/agentSessions/BridgeHostInstance.ts +32 -0
  449. package/src/agentSessions/HostInstance.ts +124 -28
  450. package/src/agentSessions/ReturningVisitorRecap.ts +7 -3
  451. package/src/agentSessions/SessionJanitor.ts +821 -59
  452. package/src/agentSessions/SessionManager.ts +138 -26
  453. package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
  454. package/src/agentSessions/index.ts +10 -3
  455. package/src/apiRoot.ts +78 -0
  456. package/src/auth/AuthProviderCatalogRouter.ts +26 -0
  457. package/src/auth/LoginScreenEngine.ts +50 -0
  458. package/src/auth/actionAuthorization.ts +116 -0
  459. package/src/auth/index.ts +4 -8
  460. package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
  461. package/src/auth/magicLink/MagicLinkService.ts +6 -3
  462. package/src/auth/newUsers.ts +99 -11
  463. package/src/config.ts +171 -5
  464. package/src/context.ts +15 -10
  465. package/src/coreRoutes.ts +166 -0
  466. package/src/generated/graphql-schemas/__mj.ts +1815 -57
  467. package/src/generic/CacheInvalidationResolver.ts +73 -18
  468. package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
  469. package/src/generic/PushStatusResolver.ts +1 -1
  470. package/src/generic/ResolverBase.ts +335 -326
  471. package/src/generic/RunViewResolver.ts +21 -0
  472. package/src/globalCors.ts +71 -0
  473. package/src/index.ts +231 -300
  474. package/src/isolatedProvider.ts +22 -0
  475. package/src/multiTenancy/index.ts +24 -2
  476. package/src/realtimeProxy/RealtimeProxyServer.ts +148 -16
  477. package/src/realtimeProxy/RealtimeRelayTunnel.ts +645 -0
  478. package/src/realtimeSessions/README.md +179 -0
  479. package/src/realtimeSessions/RealtimeSessionEventService.ts +274 -0
  480. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +168 -0
  481. package/src/realtimeSessions/RealtimeVerifyRouter.ts +109 -0
  482. package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
  483. package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
  484. package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
  485. package/src/realtimeSessions/index.ts +18 -0
  486. package/src/realtimeSessions/ownedRealtimeSession.ts +55 -0
  487. package/src/realtimeSessions/sessionAccess.ts +145 -0
  488. package/src/realtimeSessions/sessionConfigStamps.ts +123 -0
  489. package/src/realtimeSessions/subscriptionAuthorization.ts +116 -0
  490. package/src/realtimeSessions/verificationCore.ts +502 -0
  491. package/src/realtimeSessions/verificationPages.ts +149 -0
  492. package/src/realtimeSessions/verificationPolicy.ts +321 -0
  493. package/src/realtimeSessions/verificationWorkflow.ts +702 -0
  494. package/src/realtimeWidget/widgetGuestElevation.ts +34 -2
  495. package/src/resolvers/ActionResolver.ts +84 -21
  496. package/src/resolvers/AdhocQueryResolver.ts +24 -6
  497. package/src/resolvers/ArtifactFileResolver.ts +9 -8
  498. package/src/resolvers/CacheStatsResolver.ts +89 -2
  499. package/src/resolvers/ClientToolRequestResolver.ts +25 -7
  500. package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
  501. package/src/resolvers/DatasetResolver.ts +70 -10
  502. package/src/resolvers/EntityRecordNameResolver.ts +3 -2
  503. package/src/resolvers/FetchEntityVectorsResolver.ts +179 -2
  504. package/src/resolvers/FileResolver.ts +321 -106
  505. package/src/resolvers/GetDataContextDataResolver.ts +139 -41
  506. package/src/resolvers/GetDataResolver.ts +6 -3
  507. package/src/resolvers/HumanHandoffResolver.ts +8 -0
  508. package/src/resolvers/IntegrationDiscoveryResolver.ts +4 -2
  509. package/src/resolvers/MCPResolver.ts +8 -5
  510. package/src/resolvers/QueryResolver.ts +11 -0
  511. package/src/resolvers/RealtimeBridgeResolver.ts +163 -11
  512. package/src/resolvers/RealtimeClientSessionResolver.ts +511 -129
  513. package/src/resolvers/RealtimeSessionEventsResolver.ts +133 -0
  514. package/src/resolvers/RealtimeSessionVerificationResolver.ts +174 -0
  515. package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
  516. package/src/resolvers/RunAIAgentResolver.ts +116 -14
  517. package/src/resolvers/RunTemplateResolver.ts +13 -12
  518. package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
  519. package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
  520. package/src/resolvers/SyncDataResolver.ts +6 -2
  521. package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
  522. package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
  523. package/src/resolvers/TestQuerySQLResolver.ts +68 -13
  524. package/src/resolvers/TransactionGroupResolver.ts +131 -27
  525. package/src/resolvers/UserAvatarResolver.ts +111 -0
  526. package/src/resolvers/UserResolver.ts +2 -16
  527. package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
  528. package/src/resolvers/agent-run-data-guard.ts +89 -0
  529. package/src/resolvers/agentVisionConsentAudit.ts +82 -0
  530. package/src/resolvers/avatarInputValidation.ts +123 -0
  531. package/src/resolvers/currentUserRoles.ts +32 -1
  532. package/src/resolvers/meetings/meetingMutations.ts +21 -0
  533. package/src/rest/RealtimeRecordingHandler.ts +464 -0
  534. package/src/rest/ViewOperationsHandler.ts +29 -13
  535. package/src/rest/setupRESTEndpoints.ts +6 -0
  536. package/src/serverExtensionReservedRoots.ts +14 -17
  537. package/src/services/MJStorageBlobStore.ts +31 -30
  538. package/src/services/StartTaskGraphDispatcher.ts +2 -2
  539. package/src/services/TaskGraphActionRunner.ts +25 -5
  540. package/src/services/TaskGraphAgentRunner.ts +188 -11
  541. package/src/services/TaskGraphContinuationDeliverer.ts +713 -17
  542. package/src/sharedCache.ts +305 -0
  543. package/src/types.ts +7 -0
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import dotenv from 'dotenv';
2
2
  dotenv.config({ quiet: true });
3
3
  import { expressMiddleware } from '@as-integrations/express5';
4
4
  import { mergeSchemas } from '@graphql-tools/schema';
5
- import { Metadata, SetProvider, StartupManager as StartupManagerImport, BaseEntity, RunView, DatabaseProviderBase, ResolveStartupMode } from '@memberjunction/core';
5
+ import { Metadata, SetProvider, StartupManager as StartupManagerImport, BaseEntity, RunView, DatabaseProviderBase, ProviderBase, ResolveStartupMode } from '@memberjunction/core';
6
6
  import { UserCache, resolveDbPlatformFromEnv } from '@memberjunction/generic-database-provider';
7
7
  import { MJGlobal, MJEventType, ShutdownRegistry } from '@memberjunction/global';
8
8
  import { setupSQLServerClient, SQLServerDataProvider, SQLServerProviderConfigData } from '@memberjunction/sqlserver-dataprovider';
@@ -17,9 +17,10 @@ import { default as fg } from 'fast-glob';
17
17
  import { useServer } from 'graphql-ws/lib/use/ws';
18
18
  import { createServer } from 'node:http';
19
19
  import { fileURLToPath } from 'node:url';
20
- import { readFileSync, writeFileSync } from 'node:fs';
20
+ import { mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
21
+ import { tmpdir } from 'node:os';
21
22
  import { Session as InspectorSession } from 'node:inspector';
22
- import { sep } from 'node:path';
23
+ import { join, sep } from 'node:path';
23
24
  import 'reflect-metadata';
24
25
  import { ReplaySubject } from 'rxjs';
25
26
  import { buildSchemaSync, getMetadataStorage, GraphQLTimestamp } from 'type-graphql';
@@ -32,7 +33,7 @@ import { configInfo, configFilePath, dbDatabase, dbHost, dbPort, dbUsername, gra
32
33
  import { TranslateBracketsToPG } from './postgresqlCompat.js';
33
34
  import { BuildPostgreSQLConnectionConfig, DescribeReadOnlyLoginOverreach, PostgreSQLReadOnlyPool, ResolvePostgreSQLEndpoint, ResolvePostgreSQLReadOnlyCredentials, ToPGPoolConfig } from './postgresqlPoolSettings.js';
34
35
  import { default as jwt } from 'jsonwebtoken';
35
- import { contextFunction, CreateUnifiedAuthMiddleware, getUserPayload } from './context.js';
36
+ import { contextFunction, CreateReadOnlyProvider, CreateUnifiedAuthMiddleware, getUserPayload } from './context.js';
36
37
  import { requireSystemUserDirective, publicDirective } from './directives/index.js';
37
38
  import { variablesLoggingMiddleware } from './logging/variablesLoggingMiddleware.js';
38
39
  import { auditResolversForUndecoratedArgs } from './logging/bootAudit.js';
@@ -40,32 +41,30 @@ import { StartupLogger } from './logging/StartupLogger.js';
40
41
  import { AuthProviderFactory } from '@memberjunction/auth-providers';
41
42
  import createMSSQLConfig from './orm.js';
42
43
  import { setupRESTEndpoints } from './rest/setupRESTEndpoints.js';
43
- import { createOAuthCallbackHandler } from './rest/OAuthCallbackHandler.js';
44
- import { createSignatureWebhookHandler } from './rest/SignatureWebhookHandler.js';
45
- import { createMediaStreamRouter } from './rest/MediaStreamHandler.js';
46
- import { createRealtimeSdpBrokerRouter } from './rest/RealtimeSdpBrokerHandler.js';
47
- import { REALTIME_SDP_EXCHANGE_PATH } from '@memberjunction/ai';
48
- import { createMagicLinkHandler, createMagicLinkJwksRouter, registerMagicLinkAuthProvider, MAGIC_LINK_MOUNT_PATH } from './auth/magicLink/index.js';
49
- import { createWidgetHandler, WIDGET_MOUNT_PATH } from './realtimeWidget/index.js';
44
+ import { CreateRealtimeRecordingRouter, REALTIME_RECORDING_MOUNT_PATH } from './rest/RealtimeRecordingHandler.js';
45
+ import { LoadOwnedRealtimeSession } from './realtimeSessions/ownedRealtimeSession.js';
46
+ import { LoadSessionConversationExternalID } from './realtimeSessions/sessionAccess.js';
47
+ import { RecordingAssemblyScheduler } from './realtimeSessions/RecordingAssemblyScheduler.js';
48
+ import { RealtimeSessionEventService, ParseReplicatedRealtimeSessionEvent, } from './realtimeSessions/index.js';
50
49
  import { resolve } from 'node:path';
51
50
  import { DataSourceInfo, raiseEvent } from './types.js';
52
51
  import { ScheduledJobsService } from './services/ScheduledJobsService.js';
53
52
  import { IntegrationSyncWorkerService } from './services/IntegrationSyncWorkerService.js';
54
53
  import { LocalCacheManager, TelemetryManager, LogStatus, LogError, SetVerboseLogging } from '@memberjunction/core';
55
54
  import { validateAuthProvidersRegistered } from './auth/index.js';
56
- import { createAuthProviderCatalogRouter, AUTH_CATALOG_MOUNT_PATH } from './auth/AuthProviderCatalogRouter.js';
57
55
  import { GetAPIKeyEngine } from '@memberjunction/api-keys';
58
- import { RedisLocalStorageProvider } from '@memberjunction/redis-provider';
56
+ import { ActionEngineServer } from '@memberjunction/actions';
57
+ import { CreateAdhocSQLAuthorizer } from './resolvers/AdhocQueryResolver.js';
58
+ import { CacheManagerConfigFromSettings, CreateSharedCacheFromEnvironment, StartEngineSweeper, StartMetadataSweep, StartUserCacheChecks, WarmupLeaseMsFromSettings, WirePushStatusFanOut, WireSharedCacheEvents } from './sharedCache.js';
59
59
  import { PubSubManager } from './generic/PubSubManager.js';
60
60
  import { ReconcileOrphanedConversationDetails } from './generic/OrphanedConversationDetailReconciler.js';
61
- import { PUSH_STATUS_UPDATES_TOPIC, SetPushStatusPublishHook, ParseReplicatedStatusUpdate, } from './generic/PushStatusResolver.js';
62
61
  import { HANDOFF_OFFER_FANOUT_CHANNEL, HANDOFF_OFFER_TOPIC, SetHandoffOfferPublishHook, ParseReplicatedHandoffOfferUpdate, } from './resolvers/HumanHandoffResolver.js';
63
62
  import { RoomHandoffEngine } from '@memberjunction/livekit-room-server';
64
63
  import { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
65
64
  import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResolver.js';
66
65
  import { RegisterRSUProgressBridge } from './integration/RSUProgressBridge.js';
67
- import { ClientToolRequestManager, AgentRunWatchdog } from '@memberjunction/ai-agents';
68
- import { SessionJanitor } from './agentSessions/index.js';
66
+ import { ClientToolRequestManager, AgentRunWatchdog, SqlRealtimeRecordingLedger } from '@memberjunction/ai-agents';
67
+ import { BindBridgeEngineHostInstance, SessionJanitor, SetHostInstancePort, StartBridgeOrphanReconciliation } from './agentSessions/index.js';
69
68
  import { StartTaskGraphDispatcher } from './services/StartTaskGraphDispatcher.js';
70
69
  import { MJServerWorkQueueProviderSource, StartWorkQueueHost } from './services/WorkQueueHostService.js';
71
70
  import { GetAttachmentService } from '@memberjunction/aiengine';
@@ -73,8 +72,11 @@ import { MJStorageBlobStore } from './services/MJStorageBlobStore.js';
73
72
  import { CACHE_INVALIDATION_TOPIC, MayBroadcastRecordData, ConfigureRecordDataBroadcast } from './generic/CacheInvalidationResolver.js';
74
73
  import { ConnectorFactory, IntegrationEngine } from '@memberjunction/integration-engine';
75
74
  import { CronExpressionHelper } from '@memberjunction/scheduling-engine';
76
- import { ServerExtensionLoader, mergeServerExtensionConfigs, prepareServerExtensionConfigs, describeServerExtensionMount, InstallMediaUpgradeDispatcher, IsGraphQLWsPath } from '@memberjunction/server-extensions-core';
77
- import { coreReservedServerExtensionRoots } from './serverExtensionReservedRoots.js';
75
+ import { ServerExtensionLoader, mergeServerExtensionConfigs, prepareServerExtensionConfigs, describeServerExtensionMount, InstallMediaUpgradeDispatcher, IsGraphQLWsPath, GetCorsOwningServerExtensionRoots } from '@memberjunction/server-extensions-core';
76
+ import { CreateExtensionOwnedPreflightFallback, CreateGlobalCorsMiddleware } from './globalCors.js';
77
+ import { CoreReservedServerExtensionRoots } from './serverExtensionReservedRoots.js';
78
+ import { ApiRoute, ApiRootPath, ConfiguredPublicUrl } from './apiRoot.js';
79
+ import { MountHealthcheckRoute, MountPublicCoreRoutes, MountExtensionHealthRoute, MountAuthCatalogRoute, MountAuthenticatedCoreRoutes } from './coreRoutes.js';
78
80
  import { MetadataCacheRefreshIntervalSeconds } from './providerConfigUnits.js';
79
81
  import { CreateMetadataRefreshSignalHandler, METADATA_REFRESH_SIGNAL } from './metadataRefreshSignal.js';
80
82
  const cacheRefreshInterval = configInfo.databaseSettings.metadataCacheRefreshInterval;
@@ -105,7 +107,9 @@ export * from 'type-graphql';
105
107
  // later importers, which makes schema build fail on ViewResult.RowCount.
106
108
  export { Int, Float, ID } from 'type-graphql';
107
109
  export { NewUserBase } from './auth/newUsers.js';
110
+ export { CreateIsolatedProvider } from './isolatedProvider.js';
108
111
  export { configInfo, DEFAULT_SERVER_CONFIG } from './config.js';
112
+ export { ApiRoute, ApiRootPath, ConfiguredPublicUrl, JoinApiRoute, NormalizeApiRootPath } from './apiRoot.js';
109
113
  export { ServerExtensionLoader, BaseServerExtension, DefaultServerExtensionServiceRegistry } from '@memberjunction/server-extensions-core';
110
114
  export * from './directives/index.js';
111
115
  export { NoLog, hasNoLogParameter, getNoLogFields } from './logging/NoLog.js';
@@ -151,6 +155,8 @@ export * from './resolvers/GenerateSeedTaxonomyResolver.js';
151
155
  export * from './resolvers/PipelineProgressResolver.js';
152
156
  export * from './resolvers/IntegrationProgressResolver.js';
153
157
  export * from './resolvers/IdentityClaimRedemptionResolver.js';
158
+ export * from './resolvers/UserAvatarResolver.js';
159
+ export * from './resolvers/avatarInputValidation.js';
154
160
  export * from './resolvers/ClientToolRequestResolver.js';
155
161
  export * from './resolvers/AutotagPipelineResolver.js';
156
162
  export * from './resolvers/TagGovernanceResolver.js';
@@ -193,6 +199,7 @@ export * from './resolvers/FileCategoryResolver.js';
193
199
  export * from './resolvers/FileResolver.js';
194
200
  export * from './rest/MediaAccessKeys.js';
195
201
  export * from './rest/MediaStreamHandler.js';
202
+ export * from './rest/RealtimeRecordingHandler.js';
196
203
  export * from './resolvers/InfoResolver.js';
197
204
  export * from './resolvers/PotentialDuplicateRecordResolver.js';
198
205
  export * from './resolvers/DuplicateEntryCheckResolver.js';
@@ -206,6 +213,9 @@ export * from './resolvers/CurrentUserContextResolver.js';
206
213
  export * from './resolvers/RSUResolver.js';
207
214
  export * from './resolvers/AgentSessionResolver.js';
208
215
  export * from './resolvers/RealtimeClientSessionResolver.js';
216
+ export * from './resolvers/RealtimeSessionEventsResolver.js';
217
+ export * from './resolvers/RealtimeSessionVerificationResolver.js';
218
+ export * from './realtimeSessions/index.js';
209
219
  export * from './resolvers/MeetingResolver.js';
210
220
  export * from './resolvers/RemoteBrowserActionResolver.js';
211
221
  export * from './agentSessions/index.js';
@@ -223,7 +233,15 @@ const localPath = (p) => {
223
233
  const resolvedPath = resolve(dirname, p);
224
234
  return resolvedPath;
225
235
  };
226
- export const CreateApp = () => express();
236
+ /**
237
+ * Creates the Express application MJServer serves on. `X-Powered-By` is disabled: it only
238
+ * advertises the framework to scanners. {@link Serve} disables it again on a host-supplied app.
239
+ */
240
+ export const CreateApp = () => {
241
+ const app = express();
242
+ app.disable('x-powered-by');
243
+ return app;
244
+ };
227
245
  /** @deprecated Use {@link CreateApp}. */
228
246
  export const createApp = CreateApp;
229
247
  /**
@@ -247,57 +265,6 @@ function resolveServerVersion() {
247
265
  }
248
266
  /** How often to re-check for conversation details left behind by finished runs. */
249
267
  const ORPHAN_DETAIL_SWEEP_INTERVAL_MS = 5 * 60_000;
250
- /** Redis channel carrying replicated push-status updates between server instances. */
251
- const PUSH_STATUS_FANOUT_CHANNEL = 'push-status-updates';
252
- /**
253
- * Replicate push-status updates across server instances over Redis (MJ #4222).
254
- *
255
- * Outbound: every locally-published update is forwarded on a shared channel. Inbound: a message
256
- * from another instance is republished onto THIS instance's local topic, where the normal
257
- * subscription filter decides who receives it — so the identity gate (`ownerUserId` vs. the
258
- * connection's authenticated user) still applies to a replicated message exactly as it does to a
259
- * local one. The replica has no say in who sees what.
260
- *
261
- * Republishing goes straight to `PubSubManager`, never back through `publishStatusUpdate`, so an
262
- * inbound message cannot be re-broadcast and loop. `SourceServerId` guards the remaining case: a
263
- * publisher also receives its own message from Redis.
264
- */
265
- async function wirePushStatusFanOut(redisProvider, startupLog) {
266
- try {
267
- await redisProvider.SubscribeToChannel(PUSH_STATUS_FANOUT_CHANNEL, (raw) => {
268
- try {
269
- const payload = ParseReplicatedStatusUpdate(raw, MJGlobal.Instance.ProcessUUID);
270
- if (!payload) {
271
- return;
272
- }
273
- // Rebuilt as a plain record: the topic's publish signature takes an index-signature type,
274
- // and listing the fields keeps the wire shape explicit at the one place it crosses hosts.
275
- PubSubManager.Instance.Publish(PUSH_STATUS_UPDATES_TOPIC, {
276
- sessionId: payload.sessionId,
277
- ownerUserId: payload.ownerUserId,
278
- message: payload.message,
279
- SourceServerId: payload.SourceServerId,
280
- });
281
- }
282
- catch (err) {
283
- // A malformed message on a shared channel must not take down the subscriber.
284
- LogError('Error processing push-status fan-out message', undefined, err);
285
- }
286
- });
287
- SetPushStatusPublishHook((payload) => {
288
- redisProvider.PublishMessage(PUSH_STATUS_FANOUT_CHANNEL, JSON.stringify(payload));
289
- });
290
- // Printed unconditionally, not verbose-gated. "Is fan-out actually on?" is the first question
291
- // anyone debugging a hung conversation behind a load balancer asks, and a silent default left
292
- // no way to answer it.
293
- console.log('[MJAPI] Push-status updates: cross-instance fan-out enabled via Redis');
294
- }
295
- catch (err) {
296
- // Single-instance delivery still works, and the durable tail query covers the rest. Degraded,
297
- // not broken — so this must not stop the server from starting.
298
- console.warn(`Push-status fan-out unavailable: ${err.message}`);
299
- }
300
- }
301
268
  /**
302
269
  * Replicate handoff-offer updates across server instances over Redis.
303
270
  *
@@ -336,6 +303,44 @@ async function wireHandoffOfferFanOut(redisProvider, startupLog) {
336
303
  console.warn(`Handoff-offer fan-out unavailable: ${err instanceof Error ? err.message : String(err)}`);
337
304
  }
338
305
  }
306
+ /** Redis channel carrying replicated realtime session events between server instances. */
307
+ const REALTIME_SESSION_EVENTS_FANOUT_CHANNEL = 'realtime-session-events';
308
+ /**
309
+ * Replicate realtime session events across server instances over Redis.
310
+ *
311
+ * Behind a load balancer the browser's WebSocket (the `RealtimeSessionEvents` subscription) lives on one
312
+ * replica while the request that raises the event — typically the public verify-link redemption — can be
313
+ * handled by another. The session-events topic is an in-process PubSub, so without this an
314
+ * `identity.verified` published on replica B never reaches the subscriber on replica A.
315
+ *
316
+ * Inbound messages are republished onto THIS instance's local topic only (never back through the
317
+ * replication hook, so there is no loop) and are still judged by the subscription filter against the
318
+ * connection's identity — a replica has no say in who sees what. The durable
319
+ * `RealtimeSessionVerificationStatus` query remains the backstop if Redis is down.
320
+ */
321
+ async function wireRealtimeSessionEventFanOut(redisProvider) {
322
+ try {
323
+ await redisProvider.SubscribeToChannel(REALTIME_SESSION_EVENTS_FANOUT_CHANNEL, (raw) => {
324
+ try {
325
+ const payload = ParseReplicatedRealtimeSessionEvent(raw, MJGlobal.Instance.ProcessUUID);
326
+ if (payload) {
327
+ RealtimeSessionEventService.Instance.PublishReplicated(payload);
328
+ }
329
+ }
330
+ catch (err) {
331
+ LogError(`Realtime session event fan-out: dropping a malformed replicated event: ${err.message}`);
332
+ }
333
+ });
334
+ RealtimeSessionEventService.Instance.SetReplicationHook((payload) => {
335
+ redisProvider.PublishMessage(REALTIME_SESSION_EVENTS_FANOUT_CHANNEL, JSON.stringify(payload));
336
+ });
337
+ console.log('[MJAPI] Realtime session events: cross-instance fan-out enabled via Redis');
338
+ }
339
+ catch (err) {
340
+ // Single-instance delivery still works and the status query covers the rest: degraded, not broken.
341
+ console.warn(`Realtime session event fan-out unavailable: ${err.message}`);
342
+ }
343
+ }
339
344
  // Bind MJStorage as the conversation-attachment blob store. The attachment service itself no longer
340
345
  // imports `@memberjunction/storage` — that dependency made it unusable from any browser or React
341
346
  // Native client, which is why the same attachment rules had been reimplemented three times.
@@ -348,6 +353,12 @@ async function wireHandoffOfferFanOut(redisProvider, startupLog) {
348
353
  GetAttachmentService().BlobStore = new MJStorageBlobStore();
349
354
  export const Serve = async (resolverPaths, app = CreateApp(), options) => {
350
355
  const t0 = performance.now();
356
+ // Name this MJAPI instance by its port before anything stamps a session row with its identity, so the janitor's
357
+ // startup recovery closes only the sessions an earlier boot of this instance left, never those of another MJAPI on
358
+ // the same host (#5309).
359
+ SetHostInstancePort(graphqlPort);
360
+ // The realtime bridge engine stamps its bridge rows with the same identity and reconciles orphans by it (#5310).
361
+ BindBridgeEngineHostInstance();
351
362
  // Level-gated startup logger. Resolves verbosity from telemetry.level (single
352
363
  // operator knob). At `standard` (default), per-phase timings are collapsed into
353
364
  // the one-line summary; at `verbose`+ each phase prints inline as before.
@@ -371,6 +382,24 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
371
382
  const setupComplete$ = new ReplaySubject(1);
372
383
  const dbType = GetDbType();
373
384
  const dataSources = [];
385
+ // Shared cache first: the database provider loads metadata and startup engines through
386
+ // it, so the first server to start fills it and later servers read it instead of each querying
387
+ // the database and broadcasting what they loaded. Subscribed before engines load so they hear
388
+ // other servers while they start.
389
+ const sharedCache = CreateSharedCacheFromEnvironment(configInfo.cacheSettings);
390
+ if (sharedCache) {
391
+ await WireSharedCacheEvents(sharedCache, () => (Metadata.Provider instanceof ProviderBase ? Metadata.Provider : undefined)); // global-provider-ok: bootstrap
392
+ // The cross-instance fan-outs ride this connection. Push-status moved into sharedCache.ts
393
+ // with the rest of the Redis wiring; the handoff and realtime-session ones stay here deliberately —
394
+ // they reach into RoomHandoffEngine and RealtimeSessionEventService, and the cache module should not
395
+ // acquire a dependency on either.
396
+ await WirePushStatusFanOut(sharedCache);
397
+ await wireHandoffOfferFanOut(sharedCache, startupLog);
398
+ await wireRealtimeSessionEventFanOut(sharedCache);
399
+ startupLog.LogIf('verbose', `Redis cache provider connected: ${process.env.REDIS_URL}`);
400
+ }
401
+ const cacheManagerConfig = CacheManagerConfigFromSettings(configInfo.cacheSettings);
402
+ const warmupLeaseMs = WarmupLeaseMsFromSettings(configInfo.cacheSettings);
374
403
  if (dbType === 'postgresql') {
375
404
  // ─── PostgreSQL Path ───────────────────────────────────────────
376
405
  startupLog.BeginPhase('Connecting to database');
@@ -422,6 +451,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
422
451
  }));
423
452
  // Set up the PostgreSQL provider
424
453
  const pgConfigData = new PostgreSQLProviderConfigData(pgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000);
454
+ pgConfigData.LocalStorageProvider = sharedCache ?? undefined;
425
455
  const provider = new PostgreSQLDataProvider();
426
456
  await provider.Config(pgConfigData);
427
457
  SetProvider(provider);
@@ -431,7 +461,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
431
461
  const sysUser = UserCache.Instance.GetSystemUser();
432
462
  const backupSysUser = UserCache.Instance.Users.find(u => u.IsActive && u.Type === 'Owner');
433
463
  const pgStartupMode = ResolveStartupMode({ configValue: configInfo.startup?.mode, defaultMode: 'full' });
434
- await StartupManagerImport.Instance.Startup(false, sysUser || backupSysUser, provider, { mode: pgStartupMode.mode });
464
+ await StartupManagerImport.Instance.Startup(false, sysUser || backupSysUser, provider, { mode: pgStartupMode.mode, cacheManagerConfig, warmupLeaseMs });
435
465
  // Both provider sources have now had their turn — config/env at module load, metadata via
436
466
  // AuthProviderEngine's startup hook — so "no providers at all" is finally a meaningful check.
437
467
  validateAuthProvidersRegistered();
@@ -561,10 +591,11 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
561
591
  }
562
592
  // cacheRefreshInterval is configured in ms; checkRefreshIntervalSeconds declares seconds — see providerConfigUnits.ts
563
593
  const config = new SQLServerProviderConfigData(pool, mj_core_schema, MetadataCacheRefreshIntervalSeconds(cacheRefreshInterval));
594
+ config.LocalStorageProvider = sharedCache ?? undefined;
564
595
  // MJAPI is a long-running server, so entry-point default is 'full' engine pre-warm;
565
596
  // MJ_STARTUP_MODE / mj.config.cjs startup.mode can override per the shared precedence chain
566
597
  const startupMode = ResolveStartupMode({ configValue: configInfo.startup?.mode, defaultMode: 'full' });
567
- await setupSQLServerClient(config, { mode: startupMode.mode });
598
+ await setupSQLServerClient(config, { mode: startupMode.mode, cacheManagerConfig, warmupLeaseMs });
568
599
  // See the note on the PostgreSQL path above: this is the first point at which both the
569
600
  // config/env providers and the metadata catalog have been registered.
570
601
  validateAuthProvidersRegistered();
@@ -677,77 +708,30 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
677
708
  tm.SetEnabled(false);
678
709
  startupLog.LogIf('verbose', 'Server telemetry disabled');
679
710
  }
680
- // Optionally inject Redis as the shared storage provider for cross-server cache invalidation
681
- if (process.env.REDIS_URL) {
682
- const redisProvider = new RedisLocalStorageProvider({
683
- url: process.env.REDIS_URL,
684
- keyPrefix: process.env.REDIS_KEY_PREFIX || 'mj',
685
- enablePubSub: true,
686
- enableLogging: configInfo.cacheSettings?.verboseLogging ?? false,
687
- });
688
- Metadata.Provider.SetLocalStorageProvider(redisProvider); // global-provider-ok: bootstrap (Redis cache wiring)
689
- await redisProvider.StartListening();
690
- // Connect Redis pub/sub events to LocalCacheManager callback dispatch
691
- // so cross-server cache invalidation messages are routed to registered callbacks
692
- redisProvider.OnCacheChanged((event) => {
693
- const sourceShort = event.SourceServerId ? event.SourceServerId.substring(0, 8) : 'unknown';
694
- console.log(`[MJAPI] Redis pub/sub → DispatchCacheChange: ${event.Action} for "${event.CacheKey}" from server ${sourceShort}`);
695
- LocalCacheManager.Instance.DispatchCacheChange(event);
696
- // Also broadcast to connected browser clients via GraphQL subscription
697
- // Extract entity name from the cache key (format: EntityName|Filter|OrderBy|...)
698
- const entityName = event.CacheKey ? event.CacheKey.split('|')[0] : '';
699
- if (entityName) {
700
- PubSubManager.Instance.Publish(CACHE_INVALIDATION_TOPIC, {
701
- entityName,
702
- primaryKeyValues: null, // entity-level invalidation
703
- action: event.Action || 'save',
704
- sourceServerId: event.SourceServerId || 'unknown',
705
- timestamp: new Date(),
706
- });
707
- }
708
- });
709
- // Fan push-status updates across server instances (MJ #4222).
710
- //
711
- // Behind a load balancer the browser's WebSocket lives on one replica while the mutation that
712
- // drives the agent can be handled by another. The push topic is an in-process PubSub, so a
713
- // completion published on replica B never reaches a subscriber on replica A — the browser waits
714
- // forever for an event that was delivered to nobody. Replicating progress and completion over
715
- // Redis closes that, and the durable tail query remains the backstop if Redis is down.
716
- await wirePushStatusFanOut(redisProvider, startupLog);
717
- await wireHandoffOfferFanOut(redisProvider, startupLog);
718
- startupLog.LogIf('verbose', `Redis cache provider connected: ${process.env.REDIS_URL}`);
719
- }
720
- // If Redis is available, swap LocalCacheManager's storage provider to Redis.
721
- // LocalCacheManager may have already been initialized (with in-memory provider)
722
- // during engine loading. SetStorageProvider migrates cached data to Redis.
723
- if (process.env.REDIS_URL) {
724
- await LocalCacheManager.Instance.SetStorageProvider(Metadata.Provider.LocalStorageProvider); // global-provider-ok: bootstrap
725
- startupLog.LogIf('verbose', 'LocalCacheManager: storage provider swapped to Redis');
726
- }
727
- // Ensure LocalCacheManager is initialized (no-op if already done during engine loading)
728
- if (!LocalCacheManager.Instance.IsInitialized) {
729
- // Build cache config from mj.config.cjs cacheSettings
730
- const cs = configInfo.cacheSettings;
731
- const cacheConfig = {
732
- maxSizeBytes: (cs.maxMemoryMB ?? 150) * 1024 * 1024,
733
- maxPercentOfCachePerEntity: cs.maxPercentOfCachePerEntity ?? 50,
734
- defaultTTLMs: (cs.defaultTTLSeconds ?? 0) * 1000,
735
- evictionSweepIntervalMs: (cs.evictionSweepIntervalSeconds ?? 300) * 1000,
736
- verboseLogging: cs.verboseLogging ?? false,
737
- };
738
- await LocalCacheManager.Instance.Initialize(Metadata.Provider.LocalStorageProvider, cacheConfig); // global-provider-ok: bootstrap
739
- if (startupLog.IsAtLeast('verbose')) {
740
- // eslint-disable-next-line no-console
741
- console.log('LocalCacheManager initialized with cache config:', JSON.stringify({
742
- maxMemoryMB: cs.maxMemoryMB ?? 150,
743
- maxPercentOfCachePerEntity: cs.maxPercentOfCachePerEntity ?? 50,
744
- evictionSweepIntervalSeconds: cs.evictionSweepIntervalSeconds ?? 300,
745
- }));
746
- }
711
+ // The database provider already initialized LocalCacheManager from inside its own Config(), with
712
+ // no settings — this call is what makes `cacheSettings` take effect (Initialize merges a config
713
+ // handed to it later). Unconditional on purpose: the guard that used to sit here
714
+ // skipped exactly the case that needed it.
715
+ await LocalCacheManager.Instance.Initialize(Metadata.Provider.LocalStorageProvider, cacheManagerConfig); // global-provider-ok: bootstrap
716
+ if (sharedCache) {
717
+ await LocalCacheManager.Instance.SetStorageProvider(sharedCache);
747
718
  }
719
+ // The derived per-entry ceiling, so the boot log says what the largest cacheable entry actually is.
720
+ startupLog.LogIf('verbose', `LocalCacheManager: largest cacheable entry ${Math.floor(LocalCacheManager.Instance.MaxEntrySizeBytes / 1024 / 1024)} MB (maxEntryPercentOfCache: ${configInfo.cacheSettings?.maxEntryPercentOfCache ?? 'auto'})`);
721
+ const engineSweepMs = StartEngineSweeper(configInfo.cacheSettings);
722
+ startupLog.LogIf('verbose', engineSweepMs > 0 ? `Engine/database sweep every ${engineSweepMs / 1000}s` : 'Engine/database sweep disabled');
723
+ const userCacheCheckMs = StartUserCacheChecks(configInfo.cacheSettings);
724
+ startupLog.LogIf('verbose', userCacheCheckMs > 0 ? `User cache staleness check every ${userCacheCheckMs / 1000}s` : 'User cache staleness check disabled');
725
+ // Costs nothing unless a metadata entity declares TrustServerCacheCompletely = false.
726
+ const metadataSweepMs = StartMetadataSweep(configInfo.cacheSettings, () => (Metadata.Provider instanceof ProviderBase ? Metadata.Provider : undefined)); // global-provider-ok: bootstrap (this process's one provider)
727
+ startupLog.LogIf('verbose', metadataSweepMs > 0 ? `Metadata/database sweep every ${metadataSweepMs / 1000}s (only for entities declaring drift)` : 'Metadata/database sweep disabled');
748
728
  // Initialize APIKeyEngine singleton — reads apiKeyGeneration from mj.config.cjs automatically
749
729
  // This must happen before any request handler calls GetAPIKeyEngine()
750
730
  GetAPIKeyEngine();
731
+ // Actions that run caller-supplied SQL (Run Ad-hoc Query) run only on the read-only login, with
732
+ // ExecuteAdhocQuery's table check and timeout limit.
733
+ ActionEngineServer.Instance.SetReadOnlyProviderFactory(() => CreateReadOnlyProvider(dataSources));
734
+ ActionEngineServer.Instance.SetAdhocSQLAuthorizer(CreateAdhocSQLAuthorizer(configInfo.databaseSettings.requestTimeout));
751
735
  setupComplete$.next(true);
752
736
  raiseEvent('setupComplete', dataSources, null, this);
753
737
  /******TEST HARNESS FOR CHANGE DETECTION */
@@ -957,7 +941,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
957
941
  const buildMs = performance.now() - tBuild;
958
942
  if (cpuProf && profSession) {
959
943
  const profile = await new Promise((res, rej) => profSession.post('Profiler.stop', (e, r) => (e ? rej(e) : res(r.profile))));
960
- const outPath = `/tmp/mjapi_schema_build_${process.pid}.cpuprofile`;
944
+ const outPath = join(mkdtempSync(join(tmpdir(), 'mjapi-schema-')), `mjapi_schema_build_${process.pid}.cpuprofile`);
961
945
  writeFileSync(outPath, JSON.stringify(profile));
962
946
  profSession.disconnect();
963
947
  // eslint-disable-next-line no-console
@@ -1101,6 +1085,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1101
1085
  const apolloServer = buildApolloServer({ schema }, { httpServer, serverCleanup }, mwApolloPlugins.length > 0 ? mwApolloPlugins : undefined);
1102
1086
  await apolloServer.start();
1103
1087
  // Fix #8: Add compression for better throughput performance
1088
+ // Never advertise the framework (`X-Powered-By: Express`) — the host may have passed its own app.
1089
+ app.disable('x-powered-by');
1104
1090
  app.use(compression({
1105
1091
  // Don't compress responses smaller than 1KB
1106
1092
  threshold: 1024,
@@ -1120,90 +1106,21 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1120
1106
  // High compression level (good balance between CPU and compression ratio)
1121
1107
  level: 6
1122
1108
  }));
1123
- // Health check endpoint - registered before auth middleware so cloud
1124
- // platform probes (Azure App Service, AWS ALB, k8s, etc.) don't
1125
- // generate noisy auth errors in the logs. CORS is enabled so browser-based
1126
- // clients (e.g. MJExplorer's connectivity poller) can read the response.
1127
- app.get('/healthcheck', cors(), (_req, res) => {
1128
- res.status(200).json({ status: 'ok' });
1129
- });
1109
+ // Health check — before every middleware contribution and the auth middleware, so cloud platform
1110
+ // probes never generate auth noise. Every core route mounts under MJAPI_BASE_PATH (see apiRoot.ts).
1111
+ MountHealthcheckRoute(app);
1130
1112
  // Apply middleware-contributed pre-auth handlers (after compression, before routes)
1131
1113
  for (const mw of mwPreAuth) {
1132
1114
  app.use(mw);
1133
1115
  }
1134
- // ─── OAuth callback routes (unauthenticated, registered BEFORE auth) ─────
1135
- const oauthPublicUrl = configInfo.publicUrl || `${configInfo.baseUrl}:${configInfo.graphqlPort}${configInfo.graphqlRootPath || ''}`;
1116
+ // ─── Public core routes (unauthenticated, registered BEFORE auth) ─────
1117
+ // OAuth callback, eSignature, media, realtime SDP broker, magic-link, widget, realtime verify — see
1118
+ // coreRoutes.ts. New custom routes belong in Server Extensions, never in serve().
1119
+ // oauthPublicUrl is the configured public URL, derived as it always was; it is also the magic-link JWT
1120
+ // issuer, so it stays untrimmed. Outward links use ApiRoute(…, { absolute: true }) instead.
1121
+ const oauthPublicUrl = ConfiguredPublicUrl();
1136
1122
  startupLog.LogIf('verbose', `[OAuth] publicUrl: ${oauthPublicUrl}`);
1137
- let oauthAuthenticatedRouter;
1138
- if (oauthPublicUrl) {
1139
- const { callbackRouter, authenticatedRouter } = createOAuthCallbackHandler({
1140
- publicUrl: oauthPublicUrl,
1141
- successRedirectUrl: `${oauthPublicUrl}/oauth/success`,
1142
- errorRedirectUrl: `${oauthPublicUrl}/oauth/error`,
1143
- // Constrains where a caller-supplied frontendReturnUrl may point (open-redirect guard).
1144
- allowedFrontendOrigins: configInfo.cors?.allowedOrigins ?? ['*']
1145
- });
1146
- oauthAuthenticatedRouter = authenticatedRouter;
1147
- const oauthCors = cors();
1148
- // OAuth callback is unauthenticated (called by external auth server)
1149
- app.use('/oauth', oauthCors, callbackRouter);
1150
- startupLog.LogIf('verbose', '[OAuth] Callback route registered at /oauth/callback');
1151
- }
1152
- // ─── Core HTTP Routes (Static Core Infrastructure) ─────────────────────────
1153
- // IMPORTANT ARCHITECTURAL NOTE:
1154
- // The route mounts below are strictly reserved for core framework infrastructure (OAuth, eSignature,
1155
- // media streaming, realtime WebRTC broker, magic-link, widgets).
1156
- // ALL new custom routes, external webhooks, vendor adapters, and application integrations MUST be
1157
- // implemented as Server Extensions (subclasses of BaseServerExtension in @memberjunction/server-extensions-core)
1158
- // mounted via ServerExtensionLoader — NEVER hardcoded as ad-hoc app.use() in serve().
1159
- // See guides/SERVER_EXTENSIONS_GUIDE.md for complete patterns and best practices.
1160
- // ─── eSignature webhook (unauthenticated, registered BEFORE auth) ─────
1161
- // Called by external signature providers (DocuSign Connect, etc.) without an MJ bearer token.
1162
- // The provider DRIVER verifies the payload signature/HMAC; MJ auth does not apply here.
1163
- app.use('/esignature', cors(), createSignatureWebhookHandler());
1164
- startupLog.LogIf('verbose', '[eSignature] Webhook route registered at /esignature/webhook/:driverKey');
1165
- // ─── Authenticated media streaming (token-gated, registered BEFORE auth) ─────
1166
- // The `?token=` query param (minted by CreateMediaAccessToken after a per-user permission
1167
- // check) is the capability — the route verifies it itself, so it does NOT use the MJ bearer
1168
- // auth middleware (an <audio>/<video> element can't send Authorization headers).
1169
- app.use('/media', cors(), createMediaStreamRouter());
1170
- startupLog.LogIf('verbose', '[Media] Streaming route registered at /media/:fileId');
1171
- // ─── Realtime WebRTC SDP broker (ticket-gated, registered BEFORE auth) ───────
1172
- if (configInfo.realtime?.enabled) {
1173
- app.use(REALTIME_SDP_EXCHANGE_PATH, cors(), createRealtimeSdpBrokerRouter());
1174
- startupLog.LogIf('verbose', `[Realtime] WebRTC SDP broker registered at ${REALTIME_SDP_EXCHANGE_PATH}`);
1175
- }
1176
- // ─── Magic-link routes (MJ-issued, app-scoped external access) ───────────
1177
- // Public router (JWKS + redeem) mounts BEFORE the auth middleware; the
1178
- // authenticated invite-creation router mounts AFTER it (see below).
1179
- let widgetAuthenticatedRouter;
1180
- let magicLinkAuthenticatedRouter;
1181
- if (configInfo.magicLink?.enabled) {
1182
- const { publicRouter, authenticatedRouter } = createMagicLinkHandler(oauthPublicUrl, configInfo.magicLink);
1183
- magicLinkAuthenticatedRouter = authenticatedRouter;
1184
- registerMagicLinkAuthProvider(oauthPublicUrl, configInfo.magicLink);
1185
- app.use(MAGIC_LINK_MOUNT_PATH, cors(), publicRouter);
1186
- startupLog.LogIf('verbose', `[MagicLink] Public routes registered at ${MAGIC_LINK_MOUNT_PATH}/redeem and ${MAGIC_LINK_MOUNT_PATH}/jwks.json`);
1187
- }
1188
- // ─── Public web widget: guest-session mint (PUBLIC, before auth mw) ───────
1189
- // Visitors hold no MJ JWT yet, so POST /widget/session is public. It reuses the
1190
- // magic-link RS256 key + `magic-link` auth provider (ensured idempotently inside
1191
- // createWidgetHandler), so it stands on its own even if magicLink.enabled is false.
1192
- if (configInfo.widget?.enabled) {
1193
- const { publicRouter: widgetRouter, authenticatedRouter: widgetAuthRouter } = createWidgetHandler(oauthPublicUrl, configInfo.widget);
1194
- widgetAuthenticatedRouter = widgetAuthRouter;
1195
- app.use(WIDGET_MOUNT_PATH, cors(), widgetRouter);
1196
- // The widget reuses the magic-link RS256 key + auth provider to validate guest
1197
- // tokens, which validates by fetching the JWKS at MAGIC_LINK_MOUNT_PATH/jwks.json.
1198
- // When magic-link itself is disabled its public router (which serves JWKS) never
1199
- // mounts, so publish the key here — otherwise every guest token fails validation
1200
- // (the auth middleware can't fetch the public key) and the widget 401s.
1201
- if (!configInfo.magicLink?.enabled) {
1202
- app.use(MAGIC_LINK_MOUNT_PATH, cors(), createMagicLinkJwksRouter());
1203
- startupLog.LogIf('verbose', `[Widget] Published reused signing key at ${MAGIC_LINK_MOUNT_PATH}/jwks.json (magic-link flow disabled)`);
1204
- }
1205
- startupLog.LogIf('verbose', `[Widget] Public routes registered at ${WIDGET_MOUNT_PATH}/session and ${WIDGET_MOUNT_PATH}/session/refresh`);
1206
- }
1123
+ const coreAuthenticatedRouters = MountPublicCoreRoutes(app, oauthPublicUrl, startupLog);
1207
1124
  // ─── Server extensions loader & shared service registry ───────────────────
1208
1125
  const extensionLoader = new ServerExtensionLoader();
1209
1126
  _currentExtensionLoader = extensionLoader;
@@ -1270,13 +1187,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1270
1187
  const mergedHostExtensions = mergeServerExtensionConfigs(telephonyExtensionConfigs, rawHostExtensions);
1271
1188
  // Open App packages publish their extensions; host mj.config.cjs overlays by DriverClass
1272
1189
  // (and remains the only source for host-only extensions such as Slack/Teams).
1273
- // extraReservedRoots is derived from the mounts registered above plus graphqlRootPath
1274
- // so a new pre-auth app.use(...) in serve() must also be added to
1275
- // coreReservedServerExtensionRoots() — otherwise an Open App can claim it.
1190
+ // Every RootPath is relative to MJAPI_BASE_PATH: apiRootPath composes the real mount path, and
1191
+ // extraReservedRoots (also relative) must list every core mount in coreRoutes.ts, otherwise an
1192
+ // Open App can claim it.
1276
1193
  const extensionConfigs = prepareServerExtensionConfigs(mergeServerExtensionConfigs(options?.serverExtensions ?? [], mergedHostExtensions), {
1277
1194
  onInvalid: (message) => LogError(message),
1278
1195
  onOverlap: (message) => LogStatus(message),
1279
- extraReservedRoots: coreReservedServerExtensionRoots(graphqlRootPath),
1196
+ extraReservedRoots: CoreReservedServerExtensionRoots(),
1197
+ apiRootPath: ApiRootPath(),
1280
1198
  });
1281
1199
  for (const cfg of extensionConfigs) {
1282
1200
  LogStatus(`Server extension ${describeServerExtensionMount(cfg)}`);
@@ -1285,28 +1203,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1285
1203
  // Without this, the browser blocks 401 responses from the auth middleware
1286
1204
  // because they lack Access-Control-Allow-Origin headers, preventing the
1287
1205
  // client from reading the error code and triggering token refresh.
1288
- const corsAllowed = configInfo.cors?.allowedOrigins ?? ['*'];
1289
- const corsWildcard = corsAllowed.includes('*');
1290
- // SECURITY: never combine credentials with a wildcard/reflect-any-origin policy. When
1291
- // allowedOrigins is ['*'] the origin callback reflects the caller's Origin, and pairing that
1292
- // with Access-Control-Allow-Credentials: true lets any site a signed-in user visits make
1293
- // credentialed cross-origin reads. MJ's primary auth is a Bearer token (not auto-sent
1294
- // cross-origin), so dropping credentials under the wildcard default is safe; deployments that
1295
- // genuinely need credentialed CORS must configure an explicit allowedOrigins list.
1296
- app.use(cors({
1297
- origin: (origin, callback) => {
1298
- // Allow all origins when ['*'] (default/backward-compatible),
1299
- // or when no Origin header (server-to-server calls).
1300
- if (corsWildcard || !origin || corsAllowed.includes(origin)) {
1301
- callback(null, true);
1302
- }
1303
- else {
1304
- callback(new Error(`Origin ${origin} not allowed by CORS`));
1305
- }
1306
- },
1307
- credentials: corsWildcard ? false : (configInfo.cors?.allowCredentials ?? true),
1308
- maxAge: configInfo.cors?.maxAge ?? 86400,
1309
- }));
1206
+ // Extensions that declare `OwnsCORS: true` (ServerExtensionConfig) are exempt: the global
1207
+ // middleware skips their RootPaths so it neither reflects an origin onto their responses nor
1208
+ // answers their preflights — the extension's own OPTIONS handling and origin policy run instead.
1209
+ const corsOwnedExtensionRoots = GetCorsOwningServerExtensionRoots(extensionConfigs);
1210
+ if (corsOwnedExtensionRoots.length > 0) {
1211
+ LogStatus(`Global CORS skips extension-owned roots: ${corsOwnedExtensionRoots.join(', ')}`);
1212
+ }
1213
+ app.use(CreateGlobalCorsMiddleware(configInfo.cors, corsOwnedExtensionRoots));
1310
1214
  // ─── Pre-auth server extensions (before auth — extensions handle their own auth) ─────
1311
1215
  // Slack uses HMAC signature verification, Teams uses Bot Framework JWT validation.
1312
1216
  // These must be registered before the unified auth middleware so webhook
@@ -1316,21 +1220,11 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1316
1220
  phase: 'pre-auth',
1317
1221
  httpServer,
1318
1222
  publicUrl: oauthPublicUrl,
1223
+ apiRootPath: ApiRootPath(),
1319
1224
  });
1320
1225
  }
1321
- // Extension health endpoint (always available, returns empty array if no extensions)
1322
- app.get('/health/extensions', async (_req, res) => {
1323
- const results = await extensionLoader.HealthCheckAll();
1324
- const allHealthy = results.length === 0 || results.every(r => r.Healthy);
1325
- res.status(allHealthy ? 200 : 503).json({ extensions: results });
1326
- });
1327
- // ─── Public authentication-provider catalog (PUBLIC, before auth mw) ──────
1328
- // The browser needs the provider list BEFORE it holds a token, so this is necessarily
1329
- // unauthenticated and must mount ahead of the auth middleware. It publishes only the
1330
- // non-secret allow-list (see AuthProviderEngine.GetPublicCatalog) — the same values a
1331
- // single-provider SPA already compiled into its bundle.
1332
- app.use(AUTH_CATALOG_MOUNT_PATH, cors(), createAuthProviderCatalogRouter());
1333
- startupLog.LogIf('verbose', `[Auth] Public provider catalog registered at ${AUTH_CATALOG_MOUNT_PATH}/providers`);
1226
+ MountExtensionHealthRoute(app, extensionLoader);
1227
+ MountAuthCatalogRoute(app, startupLog);
1334
1228
  // ─── Unified auth middleware (replaces both REST authMiddleware and contextFunction auth) ─────
1335
1229
  app.use(CreateUnifiedAuthMiddleware(dataSources));
1336
1230
  // ─── Post-auth middleware from BaseServerMiddleware plugins ─────
@@ -1340,23 +1234,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1340
1234
  for (const mw of mwPostAuth) {
1341
1235
  app.use(mw);
1342
1236
  }
1343
- // ─── OAuth authenticated routes (auth already handled by unified middleware) ─────
1344
- if (oauthAuthenticatedRouter) {
1345
- const oauthCors = cors();
1346
- app.use('/oauth', oauthCors, BodyParser.json(), oauthAuthenticatedRouter);
1347
- startupLog.LogIf('verbose', '[OAuth] Authenticated routes registered at /oauth/status, /oauth/initiate, and /oauth/exchange');
1348
- }
1349
- // ─── Magic-link authenticated route (invite creation) ─────────────────────
1350
- if (magicLinkAuthenticatedRouter) {
1351
- app.use(MAGIC_LINK_MOUNT_PATH, cors(), magicLinkAuthenticatedRouter);
1352
- startupLog.LogIf('verbose', `[MagicLink] Authenticated route registered at ${MAGIC_LINK_MOUNT_PATH}/create`);
1353
- }
1354
- // ─── Widget authenticated route (RV4 resolve-identity) ────────────────────
1355
- // Mounts after the unified auth middleware so a verified visitor (post magic-link upgrade) can
1356
- // promote their anonymous returning-visitor trail to the verified record.
1357
- if (widgetAuthenticatedRouter) {
1358
- app.use(WIDGET_MOUNT_PATH, cors(), widgetAuthenticatedRouter);
1359
- startupLog.LogIf('verbose', `[Widget] Authenticated route registered at ${WIDGET_MOUNT_PATH}/resolve-identity`);
1237
+ // ─── Authenticated core routes: OAuth status/initiate/exchange, magic-link create, widget resolve-identity ─────
1238
+ MountAuthenticatedCoreRoutes(app, coreAuthenticatedRouters, startupLog);
1239
+ // ─── Realtime recording shards + terminal signal (authenticated, owner-gated) ─────
1240
+ // The browser uploads a client-direct call's recording as Opus shards and a keepalive terminal request;
1241
+ // assembly runs off the request path on the scheduler. Needs a SQL provider: the ledger calls procs.
1242
+ if (configInfo.realtime?.enabled) {
1243
+ if (mountRealtimeRecordingRoutes(app)) {
1244
+ startupLog.LogIf('verbose', `[Realtime] Recording routes registered at ${ApiRoute(REALTIME_RECORDING_MOUNT_PATH)}/:agentSessionId/shard/:index and /end`);
1245
+ }
1360
1246
  }
1361
1247
  // ─── Post-auth server extensions ──────────────────────────────────────────
1362
1248
  // Extensions declaring Phase: 'post-auth' mount after the unified auth middleware
@@ -1366,14 +1252,22 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1366
1252
  phase: 'post-auth',
1367
1253
  httpServer,
1368
1254
  publicUrl: oauthPublicUrl,
1255
+ apiRootPath: ApiRootPath(),
1369
1256
  });
1370
1257
  }
1258
+ // Every extension has now had its chance at the request: a preflight under an extension-owned
1259
+ // root that none of them answered is refused here, instead of falling through to the GraphQL
1260
+ // mount's cors(), which would approve it for every origin.
1261
+ if (corsOwnedExtensionRoots.length > 0) {
1262
+ app.use(CreateExtensionOwnedPreflightFallback(corsOwnedExtensionRoots));
1263
+ }
1371
1264
  // ─── Cross-extension lifecycle hook: OnAllExtensionsMounted ───────────────
1372
1265
  // Called after all extensions across both pre-auth and post-auth phases are mounted.
1373
1266
  // Extensions can wire themselves to services registered by other extensions or core.
1374
1267
  await extensionLoader.NotifyAllExtensionsMounted({
1375
1268
  httpServer,
1376
1269
  publicUrl: oauthPublicUrl,
1270
+ apiRootPath: ApiRootPath(),
1377
1271
  });
1378
1272
  // Install the single path-routing WebSocket-upgrade dispatcher AFTER all extensions across both
1379
1273
  // pre-auth and post-auth phases have mounted and registered their media WSS routes. ws 8.x has each
@@ -1505,12 +1399,16 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1505
1399
  Shutdown: () => { clearInterval(orphanDetailTimer); },
1506
1400
  });
1507
1401
  }
1508
- // Launch the AI Agent Session janitor: run own-host orphan recovery once at boot, then keep a
1509
- // periodic staleness sweep running. Self-registers with ShutdownRegistry, so its timer is cleared
1510
- // by the gracefulShutdown drain below (no explicit Stop() wiring needed here).
1402
+ // Launch the AI Agent Session janitor: run own-host orphan recovery once at boot, then a periodic tick
1403
+ // that closes stale and over-deadline sessions and rebuilds lost realtime recordings from their
1404
+ // crash-recovery shards (storage reads and writes). Self-registers with ShutdownRegistry, so its timer
1405
+ // is cleared by the gracefulShutdown drain below (no explicit Stop() wiring needed here).
1511
1406
  if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — boot-time session janitor uses the server's own provider
1512
1407
  SessionJanitor.Instance.Start(Metadata.Provider, resumeUser) // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
1513
1408
  .catch(err => console.warn(`[SessionJanitor] Startup failed: ${err}`));
1409
+ // The bridge engine's orphan reconcile likewise starts only now that this process holds its port, so it can't
1410
+ // take the live bridges of another MJAPI still serving that port for its own orphans (#5310).
1411
+ StartBridgeOrphanReconciliation(Metadata.Provider, resumeUser); // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
1514
1412
  }
1515
1413
  // Launch the durable task-graph dispatcher: claim Pending tasks, execute them with a fresh
1516
1414
  // provider each, and reconcile claims orphaned by a crash. Without this nothing ever picks up a
@@ -1997,4 +1895,47 @@ function createMSSQLCompatPool(pgPool) {
1997
1895
  };
1998
1896
  return wrapper;
1999
1897
  }
1898
+ // Defined below serve() on purpose: serverExtensionReservedRoots.test.ts treats every app.use() that appears
1899
+ // textually before the unified auth middleware as a pre-auth mount, and these routes are mounted post-auth.
1900
+ /**
1901
+ * Mounts the realtime recording shard/terminal routes (post-auth) and starts the assembly scheduler they
1902
+ * hand work to. Skipped, with a warning, when the server's provider is not a SQL provider (the ledger calls
1903
+ * stored procedures). Without a system user the routes still store shards, and the janitor assembles them.
1904
+ * Returns whether the routes were mounted.
1905
+ */
1906
+ function mountRealtimeRecordingRoutes(app) {
1907
+ const provider = Metadata.Provider; // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet; the ledger's procs run as the server's SQL login either way
1908
+ if (!(provider instanceof DatabaseProviderBase)) {
1909
+ console.warn('[Realtime] Recording routes not mounted: the server provider is not a DatabaseProviderBase');
1910
+ return false;
1911
+ }
1912
+ const graceMs = () => configInfo.realtime.recordingAssemblyGraceSeconds * 1000;
1913
+ const systemUser = UserCache.Instance.GetSystemUser();
1914
+ if (systemUser) {
1915
+ RecordingAssemblyScheduler.Instance.Start({ Provider: provider, SystemUser: systemUser, GraceMs: graceMs });
1916
+ }
1917
+ else {
1918
+ LogError('[Realtime] Recording assembly scheduler not started: no system user; the session janitor assembles recordings instead');
1919
+ }
1920
+ app.use(ApiRoute(REALTIME_RECORDING_MOUNT_PATH), cors(), CreateRealtimeRecordingRouter({
1921
+ ResolveCaller: req => {
1922
+ const user = req.userPayload?.userRecord;
1923
+ return user ? { ContextUser: user, Provider: provider } : null;
1924
+ },
1925
+ LoadOwnedSession: LoadOwnedRealtimeSession,
1926
+ LoadConversationExternalID: LoadSessionConversationExternalID,
1927
+ CreateLedger: (ledgerProvider, contextUser) => new SqlRealtimeRecordingLedger(ledgerProvider, contextUser),
1928
+ Scheduler: RecordingAssemblyScheduler.Instance,
1929
+ GraceMs: graceMs,
1930
+ SystemUser: () => UserCache.Instance.GetSystemUser() ?? null,
1931
+ }));
1932
+ return true;
1933
+ }
1934
+ // Public-edge building blocks for Open Apps that run their own pre-auth edge and mint
1935
+ // scope-limited guest sessions (e.g. a ballot edge: verify a credential, then mint a short-lived
1936
+ // session scoped to one resource). They are the same pieces WidgetSessionService uses; a generic
1937
+ // public-widget session mint remains the long-term replacement.
1938
+ export { BuildSessionClaims, MagicLinkKeyManager, MagicLinkService, HashToken, GenerateRawToken } from './auth/magicLink/index.js';
1939
+ export { VerifyHostAssertion } from './realtimeWidget/host-identity.js';
1940
+ export { IsScopeLimitedPrincipal } from './auth/scopeLimitedPrincipal.js';
2000
1941
  //# sourceMappingURL=index.js.map