@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
@@ -0,0 +1,129 @@
1
+ /**
2
+ * @fileoverview Checks the run ids a realtime session keeps in its `Config` before server code
3
+ * acts on them.
4
+ *
5
+ * @module @memberjunction/server
6
+ */
7
+ import { LogError, RunView } from '@memberjunction/core';
8
+ import { EscapeSQLString, IsValidUUID, UUIDsEqual } from '@memberjunction/global';
9
+ import { UserCache } from '@memberjunction/generic-database-provider';
10
+ const AGENT_RUN_ENTITY = 'MJ: AI Agent Runs';
11
+ const AGENT_RUN_STEP_ENTITY = 'MJ: AI Agent Run Steps';
12
+ /**
13
+ * Keeps the run ids from a session's `Config` that are records of that session.
14
+ *
15
+ * The session owner can edit `Config`, so its run ids are claims. A run id is kept when it is the
16
+ * UUID of an `MJ: AI Agent Runs` row whose `AgentSessionID` is the session. The step id and the
17
+ * prompt run id are kept when they belong to that co-agent run: the step's `AgentRunID` is the
18
+ * co-agent run, and the prompt run is the `TargetLogID` of one of its `Prompt` steps.
19
+ *
20
+ * The lookups run as the system user when one is cached, else as the acting user. They are pinned
21
+ * to the session's id and return nothing to the caller, and row-level security can hide a session's
22
+ * own runs from its owner (a web-widget guest's delegated runs carry no `ConversationID`, which the
23
+ * guest's run filter keys on).
24
+ *
25
+ * Each call reads the database again (`BypassCache`) and keeps no result, because the links can
26
+ * change after a lookup: a run's `AgentSessionID` and a step's `AgentRunID` and `TargetLogID` are
27
+ * updatable.
28
+ */
29
+ export class SessionRunIDVerifier {
30
+ /**
31
+ * Returns the subset of `claimed` that belongs to the session now. Never throws: when a lookup
32
+ * fails, nothing is kept.
33
+ *
34
+ * @param sessionID The `MJ: AI Agent Sessions` id the claims were read from. The caller must have
35
+ * checked that the session is the caller's own.
36
+ * @param claimed The run ids read from the session's `Config`.
37
+ * @param contextUser The acting user; the lookups run as it only when no system user is cached.
38
+ * @param provider The request-scoped metadata provider.
39
+ * @returns The claims that are records of the session.
40
+ */
41
+ async Verify(sessionID, claimed, contextUser, provider) {
42
+ const candidates = this.keepUUIDs(claimed);
43
+ if (!candidates.CoAgentRunID && !candidates.PendingFeedbackRunID) {
44
+ return {};
45
+ }
46
+ return (await this.lookUpOwned(sessionID.trim(), candidates, contextUser, provider)) ?? {};
47
+ }
48
+ /** Drops every claim that is not a UUID. The prompt run and step need a co-agent run to hang off. */
49
+ keepUUIDs(claimed) {
50
+ const coAgentRunID = this.uuidOrUndefined(claimed.CoAgentRunID);
51
+ return {
52
+ CoAgentRunID: coAgentRunID,
53
+ PromptRunID: coAgentRunID ? this.uuidOrUndefined(claimed.PromptRunID) : undefined,
54
+ CoAgentRunStepID: coAgentRunID ? this.uuidOrUndefined(claimed.CoAgentRunStepID) : undefined,
55
+ PendingFeedbackRunID: this.uuidOrUndefined(claimed.PendingFeedbackRunID),
56
+ };
57
+ }
58
+ uuidOrUndefined(value) {
59
+ return value && IsValidUUID(value) ? value.trim() : undefined;
60
+ }
61
+ /** Runs the lookups; `null` when one of them fails. */
62
+ async lookUpOwned(sessionID, candidates, contextUser, provider) {
63
+ const stepsQuery = this.stepsQuery(candidates);
64
+ const queries = stepsQuery ? [this.runsQuery(sessionID, candidates), stepsQuery] : [this.runsQuery(sessionID, candidates)];
65
+ try {
66
+ const lookupUser = UserCache.Instance.GetSystemUser() ?? contextUser;
67
+ const [runs, steps] = await RunView.FromMetadataProvider(provider).RunViews(queries, lookupUser);
68
+ const failed = [runs, steps].find((result) => result && !result.Success);
69
+ if (!runs || failed) {
70
+ LogError(`SessionRunIDVerifier: run lookup failed for session ${sessionID}: ${failed?.ErrorMessage ?? 'no result'}`);
71
+ return null;
72
+ }
73
+ return this.pickOwned(candidates, runs.Results, steps?.Results ?? []);
74
+ }
75
+ catch (error) {
76
+ LogError(`SessionRunIDVerifier: run lookup failed for session ${sessionID}: ${error instanceof Error ? error.message : String(error)}`);
77
+ return null;
78
+ }
79
+ }
80
+ /** The claimed runs that carry this session's id. */
81
+ runsQuery(sessionID, candidates) {
82
+ const ids = [candidates.CoAgentRunID, candidates.PendingFeedbackRunID]
83
+ .filter((id) => !!id)
84
+ .map((id) => `'${EscapeSQLString(id)}'`);
85
+ return {
86
+ EntityName: AGENT_RUN_ENTITY,
87
+ ExtraFilter: `AgentSessionID='${EscapeSQLString(sessionID)}' AND ID IN (${ids.join(', ')})`,
88
+ Fields: ['ID'],
89
+ ResultType: 'simple',
90
+ BypassCache: true,
91
+ };
92
+ }
93
+ /** The claimed co-agent run's steps that match the claimed step or prompt run; `null` when neither is claimed. */
94
+ stepsQuery(candidates) {
95
+ const matches = [];
96
+ if (candidates.CoAgentRunStepID) {
97
+ matches.push(`ID='${EscapeSQLString(candidates.CoAgentRunStepID)}'`);
98
+ }
99
+ if (candidates.PromptRunID) {
100
+ matches.push(`TargetLogID='${EscapeSQLString(candidates.PromptRunID)}'`);
101
+ }
102
+ if (!candidates.CoAgentRunID || matches.length === 0) {
103
+ return null;
104
+ }
105
+ return {
106
+ EntityName: AGENT_RUN_STEP_ENTITY,
107
+ ExtraFilter: `AgentRunID='${EscapeSQLString(candidates.CoAgentRunID)}' AND (${matches.join(' OR ')})`,
108
+ Fields: ['ID', 'StepType', 'TargetLogID'],
109
+ ResultType: 'simple',
110
+ BypassCache: true,
111
+ };
112
+ }
113
+ pickOwned(candidates, runs, steps) {
114
+ const isOwnedRun = (id) => !!id && runs.some((row) => UUIDsEqual(row.ID, id));
115
+ const coAgentRunID = isOwnedRun(candidates.CoAgentRunID) ? candidates.CoAgentRunID : undefined;
116
+ const ownedSteps = coAgentRunID ? steps : [];
117
+ const stepID = candidates.CoAgentRunStepID;
118
+ const promptRunID = candidates.PromptRunID;
119
+ return {
120
+ CoAgentRunID: coAgentRunID,
121
+ CoAgentRunStepID: stepID && ownedSteps.some((row) => UUIDsEqual(row.ID, stepID)) ? stepID : undefined,
122
+ PromptRunID: promptRunID && ownedSteps.some((row) => row.StepType === 'Prompt' && UUIDsEqual(row.TargetLogID, promptRunID))
123
+ ? promptRunID
124
+ : undefined,
125
+ PendingFeedbackRunID: isOwnedRun(candidates.PendingFeedbackRunID) ? candidates.PendingFeedbackRunID : undefined,
126
+ };
127
+ }
128
+ }
129
+ //# sourceMappingURL=SessionRunIDVerifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionRunIDVerifier.js","sourceRoot":"","sources":["../../src/agentSessions/SessionRunIDVerifier.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  export * from './remoteBrowserGoalEngine.js';
2
2
  export * from './HostInstance.js';
