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

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 (664) hide show
  1. package/README.md +96 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
  5. package/dist/agentSessions/BridgeHostInstance.js +14 -4
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
  7. package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
  8. package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
  9. package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
  10. package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
  11. package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
  12. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  13. package/dist/agentSessions/SessionJanitor.d.ts +34 -11
  14. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  15. package/dist/agentSessions/SessionJanitor.js +88 -44
  16. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  17. package/dist/agentSessions/SessionManager.d.ts +29 -9
  18. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  19. package/dist/agentSessions/SessionManager.js +62 -16
  20. package/dist/agentSessions/SessionManager.js.map +1 -1
  21. package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
  22. package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
  23. package/dist/agentSessions/conversationBrowsers.js +118 -0
  24. package/dist/agentSessions/conversationBrowsers.js.map +1 -0
  25. package/dist/agentSessions/sessionDeadline.d.ts +43 -0
  26. package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
  27. package/dist/agentSessions/sessionDeadline.js +68 -0
  28. package/dist/agentSessions/sessionDeadline.js.map +1 -0
  29. package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
  30. package/dist/auth/APIKeyScopeAuth.js +5 -4
  31. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  32. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  33. package/dist/auth/AuthProviderCatalogRouter.js +2 -0
  34. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  35. package/dist/auth/index.d.ts.map +1 -1
  36. package/dist/auth/index.js +51 -10
  37. package/dist/auth/index.js.map +1 -1
  38. package/dist/auth/initializeProviders.d.ts +10 -0
  39. package/dist/auth/initializeProviders.d.ts.map +1 -1
  40. package/dist/auth/initializeProviders.js +37 -1
  41. package/dist/auth/initializeProviders.js.map +1 -1
  42. package/dist/auth/localDevAuth.d.ts +79 -0
  43. package/dist/auth/localDevAuth.d.ts.map +1 -0
  44. package/dist/auth/localDevAuth.js +439 -0
  45. package/dist/auth/localDevAuth.js.map +1 -0
  46. package/dist/auth/loginEmailResolution.d.ts +41 -0
  47. package/dist/auth/loginEmailResolution.d.ts.map +1 -0
  48. package/dist/auth/loginEmailResolution.js +47 -0
  49. package/dist/auth/loginEmailResolution.js.map +1 -0
  50. package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
  51. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  52. package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
  53. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  54. package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
  55. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  56. package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
  57. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  58. package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
  59. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  60. package/dist/auth/magicLink/MagicLinkService.js +221 -9
  61. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  62. package/dist/auth/magicLink/index.d.ts +1 -1
  63. package/dist/auth/magicLink/index.d.ts.map +1 -1
  64. package/dist/auth/magicLink/index.js +1 -1
  65. package/dist/auth/magicLink/index.js.map +1 -1
  66. package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
  67. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  68. package/dist/auth/magicLink/redeemLanding.js +7 -4
  69. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  70. package/dist/auth/magicLink/types.d.ts +39 -3
  71. package/dist/auth/magicLink/types.d.ts.map +1 -1
  72. package/dist/auth/magicLink/types.js +0 -4
  73. package/dist/auth/magicLink/types.js.map +1 -1
  74. package/dist/auth/newUsers.d.ts.map +1 -1
  75. package/dist/auth/newUsers.js +1 -0
  76. package/dist/auth/newUsers.js.map +1 -1
  77. package/dist/auth/sessionUserClone.d.ts +1 -1
  78. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  79. package/dist/auth/sessionUserClone.js +3 -2
  80. package/dist/auth/sessionUserClone.js.map +1 -1
  81. package/dist/backgroundSweepConfigUnits.d.ts +231 -0
  82. package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
  83. package/dist/backgroundSweepConfigUnits.js +180 -0
  84. package/dist/backgroundSweepConfigUnits.js.map +1 -0
  85. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  86. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  87. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  88. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  89. package/dist/broadcast/index.d.ts +6 -0
  90. package/dist/broadcast/index.d.ts.map +1 -0
  91. package/dist/broadcast/index.js +6 -0
  92. package/dist/broadcast/index.js.map +1 -0
  93. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  94. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  95. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  96. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  97. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  98. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  99. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  100. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  101. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  102. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  103. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  104. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  105. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  106. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  107. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  108. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  109. package/dist/cache.d.ts +3 -2
  110. package/dist/cache.d.ts.map +1 -1
  111. package/dist/cache.js.map +1 -1
  112. package/dist/config.d.ts +1402 -8
  113. package/dist/config.d.ts.map +1 -1
  114. package/dist/config.js +120 -0
  115. package/dist/config.js.map +1 -1
  116. package/dist/context.d.ts +5 -1
  117. package/dist/context.d.ts.map +1 -1
  118. package/dist/context.js +64 -12
  119. package/dist/context.js.map +1 -1
  120. package/dist/coreRoutes.d.ts +3 -1
  121. package/dist/coreRoutes.d.ts.map +1 -1
  122. package/dist/coreRoutes.js +20 -4
  123. package/dist/coreRoutes.js.map +1 -1
  124. package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
  125. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  126. package/dist/generated/graphql-schemas/__mj.js +4167 -62
  127. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  128. package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
  129. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  130. package/dist/generic/CacheInvalidationResolver.js +154 -79
  131. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  132. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
  133. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  134. package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
  135. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  136. package/dist/generic/PubSubManager.d.ts +10 -0
  137. package/dist/generic/PubSubManager.d.ts.map +1 -1
  138. package/dist/generic/PubSubManager.js +44 -1
  139. package/dist/generic/PubSubManager.js.map +1 -1
  140. package/dist/generic/PushStatusResolver.d.ts +39 -6
  141. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  142. package/dist/generic/PushStatusResolver.js +93 -11
  143. package/dist/generic/PushStatusResolver.js.map +1 -1
  144. package/dist/generic/ResolverBase.d.ts +114 -29
  145. package/dist/generic/ResolverBase.d.ts.map +1 -1
  146. package/dist/generic/ResolverBase.js +509 -220
  147. package/dist/generic/ResolverBase.js.map +1 -1
  148. package/dist/generic/RunViewResolver.d.ts +15 -3
  149. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  150. package/dist/generic/RunViewResolver.js +126 -20
  151. package/dist/generic/RunViewResolver.js.map +1 -1
  152. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  153. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  154. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  155. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  156. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  157. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  158. package/dist/generic/fieldSecurityTransport.js +30 -0
  159. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  160. package/dist/index.d.ts +4 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +262 -84
  163. package/dist/index.js.map +1 -1
  164. package/dist/integration/ConnectionPause.d.ts +121 -0
  165. package/dist/integration/ConnectionPause.d.ts.map +1 -0
  166. package/dist/integration/ConnectionPause.js +183 -0
  167. package/dist/integration/ConnectionPause.js.map +1 -0
  168. package/dist/integration/CustomColumnPromoter.d.ts +72 -6
  169. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  170. package/dist/integration/CustomColumnPromoter.js +93 -47
  171. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  172. package/dist/integration/EntityMapLifecycle.d.ts +78 -4
  173. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  174. package/dist/integration/EntityMapLifecycle.js +199 -5
  175. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  176. package/dist/integration/InactiveRowWarnings.d.ts +31 -0
  177. package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
  178. package/dist/integration/InactiveRowWarnings.js +29 -0
  179. package/dist/integration/InactiveRowWarnings.js.map +1 -1
  180. package/dist/integration/ObjectNamesByID.d.ts +28 -0
  181. package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
  182. package/dist/integration/ObjectNamesByID.js +87 -0
  183. package/dist/integration/ObjectNamesByID.js.map +1 -0
  184. package/dist/integration/PostRestartIntrospect.d.ts +26 -0
  185. package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
  186. package/dist/integration/PostRestartIntrospect.js +27 -0
  187. package/dist/integration/PostRestartIntrospect.js.map +1 -0
  188. package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
  189. package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
  190. package/dist/integration/RSUPostRestartProgress.js +323 -0
  191. package/dist/integration/RSUPostRestartProgress.js.map +1 -0
  192. package/dist/integration/RSUProgressBridge.d.ts +41 -2
  193. package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
  194. package/dist/integration/RSUProgressBridge.js +84 -1
  195. package/dist/integration/RSUProgressBridge.js.map +1 -1
  196. package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
  197. package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
  198. package/dist/integration/RunArtifactAuthorization.js +45 -0
  199. package/dist/integration/RunArtifactAuthorization.js.map +1 -0
  200. package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
  201. package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
  202. package/dist/integration/SchemaRefreshLaunch.js +3 -2
  203. package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
  204. package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
  205. package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
  206. package/dist/integration/ScopedFieldsForBuild.js +91 -0
  207. package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
  208. package/dist/integration/TargetConfigGuard.d.ts +40 -0
  209. package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
  210. package/dist/integration/TargetConfigGuard.js +40 -0
  211. package/dist/integration/TargetConfigGuard.js.map +1 -0
  212. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  213. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  214. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  215. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  216. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  217. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  218. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  219. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +8 -6
  220. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
  221. package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
  222. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
  223. package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
  224. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  225. package/dist/realtimeSessions/sessionAccess.js +147 -22
  226. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  227. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  228. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  229. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  230. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  231. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  232. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  233. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  234. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  235. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  236. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  237. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  238. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  239. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  240. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  241. package/dist/realtimeWidget/WidgetSessionService.js +203 -19
  242. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  243. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  244. package/dist/realtimeWidget/host-identity.js +1 -1
  245. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  246. package/dist/realtimeWidget/visitorIdentity.js +1 -0
  247. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  248. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  249. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  250. package/dist/realtimeWidget/widgetCore.js +21 -8
  251. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  252. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  253. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  254. package/dist/realtimeWidget/widgetGuestElevation.js +3 -1
  255. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  256. package/dist/requestOrigin.d.ts +22 -0
  257. package/dist/requestOrigin.d.ts.map +1 -0
  258. package/dist/requestOrigin.js +60 -0
  259. package/dist/requestOrigin.js.map +1 -0
  260. package/dist/resolvers/ActionResolver.d.ts +19 -1
  261. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  262. package/dist/resolvers/ActionResolver.js +63 -12
  263. package/dist/resolvers/ActionResolver.js.map +1 -1
  264. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  265. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  266. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  267. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  268. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  269. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  270. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  271. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  272. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  273. package/dist/resolvers/AgentSessionResolver.js +44 -17
  274. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  275. package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
  276. package/dist/resolvers/AutotagPipelineResolver.js +2 -1
  277. package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
  278. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  279. package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
  280. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  281. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  282. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  283. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  284. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  285. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +6 -0
  286. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
  287. package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
  288. package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
  289. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
  290. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  291. package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
  292. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  293. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  294. package/dist/resolvers/FileCategoryResolver.js +1 -0
  295. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  296. package/dist/resolvers/FileResolver.d.ts +5 -0
  297. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  298. package/dist/resolvers/FileResolver.js +13 -4
  299. package/dist/resolvers/FileResolver.js.map +1 -1
  300. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  301. package/dist/resolvers/GetDataResolver.js +34 -13
  302. package/dist/resolvers/GetDataResolver.js.map +1 -1
  303. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
  304. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  305. package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
  306. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  307. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  308. package/dist/resolvers/MCPResolver.js +13 -2
  309. package/dist/resolvers/MCPResolver.js.map +1 -1
  310. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  311. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  312. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  313. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  314. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  315. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  316. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  317. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  318. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  319. package/dist/resolvers/QueryResolver.js +20 -6
  320. package/dist/resolvers/QueryResolver.js.map +1 -1
  321. package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
  322. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  323. package/dist/resolvers/QuerySystemUserResolver.js +184 -88
  324. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  325. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  326. package/dist/resolvers/RSUResolver.js +12 -0
  327. package/dist/resolvers/RSUResolver.js.map +1 -1
  328. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  329. package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
  330. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  331. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
  332. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  333. package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
  334. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  335. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
  336. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  337. package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
  338. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  339. package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
  340. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  341. package/dist/resolvers/RunAIAgentResolver.js +388 -125
  342. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  343. package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
  344. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  345. package/dist/resolvers/RunAIPromptResolver.js +19 -18
  346. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  347. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  348. package/dist/resolvers/RunTemplateResolver.js +7 -5
  349. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  350. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  351. package/dist/resolvers/RunTestResolver.js +3 -1
  352. package/dist/resolvers/RunTestResolver.js.map +1 -1
  353. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  354. package/dist/resolvers/SyncDataResolver.js +4 -0
  355. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  356. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  357. package/dist/resolvers/TestQuerySQLResolver.js +1 -0
  358. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  359. package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
  360. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  361. package/dist/resolvers/TransactionGroupResolver.js +60 -15
  362. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  363. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  364. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  365. package/dist/resolvers/UserViewResolver.js +2 -1
  366. package/dist/resolvers/UserViewResolver.js.map +1 -1
  367. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  368. package/dist/resolvers/meetingRecordingRegistration.js +2 -0
  369. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  370. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  371. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  372. package/dist/rest/EntityCRUDHandler.js +19 -5
  373. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  374. package/dist/rest/MediaAccessKeys.d.ts.map +1 -1
  375. package/dist/rest/MediaAccessKeys.js +6 -2
  376. package/dist/rest/MediaAccessKeys.js.map +1 -1
  377. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  378. package/dist/rest/OAuthCallbackHandler.js +11 -5
  379. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  380. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  381. package/dist/rest/RESTEndpointHandler.js +8 -5
  382. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  383. package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
  384. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
  385. package/dist/rest/RealtimeRecordingHandler.js +6 -8
  386. package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
  387. package/dist/rest/ViewOperationsHandler.d.ts +6 -0
  388. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  389. package/dist/rest/ViewOperationsHandler.js +24 -6
  390. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  391. package/dist/rest/setupRESTEndpoints.d.ts +3 -1
  392. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  393. package/dist/rest/setupRESTEndpoints.js +11 -2
  394. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  395. package/dist/serverRoleConfigUnits.d.ts +29 -0
  396. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  397. package/dist/serverRoleConfigUnits.js +33 -0
  398. package/dist/serverRoleConfigUnits.js.map +1 -0
  399. package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
  400. package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
  401. package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
  402. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  403. package/dist/services/TaskGraphActionRunner.js +2 -26
  404. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  405. package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
  406. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  407. package/dist/services/TaskGraphAgentRunner.js +38 -0
  408. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  409. package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
  410. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  411. package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
  412. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  413. package/dist/services/WorkQueueHostService.d.ts +2 -1
  414. package/dist/services/WorkQueueHostService.d.ts.map +1 -1
  415. package/dist/services/WorkQueueHostService.js +19 -4
  416. package/dist/services/WorkQueueHostService.js.map +1 -1
  417. package/dist/services/workQueueConfig.d.ts +2 -2
  418. package/dist/services/workQueueConfig.js +5 -5
  419. package/dist/services/workQueueConfig.js.map +1 -1
  420. package/dist/sharedCache.js +1 -1
  421. package/dist/sharedCache.js.map +1 -1
  422. package/dist/types.d.ts +40 -1
  423. package/dist/types.d.ts.map +1 -1
  424. package/dist/types.js.map +1 -1
  425. package/package.json +98 -98
  426. package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
  427. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  428. package/src/__tests__/ActiveOperations.test.ts +68 -0
  429. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  430. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  431. package/src/__tests__/AgentSessionResolver.ownership.test.ts +150 -0
  432. package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
  433. package/src/__tests__/BatchApplyParity.test.ts +109 -0
  434. package/src/__tests__/BridgeHostInstance.test.ts +42 -0
  435. package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
  436. package/src/__tests__/ConnectionPause.test.ts +192 -0
  437. package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
  438. package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
  439. package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
  440. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  441. package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
  442. package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
  443. package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
  444. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  445. package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
  446. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  447. package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
  448. package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
  449. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  450. package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
  451. package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
  452. package/src/__tests__/MagicLinkKeys.test.ts +102 -0
  453. package/src/__tests__/MediaAccessKeys.test.ts +57 -10
  454. package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
  455. package/src/__tests__/ObjectNamesByID.test.ts +176 -0
  456. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  457. package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
  458. package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
  459. package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
  460. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  461. package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
  462. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  463. package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
  464. package/src/__tests__/RSUProgressBridge.test.ts +188 -5
  465. package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
  466. package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
  467. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  468. package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
  469. package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
  470. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
  471. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
  472. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
  473. package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
  474. package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
  475. package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
  476. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  477. package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
  478. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
  479. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -1
  480. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  481. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  482. package/src/__tests__/RunAIAgentResolver.branch.test.ts +72 -13
  483. package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
  484. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  485. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  486. package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
  487. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
  488. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
  489. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  490. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
  491. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  492. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  493. package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
  494. package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
  495. package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
  496. package/src/__tests__/SessionJanitor.test.ts +195 -4
  497. package/src/__tests__/SessionManager.test.ts +164 -0
  498. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
  499. package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
  500. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
  501. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  502. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  503. package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
  504. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  505. package/src/__tests__/WorkQueueHostService.test.ts +25 -7
  506. package/src/__tests__/apiRootBoot.test.ts +1 -1
  507. package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
  508. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  509. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  510. package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
  511. package/src/__tests__/contextRequestOrigin.test.ts +105 -0
  512. package/src/__tests__/conversationBrowsers.test.ts +62 -0
  513. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  514. package/src/__tests__/globalCors.test.ts +3 -3
  515. package/src/__tests__/localDevAuth.test.ts +196 -0
  516. package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
  517. package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
  518. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  519. package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
  520. package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
  521. package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
  522. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  523. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  524. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  525. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +224 -7
  526. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  527. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  528. package/src/__tests__/requestOrigin.test.ts +104 -0
  529. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  530. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  531. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  532. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  533. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  534. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  535. package/src/__tests__/runViewProperties.test.ts +114 -0
  536. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  537. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  538. package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
  539. package/src/__tests__/sessionDeadline.test.ts +51 -0
  540. package/src/__tests__/sessionUserClone.test.ts +5 -1
  541. package/src/__tests__/sharedCache.test.ts +11 -0
  542. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  543. package/src/__tests__/unifiedAuth.test.ts +101 -1
  544. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  545. package/src/agentSessions/BridgeHostInstance.ts +20 -5
  546. package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
  547. package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
  548. package/src/agentSessions/SessionJanitor.ts +95 -45
  549. package/src/agentSessions/SessionManager.ts +73 -20
  550. package/src/agentSessions/conversationBrowsers.ts +143 -0
  551. package/src/agentSessions/sessionDeadline.ts +81 -0
  552. package/src/auth/APIKeyScopeAuth.ts +5 -4
  553. package/src/auth/AuthProviderCatalogRouter.ts +3 -0
  554. package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
  555. package/src/auth/index.ts +56 -12
  556. package/src/auth/initializeProviders.ts +43 -1
  557. package/src/auth/localDevAuth.ts +528 -0
  558. package/src/auth/loginEmailResolution.ts +67 -0
  559. package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
  560. package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
  561. package/src/auth/magicLink/MagicLinkService.ts +250 -10
  562. package/src/auth/magicLink/index.ts +1 -1
  563. package/src/auth/magicLink/redeemLanding.ts +7 -4
  564. package/src/auth/magicLink/types.ts +38 -3
  565. package/src/auth/newUsers.ts +1 -0
  566. package/src/auth/sessionUserClone.ts +3 -2
  567. package/src/backgroundSweepConfigUnits.ts +213 -0
  568. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  569. package/src/broadcast/index.ts +5 -0
  570. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  571. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  572. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  573. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  574. package/src/cache.ts +2 -1
  575. package/src/config.ts +138 -0
  576. package/src/context.ts +71 -14
  577. package/src/coreRoutes.ts +29 -7
  578. package/src/generated/graphql-schemas/__mj.ts +4145 -1193
  579. package/src/generic/CacheInvalidationResolver.ts +135 -78
  580. package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
  581. package/src/generic/PubSubManager.ts +54 -1
  582. package/src/generic/PushStatusResolver.ts +108 -11
  583. package/src/generic/ResolverBase.ts +635 -234
  584. package/src/generic/RunViewResolver.ts +176 -64
  585. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  586. package/src/generic/fieldSecurityTransport.ts +62 -0
  587. package/src/index.ts +310 -85
  588. package/src/integration/ConnectionPause.ts +222 -0
  589. package/src/integration/CustomColumnPromoter.ts +129 -54
  590. package/src/integration/EntityMapLifecycle.ts +229 -6
  591. package/src/integration/InactiveRowWarnings.ts +50 -0
  592. package/src/integration/ObjectNamesByID.ts +97 -0
  593. package/src/integration/PostRestartIntrospect.ts +49 -0
  594. package/src/integration/RSUPostRestartProgress.ts +359 -0
  595. package/src/integration/RSUProgressBridge.ts +85 -2
  596. package/src/integration/RunArtifactAuthorization.ts +65 -0
  597. package/src/integration/SchemaRefreshLaunch.ts +12 -2
  598. package/src/integration/ScopedFieldsForBuild.ts +113 -0
  599. package/src/integration/TargetConfigGuard.ts +71 -0
  600. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  601. package/src/realtimeSessions/README.md +7 -3
  602. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  603. package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
  604. package/src/realtimeSessions/sessionAccess.ts +211 -25
  605. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  606. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  607. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  608. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  609. package/src/realtimeWidget/WidgetSessionService.ts +254 -17
  610. package/src/realtimeWidget/host-identity.ts +1 -1
  611. package/src/realtimeWidget/visitorIdentity.ts +1 -0
  612. package/src/realtimeWidget/widgetCore.ts +34 -9
  613. package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
  614. package/src/requestOrigin.ts +64 -0
  615. package/src/resolvers/ActionResolver.ts +78 -15
  616. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  617. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  618. package/src/resolvers/AgentSessionResolver.ts +50 -18
  619. package/src/resolvers/AutotagPipelineResolver.ts +2 -1
  620. package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
  621. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  622. package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
  623. package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
  624. package/src/resolvers/FileCategoryResolver.ts +1 -0
  625. package/src/resolvers/FileResolver.ts +14 -4
  626. package/src/resolvers/GetDataResolver.ts +35 -13
  627. package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
  628. package/src/resolvers/MCPResolver.ts +15 -2
  629. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  630. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  631. package/src/resolvers/QueryResolver.ts +20 -6
  632. package/src/resolvers/QuerySystemUserResolver.ts +207 -99
  633. package/src/resolvers/RSUResolver.ts +12 -0
  634. package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
  635. package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
  636. package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
  637. package/src/resolvers/RunAIAgentResolver.ts +518 -163
  638. package/src/resolvers/RunAIPromptResolver.ts +18 -18
  639. package/src/resolvers/RunTemplateResolver.ts +9 -5
  640. package/src/resolvers/RunTestResolver.ts +3 -1
  641. package/src/resolvers/SyncDataResolver.ts +4 -0
  642. package/src/resolvers/TestQuerySQLResolver.ts +1 -0
  643. package/src/resolvers/TransactionGroupResolver.ts +66 -15
  644. package/src/resolvers/UserViewResolver.ts +2 -1
  645. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
  646. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  647. package/src/resolvers/meetingRecordingRegistration.ts +2 -0
  648. package/src/rest/EntityCRUDHandler.ts +22 -5
  649. package/src/rest/MediaAccessKeys.ts +6 -2
  650. package/src/rest/OAuthCallbackHandler.ts +13 -5
  651. package/src/rest/RESTEndpointHandler.ts +8 -5
  652. package/src/rest/RealtimeRecordingHandler.ts +9 -10
  653. package/src/rest/ViewOperationsHandler.ts +26 -7
  654. package/src/rest/setupRESTEndpoints.ts +11 -2
  655. package/src/serverRoleConfigUnits.ts +48 -0
  656. package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
  657. package/src/services/TaskGraphActionRunner.ts +2 -23
  658. package/src/services/TaskGraphAgentRunner.ts +43 -0
  659. package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
  660. package/src/services/WorkQueueHostService.ts +26 -4
  661. package/src/services/workQueueConfig.ts +5 -5
  662. package/src/sharedCache.ts +1 -1
  663. package/src/types.ts +41 -1
  664. package/src/services/TaskOrchestration-Integration.md +0 -188
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Request-origin helpers shared by the GraphQL context (`AppContext.RequestOrigin`) and the realtime
3
+ * widget origin allowlist, so an origin read from a request and an origin read from an allowlist are
4
+ * normalized the same way and compare with plain string equality.
5
+ */
6
+
7
+ /**
8
+ * Shape of a serialized http(s) origin: scheme, host and optional port, with no path, query,
9
+ * fragment or credentials. Applied after {@link NormalizeOrigin}, so it only needs lowercase.
10
+ */
11
+ const HTTP_ORIGIN_PATTERN = /^https?:\/\/[^/?#@\s]+$/;
12
+
13
+ /** Character code of `/`. */
14
+ const SLASH_CHAR_CODE = 47;
15
+
16
+ /**
17
+ * Normalizes an origin for stable comparison: trims whitespace, lowercases, and strips trailing
18
+ * slashes. It does not parse the value or rewrite ports, so `https://a.com:443` stays as written.
19
+ * @param origin an origin as written in a header or an allowlist entry
20
+ */
21
+ export function NormalizeOrigin(origin: string): string {
22
+ return StripTrailingSlashes(origin.trim().toLowerCase());
23
+ }
24
+
25
+ /**
26
+ * Removes trailing `/` characters with a linear scan. A `/\/+$/` regex is quadratic on input with
27
+ * many `/` not at the end, and this runs on a request header the client controls.
28
+ */
29
+ function StripTrailingSlashes(value: string): string {
30
+ let end = value.length;
31
+ while (end > 0 && value.charCodeAt(end - 1) === SLASH_CHAR_CODE) {
32
+ end--;
33
+ }
34
+ return value.slice(0, end);
35
+ }
36
+
37
+ /**
38
+ * Reads a request's `Origin` header into a normalized origin (`scheme://host[:port]`).
39
+ *
40
+ * Returns undefined when the header is absent, repeated, blank, opaque (`null`, which sandboxed
41
+ * frames and privacy-sensitive redirects send), or anything other than a parseable http(s) origin.
42
+ * Ports are kept as sent: browsers omit default ports from `Origin`, and allowlist entries pass
43
+ * through the same {@link NormalizeOrigin}, so both sides agree without rewriting.
44
+ * @param originHeader the raw `Origin` header value from the request
45
+ */
46
+ export function ReadRequestOrigin(originHeader: string | string[] | undefined): string | undefined {
47
+ if (typeof originHeader !== 'string') {
48
+ return undefined;
49
+ }
50
+ const normalized = NormalizeOrigin(originHeader);
51
+ return IsHttpOrigin(normalized) ? normalized : undefined;
52
+ }
53
+
54
+ /** True when a normalized value is a parseable http(s) origin with no path, query, fragment or credentials. */
55
+ function IsHttpOrigin(normalized: string): boolean {
56
+ if (!HTTP_ORIGIN_PATTERN.test(normalized)) {
57
+ return false;
58
+ }
59
+ try {
60
+ return new URL(normalized).host.length > 0;
61
+ } catch {
62
+ return false;
63
+ }
64
+ }
@@ -1,17 +1,19 @@
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, RunView, DatabaseProviderBase } from "@memberjunction/core";
5
- import { ActionParam, ActionResult, MJActionEntityExtended } from "@memberjunction/actions-base";
4
+ import { Metadata, UserInfo, BaseEntity, CompositeKey, KeyValuePair, LogError, RunView, DatabaseProviderBase, EntityInfo, IMetadataProvider } from "@memberjunction/core";
5
+ import { ActionParam, ActionResult, MJActionEntityExtended, ProjectActionParamValuesForUser } from "@memberjunction/actions-base";
6
6
  import { UserCache } from "@memberjunction/generic-database-provider";
