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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (664) hide show
  1. package/README.md +96 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
  5. package/dist/agentSessions/BridgeHostInstance.js +14 -4
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
  7. package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
  8. package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
  9. package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
  10. package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
  11. package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
  12. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  13. package/dist/agentSessions/SessionJanitor.d.ts +34 -11
  14. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  15. package/dist/agentSessions/SessionJanitor.js +88 -44
  16. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  17. package/dist/agentSessions/SessionManager.d.ts +29 -9
  18. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  19. package/dist/agentSessions/SessionManager.js +62 -16
  20. package/dist/agentSessions/SessionManager.js.map +1 -1
  21. package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
  22. package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
  23. package/dist/agentSessions/conversationBrowsers.js +118 -0
  24. package/dist/agentSessions/conversationBrowsers.js.map +1 -0
  25. package/dist/agentSessions/sessionDeadline.d.ts +43 -0
  26. package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
  27. package/dist/agentSessions/sessionDeadline.js +68 -0
  28. package/dist/agentSessions/sessionDeadline.js.map +1 -0
  29. package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
  30. package/dist/auth/APIKeyScopeAuth.js +5 -4
  31. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  32. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  33. package/dist/auth/AuthProviderCatalogRouter.js +2 -0
  34. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  35. package/dist/auth/index.d.ts.map +1 -1
  36. package/dist/auth/index.js +51 -10
  37. package/dist/auth/index.js.map +1 -1
  38. package/dist/auth/initializeProviders.d.ts +10 -0
  39. package/dist/auth/initializeProviders.d.ts.map +1 -1
  40. package/dist/auth/initializeProviders.js +37 -1
  41. package/dist/auth/initializeProviders.js.map +1 -1
  42. package/dist/auth/localDevAuth.d.ts +79 -0
  43. package/dist/auth/localDevAuth.d.ts.map +1 -0
  44. package/dist/auth/localDevAuth.js +439 -0
  45. package/dist/auth/localDevAuth.js.map +1 -0
  46. package/dist/auth/loginEmailResolution.d.ts +41 -0
  47. package/dist/auth/loginEmailResolution.d.ts.map +1 -0
  48. package/dist/auth/loginEmailResolution.js +47 -0
  49. package/dist/auth/loginEmailResolution.js.map +1 -0
  50. package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
  51. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  52. package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
  53. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  54. package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
  55. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  56. package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
  57. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  58. package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
  59. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  60. package/dist/auth/magicLink/MagicLinkService.js +221 -9
  61. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  62. package/dist/auth/magicLink/index.d.ts +1 -1
  63. package/dist/auth/magicLink/index.d.ts.map +1 -1
  64. package/dist/auth/magicLink/index.js +1 -1
  65. package/dist/auth/magicLink/index.js.map +1 -1
  66. package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
  67. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  68. package/dist/auth/magicLink/redeemLanding.js +7 -4
  69. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  70. package/dist/auth/magicLink/types.d.ts +39 -3
  71. package/dist/auth/magicLink/types.d.ts.map +1 -1
  72. package/dist/auth/magicLink/types.js +0 -4
  73. package/dist/auth/magicLink/types.js.map +1 -1
  74. package/dist/auth/newUsers.d.ts.map +1 -1
  75. package/dist/auth/newUsers.js +1 -0
  76. package/dist/auth/newUsers.js.map +1 -1
  77. package/dist/auth/sessionUserClone.d.ts +1 -1
  78. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  79. package/dist/auth/sessionUserClone.js +3 -2
  80. package/dist/auth/sessionUserClone.js.map +1 -1
  81. package/dist/backgroundSweepConfigUnits.d.ts +231 -0
  82. package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
  83. package/dist/backgroundSweepConfigUnits.js +180 -0
  84. package/dist/backgroundSweepConfigUnits.js.map +1 -0
  85. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  86. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  87. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  88. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  89. package/dist/broadcast/index.d.ts +6 -0
  90. package/dist/broadcast/index.d.ts.map +1 -0
  91. package/dist/broadcast/index.js +6 -0
  92. package/dist/broadcast/index.js.map +1 -0
  93. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  94. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  95. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  96. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  97. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  98. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  99. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  100. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  101. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  102. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  103. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  104. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  105. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  106. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  107. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  108. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  109. package/dist/cache.d.ts +3 -2
  110. package/dist/cache.d.ts.map +1 -1
  111. package/dist/cache.js.map +1 -1
  112. package/dist/config.d.ts +1402 -8
  113. package/dist/config.d.ts.map +1 -1
  114. package/dist/config.js +120 -0
  115. package/dist/config.js.map +1 -1
  116. package/dist/context.d.ts +5 -1
  117. package/dist/context.d.ts.map +1 -1
  118. package/dist/context.js +64 -12
  119. package/dist/context.js.map +1 -1
  120. package/dist/coreRoutes.d.ts +3 -1
  121. package/dist/coreRoutes.d.ts.map +1 -1
  122. package/dist/coreRoutes.js +20 -4
  123. package/dist/coreRoutes.js.map +1 -1
  124. package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
  125. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  126. package/dist/generated/graphql-schemas/__mj.js +4167 -62
  127. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  128. package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
  129. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  130. package/dist/generic/CacheInvalidationResolver.js +154 -79
  131. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  132. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
  133. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  134. package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
  135. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  136. package/dist/generic/PubSubManager.d.ts +10 -0
  137. package/dist/generic/PubSubManager.d.ts.map +1 -1
  138. package/dist/generic/PubSubManager.js +44 -1
  139. package/dist/generic/PubSubManager.js.map +1 -1
  140. package/dist/generic/PushStatusResolver.d.ts +39 -6
  141. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  142. package/dist/generic/PushStatusResolver.js +93 -11
  143. package/dist/generic/PushStatusResolver.js.map +1 -1
  144. package/dist/generic/ResolverBase.d.ts +114 -29
  145. package/dist/generic/ResolverBase.d.ts.map +1 -1
  146. package/dist/generic/ResolverBase.js +509 -220
  147. package/dist/generic/ResolverBase.js.map +1 -1
  148. package/dist/generic/RunViewResolver.d.ts +15 -3
  149. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  150. package/dist/generic/RunViewResolver.js +126 -20
  151. package/dist/generic/RunViewResolver.js.map +1 -1
  152. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  153. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  154. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  155. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  156. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  157. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  158. package/dist/generic/fieldSecurityTransport.js +30 -0
  159. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  160. package/dist/index.d.ts +4 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +262 -84
  163. package/dist/index.js.map +1 -1
  164. package/dist/integration/ConnectionPause.d.ts +121 -0
  165. package/dist/integration/ConnectionPause.d.ts.map +1 -0
  166. package/dist/integration/ConnectionPause.js +183 -0
  167. package/dist/integration/ConnectionPause.js.map +1 -0
  168. package/dist/integration/CustomColumnPromoter.d.ts +72 -6
  169. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  170. package/dist/integration/CustomColumnPromoter.js +93 -47
  171. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  172. package/dist/integration/EntityMapLifecycle.d.ts +78 -4
  173. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  174. package/dist/integration/EntityMapLifecycle.js +199 -5
  175. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  176. package/dist/integration/InactiveRowWarnings.d.ts +31 -0
  177. package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
  178. package/dist/integration/InactiveRowWarnings.js +29 -0
  179. package/dist/integration/InactiveRowWarnings.js.map +1 -1
  180. package/dist/integration/ObjectNamesByID.d.ts +28 -0
  181. package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
  182. package/dist/integration/ObjectNamesByID.js +87 -0
  183. package/dist/integration/ObjectNamesByID.js.map +1 -0
  184. package/dist/integration/PostRestartIntrospect.d.ts +26 -0
  185. package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
  186. package/dist/integration/PostRestartIntrospect.js +27 -0
  187. package/dist/integration/PostRestartIntrospect.js.map +1 -0
  188. package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
  189. package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
  190. package/dist/integration/RSUPostRestartProgress.js +323 -0
  191. package/dist/integration/RSUPostRestartProgress.js.map +1 -0
  192. package/dist/integration/RSUProgressBridge.d.ts +41 -2
  193. package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
  194. package/dist/integration/RSUProgressBridge.js +84 -1
  195. package/dist/integration/RSUProgressBridge.js.map +1 -1
  196. package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
  197. package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
  198. package/dist/integration/RunArtifactAuthorization.js +45 -0
  199. package/dist/integration/RunArtifactAuthorization.js.map +1 -0
  200. package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
  201. package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
  202. package/dist/integration/SchemaRefreshLaunch.js +3 -2
  203. package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
  204. package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
  205. package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
  206. package/dist/integration/ScopedFieldsForBuild.js +91 -0
  207. package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
  208. package/dist/integration/TargetConfigGuard.d.ts +40 -0
  209. package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
  210. package/dist/integration/TargetConfigGuard.js +40 -0
  211. package/dist/integration/TargetConfigGuard.js.map +1 -0
  212. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  213. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  214. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  215. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  216. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  217. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  218. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  219. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +8 -6
  220. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
  221. package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
  222. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
  223. package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
  224. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  225. package/dist/realtimeSessions/sessionAccess.js +147 -22
  226. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  227. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  228. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  229. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  230. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  231. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  232. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  233. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  234. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  235. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  236. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  237. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  238. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  239. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  240. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  241. package/dist/realtimeWidget/WidgetSessionService.js +203 -19
  242. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  243. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  244. package/dist/realtimeWidget/host-identity.js +1 -1
  245. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  246. package/dist/realtimeWidget/visitorIdentity.js +1 -0
  247. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  248. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  249. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  250. package/dist/realtimeWidget/widgetCore.js +21 -8
  251. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  252. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  253. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  254. package/dist/realtimeWidget/widgetGuestElevation.js +3 -1
  255. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  256. package/dist/requestOrigin.d.ts +22 -0
  257. package/dist/requestOrigin.d.ts.map +1 -0
  258. package/dist/requestOrigin.js +60 -0
  259. package/dist/requestOrigin.js.map +1 -0
  260. package/dist/resolvers/ActionResolver.d.ts +19 -1
  261. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  262. package/dist/resolvers/ActionResolver.js +63 -12
  263. package/dist/resolvers/ActionResolver.js.map +1 -1
  264. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  265. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  266. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  267. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  268. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  269. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  270. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  271. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  272. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  273. package/dist/resolvers/AgentSessionResolver.js +44 -17
  274. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  275. package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
  276. package/dist/resolvers/AutotagPipelineResolver.js +2 -1
  277. package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
  278. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  279. package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
  280. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  281. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  282. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  283. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  284. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  285. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +6 -0
  286. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
  287. package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
  288. package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
  289. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
  290. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  291. package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
  292. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  293. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  294. package/dist/resolvers/FileCategoryResolver.js +1 -0
  295. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  296. package/dist/resolvers/FileResolver.d.ts +5 -0
  297. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  298. package/dist/resolvers/FileResolver.js +13 -4
  299. package/dist/resolvers/FileResolver.js.map +1 -1
  300. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  301. package/dist/resolvers/GetDataResolver.js +34 -13
  302. package/dist/resolvers/GetDataResolver.js.map +1 -1
  303. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
  304. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  305. package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
  306. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  307. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  308. package/dist/resolvers/MCPResolver.js +13 -2
  309. package/dist/resolvers/MCPResolver.js.map +1 -1
  310. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  311. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  312. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  313. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  314. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  315. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  316. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  317. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  318. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  319. package/dist/resolvers/QueryResolver.js +20 -6
  320. package/dist/resolvers/QueryResolver.js.map +1 -1
  321. package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
  322. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  323. package/dist/resolvers/QuerySystemUserResolver.js +184 -88
  324. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  325. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  326. package/dist/resolvers/RSUResolver.js +12 -0
  327. package/dist/resolvers/RSUResolver.js.map +1 -1
  328. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  329. package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
  330. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  331. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
  332. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  333. package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
  334. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  335. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
  336. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  337. package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
  338. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  339. package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
  340. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  341. package/dist/resolvers/RunAIAgentResolver.js +388 -125
  342. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  343. package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
  344. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  345. package/dist/resolvers/RunAIPromptResolver.js +19 -18
  346. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  347. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  348. package/dist/resolvers/RunTemplateResolver.js +7 -5
  349. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  350. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  351. package/dist/resolvers/RunTestResolver.js +3 -1
  352. package/dist/resolvers/RunTestResolver.js.map +1 -1
  353. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  354. package/dist/resolvers/SyncDataResolver.js +4 -0
  355. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  356. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  357. package/dist/resolvers/TestQuerySQLResolver.js +1 -0
  358. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  359. package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
  360. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  361. package/dist/resolvers/TransactionGroupResolver.js +60 -15
  362. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  363. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  364. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  365. package/dist/resolvers/UserViewResolver.js +2 -1
  366. package/dist/resolvers/UserViewResolver.js.map +1 -1
  367. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  368. package/dist/resolvers/meetingRecordingRegistration.js +2 -0
  369. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  370. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  371. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  372. package/dist/rest/EntityCRUDHandler.js +19 -5
  373. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  374. package/dist/rest/MediaAccessKeys.d.ts.map +1 -1
  375. package/dist/rest/MediaAccessKeys.js +6 -2
  376. package/dist/rest/MediaAccessKeys.js.map +1 -1
  377. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  378. package/dist/rest/OAuthCallbackHandler.js +11 -5
  379. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  380. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  381. package/dist/rest/RESTEndpointHandler.js +8 -5
  382. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  383. package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
  384. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
  385. package/dist/rest/RealtimeRecordingHandler.js +6 -8
  386. package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
  387. package/dist/rest/ViewOperationsHandler.d.ts +6 -0
  388. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  389. package/dist/rest/ViewOperationsHandler.js +24 -6
  390. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  391. package/dist/rest/setupRESTEndpoints.d.ts +3 -1
  392. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  393. package/dist/rest/setupRESTEndpoints.js +11 -2
  394. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  395. package/dist/serverRoleConfigUnits.d.ts +29 -0
  396. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  397. package/dist/serverRoleConfigUnits.js +33 -0
  398. package/dist/serverRoleConfigUnits.js.map +1 -0
  399. package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
  400. package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
  401. package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
  402. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  403. package/dist/services/TaskGraphActionRunner.js +2 -26
  404. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  405. package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
  406. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  407. package/dist/services/TaskGraphAgentRunner.js +38 -0
  408. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  409. package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
  410. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  411. package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
  412. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  413. package/dist/services/WorkQueueHostService.d.ts +2 -1
  414. package/dist/services/WorkQueueHostService.d.ts.map +1 -1
  415. package/dist/services/WorkQueueHostService.js +19 -4
  416. package/dist/services/WorkQueueHostService.js.map +1 -1
  417. package/dist/services/workQueueConfig.d.ts +2 -2
  418. package/dist/services/workQueueConfig.js +5 -5
  419. package/dist/services/workQueueConfig.js.map +1 -1
  420. package/dist/sharedCache.js +1 -1
  421. package/dist/sharedCache.js.map +1 -1
  422. package/dist/types.d.ts +40 -1
  423. package/dist/types.d.ts.map +1 -1
  424. package/dist/types.js.map +1 -1
  425. package/package.json +98 -98
  426. package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
  427. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  428. package/src/__tests__/ActiveOperations.test.ts +68 -0
  429. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  430. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  431. package/src/__tests__/AgentSessionResolver.ownership.test.ts +150 -0
  432. package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
  433. package/src/__tests__/BatchApplyParity.test.ts +109 -0
  434. package/src/__tests__/BridgeHostInstance.test.ts +42 -0
  435. package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
  436. package/src/__tests__/ConnectionPause.test.ts +192 -0
  437. package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
  438. package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
  439. package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
  440. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  441. package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
  442. package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
  443. package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
  444. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  445. package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
  446. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  447. package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
  448. package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
  449. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  450. package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
  451. package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
  452. package/src/__tests__/MagicLinkKeys.test.ts +102 -0
  453. package/src/__tests__/MediaAccessKeys.test.ts +57 -10
  454. package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
  455. package/src/__tests__/ObjectNamesByID.test.ts +176 -0
  456. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  457. package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
  458. package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
  459. package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
  460. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  461. package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
  462. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  463. package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
  464. package/src/__tests__/RSUProgressBridge.test.ts +188 -5
  465. package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
  466. package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
  467. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  468. package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
  469. package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
  470. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
  471. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
  472. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
  473. package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
  474. package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
  475. package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
  476. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  477. package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
  478. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
  479. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -1
  480. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  481. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  482. package/src/__tests__/RunAIAgentResolver.branch.test.ts +72 -13
  483. package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
  484. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  485. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  486. package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
  487. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
  488. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
  489. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  490. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
  491. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  492. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  493. package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
  494. package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
  495. package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
  496. package/src/__tests__/SessionJanitor.test.ts +195 -4
  497. package/src/__tests__/SessionManager.test.ts +164 -0
  498. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
  499. package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
  500. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
  501. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  502. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  503. package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
  504. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  505. package/src/__tests__/WorkQueueHostService.test.ts +25 -7
  506. package/src/__tests__/apiRootBoot.test.ts +1 -1
  507. package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
  508. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  509. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  510. package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
  511. package/src/__tests__/contextRequestOrigin.test.ts +105 -0
  512. package/src/__tests__/conversationBrowsers.test.ts +62 -0
  513. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  514. package/src/__tests__/globalCors.test.ts +3 -3
  515. package/src/__tests__/localDevAuth.test.ts +196 -0
  516. package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
  517. package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
  518. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  519. package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
  520. package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
  521. package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
  522. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  523. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  524. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  525. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +224 -7
  526. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  527. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  528. package/src/__tests__/requestOrigin.test.ts +104 -0
  529. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  530. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  531. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  532. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  533. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  534. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  535. package/src/__tests__/runViewProperties.test.ts +114 -0
  536. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  537. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  538. package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
  539. package/src/__tests__/sessionDeadline.test.ts +51 -0
  540. package/src/__tests__/sessionUserClone.test.ts +5 -1
  541. package/src/__tests__/sharedCache.test.ts +11 -0
  542. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  543. package/src/__tests__/unifiedAuth.test.ts +101 -1
  544. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  545. package/src/agentSessions/BridgeHostInstance.ts +20 -5
  546. package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
  547. package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
  548. package/src/agentSessions/SessionJanitor.ts +95 -45
  549. package/src/agentSessions/SessionManager.ts +73 -20
  550. package/src/agentSessions/conversationBrowsers.ts +143 -0
  551. package/src/agentSessions/sessionDeadline.ts +81 -0
  552. package/src/auth/APIKeyScopeAuth.ts +5 -4
  553. package/src/auth/AuthProviderCatalogRouter.ts +3 -0
  554. package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
  555. package/src/auth/index.ts +56 -12
  556. package/src/auth/initializeProviders.ts +43 -1
  557. package/src/auth/localDevAuth.ts +528 -0
  558. package/src/auth/loginEmailResolution.ts +67 -0
  559. package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
  560. package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
  561. package/src/auth/magicLink/MagicLinkService.ts +250 -10
  562. package/src/auth/magicLink/index.ts +1 -1
  563. package/src/auth/magicLink/redeemLanding.ts +7 -4
  564. package/src/auth/magicLink/types.ts +38 -3
  565. package/src/auth/newUsers.ts +1 -0
  566. package/src/auth/sessionUserClone.ts +3 -2
  567. package/src/backgroundSweepConfigUnits.ts +213 -0
  568. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  569. package/src/broadcast/index.ts +5 -0
  570. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  571. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  572. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  573. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  574. package/src/cache.ts +2 -1
  575. package/src/config.ts +138 -0
  576. package/src/context.ts +71 -14
  577. package/src/coreRoutes.ts +29 -7
  578. package/src/generated/graphql-schemas/__mj.ts +4145 -1193
  579. package/src/generic/CacheInvalidationResolver.ts +135 -78
  580. package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
  581. package/src/generic/PubSubManager.ts +54 -1
  582. package/src/generic/PushStatusResolver.ts +108 -11
  583. package/src/generic/ResolverBase.ts +635 -234
  584. package/src/generic/RunViewResolver.ts +176 -64
  585. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  586. package/src/generic/fieldSecurityTransport.ts +62 -0
  587. package/src/index.ts +310 -85
  588. package/src/integration/ConnectionPause.ts +222 -0
  589. package/src/integration/CustomColumnPromoter.ts +129 -54
  590. package/src/integration/EntityMapLifecycle.ts +229 -6
  591. package/src/integration/InactiveRowWarnings.ts +50 -0
  592. package/src/integration/ObjectNamesByID.ts +97 -0
  593. package/src/integration/PostRestartIntrospect.ts +49 -0
  594. package/src/integration/RSUPostRestartProgress.ts +359 -0
  595. package/src/integration/RSUProgressBridge.ts +85 -2
  596. package/src/integration/RunArtifactAuthorization.ts +65 -0
  597. package/src/integration/SchemaRefreshLaunch.ts +12 -2
  598. package/src/integration/ScopedFieldsForBuild.ts +113 -0
  599. package/src/integration/TargetConfigGuard.ts +71 -0
  600. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  601. package/src/realtimeSessions/README.md +7 -3
  602. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  603. package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
  604. package/src/realtimeSessions/sessionAccess.ts +211 -25
  605. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  606. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  607. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  608. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  609. package/src/realtimeWidget/WidgetSessionService.ts +254 -17
  610. package/src/realtimeWidget/host-identity.ts +1 -1
  611. package/src/realtimeWidget/visitorIdentity.ts +1 -0
  612. package/src/realtimeWidget/widgetCore.ts +34 -9
  613. package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
  614. package/src/requestOrigin.ts +64 -0
  615. package/src/resolvers/ActionResolver.ts +78 -15
  616. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  617. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  618. package/src/resolvers/AgentSessionResolver.ts +50 -18
  619. package/src/resolvers/AutotagPipelineResolver.ts +2 -1
  620. package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
  621. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  622. package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
  623. package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
  624. package/src/resolvers/FileCategoryResolver.ts +1 -0
  625. package/src/resolvers/FileResolver.ts +14 -4
  626. package/src/resolvers/GetDataResolver.ts +35 -13
  627. package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
  628. package/src/resolvers/MCPResolver.ts +15 -2
  629. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  630. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  631. package/src/resolvers/QueryResolver.ts +20 -6
  632. package/src/resolvers/QuerySystemUserResolver.ts +207 -99
  633. package/src/resolvers/RSUResolver.ts +12 -0
  634. package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
  635. package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
  636. package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
  637. package/src/resolvers/RunAIAgentResolver.ts +518 -163
  638. package/src/resolvers/RunAIPromptResolver.ts +18 -18
  639. package/src/resolvers/RunTemplateResolver.ts +9 -5
  640. package/src/resolvers/RunTestResolver.ts +3 -1
  641. package/src/resolvers/SyncDataResolver.ts +4 -0
  642. package/src/resolvers/TestQuerySQLResolver.ts +1 -0
  643. package/src/resolvers/TransactionGroupResolver.ts +66 -15
  644. package/src/resolvers/UserViewResolver.ts +2 -1
  645. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
  646. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  647. package/src/resolvers/meetingRecordingRegistration.ts +2 -0
  648. package/src/rest/EntityCRUDHandler.ts +22 -5
  649. package/src/rest/MediaAccessKeys.ts +6 -2
  650. package/src/rest/OAuthCallbackHandler.ts +13 -5
  651. package/src/rest/RESTEndpointHandler.ts +8 -5
  652. package/src/rest/RealtimeRecordingHandler.ts +9 -10
  653. package/src/rest/ViewOperationsHandler.ts +26 -7
  654. package/src/rest/setupRESTEndpoints.ts +11 -2
  655. package/src/serverRoleConfigUnits.ts +48 -0
  656. package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
  657. package/src/services/TaskGraphActionRunner.ts +2 -23
  658. package/src/services/TaskGraphAgentRunner.ts +43 -0
  659. package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
  660. package/src/services/WorkQueueHostService.ts +26 -4
  661. package/src/services/workQueueConfig.ts +5 -5
  662. package/src/sharedCache.ts +1 -1
  663. package/src/types.ts +41 -1
  664. package/src/services/TaskOrchestration-Integration.md +0 -188
