@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
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAqDxE,MAAM,OAAO,YAAY;CAGxB;AAED,MAAM,OAAO,cAAc;IASzB,YAAY,IAA4J;QACtK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAAA,CAAC;AAmDF,MAAM,OAAO,aAAa;CAKzB;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;IAEzC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;IAC1B,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;IACjB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC;IACvC,GAAG,CAAC,SAAS,GAAG,oBAAoB,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AA4DxE,MAAM,OAAO,YAAY;CAGxB;AAED,MAAM,OAAO,cAAc;IASzB,YAAY,IAA4J;QACtK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAAA,CAAC;AAmDF,MAAM,OAAO,aAAa;CAKzB;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;IAEzC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;IAC1B,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;IACjB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC;IACvC,GAAG,CAAC,SAAS,GAAG,oBAAoB,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/server",
3
- "version": "6.2.0-edge.3",
3
+ "version": "6.2.0-edge.4",
4
4
  "description": "MemberJunction: This project provides API access via GraphQL to the common data store.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./src/index.ts",
@@ -19,99 +19,101 @@
19
19
  "@as-integrations/express5": "^1.0.0",
20
20
  "@graphql-tools/schema": "^10.0.38",
21
21
  "@graphql-tools/utils": "^11.0.0",
22
- "@memberjunction/actions": "6.2.0-edge.3",
23
- "@memberjunction/actions-apollo": "6.2.0-edge.3",
24
- "@memberjunction/actions-base": "6.2.0-edge.3",
25
- "@memberjunction/actions-bizapps-accounting": "6.2.0-edge.3",
26
- "@memberjunction/actions-bizapps-crm": "6.2.0-edge.3",
27
- "@memberjunction/actions-bizapps-formbuilders": "6.2.0-edge.3",
28
- "@memberjunction/actions-bizapps-lms": "6.2.0-edge.3",
29
- "@memberjunction/actions-bizapps-social": "6.2.0-edge.3",
30
- "@memberjunction/ai": "6.2.0-edge.3",
31
- "@memberjunction/ai-agent-manager": "6.2.0-edge.3",
32
- "@memberjunction/ai-agent-manager-actions": "6.2.0-edge.3",
33
- "@memberjunction/ai-agents": "6.2.0-edge.3",
34
- "@memberjunction/ai-bridge-base": "6.2.0-edge.3",
35
- "@memberjunction/ai-bridge-ringcentral": "6.2.0-edge.3",
36
- "@memberjunction/ai-bridge-server": "6.2.0-edge.3",
37
- "@memberjunction/ai-bridge-teams": "6.2.0-edge.3",
38
- "@memberjunction/ai-bridge-twilio": "6.2.0-edge.3",
39
- "@memberjunction/ai-bridge-vonage": "6.2.0-edge.3",
40
- "@memberjunction/ai-core-plus": "6.2.0-edge.3",
41
- "@memberjunction/ai-engine-base": "6.2.0-edge.3",
42
- "@memberjunction/ai-mcp-client": "6.2.0-edge.3",
43
- "@memberjunction/ai-prompts": "6.2.0-edge.3",
44
- "@memberjunction/ai-provider-bundle": "6.2.0-edge.3",
45
- "@memberjunction/ai-vector-dupe": "6.2.0-edge.3",
46
- "@memberjunction/ai-vector-sync": "6.2.0-edge.3",
47
- "@memberjunction/ai-vectordb": "6.2.0-edge.3",
48
- "@memberjunction/ai-vectors-pinecone": "6.2.0-edge.3",
49
- "@memberjunction/aiengine": "6.2.0-edge.3",
50
- "@memberjunction/api-keys": "6.2.0-edge.3",
51
- "@memberjunction/auth-providers": "6.2.0-edge.3",
52
- "@memberjunction/clustering-engine": "6.2.0-edge.3",
53
- "@memberjunction/codegen-lib": "6.2.0-edge.3",
54
- "@memberjunction/communication-engine": "6.2.0-edge.3",
55
- "@memberjunction/communication-ms-graph": "6.2.0-edge.3",
56
- "@memberjunction/communication-sendgrid": "6.2.0-edge.3",
57
- "@memberjunction/communication-types": "6.2.0-edge.3",
58
- "@memberjunction/component-registry-client-sdk": "6.2.0-edge.3",
59
- "@memberjunction/computer-use": "6.2.0-edge.3",
60
- "@memberjunction/computer-use-engine": "6.2.0-edge.3",
61
- "@memberjunction/config": "6.2.0-edge.3",
62
- "@memberjunction/core": "6.2.0-edge.3",
63
- "@memberjunction/core-actions": "6.2.0-edge.3",
64
- "@memberjunction/core-entities": "6.2.0-edge.3",
65
- "@memberjunction/core-entities-server": "6.2.0-edge.3",
66
- "@memberjunction/credentials": "6.2.0-edge.3",
67
- "@memberjunction/data-context": "6.2.0-edge.3",
68
- "@memberjunction/data-context-server": "6.2.0-edge.3",
69
- "@memberjunction/doc-utils": "6.2.0-edge.3",
70
- "@memberjunction/encryption": "6.2.0-edge.3",
71
- "@memberjunction/entity-communications-base": "6.2.0-edge.3",
72
- "@memberjunction/entity-communications-server": "6.2.0-edge.3",
73
- "@memberjunction/esignature": "6.2.0-edge.3",
74
- "@memberjunction/external-change-detection": "6.2.0-edge.3",
75
- "@memberjunction/generic-database-provider": "6.2.0-edge.3",
76
- "@memberjunction/global": "6.2.0-edge.3",
77
- "@memberjunction/graphql-dataprovider": "6.2.0-edge.3",
78
- "@memberjunction/integration-engine": "6.2.0-edge.3",
79
- "@memberjunction/integration-engine-base": "6.2.0-edge.3",
80
- "@memberjunction/integration-progress-artifacts": "6.2.0-edge.3",
81
- "@memberjunction/integration-schema-builder": "6.2.0-edge.3",
82
- "@memberjunction/interactive-component-types": "6.2.0-edge.3",
83
- "@memberjunction/lists": "6.2.0-edge.3",
84
- "@memberjunction/lists-base": "6.2.0-edge.3",
85
- "@memberjunction/livekit-room-server": "6.2.0-edge.3",
86
- "@memberjunction/network-utils": "6.2.0-edge.3",
87
- "@memberjunction/notifications": "6.2.0-edge.3",
88
- "@memberjunction/postgresql-dataprovider": "6.2.0-edge.3",
89
- "@memberjunction/queue": "6.2.0-edge.3",
90
- "@memberjunction/record-comparison": "6.2.0-edge.3",
91
- "@memberjunction/redis-provider": "6.2.0-edge.3",
92
- "@memberjunction/remote-browser-base": "6.2.0-edge.3",
93
- "@memberjunction/remote-browser-cdp": "6.2.0-edge.3",
94
- "@memberjunction/remote-browser-selfhost": "6.2.0-edge.3",
95
- "@memberjunction/remote-browser-server": "6.2.0-edge.3",
96
- "@memberjunction/scheduling-actions": "6.2.0-edge.3",
97
- "@memberjunction/scheduling-base-types": "6.2.0-edge.3",
98
- "@memberjunction/scheduling-engine": "6.2.0-edge.3",
99
- "@memberjunction/scheduling-engine-base": "6.2.0-edge.3",
100
- "@memberjunction/schema-engine": "6.2.0-edge.3",
101
- "@memberjunction/search-engine": "6.2.0-edge.3",
102
- "@memberjunction/server-extensions-core": "6.2.0-edge.3",
103
- "@memberjunction/sql-dialect": "6.2.0-edge.3",
104
- "@memberjunction/sql-parser": "6.2.0-edge.3",
105
- "@memberjunction/sqlserver-dataprovider": "6.2.0-edge.3",
106
- "@memberjunction/storage": "6.2.0-edge.3",
107
- "@memberjunction/tag-engine": "6.2.0-edge.3",
108
- "@memberjunction/tag-engine-base": "6.2.0-edge.3",
109
- "@memberjunction/task-graph": "6.2.0-edge.3",
110
- "@memberjunction/templates": "6.2.0-edge.3",
111
- "@memberjunction/testing-engine": "6.2.0-edge.3",
112
- "@memberjunction/testing-engine-base": "6.2.0-edge.3",
113
- "@memberjunction/version-history": "6.2.0-edge.3",
114
- "@memberjunction/work-queue-engine": "6.2.0-edge.3",
22
+ "@memberjunction/actions": "6.2.0-edge.4",
23
+ "@memberjunction/actions-apollo": "6.2.0-edge.4",
24
+ "@memberjunction/actions-base": "6.2.0-edge.4",
25
+ "@memberjunction/actions-bizapps-accounting": "6.2.0-edge.4",
26
+ "@memberjunction/actions-bizapps-crm": "6.2.0-edge.4",
27
+ "@memberjunction/actions-bizapps-formbuilders": "6.2.0-edge.4",
28
+ "@memberjunction/actions-bizapps-lms": "6.2.0-edge.4",
29
+ "@memberjunction/actions-bizapps-social": "6.2.0-edge.4",
30
+ "@memberjunction/actions-peopledatalabs": "6.2.0-edge.4",
31
+ "@memberjunction/ai": "6.2.0-edge.4",
32
+ "@memberjunction/ai-agent-manager": "6.2.0-edge.4",
33
+ "@memberjunction/ai-agent-manager-actions": "6.2.0-edge.4",
34
+ "@memberjunction/ai-agents": "6.2.0-edge.4",
35
+ "@memberjunction/ai-bridge-base": "6.2.0-edge.4",
36
+ "@memberjunction/ai-bridge-ringcentral": "6.2.0-edge.4",
37
+ "@memberjunction/ai-bridge-server": "6.2.0-edge.4",
38
+ "@memberjunction/ai-bridge-teams": "6.2.0-edge.4",
39
+ "@memberjunction/ai-bridge-twilio": "6.2.0-edge.4",
40
+ "@memberjunction/ai-bridge-vonage": "6.2.0-edge.4",
41
+ "@memberjunction/ai-core-plus": "6.2.0-edge.4",
42
+ "@memberjunction/ai-engine-base": "6.2.0-edge.4",
43
+ "@memberjunction/ai-mcp-client": "6.2.0-edge.4",
44
+ "@memberjunction/ai-prompts": "6.2.0-edge.4",
45
+ "@memberjunction/ai-provider-bundle": "6.2.0-edge.4",
46
+ "@memberjunction/ai-vector-dupe": "6.2.0-edge.4",
47
+ "@memberjunction/ai-vector-sync": "6.2.0-edge.4",
48
+ "@memberjunction/ai-vectordb": "6.2.0-edge.4",
49
+ "@memberjunction/ai-vectors-pinecone": "6.2.0-edge.4",
50
+ "@memberjunction/aiengine": "6.2.0-edge.4",
51
+ "@memberjunction/api-keys": "6.2.0-edge.4",
52
+ "@memberjunction/auth-providers": "6.2.0-edge.4",
53
+ "@memberjunction/clustering-engine": "6.2.0-edge.4",
54
+ "@memberjunction/codegen-lib": "6.2.0-edge.4",
55
+ "@memberjunction/communication-engine": "6.2.0-edge.4",
56
+ "@memberjunction/communication-ms-graph": "6.2.0-edge.4",
57
+ "@memberjunction/communication-sendgrid": "6.2.0-edge.4",
58
+ "@memberjunction/communication-types": "6.2.0-edge.4",
59
+ "@memberjunction/component-registry-client-sdk": "6.2.0-edge.4",
60
+ "@memberjunction/computer-use": "6.2.0-edge.4",
61
+ "@memberjunction/computer-use-engine": "6.2.0-edge.4",
62
+ "@memberjunction/config": "6.2.0-edge.4",
63
+ "@memberjunction/core": "6.2.0-edge.4",
64
+ "@memberjunction/core-actions": "6.2.0-edge.4",
65
+ "@memberjunction/core-entities": "6.2.0-edge.4",
66
+ "@memberjunction/core-entities-server": "6.2.0-edge.4",
67
+ "@memberjunction/credentials": "6.2.0-edge.4",
68
+ "@memberjunction/data-context": "6.2.0-edge.4",
69
+ "@memberjunction/data-context-server": "6.2.0-edge.4",
70
+ "@memberjunction/doc-utils": "6.2.0-edge.4",
71
+ "@memberjunction/encryption": "6.2.0-edge.4",
72
+ "@memberjunction/entity-communications-base": "6.2.0-edge.4",
73
+ "@memberjunction/entity-communications-server": "6.2.0-edge.4",
74
+ "@memberjunction/esignature": "6.2.0-edge.4",
75
+ "@memberjunction/external-change-detection": "6.2.0-edge.4",
76
+ "@memberjunction/generic-database-provider": "6.2.0-edge.4",
77
+ "@memberjunction/global": "6.2.0-edge.4",
78
+ "@memberjunction/graphql-dataprovider": "6.2.0-edge.4",
79
+ "@memberjunction/integration-engine": "6.2.0-edge.4",
80
+ "@memberjunction/integration-engine-base": "6.2.0-edge.4",
81
+ "@memberjunction/integration-progress-artifacts": "6.2.0-edge.4",
82
+ "@memberjunction/integration-schema-builder": "6.2.0-edge.4",
83
+ "@memberjunction/interactive-component-types": "6.2.0-edge.4",
84
+ "@memberjunction/lists": "6.2.0-edge.4",
85
+ "@memberjunction/lists-base": "6.2.0-edge.4",
86
+ "@memberjunction/livekit-room-server": "6.2.0-edge.4",
87
+ "@memberjunction/network-utils": "6.2.0-edge.4",
88
+ "@memberjunction/notifications": "6.2.0-edge.4",
89
+ "@memberjunction/postgresql-dataprovider": "6.2.0-edge.4",
90
+ "@memberjunction/queue": "6.2.0-edge.4",
91
+ "@memberjunction/record-cloning": "6.2.0-edge.4",
92
+ "@memberjunction/record-comparison": "6.2.0-edge.4",
93
+ "@memberjunction/redis-provider": "6.2.0-edge.4",
94
+ "@memberjunction/remote-browser-base": "6.2.0-edge.4",
95
+ "@memberjunction/remote-browser-cdp": "6.2.0-edge.4",
96
+ "@memberjunction/remote-browser-selfhost": "6.2.0-edge.4",
97
+ "@memberjunction/remote-browser-server": "6.2.0-edge.4",
98
+ "@memberjunction/scheduling-actions": "6.2.0-edge.4",
99
+ "@memberjunction/scheduling-base-types": "6.2.0-edge.4",
100
+ "@memberjunction/scheduling-engine": "6.2.0-edge.4",
101
+ "@memberjunction/scheduling-engine-base": "6.2.0-edge.4",
102
+ "@memberjunction/schema-engine": "6.2.0-edge.4",
103
+ "@memberjunction/search-engine": "6.2.0-edge.4",
104
+ "@memberjunction/server-extensions-core": "6.2.0-edge.4",
105
+ "@memberjunction/sql-dialect": "6.2.0-edge.4",
106
+ "@memberjunction/sql-parser": "6.2.0-edge.4",
107
+ "@memberjunction/sqlserver-dataprovider": "6.2.0-edge.4",
108
+ "@memberjunction/storage": "6.2.0-edge.4",
109
+ "@memberjunction/tag-engine": "6.2.0-edge.4",
110
+ "@memberjunction/tag-engine-base": "6.2.0-edge.4",
111
+ "@memberjunction/task-graph": "6.2.0-edge.4",
112
+ "@memberjunction/templates": "6.2.0-edge.4",
113
+ "@memberjunction/testing-engine": "6.2.0-edge.4",
114
+ "@memberjunction/testing-engine-base": "6.2.0-edge.4",
115
+ "@memberjunction/version-history": "6.2.0-edge.4",
116
+ "@memberjunction/work-queue-engine": "6.2.0-edge.4",
115
117
  "@octokit/auth-app": "^7.1.5",
