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

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 (463) hide show
  1. package/README.md +69 -0
  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 +31 -8
  14. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  15. package/dist/agentSessions/SessionJanitor.js +85 -41
  16. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  17. package/dist/agentSessions/SessionManager.d.ts +14 -4
  18. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  19. package/dist/agentSessions/SessionManager.js +28 -4
  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/loginEmailResolution.d.ts +41 -0
  33. package/dist/auth/loginEmailResolution.d.ts.map +1 -0
  34. package/dist/auth/loginEmailResolution.js +47 -0
  35. package/dist/auth/loginEmailResolution.js.map +1 -0
  36. package/dist/auth/magicLink/MagicLinkKeys.d.ts +50 -2
  37. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  38. package/dist/auth/magicLink/MagicLinkKeys.js +129 -12
  39. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  40. package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
  41. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  42. package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
  43. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  44. package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
  45. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  46. package/dist/auth/magicLink/MagicLinkService.js +221 -9
  47. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  48. package/dist/auth/magicLink/index.d.ts +1 -1
  49. package/dist/auth/magicLink/index.d.ts.map +1 -1
  50. package/dist/auth/magicLink/index.js +1 -1
  51. package/dist/auth/magicLink/index.js.map +1 -1
  52. package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
  53. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  54. package/dist/auth/magicLink/redeemLanding.js +7 -4
  55. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  56. package/dist/auth/magicLink/types.d.ts +27 -3
  57. package/dist/auth/magicLink/types.d.ts.map +1 -1
  58. package/dist/auth/magicLink/types.js +0 -4
  59. package/dist/auth/magicLink/types.js.map +1 -1
  60. package/dist/auth/newUsers.d.ts.map +1 -1
  61. package/dist/auth/newUsers.js +1 -0
  62. package/dist/auth/newUsers.js.map +1 -1
  63. package/dist/backgroundSweepConfigUnits.d.ts +231 -0
  64. package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
  65. package/dist/backgroundSweepConfigUnits.js +180 -0
  66. package/dist/backgroundSweepConfigUnits.js.map +1 -0
  67. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -1
  68. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +2 -1
  69. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -1
  70. package/dist/config.d.ts +906 -8
  71. package/dist/config.d.ts.map +1 -1
  72. package/dist/config.js +59 -0
  73. package/dist/config.js.map +1 -1
  74. package/dist/context.d.ts +2 -0
  75. package/dist/context.d.ts.map +1 -1
  76. package/dist/context.js +41 -12
  77. package/dist/context.js.map +1 -1
  78. package/dist/coreRoutes.d.ts +3 -1
  79. package/dist/coreRoutes.d.ts.map +1 -1
  80. package/dist/coreRoutes.js +6 -4
  81. package/dist/coreRoutes.js.map +1 -1
  82. package/dist/generated/graphql-schemas/__mj.d.ts +1072 -5
  83. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  84. package/dist/generated/graphql-schemas/__mj.js +10174 -4618
  85. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  86. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
  87. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  88. package/dist/generic/OrphanedConversationDetailReconciler.js +27 -1
  89. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  90. package/dist/generic/ResolverBase.d.ts +50 -5
  91. package/dist/generic/ResolverBase.d.ts.map +1 -1
  92. package/dist/generic/ResolverBase.js +329 -132
  93. package/dist/generic/ResolverBase.js.map +1 -1
  94. package/dist/generic/RunViewResolver.d.ts +4 -0
  95. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  96. package/dist/generic/RunViewResolver.js +47 -7
  97. package/dist/generic/RunViewResolver.js.map +1 -1
  98. package/dist/globalCors.d.ts.map +1 -1
  99. package/dist/globalCors.js +1 -0
  100. package/dist/globalCors.js.map +1 -1
  101. package/dist/index.d.ts +3 -0
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +201 -43
  104. package/dist/index.js.map +1 -1
  105. package/dist/integration/ConnectionPause.d.ts +121 -0
  106. package/dist/integration/ConnectionPause.d.ts.map +1 -0
  107. package/dist/integration/ConnectionPause.js +183 -0
  108. package/dist/integration/ConnectionPause.js.map +1 -0
  109. package/dist/integration/CustomColumnPromoter.d.ts +72 -6
  110. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  111. package/dist/integration/CustomColumnPromoter.js +87 -46
  112. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  113. package/dist/integration/EntityMapLifecycle.d.ts +78 -4
  114. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  115. package/dist/integration/EntityMapLifecycle.js +199 -5
  116. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  117. package/dist/integration/InactiveRowWarnings.d.ts +31 -0
  118. package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
  119. package/dist/integration/InactiveRowWarnings.js +29 -0
  120. package/dist/integration/InactiveRowWarnings.js.map +1 -1
  121. package/dist/integration/ObjectNamesByID.d.ts +28 -0
  122. package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
  123. package/dist/integration/ObjectNamesByID.js +87 -0
  124. package/dist/integration/ObjectNamesByID.js.map +1 -0
  125. package/dist/integration/PostRestartIntrospect.d.ts +26 -0
  126. package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
  127. package/dist/integration/PostRestartIntrospect.js +27 -0
  128. package/dist/integration/PostRestartIntrospect.js.map +1 -0
  129. package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
  130. package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
  131. package/dist/integration/RSUPostRestartProgress.js +323 -0
  132. package/dist/integration/RSUPostRestartProgress.js.map +1 -0
  133. package/dist/integration/RSUProgressBridge.d.ts +41 -2
  134. package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
  135. package/dist/integration/RSUProgressBridge.js +84 -1
  136. package/dist/integration/RSUProgressBridge.js.map +1 -1
  137. package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
  138. package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
  139. package/dist/integration/RunArtifactAuthorization.js +45 -0
  140. package/dist/integration/RunArtifactAuthorization.js.map +1 -0
  141. package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
  142. package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
  143. package/dist/integration/SchemaRefreshLaunch.js +3 -2
  144. package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
  145. package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
  146. package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
  147. package/dist/integration/ScopedFieldsForBuild.js +91 -0
  148. package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
  149. package/dist/integration/TargetConfigGuard.d.ts +40 -0
  150. package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
  151. package/dist/integration/TargetConfigGuard.js +40 -0
  152. package/dist/integration/TargetConfigGuard.js.map +1 -0
  153. package/dist/logging/StartupLogger.d.ts +50 -0
  154. package/dist/logging/StartupLogger.d.ts.map +1 -1
  155. package/dist/logging/StartupLogger.js +15 -22
  156. package/dist/logging/StartupLogger.js.map +1 -1
  157. package/dist/middleware/BaseServerMiddleware.d.ts +21 -3
  158. package/dist/middleware/BaseServerMiddleware.d.ts.map +1 -1
  159. package/dist/middleware/BaseServerMiddleware.js +4 -2
  160. package/dist/middleware/BaseServerMiddleware.js.map +1 -1
  161. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
  162. package/dist/realtimeSessions/ownedRealtimeSession.js +2 -3
  163. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
  164. package/dist/realtimeSessions/sessionAccess.d.ts +15 -0
  165. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  166. package/dist/realtimeSessions/sessionAccess.js +22 -0
  167. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  168. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  169. package/dist/realtimeWidget/WidgetSessionService.js +2 -0
  170. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  171. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  172. package/dist/realtimeWidget/visitorIdentity.js +1 -0
  173. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  174. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  175. package/dist/realtimeWidget/widgetCore.js +4 -7
  176. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  177. package/dist/realtimeWidget/widgetGuestElevation.js +1 -0
  178. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  179. package/dist/requestOrigin.d.ts +22 -0
  180. package/dist/requestOrigin.d.ts.map +1 -0
  181. package/dist/requestOrigin.js +60 -0
  182. package/dist/requestOrigin.js.map +1 -0
  183. package/dist/resolvers/AgentRunStatusPublisher.d.ts +10 -0
  184. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  185. package/dist/resolvers/AgentRunStatusPublisher.js +18 -2
  186. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  187. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  188. package/dist/resolvers/AgentSessionResolver.js +6 -2
  189. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  190. package/dist/resolvers/AutotagPipelineResolver.d.ts +1 -1
  191. package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
  192. package/dist/resolvers/AutotagPipelineResolver.js +61 -16
  193. package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
  194. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  195. package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
  196. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  197. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +6 -0
  198. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
  199. package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
  200. package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
  201. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  202. package/dist/resolvers/GetDataResolver.js +34 -13
  203. package/dist/resolvers/GetDataResolver.js.map +1 -1
  204. package/dist/resolvers/InfoResolver.js +1 -1
  205. package/dist/resolvers/InfoResolver.js.map +1 -1
  206. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
  207. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  208. package/dist/resolvers/IntegrationDiscoveryResolver.js +2690 -1305
  209. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  210. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  211. package/dist/resolvers/MCPResolver.js +13 -2
  212. package/dist/resolvers/MCPResolver.js.map +1 -1
  213. package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -1
  214. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  215. package/dist/resolvers/QuerySystemUserResolver.js +181 -88
  216. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  217. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  218. package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
  219. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  220. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +6 -0
  221. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  222. package/dist/resolvers/RealtimeClientSessionResolver.js +36 -5
  223. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  224. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
  225. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  226. package/dist/resolvers/RemoteBrowserActionResolver.js +217 -34
  227. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  228. package/dist/resolvers/RunAIAgentResolver.d.ts +24 -8
  229. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  230. package/dist/resolvers/RunAIAgentResolver.js +185 -67
  231. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  232. package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
  233. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  234. package/dist/resolvers/RunAIPromptResolver.js +19 -18
  235. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  236. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  237. package/dist/resolvers/RunTemplateResolver.js +3 -1
  238. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  239. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  240. package/dist/resolvers/SqlLoggingConfigResolver.js +7 -8
  241. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  242. package/dist/resolvers/TagGovernanceResolver.d.ts +12 -0
  243. package/dist/resolvers/TagGovernanceResolver.d.ts.map +1 -1
  244. package/dist/resolvers/TagGovernanceResolver.js +84 -0
  245. package/dist/resolvers/TagGovernanceResolver.js.map +1 -1
  246. package/dist/resolvers/TelemetryResolver.d.ts +13 -8
  247. package/dist/resolvers/TelemetryResolver.d.ts.map +1 -1
  248. package/dist/resolvers/TelemetryResolver.js +40 -9
  249. package/dist/resolvers/TelemetryResolver.js.map +1 -1
  250. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  251. package/dist/resolvers/meetingRecordingRegistration.js +2 -0
  252. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  253. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -1
  254. package/dist/resolvers/meetings/meetingMutations.js +34 -4
  255. package/dist/resolvers/meetings/meetingMutations.js.map +1 -1
  256. package/dist/rest/MediaAccessKeys.d.ts.map +1 -1
  257. package/dist/rest/MediaAccessKeys.js +6 -2
  258. package/dist/rest/MediaAccessKeys.js.map +1 -1
  259. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  260. package/dist/rest/OAuthCallbackHandler.js +11 -5
  261. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  262. package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
  263. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
  264. package/dist/rest/RealtimeRecordingHandler.js +2 -4
  265. package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
  266. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  267. package/dist/rest/ViewOperationsHandler.js +2 -1
  268. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  269. package/dist/rest/setupRESTEndpoints.d.ts +3 -1
  270. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  271. package/dist/rest/setupRESTEndpoints.js +11 -2
  272. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  273. package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
  274. package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
  275. package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
  276. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  277. package/dist/services/TaskGraphActionRunner.js +2 -26
  278. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  279. package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
  280. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  281. package/dist/services/TaskGraphAgentRunner.js +38 -0
  282. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  283. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  284. package/dist/services/TaskGraphContinuationDeliverer.js +1 -0
  285. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  286. package/dist/services/WorkQueueHostService.d.ts +2 -1
  287. package/dist/services/WorkQueueHostService.d.ts.map +1 -1
  288. package/dist/services/WorkQueueHostService.js +19 -4
  289. package/dist/services/WorkQueueHostService.js.map +1 -1
  290. package/dist/services/workQueueConfig.d.ts +2 -2
  291. package/dist/services/workQueueConfig.js +5 -5
  292. package/dist/services/workQueueConfig.js.map +1 -1
  293. package/dist/sharedCache.js +1 -1
  294. package/dist/sharedCache.js.map +1 -1
  295. package/dist/types.d.ts +17 -0
  296. package/dist/types.d.ts.map +1 -1
  297. package/dist/types.js.map +1 -1
  298. package/dist/util.d.ts.map +1 -1
  299. package/dist/util.js +55 -2
  300. package/dist/util.js.map +1 -1
  301. package/package.json +107 -100
  302. package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
  303. package/src/__tests__/ActiveOperations.test.ts +68 -0
  304. package/src/__tests__/AgentSessionResolver.ownership.test.ts +13 -0
  305. package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
  306. package/src/__tests__/BatchApplyParity.test.ts +109 -0
  307. package/src/__tests__/BridgeHostInstance.test.ts +42 -0
  308. package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
  309. package/src/__tests__/ConnectionPause.test.ts +192 -0
  310. package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
  311. package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
  312. package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
  313. package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
  314. package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
  315. package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
  316. package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
  317. package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
  318. package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
  319. package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
  320. package/src/__tests__/MagicLinkKeys.test.ts +102 -0
  321. package/src/__tests__/MediaAccessKeys.test.ts +57 -10
  322. package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
  323. package/src/__tests__/ObjectNamesByID.test.ts +176 -0
  324. package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
  325. package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
  326. package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
  327. package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
  328. package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
  329. package/src/__tests__/RSUProgressBridge.test.ts +188 -5
  330. package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
  331. package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
  332. package/src/__tests__/RealtimeClientSessionResolver.test.ts +22 -0
  333. package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
  334. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
  335. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
  336. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +6 -4
  337. package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
  338. package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
  339. package/src/__tests__/ResolverBase.clientOldValues.test.ts +327 -26
  340. package/src/__tests__/ResolverBase.diagnosticSenderRegistrations.test.ts +26 -0
  341. package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
  342. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +53 -2
  343. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +60 -0
  344. package/src/__tests__/RunAIAgentResolver.branch.test.ts +4 -0
  345. package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
  346. package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
  347. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +2 -0
  348. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +2 -0
  349. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +87 -12
  350. package/src/__tests__/RunAIAgentResolver.streaming.test.ts +28 -4
  351. package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
  352. package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
  353. package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
  354. package/src/__tests__/SessionJanitor.test.ts +195 -4
  355. package/src/__tests__/SessionManager.test.ts +69 -0
  356. package/src/__tests__/TagGovernanceAndAutotagResolvers.test.ts +261 -0
  357. package/src/__tests__/TagGovernanceResolver.test.ts +60 -2
  358. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
  359. package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
  360. package/src/__tests__/ViewOperationsHandler.test.ts +2 -5
  361. package/src/__tests__/WorkQueueHostService.test.ts +25 -7
  362. package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
  363. package/src/__tests__/contextRequestOrigin.test.ts +105 -0
  364. package/src/__tests__/conversationBrowsers.test.ts +62 -0
  365. package/src/__tests__/globalCors.test.ts +12 -0
  366. package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
  367. package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
  368. package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
  369. package/src/__tests__/realtimeRecordingHandler.test.ts +7 -2
  370. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +79 -1
  371. package/src/__tests__/requestOrigin.test.ts +104 -0
  372. package/src/__tests__/review-capture-valid-token-log.test.ts +98 -0
  373. package/src/__tests__/runStreams.fieldSecurity.test.ts +5 -5
  374. package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
  375. package/src/__tests__/sessionDeadline.test.ts +51 -0
  376. package/src/__tests__/sharedCache.test.ts +11 -0
  377. package/src/__tests__/unifiedAuth.test.ts +73 -1
  378. package/src/agentSessions/BridgeHostInstance.ts +20 -5
  379. package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
  380. package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
  381. package/src/agentSessions/SessionJanitor.ts +92 -42
  382. package/src/agentSessions/SessionManager.ts +38 -8
  383. package/src/agentSessions/conversationBrowsers.ts +143 -0
  384. package/src/agentSessions/sessionDeadline.ts +81 -0
  385. package/src/auth/APIKeyScopeAuth.ts +5 -4
  386. package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
  387. package/src/auth/loginEmailResolution.ts +67 -0
  388. package/src/auth/magicLink/MagicLinkKeys.ts +146 -14
  389. package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
  390. package/src/auth/magicLink/MagicLinkService.ts +250 -10
  391. package/src/auth/magicLink/index.ts +1 -1
  392. package/src/auth/magicLink/redeemLanding.ts +7 -4
  393. package/src/auth/magicLink/types.ts +28 -3
  394. package/src/auth/newUsers.ts +1 -0
  395. package/src/backgroundSweepConfigUnits.ts +213 -0
  396. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +2 -1
  397. package/src/config.ts +69 -0
  398. package/src/context.ts +46 -15
  399. package/src/coreRoutes.ts +14 -7
  400. package/src/generated/graphql-schemas/__mj.ts +10360 -6479
  401. package/src/generic/OrphanedConversationDetailReconciler.ts +32 -1
  402. package/src/generic/ResolverBase.ts +422 -143
  403. package/src/generic/RunViewResolver.ts +96 -49
  404. package/src/globalCors.ts +1 -0
  405. package/src/index.ts +246 -44
  406. package/src/integration/ConnectionPause.ts +222 -0
  407. package/src/integration/CustomColumnPromoter.ts +123 -53
  408. package/src/integration/EntityMapLifecycle.ts +229 -6
  409. package/src/integration/InactiveRowWarnings.ts +50 -0
  410. package/src/integration/ObjectNamesByID.ts +97 -0
  411. package/src/integration/PostRestartIntrospect.ts +49 -0
  412. package/src/integration/RSUPostRestartProgress.ts +359 -0
  413. package/src/integration/RSUProgressBridge.ts +85 -2
  414. package/src/integration/RunArtifactAuthorization.ts +65 -0
  415. package/src/integration/SchemaRefreshLaunch.ts +12 -2
  416. package/src/integration/ScopedFieldsForBuild.ts +113 -0
  417. package/src/integration/TargetConfigGuard.ts +71 -0
  418. package/src/logging/StartupLogger.ts +24 -0
  419. package/src/middleware/BaseServerMiddleware.ts +20 -3
  420. package/src/realtimeSessions/ownedRealtimeSession.ts +2 -6
  421. package/src/realtimeSessions/sessionAccess.ts +30 -0
  422. package/src/realtimeWidget/WidgetSessionService.ts +2 -0
  423. package/src/realtimeWidget/visitorIdentity.ts +1 -0
  424. package/src/realtimeWidget/widgetCore.ts +4 -8
  425. package/src/realtimeWidget/widgetGuestElevation.ts +1 -0
  426. package/src/requestOrigin.ts +64 -0
  427. package/src/resolvers/AgentRunStatusPublisher.ts +27 -2
  428. package/src/resolvers/AgentSessionResolver.ts +6 -2
  429. package/src/resolvers/AutotagPipelineResolver.ts +59 -14
  430. package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
  431. package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
  432. package/src/resolvers/GetDataResolver.ts +35 -13
  433. package/src/resolvers/InfoResolver.ts +1 -1
  434. package/src/resolvers/IntegrationDiscoveryResolver.ts +1522 -203
  435. package/src/resolvers/MCPResolver.ts +15 -2
  436. package/src/resolvers/QuerySystemUserResolver.ts +211 -100
  437. package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
  438. package/src/resolvers/RealtimeClientSessionResolver.ts +40 -7
  439. package/src/resolvers/RemoteBrowserActionResolver.ts +242 -32
  440. package/src/resolvers/RunAIAgentResolver.ts +265 -86
  441. package/src/resolvers/RunAIPromptResolver.ts +18 -18
  442. package/src/resolvers/RunTemplateResolver.ts +3 -1
  443. package/src/resolvers/SqlLoggingConfigResolver.ts +7 -9
  444. package/src/resolvers/TagGovernanceResolver.ts +65 -0
  445. package/src/resolvers/TelemetryResolver.ts +44 -9
  446. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
  447. package/src/resolvers/meetingRecordingRegistration.ts +2 -0
  448. package/src/resolvers/meetings/meetingMutations.ts +37 -7
  449. package/src/rest/MediaAccessKeys.ts +6 -2
  450. package/src/rest/OAuthCallbackHandler.ts +13 -5
  451. package/src/rest/RealtimeRecordingHandler.ts +5 -9
  452. package/src/rest/ViewOperationsHandler.ts +2 -1
  453. package/src/rest/setupRESTEndpoints.ts +11 -2
  454. package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
  455. package/src/services/TaskGraphActionRunner.ts +2 -23
  456. package/src/services/TaskGraphAgentRunner.ts +43 -0
  457. package/src/services/TaskGraphContinuationDeliverer.ts +1 -0
  458. package/src/services/WorkQueueHostService.ts +26 -4
  459. package/src/services/workQueueConfig.ts +5 -5
  460. package/src/sharedCache.ts +1 -1
  461. package/src/types.ts +18 -0
  462. package/src/util.ts +55 -3
  463. package/src/services/TaskOrchestration-Integration.md +0 -188
