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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (543) hide show
  1. package/README.md +20 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +25 -0
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -0
  5. package/dist/agentSessions/BridgeHostInstance.js +30 -0
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -0
  7. package/dist/agentSessions/HostInstance.d.ts +75 -11
  8. package/dist/agentSessions/HostInstance.d.ts.map +1 -1
  9. package/dist/agentSessions/HostInstance.js +99 -28
  10. package/dist/agentSessions/HostInstance.js.map +1 -1
  11. package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
  12. package/dist/agentSessions/ReturningVisitorRecap.js +7 -3
  13. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  14. package/dist/agentSessions/SessionJanitor.d.ts +236 -27
  15. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  16. package/dist/agentSessions/SessionJanitor.js +682 -54
  17. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  18. package/dist/agentSessions/SessionManager.d.ts +48 -3
  19. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  20. package/dist/agentSessions/SessionManager.js +112 -9
  21. package/dist/agentSessions/SessionManager.js.map +1 -1
  22. package/dist/agentSessions/SessionRunIDVerifier.d.ts +63 -0
  23. package/dist/agentSessions/SessionRunIDVerifier.d.ts.map +1 -0
  24. package/dist/agentSessions/SessionRunIDVerifier.js +129 -0
  25. package/dist/agentSessions/SessionRunIDVerifier.js.map +1 -0
  26. package/dist/agentSessions/index.d.ts +2 -0
  27. package/dist/agentSessions/index.d.ts.map +1 -1
  28. package/dist/agentSessions/index.js +10 -3
  29. package/dist/agentSessions/index.js.map +1 -1
  30. package/dist/apiRoot.d.ts +32 -0
  31. package/dist/apiRoot.d.ts.map +1 -0
  32. package/dist/apiRoot.js +67 -0
  33. package/dist/apiRoot.js.map +1 -0
  34. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  35. package/dist/auth/AuthProviderCatalogRouter.js +25 -0
  36. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  37. package/dist/auth/LoginScreenEngine.d.ts +22 -0
  38. package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
  39. package/dist/auth/LoginScreenEngine.js +57 -0
  40. package/dist/auth/LoginScreenEngine.js.map +1 -0
  41. package/dist/auth/actionAuthorization.d.ts +40 -0
  42. package/dist/auth/actionAuthorization.d.ts.map +1 -0
  43. package/dist/auth/actionAuthorization.js +94 -0
  44. package/dist/auth/actionAuthorization.js.map +1 -0
  45. package/dist/auth/index.d.ts +1 -0
  46. package/dist/auth/index.d.ts.map +1 -1
  47. package/dist/auth/index.js +4 -10
  48. package/dist/auth/index.js.map +1 -1
  49. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  50. package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
  51. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  52. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  53. package/dist/auth/magicLink/MagicLinkService.js +6 -3
  54. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  55. package/dist/auth/newUsers.d.ts +10 -0
  56. package/dist/auth/newUsers.d.ts.map +1 -1
  57. package/dist/auth/newUsers.js +80 -11
  58. package/dist/auth/newUsers.js.map +1 -1
  59. package/dist/config.d.ts +2514 -22
  60. package/dist/config.d.ts.map +1 -1
  61. package/dist/config.js +166 -4
  62. package/dist/config.js.map +1 -1
  63. package/dist/context.d.ts +8 -0
  64. package/dist/context.d.ts.map +1 -1
  65. package/dist/context.js +14 -11
  66. package/dist/context.js.map +1 -1
  67. package/dist/coreRoutes.d.ts +29 -0
  68. package/dist/coreRoutes.d.ts.map +1 -0
  69. package/dist/coreRoutes.js +142 -0
  70. package/dist/coreRoutes.js.map +1 -0
  71. package/dist/generated/graphql-schemas/__mj.d.ts +504 -3
  72. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  73. package/dist/generated/graphql-schemas/__mj.js +2456 -7
  74. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  75. package/dist/generic/CacheInvalidationResolver.d.ts +43 -8
  76. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  77. package/dist/generic/CacheInvalidationResolver.js +59 -19
  78. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  79. package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
  80. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  81. package/dist/generic/PushStatusResolver.js +1 -1
  82. package/dist/generic/PushStatusResolver.js.map +1 -1
  83. package/dist/generic/ResolverBase.d.ts +123 -48
  84. package/dist/generic/ResolverBase.d.ts.map +1 -1
  85. package/dist/generic/ResolverBase.js +293 -305
  86. package/dist/generic/ResolverBase.js.map +1 -1
  87. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  88. package/dist/generic/RunViewResolver.js +16 -0
  89. package/dist/generic/RunViewResolver.js.map +1 -1
  90. package/dist/globalCors.d.ts +33 -0
  91. package/dist/globalCors.d.ts.map +1 -0
  92. package/dist/globalCors.js +58 -0
  93. package/dist/globalCors.js.map +1 -0
  94. package/dist/index.d.ts +17 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +219 -278
  97. package/dist/index.js.map +1 -1
  98. package/dist/isolatedProvider.d.ts +20 -0
  99. package/dist/isolatedProvider.d.ts.map +1 -0
  100. package/dist/isolatedProvider.js +22 -0
  101. package/dist/isolatedProvider.js.map +1 -0
  102. package/dist/multiTenancy/index.d.ts.map +1 -1
  103. package/dist/multiTenancy/index.js +22 -2
  104. package/dist/multiTenancy/index.js.map +1 -1
  105. package/dist/realtimeProxy/RealtimeProxyServer.d.ts +44 -4
  106. package/dist/realtimeProxy/RealtimeProxyServer.d.ts.map +1 -1
  107. package/dist/realtimeProxy/RealtimeProxyServer.js +121 -16
  108. package/dist/realtimeProxy/RealtimeProxyServer.js.map +1 -1
  109. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts +171 -0
  110. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts.map +1 -0
  111. package/dist/realtimeProxy/RealtimeRelayTunnel.js +532 -0
  112. package/dist/realtimeProxy/RealtimeRelayTunnel.js.map +1 -0
  113. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts +148 -0
  114. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts.map +1 -0
  115. package/dist/realtimeSessions/RealtimeSessionEventService.js +191 -0
  116. package/dist/realtimeSessions/RealtimeSessionEventService.js.map +1 -0
  117. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts +66 -0
  118. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -0
  119. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +139 -0
  120. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -0
  121. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts +38 -0
  122. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -0
  123. package/dist/realtimeSessions/RealtimeVerifyRouter.js +99 -0
  124. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -0
  125. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
  126. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
  127. package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
  128. package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
  129. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts +61 -0
  130. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -0
  131. package/dist/realtimeSessions/SessionVerificationPortsBase.js +149 -0
  132. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -0
  133. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts +57 -0
  134. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts.map +1 -0
  135. package/dist/realtimeSessions/SlidingWindowRateLimiter.js +69 -0
  136. package/dist/realtimeSessions/SlidingWindowRateLimiter.js.map +1 -0
  137. package/dist/realtimeSessions/index.d.ts +19 -0
  138. package/dist/realtimeSessions/index.d.ts.map +1 -0
  139. package/dist/realtimeSessions/index.js +19 -0
  140. package/dist/realtimeSessions/index.js.map +1 -0
  141. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +30 -0
  142. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
  143. package/dist/realtimeSessions/ownedRealtimeSession.js +47 -0
  144. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
  145. package/dist/realtimeSessions/sessionAccess.d.ts +92 -0
  146. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
  147. package/dist/realtimeSessions/sessionAccess.js +94 -0
  148. package/dist/realtimeSessions/sessionAccess.js.map +1 -0
  149. package/dist/realtimeSessions/sessionConfigStamps.d.ts +70 -0
  150. package/dist/realtimeSessions/sessionConfigStamps.d.ts.map +1 -0
  151. package/dist/realtimeSessions/sessionConfigStamps.js +93 -0
  152. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -0
  153. package/dist/realtimeSessions/subscriptionAuthorization.d.ts +65 -0
  154. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -0
  155. package/dist/realtimeSessions/subscriptionAuthorization.js +71 -0
  156. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -0
  157. package/dist/realtimeSessions/verificationCore.d.ts +243 -0
  158. package/dist/realtimeSessions/verificationCore.d.ts.map +1 -0
  159. package/dist/realtimeSessions/verificationCore.js +356 -0
  160. package/dist/realtimeSessions/verificationCore.js.map +1 -0
  161. package/dist/realtimeSessions/verificationPages.d.ts +66 -0
  162. package/dist/realtimeSessions/verificationPages.d.ts.map +1 -0
  163. package/dist/realtimeSessions/verificationPages.js +110 -0
  164. package/dist/realtimeSessions/verificationPages.js.map +1 -0
  165. package/dist/realtimeSessions/verificationPolicy.d.ts +147 -0
  166. package/dist/realtimeSessions/verificationPolicy.d.ts.map +1 -0
  167. package/dist/realtimeSessions/verificationPolicy.js +249 -0
  168. package/dist/realtimeSessions/verificationPolicy.js.map +1 -0
  169. package/dist/realtimeSessions/verificationWorkflow.d.ts +263 -0
  170. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -0
  171. package/dist/realtimeSessions/verificationWorkflow.js +435 -0
  172. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -0
  173. package/dist/realtimeWidget/widgetGuestElevation.d.ts +20 -2
  174. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  175. package/dist/realtimeWidget/widgetGuestElevation.js +31 -2
  176. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  177. package/dist/resolvers/ActionResolver.d.ts +31 -5
  178. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  179. package/dist/resolvers/ActionResolver.js +75 -14
  180. package/dist/resolvers/ActionResolver.js.map +1 -1
  181. package/dist/resolvers/AdhocQueryResolver.d.ts +14 -1
  182. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  183. package/dist/resolvers/AdhocQueryResolver.js +21 -5
  184. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  185. package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
  186. package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
  187. package/dist/resolvers/ArtifactFileResolver.js +9 -7
  188. package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
  189. package/dist/resolvers/CacheStatsResolver.d.ts +27 -0
  190. package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -1
  191. package/dist/resolvers/CacheStatsResolver.js +113 -2
  192. package/dist/resolvers/CacheStatsResolver.js.map +1 -1
  193. package/dist/resolvers/ClientToolRequestResolver.d.ts +4 -2
  194. package/dist/resolvers/ClientToolRequestResolver.d.ts.map +1 -1
  195. package/dist/resolvers/ClientToolRequestResolver.js +28 -10
  196. package/dist/resolvers/ClientToolRequestResolver.js.map +1 -1
  197. package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
  198. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  199. package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
  200. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  201. package/dist/resolvers/DatasetResolver.d.ts +24 -3
  202. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  203. package/dist/resolvers/DatasetResolver.js +57 -8
  204. package/dist/resolvers/DatasetResolver.js.map +1 -1
  205. package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
  206. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  207. package/dist/resolvers/EntityRecordNameResolver.js +3 -2
  208. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  209. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +27 -1
  210. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  211. package/dist/resolvers/FetchEntityVectorsResolver.js +148 -2
  212. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  213. package/dist/resolvers/FileResolver.d.ts +82 -11
  214. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  215. package/dist/resolvers/FileResolver.js +279 -101
  216. package/dist/resolvers/FileResolver.js.map +1 -1
  217. package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
  218. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  219. package/dist/resolvers/GetDataContextDataResolver.js +117 -38
  220. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  221. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  222. package/dist/resolvers/GetDataResolver.js +6 -3
  223. package/dist/resolvers/GetDataResolver.js.map +1 -1
  224. package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -1
  225. package/dist/resolvers/HumanHandoffResolver.js +7 -1
  226. package/dist/resolvers/HumanHandoffResolver.js.map +1 -1
  227. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  228. package/dist/resolvers/IntegrationDiscoveryResolver.js +4 -2
  229. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  230. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  231. package/dist/resolvers/MCPResolver.js +9 -4
  232. package/dist/resolvers/MCPResolver.js.map +1 -1
  233. package/dist/resolvers/QueryResolver.d.ts +2 -0
  234. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  235. package/dist/resolvers/QueryResolver.js +13 -0
  236. package/dist/resolvers/QueryResolver.js.map +1 -1
  237. package/dist/resolvers/RealtimeBridgeResolver.d.ts +54 -2
  238. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  239. package/dist/resolvers/RealtimeBridgeResolver.js +155 -10
  240. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  241. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +157 -33
  242. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  243. package/dist/resolvers/RealtimeClientSessionResolver.js +404 -116
  244. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  245. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts +61 -0
  246. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts.map +1 -0
  247. package/dist/resolvers/RealtimeSessionEventsResolver.js +130 -0
  248. package/dist/resolvers/RealtimeSessionEventsResolver.js.map +1 -0
  249. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts +85 -0
  250. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts.map +1 -0
  251. package/dist/resolvers/RealtimeSessionVerificationResolver.js +188 -0
  252. package/dist/resolvers/RealtimeSessionVerificationResolver.js.map +1 -0
  253. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
  254. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  255. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
  256. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  257. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -0
  258. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  259. package/dist/resolvers/RunAIAgentResolver.js +100 -14
  260. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  261. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  262. package/dist/resolvers/RunTemplateResolver.js +12 -11
  263. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  264. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
  265. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
  266. package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
  267. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  268. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  269. package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
  270. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  271. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  272. package/dist/resolvers/SyncDataResolver.js +6 -2
  273. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  274. package/dist/resolvers/SyncRolesUsersResolver.d.ts +2 -0
  275. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  276. package/dist/resolvers/SyncRolesUsersResolver.js +23 -6
  277. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  278. package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
  279. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  280. package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
  281. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  282. package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
  283. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  284. package/dist/resolvers/TestQuerySQLResolver.js +65 -13
  285. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  286. package/dist/resolvers/TransactionGroupResolver.d.ts +19 -2
  287. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  288. package/dist/resolvers/TransactionGroupResolver.js +102 -24
  289. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  290. package/dist/resolvers/UserAvatarResolver.d.ts +16 -0
  291. package/dist/resolvers/UserAvatarResolver.d.ts.map +1 -0
  292. package/dist/resolvers/UserAvatarResolver.js +124 -0
  293. package/dist/resolvers/UserAvatarResolver.js.map +1 -0
  294. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  295. package/dist/resolvers/UserResolver.js +2 -17
  296. package/dist/resolvers/UserResolver.js.map +1 -1
  297. package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
  298. package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
  299. package/dist/resolvers/agent-run-data-guard.js +72 -0
  300. package/dist/resolvers/agent-run-data-guard.js.map +1 -0
  301. package/dist/resolvers/agentVisionConsentAudit.d.ts +37 -0
  302. package/dist/resolvers/agentVisionConsentAudit.d.ts.map +1 -0
  303. package/dist/resolvers/agentVisionConsentAudit.js +63 -0
  304. package/dist/resolvers/agentVisionConsentAudit.js.map +1 -0
  305. package/dist/resolvers/avatarInputValidation.d.ts +40 -0
  306. package/dist/resolvers/avatarInputValidation.d.ts.map +1 -0
  307. package/dist/resolvers/avatarInputValidation.js +97 -0
  308. package/dist/resolvers/avatarInputValidation.js.map +1 -0
  309. package/dist/resolvers/currentUserRoles.d.ts +29 -0
  310. package/dist/resolvers/currentUserRoles.d.ts.map +1 -1
  311. package/dist/resolvers/currentUserRoles.js +30 -0
  312. package/dist/resolvers/currentUserRoles.js.map +1 -1
  313. package/dist/resolvers/meetings/meetingMutations.d.ts +6 -0
  314. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -1
  315. package/dist/resolvers/meetings/meetingMutations.js +21 -0
  316. package/dist/resolvers/meetings/meetingMutations.js.map +1 -1
  317. package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
  318. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
  319. package/dist/rest/RealtimeRecordingHandler.js +383 -0
  320. package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
  321. package/dist/rest/ViewOperationsHandler.d.ts +3 -1
  322. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  323. package/dist/rest/ViewOperationsHandler.js +21 -12
  324. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  325. package/dist/rest/setupRESTEndpoints.d.ts +6 -0
  326. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  327. package/dist/rest/setupRESTEndpoints.js +6 -0
  328. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  329. package/dist/serverExtensionReservedRoots.d.ts +12 -10
  330. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  331. package/dist/serverExtensionReservedRoots.js +14 -17
  332. package/dist/serverExtensionReservedRoots.js.map +1 -1
  333. package/dist/services/MJStorageBlobStore.d.ts +8 -1
  334. package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
  335. package/dist/services/MJStorageBlobStore.js +25 -19
  336. package/dist/services/MJStorageBlobStore.js.map +1 -1
  337. package/dist/services/StartTaskGraphDispatcher.js +2 -2
  338. package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
  339. package/dist/services/TaskGraphActionRunner.d.ts +5 -3
  340. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  341. package/dist/services/TaskGraphActionRunner.js +27 -5
  342. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  343. package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
  344. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  345. package/dist/services/TaskGraphAgentRunner.js +157 -9
  346. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  347. package/dist/services/TaskGraphContinuationDeliverer.d.ts +57 -4
  348. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  349. package/dist/services/TaskGraphContinuationDeliverer.js +607 -18
  350. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  351. package/dist/sharedCache.d.ts +105 -0
  352. package/dist/sharedCache.d.ts.map +1 -0
  353. package/dist/sharedCache.js +279 -0
  354. package/dist/sharedCache.js.map +1 -0
  355. package/dist/types.d.ts +6 -0
  356. package/dist/types.d.ts.map +1 -1
  357. package/dist/types.js.map +1 -1
  358. package/package.json +99 -96
  359. package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
  360. package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
  361. package/src/__tests__/BridgeHostInstance.test.ts +232 -0
  362. package/src/__tests__/ClientToolRequestResolver.test.ts +116 -0
  363. package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
  364. package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
  365. package/src/__tests__/FetchEntityVectorsResolver.test.ts +433 -0
  366. package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
  367. package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
  368. package/src/__tests__/HostInstance.test.ts +84 -0
  369. package/src/__tests__/HumanHandoffResolver.test.ts +17 -0
  370. package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
  371. package/src/__tests__/LoginScreenEngine.test.ts +86 -0
  372. package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
  373. package/src/__tests__/MeetingResolver.test.ts +75 -1
  374. package/src/__tests__/RealtimeBridgeResolver.test.ts +415 -6
  375. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
  376. package/src/__tests__/RealtimeClientSessionResolver.test.ts +682 -58
  377. package/src/__tests__/RealtimeProxyServer.test.ts +16 -1
  378. package/src/__tests__/RealtimeRelay.test.ts +876 -0
  379. package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
  380. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
  381. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
  382. package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
  383. package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
  384. package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
  385. package/src/__tests__/ResolverBase.clientOldValues.test.ts +212 -6
  386. package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
  387. package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
  388. package/src/__tests__/RunAIAgentResolver.branch.test.ts +170 -0
  389. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +6 -4
  390. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +258 -0
  391. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +166 -0
  392. package/src/__tests__/RunTemplateResolver.test.ts +132 -0
  393. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +63 -0
  394. package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
  395. package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
  396. package/src/__tests__/SessionJanitor.test.ts +1203 -21
  397. package/src/__tests__/SessionManager.test.ts +240 -17
  398. package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
  399. package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
  400. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
  401. package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
  402. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +403 -22
  403. package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
  404. package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
  405. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
  406. package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
  407. package/src/__tests__/UserAvatarResolver.test.ts +255 -0
  408. package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
  409. package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
  410. package/src/__tests__/actionAuthorization.test.ts +130 -0
  411. package/src/__tests__/agent-run-data-guard.test.ts +130 -0
  412. package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
  413. package/src/__tests__/apiRootBoot.test.ts +202 -0
  414. package/src/__tests__/avatarInputValidation.test.ts +160 -0
  415. package/src/__tests__/cacheInvalidationRecordData.test.ts +64 -0
  416. package/src/__tests__/conversationRunEvents.test.ts +56 -14
  417. package/src/__tests__/globalCors.test.ts +217 -0
  418. package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
  419. package/src/__tests__/magicLinkService.consume.test.ts +6 -0
  420. package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -0
  421. package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
  422. package/src/__tests__/multiTenancy.security.test.ts +51 -0
  423. package/src/__tests__/multiTenancy.test.ts +1 -1
  424. package/src/__tests__/newUsers.template.test.ts +151 -0
  425. package/src/__tests__/newUsers.test.ts +74 -5
  426. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +17 -2
  427. package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
  428. package/src/__tests__/pushStatusResolver.filter.test.ts +7 -0
  429. package/src/__tests__/realtimeRecordingHandler.test.ts +652 -0
  430. package/src/__tests__/realtimeSessions/RealtimeSessionEventService.test.ts +201 -0
  431. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +215 -0
  432. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationResolver.test.ts +102 -0
  433. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationService.test.ts +349 -0
  434. package/src/__tests__/realtimeSessions/RealtimeVerifyRouter.test.ts +131 -0
  435. package/src/__tests__/realtimeSessions/SlidingWindowRateLimiter.test.ts +56 -0
  436. package/src/__tests__/realtimeSessions/helpers.ts +4 -0
  437. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +129 -0
  438. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +124 -0
  439. package/src/__tests__/realtimeSessions/verificationCore.test.ts +355 -0
  440. package/src/__tests__/realtimeSessions/verificationPages.test.ts +84 -0
  441. package/src/__tests__/realtimeSessions/verificationPolicy.test.ts +226 -0
  442. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +633 -0
  443. package/src/__tests__/resolverBase.fls.test.ts +87 -4
  444. package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
  445. package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -96
  446. package/src/__tests__/sharedCache.test.ts +312 -0
  447. package/src/__tests__/widgetGuestElevation.test.ts +44 -0
  448. package/src/agentSessions/BridgeHostInstance.ts +32 -0
  449. package/src/agentSessions/HostInstance.ts +124 -28
  450. package/src/agentSessions/ReturningVisitorRecap.ts +7 -3
  451. package/src/agentSessions/SessionJanitor.ts +821 -59
  452. package/src/agentSessions/SessionManager.ts +138 -26
  453. package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
  454. package/src/agentSessions/index.ts +10 -3
  455. package/src/apiRoot.ts +78 -0
  456. package/src/auth/AuthProviderCatalogRouter.ts +26 -0
  457. package/src/auth/LoginScreenEngine.ts +50 -0
  458. package/src/auth/actionAuthorization.ts +116 -0
  459. package/src/auth/index.ts +4 -8
  460. package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
  461. package/src/auth/magicLink/MagicLinkService.ts +6 -3
  462. package/src/auth/newUsers.ts +99 -11
  463. package/src/config.ts +171 -5
  464. package/src/context.ts +15 -10
  465. package/src/coreRoutes.ts +166 -0
  466. package/src/generated/graphql-schemas/__mj.ts +1815 -57
  467. package/src/generic/CacheInvalidationResolver.ts +73 -18
  468. package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
  469. package/src/generic/PushStatusResolver.ts +1 -1
  470. package/src/generic/ResolverBase.ts +335 -326
  471. package/src/generic/RunViewResolver.ts +21 -0
  472. package/src/globalCors.ts +71 -0
  473. package/src/index.ts +231 -300
  474. package/src/isolatedProvider.ts +22 -0
  475. package/src/multiTenancy/index.ts +24 -2
  476. package/src/realtimeProxy/RealtimeProxyServer.ts +148 -16
  477. package/src/realtimeProxy/RealtimeRelayTunnel.ts +645 -0
  478. package/src/realtimeSessions/README.md +179 -0
  479. package/src/realtimeSessions/RealtimeSessionEventService.ts +274 -0
  480. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +168 -0
  481. package/src/realtimeSessions/RealtimeVerifyRouter.ts +109 -0
  482. package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
  483. package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
  484. package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
  485. package/src/realtimeSessions/index.ts +18 -0
  486. package/src/realtimeSessions/ownedRealtimeSession.ts +55 -0
  487. package/src/realtimeSessions/sessionAccess.ts +145 -0
  488. package/src/realtimeSessions/sessionConfigStamps.ts +123 -0
  489. package/src/realtimeSessions/subscriptionAuthorization.ts +116 -0
  490. package/src/realtimeSessions/verificationCore.ts +502 -0
  491. package/src/realtimeSessions/verificationPages.ts +149 -0
  492. package/src/realtimeSessions/verificationPolicy.ts +321 -0
  493. package/src/realtimeSessions/verificationWorkflow.ts +702 -0
  494. package/src/realtimeWidget/widgetGuestElevation.ts +34 -2
  495. package/src/resolvers/ActionResolver.ts +84 -21
  496. package/src/resolvers/AdhocQueryResolver.ts +24 -6
  497. package/src/resolvers/ArtifactFileResolver.ts +9 -8
  498. package/src/resolvers/CacheStatsResolver.ts +89 -2
  499. package/src/resolvers/ClientToolRequestResolver.ts +25 -7
  500. package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
  501. package/src/resolvers/DatasetResolver.ts +70 -10
  502. package/src/resolvers/EntityRecordNameResolver.ts +3 -2
  503. package/src/resolvers/FetchEntityVectorsResolver.ts +179 -2
  504. package/src/resolvers/FileResolver.ts +321 -106
  505. package/src/resolvers/GetDataContextDataResolver.ts +139 -41
  506. package/src/resolvers/GetDataResolver.ts +6 -3
  507. package/src/resolvers/HumanHandoffResolver.ts +8 -0
  508. package/src/resolvers/IntegrationDiscoveryResolver.ts +4 -2
  509. package/src/resolvers/MCPResolver.ts +8 -5
  510. package/src/resolvers/QueryResolver.ts +11 -0
  511. package/src/resolvers/RealtimeBridgeResolver.ts +163 -11
  512. package/src/resolvers/RealtimeClientSessionResolver.ts +511 -129
  513. package/src/resolvers/RealtimeSessionEventsResolver.ts +133 -0
  514. package/src/resolvers/RealtimeSessionVerificationResolver.ts +174 -0
  515. package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
  516. package/src/resolvers/RunAIAgentResolver.ts +116 -14
  517. package/src/resolvers/RunTemplateResolver.ts +13 -12
  518. package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
  519. package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
  520. package/src/resolvers/SyncDataResolver.ts +6 -2
  521. package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
  522. package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
  523. package/src/resolvers/TestQuerySQLResolver.ts +68 -13
  524. package/src/resolvers/TransactionGroupResolver.ts +131 -27
  525. package/src/resolvers/UserAvatarResolver.ts +111 -0
  526. package/src/resolvers/UserResolver.ts +2 -16
  527. package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
  528. package/src/resolvers/agent-run-data-guard.ts +89 -0
  529. package/src/resolvers/agentVisionConsentAudit.ts +82 -0
  530. package/src/resolvers/avatarInputValidation.ts +123 -0
  531. package/src/resolvers/currentUserRoles.ts +32 -1
  532. package/src/resolvers/meetings/meetingMutations.ts +21 -0
  533. package/src/rest/RealtimeRecordingHandler.ts +464 -0
  534. package/src/rest/ViewOperationsHandler.ts +29 -13
  535. package/src/rest/setupRESTEndpoints.ts +6 -0
  536. package/src/serverExtensionReservedRoots.ts +14 -17
  537. package/src/services/MJStorageBlobStore.ts +31 -30
  538. package/src/services/StartTaskGraphDispatcher.ts +2 -2
  539. package/src/services/TaskGraphActionRunner.ts +25 -5
  540. package/src/services/TaskGraphAgentRunner.ts +188 -11
  541. package/src/services/TaskGraphContinuationDeliverer.ts +713 -17
  542. package/src/sharedCache.ts +305 -0
  543. package/src/types.ts +7 -0