7
7
  import { Field, InputType, ObjectType } from "type-graphql";
8
8
  import { KeyValuePairInput } from "../generic/KeyValuePairInput.js";
9
9
  import { AppContext, ProviderInfo } from "../types.js";
10
- import { CopyScalarsAndArrays, EscapeSQLString, UUIDsEqual } from "@memberjunction/global";
10
+ import { CopyScalarsAndArrays, EscapeSQLString, IndexByUUID, UUIDsEqual } from "@memberjunction/global";
11
11
  import { GetReadOnlyProvider, GetReadWriteProvider } from "../util.js";
12
12
  import { ResolverBase } from "../generic/ResolverBase.js";
13
13
  import { IsScopeLimitedPrincipal } from "../auth/scopeLimitedPrincipal.js";
14
14
  import { EvaluateActionRunAuthorization, IsOwner } from "../auth/actionAuthorization.js";
15
+ import { EntityObjectDataBinding, ProjectActionParamsForCaller } from "../generic/actionOutputFieldSecurity.js";
16
+ import type { EntityActionResult } from "@memberjunction/actions-base";
15
17
 
16
18
  /**
17
19
  * Input type for action parameters
@@ -213,8 +215,8 @@ export class ActionResolver extends ResolverBase {
213
215
  // params.Provider.SearchEntity) run against the caller's metadata layer.
214
216
  const result = await this.executeAction(action, user, params, ctx.providers);
215
217
 
216
- // Return the result
217
- return this.createActionResult(result);
218
+ // Return the result, its output parameters projected for the caller
219
+ return this.createActionResult(result, user, ctx.providers);
218
220
  } catch (e) {
219
221
  return this.handleActionError(e);
220
222
  }
@@ -357,20 +359,29 @@ export class ActionResolver extends ResolverBase {
357
359
  }
358
360
 
359
361
  /**
360
- * Creates an action result from the execution result
362
+ * Creates an action result from the execution result. The output parameters are projected for
363
+ * the caller first (see {@link ProjectActionParamValuesForUser}): an action may return rows it
364
+ * did not load as the caller, such as engine-cached or system-user rows, so an entity object is
365
+ * sent as its field values projected for the caller and a plain row of a field-secured entity
366
+ * loses the keys the caller is denied. An entity object of an entity the caller cannot read is
367
+ * kept as it is, so `CopyScalarsAndArrays` drops it exactly as it always has.
361
368
  * @param result The execution result
369
+ * @param user The caller the result is sent to
370
+ * @param providers The request's providers, for the entity metadata the projection reads
362
371
  * @returns The formatted action result
363
372
  * @private
364
373
  */