@@ -0,0 +1,222 @@
1
+ /**
2
+ * ConnectionPause — what "pause this connection" has to mean, beyond a flag.
3
+ *
4
+ * `IntegrationDeactivateConnection` used to set `IsActive = false` and stop. The engine reads
5
+ * that flag before a sync, so syncs did stop — but nothing else did:
6
+ *
7
+ * - The SCHEDULED jobs kept firing. A sync schedule woke on cron, was refused, and wrote a
8
+ * failed run. Every cron tick, for as long as the connection stayed paused, so a paused
9
+ * connector's history filled with failures it did not cause.
10
+ * - The DISCOVERY schedule kept firing and was NOT refused, because nothing gated discovery
11
+ * on IsActive. A paused connection went on rescanning the vendor on a timer — spending the
12
+ * customer's rate budget, and rewriting the very catalog the pause was meant to freeze.
13
+ * - An IN-FLIGHT sync ran to completion. "Paused" arrived only after the thing the operator
14
+ * was watching had finished.
15
+ *
16
+ * So pause has to touch three things, and resume has to put back exactly what pause took —
17
+ * which is the part that needs state rather than a rule.
18
+ *
19
+ * WHY THE PRIOR STATE IS RECORDED RATHER THAN INFERRED. "Resume = set every schedule Active" is
20
+ * wrong: a connection can legitimately be paused while one of its two schedules was ALREADY off
21
+ * because the operator turned it off weeks ago. Inferring would silently re-enable it, and the
22
+ * first symptom is a sync nobody asked for. So pause records which jobs it actually moved, and
23
+ * resume restores only those.
24
+ *
25
+ * WHY PAUSE IS IDEMPOTENT AT THE RECORD, NOT AT THE WRITE. Deactivating an already-deactivated
26
+ * connection finds every job already Paused, so the set it "moved" is empty. Writing that empty
27
+ * set over the real record is the bug that loses the state — resume would then restore nothing
28
+ * and both schedules would stay off forever, with no error anywhere. {@link DecidePauseWrite}
29
+ * is the guard: the FIRST pause's record stands until a resume consumes it, and a later pause only
30
+ * ever adds to it.
31
+ *
32
+ * Everything here is a pure function over plain values. The resolver owns the reads and writes.
33
+ */
34
+
35
+ import { UUIDSet } from '@memberjunction/global';
36
+
37
+ /** The two schedule kinds a connection can own. Mirrors ScheduledJob's DriverClass split. */
38
+ export type PausedScheduleKind = 'sync' | 'discovery';
39
+
40
+ /** One schedule that PAUSE moved from Active to Paused, and that RESUME should move back. */
41
+ export interface PausedScheduleRecord {
42
+ /** ScheduledJob.ID */
43
+ ID: string;
44
+ /** Recorded for the operator-facing message only; restoration keys on ID. */
45
+ Kind: PausedScheduleKind;
46
+ }
47
+
48
+ /** Minimal shape this module needs from a ScheduledJob row. */
49
+ export interface ScheduleJobState {
50
+ ID: string;
51
+ Status: string | null;
52
+ Kind: PausedScheduleKind;
53
+ }
54
+
55
+ /** Key under CompanyIntegration.Configuration where the record lives. */
56
+ export const PAUSED_SCHEDULES_KEY = 'pausedSchedules';
57
+
58
+ /**
59
+ * Which schedules a pause should move, and the record to remember them by.
60
+ *
61
+ * Only jobs that are currently `Active` are moved. A job already `Paused`, or in any other
62
+ * status, is left exactly as found and is deliberately absent from the record — that absence
63
+ * is what stops resume from turning it on.
64
+ */
65
+ export function DecideSchedulesToPause(jobs: ReadonlyArray<ScheduleJobState>): PausedScheduleRecord[] {
66
+ return jobs
67
+ .filter(j => j.Status === 'Active')
68
+ .map(j => ({ ID: j.ID, Kind: j.Kind }));
69
+ }
70
+
71
+ /**
72
+ * Whether this pause's record should be written, given whatever record is already stored.
73
+ *
74
+ * Returns the record to persist, or `null` to leave the stored one untouched. A second pause of
75
+ * an already-paused connection moves nothing, and must not overwrite the first pause's record
76
+ * with its own empty one — see the class comment.
77
+ *
78
+ * A pause that DOES move jobs while a record is stored adds them to it: the stored entries stay
79
+ * exactly as they were, and the new ones are appended by job ID. That happens when a job was
80
+ * created or switched back on while the connection was paused, or when a resume could not clear
81
+ * its record. A job paused here but left out of the record is one resume can never put back.
82
+ */
83
+ export function DecidePauseWrite(
84
+ stored: ReadonlyArray<PausedScheduleRecord>,
85
+ newlyPaused: ReadonlyArray<PausedScheduleRecord>
86
+ ): PausedScheduleRecord[] | null {
87
+ const known = new UUIDSet(stored.map(r => r.ID));
88
+ const added = newlyPaused.filter(r => !known.Has(r.ID));
89
+ if (added.length === 0) return null; // nothing new moved — any stored record stands as it is
90
+ return [...stored, ...added];
91
+ }
92
+
93
+ /**
94
+ * Which schedules a resume should re-activate.
95
+ *
96
+ * A recorded job is restored only when it STILL EXISTS and is STILL `Paused`. Both guards matter:
97
+ * a job deleted while the connection was paused must not be resurrected, and a job someone has
98
+ * already moved back to Active must not be written again for no reason. Jobs absent from the
99
+ * record are never touched, however they look now.
100
+ */
101
+ export function DecideSchedulesToResume(
102
+ stored: ReadonlyArray<PausedScheduleRecord>,
103
+ jobs: ReadonlyArray<ScheduleJobState>
104
+ ): string[] {
105
+ const live = new Map(jobs.map(j => [j.ID, j]));
106
+ return stored
107
+ .filter(r => live.get(r.ID)?.Status === 'Paused')
108
+ .map(r => r.ID);
109
+ }
110
+
111
+ /** Reads the stored record out of a CompanyIntegration.Configuration JSON blob. */
112
+ export function ReadPausedSchedules(configuration: string | null | undefined): PausedScheduleRecord[] {
113
+ if (!configuration) return [];
114
+ let parsed: unknown;
115
+ try {
116
+ parsed = JSON.parse(configuration);
117
+ } catch {
118
+ // A Configuration we cannot parse is not an error to raise here: pause/resume is not the
119
+ // operation that owns that blob. Report "no record" and let the rest of the flow proceed.
120
+ return [];
121
+ }
122
+ if (typeof parsed !== 'object' || parsed === null) return [];
123
+ const raw = (parsed as Record<string, unknown>)[PAUSED_SCHEDULES_KEY];
124
+ if (!Array.isArray(raw)) return [];
125
+ const out: PausedScheduleRecord[] = [];
126
+ for (const item of raw) {
127
+ if (typeof item !== 'object' || item === null) continue;
128
+ const rec = item as Record<string, unknown>;
129
+ const id = rec.ID;
130
+ const kind = rec.Kind;
131
+ if (typeof id !== 'string' || id.length === 0) continue;
132
+ out.push({ ID: id, Kind: kind === 'discovery' ? 'discovery' : 'sync' });
133
+ }
134
+ return out;
135
+ }
136
+
137
+ /**
138
+ * Returns the Configuration JSON with the record set (or cleared, when `record` is empty).
139
+ *
140
+ * Preserves every other key. An unparseable Configuration is REPLACED rather than merged — the
141
+ * alternative is refusing to pause because of unrelated corruption, and losing one broken blob
142
+ * is the better failure.
143
+ */
144
+ export function WritePausedSchedules(
145
+ configuration: string | null | undefined,
146
+ record: ReadonlyArray<PausedScheduleRecord>
147
+ ): string {
148
+ let base: Record<string, unknown> = {};
149
+ if (configuration) {
150
+ try {
151
+ const parsed = JSON.parse(configuration);
152
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
153
+ base = parsed as Record<string, unknown>;
154
+ }
155
+ } catch {
156
+ base = {};
157
+ }
158
+ }
159
+ if (record.length === 0) {
160
+ delete base[PAUSED_SCHEDULES_KEY];
161
+ } else {
162
+ base[PAUSED_SCHEDULES_KEY] = record.map(r => ({ ID: r.ID, Kind: r.Kind }));
163
+ }
164
+ return JSON.stringify(base);
165
+ }
166
+
167
+ /**
168
+ * How far a cancel request actually reaches — reported to the caller so the UI can say something
169
+ * TRUE rather than something reassuring.
170
+ *
171
+ * `durable` the request is recorded where the owning process will observe it, whichever
172
+ * process that is. "Stopping after the current batch" is honest.
173
+ * `this-process` a sync is running HERE and was signalled in-process. Honest, but only because
174
+ * this happens to be the owner.
175
+ * `unknown` a run is live and we could neither record the request durably nor find it in
176
+ * this process. It will finish. What pause still guarantees is that no NEW sync
177
+ * starts — say that, and do not claim the running one is stopping.
178
+ * `none` nothing was running. There is nothing to say.
179
+ */
180
+ export type CancelScope = 'durable' | 'this-process' | 'unknown' | 'none';
181
+
182
+ /**
183
+ * Classifies the cancel from observable facts, not from which API was called.
184
+ *
185
+ * Deliberately derived rather than hardcoded per lineage: the durable path needs a run-row column
186
+ * that only exists on newer tenants, so the SAME code has to tell the truth on a tenant where
187
+ * that column is absent and the in-process registry is the only signal there is.
188
+ */
189
+ export function DescribeCancelScope(facts: {
190
+ liveRunPresent: boolean;
191
+ durableRequestRecorded: boolean;
192
+ runningInThisProcess: boolean;
193
+ }): CancelScope {
194
+ if (!facts.liveRunPresent) return 'none';
195
+ if (facts.durableRequestRecorded) return 'durable';
196
+ if (facts.runningInThisProcess) return 'this-process';
197
+ return 'unknown';
198
+ }
199
+
200
+ /** Operator-facing sentence for a cancel scope. Never claims a stop it cannot deliver. */
201
+ export function DescribeCancelOutcome(scope: CancelScope): string {
202
+ switch (scope) {
203
+ case 'durable':
204
+ case 'this-process':
205
+ return 'A sync was running — it will stop after the current batch.';
206
+ case 'unknown':
207
+ return 'A sync is running in another process and will finish; no new sync will start.';
208
+ case 'none':
209
+ return '';
210
+ }
211
+ }
212
+
213
+ /** Operator-facing sentence for what pause did to the schedules. */
214
+ export function DescribePauseOutcome(paused: ReadonlyArray<PausedScheduleRecord>, alreadyPaused: boolean): string {
215
+ if (alreadyPaused) return 'Schedules were already paused.';
216
+ if (paused.length === 0) return 'No active schedules to pause.';
217
+ const kinds = paused.map(p => p.Kind);
218
+ const parts: string[] = [];
219
+ if (kinds.includes('sync')) parts.push('data sync');
220
+ if (kinds.includes('discovery')) parts.push('schema refresh');
221
+ return `Paused the ${parts.join(' and ')} schedule${parts.length > 1 ? 's' : ''}.`;
222
+ }
@@ -47,7 +47,11 @@ import {
47
47
  type PromotionCandidate,
48
48
  type CustomKeyStat,
49
49
  type InferredColumnType,
50
+ BuildCatalogWriter,
51
+ WithCatalogScope,
50
52
  } from '@memberjunction/integration-engine';
