@memberjunction/server 6.2.0-edge.5 → 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 (401) hide show
  1. package/README.md +27 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/SessionJanitor.d.ts +3 -3
  4. package/dist/agentSessions/SessionJanitor.js +3 -3
  5. package/dist/agentSessions/SessionManager.d.ts +15 -5
  6. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  7. package/dist/agentSessions/SessionManager.js +34 -12
  8. package/dist/agentSessions/SessionManager.js.map +1 -1
  9. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  10. package/dist/auth/AuthProviderCatalogRouter.js +2 -0
  11. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  12. package/dist/auth/index.d.ts.map +1 -1
  13. package/dist/auth/index.js +51 -10
  14. package/dist/auth/index.js.map +1 -1
  15. package/dist/auth/initializeProviders.d.ts +10 -0
  16. package/dist/auth/initializeProviders.d.ts.map +1 -1
  17. package/dist/auth/initializeProviders.js +37 -1
  18. package/dist/auth/initializeProviders.js.map +1 -1
  19. package/dist/auth/localDevAuth.d.ts +79 -0
  20. package/dist/auth/localDevAuth.d.ts.map +1 -0
  21. package/dist/auth/localDevAuth.js +439 -0
  22. package/dist/auth/localDevAuth.js.map +1 -0
  23. package/dist/auth/magicLink/MagicLinkKeys.d.ts +2 -2
  24. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  25. package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
  26. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  27. package/dist/auth/magicLink/types.d.ts +12 -0
  28. package/dist/auth/magicLink/types.d.ts.map +1 -1
  29. package/dist/auth/sessionUserClone.d.ts +1 -1
  30. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  31. package/dist/auth/sessionUserClone.js +3 -2
  32. package/dist/auth/sessionUserClone.js.map +1 -1
  33. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  34. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  35. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  36. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  37. package/dist/broadcast/index.d.ts +6 -0
  38. package/dist/broadcast/index.d.ts.map +1 -0
  39. package/dist/broadcast/index.js +6 -0
  40. package/dist/broadcast/index.js.map +1 -0
  41. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  42. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  43. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  44. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  45. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  46. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  47. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  48. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  49. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  50. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  51. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  52. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  53. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  54. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  55. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  56. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  57. package/dist/cache.d.ts +3 -2
  58. package/dist/cache.d.ts.map +1 -1
  59. package/dist/cache.js.map +1 -1
  60. package/dist/config.d.ts +496 -0
  61. package/dist/config.d.ts.map +1 -1
  62. package/dist/config.js +61 -0
  63. package/dist/config.js.map +1 -1
  64. package/dist/context.d.ts +3 -1
  65. package/dist/context.d.ts.map +1 -1
  66. package/dist/context.js +29 -8
  67. package/dist/context.js.map +1 -1
  68. package/dist/coreRoutes.d.ts.map +1 -1
  69. package/dist/coreRoutes.js +14 -0
  70. package/dist/coreRoutes.js.map +1 -1
  71. package/dist/generated/graphql-schemas/__mj.d.ts +635 -14
  72. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  73. package/dist/generated/graphql-schemas/__mj.js +3366 -418
  74. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  75. package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
  76. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  77. package/dist/generic/CacheInvalidationResolver.js +154 -79
  78. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  79. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  80. package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
  81. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  82. package/dist/generic/PubSubManager.d.ts +10 -0
  83. package/dist/generic/PubSubManager.d.ts.map +1 -1
  84. package/dist/generic/PubSubManager.js +44 -1
  85. package/dist/generic/PubSubManager.js.map +1 -1
  86. package/dist/generic/PushStatusResolver.d.ts +39 -6
  87. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  88. package/dist/generic/PushStatusResolver.js +93 -11
  89. package/dist/generic/PushStatusResolver.js.map +1 -1
  90. package/dist/generic/ResolverBase.d.ts +65 -25
  91. package/dist/generic/ResolverBase.d.ts.map +1 -1
  92. package/dist/generic/ResolverBase.js +201 -101
  93. package/dist/generic/ResolverBase.js.map +1 -1
  94. package/dist/generic/RunViewResolver.d.ts +11 -3
  95. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  96. package/dist/generic/RunViewResolver.js +79 -13
  97. package/dist/generic/RunViewResolver.js.map +1 -1
  98. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  99. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  100. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  101. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  102. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  103. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  104. package/dist/generic/fieldSecurityTransport.js +30 -0
  105. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  106. package/dist/index.d.ts +3 -0
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +122 -66
  109. package/dist/index.js.map +1 -1
  110. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  111. package/dist/integration/CustomColumnPromoter.js +6 -1
  112. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  113. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  114. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  115. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  116. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  117. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  118. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  119. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  120. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +8 -6
  121. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
  122. package/dist/realtimeSessions/ownedRealtimeSession.js +15 -6
  123. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
  124. package/dist/realtimeSessions/sessionAccess.d.ts +88 -11
  125. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  126. package/dist/realtimeSessions/sessionAccess.js +125 -22
  127. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  128. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  129. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  130. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  131. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  132. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  133. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  134. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  135. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  136. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  137. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  138. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  139. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  140. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  141. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  142. package/dist/realtimeWidget/WidgetSessionService.js +201 -19
  143. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  144. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  145. package/dist/realtimeWidget/host-identity.js +1 -1
  146. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  147. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  148. package/dist/realtimeWidget/widgetCore.js +17 -1
  149. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  150. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  151. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  152. package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
  153. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  154. package/dist/resolvers/ActionResolver.d.ts +19 -1
  155. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  156. package/dist/resolvers/ActionResolver.js +63 -12
  157. package/dist/resolvers/ActionResolver.js.map +1 -1
  158. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  159. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  160. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  161. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  162. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  163. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  164. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  165. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  166. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  167. package/dist/resolvers/AgentSessionResolver.js +40 -17
  168. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  169. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  170. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  171. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  172. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  173. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
  174. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  175. package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
  176. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  177. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  178. package/dist/resolvers/FileCategoryResolver.js +1 -0
  179. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  180. package/dist/resolvers/FileResolver.d.ts +5 -0
  181. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  182. package/dist/resolvers/FileResolver.js +13 -4
  183. package/dist/resolvers/FileResolver.js.map +1 -1
  184. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  185. package/dist/resolvers/IntegrationDiscoveryResolver.js +45 -7
  186. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  187. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  188. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  189. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  190. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  191. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  192. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  193. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  194. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  195. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  196. package/dist/resolvers/QueryResolver.js +20 -6
  197. package/dist/resolvers/QueryResolver.js.map +1 -1
  198. package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
  199. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  200. package/dist/resolvers/QuerySystemUserResolver.js +15 -6
  201. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  202. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  203. package/dist/resolvers/RSUResolver.js +12 -0
  204. package/dist/resolvers/RSUResolver.js.map +1 -1
  205. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +16 -2
  206. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  207. package/dist/resolvers/RealtimeClientSessionResolver.js +82 -28
  208. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  209. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  210. package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
  211. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  212. package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
  213. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  214. package/dist/resolvers/RunAIAgentResolver.js +209 -64
  215. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  216. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  217. package/dist/resolvers/RunTemplateResolver.js +4 -4
  218. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  219. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  220. package/dist/resolvers/RunTestResolver.js +3 -1
  221. package/dist/resolvers/RunTestResolver.js.map +1 -1
  222. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  223. package/dist/resolvers/SyncDataResolver.js +4 -0
  224. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  225. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  226. package/dist/resolvers/TestQuerySQLResolver.js +1 -0
  227. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  228. package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
  229. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  230. package/dist/resolvers/TransactionGroupResolver.js +60 -15
  231. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  232. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  233. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  234. package/dist/resolvers/UserViewResolver.js +2 -1
  235. package/dist/resolvers/UserViewResolver.js.map +1 -1
  236. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  237. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  238. package/dist/rest/EntityCRUDHandler.js +19 -5
  239. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  240. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  241. package/dist/rest/RESTEndpointHandler.js +8 -5
  242. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  243. package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
  244. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
  245. package/dist/rest/RealtimeRecordingHandler.js +7 -7
  246. package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
  247. package/dist/rest/ViewOperationsHandler.d.ts +6 -0
  248. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  249. package/dist/rest/ViewOperationsHandler.js +22 -5
  250. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  251. package/dist/serverRoleConfigUnits.d.ts +29 -0
  252. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  253. package/dist/serverRoleConfigUnits.js +33 -0
  254. package/dist/serverRoleConfigUnits.js.map +1 -0
  255. package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
  256. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  257. package/dist/services/TaskGraphContinuationDeliverer.js +42 -15
  258. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  259. package/dist/types.d.ts +23 -1
  260. package/dist/types.d.ts.map +1 -1
  261. package/dist/types.js.map +1 -1
  262. package/package.json +98 -98
  263. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  264. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  265. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  266. package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
  267. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  268. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  269. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  270. package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
  271. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  272. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  273. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  274. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  275. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  276. package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
  277. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
  278. package/src/__tests__/ResolverBase.clientOldValues.test.ts +37 -4
  279. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  280. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
  281. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
  282. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  283. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  284. package/src/__tests__/RunAIAgentResolver.branch.test.ts +68 -13
  285. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  286. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  287. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +17 -27
  288. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +8 -2
  289. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  290. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
  291. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  292. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  293. package/src/__tests__/SessionManager.test.ts +95 -0
  294. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
  295. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  296. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  297. package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
  298. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  299. package/src/__tests__/apiRootBoot.test.ts +1 -1
  300. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  301. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  302. package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
  303. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  304. package/src/__tests__/globalCors.test.ts +3 -3
  305. package/src/__tests__/localDevAuth.test.ts +196 -0
  306. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  307. package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
  308. package/src/__tests__/realtimeRecordingHandler.test.ts +19 -2
  309. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  310. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  311. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  312. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +146 -7
  313. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  314. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  315. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  316. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  317. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  318. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  319. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  320. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  321. package/src/__tests__/runViewProperties.test.ts +114 -0
  322. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  323. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  324. package/src/__tests__/sessionUserClone.test.ts +5 -1
  325. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  326. package/src/__tests__/unifiedAuth.test.ts +28 -0
  327. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  328. package/src/agentSessions/SessionJanitor.ts +3 -3
  329. package/src/agentSessions/SessionManager.ts +35 -12
  330. package/src/auth/AuthProviderCatalogRouter.ts +3 -0
  331. package/src/auth/index.ts +56 -12
  332. package/src/auth/initializeProviders.ts +43 -1
  333. package/src/auth/localDevAuth.ts +528 -0
  334. package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
  335. package/src/auth/magicLink/types.ts +10 -0
  336. package/src/auth/sessionUserClone.ts +3 -2
  337. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  338. package/src/broadcast/index.ts +5 -0
  339. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  340. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  341. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  342. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  343. package/src/cache.ts +2 -1
  344. package/src/config.ts +69 -0
  345. package/src/context.ts +32 -8
  346. package/src/coreRoutes.ts +15 -0
  347. package/src/generated/graphql-schemas/__mj.ts +2239 -102
  348. package/src/generic/CacheInvalidationResolver.ts +135 -78
  349. package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
  350. package/src/generic/PubSubManager.ts +54 -1
  351. package/src/generic/PushStatusResolver.ts +108 -11
  352. package/src/generic/ResolverBase.ts +237 -107
  353. package/src/generic/RunViewResolver.ts +80 -15
  354. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  355. package/src/generic/fieldSecurityTransport.ts +62 -0
  356. package/src/index.ts +127 -68
  357. package/src/integration/CustomColumnPromoter.ts +6 -1
  358. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  359. package/src/realtimeSessions/README.md +7 -3
  360. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  361. package/src/realtimeSessions/ownedRealtimeSession.ts +20 -6
  362. package/src/realtimeSessions/sessionAccess.ts +181 -25
  363. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  364. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  365. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  366. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  367. package/src/realtimeWidget/WidgetSessionService.ts +252 -17
  368. package/src/realtimeWidget/host-identity.ts +1 -1
  369. package/src/realtimeWidget/widgetCore.ts +30 -1
  370. package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
  371. package/src/resolvers/ActionResolver.ts +78 -15
  372. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  373. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  374. package/src/resolvers/AgentSessionResolver.ts +46 -18
  375. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  376. package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
  377. package/src/resolvers/FileCategoryResolver.ts +1 -0
  378. package/src/resolvers/FileResolver.ts +14 -4
  379. package/src/resolvers/IntegrationDiscoveryResolver.ts +49 -7
  380. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  381. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  382. package/src/resolvers/QueryResolver.ts +20 -6
  383. package/src/resolvers/QuerySystemUserResolver.ts +15 -6
  384. package/src/resolvers/RSUResolver.ts +12 -0
  385. package/src/resolvers/RealtimeClientSessionResolver.ts +104 -33
  386. package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
  387. package/src/resolvers/RunAIAgentResolver.ts +258 -82
  388. package/src/resolvers/RunTemplateResolver.ts +6 -4
  389. package/src/resolvers/RunTestResolver.ts +3 -1
  390. package/src/resolvers/SyncDataResolver.ts +4 -0
  391. package/src/resolvers/TestQuerySQLResolver.ts +1 -0
  392. package/src/resolvers/TransactionGroupResolver.ts +66 -15
  393. package/src/resolvers/UserViewResolver.ts +2 -1
  394. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  395. package/src/rest/EntityCRUDHandler.ts +22 -5
  396. package/src/rest/RESTEndpointHandler.ts +8 -5
  397. package/src/rest/RealtimeRecordingHandler.ts +13 -10
  398. package/src/rest/ViewOperationsHandler.ts +24 -6
  399. package/src/serverRoleConfigUnits.ts +48 -0
  400. package/src/services/TaskGraphContinuationDeliverer.ts +52 -20
  401. package/src/types.ts +23 -1
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { AggregateExpression, CompositeKey, DatabaseProviderBase, UserInfo } from '@memberjunction/core';
1
+ import { AggregateExpression, CompositeKey, DatabaseProviderBase, UserInfo, ViewPropertyValues } from '@memberjunction/core';
2
2
  import { MJUserViewEntityExtended } from '@memberjunction/core-entities';