@@ -8,6 +8,7 @@ import {
8
8
  RequireContextUser,
9
9
  RequireLoadedUser,
10
10
  RequireRoleProvider,
11
+ SessionUserFields,
11
12
  UserIdExtraFilter,
12
13
  } from './currentUserRoles.js';
13
14
 
@@ -42,22 +43,7 @@ export class UserResolver extends MJUserResolverBase {
42
43
 
43
44
  if (context.userPayload.userRecord) {
44
45
  const userRecord = context.userPayload.userRecord;
45
- const userData = {
46
- ID: userRecord.ID,
47
- Name: userRecord.Name,
48
- FirstName: userRecord.FirstName,
49
- LastName: userRecord.LastName,
50
- Title: userRecord.Title,
51
- Email: userRecord.Email,
52
- Type: userRecord.Type,
53
- IsActive: userRecord.IsActive,
54
- LinkedRecordType: userRecord.LinkedRecordType,
55
- EmployeeID: userRecord.EmployeeID,
56
- LinkedEntityID: userRecord.LinkedEntityID,
57
- LinkedEntityRecordID: userRecord.LinkedEntityRecordID,
58
- __mj_CreatedAt: userRecord.__mj_CreatedAt,
59
- __mj_UpdatedAt: userRecord.__mj_UpdatedAt,
60
- };
46
+ const userData = SessionUserFields(userRecord);
61
47
  console.log('CurrentUser (from userRecord)', userData.Email);
62
48
  const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true });
