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

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 (346) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/agentSessions/BridgeHostInstance.d.ts +25 -0
  3. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -0
  4. package/dist/agentSessions/BridgeHostInstance.js +30 -0
  5. package/dist/agentSessions/BridgeHostInstance.js.map +1 -0
  6. package/dist/agentSessions/HostInstance.d.ts +75 -11
  7. package/dist/agentSessions/HostInstance.d.ts.map +1 -1
  8. package/dist/agentSessions/HostInstance.js +99 -28
  9. package/dist/agentSessions/HostInstance.js.map +1 -1
  10. package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
  11. package/dist/agentSessions/ReturningVisitorRecap.js +7 -3
  12. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  13. package/dist/agentSessions/SessionJanitor.d.ts +173 -25
  14. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  15. package/dist/agentSessions/SessionJanitor.js +452 -54
  16. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  17. package/dist/agentSessions/SessionManager.d.ts +43 -2
  18. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  19. package/dist/agentSessions/SessionManager.js +99 -8
  20. package/dist/agentSessions/SessionManager.js.map +1 -1
  21. package/dist/agentSessions/SessionRunIDVerifier.d.ts +63 -0
  22. package/dist/agentSessions/SessionRunIDVerifier.d.ts.map +1 -0
  23. package/dist/agentSessions/SessionRunIDVerifier.js +129 -0
  24. package/dist/agentSessions/SessionRunIDVerifier.js.map +1 -0
  25. package/dist/agentSessions/index.d.ts +2 -0
  26. package/dist/agentSessions/index.d.ts.map +1 -1
  27. package/dist/agentSessions/index.js +10 -3
  28. package/dist/agentSessions/index.js.map +1 -1
  29. package/dist/auth/actionAuthorization.d.ts +40 -0
  30. package/dist/auth/actionAuthorization.d.ts.map +1 -0
  31. package/dist/auth/actionAuthorization.js +94 -0
  32. package/dist/auth/actionAuthorization.js.map +1 -0
  33. package/dist/auth/index.d.ts.map +1 -1
  34. package/dist/auth/index.js +3 -10
  35. package/dist/auth/index.js.map +1 -1
  36. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  37. package/dist/auth/magicLink/MagicLinkService.js +6 -3
  38. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  39. package/dist/auth/newUsers.d.ts +10 -0
  40. package/dist/auth/newUsers.d.ts.map +1 -1
  41. package/dist/auth/newUsers.js +80 -11
  42. package/dist/auth/newUsers.js.map +1 -1
  43. package/dist/config.d.ts +2378 -0
  44. package/dist/config.d.ts.map +1 -1
  45. package/dist/config.js +123 -0
  46. package/dist/config.js.map +1 -1
  47. package/dist/context.d.ts +8 -0
  48. package/dist/context.d.ts.map +1 -1
  49. package/dist/context.js +14 -11
  50. package/dist/context.js.map +1 -1
  51. package/dist/generated/graphql-schemas/__mj.d.ts +135 -0
  52. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  53. package/dist/generated/graphql-schemas/__mj.js +706 -0
  54. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  55. package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
  56. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  57. package/dist/generic/ResolverBase.d.ts +20 -4
  58. package/dist/generic/ResolverBase.d.ts.map +1 -1
  59. package/dist/generic/ResolverBase.js +39 -10
  60. package/dist/generic/ResolverBase.js.map +1 -1
  61. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  62. package/dist/generic/RunViewResolver.js +4 -0
  63. package/dist/generic/RunViewResolver.js.map +1 -1
  64. package/dist/index.d.ts +6 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +120 -131
  67. package/dist/index.js.map +1 -1
  68. package/dist/isolatedProvider.d.ts +20 -0
  69. package/dist/isolatedProvider.d.ts.map +1 -0
  70. package/dist/isolatedProvider.js +22 -0
  71. package/dist/isolatedProvider.js.map +1 -0
  72. package/dist/realtimeProxy/RealtimeProxyServer.d.ts +44 -4
  73. package/dist/realtimeProxy/RealtimeProxyServer.d.ts.map +1 -1
  74. package/dist/realtimeProxy/RealtimeProxyServer.js +121 -16
  75. package/dist/realtimeProxy/RealtimeProxyServer.js.map +1 -1
  76. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts +171 -0
  77. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts.map +1 -0
  78. package/dist/realtimeProxy/RealtimeRelayTunnel.js +532 -0
  79. package/dist/realtimeProxy/RealtimeRelayTunnel.js.map +1 -0
  80. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts +148 -0
  81. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts.map +1 -0
  82. package/dist/realtimeSessions/RealtimeSessionEventService.js +191 -0
  83. package/dist/realtimeSessions/RealtimeSessionEventService.js.map +1 -0
  84. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts +66 -0
  85. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -0
  86. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +138 -0
  87. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -0
  88. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts +38 -0
  89. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -0
  90. package/dist/realtimeSessions/RealtimeVerifyRouter.js +98 -0
  91. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -0
  92. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts +61 -0
  93. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -0
  94. package/dist/realtimeSessions/SessionVerificationPortsBase.js +149 -0
  95. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -0
  96. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts +57 -0
  97. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts.map +1 -0
  98. package/dist/realtimeSessions/SlidingWindowRateLimiter.js +69 -0
  99. package/dist/realtimeSessions/SlidingWindowRateLimiter.js.map +1 -0
  100. package/dist/realtimeSessions/index.d.ts +17 -0
  101. package/dist/realtimeSessions/index.d.ts.map +1 -0
  102. package/dist/realtimeSessions/index.js +17 -0
  103. package/dist/realtimeSessions/index.js.map +1 -0
  104. package/dist/realtimeSessions/sessionAccess.d.ts +86 -0
  105. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
  106. package/dist/realtimeSessions/sessionAccess.js +90 -0
  107. package/dist/realtimeSessions/sessionAccess.js.map +1 -0
  108. package/dist/realtimeSessions/sessionConfigStamps.d.ts +70 -0
  109. package/dist/realtimeSessions/sessionConfigStamps.d.ts.map +1 -0
  110. package/dist/realtimeSessions/sessionConfigStamps.js +93 -0
  111. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -0
  112. package/dist/realtimeSessions/subscriptionAuthorization.d.ts +65 -0
  113. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -0
  114. package/dist/realtimeSessions/subscriptionAuthorization.js +71 -0
  115. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -0
  116. package/dist/realtimeSessions/verificationCore.d.ts +243 -0
  117. package/dist/realtimeSessions/verificationCore.d.ts.map +1 -0
  118. package/dist/realtimeSessions/verificationCore.js +356 -0
  119. package/dist/realtimeSessions/verificationCore.js.map +1 -0
  120. package/dist/realtimeSessions/verificationPages.d.ts +66 -0
  121. package/dist/realtimeSessions/verificationPages.d.ts.map +1 -0
  122. package/dist/realtimeSessions/verificationPages.js +110 -0
  123. package/dist/realtimeSessions/verificationPages.js.map +1 -0
  124. package/dist/realtimeSessions/verificationPolicy.d.ts +147 -0
  125. package/dist/realtimeSessions/verificationPolicy.d.ts.map +1 -0
  126. package/dist/realtimeSessions/verificationPolicy.js +249 -0
  127. package/dist/realtimeSessions/verificationPolicy.js.map +1 -0
  128. package/dist/realtimeSessions/verificationWorkflow.d.ts +263 -0
  129. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -0
  130. package/dist/realtimeSessions/verificationWorkflow.js +435 -0
  131. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -0
  132. package/dist/realtimeWidget/widgetGuestElevation.d.ts +20 -2
  133. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  134. package/dist/realtimeWidget/widgetGuestElevation.js +31 -2
  135. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  136. package/dist/resolvers/ActionResolver.d.ts +31 -5
  137. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  138. package/dist/resolvers/ActionResolver.js +75 -14
  139. package/dist/resolvers/ActionResolver.js.map +1 -1
  140. package/dist/resolvers/AdhocQueryResolver.d.ts +14 -1
  141. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  142. package/dist/resolvers/AdhocQueryResolver.js +21 -5
  143. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  144. package/dist/resolvers/CacheStatsResolver.d.ts +27 -0
  145. package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -1
  146. package/dist/resolvers/CacheStatsResolver.js +113 -2
  147. package/dist/resolvers/CacheStatsResolver.js.map +1 -1
  148. package/dist/resolvers/ClientToolRequestResolver.d.ts +4 -2
  149. package/dist/resolvers/ClientToolRequestResolver.d.ts.map +1 -1
  150. package/dist/resolvers/ClientToolRequestResolver.js +28 -10
  151. package/dist/resolvers/ClientToolRequestResolver.js.map +1 -1
  152. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +12 -1
  153. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  154. package/dist/resolvers/FetchEntityVectorsResolver.js +83 -2
  155. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  156. package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -1
  157. package/dist/resolvers/HumanHandoffResolver.js +7 -1
  158. package/dist/resolvers/HumanHandoffResolver.js.map +1 -1
  159. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  160. package/dist/resolvers/MCPResolver.js +9 -4
  161. package/dist/resolvers/MCPResolver.js.map +1 -1
  162. package/dist/resolvers/RealtimeBridgeResolver.d.ts +54 -2
  163. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  164. package/dist/resolvers/RealtimeBridgeResolver.js +155 -10
  165. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  166. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +155 -25
  167. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  168. package/dist/resolvers/RealtimeClientSessionResolver.js +394 -90
  169. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  170. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts +61 -0
  171. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts.map +1 -0
  172. package/dist/resolvers/RealtimeSessionEventsResolver.js +130 -0
  173. package/dist/resolvers/RealtimeSessionEventsResolver.js.map +1 -0
  174. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts +85 -0
  175. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts.map +1 -0
  176. package/dist/resolvers/RealtimeSessionVerificationResolver.js +188 -0
  177. package/dist/resolvers/RealtimeSessionVerificationResolver.js.map +1 -0
  178. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
  179. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  180. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
  181. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  182. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -0
  183. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  184. package/dist/resolvers/RunAIAgentResolver.js +68 -11
  185. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  186. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  187. package/dist/resolvers/RunTemplateResolver.js +12 -11
  188. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  189. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  190. package/dist/resolvers/SyncDataResolver.js +6 -2
  191. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  192. package/dist/resolvers/SyncRolesUsersResolver.d.ts +2 -0
  193. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  194. package/dist/resolvers/SyncRolesUsersResolver.js +23 -6
  195. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  196. package/dist/resolvers/UserAvatarResolver.d.ts +16 -0
  197. package/dist/resolvers/UserAvatarResolver.d.ts.map +1 -0
  198. package/dist/resolvers/UserAvatarResolver.js +124 -0
  199. package/dist/resolvers/UserAvatarResolver.js.map +1 -0
  200. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  201. package/dist/resolvers/UserResolver.js +2 -17
  202. package/dist/resolvers/UserResolver.js.map +1 -1
  203. package/dist/resolvers/agentVisionConsentAudit.d.ts +37 -0
  204. package/dist/resolvers/agentVisionConsentAudit.d.ts.map +1 -0
  205. package/dist/resolvers/agentVisionConsentAudit.js +63 -0
  206. package/dist/resolvers/agentVisionConsentAudit.js.map +1 -0
  207. package/dist/resolvers/avatarInputValidation.d.ts +40 -0
  208. package/dist/resolvers/avatarInputValidation.d.ts.map +1 -0
  209. package/dist/resolvers/avatarInputValidation.js +97 -0
  210. package/dist/resolvers/avatarInputValidation.js.map +1 -0
  211. package/dist/resolvers/currentUserRoles.d.ts +29 -0
  212. package/dist/resolvers/currentUserRoles.d.ts.map +1 -1
  213. package/dist/resolvers/currentUserRoles.js +30 -0
  214. package/dist/resolvers/currentUserRoles.js.map +1 -1
  215. package/dist/resolvers/meetings/meetingMutations.d.ts +6 -0
  216. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -1
  217. package/dist/resolvers/meetings/meetingMutations.js +21 -0
  218. package/dist/resolvers/meetings/meetingMutations.js.map +1 -1
  219. package/dist/services/TaskGraphContinuationDeliverer.d.ts +4 -3
  220. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  221. package/dist/services/TaskGraphContinuationDeliverer.js +13 -7
  222. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  223. package/dist/sharedCache.d.ts +105 -0
  224. package/dist/sharedCache.d.ts.map +1 -0
  225. package/dist/sharedCache.js +276 -0
  226. package/dist/sharedCache.js.map +1 -0
  227. package/dist/types.d.ts +6 -0
  228. package/dist/types.d.ts.map +1 -1
  229. package/dist/types.js.map +1 -1
  230. package/package.json +97 -95
  231. package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
  232. package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
  233. package/src/__tests__/BridgeHostInstance.test.ts +232 -0
  234. package/src/__tests__/ClientToolRequestResolver.test.ts +116 -0
  235. package/src/__tests__/FetchEntityVectorsResolver.test.ts +285 -0
  236. package/src/__tests__/HostInstance.test.ts +84 -0
  237. package/src/__tests__/HumanHandoffResolver.test.ts +17 -0
  238. package/src/__tests__/MeetingResolver.test.ts +75 -1
  239. package/src/__tests__/RealtimeBridgeResolver.test.ts +415 -6
  240. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
  241. package/src/__tests__/RealtimeClientSessionResolver.test.ts +682 -58
  242. package/src/__tests__/RealtimeProxyServer.test.ts +16 -1
  243. package/src/__tests__/RealtimeRelay.test.ts +876 -0
  244. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
  245. package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
  246. package/src/__tests__/ResolverBase.clientOldValues.test.ts +6 -3
  247. package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
  248. package/src/__tests__/RunAIAgentResolver.branch.test.ts +169 -0
  249. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +4 -4
  250. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +166 -0
  251. package/src/__tests__/RunTemplateResolver.test.ts +132 -0
  252. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +63 -0
  253. package/src/__tests__/SessionJanitor.test.ts +845 -18
  254. package/src/__tests__/SessionManager.test.ts +213 -17
  255. package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
  256. package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
  257. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +50 -3
  258. package/src/__tests__/UserAvatarResolver.test.ts +255 -0
  259. package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
  260. package/src/__tests__/actionAuthorization.test.ts +130 -0
  261. package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
  262. package/src/__tests__/avatarInputValidation.test.ts +160 -0
  263. package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
  264. package/src/__tests__/magicLinkService.consume.test.ts +6 -0
  265. package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -0
  266. package/src/__tests__/newUsers.template.test.ts +151 -0
  267. package/src/__tests__/newUsers.test.ts +74 -5
  268. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +17 -2
  269. package/src/__tests__/realtimeSessions/RealtimeSessionEventService.test.ts +201 -0
  270. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +215 -0
  271. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationResolver.test.ts +102 -0
  272. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationService.test.ts +349 -0
  273. package/src/__tests__/realtimeSessions/RealtimeVerifyRouter.test.ts +131 -0
  274. package/src/__tests__/realtimeSessions/SlidingWindowRateLimiter.test.ts +56 -0
  275. package/src/__tests__/realtimeSessions/helpers.ts +4 -0
  276. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +129 -0
  277. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +124 -0
  278. package/src/__tests__/realtimeSessions/verificationCore.test.ts +355 -0
  279. package/src/__tests__/realtimeSessions/verificationPages.test.ts +84 -0
  280. package/src/__tests__/realtimeSessions/verificationPolicy.test.ts +226 -0
  281. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +633 -0
  282. package/src/__tests__/resolverBase.fls.test.ts +87 -4
  283. package/src/__tests__/serverExtensionReservedRoots.test.ts +2 -0
  284. package/src/__tests__/sharedCache.test.ts +310 -0
  285. package/src/__tests__/widgetGuestElevation.test.ts +44 -0
  286. package/src/agentSessions/BridgeHostInstance.ts +32 -0
  287. package/src/agentSessions/HostInstance.ts +124 -28
  288. package/src/agentSessions/ReturningVisitorRecap.ts +7 -3
  289. package/src/agentSessions/SessionJanitor.ts +543 -57
  290. package/src/agentSessions/SessionManager.ts +125 -25
  291. package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
  292. package/src/agentSessions/index.ts +10 -3
  293. package/src/auth/actionAuthorization.ts +116 -0
  294. package/src/auth/index.ts +3 -8
  295. package/src/auth/magicLink/MagicLinkService.ts +6 -3
  296. package/src/auth/newUsers.ts +99 -11
  297. package/src/config.ts +125 -0
  298. package/src/context.ts +15 -10
  299. package/src/generated/graphql-schemas/__mj.ts +496 -1
  300. package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
  301. package/src/generic/ResolverBase.ts +39 -9
  302. package/src/generic/RunViewResolver.ts +4 -0
  303. package/src/index.ts +132 -143
  304. package/src/isolatedProvider.ts +22 -0
  305. package/src/realtimeProxy/RealtimeProxyServer.ts +148 -16
  306. package/src/realtimeProxy/RealtimeRelayTunnel.ts +645 -0
  307. package/src/realtimeSessions/README.md +179 -0
  308. package/src/realtimeSessions/RealtimeSessionEventService.ts +274 -0
  309. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +167 -0
  310. package/src/realtimeSessions/RealtimeVerifyRouter.ts +108 -0
  311. package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
  312. package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
  313. package/src/realtimeSessions/index.ts +16 -0
  314. package/src/realtimeSessions/sessionAccess.ts +141 -0
  315. package/src/realtimeSessions/sessionConfigStamps.ts +123 -0
  316. package/src/realtimeSessions/subscriptionAuthorization.ts +116 -0
  317. package/src/realtimeSessions/verificationCore.ts +502 -0
  318. package/src/realtimeSessions/verificationPages.ts +149 -0
  319. package/src/realtimeSessions/verificationPolicy.ts +321 -0
  320. package/src/realtimeSessions/verificationWorkflow.ts +702 -0
  321. package/src/realtimeWidget/widgetGuestElevation.ts +34 -2
  322. package/src/resolvers/ActionResolver.ts +84 -21
  323. package/src/resolvers/AdhocQueryResolver.ts +24 -6
  324. package/src/resolvers/CacheStatsResolver.ts +89 -2
  325. package/src/resolvers/ClientToolRequestResolver.ts +25 -7
  326. package/src/resolvers/FetchEntityVectorsResolver.ts +97 -2
  327. package/src/resolvers/HumanHandoffResolver.ts +8 -0
  328. package/src/resolvers/MCPResolver.ts +8 -5
  329. package/src/resolvers/RealtimeBridgeResolver.ts +163 -11
  330. package/src/resolvers/RealtimeClientSessionResolver.ts +501 -96
  331. package/src/resolvers/RealtimeSessionEventsResolver.ts +133 -0
  332. package/src/resolvers/RealtimeSessionVerificationResolver.ts +174 -0
  333. package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
  334. package/src/resolvers/RunAIAgentResolver.ts +78 -11
  335. package/src/resolvers/RunTemplateResolver.ts +13 -12
  336. package/src/resolvers/SyncDataResolver.ts +6 -2
  337. package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
  338. package/src/resolvers/UserAvatarResolver.ts +111 -0
  339. package/src/resolvers/UserResolver.ts +2 -16
  340. package/src/resolvers/agentVisionConsentAudit.ts +82 -0
  341. package/src/resolvers/avatarInputValidation.ts +123 -0
  342. package/src/resolvers/currentUserRoles.ts +32 -1
  343. package/src/resolvers/meetings/meetingMutations.ts +21 -0
  344. package/src/services/TaskGraphContinuationDeliverer.ts +13 -7
  345. package/src/sharedCache.ts +302 -0
  346. package/src/types.ts +7 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * @fileoverview Continuing from a user-stopped run on `RunAIAgentFromConversationDetail`.