3
+ export * from './BridgeHostInstance.js';
3
4
  export * from './SessionManager.js';
4
5
  export * from './SessionJanitor.js';
6
+ export * from './SessionRunIDVerifier.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agentSessions/index.ts"],"names":[],"mappings":"AA8BA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agentSessions/index.ts"],"names":[],"mappings":"AAmCA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC"}
@@ -2,12 +2,14 @@
2
2
  * @fileoverview AI Agent Session lifecycle substrate (server-side, record + janitor layer).
3
3
  *
4
4
  * Exposes the session-record lifecycle manager, the orphan-reconciliation janitor, and the
5
- * per-process host identity helpers. The audio/media (WebRTC) transport and the long-lived
6
- * realtime agent run are deliberately **not** part of this layer — they arrive in P5.
5
+ * host-instance identity (`hostname:port:pid:bootId`) the janitor matches sessions by, which the
6
+ * realtime bridge engine is given for its bridge rows too (`BindBridgeEngineHostInstance`). The
7
+ * audio/media (WebRTC) transport and the long-lived realtime agent run are deliberately **not**
8
+ * part of this layer — they arrive in P5.
7
9
  *
8
10
  * @module @memberjunction/server
9
11
  */
10
- import { LoadWhiteboardChannelServer, LoadMeetingControlsChannelServer, LoadMediaChannelServer, LoadClientContextChannelServer } from '@memberjunction/ai-agents';
12
+ import { LoadWhiteboardChannelServer, LoadMeetingControlsChannelServer, LoadMediaChannelServer, LoadClientContextChannelServer, LoadClientOnlyChannelServer, LoadIdentityVerificationChannelServer, LoadInteractiveComponentChannelServer } from '@memberjunction/ai-agents';
11
13
  import { LoadRemoteBrowserChannel } from '@memberjunction/remote-browser-server';
12
14
  import { LoadSelfHostRemoteBrowser } from '@memberjunction/remote-browser-selfhost';
13
15
  import { BindRemoteBrowserGoalEngine } from './remoteBrowserGoalEngine.js';