53
+ import { UUIDsEqual } from '@memberjunction/global';
54
+ import { IntegrationEngineBase } from '@memberjunction/integration-engine-base';
51
55
 
52
56
  /**
53
57
  * A custom-key candidate persisted to CompanyIntegration.Configuration.customKeyCandidates
@@ -179,6 +183,27 @@ async function readAutoPromoteFlag(companyIntegrationID: string, user: UserInfo,
179
183
  } catch { return false; }
180
184
  }
181
185
 
186
+ interface EntityPlan {
187
+ entityName: string;
188
+ entityInfo: EntityInfo;
189
+ entityMap: { ID: string; ExternalObjectName: string };
190
+ work: WorkItem[];
191
+ /** Index of this entity's input in the RSU batch; -1 when it needs no DDL. */
192
+ batchIndex: number;
193
+ }
194
+
195
+ /** What {@link IntegrationCustomColumnPromoter.PlanPromotion} worked out, before anything runs. */
196
+ export interface PromotionPlan {
197
+ IntegrationID: string;
198
+ Plans: EntityPlan[];
199
+ /**
200
+ * The ADD COLUMN migrations, ready to run. The FIRST entry carries the durable post-restart
201
+ * PendingWork for the whole plan — RSU registers PendingWork from every input in a batch, so
202
+ * these can be appended to someone else's batch without losing it.
203
+ */
204
+ BatchInputs: RSUPipelineInput[];
205
+ }
206
+
182
207
  const NOT_PROMOTED: SchemaPromotionResult = { Promoted: false, ColumnsAdded: [], SchemaUpdatePending: false };