63
49
  const mapped = await this.MapFieldNamesToCodeNames('MJ: Users', userData, userRecord, provider) as MJUser_;
@@ -0,0 +1,95 @@
1
+ // type-graphql decorators on the resolver class need the reflect-metadata polyfill.
2
+ import 'reflect-metadata';
3
+
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import type { MockInstance } from 'vitest';
6
+ import { SQLExpressionValidator } from '@memberjunction/global';
7
+
8
+ const { executedSQL } = vi.hoisted(() => ({ executedSQL: [] as string[] }));
9
+
10
+ // GetData's server bootstrap, provider, auth and driver imports are replaced so the resolver runs
11
+ // offline. The fake driver records every text it is asked to run.
12
+ vi.mock('../../index.js', () => ({ GetDbType: () => 'sqlserver' }));
13
+ vi.mock('@memberjunction/generic-database-provider', () => ({
14
+ QueryCompositionEngine: class {
15
+ HasCompositionTokens(): boolean {
16
+ return false;
17
+ }
18
+ },
19
+ }));
20
+ vi.mock('../../util.js', () => ({ GetReadOnlyDataSource: () => ({}), GetReadOnlyProvider: () => null }));
21
+ vi.mock('../../auth/index.js', () => ({ GetSystemUser: async () => ({}) }));
22
+ vi.mock('mssql', () => ({
23
+ default: {
24
+ Request: class {
25
+ async query(text: string): Promise<{ recordset: Array<Record<string, unknown>> }> {
26
+ executedSQL.push(text);
27
+ return { recordset: [] };
28
+ }
29
+ },
30
+ },
31
+ }));
32
+
33
+ import { GetDataResolver, GetDataInputType, GetDataOutputType, RegisterAccessToken } from '../GetDataResolver.js';
34
+ import type { AppContext } from '../../types.js';
35
+
36
+ const CONTEXT = { dataSources: [] } as unknown as AppContext;
37
+
38
+ let tokenSeq = 0;
39
+
40
+ /** Calls GetData with a fresh valid token. */
41
+ async function runGetData(queries: string[]): Promise<GetDataOutputType> {
42
+ const token = `getdata-validation-${Date.now()}-${++tokenSeq}`;
43
+ RegisterAccessToken(token, 60_000);
44
+ const input = Object.assign(new GetDataInputType(), { Token: token, Queries: queries });
45
+ return new GetDataResolver().GetData(input, CONTEXT);
46
+ }
47
+
48
+ /** The text of every call to the validator's `validate` method. */
49
+ function validatedTexts(spy: MockInstance<SQLExpressionValidator['validate']>): string[] {
50
+ return spy.mock.calls.map(([text]) => text);
51
+ }
52
+
53
+ describe('GetData runs exactly the SQL it validated', () => {
54
+ beforeEach(() => {
55
+ executedSQL.length = 0;
56
+ });
57
+
58
+ it('validates and runs the same text when the query contains backslash sequences', async () => {
59
+ const query = String.raw`SELECT Name FROM __mj.vwFiles WHERE Path = 'C:\new\temp'`;
60
+ const validateSpy = vi.spyOn(SQLExpressionValidator.Instance, 'validate');
61
+
62
+ const output = await runGetData([query]);
63
+
64
+ expect(output.ErrorMessages).toEqual([null]);
65
+ expect(executedSQL).toEqual(validatedTexts(validateSpy));
66
+ expect(executedSQL).toEqual([query]);
67
+ expect(validateSpy).toHaveBeenCalledWith(query, { context: 'full_query', Dialect: 'sqlserver' });
68
+ });
69
+
70
+ it('runs the trimmed text that the validator reads', async () => {
71
+ const validateSpy = vi.spyOn(SQLExpressionValidator.Instance, 'validate');
72
+
73
+ const output = await runGetData(['\n SELECT 1 AS One \n']);
74
+
75
+ expect(output.ErrorMessages).toEqual([null]);
76
+ expect(executedSQL).toEqual(['SELECT 1 AS One']);
77
+ expect(validatedTexts(validateSpy)).toEqual(executedSQL);
78
+ });
79
+
80
+ it('refuses a query whose text, as written, does not open with SELECT or WITH', async () => {
81
+ const output = await runGetData(["-- note\\n SELECT 1\nPRINT 'hello'"]);
82
+
83
+ expect(executedSQL).toEqual([]);
84
+ expect(output.Success).toBe(false);
85
+ expect(output.ErrorMessages[0]).toMatch(/must start with SELECT or WITH/);
86
+ });
87
+
88
+ it('does not run a refused query and still runs the others', async () => {
89
+ const output = await runGetData(['SELECT 1; SELECT 2', 'SELECT 1 AS One']);
90
+
91
+ expect(executedSQL).toEqual(['SELECT 1 AS One']);
92
+ expect(output.ErrorMessages[0]).toMatch(/Semicolons are not allowed/);
93
+ expect(output.ErrorMessages[1]).toBeNull();
94
+ });
95
+ });
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @fileoverview Decides which callers of the agent-run resolvers may set a run's scope or agent-type parameters
3
+ * through the free-form `data` argument.
4
+ *
5
+ * `BaseAgent` and `AgentRunner` read a few `ExecuteAgentParams.data` keys (`RESERVED_AGENT_RUN_DATA_KEYS` in
6
+ * `@memberjunction/ai-core-plus`) as fallbacks that change what a run is, not just what its prompt says:
7
+ * - `PrimaryScopeEntityName`, `PrimaryScopeRecordID`, `SecondaryScopes` decide the run's scope: which
8
+ * notes and examples memory is injected, the pre-execution RAG search context, the scoped prompt parts
9
+ * and run settings, the scope columns written on the `MJ: AI Agent Runs` row, and what sub-agents
10
+ * inherit. On a widget-guest run an explicit scope also beats the returning-visitor scope.
11
+ * - `__agentTypePromptParams` is the highest-precedence agent-type parameter layer. It can turn on the
12
+ * Loop type's `enableTaskGraphs` capability, and switch decisions on or off.
13
+ *
14
+ * The rule lives with the run, not here: `BaseAgent.Execute` drops those keys from every run's `data` unless the
15
+ * params set `ExecuteAgentParams.TrustReservedRunData`. The resolvers set that marker for the callers
16
+ * {@link IsTrustedAgentRunCaller} accepts — the system user, and an `mj_sk_*` API key that holds the
17
+ * {@link TRUSTED_RUN_DATA_SCOPE} scope — and never for a browser or a widget guest. Any user who may create API
18
+ * keys can mint one for themselves, so a key alone is not enough: an administrator grants the scope. Explorer never
19
+ * sends these keys. Everything else in `data` (template data, `conversationId`, `appContext`, `clientTools`, ...)
20
+ * reaches the run unchanged either way.
21
+ *
22
+ * @module @memberjunction/server/resolvers
23
+ */
24
+ import { LogError } from '@memberjunction/core';
25
+ import { GetAPIKeyEngine } from '@memberjunction/api-keys';
26
+ import { UserCache } from '@memberjunction/generic-database-provider';
27
+ import type { UserPayload } from '../types.js';
28
+
29
+ /**
30
+ * The API-key scope (`MJ: API Scopes.FullPath`) that makes an `mj_sk_*` key a trusted integration for reserved run
31
+ * data. Checked against the agent being run, so a key can be trusted for some agents only. `full_access` does not
32
+ * imply it: the key must hold this scope itself.
33
+ */
34
+ export const TRUSTED_RUN_DATA_SCOPE = 'agent:trusted';
35
+
36
+ /** Who sent a run's `data`, as far as {@link IsTrustedAgentRunCaller} needs to know. */
37
+ export interface ClientAgentRunCaller {
38
+ /**
39
+ * The request's authenticated payload, BEFORE any widget-guest elevation. `isSystemUser` is set only by
40
+ * the system API key (and by widget elevation, which {@link IsWidgetGuestRun} overrides); `apiKeyHash`
41
+ * only by an `mj_sk_*` user API key.
42
+ */
43
+ UserPayload: Pick<UserPayload, 'email' | 'isSystemUser' | 'apiKeyHash'>;
44
+ /** True when the run executes under the widget-guest elevated principal. Such a run is never trusted. */
45
+ IsWidgetGuestRun: boolean;
46
+ /** The agent the caller asked to run: the resource the {@link TRUSTED_RUN_DATA_SCOPE} check is made against. */
47
+ AgentID: string;
48
+ }
49
+
50
+ /**
51
+ * Whether a caller may set the reserved run-data keys — the value the agent-run resolvers pass as
52
+ * `ExecuteAgentParams.TrustReservedRunData`: the system user, or an API key that holds
53
+ * {@link TRUSTED_RUN_DATA_SCOPE} for this agent, and never a widget-guest run, whatever principal it was elevated to.
54
+ * A key without the scope is treated like the browser session of the user it belongs to.
55
+ *
56
+ * @param caller - Who sent the run's `data`.
57
+ * @returns `true` when the run may read the reserved keys from `data`.
58
+ */
59
+ export async function IsTrustedAgentRunCaller(caller: ClientAgentRunCaller): Promise<boolean> {
60
+ if (caller.IsWidgetGuestRun) {
61
+ return false;
62
+ }
63
+ if (caller.UserPayload.isSystemUser === true) {
64
+ return true;
65
+ }
66
+ const apiKeyHash = caller.UserPayload.apiKeyHash;
67
+ return apiKeyHash ? keyHoldsTrustedRunDataScope(apiKeyHash, caller.AgentID) : false;
68
+ }
69
+
70
+ /**
71
+ * Whether the key explicitly holds {@link TRUSTED_RUN_DATA_SCOPE} for the agent. A key-level rule must match: an
72
+ * allow that comes from scope enforcement being switched off, or from `defaultBehaviorNoScopes: 'allow'`, matches
73
+ * no rule and does not count. Any failure counts as not held.
74
+ */
75
+ async function keyHoldsTrustedRunDataScope(apiKeyHash: string, agentID: string): Promise<boolean> {
76
+ try {
77
+ const systemUser = UserCache.Instance.GetSystemUser();
78
+ if (!systemUser) {
79
+ return false;
80
+ }
81
+ // A probe, not an access decision (the run goes ahead either way), so it is not written to the usage log.
82
+ const result = await GetAPIKeyEngine().Authorize(apiKeyHash, 'MJAPI', TRUSTED_RUN_DATA_SCOPE, agentID, systemUser,
83
+ { endpoint: '/graphql', method: 'POST' }, { skipLogging: true });
84
+ return result.Allowed && result.MatchedKeyRule != null;
85
+ } catch (e) {
86
+ LogError(`IsTrustedAgentRunCaller: the ${TRUSTED_RUN_DATA_SCOPE} check failed; the run is not trusted: ${e}`);
87
+ return false;
88
+ }
89
+ }
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @fileoverview The audit trail for agent-vision consent: one `MJ: Audit Logs` row each time a person allows, or stops
3
+ * letting, agents see their camera and shared screen in a meeting room, including when LiveKit refuses the change.
4
+ *
5
+ * The row is saved by the system user, as MJ's other server-written audit rows are, because the person may not be
6
+ * allowed to create audit rows themselves; `UserID` and `RecordID` are the person. When the audit log type has not
7
+ * been seeded, the entry goes to the server log instead, so a choice is never left unrecorded.
8
+ *
9
+ * Invoked from `RealtimeBridgeResolver.SetLiveKitAgentVision`.
10
+ *
11
+ * @module @memberjunction/server
12
+ */
13
+
14
+ import { LogError, type IMetadataProvider, type UserInfo } from '@memberjunction/core';
15
+ import type { MJAuditLogEntity } from '@memberjunction/core-entities';
16
+ import { UserCache } from '@memberjunction/generic-database-provider';
17
+
18
+ /** The seeded audit log type (see `metadata/audit-log-types/.realtime-session-audit-types.json`). */
19
+ export const REALTIME_AGENT_VISION_CONSENT_AUDIT_TYPE = 'Realtime Agent Vision Consent';
20
+
21
+ const AUDIT_LOG_ENTITY = 'MJ: Audit Logs';
22
+ const USERS_ENTITY = 'MJ: Users';
23
+
24
+ /** One consent change to record. */
25
+ export interface AgentVisionConsentEntry {
26
+ /** The person who chose. */
27
+ User: UserInfo;
28
+ /** The room they chose for. */
29
+ RoomName: string;
30
+ /** `true` to let agents see their camera and shared screen, `false` to stop. */
31
+ Allow: boolean;
32
+ /** Whether LiveKit applied the change. */
33
+ Applied: boolean;
34
+ /** Why it was not applied. */
35
+ ErrorMessage?: string;
36
+ }
37
+
38
+ /**
39
+ * Writes the audit row for one consent change. Never throws: a failure to audit is logged, and the person's choice
40
+ * stands as LiveKit applied it.
41
+ *
42
+ * @param entry The change to record.
43
+ * @param provider The request's provider.
44
+ */
45
+ export async function WriteAgentVisionConsentAudit(entry: AgentVisionConsentEntry, provider: IMetadataProvider | null): Promise<void> {
46
+ try {
47
+ const writer = UserCache.Instance.GetSystemUser();
48
+ const type = provider?.AuditLogTypes?.find((t) => t.Name?.trim().toLowerCase() === REALTIME_AGENT_VISION_CONSENT_AUDIT_TYPE.toLowerCase());
49
+ if (!provider || !writer || !type) {
50
+ LogError(`Agent vision consent not audited (${missingReason(provider, writer)}): user ${entry.User.ID}: ${describeChange(entry)}`);
51
+ return;
52
+ }
53
+ const row = await provider.GetEntityObject<MJAuditLogEntity>(AUDIT_LOG_ENTITY, writer);
54
+ row.NewRecord();
55
+ row.UserID = entry.User.ID;
56
+ row.AuditLogTypeID = type.ID;
57
+ row.Status = entry.Applied ? 'Success' : 'Failed';
58
+ row.EntityID = provider.EntityByName(USERS_ENTITY)?.ID ?? null;
59
+ row.RecordID = entry.User.ID;
60
+ row.Description = describeChange(entry);
61
+ row.Details = JSON.stringify({ roomName: entry.RoomName, allow: entry.Allow, error: entry.ErrorMessage ?? null });
62
+ if (!(await row.Save())) {
63
+ LogError(`Agent vision consent audit row not saved for user ${entry.User.ID}: ${row.LatestResult?.CompleteMessage ?? 'unknown error'}`);
64
+ }
65
+ } catch (error) {
66
+ LogError(`Agent vision consent audit write threw for user ${entry.User.ID}: ${error instanceof Error ? error.message : String(error)}`);
67
+ }
68
+ }
69
+
70
+ /** Why the audit row can't be written: no provider, no system user, or the audit log type isn't seeded. */
71
+ function missingReason(provider: IMetadataProvider | null, writer: UserInfo | undefined | null): string {
72
+ if (!provider) {
73
+ return 'no provider';
74
+ }
75
+ return writer ? `audit log type '${REALTIME_AGENT_VISION_CONSENT_AUDIT_TYPE}' is not seeded` : 'no system user';
76
+ }
77
+
78
+ /** One line saying what the person chose, and whether it was applied. */
79
+ function describeChange(entry: AgentVisionConsentEntry): string {
80
+ const choice = entry.Allow ? 'Let agents see their camera and shared screen' : 'Stopped letting agents see their camera and shared screen';
81
+ return `${choice} in room ${entry.RoomName}${entry.Applied ? '' : ' (not applied)'}.`;
82
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @fileoverview Trust-boundary validation for the self-service avatar mutation
3
+ * (`UpdateMyAvatar` in `UserAvatarResolver`).
4
+ *
5
+ * The browser checks these values too, but its URL check is `new URL(...)`, which happily accepts
6
+ * `javascript:` and every `data:` type. The server is the boundary, so everything that reaches
7
+ * `MJ: Users.UserImageURL` / `UserImageIconClass` through the mutation passes through here first.
8
+ *
9
+ * Pure: no I/O, no provider, no entity — so it is unit-testable on its own.
10
+ *
11
+ * @module @memberjunction/server/resolvers/avatarInputValidation
12
+ */
13
+
14
+ /** Largest DECODED image accepted in a `data:` URI. Matches the Explorer upload cap. */
15
+ export const AVATAR_MAX_IMAGE_BYTES = 200 * 1024;
16
+
17
+ /** Longest `http:` / `https:` image URL accepted. */
18
+ export const AVATAR_MAX_URL_LENGTH = 2048;
19
+
20
+ /** Longest icon class string accepted. */
21
+ export const AVATAR_MAX_ICON_CLASS_LENGTH = 100;
22
+
23
+ /**
24
+ * Longest `data:` value that can still decode to {@link AVATAR_MAX_IMAGE_BYTES}: the longest accepted
25
+ * prefix plus the padded base64 payload. Anything longer is refused before the pattern scans it.
26
+ */
27
+ const AVATAR_MAX_DATA_URI_LENGTH = 'data:image/jpeg;base64,'.length + Math.ceil(AVATAR_MAX_IMAGE_BYTES / 3) * 4;
28
+
29
+ /** `data:image/<raster type>;base64,<payload>` — SVG is deliberately absent (it can carry script). */
30
+ const DATA_URI_PATTERN = /^data:image\/(png|jpeg|jpg|gif|webp);base64,([A-Za-z0-9+/]+={0,2})$/;
31
+
32
+ /** Lower-case Font Awesome class lists only, e.g. `fa-solid fa-user`. */
33
+ const ICON_CLASS_PATTERN = /^[a-z0-9 -]+$/;
34
+ const FA_TOKEN_PATTERN = /^fa-[a-z0-9-]+$/;
35
+
36
+ /** The outcome of {@link ValidateAvatarInput}. Empty strings are normalised to `null` (clear). */
37
+ export interface AvatarInputValidationResult {
38
+ Valid: boolean;
39
+ /** Why the input was refused. Set only when `Valid` is false. */
40
+ ErrorMessage?: string;
41
+ /** The value to store in `UserImageURL`; `null` clears it. */
42
+ ImageURL: string | null;
43
+ /** The value to store in `UserImageIconClass`; `null` clears it. */
44
+ IconClass: string | null;
45
+ }
46
+
47
+ /**
48
+ * Validates a requested avatar. Null or empty values clear the corresponding column, so both
49
+ * null is a valid "revert to default".
50
+ *
51
+ * - `imageURL`: a `data:image/(png|jpeg|jpg|gif|webp);base64,...` URI whose decoded size is at most
52
+ * {@link AVATAR_MAX_IMAGE_BYTES}, or an absolute `http:`/`https:` URL of at most
53
+ * {@link AVATAR_MAX_URL_LENGTH} characters with no whitespace. Everything else is refused.
54
+ * - `iconClass`: at most {@link AVATAR_MAX_ICON_CLASS_LENGTH} characters of `[a-z0-9 -]`,
55
+ * containing at least one `fa-` token.
56
+ */
57
+ export function ValidateAvatarInput(
58
+ imageURL: string | null | undefined,
59
+ iconClass: string | null | undefined
60
+ ): AvatarInputValidationResult {
61
+ const image = imageURL ? imageURL : null;
62
+ const icon = iconClass ? iconClass : null;
63
+ const error = (image === null ? undefined : imageUrlError(image)) ?? (icon === null ? undefined : iconClassError(icon));
64
+ return error ? { Valid: false, ErrorMessage: error, ImageURL: null, IconClass: null } : { Valid: true, ImageURL: image, IconClass: icon };
65
+ }
66
+
67
+ /** Returns why an image value is refused, or `undefined` when it is acceptable. */
68
+ function imageUrlError(value: string): string | undefined {
69
+ if (value.startsWith('data:')) {
70
+ return dataUriError(value);
71
+ }
72
+ return httpUrlError(value);
73
+ }
74
+
75
+ function dataUriError(value: string): string | undefined {
76
+ if (value.length > AVATAR_MAX_DATA_URI_LENGTH) {
77
+ return tooLargeError(Math.floor((value.length * 3) / 4));
78
+ }
79
+ const match = DATA_URI_PATTERN.exec(value);
80
+ if (!match || match[2].length % 4 !== 0) {
81
+ return 'Avatar image must be a base64 PNG, JPEG, GIF or WEBP data URI.';
82
+ }
83
+ const decodedBytes = decodedBase64Length(match[2]);
84
+ return decodedBytes > AVATAR_MAX_IMAGE_BYTES ? tooLargeError(decodedBytes) : undefined;
85
+ }
86
+
87
+ function tooLargeError(bytes: number): string {
88
+ return `Avatar image must be ${AVATAR_MAX_IMAGE_BYTES / 1024}KB or smaller (this one is about ${Math.ceil(bytes / 1024)}KB).`;
89
+ }
90
+
91
+ /** Decoded byte length of a padded base64 string, without decoding it. */
92
+ function decodedBase64Length(base64: string): number {
93
+ const padding = base64.endsWith('==') ? 2 : base64.endsWith('=') ? 1 : 0;
94
+ return (base64.length / 4) * 3 - padding;
95
+ }
96
+
97
+ function httpUrlError(value: string): string | undefined {
98
+ const refusal = 'Avatar image URL must be an absolute http or https URL.';
99
+ if (value.length > AVATAR_MAX_URL_LENGTH) {
100
+ return `Avatar image URL must be ${AVATAR_MAX_URL_LENGTH} characters or fewer.`;
101
+ }
102
+ if (/\s/.test(value) || !/^https?:\/\//i.test(value)) {
103
+ return refusal;
104
+ }
105
+ try {
106
+ const url = new URL(value);
107
+ return url.protocol === 'http:' || url.protocol === 'https:' ? undefined : refusal;
108
+ } catch {
109
+ return refusal;
110
+ }
111
+ }
112
+
113
+ /** Returns why an icon class is refused, or `undefined` when it is acceptable. */
114
+ function iconClassError(value: string): string | undefined {
115
+ const valid =
116
+ value.length <= AVATAR_MAX_ICON_CLASS_LENGTH &&
117
+ ICON_CLASS_PATTERN.test(value) &&
118
+ value.split(' ').some((token) => FA_TOKEN_PATTERN.test(token));
119
+ return valid
120
+ ? undefined
121
+ : `Avatar icon must be a Font Awesome class list (lower-case letters, digits, spaces and hyphens, ` +
122
+ `${AVATAR_MAX_ICON_CLASS_LENGTH} characters or fewer, including an fa- class).`;
123
+ }
@@ -1,4 +1,4 @@
1
- import { LogError } from '@memberjunction/core';
1
+ import { LogError, UserInfo } from '@memberjunction/core';
2
2
 
3
3
  /**
4
4
  * Guards and filter builders for CurrentUser role loading.
@@ -6,6 +6,37 @@ import { LogError } from '@memberjunction/core';
6
6
  * without importing generated GraphQL types or the Apollo config bootstrap.
7
7
  */
8
8
 
9
+ /**
10
+ * The session user's own fields, as CurrentUser returns them. The client asks for every field of
11
+ * `UserInfo` (GraphQLDataProvider builds its query from it), so each one belongs here; anything
12
+ * left out reaches the client as null (as IsTemplate once did, hiding the template-user banner).
13
+ */
14
+ export function SessionUserFields(userRecord: UserInfo) {
15
+ return {
16
+ ID: userRecord.ID,
17
+ Name: userRecord.Name,
18
+ FirstName: userRecord.FirstName,
19
+ LastName: userRecord.LastName,
20
+ Title: userRecord.Title,
21
+ Email: userRecord.Email,
22
+ Type: userRecord.Type,
23
+ IsActive: userRecord.IsActive,
24
+ IsTemplate: userRecord.IsTemplate,
25
+ LinkedRecordType: userRecord.LinkedRecordType,
26
+ EmployeeID: userRecord.EmployeeID,
27
+ LinkedEntityID: userRecord.LinkedEntityID,
28
+ LinkedEntityRecordID: userRecord.LinkedEntityRecordID,
29
+ __mj_CreatedAt: userRecord.__mj_CreatedAt,
30
+ __mj_UpdatedAt: userRecord.__mj_UpdatedAt,
31
+ FirstLast: userRecord.FirstLast,
32
+ EmployeeFirstLast: userRecord.EmployeeFirstLast,
33
+ EmployeeEmail: userRecord.EmployeeEmail,
34
+ EmployeeTitle: userRecord.EmployeeTitle,
35
+ EmployeeSupervisor: userRecord.EmployeeSupervisor,
36
+ EmployeeSupervisorEmail: userRecord.EmployeeSupervisorEmail,
37
+ };
38
+ }
39
+
9
40
  export function RequireLoadedUser<T extends { ID?: string }>(
10
41
  user: T | null | undefined,
11
42
  email: string | undefined,
@@ -305,6 +305,12 @@ export async function ExecuteUpdateMeeting(
305
305
  }
306
306
  }
307
307
 
308
+ /**
309
+ * Starts a meeting for the `StartMeeting` mutation (`MeetingResolver`): marks it `Live`, ensures its Interaction, starts
310
+ * each agent participant in the room under an agent session created for it, starts an automatic recording, and mints the
311
+ * caller's client token. An agent that fails to start doesn't fail the meeting; the session created for it is closed
312
+ * (`Error`).
313
+ */
308
314
  export async function ExecuteStartMeeting(
309
315
  provider: IMetadataProvider,
310
316
  user: UserInfo,
@@ -343,12 +349,15 @@ export async function ExecuteStartMeeting(
343
349
  const agentParticipants = participants.filter((p) => p.Role === 'Agent' && p.AgentID);
344
350
 
345
351
  for (const ap of agentParticipants) {
352
+ // Set once this agent's session exists, so a start that fails after it was created can close it.
353
+ let createdSessionID: string | undefined;
346
354
  try {
347
355
  const createdSession = await sessionManager.CreateSession(
348
356
  { agentID: ap.AgentID!, userID: user.ID },
349
357
  user,
350
358
  provider,
351
359
  );
360
+ createdSessionID = createdSession.ID;
352
361
  await LiveKitAgentRoomCoordinator.Instance.StartAgentRoomSession({
353
362
  AgentSessionID: createdSession.ID,
354
363
  RoomName: meeting.RoomName,
@@ -357,9 +366,21 @@ export async function ExecuteStartMeeting(
357
366
  MetadataProvider: provider,
358
367
  TurnMode: 'Active',
359
368
  TurnAddressing: 'Auto',
369
+ // The session exists for this agent's time in the room alone: it closes when the agent leaves (the meeting is
370
+ // ended, everyone leaves, the agent is stopped), not when the janitor finds it idle.
371
+ Host: {
372
+ OnSessionEnded: async (reason) => {
373
+ await sessionManager.CloseSessionForEndedBridge(createdSession.ID, reason, user, provider);
374
+ },
375
+ },
360
376
  });
361
377
  } catch (agentErr) {
362
378
  LogError(`[MeetingResolver] Failed to start agent participant ${ap.AgentID} in room ${meeting.RoomName}: ${agentErr instanceof Error ? agentErr.message : String(agentErr)}`);
379
+ // The agent never joined, so the hook above never runs: close its session now (Error), not when the janitor finds
380
+ // it idle. The coordinator has already closed any model session the start opened (#5308).
381
+ if (createdSessionID) {
382
+ await sessionManager.CloseSessionForFailedStart(createdSessionID, user, provider);
383
+ }
363
384
  }
364
385
  }
365
386