116
118
  "@octokit/rest": "^21.1.1",
117
119
  "@types/compression": "^1.8.1",
@@ -150,7 +152,7 @@
150
152
  "zod": "^3.25.0"
151
153
  },
152
154
  "devDependencies": {
153
- "@memberjunction/conversations-runtime": "6.2.0-edge.3",
155
+ "@memberjunction/conversations-runtime": "6.2.0-edge.4",
154
156
  "@types/express": "^5.0.6",
155
157
  "pkgroll": "2.23.0",
156
158
  "rimraf": "6.1.2",
@@ -0,0 +1,353 @@
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
+ * `RunAction` is a public mutation: any authenticated principal can call it with any action ID.
7
+ * These tests pin who may run an action through it, and that the client cannot switch off the
8
+ * action execution log.
9
+ *
10
+ * Policy under test:
11
+ * - scope-limited sessions (anonymous magic-link guests, widget guests, resource-scoped links)
12
+ * are refused before anything loads;
13
+ * - an Owner may run any action, decided before anything is read;
14
+ * - any other user must hold one of the authorizations linked to the action through
15
+ * `MJ: Action Authorizations`; an action with none runs only when its class authorizes its
16
+ * caller itself (`BaseAction.AuthorizesCaller`), and is refused otherwise;
17
+ * - the links, the authorization tree and the role grants all come from the request's provider,
18
+ * or all from the global provider when the request carries none.
19
+ */
20
+ import { describe, it, expect, vi, beforeEach, type MockInstance } from 'vitest';
21
+
22
+ // As in RunDecisionResolver.test.ts: vitest's esbuild transform does not apply
23
+ // `emitDecoratorMetadata`, so the decorators are no-ops and the resolver runs as a plain class.
24
+ vi.mock('type-graphql', () => {
25
+ const noopDecorator = () => () => undefined;
26
+ return {
27
+ Resolver: noopDecorator, Mutation: noopDecorator, Query: noopDecorator, Subscription: noopDecorator,
28
+ ObjectType: noopDecorator, InputType: noopDecorator, Field: noopDecorator, Arg: noopDecorator,
29
+ Args: noopDecorator, Ctx: noopDecorator, PubSub: noopDecorator, Root: noopDecorator,
30
+ Directive: noopDecorator, Authorized: noopDecorator, UseMiddleware: noopDecorator,
31
+ createUnionType: () => class {},
32
+ AuthorizationError: class AuthorizationError extends Error {
33
+ constructor(message?: string) {
34
+ super(message);
35
+ this.name = 'AuthorizationError';
36
+ }
37
+ },
38
+ Float: class {}, Int: class {}, ID: class {},
39
+ };
40
+ });
41
+
42
+ import {
43
+ AuthorizationInfo,
44
+ AuthorizationRoleInfo,
45
+ EntityInfo,
46
+ Metadata,
47
+ RunView,
48
+ UserInfo,
49
+ UserRoleInfo,
50
+ type DatabaseProviderBase,
51
+ type IMetadataProvider,
52
+ type RunViewParams,
53
+ type RunViewResult,
54
+ } from '@memberjunction/core';
55
+ import { UserCache } from '@memberjunction/generic-database-provider';
56
+ import { MJGlobal } from '@memberjunction/global';
57
+ import { ActionEngineServer, BaseAction } from '@memberjunction/actions';
58
+ import { MJActionEntityExtended, type ActionResult, type ActionResultSimple, type RunActionParams } from '@memberjunction/actions-base';
59
+ import { ActionResolver, type RunActionInput } from '../resolvers/ActionResolver.js';
60
+ import type { AppContext, ProviderInfo, UserPayload } from '../types.js';
61
+
62
+ // ─── Fixtures ────────────────────────────────────────────────────────────────
63
+
64
+ const ACTION_ENTITY = new EntityInfo({
65
+ ID: 'entity-actions', Name: 'MJ: Actions', SchemaName: '__mj', BaseTable: 'Action', BaseView: 'vwActions',
66
+ Fields: ['ID', 'Name', 'Type', 'DriverClass'].map((field, index) => ({
67
+ ID: `entity-actions-${field}`, EntityID: 'entity-actions', Sequence: index + 1, Name: field, Entity: 'MJ: Actions',
68
+ Type: field === 'ID' ? 'uniqueidentifier' : 'nvarchar', IsPrimaryKey: field === 'ID',
69
+ })),
70
+ });
71
+
72
+ const makeAction = (fields: Pick<MJActionEntityExtended, 'ID' | 'Name'>): MJActionEntityExtended => {
73
+ const action = new MJActionEntityExtended(ACTION_ENTITY);
74
+ action.Hydrate({ Type: 'Custom', DriverClass: null, ...fields });
75
+ return action;
76
+ };
77
+
78
+ /** The "Calculate Expression" action from metadata/actions: no Action Authorization rows ship for it. */
79
+ const UNGRANTED_ACTION = makeAction({ ID: '22F9505E-3BEB-400E-A49F-A74D135C5A93', Name: 'Calculate Expression' });
80
+ /** An action an administrator linked to the "Run Audience Actions" authorization. */
81
+ const GRANTED_ACTION = makeAction({ ID: 'A11C0000-0000-4000-8000-000000000002', Name: 'Send To Audience' });
82
+ /** An action linked only to an authorization that has been switched off. */
83
+ const INACTIVE_GRANT_ACTION = makeAction({ ID: 'A11C0000-0000-4000-8000-000000000003', Name: 'Archive Audience' });
84
+ /** The Database Designer's "Create Entity" from metadata/actions: no Action Authorization rows ship for it. */
85
+ const SELF_AUTHORIZING_ACTION = makeAction({ ID: 'F4CBD4ED-C258-468B-8F50-F12E4C74A431', Name: 'Create Entity' });
86
+ /** An action an administrator linked to "Run Reports", a child of the "Reporting" authorization. */
87
+ const REPORT_ACTION = makeAction({ ID: 'A11C0000-0000-4000-8000-000000000004', Name: 'Export Report' });
88
+
89
+ /**
90
+ * Stands in for the Database Designer's Create Entity class, which checks the caller's Schema
91
+ * Management authorization itself. Registered the way `@RegisterClass` registers the real one.
92
+ */
93
+ class SelfAuthorizingCreateEntity extends BaseAction {
94
+ public static readonly AuthorizesCaller = true;
95
+ protected async InternalRunAction(): Promise<ActionResultSimple> {
96
+ return { Success: true, ResultCode: 'SUCCESS' };
97
+ }
98
+ }
99
+ MJGlobal.Instance.ClassFactory.Register(BaseAction, SelfAuthorizingCreateEntity, 'Create Entity');
100
+
101
+ const UI_ROLE_ID = 'E0AFCCEC-6A37-EF11-86D4-000D3A4E707E';
102
+ const DEVELOPER_ROLE_ID = 'DEAFCCEC-6A37-EF11-86D4-000D3A4E707E';
103
+ const OTHER_ROLE_ID = 'A11C0000-0000-4000-8000-0000000000F1';
104
+ const BLOCKED_ROLE_ID = 'A11C0000-0000-4000-8000-0000000000F2';
105
+
106
+ const AUDIENCE_AUTH = new AuthorizationInfo({ ID: 'A11C0000-0000-4000-8000-0000000000A1', Name: 'Run Audience Actions', IsActive: true });
107
+ const INACTIVE_AUTH = new AuthorizationInfo({ ID: 'A11C0000-0000-4000-8000-0000000000A2', Name: 'Archive Audiences', IsActive: false });
108
+ const REPORTING_AUTH = new AuthorizationInfo({ ID: 'A11C0000-0000-4000-8000-0000000000A3', Name: 'Reporting', IsActive: true });
109
+ const RUN_REPORTS_AUTH = new AuthorizationInfo({ ID: 'A11C0000-0000-4000-8000-0000000000A4', Name: 'Run Reports', IsActive: true, ParentID: REPORTING_AUTH.ID });
110
+
111
+ const grant = (type: 'Allow' | 'Deny', authorization: AuthorizationInfo, roleID: string): AuthorizationRoleInfo =>
112
+ new AuthorizationRoleInfo({ ID: `${type}-${authorization.ID}-${roleID}`, AuthorizationID: authorization.ID, RoleID: roleID, Type: type });
113
+
114
+ const AUTHORIZATION_ROLES = [
115
+ grant('Allow', AUDIENCE_AUTH, UI_ROLE_ID),
116
+ grant('Allow', INACTIVE_AUTH, UI_ROLE_ID),
117
+ ];
118
+
119
+ /** `MJ: Action Authorizations`, as ActionID → AuthorizationIDs. */
120
+ const ACTION_AUTHORIZATIONS: Record<string, string[]> = {
121
+ [GRANTED_ACTION.ID]: [AUDIENCE_AUTH.ID],
122
+ [INACTIVE_GRANT_ACTION.ID]: [INACTIVE_AUTH.ID],
123
+ [REPORT_ACTION.ID]: [RUN_REPORTS_AUTH.ID],
124
+ };
125
+
126
+ /** A provider's authorization tree and role grants, as a stand-in metadata provider. */
127
+ const authorizationMetadata = (authorizations: AuthorizationInfo[], grants: AuthorizationRoleInfo[]) =>
128
+ ({ Authorizations: authorizations, AuthorizationRoles: grants }) as unknown as IMetadataProvider & DatabaseProviderBase;
129
+
130
+ /** The request-scoped provider MJServer puts in the GraphQL context. */
131
+ const requestProvider = (authorizations: AuthorizationInfo[], grants: AuthorizationRoleInfo[]): ProviderInfo => ({
132
+ type: 'Read-Write',
133
+ provider: authorizationMetadata(authorizations, grants),
134
+ });
135
+
136
+ const makeUser = (fields: Pick<UserInfo, 'ID' | 'Name' | 'Email' | 'Type'>, roleIDs: string[]): UserInfo =>
137
+ new UserInfo(null, {
138
+ ...fields,
139
+ UserRoles: roleIDs.map((RoleID) => new UserRoleInfo({ UserID: fields.ID, RoleID })),
140
+ });
141
+
142
+ const UI_USER = makeUser({ ID: 'user-ui', Name: 'Pat', Email: 'pat@example.com', Type: 'User' }, [UI_ROLE_ID]);
143
+ const OTHER_USER = makeUser({ ID: 'user-other', Name: 'Sam', Email: 'sam@example.com', Type: 'User' }, [OTHER_ROLE_ID]);
144
+ const BLOCKED_UI_USER = makeUser({ ID: 'user-blocked', Name: 'Lee', Email: 'lee@example.com', Type: 'User' }, [UI_ROLE_ID, BLOCKED_ROLE_ID]);
145
+ const DEVELOPER = makeUser({ ID: 'user-dev', Name: 'Dana', Email: 'dana@example.com', Type: 'User' }, [DEVELOPER_ROLE_ID]);
146
+ // `Type` is an nchar column, so the database pads it.
147
+ const OWNER = makeUser({ ID: 'user-owner', Name: 'Olive', Email: 'olive@example.com', Type: 'Owner ' }, []);
148
+ const SYSTEM_USER = makeUser({ ID: 'user-system', Name: 'System', Email: 'system@example.com', Type: 'Owner' }, []);
149
+
150
+ const payloadFor = (user: UserInfo): UserPayload => ({ email: user.Email, userRecord: user, sessionId: `session-${user.ID}` });
151
+
152
+ /** The context the resolver reads: `userPayload` and `providers`. With no providers, it uses the global one. */
153
+ function context(user: UserInfo, providers: ProviderInfo[]): AppContext {
154
+ const partial: Pick<AppContext, 'userPayload' | 'providers'> = { userPayload: payloadFor(user), providers };
155
+ return partial as AppContext;
156
+ }
157
+
158
+ const runAction = (user: UserInfo, input: Partial<RunActionInput> & Pick<RunActionInput, 'ActionID'>, providers: ProviderInfo[] = []) =>
159
+ new ActionResolver().RunAction({ Params: [], ...input } as RunActionInput, context(user, providers));
160
+
161
+ const ENGINE_RESULT: ActionResult = { Success: true, Message: 'ran', RunParams: null, Params: [] };
162
+
163
+ let engineRun: MockInstance<ActionEngineServer['RunAction']>;
164
+ let engineConfig: MockInstance<ActionEngineServer['Config']>;
165
+ let viewRun: MockInstance<RunView['RunView']>;
166
+ let globalProvider: MockInstance<() => IMetadataProvider>;
167
+ const sentParams = (): RunActionParams => engineRun.mock.calls[0][0];
168
+
169
+ beforeEach(() => {
170
+ vi.restoreAllMocks();
171
+ engineConfig = vi.spyOn(ActionEngineServer.prototype, 'Config').mockResolvedValue(undefined);
172
+ vi.spyOn(ActionEngineServer.prototype, 'Actions', 'get').mockReturnValue([UNGRANTED_ACTION, GRANTED_ACTION, INACTIVE_GRANT_ACTION, SELF_AUTHORIZING_ACTION, REPORT_ACTION]);
173
+ engineRun = vi.spyOn(ActionEngineServer.prototype, 'RunAction').mockResolvedValue(ENGINE_RESULT);
174
+ vi.spyOn(UserCache.prototype, 'GetSystemUser').mockReturnValue(SYSTEM_USER);
175
+ globalProvider = vi.spyOn(Metadata, 'Provider', 'get').mockReturnValue(authorizationMetadata([AUDIENCE_AUTH, INACTIVE_AUTH], AUTHORIZATION_ROLES));
176
+ // No database: answer the `MJ: Action Authorizations` lookup from the fixture above.
177
+ viewRun = vi.spyOn(RunView.prototype, 'RunView').mockImplementation(async <T>(params: RunViewParams): Promise<RunViewResult<T>> => {
178
+ const actionID = Object.keys(ACTION_AUTHORIZATIONS).find((id) => typeof params.ExtraFilter === 'string' && params.ExtraFilter.includes(id));
179
+ const rows = params.EntityName === 'MJ: Action Authorizations' && actionID
180
+ ? ACTION_AUTHORIZATIONS[actionID].map((AuthorizationID) => ({ ActionID: actionID, AuthorizationID }))
181
+ : [];
182
+ return { Success: true, Results: rows as T[], RowCount: rows.length, TotalRowCount: rows.length, ExecutionTime: 0, ErrorMessage: '' };
183
+ });
184
+ });
185
+
186
+ // ─── Scope-limited sessions ──────────────────────────────────────────────────
187
+
188
+ describe('RunAction: scope-limited sessions', () => {
189
+ it.each([
190
+ ['an anonymous magic-link or widget guest', { IsMagicLinkAnonymous: true, MagicLinkScope: { ResourceID: 'widget-session-1', ResourceType: 'Widget Session' } }],
191
+ ['a resource-scoped magic-link session', { IsMagicLinkAnonymous: false, MagicLinkScope: { ResourceID: 'dashboard-1', ResourceType: 'Dashboards' } }],
192
+ ])('refuses %s before the action engine loads or runs anything', async (_label, limit) => {
193
+ const guest = Object.assign(makeUser({ ID: 'user-guest', Name: 'Guest', Email: 'guest@example.com', Type: 'User' }, [UI_ROLE_ID]), limit);
194
+
195
+ const result = await runAction(guest, { ActionID: GRANTED_ACTION.ID });
196
+
197
+ expect(result.Success).toBe(false);
198
+ expect(result.Message).toMatch(/not permitted for scope-limited sessions/);
199
+ expect(engineConfig).not.toHaveBeenCalled();
200
+ expect(engineRun).not.toHaveBeenCalled();
201
+ });
202
+ });
203
+
204
+ // ─── Per-action authorization ────────────────────────────────────────────────
205
+
206
+ describe('RunAction: per-action authorization', () => {
207
+ it('refuses an ordinary user for an action that no Action Authorization grants', async () => {
208
+ const result = await runAction(UI_USER, {
209
+ ActionID: UNGRANTED_ACTION.ID,
210
+ Params: [{ Name: 'Expression', Type: 'Input', Value: '6*7' }],
211
+ });
212
+
213
+ expect(result.Success).toBe(false);
214
+ expect(result.Message).toMatch(/not authorized to run action/i);
215
+ expect(engineRun).not.toHaveBeenCalled();
216
+ });
217
+
218
+ it('refuses a user whose roles hold none of the action\'s authorizations', async () => {
219
+ const result = await runAction(OTHER_USER, { ActionID: GRANTED_ACTION.ID });
220
+
221
+ expect(result.Success).toBe(false);
222
+ expect(result.Message).toMatch(/not authorized to run action/i);
223
+ expect(engineRun).not.toHaveBeenCalled();
224
+ });
225
+
226
+ it('refuses when the only linked authorization is inactive', async () => {
227
+ const result = await runAction(UI_USER, { ActionID: INACTIVE_GRANT_ACTION.ID });
228
+
229
+ expect(result.Success).toBe(false);
230
+ expect(engineRun).not.toHaveBeenCalled();
231
+ });
232
+
233
+ it('runs the action for a user whose role holds a linked authorization', async () => {
234
+ const result = await runAction(UI_USER, { ActionID: GRANTED_ACTION.ID });
235
+
236
+ expect(result.Success).toBe(true);
237
+ expect(sentParams().Action).toBe(GRANTED_ACTION);
238
+ expect(sentParams().ContextUser).toBe(UI_USER);
239
+ });
240
+
241
+ it('runs any action for an Owner, deciding before reading any Action Authorization', async () => {
242
+ const result = await runAction(OWNER, { ActionID: UNGRANTED_ACTION.ID });
243
+
244
+ expect(result.Success).toBe(true);
245
+ expect(sentParams().Action).toBe(UNGRANTED_ACTION);
246
+ expect(viewRun).not.toHaveBeenCalled();
247
+ });
248
+
249
+ it('runs an unlinked action whose class authorizes its caller, so the action decides: a Developer may run Create Entity', async () => {
250
+ const result = await runAction(DEVELOPER, { ActionID: SELF_AUTHORIZING_ACTION.ID });
251
+
252
+ expect(result.Success).toBe(true);
253
+ expect(sentParams().Action).toBe(SELF_AUTHORIZING_ACTION);
254
+ expect(sentParams().ContextUser).toBe(DEVELOPER);
255
+ });
256
+
257
+ it('still refuses that Developer an unlinked action whose class does not authorize its caller', async () => {
258
+ const result = await runAction(DEVELOPER, { ActionID: UNGRANTED_ACTION.ID });
259
+
260
+ expect(result.Success).toBe(false);
261
+ expect(result.Message).toMatch(/not authorized to run action/i);
262
+ expect(engineRun).not.toHaveBeenCalled();
263
+ });
264
+
265
+ it('still reports an unknown action ID as not found', async () => {
266
+ const result = await runAction(OWNER, { ActionID: 'A11C0000-0000-4000-8000-0000000000FF' });
267
+
268
+ expect(result.Success).toBe(false);
269
+ expect(result.Message).toMatch(/not found/);
270
+ expect(engineRun).not.toHaveBeenCalled();
271
+ });
272
+ });
273
+
274
+ // ─── The request's provider decides ──────────────────────────────────────────
275
+
276
+ describe('RunAction: role grants come from the request provider, not the global provider', () => {
277
+ /** Gives the global provider the same authorizations as the request, with its own role grants. */
278
+ const globalGrants = (authorizations: AuthorizationInfo[], grants: AuthorizationRoleInfo[]) =>
279
+ globalProvider.mockReturnValue(authorizationMetadata(authorizations, grants));
280
+
281
+ it('refuses when the request provider has the linked authorization but no Allow for the caller, even though the global provider has one', async () => {
282
+ globalGrants([AUDIENCE_AUTH], [grant('Allow', AUDIENCE_AUTH, UI_ROLE_ID)]);
283
+
284
+ const result = await runAction(UI_USER, { ActionID: GRANTED_ACTION.ID }, [requestProvider([AUDIENCE_AUTH], [])]);
285
+
286
+ expect(result.Success).toBe(false);
287
+ expect(result.Message).toMatch(/not authorized to run action/i);
288
+ expect(engineRun).not.toHaveBeenCalled();
289
+ });
290
+
291
+ it('runs when the request provider has an Allow for the caller and the global provider does not', async () => {
292
+ globalGrants([AUDIENCE_AUTH], []);
293
+
294
+ const result = await runAction(OTHER_USER, { ActionID: GRANTED_ACTION.ID }, [
295
+ requestProvider([AUDIENCE_AUTH], [grant('Allow', AUDIENCE_AUTH, OTHER_ROLE_ID)]),
296
+ ]);
297
+
298
+ expect(result.Success).toBe(true);
299
+ expect(sentParams().ContextUser).toBe(OTHER_USER);
300
+ });
301
+
302
+ it('refuses when the request provider denies one of the caller\'s roles, even though the global provider has only an Allow', async () => {
303
+ globalGrants([AUDIENCE_AUTH], [grant('Allow', AUDIENCE_AUTH, UI_ROLE_ID)]);
304
+
305
+ const result = await runAction(BLOCKED_UI_USER, { ActionID: GRANTED_ACTION.ID }, [
306
+ requestProvider([AUDIENCE_AUTH], [grant('Allow', AUDIENCE_AUTH, UI_ROLE_ID), grant('Deny', AUDIENCE_AUTH, BLOCKED_ROLE_ID)]),
307
+ ]);
308
+
309
+ expect(result.Success).toBe(false);
310
+ expect(result.Message).toMatch(/not authorized to run action/i);
311
+ expect(engineRun).not.toHaveBeenCalled();
312
+ });
313
+
314
+ it('runs when only the request provider grants the parent of the linked authorization', async () => {
315
+ globalGrants([REPORTING_AUTH, RUN_REPORTS_AUTH], []);
316
+
317
+ const result = await runAction(OTHER_USER, { ActionID: REPORT_ACTION.ID }, [
318
+ requestProvider([REPORTING_AUTH, RUN_REPORTS_AUTH], [grant('Allow', REPORTING_AUTH, OTHER_ROLE_ID)]),
319
+ ]);
320
+
321
+ expect(result.Success).toBe(true);
322
+ expect(sentParams().Action).toBe(REPORT_ACTION);
323
+ });
324
+
325
+ it('refuses when only the global provider grants the parent of the linked authorization', async () => {
326
+ globalGrants([REPORTING_AUTH, RUN_REPORTS_AUTH], [grant('Allow', REPORTING_AUTH, OTHER_ROLE_ID)]);
327
+
328
+ const result = await runAction(OTHER_USER, { ActionID: REPORT_ACTION.ID }, [requestProvider([REPORTING_AUTH, RUN_REPORTS_AUTH], [])]);
329
+
330
+ expect(result.Success).toBe(false);
331
+ expect(engineRun).not.toHaveBeenCalled();
332
+ });
333
+
334
+ it('reads the Action Authorization links through the request provider too', async () => {
335
+ const request = requestProvider([AUDIENCE_AUTH], [grant('Allow', AUDIENCE_AUTH, UI_ROLE_ID)]);
336
+
337
+ await runAction(UI_USER, { ActionID: GRANTED_ACTION.ID }, [request]);
338
+
339
+ const [view] = viewRun.mock.contexts;
340
+ expect(view instanceof RunView && view.ProviderToUse).toBe(request.provider);
341
+ });
342
+ });
343
+
344
+ // ─── Action execution log ────────────────────────────────────────────────────
345
+
346
+ describe('RunAction: action execution log', () => {
347
+ it('writes the execution log even when the client asks to skip it', async () => {
348
+ const result = await runAction(OWNER, { ActionID: UNGRANTED_ACTION.ID, SkipActionLog: true });
349
+
350
+ expect(result.Success).toBe(true);
351
+ expect(sentParams().SkipActionLog).toBe(false);
352
+ });
353
+ });