@@ -18,6 +20,9 @@ LoadWhiteboardChannelServer();
18
20
  LoadMeetingControlsChannelServer();
19
21
  LoadMediaChannelServer();
20
22
  LoadClientContextChannelServer();
23
+ LoadClientOnlyChannelServer();
24
+ LoadIdentityVerificationChannelServer();
25
+ LoadInteractiveComponentChannelServer();
21
26
  // Remote Browser native channel (client-direct): the lifecycle-only server channel plugin + the
22
27
  // Self-Hosted Chrome backend driver (whose default runner launches a local headless Chromium via
23
28
  // Playwright — pulled in transitively through the SelfHost package, documented and acceptable).
@@ -28,6 +33,8 @@ LoadSelfHostRemoteBrowser();
28
33
  BindRemoteBrowserGoalEngine();
29
34
  export * from './remoteBrowserGoalEngine.js';
30
35
  export * from './HostInstance.js';
36
+ export * from './BridgeHostInstance.js';
31
37
  export * from './SessionManager.js';
32
38
  export * from './SessionJanitor.js';
39
+ export * from './SessionRunIDVerifier.js';
33
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agentSessions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,2BAA2B,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAClK,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAE3E,8EAA8E;AAC9E,gGAAgG;AAChG,6FAA6F;AAC7F,2BAA2B,EAAE,CAAC;AAC9B,gCAAgC,EAAE,CAAC;AACnC,sBAAsB,EAAE,CAAC;AACzB,8BAA8B,EAAE,CAAC;AACjC,gGAAgG;AAChG,iGAAiG;AACjG,gGAAgG;AAChG,wBAAwB,EAAE,CAAC;AAC3B,yBAAyB,EAAE,CAAC;AAC5B,wGAAwG;AACxG,wGAAwG;AACxG,2BAA2B,EAAE,CAAC;AAE9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agentSessions/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,2BAA2B,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,qCAAqC,EAAE,qCAAqC,EAAE,MAAM,2BAA2B,CAAC;AAC7Q,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAE3E,8EAA8E;AAC9E,gGAAgG;AAChG,6FAA6F;AAC7F,2BAA2B,EAAE,CAAC;AAC9B,gCAAgC,EAAE,CAAC;AACnC,sBAAsB,EAAE,CAAC;AACzB,8BAA8B,EAAE,CAAC;AACjC,2BAA2B,EAAE,CAAC;AAC9B,qCAAqC,EAAE,CAAC;AACxC,qCAAqC,EAAE,CAAC;AACxC,gGAAgG;AAChG,iGAAiG;AACjG,gGAAgG;AAChG,wBAAwB,EAAE,CAAC;AAC3B,yBAAyB,EAAE,CAAC;AAC5B,wGAAwG;AACxG,wGAAwG;AACxG,2BAA2B,EAAE,CAAC;AAE9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,32 @@
1
+ /** Options for {@link ApiRoute}. */
2
+ export interface ApiRouteOptions {
3
+ /** Return the public absolute URL (`MJAPI_PUBLIC_URL` + subpath) instead of the server mount path. */
4
+ absolute?: boolean;
5
+ }
6
+ /**
7
+ * Normalizes a base-path value to a prefix with no trailing slash: `''` for `/`, `'/api'` for `/api/` or
8
+ * `/api`. Throws on a value that does not start with `/`, since Express would mount it nowhere.
9
+ */
10
+ export declare function NormalizeApiRootPath(rootPath: string | undefined): string;
11
+ /** Joins a base path and a subpath relative to it. Pure, so tests can drive any base path. */
12
+ export declare function JoinApiRoute(apiRootPath: string, subpath: string): string;
13
+ /** The running server's base path (`MJAPI_BASE_PATH`, no trailing slash; `''` at `/`). */
14
+ export declare function ApiRootPath(): string;
15
+ /**
16
+ * The server's configured public URL, derived exactly as it always has been: `MJAPI_PUBLIC_URL`, else
17
+ * `baseUrl:graphqlPort` + `graphqlRootPath`. Unchanged and untrimmed on purpose: it is the magic-link JWT
18
+ * issuer and the `publicUrl` handed to OAuth and server extensions, and changing it would invalidate issued
19
+ * tokens. Build URLs with `ApiRoute(subpath, { absolute: true })`, not from this.
20
+ */
21
+ export declare function ConfiguredPublicUrl(): string;
22
+ /**
23
+ * The path (or, with `{ absolute: true }`, the public URL) of a route under MJAPI's base path.
24
+ *
25
+ * `subpath` is relative to the base path and must start with `/`.
26
+ * - `ApiRoute('/media')` → `/media` at base `/`, `/api/media` at `MJAPI_BASE_PATH=/api`.
27
+ * - `ApiRoute('/media/abc', { absolute: true })` → `${MJAPI_PUBLIC_URL}/media/abc`. `MJAPI_PUBLIC_URL` is
28
+ * wherever the world reaches MJAPI (prefix included), so the base path is never added to it. Without it,
29
+ * the local fallback is `baseUrl:graphqlPort` + the base path.
30
+ */
31
+ export declare function ApiRoute(subpath: string, options?: ApiRouteOptions): string;
32
+ //# sourceMappingURL=apiRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiRoot.d.ts","sourceRoot":"","sources":["../src/apiRoot.ts"],"names":[],"mappings":"AAgBA,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC5B,sGAAsG;IACtG,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMzE;AAQD,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED,0FAA0F;AAC1F,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAO3E"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * MJAPI's base path: the single prefix every route MJAPI serves is mounted under (MJ #5674).
3
+ *
4
+ * MJAPI does not know where a proxy exposes it. Behind a proxy that forwards a prefix WITHOUT stripping it
5
+ * (CloudFront `/api/*` → MJAPI), MJAPI must listen under that prefix, so the host sets
6
+ * `MJAPI_BASE_PATH=/api`. Behind a stripping proxy, or with no proxy, it stays `/`. Every mount and every
7
+ * URL handed to a browser, an email or a webhook provider goes through {@link ApiRoute}, so one setting moves
8
+ * them all. CI enforces this (`check:api-root` and `__tests__/apiRootBoot.test.ts`).
9
+ *
10
+ * `GRAPHQL_ROOT_PATH` is a separate thing: only where Apollo listens. Do not derive routes from it.
11
+ *
12
+ * At the default base path `/` every value here is byte-identical to the root-mounted paths MJAPI always used.
13
+ */
14
+ import { TrimTrailingSlashes } from '@memberjunction/global';
15
+ import { configInfo } from './config.js';
16
+ /**
17
+ * Normalizes a base-path value to a prefix with no trailing slash: `''` for `/`, `'/api'` for `/api/` or
18
+ * `/api`. Throws on a value that does not start with `/`, since Express would mount it nowhere.
19
+ */
20
+ export function NormalizeApiRootPath(rootPath) {
21
+ const trimmed = (rootPath ?? '').trim();
22
+ if (trimmed && !trimmed.startsWith('/')) {
23
+ throw new Error(`MJAPI_BASE_PATH must start with '/', got '${trimmed}'`);
24
+ }
25
+ return TrimTrailingSlashes(trimmed);
26
+ }
27
+ function assertSubpath(subpath) {
28
+ if (typeof subpath !== 'string' || !subpath.startsWith('/')) {
29
+ throw new Error(`ApiRoute subpath must start with '/', got '${String(subpath)}'`);
30
+ }
31
+ }
32
+ /** Joins a base path and a subpath relative to it. Pure, so tests can drive any base path. */
33
+ export function JoinApiRoute(apiRootPath, subpath) {
34
+ assertSubpath(subpath);
35
+ return `${NormalizeApiRootPath(apiRootPath)}${subpath}`;
36
+ }
37
+ /** The running server's base path (`MJAPI_BASE_PATH`, no trailing slash; `''` at `/`). */
38
+ export function ApiRootPath() {
39
+ return NormalizeApiRootPath(configInfo.apiBasePath);
40
+ }
41
+ /**
42
+ * The server's configured public URL, derived exactly as it always has been: `MJAPI_PUBLIC_URL`, else
43
+ * `baseUrl:graphqlPort` + `graphqlRootPath`. Unchanged and untrimmed on purpose: it is the magic-link JWT
44
+ * issuer and the `publicUrl` handed to OAuth and server extensions, and changing it would invalidate issued
45
+ * tokens. Build URLs with `ApiRoute(subpath, { absolute: true })`, not from this.
46
+ */
47
+ export function ConfiguredPublicUrl() {
48
+ return configInfo.publicUrl || `${configInfo.baseUrl}:${configInfo.graphqlPort}${configInfo.graphqlRootPath || ''}`;
49
+ }
50
+ /**
51
+ * The path (or, with `{ absolute: true }`, the public URL) of a route under MJAPI's base path.
52
+ *
53
+ * `subpath` is relative to the base path and must start with `/`.
54
+ * - `ApiRoute('/media')` → `/media` at base `/`, `/api/media` at `MJAPI_BASE_PATH=/api`.
55
+ * - `ApiRoute('/media/abc', { absolute: true })` → `${MJAPI_PUBLIC_URL}/media/abc`. `MJAPI_PUBLIC_URL` is
56
+ * wherever the world reaches MJAPI (prefix included), so the base path is never added to it. Without it,
57
+ * the local fallback is `baseUrl:graphqlPort` + the base path.
58
+ */
59
+ export function ApiRoute(subpath, options) {
60
+ if (!options?.absolute) {
61
+ return JoinApiRoute(ApiRootPath(), subpath);
62
+ }
63
+ assertSubpath(subpath);
64
+ const base = configInfo.publicUrl || `${configInfo.baseUrl}:${configInfo.graphqlPort}${ApiRootPath()}`;
65
+ return `${TrimTrailingSlashes(base)}${subpath}`;
66
+ }
67
+ //# sourceMappingURL=apiRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiRoot.js","sourceRoot":"","sources":["../src/apiRoot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAA4B;IAC7D,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,6CAA6C,OAAO,GAAG,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IAClC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,8CAA8C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtF,CAAC;AACL,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,OAAe;IAC7D,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,GAAG,oBAAoB,CAAC,WAAW,CAAC,GAAG,OAAO,EAAE,CAAC;AAC5D,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,WAAW;IACvB,OAAO,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB;IAC/B,OAAO,UAAU,CAAC,SAAS,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;AACxH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,OAAyB;IAC/D,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,aAAa,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,WAAW,GAAG,WAAW,EAAE,EAAE,CAAC;IACvG,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC;AACpD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProviderCatalogRouter.d.ts","sourceRoot":"","sources":["../../src/auth/AuthProviderCatalogRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAK9D,gDAAgD;AAChD,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAiB/C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAyBxD;AAED,+DAA+D;AAC/D,wBAAgB,+BAA+B,IAAI,MAAM,CAExD"}
1
+ {"version":3,"file":"AuthProviderCatalogRouter.d.ts","sourceRoot":"","sources":["../../src/auth/AuthProviderCatalogRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAM9D,gDAAgD;AAChD,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAiB/C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,+BAA+B,IAAI,MAAM,CAkDxD;AAED,+DAA+D;AAC/D,wBAAgB,+BAA+B,IAAI,MAAM,CAExD"}
@@ -11,6 +11,7 @@ import { Router } from 'express';
11
11
  import { rateLimit } from 'express-rate-limit';
12
12
  import { LogError } from '@memberjunction/core';
13
13
  import { AuthProviderEngine } from './AuthProviderEngine.js';
14
+ import { EMPTY_PUBLIC_LOGIN_SCREEN, LoginScreenEngine } from './LoginScreenEngine.js';
14
15
  /** Mount path for the public catalog router. */
15
16
  export const AUTH_CATALOG_MOUNT_PATH = '/auth';
16
17
  /** Requests per window per IP. Generous — a browser makes one call per page load. */
@@ -64,6 +65,30 @@ export function CreateAuthProviderCatalogRouter() {
64
65
  res.status(200).json(empty);
65
66
  }
66
67
  });