@@ -0,0 +1,323 @@
1
+ /**
2
+ * @fileoverview The second half of an RSU run's progress stream — the half that happens in a
3
+ * different process from the first.
4
+ *
5
+ * The RSU pipeline restarts the API as one of its own steps. Everything after that restart —
6
+ * creating the entity maps and field maps, then starting the first sync — runs in the NEW process,
7
+ * from the durable pending-work queue. Until now none of it was observable: the pre-restart process
8
+ * died mid-run, so its emitter never wrote a terminal result and the run stayed flagged in-flight
9
+ * forever, while the post-restart work reported nothing at all. A client watching the setup journey
10
+ * saw the stream stop at "restart instance" and had no way to learn whether the connector ever
11
+ * became live.
12
+ *
13
+ * This module re-attaches to that same run and finishes it. Re-attaching (rather than opening a new
14
+ * run) is the entire point: the tail API returns strictly `seq > cursor`, and a fresh emitter
15
+ * restarts its sequence at 1 — so a brand-new run's events would sort BELOW the cursor of every
16
+ * client already tailing, permanently invisible to them, while the resolver echoed their unchanged
17
+ * cursor back and they polled forever receiving nothing.
18
+ *
19
+ * Correlation is by MANIFEST, not by checkpoint. The manifest is written when the run opens, minutes
20
+ * before the restart; the checkpoint is written in the last moments before the kill signal. Keying
21
+ * off the durable artifact and treating the checkpoint as enrichment means a lost checkpoint costs
22
+ * step numbers, not the whole re-attachment.
23
+ */
24
+ import { IntegrationProgressEmitter, IntegrationProgressReader, IntegrationRunResumeError, SweepInterruptedRuns, } from '@memberjunction/integration-progress-artifacts';
25
+ import { RuntimeSchemaManager } from '@memberjunction/schema-engine';
26
+ import { LogError, LogStatus } from '@memberjunction/core';
27
+ import { RESTART_STAGE } from './RSUProgressBridge.js';
28
+ /** The two stages this module owns, in order. Named by the pipeline so the halves cannot drift. */
29
+ const [ENTITY_MAPS_STAGE, START_SYNC_STAGE] = RuntimeSchemaManager.EXPECTED_STEPS_POST_RESTART;
30
+ /**
31
+ * How many in-flight RSU runs to consider for a single connection before giving up.
32
+ *
33
+ * More than one can exist only when an earlier run's post-restart work never completed (its process
34
+ * died again, or its pending-work rows were consumed on a boot that then crashed). The newest is the
35
+ * one this pending-work item belongs to; the window is small so a pathological backlog cannot turn
36
+ * one item's re-attachment into a directory scan of the whole run history.
37
+ */
38
+ const CANDIDATE_RUN_WINDOW = 25;
39
+ /**
40
+ * One re-attached RSU run. Emits the two post-restart stages into the run the pre-restart process
41
+ * opened, and terminates it exactly once.
42
+ *
43
+ * Obtained from {@link RSUPostRestartProgressSession}, never constructed directly — the session is
44
+ * what guarantees a run is attached (and terminated) once even when several pending-work items in
45
+ * one sweep belong to the same batch.
46
+ */
47
+ export class RSUPostRestartProgress {
48
+ /** @internal — use {@link RSUPostRestartProgressSession.For}. */
49
+ constructor(emitter, position) {
50
+ this.emitter = emitter;
51
+ this.position = position;
52
+ this.entityMapsOpen = false;
53
+ this.syncOpen = false;
54
+ this.failed = false;
55
+ this.failures = [];
56
+ }
57
+ /** The run being continued, so a caller can log or hand it to a client. */
58
+ get RunID() {
59
+ return this.emitter.RunID;
60
+ }
61
+ /**
62
+ * "step 12 of 14" for a post-restart step, or undefined when the checkpoint did not survive.
63
+ *
64
+ * `offset` is the step's position AFTER `RestartMJAPI` (1 for CreateEntityMaps, 2 for StartSync).
65
+ * Derived from the checkpoint rather than recomputed, because the pipeline skips steps
66
+ * conditionally (`SkipGitCommit`) and a recomputed index would disagree with the one the client
67
+ * has already been shown.
68
+ */
69
+ positionLabel(offset) {
70
+ const { stepIndex, stepTotal } = this.position;
71
+ if (stepIndex == null || stepTotal == null)
72
+ return undefined;
73
+ return `step ${stepIndex + offset} of ${stepTotal}`;
74
+ }
75
+ /** Opens the `CreateEntityMaps` stage for one pending-work item. */
76
+ BeginEntityMaps(objectCount) {
77
+ this.emitter.stageStart(ENTITY_MAPS_STAGE, this.positionLabel(1));
78
+ this.entityMapsOpen = true;
79
+ this.emitter.heartbeat(ENTITY_MAPS_STAGE, `Mapping ${objectCount} object(s)`, { processed: 0, totalKnown: objectCount });
80
+ }
81
+ /**
82
+ * Reports one object's entity map + field maps as done.
83
+ *
84
+ * A heartbeat rather than a `records.batch.complete`: heartbeat counts are explicitly excluded
85
+ * from the run's applied aggregate, so per-object liveness cannot double-count against the
86
+ * stage rollup that follows.
87
+ */
88
+ ObjectMapped(objectName, processed, totalKnown) {
89
+ this.emitter.heartbeat(ENTITY_MAPS_STAGE, `Mapped ${objectName} (${processed}/${totalKnown})`, { processed, totalKnown });
90
+ }
91
+ /**
92
+ * Closes `CreateEntityMaps` with the applied quartet, in OBJECTS.
93
+ *
94
+ * The run's aggregate is in objects, not migrations, for a resumed run: the migration quartet is
95
+ * emitted by `run.end`, which a restarting run by definition never reaches. Emitting both here
96
+ * would sum two different units into one number (2 migrations + 12 objects reported as
97
+ * "processed: 14"), so the migration counts stay in the terminal message instead.
98
+ */
99
+ CompleteEntityMaps(processed, succeeded, failed) {
100
+ if (!this.entityMapsOpen)
101
+ return;
102
+ this.entityMapsOpen = false;
103
+ this.emitter.stageComplete(ENTITY_MAPS_STAGE, { processed, succeeded, failed, totalKnown: processed });
104
+ }
105
+ /**
106
+ * Closes `CreateEntityMaps` as an ERROR, naming the objects that were never mapped.
107
+ *
108
+ * Naming them is the requirement, not a nicety: when this half fails, those objects have tables
109
+ * in the database and no way to sync into them, and the operator's only signal that something
110
+ * needs re-applying is this message.
111
+ */
112
+ FailEntityMaps(message, unmappedObjects) {
113
+ this.entityMapsOpen = false;
114
+ this.failed = true;
115
+ const named = unmappedObjects.length > 0
116
+ ? ` Objects never mapped: ${unmappedObjects.slice(0, 20).join(', ')}${unmappedObjects.length > 20 ? ` (+${unmappedObjects.length - 20} more)` : ''}.`
117
+ : '';
118
+ const full = `${message}${named}`;
119
+ this.failures.push(full);
120
+ this.emitter.stageError(ENTITY_MAPS_STAGE, full, {
121
+ code: 'RSU_POST_RESTART_ENTITY_MAPS_FAILED',
122
+ unmappedObjects,
123
+ });
124
+ }
125
+ /** Opens the `StartSync` stage. */
126
+ BeginStartSync() {
127
+ this.emitter.stageStart(START_SYNC_STAGE, this.positionLabel(2));
128
+ this.syncOpen = true;
129
+ }
130
+ /**
131
+ * Closes `StartSync`, carrying the sync run's ID so a client can hop from this stream to the
132
+ * sync's own.
133
+ *
134
+ * Deliberately carries NO `counts`: the records belong to the sync run, and counting them here
135
+ * would add another unit to this run's aggregate. `syncRunID` may be null when the sync was
136
+ * launched but its run row was not yet readable — the stage still completes, because the sync
137
+ * did start; the client simply has to find the run itself.
138
+ */
139
+ CompleteStartSync(syncRunID) {
140
+ if (!this.syncOpen)
141
+ return;
142
+ this.syncOpen = false;
143
+ this.emitter.emit('stage.complete', {
144
+ stage: START_SYNC_STAGE,
145
+ level: 'info',
146
+ message: syncRunID ? `Sync started — run ${syncRunID}` : 'Sync started',
147
+ data: { syncRunID },
148
+ });
149
+ }
150
+ /** Closes `StartSync` as skipped — the caller asked for no initial sync. */
151
+ SkipStartSync(reason) {
152
+ if (!this.syncOpen)
153
+ return;
154
+ this.syncOpen = false;
155
+ this.emitter.emit('stage.complete', {
156
+ stage: START_SYNC_STAGE,
157
+ level: 'info',
158
+ message: `Sync not started — ${reason}`,
159
+ data: { syncRunID: null, skipped: true, reason },
160
+ });
161
+ }
162
+ /** Closes `StartSync` as an error — the sync could not be launched. */
163
+ FailStartSync(message) {
164
+ this.syncOpen = false;
165
+ this.failed = true;
166
+ this.failures.push(message);
167
+ this.emitter.stageError(START_SYNC_STAGE, message, { code: 'RSU_POST_RESTART_SYNC_START_FAILED' });
168
+ }
169
+ /** Records a failure that happened outside either stage (connector resolution, for example). */
170
+ RecordFailure(stage, message) {
171
+ this.failed = true;
172
+ this.failures.push(message);
173
+ this.emitter.stageError(stage, message, { code: 'RSU_POST_RESTART_FAILED' });
174
+ }
175
+ /**
176
+ * Terminates the run. Idempotent — the emitter refuses a second terminal write, and the result
177
+ * file is created-not-truncated, so a duplicate call cannot rewrite an outcome a client has
178
+ * already read.
179
+ */
180
+ async Finish() {
181
+ // An unclosed stage would leave a client's stepper stuck on it forever; a run must never end
182
+ // with a stage still open.
183
+ if (this.entityMapsOpen)
184
+ this.FailEntityMaps('Post-restart processing ended with entity-map creation still open', []);
185
+ if (this.syncOpen)
186
+ this.FailStartSync('Post-restart processing ended with sync start still open');
187
+ if (this.failed) {
188
+ await this.emitter.fail(`RSU post-restart work failed — ${this.failures.join(' | ')}`, 'rsu-post-restart-failed');
189
+ }
190
+ else {
191
+ await this.emitter.complete('RSU pipeline complete — entity maps created and sync started');
192
+ }
193
+ }
194
+ }
195
+ /**
196
+ * Owns the re-attachments for ONE pass of the post-restart pending-work queue.
197
+ *
198
+ * A single RSU batch registers one pending-work row per input, so several rows in one sweep can
199
+ * belong to the same run. Attaching per row would try to resume — and terminate — the same run
200
+ * repeatedly; the second attempt would be refused as already-terminal and its work would go
201
+ * unreported. Memoizing by run ID makes the run's stream a single coherent continuation, with one
202
+ * `run.resumed` at the top and one terminal event at the bottom.
203
+ */
204
+ export class RSUPostRestartProgressSession {
205
+ /**
206
+ * Every run any session in this process re-attached to. Process-wide on purpose: the startup
207
+ * sweep that left restart-killed runs in flight and the pass that resumes them live in
208
+ * different places, and the one question that joins them — "did anything pick this run up?" —
209
+ * must survive the resuming pass throwing halfway.
210
+ */
211
+ static { this.attachedRunIDs = new Set(); }
212
+ static get AttachedRunIDs() {
213
+ return RSUPostRestartProgressSession.attachedRunIDs;
214
+ }
215
+ constructor(emitterOptions = {}) {
216
+ this.emitterOptions = emitterOptions;
217
+ this.byRunID = new Map();
218
+ this.byCompanyIntegrationID = new Map();
219
+ }
220
+ /**
221
+ * The continuation handle for a connection's RSU run, or null when there is nothing to continue
222
+ * (no in-flight run for that connection, or it was already finished).
223
+ *
224
+ * Null is a normal outcome, not an error: pending work can legitimately be processed on a boot
225
+ * whose run artifact has been pruned, or after a retry that already closed the run. The caller
226
+ * does its work either way — progress reporting never gates the work itself.
227
+ */
228
+ async For(companyIntegrationID) {
229
+ const cached = this.byCompanyIntegrationID.get(companyIntegrationID);
230
+ if (cached !== undefined)
231
+ return cached;
232
+ const attached = await this.attach(companyIntegrationID);
233
+ this.byCompanyIntegrationID.set(companyIntegrationID, attached);
234
+ return attached;
235
+ }
236
+ /** Terminates every run this session re-attached to. Safe to call more than once. */
237
+ async FinishAll() {
238
+ for (const progress of this.byRunID.values()) {
239
+ await progress.Finish().catch(err => LogError(`[RSU] post-restart terminal write failed for run ${progress.RunID}: ${err}`));
240
+ }
241
+ }
242
+ async attach(companyIntegrationID) {
243
+ try {
244
+ const reader = new IntegrationProgressReader(this.emitterOptions.rootDir);
245
+ const candidates = await reader.ListRuns({ runKind: 'RSU', companyIntegrationID, inFlightOnly: true }, CANDIDATE_RUN_WINDOW);
246
+ // A run this session already picked up no longer LOOKS killed-at-the-restart — its latest
247
+ // event is now the `run.resumed` this session wrote. So an already-attached run must be
248
+ // matched first, or the second pending-work item of the same batch would find nothing to
249
+ // report into and its work would go unobserved.
250
+ const snapshot = candidates.find(s => this.byRunID.has(s.manifest.runID))
251
+ ?? candidates.find(RSUPostRestartProgressSession.WasKilledAtRestart);
252
+ if (!snapshot)
253
+ return null;
254
+ const runID = snapshot.manifest.runID;
255
+ const existing = this.byRunID.get(runID);
256
+ if (existing)
257
+ return existing;
258
+ const checkpoint = await reader.LatestCheckpoint(runID);
259
+ const emitter = await IntegrationProgressEmitter.Resume(runID, this.emitterOptions);
260
+ emitter.RunResumed(`Resumed after the RSU restart — continuing with ${RuntimeSchemaManager.EXPECTED_STEPS_POST_RESTART.join(' then ')}`, { companyIntegrationID });
261
+ const progress = new RSUPostRestartProgress(emitter, RSUPostRestartProgressSession.PositionFrom(checkpoint));
262
+ this.byRunID.set(runID, progress);
263
+ RSUPostRestartProgressSession.attachedRunIDs.add(runID);
264
+ LogStatus(`[RSU] Re-attached to run ${runID} for connection ${companyIntegrationID}`);
265
+ return progress;
266
+ }
267
+ catch (err) {
268
+ // A run that is already terminal, or has no manifest, is not an error condition worth
269
+ // failing the actual work over — the work still has to happen, unobserved.
270
+ if (err instanceof IntegrationRunResumeError) {
271
+ LogStatus(`[RSU] Not resuming progress for ${companyIntegrationID}: ${err.message}`);
272
+ return null;
273
+ }
274
+ LogError(`[RSU] Could not re-attach progress for ${companyIntegrationID}: ${err instanceof Error ? err.message : String(err)}`);
275
+ return null;
276
+ }
277
+ }
278
+ /**
279
+ * Whether a run's stream stops at the restart — which is the signature of a run this process is
280
+ * the continuation of.
281
+ *
282
+ * Checking the LAST stage, not the presence of the checkpoint, on purpose. The checkpoint is
283
+ * written in the moments before the kill signal and can be lost; the `stage.start RestartMJAPI`
284
+ * that precedes it cannot, because the pipeline waits on nothing between emitting it and dying.
285
+ * Requiring the checkpoint would trade a recoverable loss of step numbers for an unrecoverable
286
+ * loss of the whole continuation.
287
+ */
288
+ static WasKilledAtRestart(snapshot) {
289
+ return snapshot.latestEvent?.stage === RESTART_STAGE;
290
+ }
291
+ /**
292
+ * Closes out the restart-killed runs the startup sweep left in flight that NO session then
293
+ * re-attached to — because there was no system user, or the pending work was stale and
294
+ * dropped, or it simply failed before reaching the run. Without this they would read as in
295
+ * flight forever, which is the state the sweep exists to end.
296
+ *
297
+ * Only the runs in `leftInFlight` (the sweep's `Skipped` list) are candidates: anything else
298
+ * in flight by now may be a run this process started, and is not ours to judge. A candidate
299
+ * a session attached to is live — its session terminates it — and is left alone.
300
+ */
301
+ static async SweepUnattached(leftInFlight, rootDir, log = () => { }) {
302
+ if (leftInFlight.length === 0)
303
+ return { Swept: [], Failed: [], Skipped: [] };
304
+ const candidates = new Set(leftInFlight);
305
+ return SweepInterruptedRuns(rootDir, log, snapshot => {
306
+ const runID = snapshot.manifest.runID;
307
+ return !candidates.has(runID) || RSUPostRestartProgressSession.attachedRunIDs.has(runID);
308
+ });
309
+ }
310
+ /** Reads the step position out of a restart checkpoint, tolerating a missing or partial one. */
311
+ static PositionFrom(checkpoint) {
312
+ const state = checkpoint?.stage === RESTART_STAGE ? checkpoint.resumableState : undefined;
313
+ if (!state)
314
+ return {};
315
+ const stepIndex = state.stepIndex;
316
+ const stepTotal = state.stepTotal;
317
+ return {
318
+ stepIndex: typeof stepIndex === 'number' ? stepIndex : undefined,
319
+ stepTotal: typeof stepTotal === 'number' ? stepTotal : undefined,
320
+ };
321
+ }
322
+ }
323
+ //# sourceMappingURL=RSUPostRestartProgress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RSUPostRestartProgress.js","sourceRoot":"","sources":["../../src/integration/RSUPostRestartProgress.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  import type { EmitterOptions } from '@memberjunction/integration-progress-artifacts';
2
2
  import type { RSUObserverEvent } from '@memberjunction/schema-engine';
