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

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 (560) hide show
  1. package/README.md +47 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/SessionJanitor.d.ts +91 -30
  4. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  5. package/dist/agentSessions/SessionJanitor.js +311 -81
  6. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  7. package/dist/agentSessions/SessionManager.d.ts +17 -3
  8. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  9. package/dist/agentSessions/SessionManager.js +44 -10
  10. package/dist/agentSessions/SessionManager.js.map +1 -1
  11. package/dist/apiRoot.d.ts +32 -0
  12. package/dist/apiRoot.d.ts.map +1 -0
  13. package/dist/apiRoot.js +67 -0
  14. package/dist/apiRoot.js.map +1 -0
  15. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  16. package/dist/auth/AuthProviderCatalogRouter.js +27 -0
  17. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  18. package/dist/auth/LoginScreenEngine.d.ts +22 -0
  19. package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
  20. package/dist/auth/LoginScreenEngine.js +57 -0
  21. package/dist/auth/LoginScreenEngine.js.map +1 -0
  22. package/dist/auth/index.d.ts +1 -0
  23. package/dist/auth/index.d.ts.map +1 -1
  24. package/dist/auth/index.js +52 -10
  25. package/dist/auth/index.js.map +1 -1
  26. package/dist/auth/initializeProviders.d.ts +10 -0
  27. package/dist/auth/initializeProviders.d.ts.map +1 -1
  28. package/dist/auth/initializeProviders.js +37 -1
  29. package/dist/auth/initializeProviders.js.map +1 -1
  30. package/dist/auth/localDevAuth.d.ts +79 -0
  31. package/dist/auth/localDevAuth.d.ts.map +1 -0
  32. package/dist/auth/localDevAuth.js +439 -0
  33. package/dist/auth/localDevAuth.js.map +1 -0
  34. package/dist/auth/magicLink/MagicLinkKeys.d.ts +2 -2
  35. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  36. package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
  37. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  38. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  39. package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
  40. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  41. package/dist/auth/magicLink/types.d.ts +12 -0
  42. package/dist/auth/magicLink/types.d.ts.map +1 -1
  43. package/dist/auth/sessionUserClone.d.ts +1 -1
  44. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  45. package/dist/auth/sessionUserClone.js +3 -2
  46. package/dist/auth/sessionUserClone.js.map +1 -1
  47. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  48. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  49. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  50. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  51. package/dist/broadcast/index.d.ts +6 -0
  52. package/dist/broadcast/index.d.ts.map +1 -0
  53. package/dist/broadcast/index.js +6 -0
  54. package/dist/broadcast/index.js.map +1 -0
  55. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  56. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  57. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  58. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  59. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  60. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  61. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  62. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  63. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  64. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  65. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  66. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  67. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  68. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  69. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  70. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  71. package/dist/cache.d.ts +3 -2
  72. package/dist/cache.d.ts.map +1 -1
  73. package/dist/cache.js.map +1 -1
  74. package/dist/config.d.ts +632 -22
  75. package/dist/config.d.ts.map +1 -1
  76. package/dist/config.js +104 -4
  77. package/dist/config.js.map +1 -1
  78. package/dist/context.d.ts +3 -1
  79. package/dist/context.d.ts.map +1 -1
  80. package/dist/context.js +29 -8
  81. package/dist/context.js.map +1 -1
  82. package/dist/coreRoutes.d.ts +29 -0
  83. package/dist/coreRoutes.d.ts.map +1 -0
  84. package/dist/coreRoutes.js +156 -0
  85. package/dist/coreRoutes.js.map +1 -0
  86. package/dist/generated/graphql-schemas/__mj.d.ts +1016 -29
  87. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  88. package/dist/generated/graphql-schemas/__mj.js +5125 -434
  89. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  90. package/dist/generic/CacheInvalidationResolver.d.ts +85 -30
  91. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  92. package/dist/generic/CacheInvalidationResolver.js +175 -60
  93. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  94. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  95. package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
  96. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  97. package/dist/generic/PubSubManager.d.ts +10 -0
  98. package/dist/generic/PubSubManager.d.ts.map +1 -1
  99. package/dist/generic/PubSubManager.js +44 -1
  100. package/dist/generic/PubSubManager.js.map +1 -1
  101. package/dist/generic/PushStatusResolver.d.ts +39 -6
  102. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  103. package/dist/generic/PushStatusResolver.js +94 -12
  104. package/dist/generic/PushStatusResolver.js.map +1 -1
  105. package/dist/generic/ResolverBase.d.ts +168 -69
  106. package/dist/generic/ResolverBase.d.ts.map +1 -1
  107. package/dist/generic/ResolverBase.js +464 -405
  108. package/dist/generic/ResolverBase.js.map +1 -1
  109. package/dist/generic/RunViewResolver.d.ts +11 -3
  110. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  111. package/dist/generic/RunViewResolver.js +91 -13
  112. package/dist/generic/RunViewResolver.js.map +1 -1
  113. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  114. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  115. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  116. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  117. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  118. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  119. package/dist/generic/fieldSecurityTransport.js +30 -0
  120. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  121. package/dist/globalCors.d.ts +33 -0
  122. package/dist/globalCors.d.ts.map +1 -0
  123. package/dist/globalCors.js +58 -0
  124. package/dist/globalCors.js.map +1 -0
  125. package/dist/index.d.ts +14 -0
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +230 -222
  128. package/dist/index.js.map +1 -1
  129. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  130. package/dist/integration/CustomColumnPromoter.js +6 -1
  131. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  132. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  133. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  134. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  135. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  136. package/dist/multiTenancy/index.d.ts.map +1 -1
  137. package/dist/multiTenancy/index.js +22 -2
  138. package/dist/multiTenancy/index.js.map +1 -1
  139. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
  140. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
  141. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
  142. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
  143. package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
  144. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
  145. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
  146. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
  147. package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
  148. package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
  149. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  150. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  151. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  152. package/dist/realtimeSessions/index.d.ts +2 -0
  153. package/dist/realtimeSessions/index.d.ts.map +1 -1
  154. package/dist/realtimeSessions/index.js +2 -0
  155. package/dist/realtimeSessions/index.js.map +1 -1
  156. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +32 -0
  157. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
  158. package/dist/realtimeSessions/ownedRealtimeSession.js +56 -0
  159. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
  160. package/dist/realtimeSessions/sessionAccess.d.ts +91 -8
  161. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  162. package/dist/realtimeSessions/sessionAccess.js +127 -20
  163. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  164. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  165. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  166. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  167. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  168. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  169. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  170. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  171. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  172. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  173. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  174. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  175. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  176. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  177. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  178. package/dist/realtimeWidget/WidgetSessionService.js +201 -19
  179. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  180. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  181. package/dist/realtimeWidget/host-identity.js +1 -1
  182. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  183. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  184. package/dist/realtimeWidget/widgetCore.js +17 -1
  185. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  186. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  187. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  188. package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
  189. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  190. package/dist/resolvers/ActionResolver.d.ts +19 -1
  191. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  192. package/dist/resolvers/ActionResolver.js +63 -12
  193. package/dist/resolvers/ActionResolver.js.map +1 -1
  194. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  195. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  196. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  197. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  198. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  199. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  200. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  201. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  202. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  203. package/dist/resolvers/AgentSessionResolver.js +40 -17
  204. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  205. package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
  206. package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
  207. package/dist/resolvers/ArtifactFileResolver.js +9 -7
  208. package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
  209. package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
  210. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  211. package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
  212. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  213. package/dist/resolvers/DatasetResolver.d.ts +24 -3
  214. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  215. package/dist/resolvers/DatasetResolver.js +57 -8
  216. package/dist/resolvers/DatasetResolver.js.map +1 -1
  217. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  218. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  219. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  220. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  221. package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
  222. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  223. package/dist/resolvers/EntityRecordNameResolver.js +3 -2
  224. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  225. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +46 -3
  226. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  227. package/dist/resolvers/FetchEntityVectorsResolver.js +211 -50
  228. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  229. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  230. package/dist/resolvers/FileCategoryResolver.js +1 -0
  231. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  232. package/dist/resolvers/FileResolver.d.ts +87 -11
  233. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  234. package/dist/resolvers/FileResolver.js +292 -105
  235. package/dist/resolvers/FileResolver.js.map +1 -1
  236. package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
  237. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  238. package/dist/resolvers/GetDataContextDataResolver.js +117 -38
  239. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  240. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  241. package/dist/resolvers/GetDataResolver.js +6 -3
  242. package/dist/resolvers/GetDataResolver.js.map +1 -1
  243. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  244. package/dist/resolvers/IntegrationDiscoveryResolver.js +49 -9
  245. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  246. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  247. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  248. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  249. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  250. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  251. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  252. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  253. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  254. package/dist/resolvers/QueryResolver.d.ts +2 -0
  255. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  256. package/dist/resolvers/QueryResolver.js +33 -6
  257. package/dist/resolvers/QueryResolver.js.map +1 -1
  258. package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
  259. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  260. package/dist/resolvers/QuerySystemUserResolver.js +15 -6
  261. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  262. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  263. package/dist/resolvers/RSUResolver.js +12 -0
  264. package/dist/resolvers/RSUResolver.js.map +1 -1
  265. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +18 -10
  266. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  267. package/dist/resolvers/RealtimeClientSessionResolver.js +92 -54
  268. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  269. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  270. package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
  271. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  272. package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
  273. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  274. package/dist/resolvers/RunAIAgentResolver.js +241 -67
  275. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  276. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  277. package/dist/resolvers/RunTemplateResolver.js +4 -4
  278. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  279. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  280. package/dist/resolvers/RunTestResolver.js +3 -1
  281. package/dist/resolvers/RunTestResolver.js.map +1 -1
  282. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
  283. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
  284. package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
  285. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  286. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  287. package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
  288. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  289. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  290. package/dist/resolvers/SyncDataResolver.js +4 -0
  291. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  292. package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
  293. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  294. package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
  295. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  296. package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
  297. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  298. package/dist/resolvers/TestQuerySQLResolver.js +66 -13
  299. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  300. package/dist/resolvers/TransactionGroupResolver.d.ts +34 -2
  301. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  302. package/dist/resolvers/TransactionGroupResolver.js +150 -27
  303. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  304. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  305. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  306. package/dist/resolvers/UserViewResolver.js +2 -1
  307. package/dist/resolvers/UserViewResolver.js.map +1 -1
  308. package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
  309. package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
  310. package/dist/resolvers/agent-run-data-guard.js +72 -0
  311. package/dist/resolvers/agent-run-data-guard.js.map +1 -0
  312. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  313. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  314. package/dist/rest/EntityCRUDHandler.js +19 -5
  315. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  316. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  317. package/dist/rest/RESTEndpointHandler.js +8 -5
  318. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  319. package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
  320. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
  321. package/dist/rest/RealtimeRecordingHandler.js +383 -0
  322. package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
  323. package/dist/rest/ViewOperationsHandler.d.ts +9 -1
  324. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  325. package/dist/rest/ViewOperationsHandler.js +43 -17
  326. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  327. package/dist/rest/setupRESTEndpoints.d.ts +6 -0
  328. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  329. package/dist/rest/setupRESTEndpoints.js +6 -0
  330. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  331. package/dist/serverExtensionReservedRoots.d.ts +12 -10
  332. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  333. package/dist/serverExtensionReservedRoots.js +14 -17
  334. package/dist/serverExtensionReservedRoots.js.map +1 -1
  335. package/dist/serverRoleConfigUnits.d.ts +29 -0
  336. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  337. package/dist/serverRoleConfigUnits.js +33 -0
  338. package/dist/serverRoleConfigUnits.js.map +1 -0
  339. package/dist/services/MJStorageBlobStore.d.ts +8 -1
  340. package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
  341. package/dist/services/MJStorageBlobStore.js +25 -19
  342. package/dist/services/MJStorageBlobStore.js.map +1 -1
  343. package/dist/services/StartTaskGraphDispatcher.js +2 -2
  344. package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
  345. package/dist/services/TaskGraphActionRunner.d.ts +5 -3
  346. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  347. package/dist/services/TaskGraphActionRunner.js +27 -5
  348. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  349. package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
  350. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  351. package/dist/services/TaskGraphAgentRunner.js +157 -9
  352. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  353. package/dist/services/TaskGraphContinuationDeliverer.d.ts +59 -2
  354. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  355. package/dist/services/TaskGraphContinuationDeliverer.js +626 -16
  356. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  357. package/dist/sharedCache.d.ts.map +1 -1
  358. package/dist/sharedCache.js +3 -0
  359. package/dist/sharedCache.js.map +1 -1
  360. package/dist/types.d.ts +23 -1
  361. package/dist/types.d.ts.map +1 -1
  362. package/dist/types.js.map +1 -1
  363. package/package.json +99 -98
  364. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  365. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  366. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  367. package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
  368. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  369. package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
  370. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  371. package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
  372. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  373. package/src/__tests__/FetchEntityVectorsResolver.test.ts +369 -18
  374. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  375. package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
  376. package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
  377. package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
  378. package/src/__tests__/LoginScreenEngine.test.ts +86 -0
  379. package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
  380. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  381. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  382. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  383. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  384. package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
  385. package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
  386. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
  387. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
  388. package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
  389. package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
  390. package/src/__tests__/ResolverBase.clientOldValues.test.ts +243 -7
  391. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  392. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
  393. package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
  394. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
  395. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  396. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  397. package/src/__tests__/RunAIAgentResolver.branch.test.ts +69 -13
  398. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  399. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  400. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +20 -28
  401. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +264 -0
  402. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  403. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
  404. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  405. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  406. package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
  407. package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
  408. package/src/__tests__/SessionJanitor.test.ts +365 -10
  409. package/src/__tests__/SessionManager.test.ts +122 -0
  410. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
  411. package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
  412. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +468 -23
  413. package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
  414. package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
  415. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  416. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
  417. package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
  418. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  419. package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
  420. package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
  421. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  422. package/src/__tests__/agent-run-data-guard.test.ts +130 -0
  423. package/src/__tests__/apiRootBoot.test.ts +202 -0
  424. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  425. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  426. package/src/__tests__/cacheInvalidationRecordData.test.ts +109 -0
  427. package/src/__tests__/conversationRunEvents.test.ts +56 -14
  428. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  429. package/src/__tests__/globalCors.test.ts +217 -0
  430. package/src/__tests__/localDevAuth.test.ts +196 -0
  431. package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
  432. package/src/__tests__/multiTenancy.security.test.ts +51 -0
  433. package/src/__tests__/multiTenancy.test.ts +1 -1
  434. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  435. package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
  436. package/src/__tests__/pushStatusResolver.filter.test.ts +64 -1
  437. package/src/__tests__/realtimeRecordingHandler.test.ts +669 -0
  438. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  439. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  440. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  441. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +146 -7
  442. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  443. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  444. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  445. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  446. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  447. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  448. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  449. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  450. package/src/__tests__/runViewProperties.test.ts +114 -0
  451. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  452. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  453. package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
  454. package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
  455. package/src/__tests__/sessionUserClone.test.ts +5 -1
  456. package/src/__tests__/sharedCache.test.ts +5 -3
  457. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  458. package/src/__tests__/unifiedAuth.test.ts +28 -0
  459. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  460. package/src/agentSessions/SessionJanitor.ts +369 -93
  461. package/src/agentSessions/SessionManager.ts +45 -10
  462. package/src/apiRoot.ts +78 -0
  463. package/src/auth/AuthProviderCatalogRouter.ts +29 -0
  464. package/src/auth/LoginScreenEngine.ts +50 -0
  465. package/src/auth/index.ts +57 -12
  466. package/src/auth/initializeProviders.ts +43 -1
  467. package/src/auth/localDevAuth.ts +528 -0
  468. package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
  469. package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
  470. package/src/auth/magicLink/types.ts +10 -0
  471. package/src/auth/sessionUserClone.ts +3 -2
  472. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  473. package/src/broadcast/index.ts +5 -0
  474. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  475. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  476. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  477. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  478. package/src/cache.ts +2 -1
  479. package/src/config.ts +115 -5
  480. package/src/context.ts +32 -8
  481. package/src/coreRoutes.ts +181 -0
  482. package/src/generated/graphql-schemas/__mj.ts +3684 -284
  483. package/src/generic/CacheInvalidationResolver.ts +172 -60
  484. package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
  485. package/src/generic/PubSubManager.ts +54 -1
  486. package/src/generic/PushStatusResolver.ts +109 -12
  487. package/src/generic/ResolverBase.ts +540 -431
  488. package/src/generic/RunViewResolver.ts +97 -15
  489. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  490. package/src/generic/fieldSecurityTransport.ts +62 -0
  491. package/src/globalCors.ts +71 -0
  492. package/src/index.ts +239 -238
  493. package/src/integration/CustomColumnPromoter.ts +6 -1
  494. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  495. package/src/multiTenancy/index.ts +24 -2
  496. package/src/realtimeSessions/README.md +7 -3
  497. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
  498. package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
  499. package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
  500. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  501. package/src/realtimeSessions/index.ts +2 -0
  502. package/src/realtimeSessions/ownedRealtimeSession.ts +69 -0
  503. package/src/realtimeSessions/sessionAccess.ts +183 -23
  504. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  505. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  506. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  507. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  508. package/src/realtimeWidget/WidgetSessionService.ts +252 -17
  509. package/src/realtimeWidget/host-identity.ts +1 -1
  510. package/src/realtimeWidget/widgetCore.ts +30 -1
  511. package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
  512. package/src/resolvers/ActionResolver.ts +78 -15
  513. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  514. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  515. package/src/resolvers/AgentSessionResolver.ts +46 -18
  516. package/src/resolvers/ArtifactFileResolver.ts +9 -8
  517. package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
  518. package/src/resolvers/DatasetResolver.ts +70 -10
  519. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  520. package/src/resolvers/EntityRecordNameResolver.ts +3 -2
  521. package/src/resolvers/FetchEntityVectorsResolver.ts +248 -55
  522. package/src/resolvers/FileCategoryResolver.ts +1 -0
  523. package/src/resolvers/FileResolver.ts +334 -109
  524. package/src/resolvers/GetDataContextDataResolver.ts +139 -41
  525. package/src/resolvers/GetDataResolver.ts +6 -3
  526. package/src/resolvers/IntegrationDiscoveryResolver.ts +53 -9
  527. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  528. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  529. package/src/resolvers/QueryResolver.ts +31 -6
  530. package/src/resolvers/QuerySystemUserResolver.ts +15 -6
  531. package/src/resolvers/RSUResolver.ts +12 -0
  532. package/src/resolvers/RealtimeClientSessionResolver.ts +114 -66
  533. package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
  534. package/src/resolvers/RunAIAgentResolver.ts +296 -85
  535. package/src/resolvers/RunTemplateResolver.ts +6 -4
  536. package/src/resolvers/RunTestResolver.ts +3 -1
  537. package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
  538. package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
  539. package/src/resolvers/SyncDataResolver.ts +4 -0
  540. package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
  541. package/src/resolvers/TestQuerySQLResolver.ts +69 -13
  542. package/src/resolvers/TransactionGroupResolver.ts +185 -30
  543. package/src/resolvers/UserViewResolver.ts +2 -1
  544. package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
  545. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  546. package/src/resolvers/agent-run-data-guard.ts +89 -0
  547. package/src/rest/EntityCRUDHandler.ts +22 -5
  548. package/src/rest/RESTEndpointHandler.ts +8 -5
  549. package/src/rest/RealtimeRecordingHandler.ts +467 -0
  550. package/src/rest/ViewOperationsHandler.ts +52 -18
  551. package/src/rest/setupRESTEndpoints.ts +6 -0
  552. package/src/serverExtensionReservedRoots.ts +14 -17
  553. package/src/serverRoleConfigUnits.ts +48 -0
  554. package/src/services/MJStorageBlobStore.ts +31 -30
  555. package/src/services/StartTaskGraphDispatcher.ts +2 -2
  556. package/src/services/TaskGraphActionRunner.ts +25 -5
  557. package/src/services/TaskGraphAgentRunner.ts +188 -11
  558. package/src/services/TaskGraphContinuationDeliverer.ts +738 -16
  559. package/src/sharedCache.ts +3 -0
  560. package/src/types.ts +23 -1