183
208
 
184
209
  /**
@@ -199,30 +224,38 @@ export class IntegrationCustomColumnPromoter {
199
224
  return this.provider as unknown as DatabaseProviderBase;
200
225
  }
201
226
 
202
- /** Entry point: promote custom columns for every entity touched by the sync. */
203
- public async PromoteForSync(
227
+ /**
228
+ * PHASE 1 only: work out what WOULD be promoted, and the ADD COLUMN migrations that would do
229
+ * it, without running a pipeline.
230
+ *
231
+ * Split out so a caller that is ALREADY running an RSU batch can fold these migrations into
232
+ * it. A schema refresh that offers the accumulated overflow columns and then promotes them in
233
+ * its own second batch would restart the workspace twice in a row for one user action, and a
234
+ * restart storm is its own incident class here. One batch, one migration, one restart.
235
+ *
236
+ * Side effects are deliberate and belong to planning, not to promotion: stale already-promoted
237
+ * keys are purged from the staging JSON here, BEFORE any column is created and before the RSU
238
+ * pass that would restart this process. That runs even when nothing new is promoted, which is
239
+ * the only way residue on rows a sync never rewrites gets cleaned rather than endlessly
240
+ * re-detected as a phantom "new column".
241
+ *
242
+ * Returns null when there is nothing to do.
243
+ */
244
+ public async PlanPromotion(
204
245
  companyIntegrationID: string,
205
- syncedEntityNames: string[],
246
+ entityNames: string[],
206
247
  customKeyStats?: Record<string, CustomKeyStat[]>,
207
- ): Promise<SchemaPromotionResult> {
248
+ ): Promise<PromotionPlan | null> {
208
249
  const integrationID = await this.resolveIntegrationID(companyIntegrationID);
209
- if (!integrationID) return NOT_PROMOTED;
250
+ if (!integrationID) return null;
210
251
 
211
252
  // ── PHASE 1: PLAN — build every entity's work list + its RSU input; run NO pipeline. ──
212
253
  // The old shape ran the FULL RSU pipeline per entity — a sync touching N entities with
213
254
  // candidates paid N CodeGen + compile passes where the batch API exists precisely to pay
214
255
  // one. Plan everything first, then promote once.
215
- interface EntityPlan {
216
- entityName: string;
217
- entityInfo: EntityInfo;
218
- entityMap: { ID: string; ExternalObjectName: string };
219
- work: WorkItem[];
220
- /** Index of this entity's input in the RSU batch; -1 when it needs no DDL. */
221
- batchIndex: number;
222
- }
223
256
  const plans: EntityPlan[] = [];
224
257
  const batchInputs: RSUPipelineInput[] = [];
225
- for (const entityName of syncedEntityNames) {
258
+ for (const entityName of entityNames) {
226
259
  try {
227
260
  const planned = await this.planWorkForEntity(companyIntegrationID, entityName, customKeyStats?.[entityName]);
228
261
  if (!planned) continue; // no overflow column / no captured customs / no entity map
@@ -256,7 +289,7 @@ export class IntegrationCustomColumnPromoter {
256
289
  LogError(`[CustomColumnPromoter] Planning failed for entity '${entityName}': ${this.msg(err)}`);
257
290
  }
258
291
  }
259
- if (plans.length === 0) return NOT_PROMOTED;
292
+ if (plans.length === 0) return null;
260
293
 
261
294
  // Register the follow-up DURABLY before the restart, the way the apply-objects path does
262
295
  // (IntegrationDiscoveryResolver: `rsuInput.PendingWork = [pendingPayload]`). The restart is
@@ -290,6 +323,19 @@ export class IntegrationCustomColumnPromoter {
290
323
  }];
291
324
  batchInputs[0].ContextUser = this.user;
292
325
  }
326
+ return { IntegrationID: integrationID, Plans: plans, BatchInputs: batchInputs };
327
+ }
328
+
329
+ /** Entry point: promote custom columns for every entity touched by the sync. */
330
+ public async PromoteForSync(
331
+ companyIntegrationID: string,
332
+ syncedEntityNames: string[],
333
+ customKeyStats?: Record<string, CustomKeyStat[]>,
334
+ ): Promise<SchemaPromotionResult> {
335
+ const promotionPlan = await this.PlanPromotion(companyIntegrationID, syncedEntityNames, customKeyStats);
336
+ if (!promotionPlan) return NOT_PROMOTED;
337
+ const plans = promotionPlan.Plans;
338
+ const batchInputs = promotionPlan.BatchInputs;
293
339
 
294
340
  // ── PHASE 2: ONE batched RSU pass for ALL entities' ADD COLUMN migrations. ──
295
341
  // RunPipelineBatch runs every migration under one lock, then ONE CodeGen + compile +
@@ -300,7 +346,12 @@ export class IntegrationCustomColumnPromoter {
300
346
  // step with the database.
301
347
  let batchResults: RSUPipelineResult[] = [];
302
348
  if (batchInputs.length > 0) {
303
- const batch = await RuntimeSchemaManager.Instance.RunPipelineBatch(batchInputs);
349
+ // Retrying variant. This runs UNATTENDED, mid-sync, with no operator watching: a
350
+ // transient ExecuteMigration / RunCodeGen / CompileTypeScript / RestartMJAPI failure
351
+ // drops the whole promotion, and the columns simply stay in overflow until something
352
+ // triggers a promotion again. The wrapper replays only those four steps and only while
353
+ // nothing in the batch was applied, so a partially-applied batch is still returned as-is.
354
+ const batch = await RuntimeSchemaManager.Instance.RunPipelineBatchWithRetry(batchInputs);
304
355
  batchResults = batch.Results ?? [];
305
356
  // M3: make the freshly-created EntityFields + regenerated sprocs visible in-process
306
357
  // ONCE for the whole batch. CRITICAL: the spread below builds sproc calls from this
@@ -350,7 +401,7 @@ export class IntegrationCustomColumnPromoter {
350
401
  EntityName: plan.entityName,
351
402
  EntityMapID: plan.entityMap.ID,
352
403
  ExternalObjectName: plan.entityMap.ExternalObjectName,
353
- IntegrationID: integrationID,
404
+ IntegrationID: promotionPlan.IntegrationID,
354
405
  Columns: plan.work.map(w => ({
355
406
  SourceKey: w.sourceKey,
356
407
  ColumnName: w.columnName,
@@ -385,12 +436,19 @@ export class IntegrationCustomColumnPromoter {
385
436
  * Idempotent, because a pending row is marked Completed only after success and so stays
386
437
  * re-processable after a crash: field maps are filtered against those already active, and the
387
438
  * spread only fills a destination that is still empty.
439
+ *
440
+ * One entity's failure does not stop the others, but it is not swallowed either: after every
441
+ * entry has run, any failure is THROWN, so the caller fails the pending row instead of marking
442
+ * it Completed over columns that exist in the database and are never mapped.
443
+ *
444
+ * @throws PROMOTION_INCOMPLETE naming each entity that failed.
388
445
  */
389
446
  public async CompletePromotion(
390
447
  promoted: NonNullable<RSUPendingWork['PromotedColumns']>,
391
448
  knownEntities?: ReadonlyMap<string, EntityInfo>,
392
449
  ): Promise<Array<{ EntityName: string; ColumnName: string }>> {
393
450
  const columnsAdded: Array<{ EntityName: string; ColumnName: string }> = [];
451
+ const failures: string[] = [];
394
452
  for (const entry of promoted) {
395
453
  try {
396
454
  // Provider first — post-restart it holds the REGENERATED class, which is the whole
@@ -399,6 +457,7 @@ export class IntegrationCustomColumnPromoter {
399
457
  const entityInfo = this.provider.EntityByName(entry.EntityName) ?? knownEntities?.get(entry.EntityName);
400
458
  if (!entityInfo) {
401
459
  LogError(`[CustomColumnPromoter] Post-restart: entity '${entry.EntityName}' not found; skipping.`);
460
+ failures.push(`${entry.EntityName}: entity not found`);
402
461
  continue;
403
462
  }
404
463
  // Destination names are CARRIED, never recomputed: uniqueColumnName may have
@@ -424,17 +483,23 @@ export class IntegrationCustomColumnPromoter {
424
483
  needsFieldMap: !existingMaps.has(c.SourceKey.toLowerCase()),
425
484
  }));
426
485
 
427
- await this.createIntegrationObjectFields(entry.IntegrationID, entry.ExternalObjectName, named);
486
+ await this.createIntegrationObjectFields(entry.IntegrationID, entry.EntityMapID, entry.ExternalObjectName, named);
428
487
  await this.createFieldMaps(entry.EntityMapID, named.filter(n => n.needsFieldMap));
429
488
  await this.spreadAndRebaseline(entry.EntityName, entry.EntityMapID, entityInfo, named);
430
489
 
431
490
  LogStatus(`[CustomColumnPromoter] Post-restart: completed ${named.length} promoted column(s) on ${entry.EntityName}: ${named.map(n => n.columnName).join(', ')}`);
432
491
  columnsAdded.push(...named.map(n => ({ EntityName: entry.EntityName, ColumnName: n.columnName })));
433
492
  } catch (err) {
434
- // One entity must not abort the others; the pending row stays open for retry.
493
+ // One entity must not abort the others; the failure is thrown once they have all run.
435
494
  LogError(`[CustomColumnPromoter] Post-restart completion failed for '${entry.EntityName}': ${this.msg(err)}`);
495
+ failures.push(`${entry.EntityName}: ${this.msg(err)}`);
436
496
  }
437
497
  }
498
+ if (failures.length > 0) {
499
+ throw new Error(
500
+ `PROMOTION_INCOMPLETE: ${failures.length} of ${promoted.length} entity(ies) failed to complete — ${failures.join('; ')}`
501
+ );
502
+ }
438
503
  return columnsAdded;
439
504
  }
440
505
 
@@ -781,13 +846,45 @@ export class IntegrationCustomColumnPromoter {
781
846
 
782
847
  /** Creates an IOF row per promoted field (IsCustom, MetadataSource='Discovered'). */
783
848
  private async createIntegrationObjectFields(
849
+ integrationID: string,
850
+ entityMapID: string,
851
+ externalObjectName: string,
852
+ named: WorkItem[],
853
+ ): Promise<void> {
854
+ // Resolve the CONNECTION from the entity map rather than hopping connection → integration
855
+ // and writing the shared rows. That hop is what let one tenant's promoted column appear in
856
+ // the catalog every other tenant on the same connector reads.
857
+ const entityMap = IntegrationEngineBase.Instance.EntityMaps.find(m => UUIDsEqual(m.ID, entityMapID));
858
+ const companyIntegration = entityMap
859
+ ? IntegrationEngineBase.Instance.GetCompanyIntegrationByID(entityMap.CompanyIntegrationID)
860
+ : undefined;
861
+ if (!companyIntegration) {
862
+ LogError(`[CustomColumnPromoter] Could not resolve the connection behind entity map ${entityMapID}; catalog rows skipped for '${externalObjectName}'.`);
863
+ return;
864
+ }
865
+ // In the connection's own scope, entered here per entry: the post-restart consumer calls
866
+ // in with no scope, and unscoped a connection with per-connection rows reads as having none,
867
+ // so BuildCatalogWriter throws PER_CONNECTION_CATALOG_MISSING. Per entry, so a batch that
868
+ // spans connections resolves each one to its own catalog.
869
+ await WithCatalogScope(
870
+ companyIntegration.ID,
871
+ () => this.writeIntegrationObjectFields(companyIntegration, integrationID, externalObjectName, named),
872
+ this.user,
873
+ );
874
+ }
875
+
876
+ /** The catalog writes of {@link createIntegrationObjectFields}, run inside the connection's scope. */
877
+ private async writeIntegrationObjectFields(
878
+ companyIntegration: MJCompanyIntegrationEntity,
784
879
  integrationID: string,
785
880
  externalObjectName: string,
786
881
  named: WorkItem[],
787
882
  ): Promise<void> {
788
- const objectID = await this.resolveIntegrationObjectID(integrationID, externalObjectName);
883
+ const writer = BuildCatalogWriter(this.provider, companyIntegration, this.user);
884
+ const objectID = (await writer.ObjectsInScope())
885
+ .find(o => o.Name.toLowerCase() === externalObjectName.toLowerCase())?.ID ?? null;
789
886
  if (!objectID) {
790
- LogError(`[CustomColumnPromoter] No IntegrationObject '${externalObjectName}' for integration ${integrationID}; IOF rows skipped.`);
887
+ LogError(`[CustomColumnPromoter] No catalog object '${externalObjectName}' for integration ${integrationID}; catalog field rows skipped.`);
791
888
  return;
792
889
  }
793
890
  // Lookup-or-reactivate-or-create — NEVER blind-create over an existing field. A field the source
@@ -795,13 +892,16 @@ export class IntegrationCustomColumnPromoter {
795
892
  // key reappears in the payload and reaches promotion, the IOF already exists: reactivate it (so the
796
893
  // active-filtered ApplyAll re-materializes the still-present column) instead of creating a duplicate.
797
894
  // This is the "removed-then-re-added" case + the recovery case (column existed, field map missing).
798
- const existingIOFs = await this.existingIOFsByName(objectID);
895
+ const existingIOFs = new Map<string, { ID: string; Status: string }>();
896
+ for (const f of await writer.FieldsForObject(objectID)) {
897
+ existingIOFs.set((f.Name ?? '').toLowerCase(), { ID: f.ID, Status: f.Status ?? 'Active' });
898
+ }
799
899
  for (const n of named) {
800
900
  const existing = existingIOFs.get(n.sourceKey.toLowerCase());
801
901
  if (existing) {
802
902
  if (existing.Status !== 'Active') {
803
- const reIof = await this.provider.GetEntityObject<MJIntegrationObjectFieldEntity>('MJ: Integration Object Fields', this.user);
804
- if (await reIof.Load(existing.ID)) {
903
+ const reIof = await writer.LoadField(existing.ID);
904
+ if (reIof) {
805
905
  reIof.Status = 'Active';
806
906
  const ok = await reIof.Save();
807
907
  if (!ok) LogError(`[CustomColumnPromoter] Failed to reactivate IOF '${n.sourceKey}': ${reIof.LatestResult?.CompleteMessage ?? 'unknown'}`);
@@ -809,8 +909,10 @@ export class IntegrationCustomColumnPromoter {
809
909
  }
810
910
  continue;
811
911
  }
812
- const iof = await this.provider.GetEntityObject<MJIntegrationObjectFieldEntity>('MJ: Integration Object Fields', this.user);
813
- iof.NewRecord();
912
+ const iof = await writer.NewFieldRow();
913
+ // An overflow-promoted column was seen in live data, never described by an endpoint and
914
+ // never declared — so its provenance is 'Sampled', and it has no declared row behind it.
915
+ writer.StampNewField(iof, null, 'Sampled');
814
916
  iof.IntegrationObjectID = objectID;
815
917
  iof.Name = n.sourceKey;
816
918
  iof.DisplayName = n.sourceKey;
@@ -1102,40 +1204,13 @@ export class IntegrationCustomColumnPromoter {
1102
1204
  ExtraFilter: `CompanyIntegrationID='${companyIntegrationID}' AND Entity='${this.escape(entityName)}'`,
1103
1205
  ResultType: 'simple',
1104
1206
  MaxRows: 1,
1207
+ SkipTotalRowCount: true,
1105
1208
  }, this.user);
1106
1209
  const row = res.Success ? res.Results?.[0] : undefined;
1107
1210
  return row ? { ID: row.ID, ExternalObjectName: row.ExternalObjectName } : null;
1108
1211
  }
1109
1212
 
1110
- /** Existing IOF field names (lowercased) for an object — for idempotent IOF creation. */
1111
- private async existingIOFsByName(objectID: string): Promise<ReadonlyMap<string, { ID: string; Status: string }>> {
1112
- const rv = new RunView();
1113
- const res = await rv.RunView<MJIntegrationObjectFieldEntity>({
1114
- EntityName: 'MJ: Integration Object Fields',
1115
- ExtraFilter: `IntegrationObjectID='${objectID}'`,
1116
- Fields: ['ID', 'Name', 'Status'],
1117
- ResultType: 'simple',
1118
- }, this.user);
1119
- const map = new Map<string, { ID: string; Status: string }>();
1120
- if (res.Success) for (const r of res.Results ?? []) {
1121
- map.set((r.Name ?? '').toLowerCase(), { ID: String(r.ID), Status: r.Status ?? 'Active' });
1122
- }
1123
- return map;
1124
- }
1125
1213
 
1126
- /** Resolves the IntegrationObject ID for an external object name under an integration. */
1127
- private async resolveIntegrationObjectID(integrationID: string, externalObjectName: string): Promise<string | null> {
1128
- const rv = new RunView();
1129
- const res = await rv.RunView<MJIntegrationObjectEntity>({
1130
- EntityName: 'MJ: Integration Objects',
1131
- ExtraFilter: `IntegrationID='${integrationID}' AND Name='${this.escape(externalObjectName)}'`,
1132
- Fields: ['ID', 'Name', 'IntegrationID'],
1133
- ResultType: 'simple',
1134
- MaxRows: 1,
1135
- }, this.user);
1136
- const row = res.Success ? res.Results?.[0] : undefined;
1137
- return row ? row.ID : null;
1138
- }
1139
1214
 
1140
1215
  private escape(value: string): string {
1141
1216
  return value.replace(/'/g, "''");