3
3
  import { BaseSingleton } from '@memberjunction/global';
4
+ /**
5
+ * The pipeline step that kills this process. Named here because BOTH sides of the restart use it:
6
+ * this bridge closes the stage and checkpoints under it, and the post-restart consumer recognises a
7
+ * run as resumable by finding it as the run's last stage.
8
+ */
9
+ export declare const RESTART_STAGE = "RestartMJAPI";
4
10
  /**
5
11
  * Owns one emitter per RSU pipeline run and translates observer events into progress events.
6
12
  *
@@ -20,6 +26,15 @@ export declare class RSUProgressBridge extends BaseSingleton<RSUProgressBridge>
20
26
  private currentRunID;
21
27
  /** Liveness timer for the step currently in flight — see {@link HEARTBEAT_INTERVAL_MS}. */
22
28
  private heartbeat;
29
+ /**
30
+ * The stage the live heartbeat belongs to, held on the INSTANCE rather than only captured in
31
+ * the timer closure. A closure-only stage name is a leak waiting to happen: a timer that
32
+ * outlives its step (or its whole run) keeps firing with the name it was created with, and
33
+ * writes that stale name into whatever emitter the bridge is pointing at by then. Comparing the
34
+ * tick's captured name against this field makes that structurally impossible — a stopped or
35
+ * superseded heartbeat writes nothing.
36
+ */
37
+ private heartbeatStage;
23
38
  private emitterOptions;