365
- private createActionResult(result: ActionResult): ActionResultOutput {
366
- const x =(result.Params || result.RunParams.Params || [])
374
+ private createActionResult(result: ActionResult, user: UserInfo, providers: Array<ProviderInfo>): ActionResultOutput {
375
+ const outputs = (result.Params || result.RunParams.Params || [])
367
376
  .filter(p => p.Type.trim().toLowerCase() === 'output' ||
368
- p.Type.trim().toLowerCase() === 'both') ;
377
+ p.Type.trim().toLowerCase() === 'both');
378
+ const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? undefined;
379
+ const projected = ProjectActionParamValuesForUser(outputs, user, provider, { UnreadableEntityObjects: 'keep' }) ?? outputs;
369
380
  return {
370
381
  Success: result.Success,
371
382
  Message: result.Message,
372
383
  ResultCode: result.Result?.ResultCode,
373
- ResultData: x && x.length > 0 ? JSON.stringify(CopyScalarsAndArrays(x)) : undefined
384
+ ResultData: projected.length > 0 ? JSON.stringify(CopyScalarsAndArrays(projected)) : undefined
374
385
  };
375
386
  }
376
387
 
@@ -442,11 +453,11 @@ export class ActionResolver extends ResolverBase {
442
453
  };
443
454
  }
