@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
@@ -24,13 +24,22 @@ vi.mock('type-graphql', () => {
24
24
  return Object.fromEntries(exportNames.map((name) => [name, decoratorFactory]));
25
25
  });
26
26
 
27
+ const hoisted = vi.hoisted(() => ({
28
+ runAgentInConversation: vi.fn().mockResolvedValue({ agentResult: { success: true } }),
29
+ }));
30
+
27
31
  vi.mock('@memberjunction/ai-agents', () => ({
28
32
  AgentRunner: class {
29
- RunAgentInConversation() {
30
- return Promise.resolve({ agentResult: { success: true } });
33
+ RunAgentInConversation(...args: unknown[]) {
34
+ return hoisted.runAgentInConversation(...args);
35
+ }
36
+ CreateAgentReplyDetail() {
37
+ return Promise.resolve({ ID: 'reply-1', __mj_CreatedAt: new Date() }); // the server creates the reply row (A19)
31
38
  }
32
39
  },
33
40
  ArtifactToolManager: class {},
41
+ CanAgentOwnSubAgentConsults: vi.fn(() => false),
42
+ LoadOpenSubAgentConsults: vi.fn(async () => []),
34
43
  }));
35
44
 
36
45
  vi.mock('../realtimeWidget/widgetGuestElevation.js', () => ({
@@ -43,6 +52,7 @@ import type { AppContext, UserPayload } from '../types.js';
43
52
 
44
53
  const USER = { ID: 'user-1', Email: 'user@example.com' };
45
54
  const STOPPED_RUN = '16787b44-29f6-44a5-8bd4-fc1538e79275';
55
+ const CONSULT_RUN = 'c0ffee00-29f6-44a5-8bd4-fc1538e79275';
46
56
 
47
57
  type Fn = ReturnType<typeof vi.fn>;
48
58
 
@@ -52,7 +62,9 @@ interface ResolverSeams {
52
62
  loadConversationHistoryWithAttachments: Fn;
53
63
  executeAIAgent: Fn;
54
64
  executeAgentInBackground: Fn;
55
- findUserStoppedPredecessorRunId: Fn;
65
+ findChainablePredecessor: Fn;
66
+ validateAgent: Fn;
67
+ syncFeedbackRequestFromConversation: Fn;
56
68
  }
57
69
 
58
70
  /** Argument positions of lastRunId / autoPopulateLastRunPayload on the two dispatch seams. */
@@ -66,7 +78,7 @@ function makeResolver(): { resolver: RunAIAgentResolver; seams: ResolverSeams }
66
78
  seams.loadConversationHistoryWithAttachments = vi.fn().mockResolvedValue([]);
67
79
  seams.executeAIAgent = vi.fn().mockResolvedValue({ success: true, result: '{}' });
68
80
  seams.executeAgentInBackground = vi.fn();
69
- seams.findUserStoppedPredecessorRunId = vi.fn().mockResolvedValue(null);
81
+ seams.findChainablePredecessor = vi.fn().mockResolvedValue(null);
70
82
  return { resolver, seams };
71
83
  }
72
84
 
@@ -99,7 +111,7 @@ afterEach(() => {
99
111
  vi.restoreAllMocks();
100
112
  });
101
113
 
102
- describe('RunAIAgentFromConversationDetail — continuing from a user-stopped run', () => {
114
+ describe('RunAIAgentFromConversationDetail — continuing from a chainable predecessor run', () => {
103
115
  let resolver: RunAIAgentResolver;
104
116
  let seams: ResolverSeams;
105
117
 
@@ -108,19 +120,19 @@ describe('RunAIAgentFromConversationDetail — continuing from a user-stopped ru
108
120
  });
109
121
 
110
122
  it('chains the new run to the stopped predecessor and rolls its payload in when none was supplied', async () => {
111
- seams.findUserStoppedPredecessorRunId.mockResolvedValue(STOPPED_RUN);
123
+ seams.findChainablePredecessor.mockResolvedValue({ runId: STOPPED_RUN, reason: 'stopped' });
112
124
 
113
125
  const result = await runMutation(resolver, {});
114
126
 
115
127
  expect(result.success).toBe(true);
116
- expect(seams.findUserStoppedPredecessorRunId).toHaveBeenCalledWith('conv-1', 'agent-1', null, USER, expect.anything());
128
+ expect(seams.findChainablePredecessor).toHaveBeenCalledWith('conv-1', 'agent-1', null, USER, expect.anything());
117
129
  const args = seams.executeAIAgent.mock.calls[0];
118
130
  expect(args[SYNC_LAST_RUN]).toBe(STOPPED_RUN);
119
131
  expect(args[SYNC_AUTO]).toBe(true);
120
132
  });
121
133
 
122
134
  it('keeps the caller\'s payload as the start when one was supplied (chains, but does not roll the old one in)', async () => {
123
- seams.findUserStoppedPredecessorRunId.mockResolvedValue(STOPPED_RUN);
135
+ seams.findChainablePredecessor.mockResolvedValue({ runId: STOPPED_RUN, reason: 'stopped' });
124
136
 
125
137
  await runMutation(resolver, { payload: '{"fromArtifact":true}' });
126
138
 
@@ -130,7 +142,7 @@ describe('RunAIAgentFromConversationDetail — continuing from a user-stopped ru
130
142
  });
131
143
 
132
144
  it('hands the chain to a fire-and-forget run too', async () => {
133
- seams.findUserStoppedPredecessorRunId.mockResolvedValue(STOPPED_RUN);
145
+ seams.findChainablePredecessor.mockResolvedValue({ runId: STOPPED_RUN, reason: 'stopped' });
134
146
 
135
147
  await runMutation(resolver, { fireAndForget: true });
136
148
 
@@ -140,17 +152,83 @@ describe('RunAIAgentFromConversationDetail — continuing from a user-stopped ru
140
152
  expect(args[BG_AUTO]).toBe(true);
141
153
  });
142
154
 
143
- it('looks up the predecessor on the branch the reply row was created on', async () => {
155
+ it('chains an open-consult predecessor on both synchronous and fire-and-forget paths, setting autoPopulate only when no payload was supplied', async () => {
156
+ seams.findChainablePredecessor.mockResolvedValue({ runId: CONSULT_RUN, reason: 'open-consult' });
157
+
158
+ // 1. Synchronous without payload -> effectiveAutoPopulate = true
159
+ await runMutation(resolver, {});
160
+ const syncNoPayloadArgs = seams.executeAIAgent.mock.calls[0];
161
+ expect(syncNoPayloadArgs[SYNC_LAST_RUN]).toBe(CONSULT_RUN);
162
+ expect(syncNoPayloadArgs[SYNC_AUTO]).toBe(true);
163
+
164
+ // 2. Synchronous with payload -> effectiveAutoPopulate = undefined
165
+ await runMutation(resolver, { payload: '{"custom":1}' });
166
+ const syncWithPayloadArgs = seams.executeAIAgent.mock.calls[1];
167
+ expect(syncWithPayloadArgs[SYNC_LAST_RUN]).toBe(CONSULT_RUN);
168
+ expect(syncWithPayloadArgs[SYNC_AUTO]).toBeUndefined();
169
+
170
+ // 3. Fire-and-forget without payload -> effectiveAutoPopulate = true
171
+ await runMutation(resolver, { fireAndForget: true });
172
+ const bgNoPayloadArgs = seams.executeAgentInBackground.mock.calls[0];
173
+ expect(bgNoPayloadArgs[BG_LAST_RUN]).toBe(CONSULT_RUN);
174
+ expect(bgNoPayloadArgs[BG_AUTO]).toBe(true);
175
+
176
+ // 4. Fire-and-forget with payload -> effectiveAutoPopulate = undefined
177
+ await runMutation(resolver, { fireAndForget: true, payload: '{"custom":1}' });
178
+ const bgWithPayloadArgs = seams.executeAgentInBackground.mock.calls[1];
179
+ expect(bgWithPayloadArgs[BG_LAST_RUN]).toBe(CONSULT_RUN);
180
+ expect(bgWithPayloadArgs[BG_AUTO]).toBeUndefined();
181
+ });
182
+
183
+ it('threads a lastRunId chained from findChainablePredecessor into syncFeedbackRequestFromConversation when executeAIAgent runs', async () => {
184
+ const realResolver = new RunAIAgentResolver();
185
+ const realSeams = realResolver as unknown as ResolverSeams;
186
+ realSeams.CheckAPIKeyScopeAuthorization = vi.fn().mockResolvedValue(undefined);
187
+ realSeams.GetUserFromPayload = vi.fn().mockReturnValue(USER);
188
+ realSeams.loadConversationHistoryWithAttachments = vi.fn().mockResolvedValue([
189
+ { role: 'user', content: 'Proceed with option A' },
190
+ ]);
191
+ realSeams.findChainablePredecessor = vi.fn().mockResolvedValue({
192
+ runId: CONSULT_RUN,
193
+ reason: 'open-consult',
194
+ });
195
+ realSeams.validateAgent = vi.fn().mockResolvedValue({
196
+ ID: 'agent-1',
197
+ Name: 'Director',
198
+ Status: 'Active',
199
+ });
200
+ realSeams.syncFeedbackRequestFromConversation = vi.fn().mockResolvedValue(undefined);
201
+ hoisted.runAgentInConversation.mockResolvedValueOnce({
202
+ agentResult: {
203
+ success: true,
204
+ agentRun: { ID: 'new-run-99', ConversationDetailID: 'detail-1' },
205
+ },
206
+ conversationId: 'conv-1',
207
+ });
208
+
209
+ const res = await runMutation(realResolver, {});
210
+
211
+ expect(res.success).toBe(true);
212
+ expect(realSeams.syncFeedbackRequestFromConversation).toHaveBeenCalledWith(
213
+ CONSULT_RUN,
214
+ 'new-run-99',
215
+ 'Proceed with option A',
216
+ USER,
217
+ expect.anything()
218
+ );
219
+ });
220
+
221
+ it('looks up the predecessor on the branch the person\'s message was posted on', async () => {
144
222
  await runMutation(resolver, { branchId: 'B' });
145
- expect(seams.findUserStoppedPredecessorRunId).toHaveBeenCalledWith('conv-1', 'agent-1', 'B', expect.anything(), expect.anything());
223
+ expect(seams.findChainablePredecessor).toHaveBeenCalledWith('conv-1', 'agent-1', 'B', expect.anything(), expect.anything());
146
224
  await runMutation(resolver, {});
147
- expect(seams.findUserStoppedPredecessorRunId).toHaveBeenLastCalledWith('conv-1', 'agent-1', null, expect.anything(), expect.anything());
225
+ expect(seams.findChainablePredecessor).toHaveBeenLastCalledWith('conv-1', 'agent-1', null, expect.anything(), expect.anything());
148
226
  });
149
227
 
150
228
  it('a caller-supplied lastRunId wins and the lookup is skipped', async () => {
151
229
  await runMutation(resolver, { lastRunId: 'caller-run', autoPopulate: false });
152
230
 
153
- expect(seams.findUserStoppedPredecessorRunId).not.toHaveBeenCalled();
231
+ expect(seams.findChainablePredecessor).not.toHaveBeenCalled();
154
232
  const args = seams.executeAIAgent.mock.calls[0];
155
233
  expect(args[SYNC_LAST_RUN]).toBe('caller-run');
156
234
  expect(args[SYNC_AUTO]).toBe(false);
@@ -7,7 +7,7 @@ import 'reflect-metadata';
7
7
  * magic-link and widget sessions, so the resolver applies its own rule. These tests pin that it
8
8
  * refuses scope-limited sessions and callers who cannot read templates before it loads anything.
9
9
  */
10
- import { describe, it, expect, vi } from 'vitest';
10
+ import { describe, it, expect, vi, afterEach } from 'vitest';
11
11
 
12
12
  // As in RunDecisionResolver.test.ts: vitest's esbuild transform does not apply
13
13
  // `emitDecoratorMetadata`, so the decorators are no-ops and the resolver runs as a plain class.
@@ -29,7 +29,8 @@ vi.mock('type-graphql', () => {
29
29
  };
30
30
  });
31
31
 
32
- import { EntityInfo, UserInfo, UserRoleInfo } from '@memberjunction/core';
32
+ import { EntityInfo, RunView, UserInfo, UserRoleInfo } from '@memberjunction/core';
33
+ import { TemplateEngineServer } from '@memberjunction/templates';
33
34
  import { RunTemplateResolver } from '../resolvers/RunTemplateResolver.js';
34
35
  import type { AppContext, UserPayload } from '../types.js';
35
36
 
@@ -130,3 +131,35 @@ describe('RunTemplate authorization', () => {
130
131
  expect(provider.EntityObjectRequests).toEqual(['MJ: Templates']);
131
132
  });
132
133
  });
134
+
135
+ /** Metadata plus a template that loads, so the resolver reaches the render. */
136
+ class RenderingProvider {
137
+ public readonly Template = { Load: async () => true, IsSaved: true, Name: 'T' };
138
+ constructor(private readonly entities: EntityInfo[]) {}
139
+ public EntityByName(name: string): EntityInfo | undefined {
140
+ return this.entities.find((e) => e.Name.trim().toLowerCase() === name.trim().toLowerCase());
141
+ }
142
+ public async GetEntityObject(): Promise<object> {
143
+ return this.Template;
144
+ }
145
+ }
146
+
147
+ describe('RunTemplate render user', () => {
148
+ afterEach(() => vi.restoreAllMocks());
149
+
150
+ it('REGRESSION: renders as the calling user, not whoever last configured the engine', async () => {
151
+ const provider = new RenderingProvider(readableEverywhere());
152
+ const content = { ID: 'content-1', TemplateText: 'x' };
153
+ vi.spyOn(RunView, 'FromMetadataProvider').mockReturnValue({
154
+ RunView: async () => ({ Success: true, Results: [content] }),
155
+ } as unknown as RunView);
156
+ vi.spyOn(TemplateEngineServer.Instance, 'Config').mockResolvedValue(undefined);
157
+ const render = vi.spyOn(TemplateEngineServer.Instance, 'RenderTemplate').mockResolvedValue({ Success: true, Output: 'ok', Message: undefined });
158
+ const caller = makeUser([UI_ROLE_ID]);
159
+
160
+ const result = await new RunTemplateResolver().RunTemplate(TEMPLATE_ID, contextFor(caller, provider as unknown as FakeProvider));
161
+
162
+ expect(result).toMatchObject({ success: true, output: 'ok' });
163
+ expect(render.mock.calls[0][5]).toEqual({ ContextUser: caller });
164
+ });
165
+ });
@@ -60,4 +60,15 @@ describe('RunViewsWithCacheCheck resolver — param forwarding', () => {
60
60
  expect(forwarded.DataSource).toBe('Materialized');
61
61
  expect(forwarded.Aggregates).toEqual([{ expression: 'COUNT(*)', alias: 'total' }]);
62
62
  });
63
+
64
+ it('forwards AlternateBaseView (including empty-string override) and leaves it undefined when unset', async () => {
65
+ const withNamed = await forwardedParams({ EntityName: 'Customers', AlternateBaseView: 'Active Customers' });
66
+ expect(withNamed.AlternateBaseView).toBe('Active Customers');
67
+
68
+ const withEmptyOverride = await forwardedParams({ EntityName: 'Customers', AlternateBaseView: '' });
69
+ expect(withEmptyOverride.AlternateBaseView).toBe('');
70
+
71
+ const unset = await forwardedParams({ EntityName: 'Customers' });
72
+ expect(unset.AlternateBaseView).toBeUndefined();
73
+ });
63
74
  });
@@ -0,0 +1,119 @@
1
+ /**
2
+ * everything.txt C9: a custom column the source starts sending is CAPTURED automatically, but
3
+ * turning it into a real column "requires that the user accepts" it.
4
+ *
5
+ * A schema refresh is where an operator asks what changed on the source, so that is where the
6
+ * accumulated overflow columns should be offered. Offering is free; promoting is not. These pin
7
+ * the split, and the one thing that makes acceptance cheap enough to offer at all: the accepted
8
+ * columns ride the refresh's OWN migration instead of starting a second one, because two RSU
9
+ * restarts back-to-back for a single user action is its own incident class here.
10
+ */
11
+ import { describe, it, expect } from 'vitest';
12
+ import { readFileSync } from 'node:fs';
13
+ import { join } from 'node:path';
14
+
15
+ const SRC = readFileSync(join(__dirname, '..', 'resolvers', 'IntegrationDiscoveryResolver.ts'), 'utf-8');
16
+ const PROMOTER = readFileSync(join(__dirname, '..', 'integration', 'CustomColumnPromoter.ts'), 'utf-8');
17
+
18
+ function methodBody(name: string): string {
19
+ const i = SRC.indexOf(`async ${name}(`);
20
+ expect(i, `${name} not found`).toBeGreaterThan(-1);
21
+ const rest = SRC.slice(i);
22
+ const end = rest.search(/\n @(Query|Mutation)\(/);
23
+ return end === -1 ? rest : rest.slice(0, end);
24
+ }
25
+
26
+ describe('the refresh offers the overflow columns', () => {
27
+ const body = () => methodBody('IntegrationSchemaEvolution');
28
+
29
+ it('reports candidates on the output', () => {
30
+ expect(SRC).toMatch(/CustomColumnCandidates\?: CustomColumnCandidate\[\]/);
31
+ expect(body()).toMatch(/ListCandidates\(/);
32
+ });
33
+
34
+ it('reports them ALWAYS, not only when something was accepted', () => {
35
+ // The listing must not sit inside the acceptance branch — an operator cannot accept a column
36
+ // they were never shown.
37
+ const b = body();
38
+ const list = b.indexOf('ListCandidates(');
39
+ const acceptGate = b.indexOf('if (accepted.size > 0)');
40
+ expect(list).toBeGreaterThan(-1);
41
+ expect(acceptGate).toBeGreaterThan(-1);
42
+ expect(list, 'ListCandidates must run before the acceptance gate').toBeLessThan(acceptGate);
43
+ });
44
+
45
+ it('promotes NOTHING by default', () => {
46
+ expect(SRC).toMatch(/@Arg\("acceptCustomColumns"[\s\S]{0,200}?defaultValue: \[\]/);
47
+ });
48
+ });
49
+
50
+ describe('acceptance', () => {
51
+ const body = () => methodBody('IntegrationSchemaEvolution');
52
+
53
+ it('plans only the entities that own an accepted column', () => {
54
+ // Planning a whole entity because ONE of its columns was accepted would promote its other
55
+ // candidates too — exactly the un-asked-for materialisation the gate exists to prevent.
56
+ const b = body();
57
+ // It is not enough that the narrowed list is COMPUTED — it has to be what gets planned.
58
+ expect(b).toMatch(/PlanPromotion\(companyIntegrationID, entitiesWithAccepted\)/);
59
+ expect(b).toMatch(/filter\(c => accepted\.has\(c\.ColumnName\.toLowerCase\(\)\)\)/);
60
+ expect(b).not.toMatch(/PlanPromotion\(companyIntegrationID, mapped\)/);
61
+ });
62
+
63
+ it('folds the accepted migrations into the SAME batch as the refresh DDL', () => {
64
+ // The retrying variant, as every install path uses: it replays only while nothing was applied.
65
+ expect(body()).toMatch(/RunPipelineBatchWithRetry\(\[rsuInput, \.\.\.promotionInputs\]\)/);
66
+ });
67
+
68
+ it('still runs a batch when the refresh itself has no DDL', () => {
69
+ // Source shape unchanged but columns accepted: they still need their migration.
70
+ expect(body()).toMatch(/else if \(promotionInputs\.length > 0\)/);
71
+ });
72
+
73
+ it('drops accepted columns from the outstanding offer, so they cannot be accepted twice', () => {
74
+ const b = body();
75
+ // The offer returned must be the FILTERED list, not the raw one.
76
+ expect(b).toMatch(/const acceptedNames = new Set\(promotedColumns\.map\(c => c\.ColumnName\.toLowerCase\(\)\)\)/);
77
+ expect(b).toMatch(/const outstandingCandidates = customColumnCandidates\.filter\(c => !acceptedNames\.has\(c\.ColumnName\.toLowerCase\(\)\)\)/);
78
+ expect(b).toMatch(/CustomColumnCandidates: outstandingCandidates\.length > 0 \? outstandingCandidates : undefined/);
79
+ });
80
+
81
+ it('a candidates failure costs the offer, never the refresh', () => {
82
+ const b = body();
83
+ const i = b.indexOf('catch (candErr)');
84
+ expect(i).toBeGreaterThan(-1);
85
+ const handler = b.slice(i, i + 400);
86
+ expect(handler).not.toMatch(/return \{[\s\S]{0,120}Success: false/);
87
+ expect(handler).toMatch(/customColumnCandidates = \[\]/);
88
+ });
89
+ });
90
+
91
+ describe('PlanPromotion — the split that makes one batch possible', () => {
92
+ it('is public and runs no pipeline itself', () => {
93
+ expect(PROMOTER).toMatch(/public async PlanPromotion\(/);
94
+ const i = PROMOTER.indexOf('public async PlanPromotion(');
95
+ const end = PROMOTER.indexOf('/** Entry point: promote custom columns');
96
+ const body = PROMOTER.slice(i, end);
97
+ expect(body).not.toMatch(/RunPipelineBatch\(/);
98
+ });
99
+
100
+ it('still purges stale staged keys during planning, before any column is created', () => {
101
+ // This side effect belongs to planning: it is the only thing that ever cleans residue on rows
102
+ // a sync never rewrites, so moving it out of the plan would resurrect phantom candidates.
103
+ const i = PROMOTER.indexOf('public async PlanPromotion(');
104
+ const end = PROMOTER.indexOf('/** Entry point: promote custom columns');
105
+ expect(PROMOTER.slice(i, end)).toMatch(/purgeStaleOverflowKeys/);
106
+ });
107
+
108
+ it('carries the post-restart PendingWork on its first input, so it survives being appended', () => {
109
+ const i = PROMOTER.indexOf('public async PlanPromotion(');
110
+ const end = PROMOTER.indexOf('/** Entry point: promote custom columns');
111
+ const body = PROMOTER.slice(i, end);
112
+ expect(body).toMatch(/batchInputs\[0\]\.PendingWork/);
113
+ expect(body).toMatch(/WorkType: 'promote-columns'/);
114
+ });
115
+
116
+ it('PromoteForSync now goes through it, so the two paths cannot drift', () => {
117
+ expect(PROMOTER).toMatch(/const promotionPlan = await this\.PlanPromotion\(/);
118
+ });
119
+ });
@@ -14,6 +14,8 @@ function summary(over: Partial<SchemaRefreshSummaryLike> = {}): SchemaRefreshSum
14
14
  Succeeded: true,
15
15
  ObjectsCreated: 12,
16
16
  ObjectsUpdated: 3,
17
+ FieldsCreated: 69,
18
+ FieldsUpdated: 487,
17
19
  UnresolvedObjects: ['Widgets'],
18
20
  ...over,
19
21
  };
@@ -25,6 +27,8 @@ describe('BuildCreateConnectionMessage', () => {
25
27
  InProgress: true,
26
28
  ObjectsCreated: 0,
27
29
  ObjectsUpdated: 0,
30
+ FieldsCreated: 0,
31
+ FieldsUpdated: 0,
28
32
  UnresolvedObjects: [],
29
33
  }));
30
34
 
@@ -33,13 +37,14 @@ describe('BuildCreateConnectionMessage', () => {
33
37
  // The placeholder zeros must not surface as results.
34
38
  expect(msg).not.toMatch(/\d+ created/);
35
39
  expect(msg).not.toMatch(/\d+ updated/);
40
+ expect(msg).not.toMatch(/\d+ fields/);
36
41
  expect(msg).not.toMatch(/PK-unresolved/);
37
42
  });
38
43
 
39
44
  it('reports real counts once the refresh has completed inline', () => {
40
45
  const msg = BuildCreateConnectionMessage(true, summary());
41
46
 
42
- expect(msg).toContain('12 created');
47
+ expect(msg).toContain('12 objects created');
43
48
  expect(msg).toContain('3 updated');
44
49
  expect(msg).toContain('1 PK-unresolved');
45
50
  expect(msg).not.toMatch(/running/i);
@@ -74,6 +79,8 @@ describe('failed-refresh reporting', () => {
74
79
  FailureMessage: 'ConnectionTest failed: No HubSpot credentials found',
75
80
  ObjectsCreated: 0,
76
81
  ObjectsUpdated: 0,
82
+ FieldsCreated: 0,
83
+ FieldsUpdated: 0,
77
84
  UnresolvedObjects: [],
78
85
  });
79
86
 
@@ -99,10 +106,25 @@ describe('failed-refresh reporting', () => {
99
106
 
100
107
  it('still reports counts for a refresh that genuinely succeeded (update)', () => {
101
108
  const msg = BuildUpdateConnectionMessage(summary());
102
- expect(msg).toContain('12 created');
109
+ expect(msg).toContain('12 objects created');
103
110
  expect(msg).toContain('3 updated');
104
111
  expect(msg).not.toMatch(/FAILED/);
105
112
  });
113
+
114
+ it('names the FIELD counts, so a refresh that only changed fields does not read as a no-op', () => {
115
+ // A PRESUPPOSED connector creates no objects on any run. A live PheedLoop refresh that created
116
+ // 69 fields and updated 487 reported "0 created, 0 updated" — literally true of objects, and
117
+ // read by every operator as "the refresh did nothing".
118
+ const fieldsOnly = summary({ ObjectsCreated: 0, ObjectsUpdated: 0, UnresolvedObjects: [] });
119
+ for (const msg of [
120
+ BuildCreateConnectionMessage(true, fieldsOnly),
121
+ BuildUpdateConnectionMessage(fieldsOnly),
122
+ ]) {
123
+ expect(msg).toContain('69 fields created');
124
+ expect(msg).toContain('487 updated');
125
+ expect(msg).toContain('0 objects created');
126
+ }
127
+ });
106
128
  });
107
129
 
108
130
  describe('BuildDetachedRefreshMessage', () => {
@@ -0,0 +1,192 @@
1
+ /**
2
+ * A schema build materializes the CONNECTION's field rows, read for the build, not whatever the
3
+ * engine happens to hold in memory.
4
+ *
5
+ * A connection's per-object field rows are warmed on demand, and the only site that warms them is
6
+ * the sync loop — so an apply reading them from the engine found `[]` for every object and built a
7
+ * migration with no tables: "Reusing 364 persisted IOs", then `[tables: ]` in 4 ms, no error.
8
+ *
9
+ * These pin the loader the five build paths now share: when it reads, what it reads, that a failed
10
+ * read is loud, and that with no per-connection catalog in scope nothing changes. The wiring into
11
+ * the resolver is pinned at the bottom against the source, because the resolver needs a provider,
12
+ * a connector and an RSU pipeline to invoke.
13
+ */
14
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
15
+ import { readFileSync } from 'node:fs';
16
+ import { join } from 'node:path';
17
+ import { RunView, type UserInfo } from '@memberjunction/core';
18
+ import { IntegrationEngineBase } from '@memberjunction/integration-engine-base';
19
+ import { WithCatalogScope } from '@memberjunction/integration-engine';
20
+ import { LoadScopedFieldsForBuild, FieldsForBuild, SCOPED_FIELDS_CHUNK } from '../integration/ScopedFieldsForBuild.js';
21
+
22
+ const USER = { ID: 'user-1' } as UserInfo;
23
+ type RunViewParams = Parameters<RunView['RunView']>[0];
24
+ type RunViewResult = Awaited<ReturnType<RunView['RunView']>>;
25
+
26
+ /** A per-connection field row as the per-connection field view returns it. */
27
+ const storedField = (objectID: string, Name: string, Status = 'Active', related: string | null = null) => ({
28
+ ID: `${objectID}-${Name}`, Name, DisplayName: Name, Description: null, Type: 'nvarchar', Length: 100,
29
+ Precision: null, Scale: null, AllowsNull: true, DefaultValue: null, IsPrimaryKey: Name === 'id',
30
+ IsUniqueKey: false, IsReadOnly: false, IsRequired: false, Status,
31
+ CompanyIntegrationObjectID: objectID, RelatedCompanyIntegrationObjectID: related,
32
+ });
33
+
34
+ /** An engine whose per-connection FIELD cache is cold — the state an apply runs in. */
35
+ function installEngine(objectIDs: string[], hasCatalog = true) {
36
+ const getFields = vi.fn(() => []);
37
+ vi.spyOn(IntegrationEngineBase, 'Instance', 'get').mockReturnValue({
38
+ HasCompanyIntegrationCatalog: () => hasCatalog,
39
+ GetActiveIntegrationObjects: () => objectIDs.map(ID => ({ ID, Name: `obj-${ID}` })),
40
+ GetIntegrationObjectFields: getFields,
41
+ } as unknown as IntegrationEngineBase);
42
+ return getFields;
43
+ }
44
+
45
+ describe('LoadScopedFieldsForBuild', () => {
46
+ let runView: ReturnType<typeof vi.spyOn>;
47
+ beforeEach(() => {
48
+ vi.spyOn(console, 'log').mockImplementation(() => undefined);
49
+ runView = vi.spyOn(RunView.prototype, 'RunView');
50
+ });
51
+ afterEach(() => { vi.restoreAllMocks(); });
52
+
53
+ it('reads nothing outside a catalog scope — the build reads the shared catalog as before', async () => {
54
+ installEngine(['CIO-1']);
55
+ expect(await LoadScopedFieldsForBuild('INT-1', USER)).toBeNull();
56
+ expect(runView).not.toHaveBeenCalled();
57
+ });
58
+
59
+ it('reads nothing for a connection in scope that has no catalog of its own', async () => {
60
+ installEngine(['CIO-1'], false);
61
+ const loaded = await WithCatalogScope('CI-1', () => LoadScopedFieldsForBuild('INT-1', USER));
62
+ expect(loaded).toBeNull();
63
+ expect(runView).not.toHaveBeenCalled();
64
+ });
65
+
66
+ it('reads the connection\'s field rows from the database, bypassing the cache and the row cap', async () => {
67
+ installEngine(['CIO-1', 'CIO-2']);
68
+ runView.mockResolvedValue({
69
+ Success: true,
70
+ Results: [storedField('CIO-1', 'id'), storedField('CIO-1', 'parent', 'Active', 'CIO-2'), storedField('CIO-2', 'id')],
71
+ } as unknown as RunViewResult);
72
+
73
+ const loaded = await WithCatalogScope('CI-1', () => LoadScopedFieldsForBuild('INT-1', USER));
74
+
75
+ const params = runView.mock.calls[0][0] as RunViewParams;
76
+ expect(params.EntityName).toBe('MJ: Company Integration Object Fields');
77
+ expect(params.ExtraFilter).toBe("CompanyIntegrationObjectID IN ('CIO-1','CIO-2')");
78
+ expect(params.ResultType).toBe('simple');
79
+ expect(params.BypassCache).toBe(true);
80
+ expect(params.IgnoreMaxRows).toBe(true);
81
+ // Keyed by lower-cased object id, and carrying the legacy names the build reads.
82
+ const rows = loaded?.get('cio-1') ?? [];
83
+ expect(rows.map(r => r.Name)).toEqual(['id', 'parent']);
84
+ expect(rows[1].IntegrationObjectID).toBe('CIO-1');
85
+ expect(rows[1].RelatedIntegrationObjectID).toBe('CIO-2');
86
+ expect(loaded?.get('cio-2')?.map(r => r.Name)).toEqual(['id']);
87
+ });
88
+
89
+ it(`reads ${SCOPED_FIELDS_CHUNK} objects per query`, async () => {
90
+ installEngine(Array.from({ length: 2 * SCOPED_FIELDS_CHUNK + 50 }, (_, i) => `CIO-${i}`));
91
+ runView.mockResolvedValue({ Success: true, Results: [] } as unknown as RunViewResult);
92
+
93
+ await WithCatalogScope('CI-1', () => LoadScopedFieldsForBuild('INT-1', USER));
94
+
95
+ expect(runView).toHaveBeenCalledTimes(3);
96
+ });
97
+
98
+ it('THROWS on a failed read rather than building a schema from an empty field list', async () => {
99
+ installEngine(['CIO-1']);
100
+ runView.mockResolvedValue({ Success: false, ErrorMessage: 'timeout', Results: [] } as unknown as RunViewResult);
101
+
102
+ await expect(WithCatalogScope('CI-1', () => LoadScopedFieldsForBuild('INT-1', USER)))
103
+ .rejects.toThrow(/PER_CONNECTION_FIELDS_UNREADABLE/);
104
+ });
105
+ });
106
+
107
+ describe('FieldsForBuild', () => {
108
+ afterEach(() => { vi.restoreAllMocks(); });
109
+
110
+ it('with loaded rows, answers from them and never asks the (cold) engine', async () => {
111
+ const getFields = installEngine(['CIO-1']);
112
+ vi.spyOn(console, 'log').mockImplementation(() => undefined);
113
+ vi.spyOn(RunView.prototype, 'RunView').mockResolvedValue(
114
+ { Success: true, Results: [storedField('CIO-1', 'id'), storedField('CIO-1', 'name')] } as unknown as RunViewResult,
115
+ );
116
+ const loaded = await WithCatalogScope('CI-1', () => LoadScopedFieldsForBuild('INT-1', USER));
117
+
118
+ expect(FieldsForBuild('CIO-1', loaded, IntegrationEngineBase.Instance).map(f => f.Name)).toEqual(['id', 'name']);
119
+ expect(getFields).not.toHaveBeenCalled();
120
+ });
121
+
122
+ it('without loaded rows, reads the engine exactly as before', () => {
123
+ const getFields = installEngine(['IO-1']);
124
+ FieldsForBuild('IO-1', null, IntegrationEngineBase.Instance);
125
+ expect(getFields).toHaveBeenCalledWith('IO-1');
126
+ });
127
+ });
128
+
129
+ describe('every schema build reads its fields through the loader', () => {
130
+ const SRC = readFileSync(join(__dirname, '..', 'resolvers', 'IntegrationDiscoveryResolver.ts'), 'utf-8');
131
+
132
+ it('all five build paths pass the loaded rows to the rebuild', () => {
133
+ const calls = SRC.match(/this\.buildSourceSchemaFromPersistedRows\([\s\S]*?\);/g) ?? [];
134
+ // ApplySchema, ApplyAll, buildSchemaForConnector, ApplyAllBatch, SchemaEvolution.
135
+ expect(calls.length).toBe(5);
136
+ const inline = /await LoadScopedFieldsForBuild\(companyIntegration\.IntegrationID, user\)/;
137
+ // SchemaEvolution and buildSchemaForConnector load once into `scopedFields`: evolution's
138
+ // field-map reconcile reads the same rows, and buildSchemaForConnector's prefetched (batch)
139
+ // branch needs them for its inactive-row warnings without running the rebuild at all.
140
+ const hoisted = /scopedFields,?\s*\)/;
141
+ for (const call of calls) {
142
+ expect(inline.test(call) || hoisted.test(call)).toBe(true);
143
+ }
144
+ const hoistedCalls = calls.filter(c => !inline.test(c));
145
+ expect(hoistedCalls).toHaveLength(2);
146
+ expect(SRC.match(/const scopedFields = await LoadScopedFieldsForBuild\(companyIntegration\.IntegrationID, user\);/g)).toHaveLength(2);
147
+ });
148
+
149
+ it('the rebuild reads fields only through FieldsForBuild, never the engine directly', () => {
150
+ const start = SRC.indexOf('private buildSourceSchemaFromPersistedRows(');
151
+ expect(start).toBeGreaterThan(-1);
152
+ const body = SRC.slice(start, SRC.indexOf('private async runSchemaRefreshPipeline(', start));
153
+ expect(body).toMatch(/FieldsForBuild\(io\.ID, scopedFields, engine\)/);
154
+ expect(body).not.toMatch(/engine\.GetIntegrationObjectFields\(/);
155
+ });
156
+ });
157
+
158
+ /**
159
+ * A refresh's field-map reconcile and the dependency map read the same cold per-connection fields.
160
+ * Reconcile is the destructive one: an empty field list there DISABLES every Active field map on the
161
+ * object, on a refresh that reports success. The dependency map only needs FK edges, which the scope
162
+ * carries without any field row being warm.
163
+ */
164
+ describe('a refresh reads the connection\'s fields, never a cold engine cache', () => {
165
+ const SRC = readFileSync(join(__dirname, '..', 'resolvers', 'IntegrationDiscoveryResolver.ts'), 'utf-8');
166
+ const body = (start: string, end: string) => {
167
+ const i = SRC.indexOf(start);
168
+ expect(i).toBeGreaterThan(-1);
169
+ return SRC.slice(i, SRC.indexOf(end, i + start.length));
170
+ };
171
+
172
+ it('the field-map reconcile reads through FieldsForBuild with the loaded rows', () => {
173
+ const reconcile = body('private async reconcileFieldMapsForEntityMap(', '\n }\n');
174
+ expect(reconcile).toMatch(/FieldsForBuild\(integrationObjectID, scopedFields, IntegrationEngineBase\.Instance\)/);
175
+ expect(reconcile).not.toMatch(/\.GetIntegrationObjectFields\(/);
176
+ expect(SRC).toMatch(/this\.reconcileFieldMapsForEntityMap\(em, io\.ID, user, md, autoEnableNewColumns, scopedFields\)/);
177
+ });
178
+
179
+ it('the re-key check reads the catalog key through FieldsForBuild with the loaded rows', () => {
180
+ expect(SRC).toMatch(/CatalogIdentityKey\(\s*FieldsForBuild\(io\.ID, scopedFields, IntegrationEngineBase\.Instance\)\s*\)/);
181
+ });
182
+
183
+ it('nothing in the resolver reads field rows from the engine directly', () => {
184
+ expect(SRC).not.toMatch(/\.GetIntegrationObjectFields\(/);
185
+ });
186
+
187
+ it('the dependency map reads FK parents from the edge set, not from field rows', () => {
188
+ const deps = body('private computeObjectDependencyNames(', '\n }\n');
189
+ expect(deps).toMatch(/engine\.GetRelatedIntegrationObjectIDs\(io\.ID\)/);
190
+ expect(deps).not.toMatch(/GetIntegrationObjectFields\(/);
191
+ });
192
+ });