3
3
  import { GraphQLSchema } from 'graphql';
4
4
  import sql from 'mssql';
@@ -29,6 +29,18 @@ export type UserPayload = {
29
29
  * redemption; do not treat `undefined` as `false`.
30
30
  */
31
31
  emailVerified?: boolean;
32
+ /**
33
+ * Set only on a payload elevated by `ElevateUserPayload`: the principal the elevated user stands in for (a public
34
+ * widget guest). The run's own records are written as `userRecord`, but the guest's conversation is written as
35
+ * this user, because only a conversation's owner (or a grantee) may write its messages (MJ#4791).
36
+ */
37
+ ElevatedFrom?: UserInfo;
38
+ /**
39
+ * The caller's IANA time zone, from the request's `x-mj-timezone` header, when it names a zone
40
+ * this runtime knows. Undefined when the header is absent or invalid; callers then use UTC. The
41
+ * view and query resolvers pass it on as `RunViewParams.TimeZone` / `RunQueryParams.TimeZone`.
42
+ */
43
+ TimeZone?: string;
32
44
  };
33
45
  /**
34
46
  * AppContext is the context object that is passed to all resolvers.
@@ -121,6 +133,16 @@ export type RunViewGenericParams = {
121
133
  * Propagated to `RunViewParams.IncludeBinaryFields`.
122
134
  */