444
455
 
445
- // Return the result
456
+ // Return the result, its echoed parameters projected for the caller
446
457
  return {
447
458
  Success: result.Success,
448
459
  Message: result.Message,
449
- ResultData: JSON.stringify(result)
460
+ ResultData: JSON.stringify(this.projectEntityActionResult(result, entityAction, params.EntityObject, user, ctx.providers))
450
461
  };
451
462
  } catch (e) {
452
463
  return this.handleError(e);
@@ -513,13 +524,65 @@ export class ActionResolver extends ResolverBase {
513
524
  throw new Error("Entity information is required");
514
525
  }
515
526
 
516
- // Create a composite key and load the entity object
527
+ // Create a composite key and load the entity object FOR THE CALLER: with no user the load
528
+ // falls back to the provider's current user, which on a server is the system user (every
529
+ // column, and none of the caller's row-level security).
517
530
  const compositeKey = this.createCompositeKey(entity, input.PrimaryKey);
518
- const entityObject = await md.GetEntityObject(entity.Name);
519
- await entityObject.InnerLoad(compositeKey);
531
+ const entityObject = await md.GetEntityObject(entity.Name, user);
532
+ if (!await entityObject.InnerLoad(compositeKey)) {
533
+ // One message whether the record is missing or out of the caller's reach.
534
+ throw new Error('Record not found or access denied');
535
+ }
520
536
  params['EntityObject'] = entityObject;
521
537
  }
