@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
@@ -93,8 +93,10 @@ export async function resolveWidgetGuestRunContext(
93
93
  * A scoped anonymous session (`IsMagicLinkAnonymous` + `MagicLinkScope.ResourceID`) holds only the
94
94
  * narrow relay grants its invite's role carries — deliberately NOT the AI run entities, whose rows
95
95
  * leak the rendered system prompt. Unlike {@link resolveWidgetGuestRunContext} no widget instance is
96
- * required: on the realtime path the agent authority is already server-side (the session config's
97
- * `targetAgentID`, `CanRun`-gated at session start), so there is no client-supplied agent id to pin.
96
+ * required: the realtime target is the session config's `targetAgentID`, which the owner can edit, so
97
+ * the relay re-checks `CanRun` on it for the CALLER before this elevation. Direct actions are refused
98
+ * for these callers before elevation, so only the delegated agent run and the run-entity writes
99
+ * execute as the system user.
98
100
  *
99
101
  * PUBLIC WEB-WIDGET guests are deliberately EXCLUDED (returned unchanged): their seeded role writes
100
102
  * run rows under the guest principal, which the `Widget Guest: Own Agent Runs` RLS read filter
@@ -126,6 +128,36 @@ export function ResolveScopedAnonymousRunUser(contextUser: UserInfo): UserInfo {
126
128
  return systemUser;
127
129
  }
128
130
 
131
+ /**
132
+ * The principal a client-direct call's consolidated RECORDING STORE runs as, once the caller has
133
+ * already passed the session-ownership and consent gates (#5195).
134
+ *
135
+ * The store writes `MJ: Files`, the file↔session link and the session's recording stamp — server
136
+ * plumbing attributed through the session link, never through the caller. A signed-in user whose only
137
+ * role is the stock UI role cannot create `MJ: Files`, so running the store as the caller lost every
138
+ * such user's recording (the object landed in storage, the row never did). It therefore runs as the
139
+ * system user for signed-in owners, and anonymous sessions keep exactly the
140
+ * {@link ResolveScopedAnonymousRunUser} behaviour (PUBLIC WEB-WIDGET guests stay on the caller for the
141
+ * same RLS reason documented there).
142
+ *
143
+ * Fails CLOSED: with no system user available the caller is returned, i.e. today's behaviour.
144
+ * Ownership/consent gates must NEVER use this.
145
+ */
146
+ export function ResolveRecordingStoreUser(contextUser: UserInfo): UserInfo {
147
+ if (contextUser?.IsMagicLinkAnonymous || contextUser?.WidgetGuestContext?.WidgetID) {
148
+ return ResolveScopedAnonymousRunUser(contextUser);
149
+ }
150
+ const systemUser = UserCache.Instance.GetSystemUser();
151
+ if (!systemUser) {
152
+ LogError(
153
+ `[Realtime] Cannot elevate the recording store for user ${contextUser?.ID}: no system user available; ` +
154
+ 'storing as the caller.',
155
+ );
156
+ return contextUser;
157
+ }
158
+ return systemUser;
159
+ }
160
+
129
161
  /**
130
162
  * Builds an elevated {@link UserPayload} that runs subsequent agent work as `elevatedUser` while
131
163
  * preserving the guest's `sessionId` — so progress/streaming PubSub still routes to the guest's
@@ -1,14 +1,17 @@
1
1
  import { Resolver, Mutation, Arg, Ctx } from "type-graphql";
2
2
  import { ActionEngineServer } from "@memberjunction/actions";
3
3
  import { EntityActionEngineServer } from "@memberjunction/actions";
4
- import { Metadata, UserInfo, BaseEntity, CompositeKey, KeyValuePair, LogError } from "@memberjunction/core";
5
- import { ActionParam, ActionResult } from "@memberjunction/actions-base";
4
+ import { Metadata, UserInfo, BaseEntity, CompositeKey, KeyValuePair, LogError, RunView, DatabaseProviderBase } from "@memberjunction/core";
5
+ import { ActionParam, ActionResult, MJActionEntityExtended } from "@memberjunction/actions-base";
6
+ import { UserCache } from "@memberjunction/generic-database-provider";
6
7
  import { Field, InputType, ObjectType } from "type-graphql";
7
8
  import { KeyValuePairInput } from "../generic/KeyValuePairInput.js";
8
9
  import { AppContext, ProviderInfo } from "../types.js";
9
- import { CopyScalarsAndArrays, UUIDsEqual } from "@memberjunction/global";
10
+ import { CopyScalarsAndArrays, EscapeSQLString, UUIDsEqual } from "@memberjunction/global";
10
11
  import { GetReadOnlyProvider, GetReadWriteProvider } from "../util.js";
11
12
  import { ResolverBase } from "../generic/ResolverBase.js";
13
+ import { IsScopeLimitedPrincipal } from "../auth/scopeLimitedPrincipal.js";
14
+ import { EvaluateActionRunAuthorization, IsOwner } from "../auth/actionAuthorization.js";
12
15
 
13
16
  /**
14
17
  * Input type for action parameters
@@ -55,8 +58,8 @@ export class RunActionInput {
55
58
  Params?: ActionParamInput[];
56
59
 
57
60
  /**
58
- * Whether to skip logging the action execution
59
- * Defaults to false
61
+ * Ignored. A run started through this API always writes an action execution log row; the field
62
+ * remains so that clients which send it still validate.
60
63
  */
61
64
  @Field(() => Boolean, { nullable: true })
62
65
  SkipActionLog?: boolean;
@@ -174,7 +177,13 @@ export class ActionResultOutput {
174
177
  @Resolver()
175
178
  export class ActionResolver extends ResolverBase {
176
179
  /**
177
- * Mutation for running an action
180
+ * Mutation for running an action.
181
+ *
182
+ * Scope-limited sessions are refused. Any other caller must be authorized for the action — see
183
+ * {@link EvaluateActionRunAuthorization}: an Owner may run any action; anyone else needs a role that
184
+ * holds an authorization linked to the action through `MJ: Action Authorizations`, or, when the
185
+ * action has no such link, an action class that authorizes its caller itself. The run is always
186
+ * logged.
178
187
  * @param input The input parameters for running the action
179
188
  * @param ctx The GraphQL context containing user authentication information
180
189
  * @returns The result of running the action
@@ -185,20 +194,16 @@ export class ActionResolver extends ResolverBase {
185
194
  @Ctx() ctx: AppContext
186
195
  ): Promise<ActionResultOutput> {
187
196
  try {
197
+ const user = this.getRunActionPrincipal(ctx);
198
+
188
199
  // Check API key scope authorization for action execution
189
200
  await this.CheckAPIKeyScopeAuthorization('action:execute', input.ActionID, ctx.userPayload);
190
201
 
191
- // Get the user from context
192
- const user = ctx.userPayload.userRecord;
193
- if (!user) {
194
- throw new Error("User is not authenticated");
195
- }
196
-
197
202
  // Initialize the action engine
198
203
  await ActionEngineServer.Instance.Config(false, user);
199
204
 
200
- // Get the action by ID
201
205
  const action = this.findActionById(input.ActionID);
206
+ await this.assertCanRunAction(action, user, ctx.providers);
202
207
 
203
208
  // Parse the parameters
204
209
  const params = this.parseActionParameters(input.Params);
@@ -206,7 +211,7 @@ export class ActionResolver extends ResolverBase {
206
211
  // Run the action — thread the request-scoped provider so provider-bound
207
212
  // actions (e.g. the semantic find-* / Search Entity actions, which call
208
213
  // params.Provider.SearchEntity) run against the caller's metadata layer.
209
- const result = await this.executeAction(action, user, params, ctx.providers, input.SkipActionLog);
214
+ const result = await this.executeAction(action, user, params, ctx.providers);
210
215
 
211
216
  // Return the result
212
217
  return this.createActionResult(result);
@@ -215,6 +220,66 @@ export class ActionResolver extends ResolverBase {
215
220
  }
216
221
  }
217
222
 
223
+ /**
224
+ * The authenticated caller of RunAction. A scope-limited session is refused: its confinement exists
225
+ * only as row-level-security filters, and an action can reach data and services those filters never
226
+ * cover.
227
+ * @throws Error when there is no user or the session is scope-limited
228
+ */
229
+ private getRunActionPrincipal(ctx: AppContext): UserInfo {
230
+ const user = ctx.userPayload?.userRecord;
231
+ if (!user) {
232
+ throw new Error("User is not authenticated");
233
+ }
234
+ if (IsScopeLimitedPrincipal(user)) {
235
+ throw new Error("RunAction is not permitted for scope-limited sessions");
236
+ }
237
+ return user;
238
+ }
239
+
240
+ /**
241
+ * Refuses the run unless the caller is authorized for the action — see
242
+ * {@link EvaluateActionRunAuthorization}. The `MJ: Action Authorizations` rows, the authorization
243
+ * tree and the role grants all come from the request's provider, or all from the global provider
244
+ * when the request carries none.
245
+ * @throws Error when the caller may not run the action
246
+ */
247
+ private async assertCanRunAction(action: MJActionEntityExtended, user: UserInfo, providers: Array<ProviderInfo>): Promise<void> {
248
+ if (IsOwner(user)) {
249
+ return; // an Owner may run any action, so nothing needs to be read
250
+ }
251
+ const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
252
+ const actionAuthorizationIDs = await this.loadActionAuthorizationIDs(action.ID, provider);
253
+ const metadata = provider ?? Metadata.Provider; // global-provider-ok: fallback only when the request carries no provider
254
+ const actionAuthorizesCaller = ActionEngineServer.Instance.ActionAuthorizesCaller(action);
255
+ const decision = EvaluateActionRunAuthorization(user, actionAuthorizationIDs, metadata, actionAuthorizesCaller);
256
+ if (!decision.Allowed) {
257
+ throw new Error(`Not authorized to run action ${action.ID}: ${decision.Reason}`);
258
+ }
259
+ }
260
+
261
+ /**
262
+ * The AuthorizationID of each `MJ: Action Authorizations` row for the action. Read as the system
263
+ * user: this is the server's own authorization decision, so it must not depend on whether the
264
+ * caller can read that entity.
265
+ */
266
+ private async loadActionAuthorizationIDs(actionID: string, provider: DatabaseProviderBase | null): Promise<string[]> {
267
+ const systemUser = UserCache.Instance.GetSystemUser();
268
+ if (!systemUser) {
269
+ throw new Error("System user not found");
270
+ }
271
+ const result = await new RunView(provider).RunView<{ AuthorizationID: string }>({
272
+ EntityName: 'MJ: Action Authorizations',
273
+ ExtraFilter: `ActionID='${EscapeSQLString(actionID)}'`,
274
+ Fields: ['AuthorizationID'],
275
+ ResultType: 'simple'
276
+ }, systemUser);
277
+ if (!result.Success) {
278
+ throw new Error(`Could not read the authorizations for action ${actionID}: ${result.ErrorMessage}`);
279
+ }
280
+ return result.Results.map(row => row.AuthorizationID);
281
+ }
282
+
218
283
  /**
219
284
  * Finds an action by its ID
220
285
  * @param actionID The ID of the action to find
@@ -222,7 +287,7 @@ export class ActionResolver extends ResolverBase {
222
287
  * @throws Error if the action is not found
223
288
  * @private
224
289
  */
225
- private findActionById(actionID: string): any {
290
+ private findActionById(actionID: string): MJActionEntityExtended {
226
291
  const action = ActionEngineServer.Instance.Actions.find(a => UUIDsEqual(a.ID, actionID));
227
292
  if (!action) {
228
293
  throw new Error(`Action with ID ${actionID} not found`);
@@ -264,20 +329,18 @@ export class ActionResolver extends ResolverBase {
264
329
  }
265
330
 
266
331
  /**
267
- * Executes an action
332
+ * Executes an action. The run is always logged: a client cannot switch off the action execution log.
268
333
  * @param action The action to execute
269
334
  * @param user The user context
270
335
  * @param params The action parameters
271
- * @param skipActionLog Whether to skip action logging
272
336
  * @returns The action result
273
337
  * @private
274
338
  */
275
339
  private async executeAction(
276
- action: any,
340
+ action: MJActionEntityExtended,
277
341
  user: UserInfo,
278
342
  params: ActionParam[],
279
- providers: Array<ProviderInfo>,
280
- skipActionLog?: boolean
343
+ providers: Array<ProviderInfo>
281
344
  ): Promise<ActionResult> {
282
345
  // Resolve the request-scoped provider. Prefer read-write (actions may mutate);
283
346
  // fall back to read-only, then to the engine's global-Metadata default when no
@@ -287,7 +350,7 @@ export class ActionResolver extends ResolverBase {
287
350
  Action: action,
288
351
  ContextUser: user,
289
352
  Params: params,
290
- SkipActionLog: skipActionLog,
353
+ SkipActionLog: false,
291
354
  Filters: [],
292
355
  Provider: provider
293
356
  });
@@ -1,7 +1,8 @@
1
1
  import { Arg, Ctx, Query, Resolver, Field, Int, InputType } from 'type-graphql';
2
2
  import { LogError } from '@memberjunction/core';
3
- import type { DatabasePlatform, IMetadataProvider, RunQueryResult, UserInfo } from '@memberjunction/core';
3
+ import type { DatabaseProviderBase, RunQueryResult, UserInfo } from '@memberjunction/core';
4
4
  import { RenderPipeline } from '@memberjunction/generic-database-provider';
5
+ import type { AdhocSQLAuthorizer } from '@memberjunction/actions';
5
6
  import { AppContext } from '../types.js';
6
7
  import { configInfo } from '../config.js';
7
8
  import { GetReadOnlyProvider } from '../util.js';
@@ -73,7 +74,7 @@ export class AdhocQueryResolver extends ResolverBase {
73
74
  return this.buildErrorResult('No read-only data source available for ad-hoc query execution');
74
75
  }
75
76
  const contextUser = context.userPayload?.userRecord;
76
- const refusal = this.authorizeRenderedSQL(input.SQL, provider.PlatformKey, context, contextUser);
77
+ const refusal = this.AuthorizeRenderedSQL(input.SQL, provider, contextUser);
77
78
  if (refusal) {
78
79
  return this.buildErrorResult(refusal, Date.now() - startTime);
79
80
  }
@@ -104,12 +105,14 @@ export class AdhocQueryResolver extends ResolverBase {
104
105
  * because raw SQL applies neither (see assertFullQueryUsesReadableEntityViews). The provider
105
106
  * renders the same input the same way and only wraps it in server-built paging and a count,
106
107
  * so the rendered SQL is the full set of reads. Returns the refusal message, or null.
108
+ *
109
+ * `provider` is the read-only provider the SQL will run on; it supplies the platform and the
110
+ * entity metadata. {@link CreateAdhocSQLAuthorizer} exposes this check to the action engine.
107
111
  */
108
- private authorizeRenderedSQL(sqlText: string, platform: DatabasePlatform, context: AppContext, contextUser: UserInfo | undefined): string | null {
112
+ public AuthorizeRenderedSQL(sqlText: string, provider: DatabaseProviderBase, contextUser: UserInfo | undefined): string | null {
109
113
  try {
110
- const rendered = RenderPipeline.Run(sqlText, { Platform: platform, ContextUser: contextUser, RequireReadStatement: true });
111
- const mdProvider: IMetadataProvider | undefined = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true }) ?? undefined;
112
- this.assertFullQueryUsesReadableEntityViews(rendered.Trace.AfterTemplates, mdProvider, contextUser, 'ad-hoc SQL');
114
+ const rendered = RenderPipeline.Run(sqlText, { Platform: provider.PlatformKey, ContextUser: contextUser, RequireReadStatement: true });
115
+ this.assertFullQueryUsesReadableEntityViews(rendered.Trace.AfterTemplates, provider, contextUser, 'ad-hoc SQL');
113
116
  return null;
114
117
  } catch (err) {
115
118
  return err instanceof Error ? err.message : String(err);
@@ -161,3 +164,18 @@ export class AdhocQueryResolver extends ResolverBase {
161
164
  };
162
165
  }
163
166
  }
167
+
168
+ /**
169
+ * The ad-hoc SQL checks MJServer registers with the action engine, so that Run Ad-hoc Query applies
170
+ * the same checks as {@link AdhocQueryResolver.ExecuteAdhocQuery}: the rendered SQL must be one read
171
+ * statement that reads only entity views the caller may read in full, and the timeout is limited by
172
+ * the server's request timeout.
173
+ * @param requestTimeoutMs the server's request timeout in milliseconds; 0 or less means no limit
174
+ */
175
+ export function CreateAdhocSQLAuthorizer(requestTimeoutMs: number): AdhocSQLAuthorizer {
176
+ const resolver = new AdhocQueryResolver();
177
+ return {
178
+ Authorize: (sql, provider, contextUser) => resolver.AuthorizeRenderedSQL(sql, provider, contextUser),
179
+ ClampTimeoutSeconds: (requestedSeconds) => ClampAdhocTimeoutSeconds(requestedSeconds, requestTimeoutMs),
180
+ };
181
+ }
@@ -46,7 +46,11 @@ export class ArtifactFileResolver extends ResolverBase {
46
46
  return this.buildDownloadUrl(artifactVersion.FileID, user, p);
47
47
  }
48
48
 
49
- /** Load the File + its storage account/provider and generate a signed URL. */
49
+ /**
50
+ * Load the File (as the caller) and generate a signed URL — after the storage gate: the caller must be able to read
51
+ * the account the file's provider resolves to and every `MJ: Files` row that tracks its object
52
+ * (`FileStorageEngine.ResolveFileObject`), so an artifact cannot sign an object in an account the caller is refused.
53
+ */
50
54
  private async buildDownloadUrl(
51
55
  fileId: string,
52
56
  user: ReturnType<ResolverBase['GetUserFromPayload']>,
@@ -58,14 +62,11 @@ export class ArtifactFileResolver extends ResolverBase {
58
62
  throw new Error(`File record ${fileId} not found`);
59
63
  }
60
64
 
61
- // Find the storage account for this file's provider using cached metadata
62
- await FileStorageEngine.Instance.Config(false, user!);
63
- const matchingAccounts = FileStorageEngine.Instance.GetAccountsByProviderID(fileEntity.ProviderID);
64
- if (matchingAccounts.length === 0) {
65
+ // Resolve the storage account for this file's provider, gated for the caller (throws on refusal)
66
+ const resolved = await FileStorageEngine.Instance.ResolveFileObject(fileEntity, user!, 'Read', provider);
67
+ if (!resolved) {
65
68
  throw new Error(`No FileStorageAccount found for ProviderID ${fileEntity.ProviderID}. Cannot generate download URL.`);
66
69
  }
67
-
68
- const driver = await FileStorageEngine.Instance.GetDriver(matchingAccounts[0].ID, user!);
69
- return driver.CreatePreAuthDownloadUrl(fileEntity.ProviderKey ?? fileEntity.Name);
70
+ return resolved.Driver.CreatePreAuthDownloadUrl(resolved.ObjectKey);
70
71
  }
71
72
  }
@@ -1,5 +1,6 @@
1
- import { Field, Float, Int, ObjectType, Query, Resolver } from 'type-graphql';
2
- import { LocalCacheManager, CacheStats, CacheEntryType } from '@memberjunction/core';
1
+ import { Arg, Field, Float, Int, ObjectType, Query, Resolver } from 'type-graphql';
2
+ import { BaseEngine, BaseEngineRegistry, LocalCacheManager, CacheStats, CacheEntryType } from '@memberjunction/core';
3
+ import type { EngineStateCensus } from '@memberjunction/core';
3
4
  import { RequireSystemUser } from '../directives/index.js';
4
5
 
5
6
  // ============================================================================
@@ -66,10 +67,83 @@ class CacheStatsDetailGQL extends CacheStatsGQL {
66
67
  EntityBreakdown: CacheEntityBreakdownGQL[];
67
68
  }
68
69
 
70
+ @ObjectType()
71
+ class EnginePropertyCensusGQL {
72
+ @Field(() => String)
73
+ PropertyName: string;
74
+
75
+ @Field(() => String, { nullable: true })
76
+ EntityName?: string;
77
+
78
+ @Field(() => String, { nullable: true })
79
+ DatasetName?: string;
80
+
81
+ @Field(() => Int)
82
+ RowCount: number;
83
+
84
+ @Field(() => String, { nullable: true })
85
+ MaxUpdatedAt: string | null;
86
+
87
+ @Field(() => String, { nullable: true })
88
+ IdentityHash: string | null;
89
+
90
+ @Field(() => Boolean)
91
+ LoadedSuccessfully: boolean;
92
+
93
+ @Field(() => Boolean)
94
+ PermissionDenied: boolean;
95
+ }
96
+
97
+ @ObjectType()
98
+ class EngineDerivedCountGQL {
99
+ @Field(() => String)
100
+ Name: string;
101
+
102
+ @Field(() => Int)
103
+ Value: number;
104
+ }
105
+
106
+ @ObjectType()
107
+ class EngineStateCensusGQL {
108
+ @Field(() => String)
109
+ EngineClass: string;
110
+
111
+ @Field(() => Boolean)
112
+ Loaded: boolean;
113
+
114
+ @Field(() => Boolean)
115
+ PermissionConstrained: boolean;
116
+
117
+ @Field(() => [EnginePropertyCensusGQL])
118
+ Properties: EnginePropertyCensusGQL[];
119
+
120
+ @Field(() => [EngineDerivedCountGQL])
121
+ Derived: EngineDerivedCountGQL[];
122
+ }
123
+
69
124
  // ============================================================================
70
125
  // Helpers (pure core)
71
126
  // ============================================================================
72
127
 
128
+ function censusToGQL(census: EngineStateCensus): EngineStateCensusGQL {
129
+ const gql = new EngineStateCensusGQL();
130
+ gql.EngineClass = census.EngineClass;
131
+ gql.Loaded = census.Loaded;
132
+ gql.PermissionConstrained = census.PermissionConstrained;
133
+ gql.Properties = census.Properties.map(p => Object.assign(new EnginePropertyCensusGQL(), p));
134
+ gql.Derived = Object.entries(census.Derived).map(([Name, Value]) => Object.assign(new EngineDerivedCountGQL(), { Name, Value }));
135
+ return gql;
136
+ }
137
+
138
+ /** Census of every registered engine in this process, optionally narrowed to one class name. */
139
+ function buildEngineCensus(engineClass?: string): EngineStateCensusGQL[] {
140
+ return BaseEngineRegistry.Instance.GetAllEngines()
141
+ .filter((engine): engine is BaseEngine<unknown> => engine instanceof BaseEngine)
142
+ .filter(engine => !engineClass || engine.constructor.name === engineClass)
143
+ .map(engine => censusToGQL(engine.GetStateCensus()))
144
+ .sort((a, b) => a.EngineClass.localeCompare(b.EngineClass));
145
+ }
146
+
73
147
  function toGQL(stats: CacheStats): CacheStatsGQL {
74
148
  const gql = new CacheStatsGQL();
75
149
  gql.TotalEntries = stats.totalEntries;
@@ -139,4 +213,17 @@ export class CacheStatsResolver {
139
213
  result.EntityBreakdown = buildEntityBreakdown();
140
214
  return result;
141
215
  }
216
+
217
+ /**
218
+ * What each engine in this server process holds — row counts, newest timestamps, a row-version
219
+ * hash, and engine-specific derived-state counts. Comparing the hashes across servers shows
220
+ * whether they converged; a derived count of zero next to a full array shows lost derived state.
221
+ */
222
+ @RequireSystemUser()
223
+ @Query(() => [EngineStateCensusGQL])
224
+ EngineStateCensus(
225
+ @Arg('EngineClass', () => String, { nullable: true }) engineClass?: string
226
+ ): EngineStateCensusGQL[] {
227
+ return buildEngineCensus(engineClass);
228
+ }
142
229
  }
@@ -14,6 +14,7 @@ import { AppContext } from '../types.js';
14
14
  import { LogStatus, LogError } from '@memberjunction/core';
15
15
  import { ResolverBase } from '../generic/ResolverBase.js';
16
16
  import { ClientToolRequestManager, CLIENT_TOOL_REQUEST_TOPIC, ClientToolRequestNotificationPayload } from '@memberjunction/ai-agents';
17
+ import { ParseClientToolMedia } from '@memberjunction/ai-core-plus';
17
18
 
18
19
  @ObjectType()
19
20
  export class ClientToolRequestNotification {
@@ -71,7 +72,9 @@ export class ClientToolRequestResolver extends ResolverBase {
71
72
  /**
72
73
  * Client sends the result of executing a client tool back to the server.
73
74
  * This resolves the pending Promise in ClientToolRequestManager so the
74
- * agent loop can continue.
75
+ * agent loop can continue. `media` is an optional JSON array of images.
76
+ * When `media` fails validation or `result` is not valid JSON, the request
77
+ * resolves as a failed result.
75
78
  */
76
79
  @Mutation(() => Boolean)
77
80
  async RespondToClientToolRequest(
@@ -79,15 +82,25 @@ export class ClientToolRequestResolver extends ResolverBase {
79
82
  @Arg('success') success: boolean,
80
83
  @Arg('result', { nullable: true }) result: string | undefined,
81
84
  @Arg('errorMessage', { nullable: true }) errorMessage: string | undefined,
85
+ @Arg('media', { nullable: true }) media: string | undefined,
82
86
  @Ctx() _context: AppContext = {} as AppContext
83
87
  ): Promise<boolean> {
84
88
  try {
85
- const found = ClientToolRequestManager.Instance.ReceiveResponse({
86
- RequestID: requestID,
87
- Success: success,
88
- Result: result ? JSON.parse(result) : undefined,
89
- ErrorMessage: errorMessage
90
- });
89
+ const parsedMedia = ParseClientToolMedia(media);
90
+ // `=== true` narrows the union; this package compiles without strictNullChecks.
91
+ const found = ClientToolRequestManager.Instance.ReceiveResponse(parsedMedia.ok === true
92
+ ? {
93
+ RequestID: requestID,
94
+ Success: success,
95
+ Result: result ? JSON.parse(result) : undefined,
96
+ ErrorMessage: errorMessage,
97
+ Media: parsedMedia.media.length ? parsedMedia.media : undefined
98
+ }
99
+ : {
100
+ RequestID: requestID,
101
+ Success: false,
102
+ ErrorMessage: `Client tool media rejected: ${parsedMedia.error}`
103
+ });
91
104
 
92
105
  if (!found) {
93
106
  LogError(`RespondToClientToolRequest: no pending request for ${requestID} (may have timed out)`);
@@ -96,6 +109,11 @@ export class ClientToolRequestResolver extends ResolverBase {
96
109
  } catch (error) {
97
110
  const msg = error instanceof Error ? error.message : String(error);
98
111
  LogError(`RespondToClientToolRequest error: ${msg}`);
112
+ ClientToolRequestManager.Instance.ReceiveResponse({
113
+ RequestID: requestID,
114
+ Success: false,
115
+ ErrorMessage: `Client tool response rejected: ${msg}`
116
+ });
99
117
  return false;
100
118
  }
101
119
  }
@@ -7,7 +7,7 @@ import type { AppContext } from '../types.js';
7
7
  import { GetReadOnlyProvider } from '../util.js';
8
8
 
9
9
  /** The run columns the tail reads. */
10
- type TailRunRow = Pick<MJAIAgentRunEntity, 'ID' | 'Status' | 'Result'>;
10
+ type TailRunRow = Pick<MJAIAgentRunEntity, 'ID' | 'Status' | 'FinalPayload' | 'Result'>;
11
11
 
12
12
  /** The step columns an event carries. The large data columns are never read. */
13
13
  type TailStepRow = Pick<
@@ -15,7 +15,7 @@ type TailStepRow = Pick<
15
15
  'StepNumber' | 'StepType' | 'StepName' | 'Status' | 'Success' | 'ErrorMessage' | 'StartedAt' | 'CompletedAt'
16
16
  >;
17
17
 
18
- const RUN_FIELDS: (keyof TailRunRow)[] = ['ID', 'Status', 'Result'];
18
+ const RUN_FIELDS: (keyof TailRunRow)[] = ['ID', 'Status', 'FinalPayload', 'Result'];
19
19
  const STEP_FIELDS: (keyof TailStepRow)[] = [
20
20
  'StepNumber', 'StepType', 'StepName', 'Status', 'Success', 'ErrorMessage', 'StartedAt', 'CompletedAt',
21
21
  ];
@@ -94,10 +94,14 @@ export class ConversationRunEventsOutput {
94
94
  /**
95
95
  * The run's answer, returned only once the run is terminal.
96
96
  *
97
- * Sourced from `AIAgentRun.Result`, falling back to the conversation detail's message because
98
- * `Result` is agent-dependent and null on many successful runs. Still nullable: a caller must
99
- * decide a message is finished from {@link IsInFlight} / {@link DetailStatus}, never from the
100
- * presence of this field, or it will wait forever on an agent that writes neither.
97
+ * Sourced from `AIAgentRun.FinalPayload` (`Result` on older rows), then the conversation detail's
98
+ * message, because the run payload is agent-dependent and null on many successful runs. Still
99
+ * nullable: a caller must decide a message is finished from {@link IsInFlight} /
100
+ * {@link DetailStatus}, never from the presence of this field, or it will wait forever on an
101
+ * agent that writes neither.
102
+ *
103
+ * A run that ended without completing (for example `Cancelled`) returns whatever `FinalPayload`
104
+ * it had saved, which can be partial, so a caller should check {@link RunStatus} first.
101
105
  */
102
106
  @Field(() => String, { nullable: true })
103
107
  FinalPayload?: string;
@@ -206,11 +210,11 @@ export class ConversationRunEventsResolver {
206
210
  // Only meaningful once terminal; sending it mid-run would hand the client a
207
211
  // partial payload it could mistake for the final answer.
208
212
  //
209
- // `AIAgentRun.Result` is agent-dependent — it is null on a large share of
210
- // genuinely successful runs — so the conversation detail's own message is the
211
- // fallback. That is the text the chat renders, so it is the answer a caller
212
- // waiting on this field actually wants.
213
- FinalPayload: isInFlight ? undefined : (run.Result ?? detail.Message ?? undefined),
213
+ // `AIAgentRun.FinalPayload` (`Result` on older rows) is agent-dependent — it is
214
+ // null on a large share of genuinely successful runs — so the conversation detail's
215
+ // own message is the fallback. That is the text the chat renders, so it is the
216
+ // answer a caller waiting on this field actually wants.
217
+ FinalPayload: isInFlight ? undefined : (run.FinalPayload ?? run.Result ?? detail.Message ?? undefined),
214
218
  DetailStatus: detail.Status ?? undefined,
215
219
  };
216
220
  } catch (e) {