68
+ /**
69
+ * `GET /auth/login-screen`: the default theme's PUBLISHED sign-in page, logos and seeds, for the login
70
+ * screen to draw before anyone signs in. Its own rate-limit budget (a 429 must answer in this route's
71
+ * shape), the catalog's cache window, and the same failure rule: empty, never an error.
72
+ */
73
+ const loginScreenLimiter = rateLimit({
74
+ windowMs: DEFAULT_RATE_LIMIT_WINDOW_MS,
75
+ limit: DEFAULT_RATE_LIMIT_MAX,
76
+ standardHeaders: 'draft-7',
77
+ legacyHeaders: false,
78
+ message: EMPTY_PUBLIC_LOGIN_SCREEN
79
+ });
80
+ router.get('/login-screen', loginScreenLimiter, (_req, res) => {
81
+ try {
82
+ const body = LoginScreenEngine.Instance.GetPublicLoginScreen();
83
+ res.set('Cache-Control', `public, max-age=${CACHE_MAX_AGE_SECONDS}`);
84
+ res.status(200).json(body);
85
+ }
86
+ catch (error) {
87
+ const message = error instanceof Error ? error.message : String(error);
88
+ LogError(`[Auth] Failed to serve the public login screen: ${message}`);
89
+ res.status(200).json(EMPTY_PUBLIC_LOGIN_SCREEN);
90
+ }
91
+ });
67
92
  return router;