@@ -1,9 +1,13 @@
1
1
  import { Arg, Ctx, Field, ObjectType, Query, Resolver } from "type-graphql";
2
+ import type { DatabaseProviderBase, UserInfo } from "@memberjunction/core";
3
+ import { IsValidUUID, UUIDsEqual } from "@memberjunction/global";
4
+ import { DataContext, DataContextItem } from "@memberjunction/data-context";
5
+ import { MJDataContextEntity, MJDataContextItemEntity } from "@memberjunction/core-entities";
6
+ import { RenderPipeline } from "@memberjunction/generic-database-provider";
2
7
  import { AppContext } from "../types.js";
3
- import { DataContext } from "@memberjunction/data-context";
4
- import { GetReadOnlyDataSource, GetReadOnlyProvider } from "../util.js";
5
- import { MJDataContextItemEntity } from "@memberjunction/core-entities";
8
+ import { GetReadOnlyProvider } from "../util.js";
6
9
  import { ResolverBase } from "../generic/ResolverBase.js";
10
+ import { IsScopeLimitedPrincipal } from "../auth/scopeLimitedPrincipal.js";
7
11
 
8
12
  @ObjectType()
9
13
  export class GetDataContextItemDataOutputType {
@@ -39,6 +43,28 @@ export class GetDataContextDataOutputType {
39
43
  }
40
44
 
41
45
 
46
+ /** The outcome of loading one data context item: its data as JSON, or why it has none. */
47
+ interface ItemOutcome {
48
+ Result: string | null;
49
+ Error: string | null;
50
+ }
51
+
52
+ /** Which `sql` items of a data context may run: the read-only provider, and each refused item's reason. */
53
+ interface SQLItemGate {
54
+ Provider: DatabaseProviderBase | null;
55
+ Refusals: Map<DataContextItem, string>;
56
+ }
57
+
58
+ /**
59
+ * Loads the data of data contexts and their items.
60
+ *
61
+ * Items of type `sql` hold raw SQL, which is held to the rules ExecuteAdhocQuery applies to
62
+ * caller-supplied SQL. It runs only for the data context's owner or an administrator (Owner-type
63
+ * user), never for a scope-limited session, only on the read-only provider, and only as a single read
64
+ * statement over entity base views the caller may read in full. A SQL item that may not run is
65
+ * refused on its own, and the other items still load. Items of the other types load through entity
66
+ * permissions for the calling user.
67
+ */
42
68
  @Resolver()
43
69
  export class GetDataContextDataResolver extends ResolverBase {
44
70
  /**
@@ -52,30 +78,25 @@ export class GetDataContextDataResolver extends ResolverBase {
52
78
  ) {
53
79
  // Check API key scope authorization for data context read
54
80
  await this.CheckAPIKeyScopeAuthorization('datacontext:read', DataContextItemID, appCtx.userPayload);
81
+ if (!IsValidUUID(DataContextItemID)) {
82
+ return { Success: false, ErrorMessage: 'DataContextItemID must be a UUID', Result: null };
83
+ }
55
84
 
56
85
  try {
57
- const ds = GetReadOnlyDataSource(appCtx.dataSources, {
58
- allowFallbackToReadWrite: true,
59
- })
86
+ const user: UserInfo = appCtx.userPayload.userRecord;
60
87
  const md = GetReadOnlyProvider(appCtx.providers, {allowFallbackToReadWrite: true});
61
- const dciData = await md.GetEntityObject<MJDataContextItemEntity>("MJ: Data Context Items", appCtx.userPayload.userRecord);
88
+ const dciData = await md.GetEntityObject<MJDataContextItemEntity>("MJ: Data Context Items", user);
62
89
  if (await dciData.Load(DataContextItemID)) {
63
90
  const dci = DataContext.CreateDataContextItem(); // use class factory to get whatever lowest level sub-class is registered
64
- await dci.LoadMetadataFromEntityRecord(dciData, md, appCtx.userPayload.userRecord);
91
+ await dci.LoadMetadataFromEntityRecord(dciData, md, user);
92
+ const ownerID = dci.Type === 'sql' ? await this.loadDataContextOwnerID(dciData.DataContextID, md, user) : null;
93
+ const gate = this.authorizeSQLItems([dci], ownerID, appCtx);
65
94
  // now the metadata is loaded so we can call the regular load function
66
- if (await dci.LoadData(ds)) {
67
- return {
68
- Success: true,
69
- ErrorMessage: null,
70
- Result: JSON.stringify(dci.Data),
71
- }
72
- }
73
- else {
74
- return {
75
- Success: false,
76
- ErrorMessage: 'Error loading data context item data',
77
- Result: null,
78
- }
95
+ const outcome = await this.loadItem(dci, gate, user, false);
96
+ return {
97
+ Success: outcome.Error === null,
98
+ ErrorMessage: outcome.Error,
99
+ Result: outcome.Result,
79
100
  }
80
101
  }
81
102
  else {
@@ -89,14 +110,15 @@ export class GetDataContextDataResolver extends ResolverBase {
89
110
  catch (e) {
90
111
  return {
91
112
  Success: false,
92
- ErrorMessage: e,
113
+ ErrorMessage: e instanceof Error ? e.message : String(e),
93
114
  Result: null,
94
115
  }
95
116
  }
96
117
  }
97
118
 
98
119
  /**
99
- * Returns data for a given data context.
120
+ * Returns data for a given data context. `Results` and `ErrorMessages` hold one entry per item, in
121
+ * item order. `Success` is true, and `ErrorMessages` null, only when every item loaded.
100
122
  * @param DataContextID
101
123
  */
102
124
  @Query(() => GetDataContextDataOutputType)
@@ -106,38 +128,114 @@ export class GetDataContextDataResolver extends ResolverBase {
106
128
  ) {
107
129
  // Check API key scope authorization for data context read
108
130
  await this.CheckAPIKeyScopeAuthorization('datacontext:read', DataContextID, appCtx.userPayload);
131
+ // DataContext.LoadMetadata places this ID in the item filter, so it must be a plain UUID.
132
+ if (!IsValidUUID(DataContextID)) {
133
+ return { Success: false, ErrorMessages: ['DataContextID must be a UUID'], Results: null };
134
+ }
109
135
 
110
136
  try {
111
137
  // our job here is to load the entire data context, so we do that with the Data Context object
138
+ const user: UserInfo = appCtx.userPayload.userRecord;
139
+ const md = GetReadOnlyProvider(appCtx.providers, { allowFallbackToReadWrite: true });
112
140
  const dc = new DataContext();
113
- const ds = GetReadOnlyDataSource(appCtx.dataSources, {
114
- allowFallbackToReadWrite: true,
115
- })
116
- const success = await dc.Load(DataContextID, ds, true, false, 0, appCtx.userPayload.userRecord);
117
- if (success) {
118
- const retVal = {
119
- Success: true,
120
- ErrorMessages: null,
121
- Results: dc.Items.map((item) => {
122
- return JSON.stringify(item.Data);
123
- }),
124
- }
125
- return retVal;
126
- }
127
- else {
141
+ if (!(await dc.LoadMetadata(DataContextID, user, md))) {
128
142
  return {
129
143
  Success: false,
130
144
  ErrorMessages: ['Error loading data context'],
131
- Results: null,
145
+ Results: null,
132
146
  }
133
147
  }
148
+ const gate = this.authorizeSQLItems(dc.Items, dc.MJDataContextEntity.UserID, appCtx);
149
+ const outcomes = await Promise.all(dc.Items.map((item) => this.loadItem(item, gate, user, true)));
150
+ const allLoaded = outcomes.every((outcome) => outcome.Error === null);
151
+ return {
152
+ Success: allLoaded,
153
+ ErrorMessages: allLoaded ? null : outcomes.map((outcome) => outcome.Error),
154
+ Results: outcomes.map((outcome) => outcome.Result),
155
+ }
134
156
  }
135
157
  catch (e) {
136
158
  return {
137
159
  Success: false,
138
- ErrorMessages: [e],
160
+ ErrorMessages: [e instanceof Error ? e.message : String(e)],
139
161
  Results: null,
140
162
  }
141
163
  }
142
164
  }
143
- }
165
+
166
+ /**
167
+ * Decides which `sql` items among `items` may run. Returns the read-only provider they run on, and
168
+ * the reason for each SQL item that may not run.
169
+ */
170
+ private authorizeSQLItems(items: DataContextItem[], ownerID: string | null, appCtx: AppContext): SQLItemGate {
171
+ const refusals = new Map<DataContextItem, string>();
172
+ const sqlItems = items.filter((item) => item.Type === 'sql');
173
+ if (sqlItems.length === 0) {
174
+ return { Provider: null, Refusals: refusals };
175
+ }
176
+ const user: UserInfo | undefined = appCtx.userPayload?.userRecord;
177
+ const provider = GetReadOnlyProvider(appCtx.providers, { allowFallbackToReadWrite: false });
178
+ for (const item of sqlItems) {
179
+ const refusal = this.sqlItemRefusal(item, ownerID, user, provider);
180
+ if (refusal !== null) {
181
+ refusals.set(item, refusal);
182
+ }
183
+ }
184
+ return { Provider: provider, Refusals: refusals };
185
+ }
186
+
187
+ /** Returns why `item` may not run for `user`, or null when it may. */
188
+ private sqlItemRefusal(item: DataContextItem, ownerID: string | null, user: UserInfo | undefined, provider: DatabaseProviderBase | null): string | null {
189
+ if (!user || IsScopeLimitedPrincipal(user)) {
190
+ return 'SQL data context items cannot be run by a scope-limited or unidentified session.';
191
+ }
192
+ if (!this.mayRunDataContextSQL(ownerID, user)) {
193
+ return 'Only the owner of this data context, or an administrator, may run its SQL items.';
194
+ }
195
+ if (!provider) {
196
+ return 'No read-only data source is configured, so SQL data context items cannot run.';
197
+ }
198
+ return this.screenItemSQL(item.SQL ?? '', provider, user);
199
+ }
200
+
201
+ /** True when `user` owns the data context or is an administrator (Owner-type user). */
202
+ private mayRunDataContextSQL(ownerID: string | null, user: UserInfo): boolean {
203
+ const isOwner = !!ownerID && UUIDsEqual(ownerID, user.ID);
204
+ return isOwner || user.Type?.trim().toLowerCase() === 'owner';
205
+ }
206
+
207
+ /**
208
+ * Returns why `sqlText` may not run, or null when it is a single read statement whose every table
209
+ * reference is an entity base view `user` may read without row-level or field-level narrowing. It is
210
+ * the check ExecuteAdhocQuery makes on the rendered SQL.
211
+ */
212
+ private screenItemSQL(sqlText: string, provider: DatabaseProviderBase, user: UserInfo): string | null {
213
+ try {
214
+ const rendered = RenderPipeline.Run(sqlText, { Platform: provider.PlatformKey, ContextUser: user, RequireReadStatement: true });
215
+ this.assertFullQueryUsesReadableEntityViews(rendered.Trace.AfterTemplates, provider, user, 'data context SQL');
216
+ return null;
217
+ }
218
+ catch (e) {
219
+ const reason = e instanceof Error ? e.message : String(e);
220
+ return reason || 'The SQL of this item did not pass the read-only check.';
221
+ }
222
+ }
223
+
224
+ /** Loads one item's data unless `gate` refused it. Returns the data as JSON, or why there is none. */
225
+ private async loadItem(item: DataContextItem, gate: SQLItemGate, user: UserInfo, forceRefresh: boolean): Promise<ItemOutcome> {
226
+ const refusal = gate.Refusals.get(item);
227
+ if (refusal !== undefined) {
228
+ return { Result: null, Error: refusal };
229
+ }
230
+ if (await item.LoadData(gate.Provider, forceRefresh, false, 0, user)) {
231
+ return { Result: JSON.stringify(item.Data), Error: null };
232
+ }
233
+ return { Result: null, Error: item.DataLoadingError || 'Error loading data context item data' };
234
+ }
235
+
236
+ /** Returns the owner (`UserID`) of a data context, or null when the caller cannot load it. */
237
+ private async loadDataContextOwnerID(dataContextID: string, provider: DatabaseProviderBase, user: UserInfo): Promise<string | null> {
238
+ const dataContext = await provider.GetEntityObject<MJDataContextEntity>('MJ: Data Contexts', user);
239
+ return (await dataContext.Load(dataContextID)) ? dataContext.UserID : null;
240
+ }
241
+ }
@@ -158,14 +158,17 @@ export class GetDataResolver {
158
158
  // Defense-in-depth: even system-token holders get SELECT-only SQL here.
159
159
  // The read-only pool is the primary control, but if it is ever
160
160
  // misconfigured to a read-write login this validator still refuses DML/DDL
161
- // (mirrors AdhocQueryResolver).
162
- const validation = SQLExpressionValidator.Instance.validateFullQuery(resolvedSQL);
161
+ // (mirrors AdhocQueryResolver). The validator reads exactly the text that
162
+ // runs: it is trimmed here as validate() trims it, and literal \n sequences
163
+ // are not rewritten as ValidateFullQuery would.
164
+ const sqlToRun = resolvedSQL.trim();
165
+ const validation = SQLExpressionValidator.Instance.validate(sqlToRun, { context: 'full_query', Dialect: platform });
163
166
  if (!validation.valid) {
164
167
  return { result: null, error: validation.error || 'SQL validation failed' };
165
168
  }
166
169
 
167
170
  const request = new sql.Request(readOnlyDataSource);
168
- const result = await request.query(resolvedSQL);
171
+ const result = await request.query(sqlToRun);
169
172
  return { result: result.recordset, error: null };
170
173
  } catch (err) {
171
174
  // Extract clean SQL error message
@@ -3,7 +3,7 @@ import { CompositeKey, DatabaseProviderBase, EntityInfo, LocalCacheManager, Meta
3
3
  import { GetReadOnlyProvider, GetReadWriteProvider } from "../util.js";
4
4
  import { NoLog } from "../logging/NoLog.js";
5
5
  import { UUIDsEqual } from "@memberjunction/global";
6
- import { DrainResponseBody } from "@memberjunction/network-utils";
6
+ import { DrainResponseBody, SafeFetch } from "@memberjunction/network-utils";
7
7
  import { CronExpressionHelper } from "@memberjunction/scheduling-engine";
8
8
  import {
9
9
  MJCompanyIntegrationEntity,
@@ -33,7 +33,8 @@ import {
33
33
  IntegrationSchemaSync,
34
34
  decideSchemaLimitViolations,
35
35
  IntegrationConnectorCreationPipeline,
36
- IntegrationActionGenerator
36
+ IntegrationActionGenerator,
37
+ ObjectsWithWatermarkFieldChange
37
38
  } from "@memberjunction/integration-engine";
38
39
  import type {
39
40
  IntegrationActionVerb,
@@ -1624,7 +1625,7 @@ export class IntegrationDiscoveryResolver extends ResolverBase {
1624
1625
  Platform: validatedPlatform,
1625
1626
  MJVersion: process.env.MJ_VERSION ?? '5.11.0',
1626
1627
  SourceType: companyIntegration.Integration,
1627
- AdditionalSchemaInfoPath: process.env.RSU_ADDITIONAL_SCHEMA_INFO_PATH ?? 'additionalSchemaInfo.json',
1628
+ AdditionalSchemaInfoPath: RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath,
1628
1629
  MigrationsDir: process.env.RSU_MIGRATIONS_PATH ?? 'migrations/rsu',
1629
1630
  MetadataDir: process.env.RSU_METADATA_DIR ?? 'metadata',
1630
1631
  ExistingTables: this.buildExistingTables(targetConfigs, provider),
@@ -3431,7 +3432,7 @@ export class IntegrationDiscoveryResolver extends ResolverBase {
3431
3432
  Platform: validatedPlatform,
3432
3433
  MJVersion: process.env.MJ_VERSION ?? '5.11.0',
3433
3434
  SourceType: companyIntegration.Integration,
3434
- AdditionalSchemaInfoPath: process.env.RSU_ADDITIONAL_SCHEMA_INFO_PATH ?? 'additionalSchemaInfo.json',
3435
+ AdditionalSchemaInfoPath: RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath,
3435
3436
  MigrationsDir: process.env.RSU_MIGRATIONS_PATH ?? 'migrations/rsu',
3436
3437
  MetadataDir: process.env.RSU_METADATA_DIR ?? 'metadata',
3437
3438
  ExistingTables: this.buildExistingTables(targetConfigs, provider),
@@ -3516,8 +3517,14 @@ export class IntegrationDiscoveryResolver extends ResolverBase {
3516
3517
  return { Success: false, Message: 'No valid schema inputs to process', Items: itemResults };
3517
3518
  }
3518
3519
 
3520
+ // Retrying variant, matching `IntegrationApplySchema` (which retries via
3521
+ // SchemaBuilder.RunSchemaPipeline). This is the same install path over the same
3522
+ // SchemaBuilder-generated DDL, and its expensive middle steps — ExecuteMigration,
3523
+ // RunCodeGen, CompileTypeScript, RestartMJAPI — fail transiently. The wrapper replays
3524
+ // only those four, and only while NOTHING in the batch has been applied, so a partially
3525
+ // succeeded batch is still reported as-is rather than double-applied.
3519
3526
  const rsm = RuntimeSchemaManager.Instance;
3520
- const batchResult = await rsm.RunPipelineBatch(pipelineInputs);
3527
+ const batchResult = await rsm.RunPipelineBatchWithRetry(pipelineInputs);
3521
3528
 
3522
3529
  return {
3523
3530
  Success: batchResult.SuccessCount > 0,
@@ -4205,7 +4212,7 @@ export class IntegrationDiscoveryResolver extends ResolverBase {
4205
4212
  Platform: platform,
4206
4213
  MJVersion: process.env.MJ_VERSION ?? '5.11.0',
4207
4214
  SourceType: companyIntegration.Integration,
4208
- AdditionalSchemaInfoPath: process.env.RSU_ADDITIONAL_SCHEMA_INFO_PATH ?? 'additionalSchemaInfo.json',
4215
+ AdditionalSchemaInfoPath: RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath,
4209
4216
  MigrationsDir: process.env.RSU_MIGRATIONS_PATH ?? 'migrations/rsu',
4210
4217
  MetadataDir: process.env.RSU_METADATA_DIR ?? 'metadata',
4211
4218
  ExistingTables: this.buildExistingTables(targetConfigs, provider),
@@ -6186,7 +6193,7 @@ export class IntegrationDiscoveryResolver extends ResolverBase {
6186
6193
  Platform: validatedPlatform,
6187
6194
  MJVersion: process.env.MJ_VERSION ?? '5.11.0',
6188
6195
  SourceType: companyIntegration.Integration,
6189
- AdditionalSchemaInfoPath: process.env.RSU_ADDITIONAL_SCHEMA_INFO_PATH ?? 'additionalSchemaInfo.json',
6196
+ AdditionalSchemaInfoPath: RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath,
6190
6197
  MigrationsDir: process.env.RSU_MIGRATIONS_PATH ?? 'migrations/rsu',
6191
6198
  MetadataDir: process.env.RSU_METADATA_DIR ?? 'metadata',
6192
6199
  ExistingTables: existingTables,
@@ -6227,6 +6234,36 @@ export class IntegrationDiscoveryResolver extends ResolverBase {
6227
6234
  }
6228
6235
  }
6229
6236
 
6237
+ // ── Phase 5b — MJ-RUN-37: a WATERMARK-FIELD swap is a change the DDL diff cannot see ──
6238
+ //
6239
+ // A connector upgrade can move an object's incremental cursor to a different source
6240
+ // column (`modified_at` → `last_updated`). Phase 1's persist already DETECTS that — the
6241
+ // overlay rewrites `IntegrationObject.IncrementalWatermarkField` and records it in the
6242
+ // merge log's `ChangedAttributes`. Nothing consumed it, and no other source of
6243
+ // `changedObjects` can: a cursor swap adds no column (so `diff.AddedColumns` and
6244
+ // `ModifiedColumns` are both empty) and touches no field map (so Phase 6 stays quiet).
6245
+ //
6246
+ // The object was therefore treated as unchanged, its Pull watermark survived, and the
6247
+ // next incremental sync applied the OLD column's stored value as a lower bound on the
6248
+ // NEW one. Where the new column sorts later, every row below that value is filtered out
6249
+ // AT THE SOURCE — permanently, and with no artifact: the source reports a total
6250
+ // consistent with the filter it was given, so fetched equals expected and the run
6251
+ // closes clean. Absence, not duplication, is what this produces.
6252
+ //
6253
+ // Scoped to CONTINUING maps deliberately. A new object has no watermark to invalidate
6254
+ // and a removed one has no sync left to protect; widening this to every persisted object
6255
+ // would inflate `ChangedObjects` (and `hasChanges`) with names Phase 7 cannot act on.
6256
+ const watermarkFieldChanged = ObjectsWithWatermarkFieldChange(
6257
+ refresh.PersistResult?.ObjectMergeLog ?? [],
6258
+ continuingMaps.map(m => m.ExternalObjectName ?? ''),
6259
+ );
6260
+ for (const name of watermarkFieldChanged) {
6261
+ if (!changedObjects.some(n => n.toLowerCase() === name.toLowerCase())) changedObjects.push(name);
6262
+ }
6263
+ if (watermarkFieldChanged.length > 0) {
6264
+ LogStatus(`[SchemaEvolution] IncrementalWatermarkField changed on ${watermarkFieldChanged.length} object(s) — resetting their Pull watermarks: ${watermarkFieldChanged.join(', ')}`);
6265
+ }
6266
+
6230
6267
  // ── Phase 6 — reconcile CONTINUING maps' field maps to the resolution ──
6231
6268
  // Added source fields get field maps (Active on enabled maps, Disabled on disabled
6232
6269
  // maps); field maps whose source field vanished from the resolution are disabled.
@@ -6301,8 +6338,13 @@ export class IntegrationDiscoveryResolver extends ResolverBase {
6301
6338
  rsuInput.ContextUser = user;
6302
6339
  }
6303
6340
 
6341
+ // Retrying variant, for the same reason every other install path uses it: a refresh
6342
+ // is unattended and long, and a transient ExecuteMigration / RunCodeGen /
6343
+ // CompileTypeScript / RestartMJAPI failure would otherwise abandon it with the
6344
+ // metadata already re-resolved and the DDL not applied — the half-state an operator
6345
+ // then has to diagnose. Replay happens only while nothing was applied.
6304
6346
  const rsm = RuntimeSchemaManager.Instance;
6305
- const batchResult = await rsm.RunPipelineBatch([rsuInput]);
6347
+ const batchResult = await rsm.RunPipelineBatchWithRetry([rsuInput]);
6306
6348
  const pipelineResult = batchResult.Results[0];
6307
6349
  pipelineSteps = pipelineResult?.Steps.map((s: RSUPipelineStep) => ({
6308
6350
  Name: s.Name, Status: s.Status, DurationMs: s.DurationMs, Message: s.Message, StepIndex: s.StepIndex, StepTotal: s.StepTotal,
@@ -6467,7 +6509,9 @@ export class IntegrationDiscoveryResolver extends ResolverBase {
6467
6509
 
6468
6510
  private async sendWebhook(url: string, payload: Record<string, unknown>): Promise<void> {
6469
6511
  try {
6470
- const response = await fetch(url, {
6512
+ // SECURITY: the webhook URL is caller-supplied, so go through the SSRF guard —
6513
+ // SafeFetch validates the URL (and every redirect hop) resolves to a public address.
6514
+ const response = await SafeFetch(url, {
6471
6515
  method: 'POST',
6472
6516
  headers: { 'Content-Type': 'application/json' },
6473
6517
  body: JSON.stringify(payload)
@@ -38,6 +38,18 @@ export class EntityDependencyResolver {
38
38
  }
39
39
  }
40
40
 
41
+ @InputType()
42
+ export class RecordDependencyOptionsInput {
43
+ @Field(() => String, { nullable: true })
44
+ LinkType?: 'both' | 'hard' | 'soft';
45
+
46
+ @Field(() => Boolean, { nullable: true })
47
+ IncludeSystemEntities?: boolean;
48
+
49
+ @Field(() => [String], { nullable: true })
50
+ EntityNames?: string[];
51
+ }
52
+
41
53
  @ObjectType()
42
54
  export class RecordDependencyResult {
43
55
  @Field(() => String)
@@ -49,6 +61,9 @@ export class RecordDependencyResult {
49
61
  @Field(() => String)
50
62
  FieldName: string; // required
51
63
 
64
+ @Field(() => String, { nullable: true })
65
+ FieldDisplayName?: string;
66
+
52
67
  @Field(() => CompositeKeyOutputType)
53
68
  PrimaryKey: CompositeKey;
54
69
 
@@ -70,17 +85,23 @@ export class RecordDependencyResolver {
70
85
  @Arg('entityName', () => String) entityName: string,
71
86
  @Arg('CompositeKey', () => CompositeKeyInputType) ckInput: CompositeKeyInputType,
72
87
  @Ctx() { dataSource, userPayload, providers }: AppContext,
73
- @PubSub() pubSub: PubSubEngine
88
+ @PubSub() pubSub: PubSubEngine,
89
+ @Arg('options', () => RecordDependencyOptionsInput, { nullable: true }) options?: RecordDependencyOptionsInput
74
90
  ) {
75
91
  try {
76
92
  const md = GetReadOnlyProvider(providers);
77
93
  const ck = new CompositeKey(ckInput.KeyValuePairs);
78
- const result = await md.GetRecordDependencies(entityName, ck);
94
+ const contextUser = userPayload?.userRecord;
95
+ const result =
96
+ options !== undefined || contextUser !== undefined
97
+ ? await md.GetRecordDependencies(entityName, ck, contextUser, options)
98
+ : await md.GetRecordDependencies(entityName, ck);
79
99
 
80
100
  return result.map(dep => ({
81
101
  EntityName: dep.EntityName,
82
102
  RelatedEntityName: dep.RelatedEntityName,
83
103
  FieldName: dep.FieldName,
104
+ FieldDisplayName: dep.FieldDisplayName,
84
105
  PrimaryKey: dep.PrimaryKey,
85
106
  CompositeKey: dep.PrimaryKey,
86
107
  IsSoftLink: dep.IsSoftLink,
@@ -1,6 +1,7 @@
1
1
  import { Resolver, Subscription, Root, ObjectType, Field, Float, Mutation, Arg, Ctx, PubSub, PubSubEngine } from 'type-graphql';
2
2
  import { AppContext } from '../types.js';
3
3
  import { LogStatus, LogError } from '@memberjunction/core';
4
+ import { UUIDsEqual } from '@memberjunction/global';
4
5
  import { ResolverBase } from '../generic/ResolverBase.js';
5
6
 
6
7
  const PIPELINE_PROGRESS_TOPIC = 'PIPELINE_PROGRESS';
@@ -49,6 +50,16 @@ export class PipelineStartResult {
49
50
  ErrorMessage?: string;
50
51
  }
51
52
 
53
+ export function PipelineProgressFilter({
54
+ payload,
55
+ args,
56
+ }: {
57
+ payload: PipelineProgressNotification;
58
+ args: { pipelineRunID: string };
59
+ }): boolean {
60
+ return UUIDsEqual(payload.PipelineRunID, args.pipelineRunID) || payload.PipelineRunID === args.pipelineRunID;
61
+ }
62
+
52
63
  @Resolver()
53
64
  export class PipelineProgressResolver extends ResolverBase {
54
65
  /**
@@ -56,9 +67,7 @@ export class PipelineProgressResolver extends ResolverBase {
56
67
  */
57
68
  @Subscription(() => PipelineProgressNotification, {
58
69
  topics: PIPELINE_PROGRESS_TOPIC,
59
- filter: ({ payload, args }: { payload: PipelineProgressNotification; args: { pipelineRunID: string } }) => {
60
- return payload.PipelineRunID === args.pipelineRunID;
61
- },
70
+ filter: PipelineProgressFilter,
62
71
  })
63
72
  PipelineProgress(
64
73
  @Root() notification: PipelineProgressNotification,
@@ -101,6 +101,12 @@ export class RunQueryCacheStatusInput {
101
101
 
102
102
  @Field(() => Int, { description: 'The number of rows in cached results' })
103
103
  rowCount: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
104
+
105
+ @Field(() => String, {
106
+ nullable: true,
107
+ description: "The query definition hash the cached results were written under, as this server returned it. When it differs from the server's, the result is 'stale' with fresh rows. Empty string for a slot with no hash; omit to skip the definition check."
108
+ })
109
+ definitionHash?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name, matching its siblings
104
110
  }
105
111
 
106
112
  @InputType()
@@ -140,6 +146,9 @@ export class RunQueryWithCacheCheckResultOutput {
140
146
 
141
147
  @Field(() => String, { nullable: true, description: 'Error message if status is error' })
142
148
  errorMessage?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
149
+
150
+ @Field(() => String, { nullable: true, description: "The server's definition hash for the query; store it with the cached results and send it back in cacheStatus.definitionHash" })
151
+ definitionHash?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name, matching its siblings
143
152
  }
144
153
 
145
154
  @ObjectType()
@@ -217,7 +226,8 @@ export class RunQueryResolver extends ResolverBase {
217
226
  ForceAuditLog: ForceAuditLog,
218
227
  AuditLogDescription: AuditLogDescription,
219
228
  Enrichment: Enrichment,
220
- DataSource: DataSource
229
+ DataSource: DataSource,
230
+ TimeZone: context.userPayload.TimeZone
221
231
  },
222
232
  context.userPayload.userRecord);
223
233
 
@@ -238,6 +248,7 @@ export class RunQueryResolver extends ResolverBase {
238
248
  QueryID: QueryID,
239
249
  QueryName: queryName || 'Unknown Query',
240
250
  Success: result.Success ?? false,
251
+ // fls-guard: saved-query rows. Its SQL is refused before it runs if it reads a field the caller is denied, unless the query has `MJ: Query Permissions` rows, which authorize it by role alone
241
252
  Results: JSON.stringify(result.Results ?? null),
242
253
  RowCount: result.RowCount ?? 0,
243
254
  TotalRowCount: result.TotalRowCount ?? 0,
@@ -279,7 +290,8 @@ export class RunQueryResolver extends ResolverBase {
279
290
  ForceAuditLog: ForceAuditLog,
280
291
  AuditLogDescription: AuditLogDescription,
281
292
  Enrichment: Enrichment,
282
- DataSource: DataSource
293
+ DataSource: DataSource,
294
+ TimeZone: context.userPayload.TimeZone
283
295
  },
284
296
  context.userPayload.userRecord);
285
297
 
@@ -287,6 +299,7 @@ export class RunQueryResolver extends ResolverBase {
287
299
  QueryID: result.QueryID || '',
288
300
  QueryName: QueryName,
289
301
  Success: result.Success ?? false,
302
+ // fls-guard: saved-query rows. Its SQL is refused before it runs if it reads a field the caller is denied, unless the query has `MJ: Query Permissions` rows, which authorize it by role alone
290
303
  Results: JSON.stringify(result.Results ?? null),
291
304
  RowCount: result.RowCount ?? 0,
292
305
  TotalRowCount: result.TotalRowCount ?? 0,
@@ -328,7 +341,8 @@ export class RunQueryResolver extends ResolverBase {
328
341
  ForceAuditLog: ForceAuditLog,
329
342
  AuditLogDescription: AuditLogDescription,
330
343
  Enrichment: Enrichment,
331
- DataSource: DataSource
344
+ DataSource: DataSource,
345
+ TimeZone: context.userPayload.TimeZone
332
346
  },
333
347
  context.userPayload.userRecord);
334
348
 
@@ -349,6 +363,7 @@ export class RunQueryResolver extends ResolverBase {
349
363
  QueryID: QueryID,
350
364
  QueryName: queryName || 'Unknown Query',
351
365
  Success: result.Success ?? false,
366
+ // fls-guard: saved-query rows. Its SQL is refused before it runs if it reads a field the caller is denied, unless the query has `MJ: Query Permissions` rows, which authorize it by role alone
352
367
  Results: JSON.stringify(result.Results ?? null),
353
368
  RowCount: result.RowCount ?? 0,
354
369
  TotalRowCount: result.TotalRowCount ?? 0,
@@ -389,7 +404,8 @@ export class RunQueryResolver extends ResolverBase {
389
404
  ForceAuditLog: ForceAuditLog,
390
405
  AuditLogDescription: AuditLogDescription,
391
406
  Enrichment: Enrichment,
392
- DataSource: DataSource
407
+ DataSource: DataSource,
408
+ TimeZone: context.userPayload.TimeZone
393
409
  },
394
410
  context.userPayload.userRecord);
395
411
 
@@ -397,6 +413,7 @@ export class RunQueryResolver extends ResolverBase {
397
413
  QueryID: result.QueryID || '',
398
414
  QueryName: QueryName,
399
415
  Success: result.Success ?? false,
416
+ // fls-guard: saved-query rows. Its SQL is refused before it runs if it reads a field the caller is denied, unless the query has `MJ: Query Permissions` rows, which authorize it by role alone
400
417
  Results: JSON.stringify(result.Results ?? null),
401
418
  RowCount: result.RowCount ?? 0,
402
419
  TotalRowCount: result.TotalRowCount ?? 0,
@@ -438,7 +455,8 @@ export class RunQueryResolver extends ResolverBase {
438
455
  ForceAuditLog: i.ForceAuditLog,
439
456
  AuditLogDescription: i.AuditLogDescription,
440
457
  Enrichment: i.Enrichment,
441
- DataSource: i.DataSource
458
+ DataSource: i.DataSource,
459
+ TimeZone: context.userPayload.TimeZone
442
460
  }));
443
461
 
444
462
  // Execute all queries in parallel using the batch method
@@ -451,6 +469,7 @@ export class RunQueryResolver extends ResolverBase {
451
469
  QueryID: result.QueryID || inputItem.QueryID || '',
452
470
  QueryName: result.QueryName || inputItem.QueryName || 'Unknown Query',
453
471
  Success: result.Success ?? false,
472
+ // fls-guard: saved-query rows. Its SQL is refused before it runs if it reads a field the caller is denied, unless the query has `MJ: Query Permissions` rows, which authorize it by role alone
454
473
  Results: JSON.stringify(result.Results ?? null),
455
474
  RowCount: result.RowCount ?? 0,
456
475
  TotalRowCount: result.TotalRowCount ?? 0,
@@ -489,7 +508,8 @@ export class RunQueryResolver extends ResolverBase {
489
508
  ForceAuditLog: i.ForceAuditLog,
490
509
  AuditLogDescription: i.AuditLogDescription,
491
510
  Enrichment: i.Enrichment,
492
- DataSource: i.DataSource
511
+ DataSource: i.DataSource,
512
+ TimeZone: context.userPayload.TimeZone
493
513
  }));
494
514
 
495
515
  // Execute all queries in parallel using the batch method
@@ -502,6 +522,7 @@ export class RunQueryResolver extends ResolverBase {
502
522
  QueryID: result.QueryID || inputItem.QueryID || '',
503
523
  QueryName: result.QueryName || inputItem.QueryName || 'Unknown Query',
504
524
  Success: result.Success ?? false,
525
+ // fls-guard: saved-query rows. Its SQL is refused before it runs if it reads a field the caller is denied, unless the query has `MJ: Query Permissions` rows, which authorize it by role alone
505
526
  Results: JSON.stringify(result.Results ?? null),
506
527
  RowCount: result.RowCount ?? 0,
507
528
  TotalRowCount: result.TotalRowCount ?? 0,
@@ -554,10 +575,12 @@ export class RunQueryResolver extends ResolverBase {
554
575
  AuditLogDescription: item.params.AuditLogDescription,
555
576
  Enrichment: item.params.Enrichment,
556
577
  DataSource: item.params.DataSource,
578
+ TimeZone: context.userPayload.TimeZone,
557
579
  },
558
580
  cacheStatus: item.cacheStatus ? {
559
581
  maxUpdatedAt: item.cacheStatus.maxUpdatedAt,
560
582
  rowCount: item.cacheStatus.rowCount,
583
+ definitionHash: item.cacheStatus.definitionHash ?? undefined,
561
584
  } : undefined,
562
585
  }));
563
586
 
@@ -568,10 +591,12 @@ export class RunQueryResolver extends ResolverBase {
568
591
  queryIndex: result.queryIndex,
569
592
  queryId: result.queryId,
570
593
  status: result.status,
594
+ // fls-guard: saved-query rows. Its SQL is refused before it runs if it reads a field the caller is denied, unless the query has `MJ: Query Permissions` rows, which authorize it by role alone
571
595
  Results: result.results ? JSON.stringify(result.results) : undefined,
572
596
  maxUpdatedAt: result.maxUpdatedAt,
573
597
  rowCount: result.rowCount,
574
598
  errorMessage: result.errorMessage,
599
+ definitionHash: result.definitionHash,
575
600
  }));
576
601
 
577
602
  return {