522
538
 
539
+ /**
540
+ * The entity action result as it may be sent to `user`: its parameters, which the result echoes
541
+ * (in `Params` and in `RunParams.Params`), projected for the caller wherever their entity is known.
542
+ * That is any entity object among them, and the parameters bound to the record's field values
543
+ * (`'Entity Object Data'`), whose entity is the bound record's. Any other value then passes the
544
+ * general backstop ({@link ProjectActionParamValuesForUser}), which narrows plain objects shaped
545
+ * like a row of a field-secured entity.
546
+ */
547
+ private projectEntityActionResult(
548
+ result: EntityActionResult,
549
+ entityAction: { EntityID?: string; Params?: Array<{ ActionParamID: string; ValueType: string }> },
550
+ entityObject: BaseEntity | undefined,
551
+ user: UserInfo,
552
+ providers: Array<ProviderInfo>
553
+ ): EntityActionResult {
554
+ const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true }) ?? undefined;
555
+ const binding = this.entityObjectDataBinding(entityAction, entityObject, provider);
556
+ const project = (params: ActionParam[]) =>
557
+ ProjectActionParamValuesForUser(ProjectActionParamsForCaller(params, user, provider, binding), user, provider, { UnreadableEntityObjects: 'keep' });
558
+ const projected: EntityActionResult = { ...result, Params: project(result.Params) };
559
+ if (result.RunParams) {
560
+ projected.RunParams = { ...result.RunParams, Params: project(result.RunParams.Params) };
561
+ }
562
+ return projected;
563
+ }
564
+
565
+ /** The action parameters bound as `'Entity Object Data'`, with the entity their values belong to. */
566
+ private entityObjectDataBinding(
567
+ entityAction: { EntityID?: string; Params?: Array<{ ActionParamID: string; ValueType: string }> },
568
+ entityObject: BaseEntity | undefined,
569
+ provider: IMetadataProvider | undefined
570
+ ): EntityObjectDataBinding | undefined {
571
+ const entityInfo: EntityInfo | undefined = entityObject?.EntityInfo
572
+ ?? provider?.Entities?.find(e => UUIDsEqual(e.ID, entityAction?.EntityID));
573
+ if (!entityInfo) {
574
+ return undefined;
575
+ }
576
+ const names = new Set<string>();
577
+ const dataParams = (entityAction?.Params ?? []).filter(eap => eap.ValueType === 'Entity Object Data');
578
+ const actionParamsById = dataParams.length > 0 ? IndexByUUID(ActionEngineServer.Instance.ActionParams) : null;
579
+ for (const eap of dataParams) {
580
+ const param = actionParamsById?.Get(eap.ActionParamID);
581
+ if (param?.Name) names.add(param.Name.trim().toLowerCase());
582
+ }
583
+ return names.size > 0 ? { EntityInfo: entityInfo, ParamNames: names } : undefined;
584
+ }
585
+
523
586
  /**
524
587
  * Creates a composite key from the input
525
588
  * @param entity The entity information
@@ -139,6 +139,7 @@ export class AdhocQueryResolver extends ResolverBase {
139
139
  QueryID: '',
140
140
  QueryName: 'Ad-Hoc Query',
141
141
  Success: true,
142
+ // fls-guard: query rows; the SQL is refused before it runs if it reads a field the caller is denied
142
143
  Results: JSON.stringify(result.Results),
143
144
  RowCount: result.RowCount,
144
145
  TotalRowCount: result.TotalRowCount,
@@ -14,8 +14,10 @@ import type {
14
14
  AgentExecutionStreamingCallback,
15
15
  ExecuteAgentResult,
16
16
  } from '@memberjunction/ai-core-plus';
17
+ import type { EntityInfo } from '@memberjunction/core';
17
18
  import type { UserPayload } from '../types.js';
18
- import { PublishStatusUpdate } from '../generic/PushStatusResolver.js';
19
+ import { PublishStatusUpdate, StatusUpdateOwnerID } from '../generic/PushStatusResolver.js';
20
+ import { ProjectEntityObjectForCaller } from '../generic/fieldSecurityTransport.js';
19
21
 
20
22
  const SIGNIFICANT_STEPS = ['prompt_execution', 'action_execution', 'subagent_execution', 'decision_processing'];
21
23
 
@@ -25,7 +27,8 @@ interface StatusRun {
25
27
  ConversationDetailID?: string;
26
28
  ErrorMessage?: string;
27
29
  Steps?: Array<{ StepName?: string }>;
28
- GetAll?: () => unknown;
30
+ EntityInfo?: EntityInfo | null;
31
+ GetAll?: () => Record<string, unknown>;
29
32
  }
30
33
 
31
34
  export class AgentRunStatusPublisher {
@@ -34,11 +37,15 @@ export class AgentRunStatusPublisher {
34
37
  /**
35
38
  * @param sessionId Session stamped on the message body. Defaults to the payload's session.
36
39
  * The push itself is always addressed to `userPayload.sessionId`, matching the resolver.
40
+ * @param conversationDetailId The run's reply row. When set, every message carries it as
41
+ * `conversationDetailId`, not only the completion, so a client that reconnects mid-run can
42
+ * find its row. When omitted, messages are as before.
37
43
  */