24
39
  /** The one bridge for this process. */
25
40
  static get Instance(): RSUProgressBridge;
@@ -48,8 +63,32 @@ export declare class RSUProgressBridge extends BaseSingleton<RSUProgressBridge>
48
63
  * leaking an interval that keeps the process alive.
49
64
  */
50
65
  Reset(): void;
51
- /** The observer to hand to {@link RuntimeSchemaManager.PipelineObserver}. */
52
- readonly Observe: (event: RSUObserverEvent) => void;
66
+ /**
67
+ * The observer to hand to {@link RuntimeSchemaManager.PipelineObserver}.
68
+ *
69
+ * Returns a promise ONLY for `restart.pending` — the pipeline awaits that one (bounded) because
70
+ * the process is about to be killed and an unflushed write would be lost. Every other event
71
+ * stays fire-and-forget.
72
+ */
73
+ readonly Observe: (event: RSUObserverEvent) => void | Promise<void>;
74
+ /**
75
+ * Closes the `RestartMJAPI` stage and writes the checkpoint the next process re-attaches from,
76
+ * then FLUSHES — the caller awaits this, and pm2 kills the process moments later.
77
+ *
78
+ * Two separate things are written here, and they matter for different reasons:
79
+ *
80
+ * - the `stage.complete` for `RestartMJAPI`, because `step.end` for that step is unreachable
81
+ * (the process dies inside the step), so without it the stream ends on an open stage and a
82
+ * determinate stepper stalls one short of the restart;
83
+ * - the `checkpoint`, carrying the step position and the pending-work correlation, so the
84
+ * consumer on the other side can resume the stepper where this process left it.
85
+ *
86
+ * The checkpoint is deliberately NOT the consumer's only way back to this run. Re-attachment
87
+ * keys off the MANIFEST — written minutes earlier, when the run opened — precisely because this
88
+ * write is the one racing a kill signal. If it is lost the run is still found and still
89
+ * resumed; only the step indices degrade to defaults.
90
+ */
91
+ private onRestartPending;
53
92
  private onRunStart;