123
135
  includeBinaryFields?: boolean;
136
+ /**
137
+ * Optional registered Alternate Base View logical Name (from `EntityAlternateBaseView.Name`)
138
+ * for this entity. Propagated to `RunViewParams.AlternateBaseView`.
139
+ */
140
+ alternateBaseView?: string;
141
+ /**
142
+ * The client's values for a stored view's properties. Propagated to `RunViewParams.Properties`.
143
+ * There is deliberately no server-properties field: those are set only by server code.
144
+ */
145
+ properties?: ViewPropertyValues;
124
146
  };
125
147
  export declare class MJServerEvent {
126
148
  type: 'setupComplete' | 'requestReceived' | 'requestCompleted' | 'requestFailed';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AA4DxE,MAAM,OAAO,YAAY;CAGxB;AAED,MAAM,OAAO,cAAc;IASzB,YAAY,IAA4J;QACtK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAAA,CAAC;AAmDF,MAAM,OAAO,aAAa;CAKzB;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;IAEzC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;IAC1B,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;IACjB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC;IACvC,GAAG,CAAC,SAAS,GAAG,oBAAoB,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAwExE,MAAM,OAAO,YAAY;CAGxB;AAED,MAAM,OAAO,cAAc;IASzB,YAAY,IAA4J;QACtK,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAAA,CAAC;AA6DF,MAAM,OAAO,aAAa;CAKzB;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,KAAK,CAAC,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;IAEzC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;IAC1B,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;IACjB,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC;IACvC,GAAG,CAAC,SAAS,GAAG,oBAAoB,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAA2B,EAAE,WAA6B,EAAE,WAAwB,EAAE,SAAe;IACpI,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAC/D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/server",
3
- "version": "6.2.0-edge.5",
3
+ "version": "6.2.0-edge.6",
4
4
  "description": "MemberJunction: This project provides API access via GraphQL to the common data store.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./src/index.ts",
@@ -19,101 +19,101 @@
19
19
  "@as-integrations/express5": "^1.0.0",
20
20
  "@graphql-tools/schema": "^10.0.38",
21
21
  "@graphql-tools/utils": "^11.0.0",
22
- "@memberjunction/actions": "6.2.0-edge.5",
23
- "@memberjunction/actions-apollo": "6.2.0-edge.5",
24
- "@memberjunction/actions-base": "6.2.0-edge.5",
25
- "@memberjunction/actions-bizapps-accounting": "6.2.0-edge.5",
26
- "@memberjunction/actions-bizapps-crm": "6.2.0-edge.5",
27
- "@memberjunction/actions-bizapps-formbuilders": "6.2.0-edge.5",
28
- "@memberjunction/actions-bizapps-lms": "6.2.0-edge.5",
29
- "@memberjunction/actions-bizapps-social": "6.2.0-edge.5",
30
- "@memberjunction/actions-peopledatalabs": "6.2.0-edge.5",
31
- "@memberjunction/ai": "6.2.0-edge.5",
32
- "@memberjunction/ai-agent-manager": "6.2.0-edge.5",
33
- "@memberjunction/ai-agent-manager-actions": "6.2.0-edge.5",
34
- "@memberjunction/ai-agents": "6.2.0-edge.5",
35
- "@memberjunction/ai-bridge-base": "6.2.0-edge.5",
36
- "@memberjunction/ai-bridge-ringcentral": "6.2.0-edge.5",
37
- "@memberjunction/ai-bridge-server": "6.2.0-edge.5",
38
- "@memberjunction/ai-bridge-teams": "6.2.0-edge.5",
39
- "@memberjunction/ai-bridge-twilio": "6.2.0-edge.5",
40
- "@memberjunction/ai-bridge-vonage": "6.2.0-edge.5",
41
- "@memberjunction/ai-core-plus": "6.2.0-edge.5",
42
- "@memberjunction/ai-engine-base": "6.2.0-edge.5",
43
- "@memberjunction/ai-mcp-client": "6.2.0-edge.5",
44
- "@memberjunction/ai-prompts": "6.2.0-edge.5",
45
- "@memberjunction/ai-provider-bundle": "6.2.0-edge.5",
46
- "@memberjunction/ai-vector-dupe": "6.2.0-edge.5",
47
- "@memberjunction/ai-vector-sync": "6.2.0-edge.5",
48
- "@memberjunction/ai-vectordb": "6.2.0-edge.5",
49
- "@memberjunction/ai-vectors-pinecone": "6.2.0-edge.5",
50
- "@memberjunction/aiengine": "6.2.0-edge.5",
51
- "@memberjunction/api-keys": "6.2.0-edge.5",
52
- "@memberjunction/auth-providers": "6.2.0-edge.5",
53
- "@memberjunction/clustering-engine": "6.2.0-edge.5",
54
- "@memberjunction/codegen-lib": "6.2.0-edge.5",
55
- "@memberjunction/communication-engine": "6.2.0-edge.5",
56
- "@memberjunction/communication-ms-graph": "6.2.0-edge.5",
57
- "@memberjunction/communication-sendgrid": "6.2.0-edge.5",
58
- "@memberjunction/communication-types": "6.2.0-edge.5",
59
- "@memberjunction/component-registry-client-sdk": "6.2.0-edge.5",
60
- "@memberjunction/computer-use": "6.2.0-edge.5",
61
- "@memberjunction/computer-use-engine": "6.2.0-edge.5",
62
- "@memberjunction/config": "6.2.0-edge.5",
63
- "@memberjunction/core": "6.2.0-edge.5",
64
- "@memberjunction/core-actions": "6.2.0-edge.5",
65
- "@memberjunction/core-entities": "6.2.0-edge.5",
66
- "@memberjunction/core-entities-server": "6.2.0-edge.5",
67
- "@memberjunction/credentials": "6.2.0-edge.5",
68
- "@memberjunction/data-context": "6.2.0-edge.5",
69
- "@memberjunction/data-context-server": "6.2.0-edge.5",
70
- "@memberjunction/doc-utils": "6.2.0-edge.5",
71
- "@memberjunction/encryption": "6.2.0-edge.5",
72
- "@memberjunction/entity-communications-base": "6.2.0-edge.5",
73
- "@memberjunction/entity-communications-server": "6.2.0-edge.5",
74
- "@memberjunction/esignature": "6.2.0-edge.5",
75
- "@memberjunction/external-change-detection": "6.2.0-edge.5",
76
- "@memberjunction/generic-database-provider": "6.2.0-edge.5",
77
- "@memberjunction/global": "6.2.0-edge.5",
78
- "@memberjunction/graphql-dataprovider": "6.2.0-edge.5",
79
- "@memberjunction/integration-engine": "6.2.0-edge.5",
80
- "@memberjunction/integration-engine-base": "6.2.0-edge.5",
81
- "@memberjunction/integration-progress-artifacts": "6.2.0-edge.5",
82
- "@memberjunction/integration-schema-builder": "6.2.0-edge.5",
83
- "@memberjunction/interactive-component-types": "6.2.0-edge.5",
84
- "@memberjunction/lists": "6.2.0-edge.5",
85
- "@memberjunction/lists-base": "6.2.0-edge.5",
86
- "@memberjunction/livekit-room-server": "6.2.0-edge.5",
87
- "@memberjunction/network-utils": "6.2.0-edge.5",
88
- "@memberjunction/notifications": "6.2.0-edge.5",
89
- "@memberjunction/postgresql-dataprovider": "6.2.0-edge.5",
90
- "@memberjunction/queue": "6.2.0-edge.5",
91
- "@memberjunction/record-cloning": "6.2.0-edge.5",
92
- "@memberjunction/record-comparison": "6.2.0-edge.5",
93
- "@memberjunction/redis-provider": "6.2.0-edge.5",
94
- "@memberjunction/remote-browser-base": "6.2.0-edge.5",
95
- "@memberjunction/remote-browser-cdp": "6.2.0-edge.5",
96
- "@memberjunction/remote-browser-selfhost": "6.2.0-edge.5",
97
- "@memberjunction/remote-browser-server": "6.2.0-edge.5",
98
- "@memberjunction/scheduling-actions": "6.2.0-edge.5",
99
- "@memberjunction/scheduling-base-types": "6.2.0-edge.5",
100
- "@memberjunction/scheduling-engine": "6.2.0-edge.5",
101
- "@memberjunction/scheduling-engine-base": "6.2.0-edge.5",
102
- "@memberjunction/schema-engine": "6.2.0-edge.5",
103
- "@memberjunction/search-engine": "6.2.0-edge.5",
104
- "@memberjunction/server-extensions-core": "6.2.0-edge.5",
105
- "@memberjunction/sql-dialect": "6.2.0-edge.5",
106
- "@memberjunction/sql-parser": "6.2.0-edge.5",
107
- "@memberjunction/sqlserver-dataprovider": "6.2.0-edge.5",
108
- "@memberjunction/storage": "6.2.0-edge.5",
109
- "@memberjunction/tag-engine": "6.2.0-edge.5",
110
- "@memberjunction/tag-engine-base": "6.2.0-edge.5",
111
- "@memberjunction/task-graph": "6.2.0-edge.5",
112
- "@memberjunction/templates": "6.2.0-edge.5",
113
- "@memberjunction/testing-engine": "6.2.0-edge.5",
114
- "@memberjunction/testing-engine-base": "6.2.0-edge.5",
115
- "@memberjunction/version-history": "6.2.0-edge.5",
116
- "@memberjunction/work-queue-engine": "6.2.0-edge.5",
22
+ "@memberjunction/actions": "6.2.0-edge.6",
23
+ "@memberjunction/actions-apollo": "6.2.0-edge.6",
24
+ "@memberjunction/actions-base": "6.2.0-edge.6",
25
+ "@memberjunction/actions-bizapps-accounting": "6.2.0-edge.6",
26
+ "@memberjunction/actions-bizapps-crm": "6.2.0-edge.6",
27
+ "@memberjunction/actions-bizapps-formbuilders": "6.2.0-edge.6",
28
+ "@memberjunction/actions-bizapps-lms": "6.2.0-edge.6",
29
+ "@memberjunction/actions-bizapps-social": "6.2.0-edge.6",
30
+ "@memberjunction/actions-peopledatalabs": "6.2.0-edge.6",
31
+ "@memberjunction/ai": "6.2.0-edge.6",
32
+ "@memberjunction/ai-agent-manager": "6.2.0-edge.6",
33
+ "@memberjunction/ai-agent-manager-actions": "6.2.0-edge.6",
34
+ "@memberjunction/ai-agents": "6.2.0-edge.6",
35
+ "@memberjunction/ai-bridge-base": "6.2.0-edge.6",
36
+ "@memberjunction/ai-bridge-ringcentral": "6.2.0-edge.6",
37
+ "@memberjunction/ai-bridge-server": "6.2.0-edge.6",
38
+ "@memberjunction/ai-bridge-teams": "6.2.0-edge.6",
39
+ "@memberjunction/ai-bridge-twilio": "6.2.0-edge.6",
40
+ "@memberjunction/ai-bridge-vonage": "6.2.0-edge.6",
41
+ "@memberjunction/ai-core-plus": "6.2.0-edge.6",
42
+ "@memberjunction/ai-engine-base": "6.2.0-edge.6",
43
+ "@memberjunction/ai-mcp-client": "6.2.0-edge.6",
44
+ "@memberjunction/ai-prompts": "6.2.0-edge.6",
45
+ "@memberjunction/ai-provider-bundle": "6.2.0-edge.6",
46
+ "@memberjunction/ai-vector-dupe": "6.2.0-edge.6",
47
+ "@memberjunction/ai-vector-sync": "6.2.0-edge.6",
48
+ "@memberjunction/ai-vectordb": "6.2.0-edge.6",
49
+ "@memberjunction/ai-vectors-pinecone": "6.2.0-edge.6",
50
+ "@memberjunction/aiengine": "6.2.0-edge.6",
51
+ "@memberjunction/api-keys": "6.2.0-edge.6",
52
+ "@memberjunction/auth-providers": "6.2.0-edge.6",
53
+ "@memberjunction/clustering-engine": "6.2.0-edge.6",
54
+ "@memberjunction/codegen-lib": "6.2.0-edge.6",
55
+ "@memberjunction/communication-engine": "6.2.0-edge.6",
56
+ "@memberjunction/communication-ms-graph": "6.2.0-edge.6",
57
+ "@memberjunction/communication-sendgrid": "6.2.0-edge.6",
58
+ "@memberjunction/communication-types": "6.2.0-edge.6",
59
+ "@memberjunction/component-registry-client-sdk": "6.2.0-edge.6",
60
+ "@memberjunction/computer-use": "6.2.0-edge.6",
61
+ "@memberjunction/computer-use-engine": "6.2.0-edge.6",
62
+ "@memberjunction/config": "6.2.0-edge.6",
63
+ "@memberjunction/core": "6.2.0-edge.6",
64
+ "@memberjunction/core-actions": "6.2.0-edge.6",
65
+ "@memberjunction/core-entities": "6.2.0-edge.6",
66
+ "@memberjunction/core-entities-server": "6.2.0-edge.6",
67
+ "@memberjunction/credentials": "6.2.0-edge.6",
68
+ "@memberjunction/data-context": "6.2.0-edge.6",
69
+ "@memberjunction/data-context-server": "6.2.0-edge.6",
70
+ "@memberjunction/doc-utils": "6.2.0-edge.6",
71
+ "@memberjunction/encryption": "6.2.0-edge.6",
72
+ "@memberjunction/entity-communications-base": "6.2.0-edge.6",
73
+ "@memberjunction/entity-communications-server": "6.2.0-edge.6",
74
+ "@memberjunction/esignature": "6.2.0-edge.6",
75
+ "@memberjunction/external-change-detection": "6.2.0-edge.6",
76
+ "@memberjunction/generic-database-provider": "6.2.0-edge.6",
77
+ "@memberjunction/global": "6.2.0-edge.6",
78
+ "@memberjunction/graphql-dataprovider": "6.2.0-edge.6",
79
+ "@memberjunction/integration-engine": "6.2.0-edge.6",
80
+ "@memberjunction/integration-engine-base": "6.2.0-edge.6",
81
+ "@memberjunction/integration-progress-artifacts": "6.2.0-edge.6",
82
+ "@memberjunction/integration-schema-builder": "6.2.0-edge.6",
83
+ "@memberjunction/interactive-component-types": "6.2.0-edge.6",
84
+ "@memberjunction/lists": "6.2.0-edge.6",
85
+ "@memberjunction/lists-base": "6.2.0-edge.6",
86
+ "@memberjunction/livekit-room-server": "6.2.0-edge.6",
87
+ "@memberjunction/network-utils": "6.2.0-edge.6",
88
+ "@memberjunction/notifications": "6.2.0-edge.6",
89
+ "@memberjunction/postgresql-dataprovider": "6.2.0-edge.6",
90
+ "@memberjunction/queue": "6.2.0-edge.6",
91
+ "@memberjunction/record-cloning": "6.2.0-edge.6",
92
+ "@memberjunction/record-comparison": "6.2.0-edge.6",
93
+ "@memberjunction/redis-provider": "6.2.0-edge.6",
94
+ "@memberjunction/remote-browser-base": "6.2.0-edge.6",
95
+ "@memberjunction/remote-browser-cdp": "6.2.0-edge.6",
96
+ "@memberjunction/remote-browser-selfhost": "6.2.0-edge.6",
97
+ "@memberjunction/remote-browser-server": "6.2.0-edge.6",
98
+ "@memberjunction/scheduling-actions": "6.2.0-edge.6",
99
+ "@memberjunction/scheduling-base-types": "6.2.0-edge.6",
100
+ "@memberjunction/scheduling-engine": "6.2.0-edge.6",
101
+ "@memberjunction/scheduling-engine-base": "6.2.0-edge.6",
102
+ "@memberjunction/schema-engine": "6.2.0-edge.6",
103
+ "@memberjunction/search-engine": "6.2.0-edge.6",
104
+ "@memberjunction/server-extensions-core": "6.2.0-edge.6",
105
+ "@memberjunction/sql-dialect": "6.2.0-edge.6",
106
+ "@memberjunction/sql-parser": "6.2.0-edge.6",
107
+ "@memberjunction/sqlserver-dataprovider": "6.2.0-edge.6",
108
+ "@memberjunction/storage": "6.2.0-edge.6",
109
+ "@memberjunction/tag-engine": "6.2.0-edge.6",
110
+ "@memberjunction/tag-engine-base": "6.2.0-edge.6",
111
+ "@memberjunction/task-graph": "6.2.0-edge.6",
112
+ "@memberjunction/templates": "6.2.0-edge.6",
113
+ "@memberjunction/testing-engine": "6.2.0-edge.6",
114
+ "@memberjunction/testing-engine-base": "6.2.0-edge.6",
115
+ "@memberjunction/version-history": "6.2.0-edge.6",
116
+ "@memberjunction/work-queue-engine": "6.2.0-edge.6",
117
117
  "@octokit/auth-app": "^7.1.5",
118
118
  "@octokit/rest": "^21.1.1",
119
119
  "@types/compression": "^1.8.1",
@@ -150,10 +150,10 @@
150
150
  "uuid": "^13.0.0",
151
151
  "ws": "^8.19.0",
152
152
  "zod": "^3.25.0",
153
- "@memberjunction/theme-engine": "6.2.0-edge.5"
153
+ "@memberjunction/theme-engine": "6.2.0-edge.6"
154
154
  },