38
44
  constructor(
39
45
  private readonly pubSub: PubSubEngine,
40
46
  private readonly userPayload: UserPayload,
41
47
  private readonly sessionId: string = userPayload.sessionId,
48
+ private readonly conversationDetailId?: string,
42
49
  ) {}
43
50
 
44
51
  /** Latest run observed from a progress event, including steps that are not published. */
@@ -66,7 +73,8 @@ export class AgentRunStatusPublisher {
66
73
  sessionId: this.sessionId,
67
74
  agentRunId: agentRun.ID,
68
75
  type: 'progress',
69
- agentRun: agentRun.GetAll ? agentRun.GetAll() : agentRun,
76
+ ...this.replyRow(),
77
+ agentRun: this.runValues(agentRun),
70
78
  progress: {
71
79
  currentStep: progress.step,
72
80
  percentage: progress.percentage,
@@ -93,7 +101,8 @@ export class AgentRunStatusPublisher {
93
101
  sessionId: this.sessionId,
94
102
  agentRunId: agentRun.ID,
95
103
  type: 'streaming',
96
- agentRun: agentRun.GetAll ? agentRun.GetAll() : agentRun,
104
+ ...this.replyRow(),
105
+ agentRun: this.runValues(agentRun),
97
106
  streaming: {
98
107
  content: chunk.content,
99
108
  isPartial: !chunk.isComplete,
@@ -122,6 +131,7 @@ export class AgentRunStatusPublisher {
122
131
  sessionId: this.sessionId,
123
132
  agentRunId: agentRun.ID,
124
133
  type: 'partial_result',
134
+ ...this.replyRow(),
125
135
  partialResult: {
126
136
  currentStep: lastStep,
127
137
  partialOutput: result.payload || undefined,
@@ -134,7 +144,7 @@ export class AgentRunStatusPublisher {
134
144
  agentRunId: agentRun?.ID || 'unknown',
135
145
  type: 'complete',
136
146
  timestamp: new Date(),
137
- conversationDetailId: conversationDetailId || agentRun?.ConversationDetailID,
147
+ conversationDetailId: conversationDetailId || agentRun?.ConversationDetailID || this.conversationDetailId,
138
148
  success: result.success,
139
149
  errorMessage: agentRun?.ErrorMessage || undefined,
140
150
  result: resultJson || undefined,
@@ -142,8 +152,9 @@ export class AgentRunStatusPublisher {
142
152
  }
143
153
 
144
154
  /**
145
- * Completion for a failure that has no run. The fire-and-forget path uses this when
146
- * `executeAIAgent` rejects. A host uses it the same way: when the turn throws
155
+ * Completion for a failure that has no run result. `executeAIAgent` sends it when the run
156
+ * throws (the agent could not start, the run failed, or its reply could not be saved), so a
157
+ * fire-and-forget client learns the reason. A host uses it the same way: when the turn throws
147
158
  * instead of returning a result, call `PublishFailure` with the reply row's id
148
159
  * and the error. That completion is what tells the chat the reply finished.
149
160
  */
@@ -160,10 +171,27 @@ export class AgentRunStatusPublisher {
160
171
  });
161
172
  }
162
173
 
174
+ /** `{ conversationDetailId }` when this run has a reply row, otherwise nothing, so the message keeps its old shape. */
175
+ private replyRow(): { conversationDetailId?: string } {
176
+ return this.conversationDetailId ? { conversationDetailId: this.conversationDetailId } : {};
177
+ }
178
+
179
+ /**
180
+ * The run's field values as the recipient may read them. The run object comes from the agent
181
+ * engine, which is not bound to this session's user, so it is projected here.
182
+ */
183
+ private runValues(agentRun: StatusRun): unknown {
184
+ if (!agentRun.GetAll) {
185
+ return agentRun;
186
+ }
187
+ const getAll = agentRun.GetAll;
188
+ return ProjectEntityObjectForCaller({ EntityInfo: agentRun.EntityInfo, GetAll: () => getAll.call(agentRun) }, this.userPayload?.userRecord);
189
+ }
190
+
163
191
  private publish(type: 'ExecutionProgress' | 'StreamingContent', data: unknown): void {
164
192
  PublishStatusUpdate(this.pubSub, {
165
193
  sessionId: this.userPayload.sessionId,
166
- ownerUserId: this.userPayload?.userRecord?.ID ?? '',
194
+ ownerUserId: StatusUpdateOwnerID(this.userPayload),
167
195
  message: JSON.stringify({
168
196
  resolver: 'RunAIAgentResolver',
169
197
  type,
@@ -13,12 +13,34 @@
13
13
  */
14
14
  import { Resolver, Mutation, Arg, Ctx, ObjectType, Field } from 'type-graphql';
15
15
  import { AppContext } from '../types.js';
16
- import { UserInfo, IMetadataProvider, LogError } from '@memberjunction/core';
17
- import { UUIDsEqual } from '@memberjunction/global';
18
- import { MJAIAgentSessionEntity } from '@memberjunction/core-entities';
16
+ import { UserInfo, IMetadataProvider } from '@memberjunction/core';
19
17
  import { ResolverBase } from '../generic/ResolverBase.js';
20
18
  import { GetReadWriteProvider } from '../util.js';
21
- import { SessionManager, SessionAuthorizationError } from '../agentSessions/index.js';
19
+ import { SessionManager, SessionAuthorizationError, type SessionCloseReason } from '../agentSessions/index.js';
20
+ import {
21
+ LoadOwnedRealtimeSession,
22
+ RealtimeSessionNotFoundError,
23
+ RealtimeSessionOwnershipError,
24
+ } from '../realtimeSessions/ownedRealtimeSession.js';
25
+
26
+ /**
27
+ * The `CloseReason` values a client may stamp on its own session; `Idle`, `Janitor` and `Shutdown` are the server's.
28
+ * `TimeLimit` is a claim: the browser's deadline alarm fired, and {@link SessionManager.CloseSession} verifies it
29
+ * against the session's stored deadline, recording `Explicit` instead when the deadline is not near.
30
+ */
31
+ const CLIENT_CLOSE_REASONS: readonly SessionCloseReason[] = ['Explicit', 'Error', 'TimeLimit'];
32
+
33
+ /** Reads the mutation's optional `closeReason`: absent means `Explicit`; a server-only or unknown value is refused. */
34
+ function ParseClientCloseReason(closeReason: string | null | undefined): SessionCloseReason {
35
+ if (closeReason == null || closeReason === '') {
36
+ return 'Explicit';
37
+ }
38
+ const match = CLIENT_CLOSE_REASONS.find((r) => r === closeReason);
39
+ if (!match) {
40
+ throw new Error(`Unsupported close reason '${closeReason}': a client may close its session as ${CLIENT_CLOSE_REASONS.join(' or ')}`);
41
+ }
42
+ return match;
43
+ }
22
44
 
23
45
  /** Result of {@link AgentSessionResolver.StartAgentSession}. */
24
46
  @ObjectType()
@@ -77,15 +99,22 @@ export class AgentSessionResolver extends ResolverBase {
77
99
  /**
78
100
  * Close a session. Rejects unless the caller owns it. Returns `true` on a successful (or
79
101
  * idempotent) close, `false` if the session can't be loaded.
102
+ *
103
+ * `closeReason` is what the row records as its `CloseReason`: `Explicit` (the default, and what
104
+ * every client sent before the argument existed) when the user or host ended the call, `Error`
105
+ * when the client ended it because the start or the call failed (MJ#6013). The other reasons are
106
+ * the server's own (janitor, shutdown) and are refused from a client.
80
107
  */
81
108
  @Mutation(() => Boolean)
82
109
  async CloseAgentSession(
83
110
  @Arg('agentSessionId') agentSessionId: string,
84
111
  @Ctx() { userPayload, providers }: AppContext,
112
+ @Arg('closeReason', () => String, { nullable: true }) closeReason?: string | null,
85
113
  ): Promise<boolean> {
114
+ const reason = ParseClientCloseReason(closeReason);
86
115
  const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
87
- await this.assertOwnership(agentSessionId, contextUser, provider);
88
- return this.sessionManager.CloseSession(agentSessionId, contextUser, provider);
116
+ await this.loadOwnedSession(agentSessionId, contextUser, provider);
117
+ return this.sessionManager.CloseSession(agentSessionId, contextUser, provider, reason);
89
118
  }
90
119
 
91
120
  /**
@@ -98,7 +127,7 @@ export class AgentSessionResolver extends ResolverBase {
98
127
  @Ctx() { userPayload, providers }: AppContext,
99
128
  ): Promise<boolean> {
100
129
  const { contextUser, provider } = this.requireUserAndProvider(userPayload, providers);
101
- await this.assertOwnership(agentSessionId, contextUser, provider);
130
+ await this.loadOwnedSession(agentSessionId, contextUser, provider);
102
131
  return this.sessionManager.Heartbeat(agentSessionId, contextUser, provider);
103
132
  }
104
133
 
@@ -117,22 +146,25 @@ export class AgentSessionResolver extends ResolverBase {
117
146
  }
118
147
 
119
148
  /**
120
- * Inbound ownership gate (the one genuinely new session-authz primitive): the session's `UserID`
121
- * must equal the caller's. Throws on mismatch or when the session can't be loaded.
149
+ * Inbound ownership gate: delegates to {@link LoadOwnedRealtimeSession} (which enforces both
150
+ * `UserID === contextUser.ID` and `AuthorizeSessionAccess` scope/visitor binding) and maps its
151
+ * typed errors to this resolver's message format.
122
152
  */
123
- private async assertOwnership(
153
+ private async loadOwnedSession(
124
154
  agentSessionId: string,
125
155
  contextUser: UserInfo,
126
156
  provider: IMetadataProvider,
127
157
  ): Promise<void> {
128
- const session = await provider.GetEntityObject<MJAIAgentSessionEntity>('MJ: AI Agent Sessions', contextUser);
129
- const loaded = await session.Load(agentSessionId);
130
- if (!loaded) {
131
- throw new Error(`Agent session ${agentSessionId} not found`);
132
- }
133
- if (!UUIDsEqual(session.UserID, contextUser.ID)) {
134
- LogError(`AgentSessionResolver: ownership check failed — user ${contextUser.ID} attempted to operate on session ${agentSessionId} owned by ${session.UserID}`);
135
- throw new Error('Not authorized: you do not own this agent session');
158
+ try {
159
+ await LoadOwnedRealtimeSession(agentSessionId, contextUser, provider);
160
+ } catch (err) {
161
+ if (err instanceof RealtimeSessionNotFoundError) {
162
+ throw new Error(`Agent session ${agentSessionId} not found`);
163
+ }
164
+ if (err instanceof RealtimeSessionOwnershipError) {
165
+ throw new Error('Not authorized: you do not own this agent session');
166
+ }
167
+ throw err;
136
168
  }
137
169
  }
138
170
  }
@@ -170,7 +170,8 @@ export class AutotagPipelineResolver extends ResolverBase {
170
170
  EntityName: 'MJ: Content Sources',
171
171
  Fields: ['ID'],
172
172
  ResultType: 'simple',
173
- MaxRows: 1
173
+ MaxRows: 1,
174
+ SkipTotalRowCount: true
174
175
  }, currentUser);
175
176
  if (result.Success && result.Results.length > 0) {
176
177
  sourceID = result.Results[0].ID;
@@ -235,6 +235,7 @@ export class ConversationRunEventsResolver {
235
235
  EntityName: 'MJ: Conversation Details',
236
236
  ExtraFilter: `ID='${this.escape(conversationDetailID)}'`,
237
237
  MaxRows: 1,
238
+ SkipTotalRowCount: true,
238
239
  ResultType: 'entity_object',
239
240
  BypassCache: true,
240
241
  },
@@ -259,6 +260,7 @@ export class ConversationRunEventsResolver {
259
260
  ExtraFilter: `ConversationDetailID='${this.escape(conversationDetailID)}'`,
260
261
  OrderBy: '__mj_CreatedAt DESC',
261
262
  MaxRows: 1,
263
+ SkipTotalRowCount: true,
262
264
  Fields: RUN_FIELDS,
263
265
  ResultType: 'simple',
264
266
  BypassCache: true,
@@ -3,12 +3,14 @@ import { AppContext } from '../types.js';
3
3
  import { RunViewByIDInput } from '../generic/RunViewResolver.js';
4
4
  import { Message } from '@memberjunction/communication-types';
5
5
  import { EntityCommunicationsEngine } from '@memberjunction/entity-communications-server';
6
- import { RunViewParams } from '@memberjunction/core';
6
+ import { DatabaseProviderBase, IMetadataProvider, RunViewParams, UserInfo } from '@memberjunction/core';
7
+ import { UUIDsEqual } from '@memberjunction/global';
7
8
  import { GraphQLJSONObject } from 'graphql-type-json';
8
9
  import { TemplateEngineServer } from '@memberjunction/templates';
9
10
  import { EntityCommunicationParams } from '@memberjunction/entity-communications-base';
10
11
  import { z } from 'zod';
11
12
  import { ResolverBase } from '../generic/ResolverBase.js';
13
+ import { GetReadOnlyProvider } from '../util.js';
12
14
 
13
15
  @InputType()
14
16
  export class CommunicationProviderMessageType {
@@ -168,6 +170,11 @@ export class RunEntityCommunicationResultType {
168
170
 
169
171
  @Resolver(RunEntityCommunicationResultType)
170
172
  export class ReportResolver extends ResolverBase {
173
+ /**
174
+ * Runs a message against a view of records, as the caller. The recipient and related-entity reads
175
+ * run as the authenticated user, so a preview returns and a send merges only rows and fields that
176
+ * user may read. The view's client-supplied clauses get the same screen as a RunView request.
177
+ */
171
178
  @Query(() => RunEntityCommunicationResultType)
172
179
  async RunEntityCommunicationByViewID(
173
180
  @Arg('entityID', () => String) entityID: string,
@@ -177,25 +184,29 @@ export class ReportResolver extends ResolverBase {
177
184
  @Arg('message', () => CommunicationMessageInput) message: CommunicationMessageInput,
178
185
  @Arg('previewOnly', () => Boolean) previewOnly: boolean,
179
186
  @Arg('includeProcessedMessages', () => Boolean) includeProcessedMessages: boolean,
180
- @Ctx() { userPayload }: AppContext
187
+ @Ctx() { userPayload, providers }: AppContext
181
188
  ): Promise<RunEntityCommunicationResultType> {
182
189
  // Check API key scope authorization for communication send
183
190
  await this.CheckAPIKeyScopeAuthorization('communication:send', entityID, userPayload);
184
191
 
185
192
  try {
186
- await EntityCommunicationsEngine.Instance.Config(false, userPayload.userRecord);
187
- const newMessage = new Message(message as unknown as Message);
188
- await TemplateEngineServer.Instance.Config(false, userPayload.userRecord);
189
- // for the templates, replace the values from the input with the objects from the Template Engine we have here
190
- if (newMessage.BodyTemplate) {
191
- newMessage.BodyTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.BodyTemplate.Name);
192
- }
193
- if (newMessage.HTMLBodyTemplate) {
194
- newMessage.HTMLBodyTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.HTMLBodyTemplate.Name);
195
- }
196
- if (newMessage.SubjectTemplate) {
197
- newMessage.SubjectTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.SubjectTemplate.Name);
198
- }
193
+ const contextUser = this.GetUserFromPayload(userPayload);
194
+ if (!contextUser) throw new Error('Unable to determine the acting user for this communication');
195
+ const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
196
+ this.screenClientViewClauses(
197
+ {
198
+ extraFilter: runViewByIDInput.ExtraFilter,
199
+ orderBy: runViewByIDInput.OrderBy,
200
+ userSearchString: runViewByIDInput.UserSearchString,
201
+ overrideExcludeFilter: runViewByIDInput.OverrideExcludeFilter,
202
+ },
203
+ provider as unknown as IMetadataProvider,
204
+ contextUser,
205
+ );
206
+ await this.assertViewBelongsToEntity(runViewByIDInput.ViewID, entityID, provider, contextUser);
207
+
208
+ await EntityCommunicationsEngine.Instance.Config(false, contextUser);
209
+ const newMessage = await this.resolveMessageTemplates(message, contextUser);
199
210
  const params: EntityCommunicationParams = {
200
211
  EntityID: entityID,
201
212
  RunViewParams: <RunViewParams>runViewByIDInput,
@@ -204,6 +215,8 @@ export class ReportResolver extends ResolverBase {
204
215
  Message: newMessage,
205
216
  PreviewOnly: previewOnly,
206
217
  IncludeProcessedMessages: includeProcessedMessages,
218
+ ContextUser: contextUser,
219
+ Provider: provider,
207
220
  };
208
221
  const result = await EntityCommunicationsEngine.Instance.RunEntityCommunication(params);
209
222
  return {
@@ -222,4 +235,32 @@ export class ReportResolver extends ResolverBase {
222
235
  };
223
236
  }
224
237
  }
238
+
239
+ /**
240
+ * Refuses a view that is not a view of `entityID`, with the same message as for a view that does
241
+ * not exist or that the caller cannot load, so the refusal does not reveal which views exist.
242
+ */
243
+ private async assertViewBelongsToEntity(viewID: string | undefined, entityID: string, provider: DatabaseProviderBase, contextUser: UserInfo): Promise<void> {
244
+ if (!viewID) return;
245
+ const view = await this.resolveUserViewByID(viewID, provider, contextUser);
246
+ if (!view?.ID || !UUIDsEqual(view.ID, viewID) || !UUIDsEqual(view.EntityID, entityID)) {
247
+ throw new Error('The requested view does not exist or you do not have access to it');
248
+ }
249
+ }
250
+
251
+ /** Builds the message, replacing each template the client named with the server's copy of it. */
252
+ private async resolveMessageTemplates(message: CommunicationMessageInput, contextUser: UserInfo): Promise<Message> {
253
+ const newMessage = new Message(message as unknown as Message);
254
+ await TemplateEngineServer.Instance.Config(false, contextUser);
255
+ if (newMessage.BodyTemplate) {
256
+ newMessage.BodyTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.BodyTemplate.Name);
257
+ }
258
+ if (newMessage.HTMLBodyTemplate) {
259
+ newMessage.HTMLBodyTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.HTMLBodyTemplate.Name);
260
+ }
261
+ if (newMessage.SubjectTemplate) {
262
+ newMessage.SubjectTemplate = TemplateEngineServer.Instance.FindTemplate(newMessage.SubjectTemplate.Name);
263
+ }
264
+ return newMessage;
265
+ }
225
266
  }