54
93
  private onStepStart;
55
94
  private onStepEnd;
@@ -1 +1 @@
1
- {"version":3,"file":"RSUProgressBridge.d.ts","sourceRoot":"","sources":["../../src/integration/RSUProgressBridge.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAErF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAevD;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAkB,SAAQ,aAAa,CAAC,iBAAiB,CAAC;IACnE,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,YAAY,CAAuB;IAC3C,2FAA2F;IAC3F,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,cAAc,CAAsB;IAE5C,uCAAuC;IACvC,WAAkB,QAAQ,IAAI,iBAAiB,CAE9C;IAED;;;;;;;;;OASG;IACI,SAAS,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI;IAItD;;;;OAIG;IACH,IAAW,YAAY,IAAI,MAAM,GAAG,IAAI,CAEvC;IAED;;;;;;OAMG;IACI,KAAK,IAAI,IAAI;IAMpB,6EAA6E;IAC7E,SAAgB,OAAO,GAAI,OAAO,gBAAgB,KAAG,IAAI,CAWvD;IAEF,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,QAAQ;IA4BhB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAWtB,mEAAmE;IACnE,OAAO,CAAC,aAAa;IAMrB,kFAAkF;IAClF,OAAO,CAAC,YAAY;IASpB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAIxB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,cAAc,GAAE,cAAmB,GAAG,iBAAiB,CAKhG"}
1
+ {"version":3,"file":"RSUProgressBridge.d.ts","sourceRoot":"","sources":["../../src/integration/RSUProgressBridge.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAErF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKvD;;;;GAIG;AACH,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAY5C;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAkB,SAAQ,aAAa,CAAC,iBAAiB,CAAC;IACnE,OAAO,CAAC,OAAO,CAA2C;IAC1D,OAAO,CAAC,YAAY,CAAuB;IAC3C,2FAA2F;IAC3F,OAAO,CAAC,SAAS,CAA+C;IAChE;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAsB;IAE5C,uCAAuC;IACvC,WAAkB,QAAQ,IAAI,iBAAiB,CAE9C;IAED;;;;;;;;;OASG;IACI,SAAS,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI;IAItD;;;;OAIG;IACH,IAAW,YAAY,IAAI,MAAM,GAAG,IAAI,CAEvC;IAED;;;;;;OAMG;IACI,KAAK,IAAI,IAAI;IAMpB;;;;;;OAMG;IACH,SAAgB,OAAO,GAAI,OAAO,gBAAgB,KAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAavE;IAEF;;;;;;;;;;;;;;;;OAgBG;YACW,gBAAgB;IAmB9B,OAAO,CAAC,UAAU;IA0ClB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,QAAQ;IA4BhB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAgBtB,mEAAmE;IACnE,OAAO,CAAC,aAAa;IAUrB,kFAAkF;IAClF,OAAO,CAAC,YAAY;IASpB;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAIxB;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,cAAc,GAAE,cAAmB,GAAG,iBAAiB,CAKhG"}
@@ -20,6 +20,12 @@ import { LogError } from '@memberjunction/core';
20
20
  import { BaseSingleton } from '@memberjunction/global';
21
21
  /** The emitter stage name used for run-level (non-step) events. */
22
22
  const RUN_STAGE = 'RSUPipeline';
23
+ /**
24
+ * The pipeline step that kills this process. Named here because BOTH sides of the restart use it:
25
+ * this bridge closes the stage and checkpoints under it, and the post-restart consumer recognises a
26
+ * run as resumable by finding it as the run's last stage.
27
+ */
28
+ export const RESTART_STAGE = 'RestartMJAPI';
23
29
  /**
24
30
  * How often an in-flight step reports that it is still alive.
25
31
  *
@@ -50,8 +56,23 @@ export class RSUProgressBridge extends BaseSingleton {
50
56
  this.currentRunID = null;
51
57
  /** Liveness timer for the step currently in flight — see {@link HEARTBEAT_INTERVAL_MS}. */
52
58
  this.heartbeat = null;
59
+ /**
60
+ * The stage the live heartbeat belongs to, held on the INSTANCE rather than only captured in
61
+ * the timer closure. A closure-only stage name is a leak waiting to happen: a timer that
62
+ * outlives its step (or its whole run) keeps firing with the name it was created with, and
63
+ * writes that stale name into whatever emitter the bridge is pointing at by then. Comparing the
64
+ * tick's captured name against this field makes that structurally impossible — a stopped or
65
+ * superseded heartbeat writes nothing.
66
+ */
67
+ this.heartbeatStage = null;
53
68
  this.emitterOptions = {};
54
- /** The observer to hand to {@link RuntimeSchemaManager.PipelineObserver}. */
69
+ /**
70
+ * The observer to hand to {@link RuntimeSchemaManager.PipelineObserver}.
71
+ *
72
+ * Returns a promise ONLY for `restart.pending` — the pipeline awaits that one (bounded) because
73
+ * the process is about to be killed and an unflushed write would be lost. Every other event
74
+ * stays fire-and-forget.
75
+ */
55
76
  this.Observe = (event) => {
56
77
  switch (event.Kind) {
57
78
  case 'run.start':
@@ -60,6 +81,8 @@ export class RSUProgressBridge extends BaseSingleton {
60
81
  return this.onStepStart(event);
61
82
  case 'step.end':
62
83
  return this.onStepEnd(event);
84
+ case 'restart.pending':
85
+ return this.onRestartPending(event);
63
86
  case 'run.end':
64
87
  return this.onRunEnd(event);
65
88
  }
@@ -102,18 +125,68 @@ export class RSUProgressBridge extends BaseSingleton {
102
125
  this.emitter = null;
103
126
  this.currentRunID = null;
104
127
  }
128
+ /**
129
+ * Closes the `RestartMJAPI` stage and writes the checkpoint the next process re-attaches from,
130
+ * then FLUSHES — the caller awaits this, and pm2 kills the process moments later.
131
+ *
132
+ * Two separate things are written here, and they matter for different reasons:
133
+ *
134
+ * - the `stage.complete` for `RestartMJAPI`, because `step.end` for that step is unreachable
135
+ * (the process dies inside the step), so without it the stream ends on an open stage and a
136
+ * determinate stepper stalls one short of the restart;
137
+ * - the `checkpoint`, carrying the step position and the pending-work correlation, so the
138
+ * consumer on the other side can resume the stepper where this process left it.
139
+ *
140
+ * The checkpoint is deliberately NOT the consumer's only way back to this run. Re-attachment
141
+ * keys off the MANIFEST — written minutes earlier, when the run opened — precisely because this
142
+ * write is the one racing a kill signal. If it is lost the run is still found and still
143
+ * resumed; only the step indices degrade to defaults.
144
+ */
145
+ async onRestartPending(event) {
146
+ this.stopHeartbeat();
147
+ const emitter = this.emitter;
148
+ if (!emitter)
149
+ return;
150
+ emitter.stageComplete(RESTART_STAGE);
151
+ emitter.checkpoint(RESTART_STAGE, {
152
+ runID: emitter.RunID,
153
+ remainingSteps: event.RemainingSteps,
154
+ stepIndex: event.StepIndex,
155
+ stepTotal: event.StepTotal,
156
+ companyIntegrationIDs: event.CompanyIntegrationIDs,
157
+ pendingWorkIDs: event.PendingWorkIDs,
158
+ migrationTotalCount: event.TotalCount,
159
+ migrationSuccessCount: event.SuccessCount,
160
+ });
161
+ // A failed flush must not stop the restart — the pipeline swallows this, but say so.
162
+ await emitter.flush().catch(err => LogError(`RSUProgressBridge: pre-restart flush failed — ${err}`));
163
+ }
105
164
  onRunStart(event) {
165
+ // Unconditional, and BEFORE the emitter check below. Stopping the previous run's liveness
166
+ // timer must not be reachable only via `closeCurrent`, whose call is gated on there being
167
+ // an emitter — that gate is the one path on which a live heartbeat could survive into the
168
+ // next run and stamp the previous run's stage name onto it.
169
+ this.stopHeartbeat();
106
170
  // A retry re-enters RunPipelineBatch, so it legitimately starts a NEW run. If a previous
107
171
  // emitter is still open (a throw escaped before run.end), close it rather than leak it.
108
172
  if (this.emitter)
109
173
  this.closeCurrent('Superseded by a new RSU run');
110
174
  const runID = IntegrationProgressEmitter.newRunID('rsu');
111
175
  this.currentRunID = runID;
176
+ const companyIntegrationIDs = event.CompanyIntegrationIDs ?? [];
112
177
  this.emitter = new IntegrationProgressEmitter({
113
178
  runID,
114
179
  runKind: 'RSU',
115
180
  triggerType: 'Pipeline',
116
181
  startedAt: new Date().toISOString(),
182
+ // The run's IDENTITY, and the reason an RSU run is readable over the API at all: the
183
+ // run-artifact authorization check tests the caller against the connections on the
184
+ // manifest, and an RSU manifest never carried any. The plural field is the whole set
185
+ // (a batch may span connections); the singular one is populated ONLY for a
186
+ // single-connection run, so everything that reports "the" connection of a run keeps
187
+ // reporting one unambiguous answer rather than an arbitrary member of a set.
188
+ companyIntegrationIDs,
189
+ companyIntegrationID: companyIntegrationIDs.length === 1 ? companyIntegrationIDs[0] : undefined,
117
190
  context: {
118
191
  itemCount: event.ItemCount,
119
192
  descriptions: event.Descriptions,
@@ -178,7 +251,13 @@ export class RSUProgressBridge extends BaseSingleton {
178
251
  startHeartbeat(stage) {
179
252
  this.stopHeartbeat();
180
253
  const startedAt = Date.now();
254
+ this.heartbeatStage = stage;
181
255
  this.heartbeat = setInterval(() => {
256
+ // Guard on the INSTANCE's current stage, not just the captured one. A tick that fires
257
+ // after the heartbeat was stopped, or after a different step/run took over, must not
258
+ // write this step's name into someone else's stream.
259
+ if (this.heartbeatStage !== stage)
260
+ return;
182
261
  const elapsedSec = Math.round((Date.now() - startedAt) / 1000);
183
262
  this.emitter?.heartbeat(stage, `${stage} still running — ${elapsedSec}s elapsed`);
184
263
  }, HEARTBEAT_INTERVAL_MS);
@@ -187,6 +266,10 @@ export class RSUProgressBridge extends BaseSingleton {
187
266
  }
188
267
  /** Stops the liveness timer. Safe to call when none is running. */
189
268
  stopHeartbeat() {
269
+ // Deliberately unconditional on the stage: clearing the name is what disarms a tick that is
270
+ // already queued on the event loop, so it must happen even when there is no timer handle
271
+ // left to clear.
272
+ this.heartbeatStage = null;
190
273
  if (!this.heartbeat)
191
274
  return;
192
275
  clearInterval(this.heartbeat);
@@ -1 +1 @@
1
- {"version":3,"file":"RSUProgressBridge.js","sourceRoot":"","sources":["../../src/integration/RSUProgressBridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RSUProgressBridge.js","sourceRoot":"","sources":["../../src/integration/RSUProgressBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { IntegrationRunManifest } from '@memberjunction/integration-progress-artifacts';
2
+ /**
3
+ * Answers "may the calling user read this one connection?".
4
+ *
5
+ * Supplied by the resolver, which implements it as a `RunView` on `MJ: Company Integrations` under
6
+ * the CALLER's context — so the data provider applies the same row-level security it applies to
7
+ * every other user-context read, and no row coming back means unauthorized.
8
+ */
9
+ export type CompanyIntegrationReadCheck = (companyIntegrationID: string) => Promise<boolean>;
10
+ /** The verdict, carrying the connection that blocked it so a denial can name it. */
11
+ export interface RunArtifactAuthorizationResult {
12
+ Authorized: boolean;
13
+ /** The first connection the caller could not read. Absent when the run has no identity at all. */
14
+ DeniedCompanyIntegrationID?: string;
15
+ }
16
+ /**
17
+ * Authorizes a caller for a run artifact against EVERY connection the run touched.
18
+ *
19
+ * ── The rule ───────────────────────────────────────────────────────────────────────────────────
20
+ * A run is readable only if the caller is authorized for ALL of its connections. Not any — all.
21
+ *
22
+ * Most runs touch exactly one connection and the rule collapses to the obvious check. But a schema
23
+ * update (RSU) run is a BATCH: the pipeline takes N inputs, and those inputs may legitimately
24
+ * belong to different connectors. A run artifact is one undivided event stream — its migration
25
+ * descriptions, affected table names and error messages interleave every connection in the batch,
26
+ * and there is no mechanism to serve a caller a partial view of it. "Authorized for any one of
27
+ * them" would therefore hand connection A's schema-change descriptions to a user who only holds
28
+ * rights on connection B. AND is the only rule that cannot leak; a cross-tenant batch simply
29
+ * becomes readable to nobody but a caller holding rights to both, which is the correct conservative
30
+ * answer rather than a silent disclosure.
31
+ *
32
+ * A run with NO connection identity is denied: non-tenant-scoped artifacts are not exposed through
33
+ * the per-company endpoints, and that must not change as a side effect of runs gaining a set.
34
+ *
35
+ * Short-circuits on the first denial, so an unauthorized caller cannot use the number of permission
36
+ * lookups to probe which connections a run covers.
37
+ */
38
+ export declare function AuthorizeRunArtifact(manifest: IntegrationRunManifest, canReadCompanyIntegration: CompanyIntegrationReadCheck): Promise<RunArtifactAuthorizationResult>;
39
+ //# sourceMappingURL=RunArtifactAuthorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunArtifactAuthorization.d.ts","sourceRoot":"","sources":["../../src/integration/RunArtifactAuthorization.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAE7F;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,oBAAoB,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE7F,oFAAoF;AACpF,MAAM,WAAW,8BAA8B;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,kGAAkG;IAClG,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACvC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,oBAAoB,CACtC,QAAQ,EAAE,sBAAsB,EAChC,yBAAyB,EAAE,2BAA2B,GACvD,OAAO,CAAC,8BAA8B,CAAC,CAczC"}