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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (664) hide show
  1. package/README.md +96 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
  5. package/dist/agentSessions/BridgeHostInstance.js +14 -4
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
  7. package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
  8. package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
  9. package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
  10. package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
  11. package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
  12. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  13. package/dist/agentSessions/SessionJanitor.d.ts +34 -11
  14. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  15. package/dist/agentSessions/SessionJanitor.js +88 -44
  16. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  17. package/dist/agentSessions/SessionManager.d.ts +29 -9
  18. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  19. package/dist/agentSessions/SessionManager.js +62 -16
  20. package/dist/agentSessions/SessionManager.js.map +1 -1
  21. package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
  22. package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
  23. package/dist/agentSessions/conversationBrowsers.js +118 -0
  24. package/dist/agentSessions/conversationBrowsers.js.map +1 -0
  25. package/dist/agentSessions/sessionDeadline.d.ts +43 -0
  26. package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
  27. package/dist/agentSessions/sessionDeadline.js +68 -0
  28. package/dist/agentSessions/sessionDeadline.js.map +1 -0
  29. package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
  30. package/dist/auth/APIKeyScopeAuth.js +5 -4
  31. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  32. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  33. package/dist/auth/AuthProviderCatalogRouter.js +2 -0
  34. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  35. package/dist/auth/index.d.ts.map +1 -1
  36. package/dist/auth/index.js +51 -10
  37. package/dist/auth/index.js.map +1 -1
  38. package/dist/auth/initializeProviders.d.ts +10 -0
  39. package/dist/auth/initializeProviders.d.ts.map +1 -1
  40. package/dist/auth/initializeProviders.js +37 -1
  41. package/dist/auth/initializeProviders.js.map +1 -1
  42. package/dist/auth/localDevAuth.d.ts +79 -0
  43. package/dist/auth/localDevAuth.d.ts.map +1 -0
  44. package/dist/auth/localDevAuth.js +439 -0
  45. package/dist/auth/localDevAuth.js.map +1 -0
  46. package/dist/auth/loginEmailResolution.d.ts +41 -0
  47. package/dist/auth/loginEmailResolution.d.ts.map +1 -0
  48. package/dist/auth/loginEmailResolution.js +47 -0
  49. package/dist/auth/loginEmailResolution.js.map +1 -0
  50. package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
  51. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  52. package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
  53. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  54. package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
  55. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  56. package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
  57. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  58. package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
  59. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  60. package/dist/auth/magicLink/MagicLinkService.js +221 -9
  61. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  62. package/dist/auth/magicLink/index.d.ts +1 -1
  63. package/dist/auth/magicLink/index.d.ts.map +1 -1
  64. package/dist/auth/magicLink/index.js +1 -1
  65. package/dist/auth/magicLink/index.js.map +1 -1
  66. package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
  67. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  68. package/dist/auth/magicLink/redeemLanding.js +7 -4
  69. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  70. package/dist/auth/magicLink/types.d.ts +39 -3
  71. package/dist/auth/magicLink/types.d.ts.map +1 -1
  72. package/dist/auth/magicLink/types.js +0 -4
  73. package/dist/auth/magicLink/types.js.map +1 -1
  74. package/dist/auth/newUsers.d.ts.map +1 -1
  75. package/dist/auth/newUsers.js +1 -0
  76. package/dist/auth/newUsers.js.map +1 -1
  77. package/dist/auth/sessionUserClone.d.ts +1 -1
  78. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  79. package/dist/auth/sessionUserClone.js +3 -2
  80. package/dist/auth/sessionUserClone.js.map +1 -1
  81. package/dist/backgroundSweepConfigUnits.d.ts +231 -0
  82. package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
  83. package/dist/backgroundSweepConfigUnits.js +180 -0
  84. package/dist/backgroundSweepConfigUnits.js.map +1 -0
  85. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  86. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  87. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  88. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  89. package/dist/broadcast/index.d.ts +6 -0
  90. package/dist/broadcast/index.d.ts.map +1 -0
  91. package/dist/broadcast/index.js +6 -0
  92. package/dist/broadcast/index.js.map +1 -0
  93. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  94. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  95. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  96. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  97. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  98. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  99. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  100. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  101. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  102. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  103. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  104. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  105. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  106. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  107. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  108. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  109. package/dist/cache.d.ts +3 -2
  110. package/dist/cache.d.ts.map +1 -1
  111. package/dist/cache.js.map +1 -1
  112. package/dist/config.d.ts +1402 -8
  113. package/dist/config.d.ts.map +1 -1
  114. package/dist/config.js +120 -0
  115. package/dist/config.js.map +1 -1
  116. package/dist/context.d.ts +5 -1
  117. package/dist/context.d.ts.map +1 -1
  118. package/dist/context.js +64 -12
  119. package/dist/context.js.map +1 -1
  120. package/dist/coreRoutes.d.ts +3 -1
  121. package/dist/coreRoutes.d.ts.map +1 -1
  122. package/dist/coreRoutes.js +20 -4
  123. package/dist/coreRoutes.js.map +1 -1
  124. package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
  125. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  126. package/dist/generated/graphql-schemas/__mj.js +4167 -62
  127. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  128. package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
  129. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  130. package/dist/generic/CacheInvalidationResolver.js +154 -79
  131. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  132. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
  133. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  134. package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
  135. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  136. package/dist/generic/PubSubManager.d.ts +10 -0
  137. package/dist/generic/PubSubManager.d.ts.map +1 -1
  138. package/dist/generic/PubSubManager.js +44 -1
  139. package/dist/generic/PubSubManager.js.map +1 -1
  140. package/dist/generic/PushStatusResolver.d.ts +39 -6
  141. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  142. package/dist/generic/PushStatusResolver.js +93 -11
  143. package/dist/generic/PushStatusResolver.js.map +1 -1
  144. package/dist/generic/ResolverBase.d.ts +114 -29
  145. package/dist/generic/ResolverBase.d.ts.map +1 -1
  146. package/dist/generic/ResolverBase.js +509 -220
  147. package/dist/generic/ResolverBase.js.map +1 -1
  148. package/dist/generic/RunViewResolver.d.ts +15 -3
  149. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  150. package/dist/generic/RunViewResolver.js +126 -20
  151. package/dist/generic/RunViewResolver.js.map +1 -1
  152. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  153. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  154. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  155. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  156. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  157. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  158. package/dist/generic/fieldSecurityTransport.js +30 -0
  159. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  160. package/dist/index.d.ts +4 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +262 -84
  163. package/dist/index.js.map +1 -1
  164. package/dist/integration/ConnectionPause.d.ts +121 -0
  165. package/dist/integration/ConnectionPause.d.ts.map +1 -0
  166. package/dist/integration/ConnectionPause.js +183 -0
  167. package/dist/integration/ConnectionPause.js.map +1 -0
  168. package/dist/integration/CustomColumnPromoter.d.ts +72 -6
  169. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  170. package/dist/integration/CustomColumnPromoter.js +93 -47
  171. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  172. package/dist/integration/EntityMapLifecycle.d.ts +78 -4
  173. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  174. package/dist/integration/EntityMapLifecycle.js +199 -5
  175. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  176. package/dist/integration/InactiveRowWarnings.d.ts +31 -0
  177. package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
  178. package/dist/integration/InactiveRowWarnings.js +29 -0
  179. package/dist/integration/InactiveRowWarnings.js.map +1 -1
  180. package/dist/integration/ObjectNamesByID.d.ts +28 -0
  181. package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
  182. package/dist/integration/ObjectNamesByID.js +87 -0
  183. package/dist/integration/ObjectNamesByID.js.map +1 -0
  184. package/dist/integration/PostRestartIntrospect.d.ts +26 -0
  185. package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
  186. package/dist/integration/PostRestartIntrospect.js +27 -0
  187. package/dist/integration/PostRestartIntrospect.js.map +1 -0
  188. package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
  189. package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
  190. package/dist/integration/RSUPostRestartProgress.js +323 -0
  191. package/dist/integration/RSUPostRestartProgress.js.map +1 -0
  192. package/dist/integration/RSUProgressBridge.d.ts +41 -2
  193. package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
  194. package/dist/integration/RSUProgressBridge.js +84 -1
  195. package/dist/integration/RSUProgressBridge.js.map +1 -1
  196. package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
  197. package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
  198. package/dist/integration/RunArtifactAuthorization.js +45 -0
  199. package/dist/integration/RunArtifactAuthorization.js.map +1 -0
  200. package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
  201. package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
  202. package/dist/integration/SchemaRefreshLaunch.js +3 -2
  203. package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
  204. package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
  205. package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
  206. package/dist/integration/ScopedFieldsForBuild.js +91 -0
  207. package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
  208. package/dist/integration/TargetConfigGuard.d.ts +40 -0
  209. package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
  210. package/dist/integration/TargetConfigGuard.js +40 -0
  211. package/dist/integration/TargetConfigGuard.js.map +1 -0
  212. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  213. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  214. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  215. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  216. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  217. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  218. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  219. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +8 -6
  220. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
  221. package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
  222. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
  223. package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
  224. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  225. package/dist/realtimeSessions/sessionAccess.js +147 -22
  226. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  227. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  228. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  229. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  230. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  231. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  232. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  233. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  234. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  235. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  236. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  237. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  238. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  239. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  240. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  241. package/dist/realtimeWidget/WidgetSessionService.js +203 -19
  242. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  243. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  244. package/dist/realtimeWidget/host-identity.js +1 -1
  245. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  246. package/dist/realtimeWidget/visitorIdentity.js +1 -0
  247. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  248. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  249. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  250. package/dist/realtimeWidget/widgetCore.js +21 -8
  251. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  252. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  253. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  254. package/dist/realtimeWidget/widgetGuestElevation.js +3 -1
  255. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  256. package/dist/requestOrigin.d.ts +22 -0
  257. package/dist/requestOrigin.d.ts.map +1 -0
  258. package/dist/requestOrigin.js +60 -0
  259. package/dist/requestOrigin.js.map +1 -0
  260. package/dist/resolvers/ActionResolver.d.ts +19 -1
  261. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  262. package/dist/resolvers/ActionResolver.js +63 -12
  263. package/dist/resolvers/ActionResolver.js.map +1 -1
  264. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  265. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  266. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  267. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  268. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  269. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  270. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  271. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  272. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  273. package/dist/resolvers/AgentSessionResolver.js +44 -17
  274. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  275. package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
  276. package/dist/resolvers/AutotagPipelineResolver.js +2 -1
  277. package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
  278. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  279. package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
  280. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  281. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  282. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  283. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  284. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  285. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +6 -0
  286. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
  287. package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
  288. package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
  289. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
  290. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  291. package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
  292. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  293. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  294. package/dist/resolvers/FileCategoryResolver.js +1 -0
  295. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  296. package/dist/resolvers/FileResolver.d.ts +5 -0
  297. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  298. package/dist/resolvers/FileResolver.js +13 -4
  299. package/dist/resolvers/FileResolver.js.map +1 -1
  300. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  301. package/dist/resolvers/GetDataResolver.js +34 -13
  302. package/dist/resolvers/GetDataResolver.js.map +1 -1
  303. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
  304. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  305. package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
  306. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  307. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  308. package/dist/resolvers/MCPResolver.js +13 -2
  309. package/dist/resolvers/MCPResolver.js.map +1 -1
  310. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  311. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  312. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  313. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  314. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  315. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  316. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  317. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  318. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  319. package/dist/resolvers/QueryResolver.js +20 -6
  320. package/dist/resolvers/QueryResolver.js.map +1 -1
  321. package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
  322. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  323. package/dist/resolvers/QuerySystemUserResolver.js +184 -88
  324. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  325. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  326. package/dist/resolvers/RSUResolver.js +12 -0
  327. package/dist/resolvers/RSUResolver.js.map +1 -1
  328. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  329. package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
  330. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  331. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
  332. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  333. package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
  334. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  335. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
  336. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  337. package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
  338. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  339. package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
  340. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  341. package/dist/resolvers/RunAIAgentResolver.js +388 -125
  342. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  343. package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
  344. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  345. package/dist/resolvers/RunAIPromptResolver.js +19 -18
  346. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  347. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  348. package/dist/resolvers/RunTemplateResolver.js +7 -5
  349. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  350. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  351. package/dist/resolvers/RunTestResolver.js +3 -1
  352. package/dist/resolvers/RunTestResolver.js.map +1 -1
  353. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  354. package/dist/resolvers/SyncDataResolver.js +4 -0
  355. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  356. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  357. package/dist/resolvers/TestQuerySQLResolver.js +1 -0
  358. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  359. package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
  360. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  361. package/dist/resolvers/TransactionGroupResolver.js +60 -15
  362. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  363. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  364. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  365. package/dist/resolvers/UserViewResolver.js +2 -1
  366. package/dist/resolvers/UserViewResolver.js.map +1 -1
  367. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  368. package/dist/resolvers/meetingRecordingRegistration.js +2 -0
  369. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  370. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  371. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  372. package/dist/rest/EntityCRUDHandler.js +19 -5
  373. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  374. package/dist/rest/MediaAccessKeys.d.ts.map +1 -1
  375. package/dist/rest/MediaAccessKeys.js +6 -2
  376. package/dist/rest/MediaAccessKeys.js.map +1 -1
  377. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  378. package/dist/rest/OAuthCallbackHandler.js +11 -5
  379. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  380. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  381. package/dist/rest/RESTEndpointHandler.js +8 -5
  382. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  383. package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
  384. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
  385. package/dist/rest/RealtimeRecordingHandler.js +6 -8
  386. package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
  387. package/dist/rest/ViewOperationsHandler.d.ts +6 -0
  388. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  389. package/dist/rest/ViewOperationsHandler.js +24 -6
  390. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  391. package/dist/rest/setupRESTEndpoints.d.ts +3 -1
  392. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  393. package/dist/rest/setupRESTEndpoints.js +11 -2
  394. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  395. package/dist/serverRoleConfigUnits.d.ts +29 -0
  396. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  397. package/dist/serverRoleConfigUnits.js +33 -0
  398. package/dist/serverRoleConfigUnits.js.map +1 -0
  399. package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
  400. package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
  401. package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
  402. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  403. package/dist/services/TaskGraphActionRunner.js +2 -26
  404. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  405. package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
  406. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  407. package/dist/services/TaskGraphAgentRunner.js +38 -0
  408. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  409. package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
  410. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  411. package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
  412. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  413. package/dist/services/WorkQueueHostService.d.ts +2 -1
  414. package/dist/services/WorkQueueHostService.d.ts.map +1 -1
  415. package/dist/services/WorkQueueHostService.js +19 -4
  416. package/dist/services/WorkQueueHostService.js.map +1 -1
  417. package/dist/services/workQueueConfig.d.ts +2 -2
  418. package/dist/services/workQueueConfig.js +5 -5
  419. package/dist/services/workQueueConfig.js.map +1 -1
  420. package/dist/sharedCache.js +1 -1
  421. package/dist/sharedCache.js.map +1 -1
  422. package/dist/types.d.ts +40 -1
  423. package/dist/types.d.ts.map +1 -1
  424. package/dist/types.js.map +1 -1
  425. package/package.json +98 -98
  426. package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
  427. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  428. package/src/__tests__/ActiveOperations.test.ts +68 -0
  429. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  430. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  431. package/src/__tests__/AgentSessionResolver.ownership.test.ts +150 -0
  432. package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
  433. package/src/__tests__/BatchApplyParity.test.ts +109 -0
  434. package/src/__tests__/BridgeHostInstance.test.ts +42 -0
  435. package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
  436. package/src/__tests__/ConnectionPause.test.ts +192 -0
  437. package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
  438. package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
  439. package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
  440. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  441. package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
  442. package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
  443. package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
  444. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  445. package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
  446. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  447. package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
  448. package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
  449. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  450. package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
  451. package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
  452. package/src/__tests__/MagicLinkKeys.test.ts +102 -0
  453. package/src/__tests__/MediaAccessKeys.test.ts +57 -10
  454. package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
  455. package/src/__tests__/ObjectNamesByID.test.ts +176 -0
  456. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  457. package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
  458. package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
  459. package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
  460. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  461. package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
  462. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  463. package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
  464. package/src/__tests__/RSUProgressBridge.test.ts +188 -5
  465. package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
  466. package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
  467. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  468. package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
  469. package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
  470. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
  471. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
  472. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
  473. package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
  474. package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
  475. package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
  476. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  477. package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
  478. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
  479. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -1
  480. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  481. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  482. package/src/__tests__/RunAIAgentResolver.branch.test.ts +72 -13
  483. package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
  484. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  485. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  486. package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
  487. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
  488. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
  489. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  490. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
  491. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  492. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  493. package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
  494. package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
  495. package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
  496. package/src/__tests__/SessionJanitor.test.ts +195 -4
  497. package/src/__tests__/SessionManager.test.ts +164 -0
  498. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
  499. package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
  500. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
  501. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  502. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  503. package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
  504. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  505. package/src/__tests__/WorkQueueHostService.test.ts +25 -7
  506. package/src/__tests__/apiRootBoot.test.ts +1 -1
  507. package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
  508. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  509. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  510. package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
  511. package/src/__tests__/contextRequestOrigin.test.ts +105 -0
  512. package/src/__tests__/conversationBrowsers.test.ts +62 -0
  513. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  514. package/src/__tests__/globalCors.test.ts +3 -3
  515. package/src/__tests__/localDevAuth.test.ts +196 -0
  516. package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
  517. package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
  518. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  519. package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
  520. package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
  521. package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
  522. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  523. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  524. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  525. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +224 -7
  526. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  527. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  528. package/src/__tests__/requestOrigin.test.ts +104 -0
  529. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  530. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  531. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  532. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  533. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  534. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  535. package/src/__tests__/runViewProperties.test.ts +114 -0
  536. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  537. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  538. package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
  539. package/src/__tests__/sessionDeadline.test.ts +51 -0
  540. package/src/__tests__/sessionUserClone.test.ts +5 -1
  541. package/src/__tests__/sharedCache.test.ts +11 -0
  542. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  543. package/src/__tests__/unifiedAuth.test.ts +101 -1
  544. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  545. package/src/agentSessions/BridgeHostInstance.ts +20 -5
  546. package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
  547. package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
  548. package/src/agentSessions/SessionJanitor.ts +95 -45
  549. package/src/agentSessions/SessionManager.ts +73 -20
  550. package/src/agentSessions/conversationBrowsers.ts +143 -0
  551. package/src/agentSessions/sessionDeadline.ts +81 -0
  552. package/src/auth/APIKeyScopeAuth.ts +5 -4
  553. package/src/auth/AuthProviderCatalogRouter.ts +3 -0
  554. package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
  555. package/src/auth/index.ts +56 -12
  556. package/src/auth/initializeProviders.ts +43 -1
  557. package/src/auth/localDevAuth.ts +528 -0
  558. package/src/auth/loginEmailResolution.ts +67 -0
  559. package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
  560. package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
  561. package/src/auth/magicLink/MagicLinkService.ts +250 -10
  562. package/src/auth/magicLink/index.ts +1 -1
  563. package/src/auth/magicLink/redeemLanding.ts +7 -4
  564. package/src/auth/magicLink/types.ts +38 -3
  565. package/src/auth/newUsers.ts +1 -0
  566. package/src/auth/sessionUserClone.ts +3 -2
  567. package/src/backgroundSweepConfigUnits.ts +213 -0
  568. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  569. package/src/broadcast/index.ts +5 -0
  570. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  571. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  572. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  573. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  574. package/src/cache.ts +2 -1
  575. package/src/config.ts +138 -0
  576. package/src/context.ts +71 -14
  577. package/src/coreRoutes.ts +29 -7
  578. package/src/generated/graphql-schemas/__mj.ts +4145 -1193
  579. package/src/generic/CacheInvalidationResolver.ts +135 -78
  580. package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
  581. package/src/generic/PubSubManager.ts +54 -1
  582. package/src/generic/PushStatusResolver.ts +108 -11
  583. package/src/generic/ResolverBase.ts +635 -234
  584. package/src/generic/RunViewResolver.ts +176 -64
  585. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  586. package/src/generic/fieldSecurityTransport.ts +62 -0
  587. package/src/index.ts +310 -85
  588. package/src/integration/ConnectionPause.ts +222 -0
  589. package/src/integration/CustomColumnPromoter.ts +129 -54
  590. package/src/integration/EntityMapLifecycle.ts +229 -6
  591. package/src/integration/InactiveRowWarnings.ts +50 -0
  592. package/src/integration/ObjectNamesByID.ts +97 -0
  593. package/src/integration/PostRestartIntrospect.ts +49 -0
  594. package/src/integration/RSUPostRestartProgress.ts +359 -0
  595. package/src/integration/RSUProgressBridge.ts +85 -2
  596. package/src/integration/RunArtifactAuthorization.ts +65 -0
  597. package/src/integration/SchemaRefreshLaunch.ts +12 -2
  598. package/src/integration/ScopedFieldsForBuild.ts +113 -0
  599. package/src/integration/TargetConfigGuard.ts +71 -0
  600. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  601. package/src/realtimeSessions/README.md +7 -3
  602. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  603. package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
  604. package/src/realtimeSessions/sessionAccess.ts +211 -25
  605. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  606. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  607. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  608. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  609. package/src/realtimeWidget/WidgetSessionService.ts +254 -17
  610. package/src/realtimeWidget/host-identity.ts +1 -1
  611. package/src/realtimeWidget/visitorIdentity.ts +1 -0
  612. package/src/realtimeWidget/widgetCore.ts +34 -9
  613. package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
  614. package/src/requestOrigin.ts +64 -0
  615. package/src/resolvers/ActionResolver.ts +78 -15
  616. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  617. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  618. package/src/resolvers/AgentSessionResolver.ts +50 -18
  619. package/src/resolvers/AutotagPipelineResolver.ts +2 -1
  620. package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
  621. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  622. package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
  623. package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
  624. package/src/resolvers/FileCategoryResolver.ts +1 -0
  625. package/src/resolvers/FileResolver.ts +14 -4
  626. package/src/resolvers/GetDataResolver.ts +35 -13
  627. package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
  628. package/src/resolvers/MCPResolver.ts +15 -2
  629. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  630. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  631. package/src/resolvers/QueryResolver.ts +20 -6
  632. package/src/resolvers/QuerySystemUserResolver.ts +207 -99
  633. package/src/resolvers/RSUResolver.ts +12 -0
  634. package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
  635. package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
  636. package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
  637. package/src/resolvers/RunAIAgentResolver.ts +518 -163
  638. package/src/resolvers/RunAIPromptResolver.ts +18 -18
  639. package/src/resolvers/RunTemplateResolver.ts +9 -5
  640. package/src/resolvers/RunTestResolver.ts +3 -1
  641. package/src/resolvers/SyncDataResolver.ts +4 -0
  642. package/src/resolvers/TestQuerySQLResolver.ts +1 -0
  643. package/src/resolvers/TransactionGroupResolver.ts +66 -15
  644. package/src/resolvers/UserViewResolver.ts +2 -1
  645. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
  646. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  647. package/src/resolvers/meetingRecordingRegistration.ts +2 -0
  648. package/src/rest/EntityCRUDHandler.ts +22 -5
  649. package/src/rest/MediaAccessKeys.ts +6 -2
  650. package/src/rest/OAuthCallbackHandler.ts +13 -5
  651. package/src/rest/RESTEndpointHandler.ts +8 -5
  652. package/src/rest/RealtimeRecordingHandler.ts +9 -10
  653. package/src/rest/ViewOperationsHandler.ts +26 -7
  654. package/src/rest/setupRESTEndpoints.ts +11 -2
  655. package/src/serverRoleConfigUnits.ts +48 -0
  656. package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
  657. package/src/services/TaskGraphActionRunner.ts +2 -23
  658. package/src/services/TaskGraphAgentRunner.ts +43 -0
  659. package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
  660. package/src/services/WorkQueueHostService.ts +26 -4
  661. package/src/services/workQueueConfig.ts +5 -5
  662. package/src/sharedCache.ts +1 -1
  663. package/src/types.ts +41 -1
  664. package/src/services/TaskOrchestration-Integration.md +0 -188