3
+ *
4
+ * The chat client never sends `lastRunId`, so the turn after a Stop used to start a fresh,
5
+ * unchained run. The mutation now looks for a user-stopped newest root run for the agent in the
6
+ * conversation and, when it finds one, chains the new run to it by LastRunID and rolls its
7
+ * FinalPayload in when the caller supplied no payload. These tests pin that on both dispatch
8
+ * paths, that a caller-supplied lastRunId wins, and that no predecessor changes nothing.
9
+ * Harness as in `RunAIAgentResolver.historyFrom.test.ts`.
10
+ */
11
+ import 'reflect-metadata';
12
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
13
+ import type { PubSubEngine } from 'type-graphql';
14
+
15
+ vi.mock('type-graphql', () => {
16
+ const decoratorFactory = (..._args: unknown[]) => (..._decorated: unknown[]) => undefined;
17
+ const exportNames = [
18
+ 'Resolver', 'Query', 'Mutation', 'Subscription', 'Arg', 'Args', 'ArgsType', 'Ctx', 'Root',
19
+ 'Info', 'Field', 'FieldResolver', 'ObjectType', 'InputType', 'InterfaceType', 'Authorized',
20
+ 'UseMiddleware', 'Extensions', 'Directive', 'ID', 'Int', 'Float', 'GraphQLISODateTime',
21
+ 'GraphQLTimestamp', 'registerEnumType', 'createMethodDecorator', 'createParamDecorator',
22
+ 'buildSchema', 'buildSchemaSync', 'PubSub',
23
+ ];
24
+ return Object.fromEntries(exportNames.map((name) => [name, decoratorFactory]));
25
+ });
26
+
27
+ vi.mock('@memberjunction/ai-agents', () => ({
28
+ AgentRunner: class {
29
+ RunAgentInConversation() {
30
+ return Promise.resolve({ agentResult: { success: true } });
31
+ }
32
+ },
33
+ ArtifactToolManager: class {},
34
+ }));
35
+
36
+ vi.mock('../realtimeWidget/widgetGuestElevation.js', () => ({
37
+ ResolveWidgetGuestRunContext: vi.fn().mockResolvedValue(null),
38
+ ElevateUserPayload: vi.fn(),
39
+ }));
40
+
41
+ import { RunAIAgentResolver } from '../resolvers/RunAIAgentResolver.js';
42
+ import type { AppContext, UserPayload } from '../types.js';
43
+
44
+ const USER = { ID: 'user-1', Email: 'user@example.com' };
45
+ const STOPPED_RUN = '16787b44-29f6-44a5-8bd4-fc1538e79275';
46
+
47
+ type Fn = ReturnType<typeof vi.fn>;
48
+
49
+ interface ResolverSeams {
50
+ CheckAPIKeyScopeAuthorization: Fn;
51
+ GetUserFromPayload: Fn;
52
+ loadConversationHistoryWithAttachments: Fn;
53
+ executeAIAgent: Fn;
54
+ executeAgentInBackground: Fn;
55
+ findUserStoppedPredecessorRunId: Fn;
56
+ }
57
+
58
+ /** Argument positions of lastRunId / autoPopulateLastRunPayload on the two dispatch seams. */
59
+ const SYNC_LAST_RUN = 10, SYNC_AUTO = 11, BG_LAST_RUN = 9, BG_AUTO = 10;
60
+
61
+ function makeResolver(): { resolver: RunAIAgentResolver; seams: ResolverSeams } {
62
+ const resolver = new RunAIAgentResolver();
63
+ const seams = resolver as unknown as ResolverSeams;
64
+ seams.CheckAPIKeyScopeAuthorization = vi.fn().mockResolvedValue(undefined);
65
+ seams.GetUserFromPayload = vi.fn().mockReturnValue(USER);
66
+ seams.loadConversationHistoryWithAttachments = vi.fn().mockResolvedValue([]);
67
+ seams.executeAIAgent = vi.fn().mockResolvedValue({ success: true, result: '{}' });
68
+ seams.executeAgentInBackground = vi.fn();
69
+ seams.findUserStoppedPredecessorRunId = vi.fn().mockResolvedValue(null);
70
+ return { resolver, seams };
71
+ }
72
+
73
+ function makeContext(branchId: string | null = null): AppContext {
74
+ const provider = {
75
+ GetEntityObject: vi.fn().mockResolvedValue({ ConversationID: 'conv-1', BranchID: branchId, Load: vi.fn().mockResolvedValue(true) }),
76
+ };
77
+ return {
78
+ userPayload: { sessionId: 'session-1', userRecord: USER } as unknown as UserPayload,
79
+ providers: [{ type: 'Read-Write', provider }],
80
+ dataSource: {},
81
+ } as unknown as AppContext;
82
+ }
83
+
84
+ const pubSub = { publish: vi.fn() } as unknown as PubSubEngine;
85
+
86
+ async function runMutation(
87
+ resolver: RunAIAgentResolver,
88
+ options: { payload?: string; lastRunId?: string; autoPopulate?: boolean; fireAndForget?: boolean; branchId?: string | null }
89
+ ) {
90
+ return resolver.RunAIAgentFromConversationDetail(
91
+ 'detail-1', 'agent-1', makeContext(options.branchId ?? null), 'session-1', pubSub,
92
+ undefined, undefined, options.payload, options.lastRunId, options.autoPopulate, undefined, undefined, undefined,
93
+ undefined, undefined, options.fireAndForget, undefined, undefined,
94
+ undefined
95
+ );
96
+ }
97
+
98
+ afterEach(() => {
99
+ vi.restoreAllMocks();
100
+ });
101
+
102
+ describe('RunAIAgentFromConversationDetail — continuing from a user-stopped run', () => {
103
+ let resolver: RunAIAgentResolver;
104
+ let seams: ResolverSeams;
105
+
106
+ beforeEach(() => {
107
+ ({ resolver, seams } = makeResolver());
108
+ });
109
+
110
+ it('chains the new run to the stopped predecessor and rolls its payload in when none was supplied', async () => {
111
+ seams.findUserStoppedPredecessorRunId.mockResolvedValue(STOPPED_RUN);
112
+
113
+ const result = await runMutation(resolver, {});
114
+
115
+ expect(result.success).toBe(true);
116
+ expect(seams.findUserStoppedPredecessorRunId).toHaveBeenCalledWith('conv-1', 'agent-1', null, USER, expect.anything());
117
+ const args = seams.executeAIAgent.mock.calls[0];
118
+ expect(args[SYNC_LAST_RUN]).toBe(STOPPED_RUN);
119
+ expect(args[SYNC_AUTO]).toBe(true);
120
+ });
121
+
122
+ it('keeps the caller\'s payload as the start when one was supplied (chains, but does not roll the old one in)', async () => {
123
+ seams.findUserStoppedPredecessorRunId.mockResolvedValue(STOPPED_RUN);
124
+
125
+ await runMutation(resolver, { payload: '{"fromArtifact":true}' });
126
+
127
+ const args = seams.executeAIAgent.mock.calls[0];
128
+ expect(args[SYNC_LAST_RUN]).toBe(STOPPED_RUN);
129
+ expect(args[SYNC_AUTO]).toBeUndefined();
130
+ });
131
+
132
+ it('hands the chain to a fire-and-forget run too', async () => {
133
+ seams.findUserStoppedPredecessorRunId.mockResolvedValue(STOPPED_RUN);
134
+
135
+ await runMutation(resolver, { fireAndForget: true });
136
+
137
+ expect(seams.executeAIAgent).not.toHaveBeenCalled();
138
+ const args = seams.executeAgentInBackground.mock.calls[0];
139
+ expect(args[BG_LAST_RUN]).toBe(STOPPED_RUN);
140
+ expect(args[BG_AUTO]).toBe(true);
141
+ });
142
+
143
+ it('looks up the predecessor on the branch the reply row was created on', async () => {
144
+ await runMutation(resolver, { branchId: 'B' });
145
+ expect(seams.findUserStoppedPredecessorRunId).toHaveBeenCalledWith('conv-1', 'agent-1', 'B', expect.anything(), expect.anything());
146
+ await runMutation(resolver, {});
147
+ expect(seams.findUserStoppedPredecessorRunId).toHaveBeenLastCalledWith('conv-1', 'agent-1', null, expect.anything(), expect.anything());
148
+ });
149
+
150
+ it('a caller-supplied lastRunId wins and the lookup is skipped', async () => {
151
+ await runMutation(resolver, { lastRunId: 'caller-run', autoPopulate: false });
152
+
153
+ expect(seams.findUserStoppedPredecessorRunId).not.toHaveBeenCalled();
154
+ const args = seams.executeAIAgent.mock.calls[0];
155
+ expect(args[SYNC_LAST_RUN]).toBe('caller-run');
156
+ expect(args[SYNC_AUTO]).toBe(false);
157
+ });
158
+
159
+ it('with no stopped predecessor the run is dispatched unchained, as before', async () => {
160
+ await runMutation(resolver, {});
161
+
162
+ const args = seams.executeAIAgent.mock.calls[0];
163
+ expect(args[SYNC_LAST_RUN]).toBeUndefined();
164
+ expect(args[SYNC_AUTO]).toBeUndefined();
165
+ });
166
+ });
@@ -0,0 +1,132 @@
1
+ // type-graphql decorators call `Reflect.getMetadata`, which only exists once this polyfill is
2
+ // loaded. MUST precede any import that pulls in the resolver file.
3
+ import 'reflect-metadata';
4
+
5
+ /**
6
+ * `RunTemplate` renders a stored template on demand. Its API-key scope check is a no-op for JWT,
7
+ * magic-link and widget sessions, so the resolver applies its own rule. These tests pin that it
8
+ * refuses scope-limited sessions and callers who cannot read templates before it loads anything.
9
+ */
10
+ import { describe, it, expect, vi } from 'vitest';
11
+
12
+ // As in RunDecisionResolver.test.ts: vitest's esbuild transform does not apply
13
+ // `emitDecoratorMetadata`, so the decorators are no-ops and the resolver runs as a plain class.
14
+ vi.mock('type-graphql', () => {
15
+ const noopDecorator = () => () => undefined;
16
+ return {
17
+ Resolver: noopDecorator, Mutation: noopDecorator, Query: noopDecorator, Subscription: noopDecorator,
18
+ ObjectType: noopDecorator, InputType: noopDecorator, Field: noopDecorator, Arg: noopDecorator,
19
+ Args: noopDecorator, Ctx: noopDecorator, PubSub: noopDecorator, Root: noopDecorator,
20
+ Directive: noopDecorator, Authorized: noopDecorator, UseMiddleware: noopDecorator,
21
+ createUnionType: () => class {},
22
+ AuthorizationError: class AuthorizationError extends Error {
23
+ constructor(message?: string) {
24
+ super(message);
25
+ this.name = 'AuthorizationError';
26
+ }
27
+ },
28
+ Float: class {}, Int: class {}, ID: class {},
29
+ };
30
+ });
31
+
32
+ import { EntityInfo, UserInfo, UserRoleInfo } from '@memberjunction/core';
33
+ import { RunTemplateResolver } from '../resolvers/RunTemplateResolver.js';
34
+ import type { AppContext, UserPayload } from '../types.js';
35
+
36
+ const UI_ROLE_ID = '0b9b7b55-0000-4000-8000-0000000000a1';
37
+ const TEMPLATE_ID = '0b9b7b55-0000-4000-8000-0000000000c1';
38
+
39
+ /** An entity whose read permission is granted to the given roles. */
40
+ function entityReadableBy(name: string, roleIds: string[]): EntityInfo {
41
+ const entityId = `entity-${name}`;
42
+ return new EntityInfo({
43
+ ID: entityId, Name: name, SchemaName: '__mj', BaseTable: name, BaseView: `vw${name}`, IncludeInAPI: true,
44
+ EntityPermissions: roleIds.map((roleId, index) => ({
45
+ ID: `${entityId}-permission-${index}`, EntityID: entityId, RoleID: roleId,
46
+ CanCreate: false, CanRead: true, CanUpdate: false, CanDelete: false, Type: 'Allow',
47
+ })),
48
+ });
49
+ }
50
+
51
+ /**
52
+ * Metadata plus the one data call the resolver makes first. The data call fails on purpose, so a
53
+ * test can tell whether the resolver got past authorization without needing a database.
54
+ */
55
+ class FakeProvider {
56
+ public readonly EntityObjectRequests: string[] = [];
57
+
58
+ constructor(private readonly entities: EntityInfo[]) {}
59
+
60
+ public EntityByName(name: string): EntityInfo | undefined {
61
+ return this.entities.find((e) => e.Name.trim().toLowerCase() === name.trim().toLowerCase());
62
+ }
63
+
64
+ public async GetEntityObject(entityName: string): Promise<never> {
65
+ this.EntityObjectRequests.push(entityName);
66
+ throw new Error(`reached data access for ${entityName}`);
67
+ }
68
+ }
69
+
70
+ function makeUser(roleIds: string[]): UserInfo {
71
+ const userId = '0b9b7b55-0000-4000-8000-0000000000b1';
72
+ return new UserInfo(null, {
73
+ ID: userId, Name: 'Template Runner', Email: 'runner@example.com',
74
+ UserRoles: roleIds.map((roleId) => new UserRoleInfo({ UserID: userId, RoleID: roleId })),
75
+ });
76
+ }
77
+
78
+ const readableEverywhere = () => [
79
+ entityReadableBy('MJ: Templates', [UI_ROLE_ID]),
80
+ entityReadableBy('MJ: Template Contents', [UI_ROLE_ID]),
81
+ ];
82
+
83
+ /** A JWT-style session (no API key), so the API-key scope check is a no-op. */
84
+ function contextFor(user: UserInfo, provider: FakeProvider): AppContext {
85
+ const userPayload: UserPayload = { email: user.Email, userRecord: user, sessionId: 'session-1' };
86
+ return { userPayload, providers: [{ type: 'Read-Write', provider }] } as unknown as AppContext;
87
+ }
88
+
89
+ const runTemplate = (user: UserInfo, provider: FakeProvider) =>
90
+ new RunTemplateResolver().RunTemplate(TEMPLATE_ID, contextFor(user, provider));
91
+
92
+ describe('RunTemplate authorization', () => {
93
+ it('refuses an anonymous magic-link guest before loading the template', async () => {
94
+ const provider = new FakeProvider(readableEverywhere());
95
+ const guest = makeUser([UI_ROLE_ID]);
96
+ guest.IsMagicLinkAnonymous = true;
97
+
98
+ const result = await runTemplate(guest, provider);
99
+
100
+ expect(result).toMatchObject({ success: false, error: 'Running templates is not permitted for scope-limited sessions' });
101
+ expect(provider.EntityObjectRequests).toEqual([]);
102
+ });
103
+
104
+ it('refuses a resource-scoped magic-link session before loading the template', async () => {
105
+ const provider = new FakeProvider(readableEverywhere());
106
+ const scoped = makeUser([UI_ROLE_ID]);
107
+ scoped.MagicLinkScope = { ResourceID: '0b9b7b55-0000-4000-8000-0000000000d1', ResourceType: 'Dashboards' };
108
+
109
+ const result = await runTemplate(scoped, provider);
110
+
111
+ expect(result).toMatchObject({ success: false, error: 'Running templates is not permitted for scope-limited sessions' });
112
+ expect(provider.EntityObjectRequests).toEqual([]);
113
+ });
114
+
115
+ it('refuses a user without read permission on MJ: Templates before loading the template', async () => {
116
+ const provider = new FakeProvider(readableEverywhere());
117
+
118
+ const result = await runTemplate(makeUser([]), provider);
119
+
120
+ expect(result).toMatchObject({ success: false, error: 'You do not have permission to read MJ: Templates' });
121
+ expect(provider.EntityObjectRequests).toEqual([]);
122
+ });
123
+
124
+ it('lets a user who can read templates and their content through to the template load', async () => {
125
+ const provider = new FakeProvider(readableEverywhere());
126
+
127
+ const result = await runTemplate(makeUser([UI_ROLE_ID]), provider);
128
+
129
+ expect(result).toMatchObject({ success: false, error: 'reached data access for MJ: Templates' });
130
+ expect(provider.EntityObjectRequests).toEqual(['MJ: Templates']);
131
+ });
132
+ });
@@ -0,0 +1,63 @@
1
+ import 'reflect-metadata';
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+
4
+ /**
5
+ * The cache-check transport's param forwarding, at the resolver.
6
+ *
7
+ * This map is the middle of three places a param has to be carried for the smart-cache-check
8
+ * transport to behave like the ordinary one, and it is where three separate fields have now been
9
+ * found missing: `Aggregates` (B40), `DataSource`, and `BypassCache`. Each omission was invisible
10
+ * locally — the schema accepted the field, the provider could act on it, the response could carry
11
+ * it, and only the request never asked. These pin the two that silently change what the database
12
+ * is asked, so a fourth omission fails here rather than in a consumer's UI.
13
+ */
14
+ const runViewsWithCacheCheck = vi.fn(async () => ({ success: true, errorMessage: null, results: [] }));
15
+
16
+ vi.mock('../util.js', () => ({
17
+ GetReadOnlyProvider: () => ({ RunViewsWithCacheCheck: runViewsWithCacheCheck }),
18
+ GetReadWriteProvider: () => ({ RunViewsWithCacheCheck: runViewsWithCacheCheck }),
19
+ }));
20
+
21
+ import { RunViewResolver } from '../generic/RunViewResolver.js';
22
+ import type { AppContext } from '../types.js';
23
+
24
+ /** Minimal context: the resolver only needs a provider (mocked above) and a user record. */
25
+ function context(): AppContext {
26
+ return { providers: [], userPayload: { userRecord: { ID: 'u1', Name: 'Test' } } } as unknown as AppContext;
27
+ }
28
+
29
+ /** The params the resolver handed the provider for the single view in the batch. */
30
+ async function forwardedParams(params: Record<string, unknown>): Promise<Record<string, unknown>> {
31
+ runViewsWithCacheCheck.mockClear();
32
+ const resolver = new RunViewResolver();
33
+ await resolver.RunViewsWithCacheCheck([{ params } as never], context());
34
+ expect(runViewsWithCacheCheck).toHaveBeenCalledTimes(1);
35
+ const call = runViewsWithCacheCheck.mock.calls[0] as unknown as [Array<{ params: Record<string, unknown> }>];
36
+ return call[0][0].params;
37
+ }
38
+
39
+ describe('RunViewsWithCacheCheck resolver — param forwarding', () => {
40
+ beforeEach(() => {
41
+ runViewsWithCacheCheck.mockClear();
42
+ });
43
+
44
+ it('forwards BypassCache, so a deliberate database read is not answered from the server cache', async () => {
45
+ const forwarded = await forwardedParams({ EntityName: 'Customers', BypassCache: true });
46
+ expect(forwarded.BypassCache).toBe(true);
47
+ });
48
+
49
+ it('leaves BypassCache undefined when the caller did not ask for it', async () => {
50
+ const forwarded = await forwardedParams({ EntityName: 'Customers' });
51
+ expect(forwarded.BypassCache).toBeUndefined();
52
+ });
53
+
54
+ it('still forwards DataSource and Aggregates — the two fields previously found missing here', async () => {
55
+ const forwarded = await forwardedParams({
56
+ EntityName: 'Customers',
57
+ DataSource: 'Materialized',
58
+ Aggregates: [{ expression: 'COUNT(*)', alias: 'total' }],
59
+ });
60
+ expect(forwarded.DataSource).toBe('Materialized');
61
+ expect(forwarded.Aggregates).toEqual([{ expression: 'COUNT(*)', alias: 'total' }]);
62
+ });
63
+ });