68
93
  }
69
94
  /** @deprecated Use {@link CreateAuthProviderCatalogRouter}. */
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProviderCatalogRouter.js","sourceRoot":"","sources":["../../src/auth/AuthProviderCatalogRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAkC,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,gDAAgD;AAChD,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAE/C,qFAAqF;AACrF,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,yBAAyB;AACzB,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,+BAA+B;IAC7C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,OAAO,GAAG,SAAS,CAAC;QACxB,QAAQ,EAAE,4BAA4B;QACtC,KAAK,EAAE,sBAAsB;QAC7B,eAAe,EAAE,SAAS;QAC1B,aAAa,EAAE,KAAK;QACpB,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;KAC3B,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QACjE,IAAI,CAAC;YACH,MAAM,IAAI,GAA8B,EAAE,SAAS,EAAE,kBAAkB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACtG,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,mBAAmB,qBAAqB,EAAE,CAAC,CAAC;YACrE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,QAAQ,CAAC,uDAAuD,OAAO,EAAE,CAAC,CAAC;YAC3E,MAAM,KAAK,GAA8B,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YAC3D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,+BAA+B;IAC7C,OAAO,+BAA+B,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"AuthProviderCatalogRouter.js","sourceRoot":"","sources":["../../src/auth/AuthProviderCatalogRouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Caches the default theme for the public login-screen route.
3
+ *
4
+ * @module @memberjunction/server/auth
5
+ */
6
+ import { BaseEngine, UserInfo, type IMetadataProvider } from '@memberjunction/core';
7
+ import { type PublicLoginScreen } from '@memberjunction/theme-engine';
8
+ /** What the route serves when there is no default theme, or it cannot be read. */
9
+ export declare const EMPTY_PUBLIC_LOGIN_SCREEN: Readonly<PublicLoginScreen>;
10
+ /**
11
+ * Holds the default Active theme, so `GET /auth/login-screen` answers every anonymous page load from
12
+ * memory. Saving a theme refreshes it, so a publish in Login Studio reaches the login screen without a
13
+ * restart. Severity `warn`: a failed load must not stop the server; the route then serves the stock page.
14
+ */
15
+ export declare class LoginScreenEngine extends BaseEngine<LoginScreenEngine> {
16
+ private _defaultThemes;
17
+ static get Instance(): LoginScreenEngine;
18
+ Config(forceRefresh?: boolean, contextUser?: UserInfo, provider?: IMetadataProvider): Promise<void>;
19
+ /** The default theme's public projection: its PUBLISHED design (never the draft), seeds and logos made safe. */
20
+ GetPublicLoginScreen(): PublicLoginScreen;
21
+ }
22
+ //# sourceMappingURL=LoginScreenEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginScreenEngine.d.ts","sourceRoot":"","sources":["../../src/auth/LoginScreenEngine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAgD,QAAQ,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAElI,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAElG,kFAAkF;AAClF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,iBAAiB,CAA6D,CAAC;AAEhI;;;;GAIG;AACH,qBAMa,iBAAkB,SAAQ,UAAU,CAAC,iBAAiB,CAAC;IAClE,OAAO,CAAC,cAAc,CAAuB;IAE7C,WAAkB,QAAQ,IAAI,iBAAiB,CAE9C;IAEY,MAAM,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAchH,gHAAgH;IACzG,oBAAoB,IAAI,iBAAiB;CAIjD"}
@@ -0,0 +1,57 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /**
8
+ * @fileoverview Caches the default theme for the public login-screen route.
9
+ *
10
+ * @module @memberjunction/server/auth
11
+ */
12
+ import { BaseEngine, RegisterForStartup } from '@memberjunction/core';
13
+ import { PublicLoginScreenFromTheme } from '@memberjunction/theme-engine';
14
+ /** What the route serves when there is no default theme, or it cannot be read. */
15
+ export const EMPTY_PUBLIC_LOGIN_SCREEN = { ThemeName: null, Design: null, Seeds: null, Logos: {} };
16
+ /**
17
+ * Holds the default Active theme, so `GET /auth/login-screen` answers every anonymous page load from
18
+ * memory. Saving a theme refreshes it, so a publish in Login Studio reaches the login screen without a
19
+ * restart. Severity `warn`: a failed load must not stop the server; the route then serves the stock page.
20
+ */
21
+ let LoginScreenEngine = class LoginScreenEngine extends BaseEngine {
22
+ constructor() {
23
+ super(...arguments);
24
+ this._defaultThemes = [];
25
+ }
26
+ static get Instance() {
27
+ return super.getInstance();
28
+ }
29
+ async Config(forceRefresh, contextUser, provider) {
30
+ const configs = [
31
+ {
32
+ PropertyName: '_defaultThemes',
33
+ EntityName: 'MJ: Themes',
34
+ // One default is enforced by the app, not the schema; the most recently changed one wins (as in Login Studio).
35
+ Filter: `IsDefault = 1 AND Status = 'Active'`,
36
+ OrderBy: '__mj_UpdatedAt DESC',
37
+ CacheLocal: true
38
+ }
39
+ ];
40
+ await this.Load(configs, provider, forceRefresh, contextUser);
41
+ }
42
+ /** The default theme's public projection: its PUBLISHED design (never the draft), seeds and logos made safe. */
43
+ GetPublicLoginScreen() {
44
+ const theme = this.GetConfigData('_defaultThemes')[0];
45
+ return theme ? PublicLoginScreenFromTheme(theme) : EMPTY_PUBLIC_LOGIN_SCREEN;
46
+ }
47
+ };
48
+ LoginScreenEngine = __decorate([
49
+ RegisterForStartup({
50
+ priority: 20,
51
+ severity: 'warn',
52
+ deferred: false,
53
+ description: 'Caches the default theme that GET /auth/login-screen serves to the login screen'
54
+ })
55
+ ], LoginScreenEngine);
56
+ export { LoginScreenEngine };
57
+ //# sourceMappingURL=LoginScreenEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginScreenEngine.js","sourceRoot":"","sources":["../../src/auth/LoginScreenEngine.ts"],"names":[],"mappings":";;;;;;AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAA4B,kBAAkB,EAAoC,MAAM,sBAAsB,CAAC;AAElI,OAAO,EAAE,0BAA0B,EAA0B,MAAM,8BAA8B,CAAC;AAElG,kFAAkF;AAClF,MAAM,CAAC,MAAM,yBAAyB,GAAgC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAEhI;;;;GAIG;AAOI,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,UAA6B;IAA7D;;QACG,mBAAc,GAAoB,EAAE,CAAC;IAyB/C,CAAC;IAvBQ,MAAM,KAAK,QAAQ;QACxB,OAAO,KAAK,CAAC,WAAW,EAAqB,CAAC;IAChD,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,YAAsB,EAAE,WAAsB,EAAE,QAA4B;QAC9F,MAAM,OAAO,GAAwC;YACnD;gBACE,YAAY,EAAE,gBAAgB;gBAC9B,UAAU,EAAE,YAAY;gBACxB,+GAA+G;gBAC/G,MAAM,EAAE,qCAAqC;gBAC7C,OAAO,EAAE,qBAAqB;gBAC9B,UAAU,EAAE,IAAI;aACjB;SACF,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAChE,CAAC;IAED,gHAAgH;IACzG,oBAAoB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAgB,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC;IAC/E,CAAC;CACF,CAAA;AA1BY,iBAAiB;IAN7B,kBAAkB,CAAC;QAClB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,iFAAiF;KAC/F,CAAC;GACW,iBAAiB,CA0B7B"}
@@ -0,0 +1,40 @@
1
+ import { IMetadataProvider, UserInfo } from '@memberjunction/core';
2
+ /** The outcome of {@link EvaluateActionRunAuthorization}. */
3
+ export interface ActionRunAuthorization {
4
+ /** True when the user may run the action. */
5
+ Allowed: boolean;
6
+ /** Why the run is allowed or refused. */
7
+ Reason: string;
8
+ }
9
+ /** One provider's authorization tree and the role grants on it. */
10
+ export type AuthorizationMetadata = Pick<IMetadataProvider, 'Authorizations' | 'AuthorizationRoles'>;
11
+ /**
12
+ * True when the user is an Owner, MJ's superuser type. The column is nchar, so the stored value is
13
+ * padded.
14
+ */
15
+ export declare function IsOwner(user: UserInfo): boolean;
16
+ /**
17
+ * Decides whether a user may run an action through a public entry point such as the `RunAction`
18
+ * mutation. It fails closed:
19
+ *
20
+ * - An Owner may run any action.
21
+ * - An action with `MJ: Action Authorizations` rows runs for a user who holds at least one of the
22
+ * linked authorizations. A linked authorization counts only when it is active and none of the
23
+ * user's roles is denied it; the user may then hold it directly or through an ancestor.
24
+ * - An action with no such rows runs for any user when its class authorizes its caller itself
25
+ * (`BaseAction.AuthorizesCaller`), so the action's own check decides. Otherwise it runs for
26
+ * Owners only.
27
+ *
28
+ * The authorizations, their parents and their role grants are read only from `metadata`, never
29
+ * from the global provider. Pass the provider the `MJ: Action Authorizations` rows were read from.
30
+ *
31
+ * Refuse scope-limited sessions before calling this; see `IsScopeLimitedPrincipal`.
32
+ *
33
+ * @param user the caller
34
+ * @param actionAuthorizationIDs the AuthorizationID of each `MJ: Action Authorizations` row for the action
35
+ * @param metadata the provider whose authorizations and role grants decide
36
+ * @param actionAuthorizesCaller true when the action's class authorizes its caller itself
37
+ * @returns whether the run is allowed, and why
38
+ */
39
+ export declare function EvaluateActionRunAuthorization(user: UserInfo, actionAuthorizationIDs: readonly string[], metadata: AuthorizationMetadata, actionAuthorizesCaller: boolean): ActionRunAuthorization;
40
+ //# sourceMappingURL=actionAuthorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionAuthorization.d.ts","sourceRoot":"","sources":["../../src/auth/actionAuthorization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGpI,6DAA6D;AAC7D,MAAM,WAAW,sBAAsB;IACnC,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,mEAAmE;AACnE,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,oBAAoB,CAAC,CAAC;AAErG;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE/C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,QAAQ,EACd,sBAAsB,EAAE,SAAS,MAAM,EAAE,EACzC,QAAQ,EAAE,qBAAqB,EAC/B,sBAAsB,EAAE,OAAO,GAChC,sBAAsB,CAkBxB"}
@@ -0,0 +1,94 @@
1
+ import { AuthorizationRoleType } from '@memberjunction/core';
2
+ import { FilterByUUIDs, IndexByUUID, NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
3
+ /**
4
+ * True when the user is an Owner, MJ's superuser type. The column is nchar, so the stored value is
5
+ * padded.
6
+ */
7
+ export function IsOwner(user) {
8
+ return user.Type?.trim().toLowerCase() === 'owner';
9
+ }
10
+ /**
11
+ * Decides whether a user may run an action through a public entry point such as the `RunAction`
12
+ * mutation. It fails closed:
13
+ *
14
+ * - An Owner may run any action.
15
+ * - An action with `MJ: Action Authorizations` rows runs for a user who holds at least one of the
16
+ * linked authorizations. A linked authorization counts only when it is active and none of the
17
+ * user's roles is denied it; the user may then hold it directly or through an ancestor.
18
+ * - An action with no such rows runs for any user when its class authorizes its caller itself
19
+ * (`BaseAction.AuthorizesCaller`), so the action's own check decides. Otherwise it runs for
20
+ * Owners only.
21
+ *
22
+ * The authorizations, their parents and their role grants are read only from `metadata`, never
23
+ * from the global provider. Pass the provider the `MJ: Action Authorizations` rows were read from.
24
+ *
25
+ * Refuse scope-limited sessions before calling this; see `IsScopeLimitedPrincipal`.
26
+ *
27
+ * @param user the caller
28
+ * @param actionAuthorizationIDs the AuthorizationID of each `MJ: Action Authorizations` row for the action
29
+ * @param metadata the provider whose authorizations and role grants decide
30
+ * @param actionAuthorizesCaller true when the action's class authorizes its caller itself
31
+ * @returns whether the run is allowed, and why
32
+ */
33
+ export function EvaluateActionRunAuthorization(user, actionAuthorizationIDs, metadata, actionAuthorizesCaller) {
34
+ if (IsOwner(user)) {
35
+ return { Allowed: true, Reason: 'The user is an Owner.' };
36
+ }
37
+ if (actionAuthorizationIDs.length === 0) {
38
+ return actionAuthorizesCaller
39
+ ? { Allowed: true, Reason: 'The action authorizes its caller itself.' }
40
+ : { Allowed: false, Reason: 'No Action Authorization grants this action to any role, and the action does not authorize its caller itself; only an Owner may run it.' };
41
+ }
42
+ const authorizationsByID = IndexByUUID(metadata.Authorizations);
43
+ const userGrants = grantsToUserRoles(user, metadata.AuthorizationRoles);
44
+ const granted = actionAuthorizationIDs
45
+ .map((id) => authorizationsByID.Get(id))
46
+ .filter((auth) => auth !== undefined)
47
+ .find((auth) => holdsLinkedAuthorization(auth, authorizationsByID, userGrants));
48
+ return granted
49
+ ? { Allowed: true, Reason: `The user holds the "${granted.Name}" authorization.` }
50
+ : { Allowed: false, Reason: 'None of your roles holds an authorization this action requires.' };
51
+ }
52
+ /** The role grants that name one of the user's roles. */
53
+ function grantsToUserRoles(user, grants) {
54
+ const userRoleIDs = (user.UserRoles ?? []).map((userRole) => userRole.RoleID);
55
+ return FilterByUUIDs(grants, userRoleIDs, (grant) => grant.RoleID);
56
+ }
57
+ /**
58
+ * True when the user holds a linked authorization: it is active, none of the user's roles is denied
59
+ * it, and the user holds it directly or through an ancestor. The first two are checked on the linked
60
+ * authorization itself, because the ancestor walk would otherwise grant it through the parent.
61
+ */
62
+ function holdsLinkedAuthorization(auth, authorizationsByID, userGrants) {
63
+ if (!auth.IsActive || grantTypes(auth, userGrants).includes(AuthorizationRoleType.Deny)) {
64
+ return false;
65
+ }
66
+ return holdsDirectlyOrThroughAncestor(auth, authorizationsByID, userGrants);
67
+ }
68
+ /**
69
+ * True when the user holds the authorization or one of its ancestors, following `ParentID` within
70
+ * `authorizationsByID`. This is the walk `AuthorizationEvaluator.UserCanExecuteWithAncestors` does,
71
+ * with the role grants taken from the same provider as the authorizations.
72
+ */
73
+ function holdsDirectlyOrThroughAncestor(auth, authorizationsByID, userGrants) {
74
+ const visited = new Set();
75
+ let node = auth;
76
+ while (node && !visited.has(NormalizeUUID(node.ID))) {
77
+ if (holdsDirectly(node, userGrants)) {
78
+ return true;
79
+ }
80
+ visited.add(NormalizeUUID(node.ID));
81
+ node = node.ParentID ? authorizationsByID.Get(node.ParentID) : undefined;
82
+ }
83
+ return false;
84
+ }
85
+ /** True when the authorization is active and the user's roles have an Allow and no Deny on it. */
86
+ function holdsDirectly(auth, userGrants) {
87
+ const types = grantTypes(auth, userGrants);
88
+ return auth.IsActive && types.includes(AuthorizationRoleType.Allow) && !types.includes(AuthorizationRoleType.Deny);
89
+ }
90
+ /** Allow or Deny, for each of the user's role grants on the authorization. */
91
+ function grantTypes(auth, userGrants) {
92
+ return userGrants.filter((grant) => UUIDsEqual(grant.AuthorizationID, auth.ID)).map((grant) => grant.AuthorizationType());
93
+ }
94
+ //# sourceMappingURL=actionAuthorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actionAuthorization.js","sourceRoot":"","sources":["../../src/auth/actionAuthorization.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export * from './APIKeyScopeAuth.js';
5
5
  export * from './scopeLimitedPrincipal.js';
6
6
  export * from './actingContextResolver.js';
7
7
  export * from './AuthProviderEngine.js';
8
+ export * from './LoginScreenEngine.js';
8
9
  export * from './AuthProviderCatalogRouter.js';
9
10
  export { InitializeAuthProviders, initializeAuthProviders, InitializeAuthProvidersFromMetadata, initializeAuthProvidersFromMetadata, RefreshAuthProviders, refreshAuthProviders, ValidateAuthProvidersRegistered, validateAuthProvidersRegistered } from './initializeProviders.js';
10
11
  /**