155
155
  "devDependencies": {
156
- "@memberjunction/conversations-runtime": "6.2.0-edge.5",
156
+ "@memberjunction/conversations-runtime": "6.2.0-edge.6",
157
157
  "@types/express": "^5.0.6",
158
158
  "pkgroll": "2.23.0",
159
159
  "rimraf": "6.1.2",
@@ -0,0 +1,237 @@
1
+ // type-graphql decorators call `Reflect.getMetadata`; the polyfill must load before the resolver.
2
+ import 'reflect-metadata';
3
+
4
+ /**
5
+ * Field-level security and identity on `RunEntityAction`.
6
+ *
7
+ * - **Identity.** The record an entity action runs on is loaded for the CALLER. Loaded with no
8
+ * user, it fell back to the provider's current user (the system user on a server), which is
9
+ * full width and ignores the caller's row-level security as well.
10
+ * - **Output.** `ResultData` echoes the run's parameters back to the caller. The record bound as
11
+ * `'Entity Object Data'` (a plain copy of its field values) and any entity object among the
12
+ * parameters are projected for the caller; values of unknown shape are left alone.
13
+ *
14
+ * `RunAction` output gets the same backstop: entity objects are sent as their values projected for
15
+ * the caller, and plain objects shaped like a row of a field-secured entity lose the caller's
16
+ * denied keys.
17
+ */
18
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
19
+
20
+ vi.mock('type-graphql', () => {
21
+ const noopDecorator = () => () => undefined;
22
+ return {
23
+ Resolver: noopDecorator, Mutation: noopDecorator, Query: noopDecorator, Subscription: noopDecorator,
24
+ ObjectType: noopDecorator, InputType: noopDecorator, Field: noopDecorator, Arg: noopDecorator,
25
+ Args: noopDecorator, Ctx: noopDecorator, PubSub: noopDecorator, Root: noopDecorator,
26
+ Directive: noopDecorator, Authorized: noopDecorator, UseMiddleware: noopDecorator,
27
+ createUnionType: () => class {},
28
+ AuthorizationError: class AuthorizationError extends Error {},
29
+ Float: class {}, Int: class {}, ID: class {},
30
+ };
31
+ });
32
+
33
+ const hoisted = vi.hoisted(() => ({
34
+ runEntityAction: vi.fn(),
35
+ runAction: vi.fn(),
36
+ entityActions: [] as unknown[],
37
+ actionParams: [] as unknown[],
38
+ }));
39
+
40
+ vi.mock('@memberjunction/actions', () => ({
41
+ ActionEngineServer: {
42
+ Instance: {
43
+ get ActionParams() { return hoisted.actionParams; },
44
+ Actions: [{ ID: 'AC000000-0000-4000-8000-000000000001', Name: 'Return Rows' }],
45
+ Config: vi.fn(async () => undefined),
46
+ RunAction: hoisted.runAction,
47
+ },
48
+ },
49
+ EntityActionEngineServer: {
50
+ Instance: {
51
+ Config: vi.fn(async () => undefined),
52
+ get EntityActions() { return hoisted.entityActions; },
53
+ RunEntityAction: hoisted.runEntityAction,
54
+ },
55
+ },
56
+ }));
57
+
58
+ import { BaseEntity, EntityInfo, UserInfo } from '@memberjunction/core';
59
+ import { ActionResolver, type EntityActionInput, type RunActionInput } from '../resolvers/ActionResolver.js';
60
+ import type { AppContext } from '../types.js';
61
+ import { EMPLOYEES_ENTITY_ID, EmployeeEntity, FullWidthEmployeeRow, HRUser, INTERN_ROLE_ID, Intern, SECRET_SALARY } from './fieldSecurityFixtures.js';
62
+
63
+ const ENTITY_ACTION_ID = 'EA000000-0000-4000-8000-000000000001';
64
+ const RECORD_PARAM_ID = 'AP000000-0000-4000-8000-000000000001';
65
+
66
+ class EmployeeObject extends BaseEntity {}
67
+
68
+ /** An entity object holding every column: what a load with no user produces on a server. */
69
+ async function fullWidthEntityObject(entityInfo: EntityInfo): Promise<BaseEntity> {
70
+ const entity = new EmployeeObject(entityInfo);
71
+ await entity.LoadFromData(FullWidthEmployeeRow());
72
+ return entity;
73
+ }
74
+
75
+ function context(entityInfo: EntityInfo, getEntityObject: ReturnType<typeof vi.fn>): AppContext {
76
+ const provider = { Entities: [entityInfo], EntityByID: () => undefined, GetEntityObject: getEntityObject };
77
+ return {
78
+ providers: [{ type: 'Read-Only', provider }],
79
+ userPayload: { userRecord: Intern(), email: 'intern-1@test.com' },
80
+ } as unknown as AppContext;
81
+ }
82
+
83
+ const input = (): EntityActionInput => ({
84
+ EntityActionID: ENTITY_ACTION_ID,
85
+ InvocationType: 'SingleRecord',
86
+ EntityName: 'Employees',
87
+ PrimaryKey: { KeyValuePairs: [{ Key: 'ID', Value: 'emp-1' }] },
88
+ } as unknown as EntityActionInput);
89
+
90
+ let entityInfo: EntityInfo;
91
+ let getEntityObject: ReturnType<typeof vi.fn>;
92
+
93
+ beforeEach(async () => {
94
+ vi.clearAllMocks();
95
+ entityInfo = EmployeeEntity();
96
+ getEntityObject = vi.fn(async () => ({ InnerLoad: vi.fn(async () => true) }));
97
+ hoisted.entityActions.length = 0;
98
+ hoisted.entityActions.push({
99
+ ID: ENTITY_ACTION_ID,
100
+ EntityID: EMPLOYEES_ENTITY_ID,
101
+ Params: [{ ActionParamID: RECORD_PARAM_ID, ValueType: 'Entity Object Data' }],
102
+ });
103
+ hoisted.actionParams.length = 0;
104
+ hoisted.actionParams.push({ ID: RECORD_PARAM_ID, Name: 'Record' });
105
+ hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: [] });
106
+ });
107
+
108
+ describe('RunEntityAction: the record is loaded for the caller', () => {
109
+ it('REGRESSION: loads the bound record with the caller as its user', async () => {
110
+ await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
111
+ expect(getEntityObject).toHaveBeenCalledWith('Employees', expect.objectContaining({ ID: 'intern-1' }));
112
+ });
113
+
114
+ it('refuses to run on a record the caller cannot load, with no hint whether it exists', async () => {
115
+ getEntityObject.mockResolvedValue({ InnerLoad: vi.fn(async () => false) });
116
+ const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
117
+ expect(result.Success).toBe(false);
118
+ expect(result.Message).toContain('Record not found or access denied');
119
+ expect(hoisted.runEntityAction).not.toHaveBeenCalled();
120
+ });
121
+ });
122
+
123
+ describe('RunEntityAction: echoed parameters are projected for the caller', () => {
124
+ it("REGRESSION: the 'Entity Object Data' parameter never carries a denied value", async () => {
125
+ const params = [{ Name: 'Record', Value: FullWidthEmployeeRow(), Type: 'Input' }];
126
+ hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: params, RunParams: { Params: params } });
127
+
128
+ const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
129
+
130
+ expect(result.Success).toBe(true);
131
+ expect(result.ResultData).not.toContain(String(SECRET_SALARY));
132
+ expect(JSON.parse(result.ResultData!).Params[0].Value).toEqual({ ID: 'emp-1', Name: 'Ada', Notes: 'n' });
133
+ });
134
+
135
+ it('REGRESSION: an entity object among the parameters is sent as its projected field values', async () => {
136
+ const params = [{ Name: 'Entity', Value: await fullWidthEntityObject(entityInfo), Type: 'Input' }];
137
+ hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: params, RunParams: { Params: params } });
138
+
139
+ const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
140
+
141
+ expect(result.ResultData).not.toContain(String(SECRET_SALARY));
142
+ expect(JSON.parse(result.ResultData!).Params[0].Value).toMatchObject({ ID: 'emp-1', Name: 'Ada' });
143
+ });
144
+
145
+ it('REGRESSION: an entity object of an entity the caller cannot read is sent as null, not as its other fields', async () => {
146
+ const unreadable = EmployeeEntity();
147
+ unreadable.Permissions.splice(0, unreadable.Permissions.length, ...unreadable.Permissions.filter(p => p.RoleID !== INTERN_ROLE_ID));
148
+ const object = await fullWidthEntityObject(unreadable);
149
+ const params = [
150
+ { Name: 'One', Value: object, Type: 'Output' },
151
+ { Name: 'Many', Value: [object], Type: 'Output' },
152
+ ];
153
+ hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: params, RunParams: { Params: params } });
154
+
155
+ const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
156
+
157
+ const sent = JSON.parse(result.ResultData!) as { Params: { Value: unknown }[]; RunParams: { Params: { Value: unknown }[] } };
158
+ expect(sent.Params[0].Value).toBeNull();
159
+ expect(sent.Params[1].Value).toEqual([null]);
160
+ expect(sent.RunParams.Params[0].Value).toBeNull();
161
+ expect(result.ResultData).not.toContain('Ada');
162
+ });
163
+
164
+ it('leaves a parameter of unknown shape alone', async () => {
165
+ const params = [{ Name: 'Other', Value: { Salary: 1 }, Type: 'Output' }];
166
+ hoisted.runEntityAction.mockResolvedValue({ Success: true, Message: 'ok', Params: params });
167
+
168
+ const result = await new ActionResolver().RunEntityAction(input(), context(entityInfo, getEntityObject));
169
+
170
+ expect(JSON.parse(result.ResultData!).Params[0].Value).toEqual({ Salary: 1 });
171
+ });
172
+ });
173
+
174
+ // ─── RunAction: general action output ────────────────────────────────────────
175
+
176
+ const ACTION_ID = 'AC000000-0000-4000-8000-000000000001';
177
+
178
+ /** An Owner may run any action, so these tests reach the output without the authorization lookup. */
179
+ function owner(user: UserInfo): UserInfo {
180
+ user.Type = 'Owner';
181
+ return user;
182
+ }
183
+
184
+ function runActionContext(entity: EntityInfo, user: UserInfo): AppContext {
185
+ const provider = { Entities: [entity], EntityByID: () => undefined };
186
+ return {
187
+ providers: [{ type: 'Read-Write', provider }],
188
+ userPayload: { userRecord: user, email: user.Email },
189
+ } as unknown as AppContext;
190
+ }
191
+
192
+ async function runActionReturning(value: unknown, user: UserInfo): Promise<unknown> {
193
+ hoisted.runAction.mockResolvedValue({ Success: true, Message: 'ok', Params: [{ Name: 'Rows', Type: 'Output', Value: value }] });
194
+ const result = await new ActionResolver().RunAction({ ActionID: ACTION_ID } as RunActionInput, runActionContext(entityInfo, user));
195
+ expect(result.Success).toBe(true);
196
+ return JSON.parse(result.ResultData!)[0].Value;
197
+ }
198
+
199
+ describe('RunAction: output parameters are projected for the caller', () => {
200
+ it('REGRESSION: a system-loaded entity object is sent as its projected values to a restricted caller', async () => {
201
+ const value: BaseEntity = await fullWidthEntityObject(entityInfo);
202
+ expect(await runActionReturning(value, owner(Intern()))).toEqual({ ID: 'emp-1', Name: 'Ada', Notes: 'n' });
203
+ });
204
+
205
+ it('REGRESSION: the same entity object keeps the field for a caller allowed to read it', async () => {
206
+ const value: BaseEntity = await fullWidthEntityObject(entityInfo);
207
+ expect(await runActionReturning(value, owner(HRUser()))).toMatchObject({ ID: 'emp-1', Salary: SECRET_SALARY });
208
+ });
209
+
210
+ it('REGRESSION: a GetAll()-shaped row of a field-secured entity loses the denied field', async () => {
211
+ const value = await runActionReturning([FullWidthEmployeeRow()], owner(Intern()));
212
+ expect(value).toEqual([{ ID: 'emp-1', Name: 'Ada', Notes: 'n' }]);
213
+ expect(JSON.stringify(value)).not.toContain(String(SECRET_SALARY));
214
+ });
215
+
216
+ it('leaves a non-entity-shaped object untouched', async () => {
217
+ expect(await runActionReturning({ Salary: 1, Total: 2 }, owner(Intern()))).toEqual({ Salary: 1, Total: 2 });
218
+ });
219
+
220
+ it("REGRESSION: an entity object of an entity the caller cannot read is not exposed", async () => {
221
+ const unreadable = EmployeeEntity();
222
+ unreadable.Permissions.splice(0, unreadable.Permissions.length, ...unreadable.Permissions.filter(p => p.RoleID !== INTERN_ROLE_ID));
223
+ const object = await fullWidthEntityObject(unreadable);
224
+ hoisted.runAction.mockResolvedValue({ Success: true, Message: 'ok', Params: [
225
+ { Name: 'One', Type: 'Output', Value: object },
226
+ { Name: 'Many', Type: 'Output', Value: [object] },
227
+ ] });
228
+ const result = await new ActionResolver().RunAction({ ActionID: ACTION_ID } as RunActionInput, runActionContext(unreadable, owner(Intern())));
229
+ // Exactly the shape this output had before entity objects were projected: the single object's
230
+ // Value dropped, the array's item nulled (and, as ever, the list serialized index-keyed).
231
+ expect(JSON.parse(result.ResultData!)).toEqual({ 0: { Name: 'One', Type: 'Output' }, 1: { Name: 'Many', Type: 'Output', Value: [null] } });
232
+ });
233
+
234
+ it('sends the full row to a caller denied nothing', async () => {
235
+ expect(await runActionReturning([FullWidthEmployeeRow()], owner(HRUser()))).toEqual([FullWidthEmployeeRow()]);
236
+ });
237
+ });