@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,99 @@
1
+ /**
2
+ * @fileoverview The PUBLIC verify-link routes of mid-session identity verification.
3
+ *
4
+ * Mounted BEFORE the unified auth middleware (the person opening the emailed link — often on another
5
+ * device — holds no MJ token; the single-use token IS the capability).
6
+ *
7
+ * | Route | Effect |
8
+ * |---|---|
9
+ * | `GET /realtime/verify/:token` | Renders a one-button confirmation page. **No side effects.** |
10
+ * | `POST /realtime/verify` (form field `token`) | Redeems the token; renders "You're verified" or the uniform failure page. |
11
+ *
12
+ * ## Why the redemption is a POST
13
+ *
14
+ * Mail scanners and link previewers GET every URL in a message. A GET that consumed the single-use token
15
+ * would let a scanner burn it before the human clicks. The magic-link redeem endpoint made the same
16
+ * choice. The human's click submits the form.
17
+ *
18
+ * ## What the responses reveal
19
+ *
20
+ * Nothing about any session. A malformed token, an unknown session, an expired link, a used link and a
21
+ * voided verification all render the SAME page with the SAME status; success is a bare "You're verified".
22
+ * Responses are `no-store`, never framed, sent with `Referrer-Policy: no-referrer` (the token is in the
23
+ * URL of the GET), and carry a CSP that forbids everything but the page's own inline style.
24
+ *
25
+ * @module @memberjunction/server/realtimeSessions
26
+ */
27
+ import { Router, urlencoded } from 'express';
28
+ import { rateLimit } from 'express-rate-limit';
29
+ import { LogError } from '@memberjunction/core';
30
+ import { configInfo } from '../config.js';
31
+ import { RealtimeSessionVerificationService } from './RealtimeSessionVerificationService.js';
32
+ import { BuildVerifyConfirmHtml, BuildVerifyErrorHtml, BuildVerifyFailureHtml, BuildVerifySuccessHtml } from './verificationPages.js';
33
+ import { ApiRoute } from '../apiRoot.js';
34
+ /** Mount path of the public verify routes. Under `/realtime`, which is already reserved against server extensions. */
35
+ export const REALTIME_VERIFY_MOUNT_PATH = '/realtime/verify';
36
+ /** Headers every verify response carries. */
37
+ function setSecurityHeaders(res) {
38
+ res.setHeader('Cache-Control', 'no-store');
39
+ res.setHeader('Referrer-Policy', 'no-referrer');
40
+ res.setHeader('X-Content-Type-Options', 'nosniff');
41
+ res.setHeader('X-Frame-Options', 'DENY');
42
+ res.setHeader('Content-Security-Policy', "default-src 'none'; style-src 'unsafe-inline'; form-action 'self'; frame-ancestors 'none'; base-uri 'none'");
43
+ }
44
+ /** Sends an HTML page with the verify security headers. */
45
+ function sendPage(res, status, html) {
46
+ setSecurityHeaders(res);
47
+ res.status(status).type('html').send(html);
48
+ }
49
+ /**
50
+ * Builds the public verify router. Mount at {@link REALTIME_VERIFY_MOUNT_PATH} BEFORE the auth
51
+ * middleware.
52
+ *
53
+ * @param service - the verification service (injectable for tests; defaults to the process singleton)
54
+ */
55
+ export function CreateRealtimeVerifyRouter(service = RealtimeSessionVerificationService.Instance) {
56
+ const limits = configInfo.realtime?.identityVerification?.rateLimits;
57
+ // The route is public and a redemption does a database read + write, so it is throttled per IP — the
58
+ // same posture as the magic-link redeem endpoint. The message is the failure page, not JSON: this
59
+ // route talks to a browser.
60
+ const limiter = rateLimit({
61
+ windowMs: limits?.redeemWindowMs ?? 60_000,
62
+ limit: limits?.redeemPerIp ?? 30,
63
+ standardHeaders: 'draft-7',
64
+ legacyHeaders: false,
65
+ handler: (_req, res) => sendPage(res, 429, BuildVerifyFailureHtml()),
66
+ });
67
+ const router = Router();
68
+ // SAFE: renders the confirmation button. Never consumes the token (see the module header).
69
+ router.get('/:token', limiter, (req, res) => {
70
+ const token = typeof req.params.token === 'string' ? req.params.token : '';
71
+ sendPage(res, 200, BuildVerifyConfirmHtml(token, ApiRoute(REALTIME_VERIFY_MOUNT_PATH)));
72
+ });
73
+ // The side-effecting redemption, gated by a human gesture.
74
+ router.post('/', limiter, urlencoded({ extended: false, limit: '4kb' }), async (req, res) => {
75
+ const body = (req.body ?? {});
76
+ const token = typeof body.token === 'string' ? body.token : '';
77
+ try {
78
+ const result = await service.RedeemLink(token, req.ip);
79
+ if (result.Success) {
80
+ sendPage(res, 200, BuildVerifySuccessHtml());
81
+ }
82
+ else if (result.ErrorCode === 'persist_failed') {
83
+ // A server fault after a VALID token: the link is still redeemable, so say "try again".
84
+ sendPage(res, 500, BuildVerifyErrorHtml());
85
+ }
86
+ else {
87
+ // 410 for every other refusal: the page and status are identical whether the token was unknown,
88
+ // malformed, expired or used, so the route cannot be used to probe sessions.
89
+ sendPage(res, 410, BuildVerifyFailureHtml());
90
+ }
91
+ }
92
+ catch (error) {
93
+ LogError(`RealtimeVerifyRouter: redemption threw: ${error instanceof Error ? error.message : String(error)}`);
94
+ sendPage(res, 500, BuildVerifyErrorHtml());
95
+ }
96
+ });
97
+ return router;
98
+ }
99
+ //# sourceMappingURL=RealtimeVerifyRouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RealtimeVerifyRouter.js","sourceRoot":"","sources":["../../src/realtimeSessions/RealtimeVerifyRouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @fileoverview Per-session timers that assemble a client-direct realtime recording from its shard ledger
3
+ * off the request path.
4
+ *
5
+ * The recording REST routes only record shards and the terminal signal; they never decode. When a route
6
+ * learns a session is ready (every expected shard present) it asks for an assembly now; when shards are
7
+ * missing it asks for one after the grace period, forced to `Partial`. This scheduler turns those requests
8
+ * into at most one pending timer and at most one running assembly per session in this process.
9
+ *
10
+ * Correctness across processes does not depend on it: every run starts with the ledger's atomic
11
+ * `ClaimAssembly`, so of two instances (or two timers) only the claim winner assembles. The per-session
12
+ * guard here only avoids wasted claims. A run that dies with the process leaves the session `Assembling`,
13
+ * and the session janitor's stale re-claim is the backstop for that and for any request dropped here.
14
+ *
15
+ * @module @memberjunction/server/realtimeSessions
16
+ */
17
+ import { DatabaseProviderBase, UserInfo } from '@memberjunction/core';
18
+ import { BaseSingleton, IShutdownable } from '@memberjunction/global';
19
+ import { AssembleRealtimeRecordingInput, AssembleRealtimeRecordingOutcome, IRealtimeRecordingLedger } from '@memberjunction/ai-agents';
20
+ /** A cancellable one-shot timer. */
21
+ export interface RecordingAssemblyTimer {
22
+ Cancel(): void;
23
+ }
24
+ /** Time source of the scheduler; injectable so tests can drive it. */
25
+ export interface RecordingAssemblyClock {
26
+ /** Milliseconds since the epoch. */
27
+ Now(): number;
28
+ /** Runs `callback` once after `delayMs`. The timer must not keep the process alive. */
29
+ StartTimer(callback: () => void, delayMs: number): RecordingAssemblyTimer;
30
+ }
31
+ /** The narrow scheduling contract the recording routes depend on. */
32
+ export interface IRecordingAssemblyScheduler {
33
+ /**
34
+ * Requests an assembly of `sessionID` after `delayMs`. `forcePartial` assembles what exists even when
35
+ * shards are missing (the grace period ran out). See {@link RecordingAssemblyScheduler.ScheduleAssembly}.
36
+ */
37
+ ScheduleAssembly(sessionID: string, delayMs: number, forcePartial: boolean): void;
38
+ }
39
+ /** What {@link RecordingAssemblyScheduler.Start} needs. */
40
+ export interface RecordingAssemblySchedulerOptions {
41
+ /** The server's own provider; assembly is server-owned background work, not a request. */
42
+ Provider: DatabaseProviderBase;
43
+ /** The user assembly runs as (the system user). */
44
+ SystemUser: UserInfo;
45
+ /** Grace before a `Deferred` (incomplete) assembly is retried as forced `Partial`. */
46
+ GraceMs: () => number;
47
+ /** Defaults to {@link SqlRealtimeRecordingLedger}. */
48
+ CreateLedger?: (provider: DatabaseProviderBase, contextUser: UserInfo) => IRealtimeRecordingLedger;
49
+ /** Defaults to {@link AssembleRealtimeRecordingFromLedger}. */
50
+ Assemble?: (input: AssembleRealtimeRecordingInput) => Promise<AssembleRealtimeRecordingOutcome>;
51
+ /** Defaults to `Date.now` and unref'd `setTimeout`. */
52
+ Clock?: RecordingAssemblyClock;
53
+ }
54
+ /**
55
+ * Process-wide scheduler of recording assemblies (see the file overview). Call {@link Start} once at
56
+ * server startup; requests made before it (or after {@link Shutdown}) are logged and dropped, leaving the
57
+ * session to the janitor.
58
+ */
59
+ export declare class RecordingAssemblyScheduler extends BaseSingleton<RecordingAssemblyScheduler> implements IShutdownable, IRecordingAssemblyScheduler {
60
+ private _options;
61
+ private _registered;
62
+ /** Pending timers keyed by lowercase session id. */
63
+ private readonly pending;
64
+ /** Lowercase ids of sessions with an assembly running in this process. */
65
+ private readonly running;
66
+ /** Sessions asked for again while running, with the ForcePartial to re-run with. */
67
+ private readonly rerun;
68
+ protected constructor();
69
+ /** Process-wide singleton accessor. */
70
+ static get Instance(): RecordingAssemblyScheduler;
71
+ /** Identifier surfaced in graceful-shutdown logs. */
72
+ readonly ShutdownName = "RecordingAssemblyScheduler";
73
+ /** Configures the scheduler and enables it; calling again replaces the configuration. */
74
+ Start(options: RecordingAssemblySchedulerOptions): void;
75
+ /**
76
+ * Requests an assembly of `sessionID` after `delayMs`. One pending timer per session: a request
77
+ * replaces the pending one only when it would fire sooner (at the same time, the merged request keeps
78
+ * `forcePartial` if either had it). A timer that fires while the session's previous run is still going
79
+ * is remembered and run right after it, never alongside it.
80
+ *
81
+ * Trade-off: a sooner un-forced request replaces a pending forced one. If that run comes back
82
+ * `Deferred` (still incomplete), the forced `Partial` is re-scheduled a full grace from then, so a
83
+ * forced Partial can land up to ~2× the grace after the first terminal signal. Accepted: the sooner
84
+ * run completes the recording outright whenever the missing shards did arrive.
85
+ */
86
+ ScheduleAssembly(sessionID: string, delayMs: number, forcePartial: boolean): void;
87
+ /**
88
+ * Cancels every pending timer and stops accepting requests until the next {@link Start}. A running
89
+ * assembly is not awaited: if the process exits under it, the session stays `Assembling` and the
90
+ * janitor's stale re-claim finishes it. Idempotent.
91
+ */
92
+ Shutdown(): void;
93
+ private onTimer;
94
+ /** Runs the session's assembly, then any re-run requested meanwhile. Never rejects. */
95
+ private runUntilSettled;
96
+ /** One claim + assembly. Logs every failure with the session id; never throws. */
97
+ private runOnce;
98
+ private handleOutcome;
99
+ }
100
+ //# sourceMappingURL=RecordingAssemblyScheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordingAssemblyScheduler.d.ts","sourceRoot":"","sources":["../../src/realtimeSessions/RecordingAssemblyScheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,oBAAoB,EAAuB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,aAAa,EAAoB,MAAM,wBAAwB,CAAC;AACxF,OAAO,EACkC,8BAA8B,EAAE,gCAAgC,EACrG,wBAAwB,EAC3B,MAAM,2BAA2B,CAAC;AAEnC,oCAAoC;AACpC,MAAM,WAAW,sBAAsB;IACnC,MAAM,IAAI,IAAI,CAAC;CAClB;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACnC,oCAAoC;IACpC,GAAG,IAAI,MAAM,CAAC;IACd,uFAAuF;IACvF,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAAC;CAC7E;AAED,qEAAqE;AACrE,MAAM,WAAW,2BAA2B;IACxC;;;OAGG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;CACrF;AAED,2DAA2D;AAC3D,MAAM,WAAW,iCAAiC;IAC9C,0FAA0F;IAC1F,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,mDAAmD;IACnD,UAAU,EAAE,QAAQ,CAAC;IACrB,sFAAsF;IACtF,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,EAAE,WAAW,EAAE,QAAQ,KAAK,wBAAwB,CAAC;IACnG,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAChG,uDAAuD;IACvD,KAAK,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAiBD;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,aAAa,CAAC,0BAA0B,CAAE,YAAW,aAAa,EAAE,2BAA2B;IAC3I,OAAO,CAAC,QAAQ,CAA4D;IAC5E,OAAO,CAAC,WAAW,CAAS;IAC5B,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IAEpD,SAAS;IAIT,uCAAuC;IACvC,WAAkB,QAAQ,IAAI,0BAA0B,CAEvD;IAED,qDAAqD;IACrD,SAAgB,YAAY,gCAAgC;IAE5D,yFAAyF;IAClF,KAAK,CAAC,OAAO,EAAE,iCAAiC,GAAG,IAAI;IAa9D;;;;;;;;;;OAUG;IACI,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI;IAqBxF;;;;OAIG;IACI,QAAQ,IAAI,IAAI;IASvB,OAAO,CAAC,OAAO;IAaf,uFAAuF;YACzE,eAAe;IAc7B,kFAAkF;YACpE,OAAO;IAuBrB,OAAO,CAAC,aAAa;CAkBxB"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * @fileoverview Per-session timers that assemble a client-direct realtime recording from its shard ledger
3
+ * off the request path.
4
+ *
5
+ * The recording REST routes only record shards and the terminal signal; they never decode. When a route
6
+ * learns a session is ready (every expected shard present) it asks for an assembly now; when shards are
7
+ * missing it asks for one after the grace period, forced to `Partial`. This scheduler turns those requests
8
+ * into at most one pending timer and at most one running assembly per session in this process.
9
+ *
10
+ * Correctness across processes does not depend on it: every run starts with the ledger's atomic
11
+ * `ClaimAssembly`, so of two instances (or two timers) only the claim winner assembles. The per-session
12
+ * guard here only avoids wasted claims. A run that dies with the process leaves the session `Assembling`,
13
+ * and the session janitor's stale re-claim is the backstop for that and for any request dropped here.
14
+ *
15
+ * @module @memberjunction/server/realtimeSessions
16
+ */
17
+ import { LogError, LogStatus } from '@memberjunction/core';
18
+ import { BaseSingleton, ShutdownRegistry } from '@memberjunction/global';
19
+ import { AssembleRealtimeRecordingFromLedger, SqlRealtimeRecordingLedger, } from '@memberjunction/ai-agents';
20
+ const NODE_CLOCK = {
21
+ Now: () => Date.now(),
22
+ StartTimer: (callback, delayMs) => {
23
+ const handle = setTimeout(callback, delayMs);
24
+ handle.unref?.();
25
+ return { Cancel: () => clearTimeout(handle) };
26
+ },
27
+ };
28
+ /**
29
+ * Process-wide scheduler of recording assemblies (see the file overview). Call {@link Start} once at
30
+ * server startup; requests made before it (or after {@link Shutdown}) are logged and dropped, leaving the
31
+ * session to the janitor.
32
+ */
33
+ export class RecordingAssemblyScheduler extends BaseSingleton {
34
+ constructor() {
35
+ super();
36
+ this._options = null;
37
+ this._registered = false;
38
+ /** Pending timers keyed by lowercase session id. */
39
+ this.pending = new Map();
40
+ /** Lowercase ids of sessions with an assembly running in this process. */
41
+ this.running = new Set();
42
+ /** Sessions asked for again while running, with the ForcePartial to re-run with. */
43
+ this.rerun = new Map();
44
+ /** Identifier surfaced in graceful-shutdown logs. */
45
+ this.ShutdownName = 'RecordingAssemblyScheduler';
46
+ }
47
+ /** Process-wide singleton accessor. */
48
+ static get Instance() {
49
+ return super.getInstance();
50
+ }
51
+ /** Configures the scheduler and enables it; calling again replaces the configuration. */
52
+ Start(options) {
53
+ this._options = {
54
+ CreateLedger: (provider, contextUser) => new SqlRealtimeRecordingLedger(provider, contextUser),
55
+ Assemble: AssembleRealtimeRecordingFromLedger,
56
+ Clock: NODE_CLOCK,
57
+ ...options,
58
+ };
59
+ if (!this._registered) {
60
+ ShutdownRegistry.Instance.Register(this);
61
+ this._registered = true;
62
+ }
63
+ }
64
+ /**
65
+ * Requests an assembly of `sessionID` after `delayMs`. One pending timer per session: a request
66
+ * replaces the pending one only when it would fire sooner (at the same time, the merged request keeps
67
+ * `forcePartial` if either had it). A timer that fires while the session's previous run is still going
68
+ * is remembered and run right after it, never alongside it.
69
+ *
70
+ * Trade-off: a sooner un-forced request replaces a pending forced one. If that run comes back
71
+ * `Deferred` (still incomplete), the forced `Partial` is re-scheduled a full grace from then, so a
72
+ * forced Partial can land up to ~2× the grace after the first terminal signal. Accepted: the sooner
73
+ * run completes the recording outright whenever the missing shards did arrive.
74
+ */
75
+ ScheduleAssembly(sessionID, delayMs, forcePartial) {
76
+ const options = this._options;
77
+ if (!options) {
78
+ LogError(`RecordingAssemblyScheduler: not running; dropped the assembly request for session ${sessionID} (the session janitor will assemble it)`);
79
+ return;
80
+ }
81
+ const key = sessionID.toLowerCase();
82
+ const dueAt = options.Clock.Now() + Math.max(0, delayMs);
83
+ const existing = this.pending.get(key);
84
+ if (existing && existing.DueAt < dueAt) {
85
+ return;
86
+ }
87
+ if (existing && existing.DueAt === dueAt) {
88
+ existing.ForcePartial = existing.ForcePartial || forcePartial;
89
+ return;
90
+ }
91
+ existing?.Timer.Cancel();
92
+ const timer = options.Clock.StartTimer(() => this.onTimer(key, sessionID), dueAt - options.Clock.Now());
93
+ this.pending.set(key, { DueAt: dueAt, ForcePartial: forcePartial, Timer: timer });
94
+ }
95
+ /**
96
+ * Cancels every pending timer and stops accepting requests until the next {@link Start}. A running
97
+ * assembly is not awaited: if the process exits under it, the session stays `Assembling` and the
98
+ * janitor's stale re-claim finishes it. Idempotent.
99
+ */
100
+ Shutdown() {
101
+ for (const entry of this.pending.values()) {
102
+ entry.Timer.Cancel();
103
+ }
104
+ this.pending.clear();
105
+ this.rerun.clear();
106
+ this._options = null;
107
+ }
108
+ onTimer(key, sessionID) {
109
+ const entry = this.pending.get(key);
110
+ if (!entry) {
111
+ return;
112
+ }
113
+ this.pending.delete(key);
114
+ if (this.running.has(key)) {
115
+ this.rerun.set(key, (this.rerun.get(key) ?? false) || entry.ForcePartial);
116
+ return;
117
+ }
118
+ void this.runUntilSettled(key, sessionID, entry.ForcePartial);
119
+ }
120
+ /** Runs the session's assembly, then any re-run requested meanwhile. Never rejects. */
121
+ async runUntilSettled(key, sessionID, forcePartial) {
122
+ this.running.add(key);
123
+ try {
124
+ let next = forcePartial;
125
+ while (next !== undefined) {
126
+ await this.runOnce(sessionID, next);
127
+ next = this.rerun.get(key);
128
+ this.rerun.delete(key);
129
+ }
130
+ }
131
+ finally {
132
+ this.running.delete(key);
133
+ }
134
+ }
135
+ /** One claim + assembly. Logs every failure with the session id; never throws. */
136
+ async runOnce(sessionID, forcePartial) {
137
+ const options = this._options;
138
+ if (!options) {
139
+ LogStatus(`RecordingAssemblyScheduler: shut down before session ${sessionID} could assemble; the session janitor will assemble it`);
140
+ return;
141
+ }
142
+ try {
143
+ const ledger = options.CreateLedger(options.Provider, options.SystemUser);
144
+ const version = await ledger.ClaimAssembly(sessionID, null);
145
+ if (version === null) {
146
+ LogStatus(`RecordingAssemblyScheduler: session ${sessionID} not claimable (assembled, assembling elsewhere, or failed); skipping`);
147
+ return;
148
+ }
149
+ const outcome = await options.Assemble({
150
+ SessionID: sessionID, Version: version, Ledger: ledger,
151
+ ContextUser: options.SystemUser, Provider: options.Provider, ForcePartial: forcePartial,
152
+ });
153
+ this.handleOutcome(sessionID, version, outcome, options);
154
+ }
155
+ catch (error) {
156
+ LogError(`RecordingAssemblyScheduler: assembly of session ${sessionID} failed: ${error instanceof Error ? error.message : String(error)}`);
157
+ }
158
+ }
159
+ handleOutcome(sessionID, version, outcome, options) {
160
+ if (outcome === 'Deferred') {
161
+ // Incomplete and not forced: give missing shards the grace period, then assemble what exists.
162
+ LogStatus(`RecordingAssemblyScheduler: session ${sessionID} (version ${version}) is missing shards; assembling as Partial after the grace period`);
163
+ this.ScheduleAssembly(sessionID, options.GraceMs(), true);
164
+ return;
165
+ }
166
+ if (outcome === 'Retry') {
167
+ LogError(`RecordingAssemblyScheduler: assembly of session ${sessionID} (version ${version}) hit a transient error; the session janitor re-claims it later`);
168
+ return;
169
+ }
170
+ LogStatus(`RecordingAssemblyScheduler: session ${sessionID} (version ${version}) assembly finished: ${outcome}`);
171
+ }
172
+ }
173
+ //# sourceMappingURL=RecordingAssemblyScheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordingAssemblyScheduler.js","sourceRoot":"","sources":["../../src/realtimeSessions/RecordingAssemblyScheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @fileoverview {@link SessionVerificationPortsBase} — the config-free half of the production
3
+ * {@link VerificationPorts}: reading and writing a session, publishing `identity.verified`, and the
4
+ * audit entry. Everything that depends on server configuration (the settings, the service principal,
5
+ * the mail provider) is left abstract.
6
+ *
7
+ * The split exists so the DB-facing behaviour can be exercised with real sessions by anything that
8
+ * cannot — or must not — load the server's configuration at import time (the integration-test bundle
9
+ * subclasses it with captured email and a fixed principal). `RuntimeVerificationPorts`, in
10
+ * `RealtimeSessionVerificationService.ts`, is the production subclass that supplies the configuration.
11
+ *
12
+ * ## Which identity performs the writes, and why
13
+ *
14
+ * Reads of the session for **authorization** run as the CALLER, so row-level security is the first gate
15
+ * (a widget guest cannot even load another guest's session). Every **write** of server-decided state
16
+ * runs as a service principal ({@link SessionVerificationPortsBase.ResolveServiceUser}), inside
17
+ * `RunWithTrustedSessionConfigWrites`. That is not a convenience: the session owner can already `Update`
18
+ * their own session row, which is exactly why `MJAIAgentSessionEntityServer` refuses owner writes to
19
+ * `identityVerification` and `maxSessionDeadlineIso`. Server-decided state must be written by the server,
20
+ * after the caller was authorized, in a scope no remote caller can enter. The verify link has no caller
21
+ * identity at all (the token is the capability), so it needs the service principal for its reads too.
22
+ *
23
+ * @module @memberjunction/server/realtimeSessions
24
+ */
25
+ import { type UserInfo } from '@memberjunction/core';
26
+ import type { IdentityVerifiedEventPayload } from '@memberjunction/ai-core-plus';
27
+ import { type ConfigMutation, type ConfigMutationResult, type OutboundEmail, type SessionSnapshot, type VerificationAuditEntry, type VerificationCaller, type VerificationPorts, type VerificationSettings } from './verificationWorkflow.js';
28
+ /** The seeded audit-log type (see `metadata/audit-log-types/.realtime-session-audit-types.json`). */
29
+ export declare const REALTIME_IDENTITY_VERIFIED_AUDIT_TYPE = "Realtime Identity Verified";
30
+ /**
31
+ * The session-facing {@link VerificationPorts}, minus configuration. Subclasses supply the settings, the
32
+ * service principal and the mail delivery.
33
+ */
34
+ export declare abstract class SessionVerificationPortsBase implements VerificationPorts {
35
+ /** The live settings. */
36
+ abstract GetSettings(): VerificationSettings;
37
+ /** Delivers an email. Must not throw; reports failure in the result. */
38
+ abstract SendEmail(email: OutboundEmail): Promise<{
39
+ Success: boolean;
40
+ ErrorMessage?: string;
41
+ }>;
42
+ /** The principal state writes (and the link caller's reads) run as; null when none is available. */
43
+ protected abstract ResolveServiceUser(): UserInfo | null;
44
+ Now(): number;
45
+ LoadSession(agentSessionId: string, caller: VerificationCaller): Promise<SessionSnapshot | null>;
46
+ MutateSessionConfig<T>(agentSessionId: string, caller: VerificationCaller, mutate: ConfigMutation<T>): Promise<ConfigMutationResult<T>>;
47
+ PublishVerified(routing: {
48
+ AgentSessionID: string;
49
+ OwnerUserID: string;
50
+ ScopeKey: string | null;
51
+ }, payload: IdentityVerifiedEventPayload): {
52
+ Success: boolean;
53
+ ErrorMessage?: string;
54
+ };
55
+ WriteAudit(entry: VerificationAuditEntry): Promise<void>;
56
+ /** The identity + provider an authorization read runs under. */
57
+ private readerFor;
58
+ /** The identity + provider a state write runs under: always the service principal. */
59
+ private writerFor;
60
+ }
61
+ //# sourceMappingURL=SessionVerificationPortsBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionVerificationPortsBase.d.ts","sourceRoot":"","sources":["../../src/realtimeSessions/SessionVerificationPortsBase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAA8C,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGjG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAGjF,OAAO,EACH,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EAC5B,MAAM,2BAA2B,CAAC;AAEnC,qGAAqG;AACrG,eAAO,MAAM,qCAAqC,+BAA+B,CAAC;AAsBlF;;;GAGG;AACH,8BAAsB,4BAA6B,YAAW,iBAAiB;IAC3E,yBAAyB;aACT,WAAW,IAAI,oBAAoB;IAEnD,wEAAwE;aACxD,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAErG,oGAAoG;IACpG,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,GAAG,IAAI;IAEjD,GAAG,IAAI,MAAM;IAIP,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAShG,mBAAmB,CAAC,CAAC,EAC9B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IA8B5B,eAAe,CAClB,OAAO,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EACjF,OAAO,EAAE,4BAA4B,GACtC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IAIjC,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCrE,gEAAgE;IAChE,OAAO,CAAC,SAAS;IAQjB,sFAAsF;IACtF,OAAO,CAAC,SAAS;CAOpB"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * @fileoverview {@link SessionVerificationPortsBase} — the config-free half of the production
3
+ * {@link VerificationPorts}: reading and writing a session, publishing `identity.verified`, and the
4
+ * audit entry. Everything that depends on server configuration (the settings, the service principal,
5
+ * the mail provider) is left abstract.
6
+ *
7
+ * The split exists so the DB-facing behaviour can be exercised with real sessions by anything that
8
+ * cannot — or must not — load the server's configuration at import time (the integration-test bundle
9
+ * subclasses it with captured email and a fixed principal). `RuntimeVerificationPorts`, in
10
+ * `RealtimeSessionVerificationService.ts`, is the production subclass that supplies the configuration.
11
+ *
12
+ * ## Which identity performs the writes, and why
13
+ *
14
+ * Reads of the session for **authorization** run as the CALLER, so row-level security is the first gate
15
+ * (a widget guest cannot even load another guest's session). Every **write** of server-decided state
16
+ * runs as a service principal ({@link SessionVerificationPortsBase.ResolveServiceUser}), inside
17
+ * `RunWithTrustedSessionConfigWrites`. That is not a convenience: the session owner can already `Update`
18
+ * their own session row, which is exactly why `MJAIAgentSessionEntityServer` refuses owner writes to
19
+ * `identityVerification` and `maxSessionDeadlineIso`. Server-decided state must be written by the server,
20
+ * after the caller was authorized, in a scope no remote caller can enter. The verify link has no caller
21
+ * identity at all (the token is the capability), so it needs the service principal for its reads too.
22
+ *
23
+ * @module @memberjunction/server/realtimeSessions
24
+ */
25
+ import { LogError, Metadata } from '@memberjunction/core';
26
+ import { RunWithTrustedSessionConfigWrites } from '@memberjunction/core-entities-server';
27
+ import { LoadSessionForAccess } from './sessionAccess.js';
28
+ import { RealtimeSessionEventService } from './RealtimeSessionEventService.js';
29
+ /** The seeded audit-log type (see `metadata/audit-log-types/.realtime-session-audit-types.json`). */
30
+ export const REALTIME_IDENTITY_VERIFIED_AUDIT_TYPE = 'Realtime Identity Verified';
31
+ const AUDIT_LOG_ENTITY = 'MJ: Audit Logs';
32
+ const SESSION_ENTITY_NAME = 'MJ: AI Agent Sessions';
33
+ /** Reduces a loaded session to the snapshot the workflow reasons about. */
34
+ function toSnapshot(loaded) {
35
+ const { Session } = loaded;
36
+ return {
37
+ AgentSessionID: Session.ID,
38
+ OwnerUserID: Session.UserID,
39
+ ConversationExternalID: loaded.ConversationExternalID,
40
+ Status: Session.Status,
41
+ ConfigRaw: Session.Config_,
42
+ // `__mj_CreatedAt` is the row's creation instant — i.e. the session start. It is read-only and
43
+ // set by the database, so a client cannot move it.
44
+ StartedAtMs: Session.__mj_CreatedAt instanceof Date ? Session.__mj_CreatedAt.getTime() : Date.now(),
45
+ };
46
+ }
47
+ /**
48
+ * The session-facing {@link VerificationPorts}, minus configuration. Subclasses supply the settings, the
49
+ * service principal and the mail delivery.
50
+ */
51
+ export class SessionVerificationPortsBase {
52
+ Now() {
53
+ return Date.now();
54
+ }
55
+ async LoadSession(agentSessionId, caller) {
56
+ const reader = this.readerFor(caller);
57
+ if (!reader) {
58
+ return null;
59
+ }
60
+ const loaded = await LoadSessionForAccess(agentSessionId, reader.User, reader.Provider);
61
+ return loaded ? toSnapshot(loaded) : null;
62
+ }
63
+ async MutateSessionConfig(agentSessionId, caller, mutate) {
64
+ const writer = this.writerFor(caller);
65
+ if (!writer) {
66
+ return { Persisted: false, ErrorMessage: 'No service principal is available to record verification state.' };
67
+ }
68
+ try {
69
+ const loaded = await LoadSessionForAccess(agentSessionId, writer.User, writer.Provider);
70
+ if (!loaded) {
71
+ return { Persisted: false, ErrorMessage: `Session ${agentSessionId} could not be read.` };
72
+ }
73
+ const session = toSnapshot(loaded);
74
+ const { NextConfigRaw, Outcome } = mutate(session);
75
+ if (NextConfigRaw === null) {
76
+ return { Session: session, Outcome, Persisted: false };
77
+ }
78
+ loaded.Session.Config_ = NextConfigRaw;
79
+ const saved = await RunWithTrustedSessionConfigWrites(() => loaded.Session.Save());
80
+ if (!saved) {
81
+ const detail = loaded.Session.LatestResult?.CompleteMessage ?? 'unknown error';
82
+ LogError(`RealtimeSessionVerification: saving session ${agentSessionId} failed: ${detail}`);
83
+ return { Session: session, Outcome, Persisted: false, ErrorMessage: detail };
84
+ }
85
+ return { Session: session, Outcome, Persisted: true };
86
+ }
87
+ catch (error) {
88
+ const message = error instanceof Error ? error.message : String(error);
89
+ LogError(`RealtimeSessionVerification: updating session ${agentSessionId} threw: ${message}`);
90
+ return { Persisted: false, ErrorMessage: message };
91
+ }
92
+ }
93
+ PublishVerified(routing, payload) {
94
+ return RealtimeSessionEventService.Instance.PublishRouted(routing, 'identity.verified', payload);
95
+ }
96
+ async WriteAudit(entry) {
97
+ const writer = this.ResolveServiceUser();
98
+ const provider = Metadata.Provider; // global-provider-ok: server-side audit write under the server's single default provider
99
+ const type = provider?.AuditLogTypes?.find((t) => t.Name?.trim().toLowerCase() === REALTIME_IDENTITY_VERIFIED_AUDIT_TYPE.toLowerCase());
100
+ const sessionEntityId = provider?.EntityByName(SESSION_ENTITY_NAME)?.ID;
101
+ if (!writer || !type) {
102
+ // The audit type ships as metadata (a release seed); without it, fall back to the server log so
103
+ // the verification is still recorded somewhere durable-ish rather than silently unaudited.
104
+ LogError(`RealtimeSessionVerification: audit entry not written for session ${entry.AgentSessionID} ` +
105
+ `(${writer ? `audit log type '${REALTIME_IDENTITY_VERIFIED_AUDIT_TYPE}' is not seeded` : 'no service principal'}): ` +
106
+ `${entry.Email} via ${entry.Method}.`);
107
+ return;
108
+ }
109
+ try {
110
+ const row = await provider.GetEntityObject(AUDIT_LOG_ENTITY, writer);
111
+ row.NewRecord();
112
+ row.UserID = entry.OwnerUserID;
113
+ row.AuditLogTypeID = type.ID;
114
+ row.Status = 'Success';
115
+ row.EntityID = sessionEntityId ?? null;
116
+ row.RecordID = entry.AgentSessionID;
117
+ row.Description = `Realtime session verified ${entry.Email} by ${entry.Method === 'link' ? 'emailed link' : 'typed code'}.`;
118
+ row.Details = JSON.stringify({
119
+ email: entry.Email,
120
+ method: entry.Method,
121
+ ipAddress: entry.ClientIp ?? null,
122
+ maxSessionDeadlineIso: entry.MaxSessionDeadlineIso ?? null,
123
+ });
124
+ if (!(await row.Save())) {
125
+ LogError(`RealtimeSessionVerification: audit row save failed for session ${entry.AgentSessionID}: ${row.LatestResult?.CompleteMessage ?? 'unknown error'}`);
126
+ }
127
+ }
128
+ catch (error) {
129
+ LogError(`RealtimeSessionVerification: audit write threw for session ${entry.AgentSessionID}: ${error instanceof Error ? error.message : String(error)}`);
130
+ }
131
+ }
132
+ /** The identity + provider an authorization read runs under. */
133
+ readerFor(caller) {
134
+ if (caller.Kind === 'principal') {
135
+ return { User: caller.ContextUser, Provider: caller.Provider };
136
+ }
137
+ const user = this.ResolveServiceUser();
138
+ return user ? { User: user, Provider: Metadata.Provider } : null; // global-provider-ok: public verify route has no request-scoped provider
139
+ }
140
+ /** The identity + provider a state write runs under: always the service principal. */
141
+ writerFor(caller) {
142
+ const user = this.ResolveServiceUser();
143
+ if (!user) {
144
+ return null;
145
+ }
146
+ return { User: user, Provider: caller.Kind === 'principal' ? caller.Provider : Metadata.Provider }; // global-provider-ok: public verify route has no request-scoped provider
147
+ }
148
+ }
149
+ //# sourceMappingURL=SessionVerificationPortsBase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionVerificationPortsBase.js","sourceRoot":"","sources":["../../src/realtimeSessions/SessionVerificationPortsBase.ts"],"names":[],"mappings":"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"}