@@ -1,5 +1,7 @@
1
1
  import { describe, it, expect } from 'vitest';
2
+ import { createHmac } from 'node:crypto';
2
3
  import jwt from 'jsonwebtoken';
4
+ import { GetGlobalObjectStore } from '@memberjunction/global';
3
5
  import { MediaAccessKeyManager, MEDIA_ACCESS_TOKEN_TYPE } from '../rest/MediaAccessKeys.js';
4
6
 
5
7
  /**
@@ -53,16 +55,61 @@ describe('MediaAccessKeyManager', () => {
53
55
  expect(km.Verify(Token).Valid).toBe(false);
54
56
  });
55
57
 
56
- it('rejects a token with the wrong typ even if validly signed', () => {
58
+ it('rejects a token with the wrong typ even when validly signed with the real secret', () => {
57
59
  const km = MediaAccessKeyManager.Instance;
58
- // Mint a valid token, then read the real secret out of a known-good token by
59
- // re-signing through the manager is not possible; instead assert that a token
60
- // whose typ differs is rejected by signing a structurally-valid JWT with a
61
- // foreign secret (signature failure also yields false, which is the safe outcome).
62
- const foreign = jwt.sign({ fileId: 'FILE-5', userId: 'USER-5', typ: 'something-else' }, 'foreign-secret', {
63
- algorithm: 'HS256',
64
- expiresIn: 3600,
65
- });
66
- expect(km.Verify(foreign).Valid).toBe(false);
60
+ const uploadToken = km.SignUpload('USER-5').Token;
61
+ expect(km.Verify(uploadToken).Valid).toBe(false);
62
+
63
+ const mediaToken = km.Sign('FILE-5', 'USER-5').Token;
64
+ expect(km.VerifyUpload(mediaToken).Valid).toBe(false);
65
+ });
66
+
67
+ it('derives a domain-separated HS256 signing key from MJ_BASE_ENCRYPTION_KEY and rejects tokens signed with the raw master key', () => {
68
+ const store = GetGlobalObjectStore();
69
+ const savedStoreSecret = store?.['___MEDIA_ACCESS_SECRET___'];
70
+ const savedEnvKey = process.env.MJ_BASE_ENCRYPTION_KEY;
71
+ const rawMasterKey = 'test-master-encryption-key-do-not-use-directly';
72
+
73
+ try {
74
+ if (store) {
75
+ delete store['___MEDIA_ACCESS_SECRET___'];
76
+ }
77
+ process.env.MJ_BASE_ENCRYPTION_KEY = rawMasterKey;
78
+
79
+ const isolatedKm = new MediaAccessKeyManager();
80
+ const { Token } = isolatedKm.Sign('FILE-KEY-SEP', 'USER-KEY-SEP');
81
+
82
+ // Round-trips through the manager using the derived subkey
83
+ const verified = isolatedKm.Verify(Token);
84
+ expect(verified.Valid).toBe(true);
85
+
86
+ // Matches the documented HMAC-SHA256 key derivation label
87
+ const expectedDerivedSecret = createHmac('sha256', rawMasterKey)
88
+ .update('mj-media-access-token-signing-v1')
89
+ .digest('base64');
90
+ const decoded = jwt.verify(Token, expectedDerivedSecret, { algorithms: ['HS256'] });
91
+ expect(typeof decoded).toBe('object');
92
+
93
+ // A JWT signed directly with the raw MJ_BASE_ENCRYPTION_KEY MUST be rejected
94
+ const forgedWithRawMasterKey = jwt.sign(
95
+ { fileId: 'FILE-KEY-SEP', userId: 'USER-KEY-SEP', typ: MEDIA_ACCESS_TOKEN_TYPE },
96
+ rawMasterKey,
97
+ { algorithm: 'HS256', expiresIn: 3600 },
98
+ );
99
+ expect(isolatedKm.Verify(forgedWithRawMasterKey).Valid).toBe(false);
100
+ } finally {
101
+ if (savedEnvKey === undefined) {
102
+ delete process.env.MJ_BASE_ENCRYPTION_KEY;
103
+ } else {
104
+ process.env.MJ_BASE_ENCRYPTION_KEY = savedEnvKey;
105
+ }
106
+ if (store) {
107
+ if (savedStoreSecret === undefined) {
108
+ delete store['___MEDIA_ACCESS_SECRET___'];
109
+ } else {
110
+ store['___MEDIA_ACCESS_SECRET___'] = savedStoreSecret;
111
+ }
112
+ }
113
+ }
67
114
  });
68
115
  });
@@ -0,0 +1,50 @@
1
+ /**
2
+ * everything.txt is explicit about what a schema refresh does with objects it has just found:
3
+ * "we create entity maps for all objects that are determined as things that should be now added
4
+ * but arent, we enable nothing (because the user needs to, after the refresh, then go turn them
5
+ * on)". These pin that contract at the only place it is expressed - the argument defaults.
6
+ *
7
+ * They defaulted TRUE for a period on the claim that a disabled new object never reached a
8
+ * migration. That claim was wrong: `CreateDisabled` governs only the entity/field MAP status,
9
+ * new IntegrationObject rows are written Active unconditionally, and phase 4 evolves over
10
+ * `continuingMaps + newObjects` regardless of the flag. The table is created either way; the
11
+ * flag decides only whether the object starts SYNCING unasked.
12
+ *
13
+ * Read from source rather than by invoking the resolver: the default lives in a type-graphql
14
+ * decorator, and a test that booted the schema to read it back would be testing type-graphql.
15
+ */
16
+ import { describe, it, expect } from 'vitest';
17
+ import { readFileSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+
20
+ const SRC = readFileSync(
21
+ join(__dirname, '..', 'resolvers', 'IntegrationDiscoveryResolver.ts'),
22
+ 'utf-8',
23
+ );
24
+
25
+ function argDefault(name: string): string | null {
26
+ const m = SRC.match(new RegExp(`@Arg\\("${name}",\\s*\\{\\s*defaultValue:\\s*(true|false)`));
27
+ return m ? m[1] : null;
28
+ }
29
+
30
+ describe('new arrivals default to disabled', () => {
31
+ it('autoEnableNewObjects defaults false', () => {
32
+ expect(argDefault('autoEnableNewObjects')).toBe('false');
33
+ });
34
+
35
+ it('autoEnableNewColumns defaults false', () => {
36
+ expect(argDefault('autoEnableNewColumns')).toBe('false');
37
+ });
38
+
39
+ it('the description does not promise auto-adoption', () => {
40
+ const line = SRC.split('\n').find(l => l.includes('@Arg("autoEnableNewObjects"'));
41
+ expect(line).toBeDefined();
42
+ expect(line!).toMatch(/DISABLED/);
43
+ expect(line!).not.toMatch(/created ENABLED/);
44
+ });
45
+
46
+ it('CreateDisabled is still what carries the decision to the post-restart consumer', () => {
47
+ // If this coupling is ever renamed, the defaults above stop meaning anything.
48
+ expect(SRC).toMatch(/CreateDisabled:\s*!autoEnableNewObjects/);
49
+ });
50
+ });
@@ -0,0 +1,176 @@
1
+ /**
2
+ * A table selection's ids resolve against the CONNECTION's catalog, and an apply that resolves
3
+ * nothing builds nothing.
4
+ *
5
+ * Inside a catalog scope, `IntegrationListSourceObjects` hands the picker per-connection
6
+ * (CompanyIntegrationObject) ids. Every name lookup the apply paths ran read only the shared
7
+ * `MJ: Integration Objects` catalog, so an id-only selection was dropped with a LogError, the
8
+ * migration ran with an empty table list, CodeGen and the restart still ran, and the apply reported
9
+ * Success with 0 tables — 118 picked, 0 built, twice, on a WordPress connection.
10
+ *
11
+ * These pin the lookup the four resolver paths now share, and — against the source, because the
12
+ * resolver needs a provider, a connector and an RSU pipeline to invoke — that the apply refuses an
13
+ * empty resolution before it builds anything.
14
+ */
15
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
16
+ import { readFileSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ import { RunView, type UserInfo } from '@memberjunction/core';
19
+ import { IntegrationEngineBase } from '@memberjunction/integration-engine-base';
20
+ import { WithCatalogScope } from '@memberjunction/integration-engine';
21
+ import { LookupObjectNamesByID, OBJECT_ID_LOOKUP_CHUNK } from '../integration/ObjectNamesByID.js';
22
+
23
+ const USER = { ID: 'user-1' } as UserInfo;
24
+ type RunViewParams = Parameters<RunView['RunView']>[0];
25
+ type RunViewResult = Awaited<ReturnType<RunView['RunView']>>;
26
+
27
+ /** An engine holding a per-connection catalog: each row is a CIO id, its shared IO id, and a name. */
28
+ function installEngine(rows: Array<{ ID: string; IntegrationObjectID: string | null; Name: string }>, hasCatalog = true) {
29
+ vi.spyOn(IntegrationEngineBase, 'Instance', 'get').mockReturnValue({
30
+ HasCompanyIntegrationCatalog: () => hasCatalog,
31
+ GetCompanyIntegrationObjects: () => rows,
32
+ } as unknown as IntegrationEngineBase);
33
+ }
34
+
35
+ describe('LookupObjectNamesByID', () => {
36
+ let runView: ReturnType<typeof vi.spyOn>;
37
+ beforeEach(() => {
38
+ runView = vi.spyOn(RunView.prototype, 'RunView');
39
+ });
40
+ afterEach(() => { vi.restoreAllMocks(); });
41
+
42
+ it('resolves per-connection ids from the scope\'s catalog with no query, whatever their case', async () => {
43
+ installEngine([
44
+ { ID: 'cio-aaa', IntegrationObjectID: 'io-111', Name: 'posts' },
45
+ { ID: 'cio-bbb', IntegrationObjectID: null, Name: 'pages' },
46
+ ]);
47
+
48
+ const map = await WithCatalogScope('CI-1', () => LookupObjectNamesByID(['CIO-AAA', 'cio-bbb'], USER));
49
+
50
+ expect(map.get('CIO-AAA')).toBe('posts');
51
+ expect(map.get('CIO-BBB')).toBe('pages');
52
+ expect(runView).not.toHaveBeenCalled();
53
+ });
54
+
55
+ it('also resolves a shared IntegrationObject id through the row that carries it', async () => {
56
+ installEngine([{ ID: 'cio-aaa', IntegrationObjectID: 'io-111', Name: 'posts' }]);
57
+
58
+ const map = await WithCatalogScope('CI-1', () => LookupObjectNamesByID(['IO-111'], USER));
59
+
60
+ expect(map.get('IO-111')).toBe('posts');
61
+ expect(runView).not.toHaveBeenCalled();
62
+ });
63
+
64
+ it('reads a cache miss straight from the connection\'s catalog: one uncached query, scoped to the connection', async () => {
65
+ installEngine([{ ID: 'cio-aaa', IntegrationObjectID: null, Name: 'posts' }]);
66
+ runView.mockResolvedValue({ Success: true, Results: [{ ID: 'cio-new', Name: 'comments' }] } as unknown as RunViewResult);
67
+
68
+ const map = await WithCatalogScope('CI-1', () => LookupObjectNamesByID(['cio-aaa', 'cio-new'], USER));
69
+
70
+ expect(runView).toHaveBeenCalledTimes(1);
71
+ const params = runView.mock.calls[0][0] as RunViewParams;
72
+ expect(params.EntityName).toBe('MJ: Company Integration Objects');
73
+ expect(params.ExtraFilter).toBe("CompanyIntegrationID='CI-1' AND ID IN ('CIO-NEW')");
74
+ expect(params.BypassCache).toBe(true);
75
+ expect(params.IgnoreMaxRows).toBe(true);
76
+ expect(map.get('CIO-NEW')).toBe('comments');
77
+ expect(map.get('CIO-AAA')).toBe('posts');
78
+ });
79
+
80
+ it(`reads cache misses ${OBJECT_ID_LOOKUP_CHUNK} ids per query`, async () => {
81
+ installEngine([]);
82
+ runView.mockResolvedValue({ Success: true, Results: [] } as unknown as RunViewResult);
83
+ const ids = Array.from({ length: OBJECT_ID_LOOKUP_CHUNK + 1 }, (_, i) => `cio-${i}`);
84
+
85
+ await WithCatalogScope('CI-1', () => LookupObjectNamesByID(ids, USER));
86
+
87
+ const perConnection = runView.mock.calls.filter(c => (c[0] as RunViewParams).EntityName === 'MJ: Company Integration Objects');
88
+ expect(perConnection).toHaveLength(2);
89
+ });
90
+
91
+ it('falls through to the shared catalog only for ids neither tier resolved', async () => {
92
+ installEngine([]);
93
+ runView
94
+ .mockResolvedValueOnce({ Success: true, Results: [] } as unknown as RunViewResult)
95
+ .mockResolvedValueOnce({ Success: true, Results: [{ ID: 'io-9', Name: 'users' }] } as unknown as RunViewResult);
96
+
97
+ const map = await WithCatalogScope('CI-1', () => LookupObjectNamesByID(['io-9'], USER));
98
+
99
+ expect(runView).toHaveBeenCalledTimes(2);
100
+ expect((runView.mock.calls[1][0] as RunViewParams).EntityName).toBe('MJ: Integration Objects');
101
+ expect(map.get('IO-9')).toBe('users');
102
+ });
103
+
104
+ it('outside a catalog scope, queries only the shared catalog — exactly as before', async () => {
105
+ installEngine([{ ID: 'cio-aaa', IntegrationObjectID: null, Name: 'posts' }]);
106
+ runView.mockResolvedValue({ Success: true, Results: [{ ID: 'io-1', Name: 'users' }] } as unknown as RunViewResult);
107
+
108
+ const map = await LookupObjectNamesByID(['io-1'], USER);
109
+
110
+ expect(runView).toHaveBeenCalledTimes(1);
111
+ const params = runView.mock.calls[0][0] as RunViewParams;
112
+ expect(params.EntityName).toBe('MJ: Integration Objects');
113
+ expect(params.ExtraFilter).toBe("ID='IO-1'");
114
+ expect(map.get('IO-1')).toBe('users');
115
+ });
116
+
117
+ it('quotes ids, so a stray quote cannot break out of the filter', async () => {
118
+ installEngine([]);
119
+ runView.mockResolvedValue({ Success: true, Results: [] } as unknown as RunViewResult);
120
+
121
+ await LookupObjectNamesByID(["x' OR 1=1 --"], USER);
122
+
123
+ expect((runView.mock.calls[0][0] as RunViewParams).ExtraFilter).toBe("ID='X'' OR 1=1 --'");
124
+ });
125
+
126
+ it('escapes ids the way every filter does: a NUL byte never reaches the query', async () => {
127
+ installEngine([]);
128
+ runView.mockResolvedValue({ Success: true, Results: [] } as unknown as RunViewResult);
129
+
130
+ await LookupObjectNamesByID(['io-1\0'], USER);
131
+
132
+ expect((runView.mock.calls[0][0] as RunViewParams).ExtraFilter).toBe("ID='IO-1'");
133
+ });
134
+
135
+ it('asks nothing for an empty selection', async () => {
136
+ installEngine([]);
137
+ expect((await LookupObjectNamesByID([], USER)).size).toBe(0);
138
+ expect(runView).not.toHaveBeenCalled();
139
+ });
140
+ });
141
+
142
+ describe('the resolver uses the lookup, and refuses to build an empty resolution', () => {
143
+ const source = readFileSync(join(__dirname, '../resolvers/IntegrationDiscoveryResolver.ts'), 'utf8');
144
+ const body = (signature: string): string => {
145
+ const start = source.indexOf(signature);
146
+ expect(start, `not found: ${signature}`).toBeGreaterThan(-1);
147
+ return source.slice(start, source.indexOf('\n }\n', start));
148
+ };
149
+
150
+ it.each([
151
+ 'private async resolveSelectionPlan(',
152
+ 'private async resolveSourceObjectNames(',
153
+ 'private async resolveSourceObjectsToNames(',
154
+ 'private async resolveObjectInputs(',
155
+ ])('%s resolves ids through LookupObjectNamesByID, never the shared catalog alone', (signature) => {
156
+ const fn = body(signature);
157
+ expect(fn).toContain('LookupObjectNamesByID(');
158
+ expect(fn).not.toContain("EntityName: 'MJ: Integration Objects'");
159
+ });
160
+
161
+ it('IntegrationApplyAll refuses an empty resolution BEFORE the schema build', () => {
162
+ const resolve = source.indexOf('const resolved = await this.resolveSourceObjectsToNames(input.SourceObjects, sourceSchema, user);');
163
+ expect(resolve).toBeGreaterThan(-1);
164
+ const refusal = source.indexOf('input.SourceObjects.length > 0 && resolvedNames.length === 0', resolve);
165
+ const build = source.indexOf('this.buildSchemaForConnector(', resolve);
166
+ expect(refusal).toBeGreaterThan(resolve);
167
+ expect(refusal).toBeLessThan(build);
168
+ expect(source.slice(refusal, build)).toContain('Success: false');
169
+ expect(source.slice(refusal, build)).toContain('Apply refused');
170
+ });
171
+
172
+ it('the batch flow throws on an empty resolution, mirroring the filtered flow', () => {
173
+ expect(source).toContain('connInput.SourceObjects.length > 0 && resolvedNames.length === 0');
174
+ expect(source).toContain('No source objects resolved');
175
+ });
176
+ });
@@ -0,0 +1,58 @@
1
+ import 'reflect-metadata';
2
+ import { describe, it, expect, vi } from 'vitest';
3
+
4
+ vi.mock('type-graphql', () => {
5
+ const noopDecorator = () => () => undefined;
6
+ return {
7
+ Resolver: noopDecorator,
8
+ Mutation: noopDecorator,
9
+ Query: noopDecorator,
10
+ Subscription: noopDecorator,
11
+ ObjectType: noopDecorator,
12
+ InputType: noopDecorator,
13
+ Field: noopDecorator,
14
+ Arg: noopDecorator,
15
+ Args: noopDecorator,
16
+ Ctx: noopDecorator,
17
+ PubSub: noopDecorator,
18
+ Root: noopDecorator,
19
+ Float: class {},
20
+ Int: class {},
21
+ ID: class {},
22
+ };
23
+ });
24
+
25
+ import { PipelineProgressFilter, type PipelineProgressNotification } from '../resolvers/PipelineProgressResolver';
26
+
27
+ const RUN_ID = 'AA11BB22-0000-4000-8000-000000000001';
28
+ const OTHER_RUN_ID = 'CC33DD44-0000-4000-8000-000000000002';
29
+
30
+ function makePayload(pipelineRunID: string): PipelineProgressNotification {
31
+ return {
32
+ PipelineRunID: pipelineRunID,
33
+ Stage: 'extract',
34
+ TotalItems: 100,
35
+ ProcessedItems: 25,
36
+ ElapsedMs: 500,
37
+ PercentComplete: 25,
38
+ };
39
+ }
40
+
41
+ describe('PipelineProgressFilter', () => {
42
+ it('delivers when PipelineRunID matches exactly', () => {
43
+ expect(PipelineProgressFilter({ payload: makePayload(RUN_ID), args: { pipelineRunID: RUN_ID } })).toBe(true);
44
+ });
45
+
46
+ it('delivers when PipelineRunID differs only in UUID casing (SQL Server uppercase vs client lowercase)', () => {
47
+ expect(
48
+ PipelineProgressFilter({
49
+ payload: makePayload(RUN_ID.toUpperCase()),
50
+ args: { pipelineRunID: RUN_ID.toLowerCase() },
51
+ })
52
+ ).toBe(true);
53
+ });
54
+
55
+ it('rejects notifications for a different pipeline run', () => {
56
+ expect(PipelineProgressFilter({ payload: makePayload(OTHER_RUN_ID), args: { pipelineRunID: RUN_ID } })).toBe(false);
57
+ });
58
+ });
@@ -0,0 +1,146 @@
1
+ /**
2
+ * The per-connection catalog answers correctly only when a read happens INSIDE a scope naming the
3
+ * connection; an unscoped read falls back to the shared catalog by design. Every request-time entry
4
+ * point enters the scope in the resolver. The one entry point that is NOT request-time is the
5
+ * post-restart consumer in index.ts: after the RSU restarts the process it introspects the connector
6
+ * to build the entity and field maps, and nothing upstream of it has entered a scope.
7
+ *
8
+ * Unscoped, that introspection sees only the declared fields, so every column this connection's own
9
+ * discovery sampled gets a table column (the RSU built the schema in scope) but no field map, and its
10
+ * values land in the overflow JSON instead of the column. On the sandbox that was 69 of 556 columns.
11
+ *
12
+ * Entering the scope is not enough on its own. In a freshly restarted process nothing has loaded the
13
+ * connection's catalog, so a synchronous entry reads the shared one; and an async entry loads objects
14
+ * but not fields, so a connector reading fields gets the connection's objects with none. These run
15
+ * the real catalog scope from a cold cache, with only the database reads stubbed.
16
+ */
17
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
18
+ import { readFileSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { RunView, type UserInfo } from '@memberjunction/core';
21
+ import {
22
+ CATALOG_FIELD_COLUMNS,
23
+ CATALOG_OBJECT_COLUMNS,
24
+ ENTITY_COMPANY_INTEGRATION_OBJECTS,
25
+ ENTITY_COMPANY_INTEGRATION_OBJECT_FIELDS,
26
+ IntegrationEngineBase,
27
+ } from '@memberjunction/integration-engine-base';
28
+ import { CatalogFieldCacheStats, EvictCatalogScope, RunInCatalogScope, WithCatalogScope } from '@memberjunction/integration-engine';
29
+ import { IntrospectInCatalogScope } from '../integration/PostRestartIntrospect.js';
30
+
31
+ const SRC = readFileSync(join(__dirname, '..', 'index.ts'), 'utf-8');
32
+
33
+ const INTEGRATION = 'AAAAAAAA-1111-2222-3333-444444444444';
34
+ const CONN = 'CCCCCCCC-0000-0000-0000-000000000001';
35
+ const MEMBERS = 'BBBBBBBB-0000-0000-0000-000000000001';
36
+ const USER = { ID: 'u-1' } as UserInfo;
37
+ type RunViewParams = Parameters<RunView['RunView']>[0];
38
+ type RunViewResult = Awaited<ReturnType<RunView['RunView']>>;
39
+
40
+ function row(columns: readonly string[], values: Record<string, unknown>) {
41
+ const all: Record<string, unknown> = {};
42
+ for (const c of columns) all[c] = null;
43
+ Object.assign(all, values);
44
+ return { Fields: Object.keys(all).map(Name => ({ Name })), Get: (c: string) => all[c] };
45
+ }
46
+ const membersRow = row(CATALOG_OBJECT_COLUMNS, {
47
+ ID: MEMBERS, CompanyIntegrationID: CONN, IntegrationID: INTEGRATION, Name: 'Members', Status: 'Active', Sequence: 1,
48
+ });
49
+ // `region` is the column this connection's discovery sampled; the connector never declared it.
50
+ const memberFields = [
51
+ row(CATALOG_FIELD_COLUMNS, { ID: 'f0', CompanyIntegrationObjectID: MEMBERS, Name: 'id', Status: 'Active', Sequence: 1 }),
52
+ row(CATALOG_FIELD_COLUMNS, { ID: 'f1', CompanyIntegrationObjectID: MEMBERS, Name: 'region', Status: 'Active', Sequence: 2 }),
53
+ ];
54
+
55
+ let objectsInDb: ReturnType<typeof row>[] = [];
56
+ let fieldReadFails = false;
57
+ let fieldReads = 0;
58
+
59
+ function answer(p: RunViewParams): RunViewResult {
60
+ const ok = (Results: unknown[]) => ({ Success: true, Results } as unknown as RunViewResult);
61
+ if (p.EntityName === ENTITY_COMPANY_INTEGRATION_OBJECTS) return ok(objectsInDb);
62
+ if (p.EntityName === ENTITY_COMPANY_INTEGRATION_OBJECT_FIELDS && p.ResultType === 'simple') return ok([]); // the edge set
63
+ if (p.EntityName === ENTITY_COMPANY_INTEGRATION_OBJECT_FIELDS) {
64
+ fieldReads++;
65
+ if (fieldReadFails) return { Success: false, ErrorMessage: 'connection reset', Results: [] } as unknown as RunViewResult;
66
+ const oid = /CompanyIntegrationObjectID = '([^']+)'/.exec(String(p.ExtraFilter ?? ''))?.[1] ?? '';
67
+ return ok(oid.toUpperCase() === MEMBERS ? memberFields : []);
68
+ }
69
+ return ok([]);
70
+ }
71
+
72
+ /** What a REST connector's IntrospectSchema reads: the object by integration + name, then its fields. */
73
+ async function introspectMembers(): Promise<string[]> {
74
+ const base = IntegrationEngineBase.Instance;
75
+ const obj = base.GetIntegrationObject(INTEGRATION, 'Members');
76
+ return obj ? base.GetIntegrationObjectFields(obj.ID).map(f => f.Name) : [];
77
+ }
78
+
79
+ beforeEach(() => {
80
+ EvictCatalogScope(); // a freshly restarted process: nothing loaded, nothing warm
81
+ objectsInDb = [membersRow];
82
+ fieldReadFails = false;
83
+ fieldReads = 0;
84
+ vi.spyOn(RunView.prototype, 'RunView').mockImplementation(async (p: RunViewParams) => answer(p));
85
+ vi.spyOn(IntegrationEngineBase.Instance, 'ProviderToUse', 'get')
86
+ .mockImplementation(() => ({ EntityByName: (n: string) => ({ Name: n }) }) as never);
87
+ IntegrationEngineBase.Instance.SeedForTesting({
88
+ IntegrationObjects: [], IntegrationObjectFields: [], CompanyIntegrationObjects: [], CompanyIntegrationObjectFields: [],
89
+ });
90
+ });
91
+ afterEach(() => { vi.restoreAllMocks(); });
92
+
93
+ describe('post-restart introspection sees the connection\'s own fields from a cold catalog', () => {
94
+ it('introspects the per-connection fields, sampled column included', async () => {
95
+ const fields = await IntrospectInCatalogScope(CONN, ['Members'], introspectMembers, USER);
96
+ expect(fields).toEqual(['id', 'region']);
97
+ });
98
+
99
+ it('releases its pins after the introspection', async () => {
100
+ await IntrospectInCatalogScope(CONN, ['Members'], introspectMembers, USER);
101
+ expect(CatalogFieldCacheStats().Pinned).toBe(0);
102
+ });
103
+
104
+ it('releases its pins when the introspection throws, and the error propagates', async () => {
105
+ await expect(IntrospectInCatalogScope(CONN, ['Members'], async () => { throw new Error('vendor 503'); }, USER))
106
+ .rejects.toThrow('vendor 503');
107
+ expect(CatalogFieldCacheStats().Pinned).toBe(0);
108
+ });
109
+
110
+ it('a failed field read throws instead of introspecting an object with no fields', async () => {
111
+ fieldReadFails = true;
112
+ const introspect = vi.fn(introspectMembers);
113
+ await expect(IntrospectInCatalogScope(CONN, ['Members'], introspect, USER)).rejects.toThrow();
114
+ expect(introspect).not.toHaveBeenCalled();
115
+ });
116
+
117
+ it('a connection with no catalog of its own warms nothing and introspects as before', async () => {
118
+ objectsInDb = [];
119
+ const introspect = vi.fn(async () => 'shared');
120
+ expect(await IntrospectInCatalogScope(CONN, ['Members'], introspect, USER)).toBe('shared');
121
+ expect(introspect).toHaveBeenCalledOnce();
122
+ expect(fieldReads).toBe(0);
123
+ });
124
+
125
+ it('why: a synchronous scope on a cold process reads the shared catalog — no object at all', async () => {
126
+ expect(await RunInCatalogScope(CONN, introspectMembers)).toEqual([]);
127
+ });
128
+
129
+ it('why: an async scope without the warm finds the object but none of its fields', async () => {
130
+ expect(await WithCatalogScope(CONN, introspectMembers, USER)).toEqual([]);
131
+ });
132
+ });
133
+
134
+ describe('index.ts wires the post-restart introspection through it', () => {
135
+ it('introspects through IntrospectInCatalogScope for the item\'s connection and objects', () => {
136
+ // Whitespace-tolerant: formatters may wrap the call.
137
+ expect(SRC).toMatch(
138
+ /const schema = await IntrospectInCatalogScope\(\s*item\.CompanyIntegrationID\s*,\s*item\.SourceObjectNames\s*,\s*\(\)\s*=>\s*introspect\(\s*companyIntegration\s*,\s*systemUser\s*\)\s*,\s*systemUser\s*,?\s*\)/,
139
+ );
140
+ });
141
+
142
+ it('has no bare or synchronously scoped post-restart introspect call left', () => {
143
+ expect(SRC).not.toMatch(/const schema = await introspect\(companyIntegration, systemUser\)/);
144
+ expect(SRC).not.toMatch(/RunInCatalogScope\(\s*item\.CompanyIntegrationID/);
145
+ });
146
+ });
@@ -0,0 +1,80 @@
1
+ /**
2
+ * The child rows `CreateQueryExtended` / `UpdateQueryExtended` return are mapped column by column
3
+ * from the saved query's rows. A column left out of that mapping reaches the client as `null`
4
+ * whatever is stored, so every column the GraphQL types carry must be mapped: a field's
5
+ * nullability, entity-field source and `schema.object` source, a parameter's server-set flag and
6
+ * a Query Entities row's alternate base view.
7
+ */
8
+ import 'reflect-metadata';
9
+ import { describe, it, expect, vi } from 'vitest';
10
+
11
+ vi.mock('type-graphql', () => {
12
+ const decoratorFactory = (..._args: unknown[]) => (..._decorated: unknown[]) => undefined;
13
+ const exportNames = ['Arg', 'Ctx', 'Field', 'InputType', 'Mutation', 'ObjectType', 'Resolver', 'PubSub', 'Int', 'Float'];
14
+ return { ...Object.fromEntries(exportNames.map((name) => [name, decoratorFactory])), registerEnumType: () => undefined };
15
+ });
16
+ vi.mock('@memberjunction/core-entities-server', () => ({ MJQueryEntityServer: class {} }));
17
+ vi.mock('../generic/DeleteOptionsInput.js', () => ({ DeleteOptionsInput: class {} }));
18
+ vi.mock('../generated/generated.js', () => ({
19
+ MJQuery_: class {}, MJQueryField_: class {}, MJQueryParameter_: class {}, MJQueryEntity_: class {}, MJQueryPermission_: class {},
20
+ MJQueryResolver: class {
21
+ protected async MapFieldNamesToCodeNames(_entityName: string, values: Record<string, unknown>) {
22
+ return values;
23
+ }
24
+ },
25
+ }));
26
+
27
+ import { MJQueryResolverExtended } from '../resolvers/QuerySystemUserResolver.js';
28
+
29
+ type MappedRows = { Fields: Record<string, unknown>[]; Parameters: Record<string, unknown>[]; Entities: Record<string, unknown>[] };
30
+
31
+ const STAMP = new Date('2026-10-28T00:00:00Z');
32
+
33
+ const FIELD = {
34
+ ID: 'field-1', QueryID: 'query-1', Query: 'Q', Name: 'UserName', Description: 'The name.', Sequence: 1, SQLBaseType: 'nvarchar', SQLFullType: 'nvarchar(100)',
35
+ SourceEntityID: 'entity-users', SourceEntity: 'MJ: Users', SourceFieldName: 'Name', SourceEntityFieldID: 'field-users-name', SourceEntityField: 'Name',
36
+ SourceObjectName: null, IsNullable: false, IsComputed: false, ComputationDescription: null, IsSummary: false, SummaryDescription: null,
37
+ DetectionMethod: 'Database', AutoDetectConfidenceScore: null, __mj_CreatedAt: STAMP, __mj_UpdatedAt: STAMP,
38
+ };
39
+
40
+ const OBJECT_FIELD = { ...FIELD, ID: 'field-2', Name: 'Code', SourceEntityID: null, SourceEntity: null, SourceEntityFieldID: null, SourceEntityField: null, SourceFieldName: 'Code', SourceObjectName: 'fixture.Customer', IsNullable: true };
41
+
42
+ const PARAMETER = {
43
+ ID: 'parameter-1', QueryID: 'query-1', Query: 'Q', Name: 'OwnerID', Description: null, Type: 'string', IsRequired: true, DefaultValue: null, SampleValue: null,
44
+ ValidationFilters: null, IsServerSet: true, DetectionMethod: 'Manual', AutoDetectConfidenceScore: null, __mj_CreatedAt: STAMP, __mj_UpdatedAt: STAMP,
45
+ };
46
+
47
+ const ENTITY = {
48
+ ID: 'link-1', QueryID: 'query-1', Query: 'Q', EntityID: 'entity-users', Entity: 'MJ: Users', AlternateBaseViewID: 'abv-active', AlternateBaseView: 'Active Users',
49
+ DetectionMethod: 'Parser', AutoDetectConfidenceScore: 1, __mj_CreatedAt: STAMP, __mj_UpdatedAt: STAMP,
50
+ };
51
+
52
+ async function mapped(): Promise<MappedRows> {
53
+ const build = (MJQueryResolverExtended.prototype as unknown as {
54
+ buildSuccessResult(entity: unknown, user: unknown, provider: unknown): Promise<MappedRows>;
55
+ }).buildSuccessResult;
56
+ const entity = { GetAll: () => ({ ID: 'query-1' }), QueryFields: [FIELD, OBJECT_FIELD], QueryParameters: [PARAMETER], QueryEntities: [ENTITY], QueryPermissions: [] };
57
+ return build.call(new MJQueryResolverExtended(), entity, {}, {});
58
+ }
59
+
60
+ describe('QuerySystemUserResolver: the saved query\'s child rows are returned with every column', () => {
61
+ it('returns a field\'s nullability and its entity-field source', async () => {
62
+ const { Fields } = await mapped();
63
+ expect(Fields[0]).toMatchObject({ IsNullable: false, SourceEntityFieldID: 'field-users-name', SourceEntityField: 'Name', SourceObjectName: null });
64
+ });
65
+
66
+ it('returns the schema.object source of a field no entity backs', async () => {
67
+ const { Fields } = await mapped();
68
+ expect(Fields[1]).toMatchObject({ IsNullable: true, SourceObjectName: 'fixture.Customer', SourceEntityFieldID: null });
69
+ });
70
+
71
+ it('returns a parameter\'s server-set flag', async () => {
72
+ const { Parameters } = await mapped();
73
+ expect(Parameters[0]).toMatchObject({ IsServerSet: true });
74
+ });
75
+
76
+ it('returns a Query Entities row\'s alternate base view', async () => {
77
+ const { Entities } = await mapped();
78
+ expect(Entities[0]).toMatchObject({ AlternateBaseViewID: 'abv-active', AlternateBaseView: 'Active Users' });
79
+ });
80
+ });