@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,252 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { RunView, type DatabaseProviderBase, type UserInfo } from '@memberjunction/core';
3
+ import { CatalogIdentityKey, ClearRekeyedObjectData, DecideRekeyed, IdentityKeyFields } from '../integration/EntityMapLifecycle.js';
4
+
5
+ /**
6
+ * A connector upgrade can change what identifies a row. PheedLoop 1.4.6 makes Attendees
7
+ * `code + eventCode`, because the object is fetched once per event and an attendee at two events
8
+ * comes back twice carrying the same `code`.
9
+ *
10
+ * `ToExternalRecord` joins every IsPrimaryKey field with '|' in Sequence order, so both the
11
+ * MEMBERS and the ORDER are part of identity. These pin the two pure decisions that drive the
12
+ * evolution's clear-and-rebuild.
13
+ */
14
+ const f = (Name: string, IsPrimaryKey: boolean | null, Sequence: number | null) =>
15
+ ({ Name, IsPrimaryKey, Sequence });
16
+
17
+ describe('IdentityKeyFields', () => {
18
+ it('takes only key fields, in Sequence order — not declaration order', () => {
19
+ expect(IdentityKeyFields([
20
+ f('eventCode', true, 2),
21
+ f('is_checked_in', false, 3),
22
+ f('code', true, 1),
23
+ ])).toEqual(['code', 'eventCode']);
24
+ });
25
+
26
+ it('is empty when nothing is flagged', () => {
27
+ expect(IdentityKeyFields([f('a', false, 1), f('b', null, 2)])).toEqual([]);
28
+ });
29
+
30
+ it('treats a missing Sequence as 0 rather than dropping the field', () => {
31
+ expect(IdentityKeyFields([f('b', true, null), f('a', true, 1)])).toEqual(['b', 'a']);
32
+ });
33
+
34
+ it('does not mutate the caller array', () => {
35
+ const input = [f('z', true, 9), f('a', true, 1)];
36
+ IdentityKeyFields(input);
37
+ expect(input[0].Name).toBe('z');
38
+ });
39
+ });
40
+
41
+ describe('DecideRekeyed', () => {
42
+ it('a column joining the key is a re-key — the PheedLoop case', () => {
43
+ expect(DecideRekeyed(['code'], ['code', 'eventCode'])).toBe(true);
44
+ });
45
+
46
+ it('a column leaving the key is a re-key', () => {
47
+ expect(DecideRekeyed(['code', 'eventCode'], ['code'])).toBe(true);
48
+ });
49
+
50
+ it('the same columns in a different ORDER is a re-key — the identity string differs', () => {
51
+ expect(DecideRekeyed(['code', 'eventCode'], ['eventCode', 'code'])).toBe(true);
52
+ });
53
+
54
+ it('an unchanged key is not', () => {
55
+ expect(DecideRekeyed(['code', 'eventCode'], ['code', 'eventCode'])).toBe(false);
56
+ });
57
+
58
+ it('matches case-insensitively, as every catalog-to-map reconciliation does', () => {
59
+ expect(DecideRekeyed(['Code'], ['code'])).toBe(false);
60
+ });
61
+
62
+ // The guard that stops this from clearing the fleet. An empty BUILT key means the entity's
63
+ // fields could not be read, not that the table never had a key — and treating unknown as
64
+ // empty would re-key (and therefore WIPE) every table on a workspace whose metadata failed
65
+ // to load.
66
+ it('an unreadable built key is never a re-key, however different the catalog looks', () => {
67
+ expect(DecideRekeyed([], ['code', 'eventCode'])).toBe(false);
68
+ expect(DecideRekeyed([], [])).toBe(false);
69
+ });
70
+
71
+ it('a catalog that reports no key against a real built key IS a re-key', () => {
72
+ expect(DecideRekeyed(['code'], [])).toBe(true);
73
+ });
74
+
75
+ // The same guard on the catalog side. A refresh reading a per-connection object whose fields
76
+ // were never warmed got `[]`, and "no key" against a real built key cleared the object's
77
+ // record maps and rows on every refresh.
78
+ it('an unread catalog key is never a re-key', () => {
79
+ expect(DecideRekeyed(['code'], null)).toBe(false);
80
+ expect(DecideRekeyed(['code', 'eventCode'], CatalogIdentityKey([]))).toBe(false);
81
+ });
82
+ });
83
+
84
+ describe('CatalogIdentityKey', () => {
85
+ const row = (Name: string, IsPrimaryKey: boolean, Sequence: number, Status = 'Active') =>
86
+ ({ Name, IsPrimaryKey, Sequence, Status });
87
+
88
+ it('is null when no field row was read — a cold per-connection object answers []', () => {
89
+ expect(CatalogIdentityKey([])).toBeNull();
90
+ });
91
+
92
+ it('is null when no row is Active — nothing describes the object', () => {
93
+ expect(CatalogIdentityKey([row('code', true, 1, 'Inactive')])).toBeNull();
94
+ });
95
+
96
+ it('is the Active key fields in Sequence order', () => {
97
+ expect(CatalogIdentityKey([
98
+ row('eventCode', true, 2),
99
+ row('old_key', true, 0, 'Inactive'),
100
+ row('code', true, 1),
101
+ row('name', false, 3),
102
+ ])).toEqual(['code', 'eventCode']);
103
+ });
104
+
105
+ it('is [] when Active rows declare no key — read, and keyless, so still a re-key', () => {
106
+ const key = CatalogIdentityKey([row('name', false, 1)]);
107
+ expect(key).toEqual([]);
108
+ expect(DecideRekeyed(['code'], key)).toBe(true);
109
+ });
110
+ });
111
+
112
+ /**
113
+ * Two connections to the same vendor share one schema, so they share every entity table. The clear
114
+ * may only touch the rows THIS connection's record maps point at; the other connection's rows in
115
+ * the same table are not its to delete.
116
+ */
117
+ describe('ClearRekeyedObjectData', () => {
118
+ const USER = { ID: 'user-1' } as UserInfo;
119
+ const RECORD_MAPS = { Name: 'MJ: Company Integration Record Maps', SchemaName: '__mj', BaseTable: 'CompanyIntegrationRecordMap' };
120
+ const TARGET = { ExternalObjectName: 'attendees', EntityMapID: 'M1', EntityID: 'E1', SchemaName: 'pheedloop', BaseTable: 'attendees' };
121
+ type MapRow = { ID: string; EntityRecordID: string };
122
+ type RunViewParams = Parameters<RunView['RunView']>[0];
123
+ type RunViewResult = Awaited<ReturnType<RunView['RunView']>>;
124
+
125
+ /** A provider that records every statement and transaction step, in order. */
126
+ function fakeProvider(key: string[], failOn?: string) {
127
+ const log: string[] = [];
128
+ const provider = {
129
+ Dialect: {
130
+ QuoteIdentifier: (s: string) => `[${s}]`,
131
+ QuoteStringLiteral: (s: string) => `'${s.replace(/'/g, "''")}'`,
132
+ },
133
+ Entities: [RECORD_MAPS],
134
+ EntityByName: (name: string) => (name === RECORD_MAPS.Name ? RECORD_MAPS : undefined),
135
+ EntityByID: (id: string) => (id === 'E1' ? { PrimaryKeys: key.map(Name => ({ Name })) } : undefined),
136
+ ExecuteSQL: async (sql: string) => {
137
+ log.push(sql);
138
+ if (failOn && sql.includes(failOn)) throw new Error('deadlock victim');
139
+ return [];
140
+ },
141
+ BeginTransaction: async () => { log.push('BEGIN'); },
142
+ CommitTransaction: async () => { log.push('COMMIT'); },
143
+ RollbackTransaction: async () => { log.push('ROLLBACK'); },
144
+ };
145
+ return { provider: provider as unknown as DatabaseProviderBase, log };
146
+ }
147
+
148
+ let runView: ReturnType<typeof vi.spyOn>;
149
+ /** Answers the record-map reads one page at a time, then empty. */
150
+ function recordMapPages(...pages: MapRow[][]) {
151
+ for (const page of pages) {
152
+ runView.mockResolvedValueOnce({ Success: true, Results: page } as unknown as RunViewResult);
153
+ }
154
+ runView.mockResolvedValue({ Success: true, Results: [] } as unknown as RunViewResult);
155
+ }
156
+ const reads = () => runView.mock.calls.map(c => c[0] as RunViewParams);
157
+
158
+ beforeEach(() => { runView = vi.spyOn(RunView.prototype, 'RunView'); });
159
+ afterEach(() => { vi.restoreAllMocks(); });
160
+
161
+ it('deletes only the rows this connection\'s record maps point at — never the whole table', async () => {
162
+ const { provider, log } = fakeProvider(['ID']);
163
+ recordMapPages([{ ID: 'm1', EntityRecordID: 'r1' }, { ID: 'm2', EntityRecordID: 'r2' }]);
164
+
165
+ const cleared = await ClearRekeyedObjectData([TARGET], 'CI-A', USER, provider);
166
+
167
+ expect(cleared).toEqual(['attendees']);
168
+ expect(log).not.toContain('DELETE FROM [pheedloop].[attendees]');
169
+ expect(log).toContain("DELETE FROM [pheedloop].[attendees] WHERE [ID] IN ('r1','r2')");
170
+ expect(reads()[0].EntityName).toBe(RECORD_MAPS.Name);
171
+ expect(reads()[0].ExtraFilter).toBe("CompanyIntegrationID='CI-A' AND EntityID='E1'");
172
+ });
173
+
174
+ it('deletes the rows while their maps still say which rows they are, in one transaction with the maps', async () => {
175
+ const { provider, log } = fakeProvider(['ID']);
176
+ recordMapPages([{ ID: 'm1', EntityRecordID: 'r1' }]);
177
+
178
+ await ClearRekeyedObjectData([TARGET], 'CI-A', USER, provider);
179
+
180
+ expect(log).toEqual([
181
+ 'BEGIN',
182
+ "DELETE FROM [pheedloop].[attendees] WHERE [ID] IN ('r1')",
183
+ "DELETE FROM [__mj].[CompanyIntegrationRecordMap] WHERE [CompanyIntegrationID]='CI-A' AND [EntityID]='E1' AND [ID] IN ('m1')",
184
+ 'COMMIT',
185
+ ]);
186
+ });
187
+
188
+ it('matches every column of a composite key, split the way the engine joined it', async () => {
189
+ const { provider, log } = fakeProvider(['code', 'eventCode']);
190
+ recordMapPages([{ ID: 'm1', EntityRecordID: 'a|1' }, { ID: 'm2', EntityRecordID: "b'x|2" }]);
191
+
192
+ await ClearRekeyedObjectData([TARGET], 'CI-A', USER, provider);
193
+
194
+ expect(log).toContain(
195
+ "DELETE FROM [pheedloop].[attendees] WHERE ([code]='a' AND [eventCode]='1') OR ([code]='b''x' AND [eventCode]='2')"
196
+ );
197
+ });
198
+
199
+ it('leaves a map whose id cannot name exactly one row, and does not report the object cleared', async () => {
200
+ // 'a|1|z' against a two-column key is a value that itself contained '|': splitting it would
201
+ // name some OTHER row. An empty component is a null key value, which matches nothing safely.
202
+ const { provider, log } = fakeProvider(['code', 'eventCode']);
203
+ recordMapPages([
204
+ { ID: 'm1', EntityRecordID: 'a|1' },
205
+ { ID: 'm2', EntityRecordID: 'a|1|z' },
206
+ { ID: 'm3', EntityRecordID: '|2' },
207
+ ]);
208
+
209
+ const cleared = await ClearRekeyedObjectData([TARGET], 'CI-A', USER, provider);
210
+
211
+ expect(cleared).toEqual([]);
212
+ expect(log).toContain("DELETE FROM [pheedloop].[attendees] WHERE ([code]='a' AND [eventCode]='1')");
213
+ expect(log.some(s => s.includes('m2') || s.includes('m3'))).toBe(false);
214
+ });
215
+
216
+ it('pages through the maps by id, so a big table is never read or deleted whole', async () => {
217
+ const { provider, log } = fakeProvider(['ID']);
218
+ recordMapPages(
219
+ [{ ID: 'm1', EntityRecordID: 'r1' }, { ID: 'm2', EntityRecordID: 'r2' }],
220
+ [{ ID: 'm3', EntityRecordID: 'r3' }],
221
+ );
222
+
223
+ const cleared = await ClearRekeyedObjectData([TARGET], 'CI-A', USER, provider, 2);
224
+
225
+ expect(cleared).toEqual(['attendees']);
226
+ expect(reads()).toHaveLength(2);
227
+ expect(reads()[0]).toMatchObject({ OrderBy: 'ID', MaxRows: 2, SkipTotalRowCount: true, BypassCache: true });
228
+ expect(reads()[1].ExtraFilter).toBe("CompanyIntegrationID='CI-A' AND EntityID='E1' AND ID > 'm2'");
229
+ expect(log.filter(s => s === 'COMMIT')).toHaveLength(2);
230
+ });
231
+
232
+ it('rolls a failed chunk back and does not report the object cleared', async () => {
233
+ const { provider, log } = fakeProvider(['ID'], 'CompanyIntegrationRecordMap');
234
+ recordMapPages([{ ID: 'm1', EntityRecordID: 'r1' }]);
235
+
236
+ const cleared = await ClearRekeyedObjectData([TARGET], 'CI-A', USER, provider);
237
+
238
+ expect(cleared).toEqual([]);
239
+ expect(log).toContain('ROLLBACK');
240
+ expect(log).not.toContain('COMMIT');
241
+ });
242
+
243
+ it('deletes nothing when the record maps cannot be read', async () => {
244
+ const { provider, log } = fakeProvider(['ID']);
245
+ runView.mockResolvedValue({ Success: false, Results: [], ErrorMessage: 'timeout' } as unknown as RunViewResult);
246
+
247
+ const cleared = await ClearRekeyedObjectData([TARGET], 'CI-A', USER, provider);
248
+
249
+ expect(cleared).toEqual([]);
250
+ expect(log).toEqual([]);
251
+ });
252
+ });
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Two ways the schema-evolution path stopped short of acting on what it already knew.
3
+ *
4
+ * - MJ-RUN-37: the persist layer has always recorded an `IncrementalWatermarkField` change and
5
+ * nothing consumed the record. `changedObjects` — the sole input to `ResetPullWatermarks` — was
6
+ * built from a physical column diff and a field-map add/disable, and a cursor swap produces
7
+ * neither. The stale Pull watermark then became a lower bound on a DIFFERENT column, and where
8
+ * the new column sorts later, every row below it was filtered out at the source, permanently and
9
+ * invisibly (an incremental's fetched-vs-expected check agrees, because the source counts
10
+ * against the filter it was handed).
11
+ *
12
+ * - MJ-APPLY-6 residual: `RunPipelineBatchWithRetry` existed and two of the six pipeline call
13
+ * sites used it. `SchemaBuilder.RunSchemaPipeline` states the reason plainly — the middle steps
14
+ * fail transiently and "the callers simply never used it".
15
+ *
16
+ * The evolution mutation needs a provider, a connector, a SchemaBuilder and an RSU pipeline to
17
+ * invoke, and the properties here are wiring, not behaviour worth standing all that up to observe.
18
+ * Read from source, the convention this directory already uses for this method. The DECISION the
19
+ * wiring feeds is unit-tested for real in the integration-engine package
20
+ * (WatermarkFieldChangeIsAChange.test.ts) — these pin that the resolver calls it, feeds it the
21
+ * right input, and does so before the watermark reset.
22
+ */
23
+ import { describe, it, expect } from 'vitest';
24
+ import { readFileSync } from 'node:fs';
25
+ import { join } from 'node:path';
26
+
27
+ const SRC = readFileSync(join(__dirname, '..', 'resolvers', 'IntegrationDiscoveryResolver.ts'), 'utf-8');
28
+ const PROMOTER = readFileSync(join(__dirname, '..', 'integration', 'CustomColumnPromoter.ts'), 'utf-8');
29
+ const RSU_RESOLVER = readFileSync(join(__dirname, '..', 'resolvers', 'RSUResolver.ts'), 'utf-8');
30
+
31
+ /** The body of a named resolver method, up to the next @Query/@Mutation at the same indent. */
32
+ function methodBody(src: string, name: string): string {
33
+ const start = src.indexOf(`async ${name}(`);
34
+ expect(start, `${name} not found`).toBeGreaterThan(-1);
35
+ const rest = src.slice(start);
36
+ const end = rest.search(/\n @(Query|Mutation)\(/);
37
+ return end === -1 ? rest : rest.slice(0, end);
38
+ }
39
+
40
+ describe('MJ-RUN-37 — a watermark-field change reaches ResetPullWatermarks', () => {
41
+ const body = () => methodBody(SRC, 'IntegrationSchemaEvolution');
42
+
43
+ it('consumes the persist layer\'s detection rather than re-deriving it', () => {
44
+ // The whole defect was that this signal existed and had no consumer. It must come from the
45
+ // refresh's OWN PersistResult — re-reading the catalog afterwards cannot tell a changed
46
+ // watermark field from one that was always that way.
47
+ expect(body()).toMatch(/ObjectsWithWatermarkFieldChange\(\s*refresh\.PersistResult\?\.ObjectMergeLog \?\? \[\]/);
48
+ });
49
+
50
+ it('imports it from the engine that produces it', () => {
51
+ expect(SRC).toMatch(/ObjectsWithWatermarkFieldChange[\s\S]{0,200}?from "@memberjunction\/integration-engine"/);
52
+ });
53
+
54
+ it('scopes it to the CONTINUING maps, so it cannot report what nothing can reset', () => {
55
+ expect(body()).toMatch(/continuingMaps\.map\(m => m\.ExternalObjectName \?\? ''\)/);
56
+ });
57
+
58
+ it('folds the result into changedObjects — the only input ResetPullWatermarks has', () => {
59
+ const b = body();
60
+ const push = b.search(/if \(!changedObjects\.some\(n => n\.toLowerCase\(\) === name\.toLowerCase\(\)\)\) changedObjects\.push\(name\)/);
61
+ const reset = b.indexOf('ResetPullWatermarks(');
62
+ expect(push, 'the watermark-changed names are never pushed onto changedObjects').toBeGreaterThan(-1);
63
+ expect(reset).toBeGreaterThan(-1);
64
+ expect(push, 'the push must happen BEFORE the reset, or it changes nothing').toBeLessThan(reset);
65
+ });
66
+
67
+ it('does not push unconditionally — an unchanged run must not re-full-sync the connection', () => {
68
+ // The guard is the expensive half. `changedObjects` drives ResetPullWatermarks AND HasChanges,
69
+ // so a rule that fires when no cursor moved turns every refresh into a full re-fetch of
70
+ // everything. The emptiness of the detection is what has to carry that, never a bare loop.
71
+ const b = body();
72
+ const i = b.indexOf('ObjectsWithWatermarkFieldChange(');
73
+ const after = b.slice(i, i + 600);
74
+ expect(after).toMatch(/for \(const name of watermarkFieldChanged\)/);
75
+ expect(after).not.toMatch(/changedObjects\.push\(\.\.\./);
76
+ });
77
+ });
78
+
79
+ describe('MJ-APPLY-6 residual — the bare pipeline calls that should retry', () => {
80
+ it('IntegrationApplySchemaBatch retries, matching its single-connector sibling', () => {
81
+ // IntegrationApplySchema retries via SchemaBuilder.RunSchemaPipeline. Same install path, same
82
+ // generated DDL, same four transient steps — the batch simply never used the wrapper.
83
+ const b = methodBody(SRC, 'IntegrationApplySchemaBatch');
84
+ expect(b).toMatch(/rsm\.RunPipelineBatchWithRetry\(pipelineInputs\)/);
85
+ expect(b).not.toMatch(/rsm\.RunPipelineBatch\(/);
86
+ });
87
+
88
+ it('IntegrationSchemaEvolution retries', () => {
89
+ const b = methodBody(SRC, 'IntegrationSchemaEvolution');
90
+ expect(b).toMatch(/rsm\.RunPipelineBatchWithRetry\(/);
91
+ expect(b).not.toMatch(/rsm\.RunPipelineBatch\(/);
92
+ });
93
+
94
+ it('the custom-column promoter retries — it runs unattended, mid-sync', () => {
95
+ expect(PROMOTER).toMatch(/RuntimeSchemaManager\.Instance\.RunPipelineBatchWithRetry\(batchInputs\)/);
96
+ expect(PROMOTER).not.toMatch(/RuntimeSchemaManager\.Instance\.RunPipelineBatch\(/);
97
+ });
98
+
99
+ it('no bare RunPipelineBatch survives in the integration resolver', () => {
100
+ // A regression here is invisible at runtime: the pipeline still works, it just stops
101
+ // absorbing the hiccup it was wrapped to absorb.
102
+ expect(SRC).not.toMatch(/RunPipelineBatch\((?!\w)/);
103
+ });
104
+
105
+ it('RunRuntimeSchemaUpdateBatch deliberately does NOT retry, and says why', () => {
106
+ // The one exception, kept explicit so it reads as a decision rather than an oversight: this
107
+ // mutation replays CALLER-AUTHORED SQL, and executeMigration is not transactional.
108
+ const b = methodBody(RSU_RESOLVER, 'RunRuntimeSchemaUpdateBatch');
109
+ expect(b).toMatch(/rsm\.RunPipelineBatch\(pipelineInputs\)/);
110
+ expect(b).toMatch(/deliberately the BARE call/);
111
+ expect(b).toMatch(/NOT transactional/);
112
+ });
113
+ });
@@ -0,0 +1,213 @@
1
+ import 'reflect-metadata';
2
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
3
+ import type { PubSubEngine } from 'type-graphql';
4
+
5
+ vi.mock('../config.js', () => ({
6
+ configInfo: {},
7
+ }));
8
+
9
+ import { RegisterClass } from '@memberjunction/global';
10
+ import {
11
+ BaseRemotableOperation,
12
+ RemoteOperationError,
13
+ type IMetadataProvider,
14
+ type RemoteOpInvokeOptions,
15
+ type RemoteOpResult,
16
+ type RemoteOpServerContext,
17
+ type UserInfo,
18
+ } from '@memberjunction/core';
19
+ import { RemoteOperationEngineBase } from '@memberjunction/core-entities';
20
+ import { DispatchRemoteOperationInProcess } from '@memberjunction/core';
21
+ import { ExecuteRemoteOperationResolver, ExecuteRemoteOperationInput } from '../resolvers/ExecuteRemoteOperationResolver.js';
22
+ import type { AppContext } from '../types.js';
23
+
24
+ interface TestOpInput {
25
+ message: string;
26
+ }
27
+
28
+ interface TestOpOutput {
29
+ echoed: string;
30
+ origin?: string;
31
+ ip?: string;
32
+ sessionId?: string;
33
+ apiKeyHash?: string;
34
+ }
35
+
36
+ @RegisterClass(BaseRemotableOperation, 'TestServer.ContextEcho')
37
+ class ContextEchoOperation extends BaseRemotableOperation<TestOpInput, TestOpOutput> {
38
+ public readonly OperationKey = 'TestServer.ContextEcho';
39
+ public override readonly ContractFingerprint = 'ro_fp_expected12345678';
40
+
41
+ protected override async Authorize(
42
+ _input: TestOpInput,
43
+ _user: UserInfo,
44
+ context?: RemoteOpServerContext,
45
+ ): Promise<boolean> {
46
+ return context?.requestOrigin !== 'https://evil.example.com';
47
+ }
48
+
49
+ protected override async InternalExecute(
50
+ input: TestOpInput,
51
+ _provider: IMetadataProvider,
52
+ _user: UserInfo,
53
+ context: RemoteOpServerContext,
54
+ ): Promise<TestOpOutput> {
55
+ return {
56
+ echoed: input.message,
57
+ origin: context.requestOrigin,
58
+ ip: context.clientIp,
59
+ sessionId: context.sessionId,
60
+ apiKeyHash: context.apiKeyHash,
61
+ };
62
+ }
63
+ }
64
+ void ContextEchoOperation;
65
+
66
+ @RegisterClass(BaseRemotableOperation, 'TestServer.StructuredFailure')
67
+ class StructuredFailureOperation extends BaseRemotableOperation<TestOpInput, TestOpOutput> {
68
+ public readonly OperationKey = 'TestServer.StructuredFailure';
69
+
70
+ protected override async InternalExecute(): Promise<TestOpOutput> {
71
+ throw new RemoteOperationError('CUSTOM_DOMAIN_CODE', 'Structured domain validation rejected request');
72
+ }
73
+ }
74
+ void StructuredFailureOperation;
75
+
76
+ describe('ExecuteRemoteOperationResolver', () => {
77
+ const fakeUser = { ID: 'user-1', Email: 'ada@example.com' } as UserInfo;
78
+ const pubSub: PubSubEngine = {
79
+ publish: vi.fn(async () => undefined),
80
+ subscribe: vi.fn(async () => 1),
81
+ unsubscribe: vi.fn(),
82
+ asyncIterator: vi.fn(),
83
+ } as PubSubEngine;
84
+
85
+ beforeEach(() => {
86
+ vi.spyOn(RemoteOperationEngineBase.Instance, 'Config').mockResolvedValue(undefined);
87
+ vi.spyOn(RemoteOperationEngineBase.Instance, 'IsInvokable').mockReturnValue({ Invokable: true });
88
+ vi.spyOn(RemoteOperationEngineBase.Instance, 'GetContractFingerprint').mockReturnValue(undefined);
89
+ });
90
+
91
+ function buildContext(overrides: Partial<AppContext> = {}): {
92
+ ctx: AppContext;
93
+ capturedOptions: RemoteOpInvokeOptions[];
94
+ } {
95
+ const capturedOptions: RemoteOpInvokeOptions[] = [];
96
+ const provider = {
97
+ RouteOperation: async <TIn, TOut>(
98
+ key: string,
99
+ opInput: TIn,
100
+ options: RemoteOpInvokeOptions = {},
101
+ ): Promise<RemoteOpResult<TOut>> => {
102
+ capturedOptions.push(options);
103
+ return DispatchRemoteOperationInProcess<TIn, TOut>(
104
+ key,
105
+ opInput,
106
+ options,
107
+ provider as IMetadataProvider,
108
+ fakeUser,
109
+ );
110
+ },
111
+ };
112
+
113
+ const ctx: AppContext = {
114
+ dataSource: {} as AppContext['dataSource'],
115
+ dataSources: [],
116
+ providers: [{ provider: provider as AppContext['providers'][number]['provider'], type: 'Read-Write' }],
117
+ userPayload: {
118
+ email: 'ada@example.com',
119
+ userRecord: fakeUser,
120
+ sessionId: 'sess-abc-123',
121
+ apiKeyHash: 'hash-xyz-987',
122
+ },
123
+ RequestOrigin: 'https://app.example.com',
124
+ ClientIp: '198.51.100.24',
125
+ ...overrides,
126
+ };
127
+ return { ctx, capturedOptions };
128
+ }
129
+
130
+ it('forwards RequestOrigin, ClientIp, sessionId, and apiKeyHash into RouteOperation and Authorize/InternalExecute', async () => {
131
+ const resolver = new ExecuteRemoteOperationResolver();
132
+ const { ctx, capturedOptions } = buildContext();
133
+
134
+ const input: ExecuteRemoteOperationInput = {
135
+ operationKey: 'TestServer.ContextEcho',
136
+ inputJSON: JSON.stringify({ message: 'hi' }),
137
+ invokeMode: 'attached',
138
+ contractFingerprint: 'ro_fp_expected12345678',
139
+ };
140
+
141
+ const res = await resolver.ExecuteRemoteOperation(input, ctx, pubSub);
142
+ expect(res.success).toBe(true);
143
+ expect(res.resultCode).toBe('SUCCESS');
144
+ expect(capturedOptions).toHaveLength(1);
145
+ expect(capturedOptions[0].requestOrigin).toBe('https://app.example.com');
146
+ expect(capturedOptions[0].clientIp).toBe('198.51.100.24');
147
+ expect(capturedOptions[0].sessionId).toBe('sess-abc-123');
148
+ expect(capturedOptions[0].apiKeyHash).toBe('hash-xyz-987');
149
+
150
+ const parsed = JSON.parse(res.outputJSON!) as TestOpOutput;
151
+ expect(parsed).toEqual({
152
+ echoed: 'hi',
153
+ origin: 'https://app.example.com',
154
+ ip: '198.51.100.24',
155
+ sessionId: 'sess-abc-123',
156
+ apiKeyHash: 'hash-xyz-987',
157
+ });
158
+ });
159
+
160
+ it('enforces Authorize against context.requestOrigin', async () => {
161
+ const resolver = new ExecuteRemoteOperationResolver();
162
+ const { ctx } = buildContext({ RequestOrigin: 'https://evil.example.com' });
163
+
164
+ const res = await resolver.ExecuteRemoteOperation(
165
+ {
166
+ operationKey: 'TestServer.ContextEcho',
167
+ inputJSON: JSON.stringify({ message: 'hi' }),
168
+ invokeMode: 'attached',
169
+ },
170
+ ctx,
171
+ pubSub,
172
+ );
173
+ expect(res.success).toBe(false);
174
+ expect(res.resultCode).toBe('FORBIDDEN');
175
+ });
176
+
177
+ it('rejects stale client contractFingerprint with CONTRACT_MISMATCH before running operation', async () => {
178
+ const resolver = new ExecuteRemoteOperationResolver();
179
+ const { ctx, capturedOptions } = buildContext();
180
+
181
+ const res = await resolver.ExecuteRemoteOperation(
182
+ {
183
+ operationKey: 'TestServer.ContextEcho',
184
+ inputJSON: JSON.stringify({ message: 'hi' }),
185
+ invokeMode: 'attached',
186
+ contractFingerprint: 'ro_fp_stale00000000000',
187
+ },
188
+ ctx,
189
+ pubSub,
190
+ );
191
+ expect(res.success).toBe(false);
192
+ expect(res.resultCode).toBe('CONTRACT_MISMATCH');
193
+ expect(capturedOptions).toHaveLength(0);
194
+ });
195
+
196
+ it('surfaces custom RemoteOperationError ResultCodes on the GraphQL result', async () => {
197
+ const resolver = new ExecuteRemoteOperationResolver();
198
+ const { ctx } = buildContext();
199
+
200
+ const res = await resolver.ExecuteRemoteOperation(
201
+ {
202
+ operationKey: 'TestServer.StructuredFailure',
203
+ inputJSON: JSON.stringify({ message: 'check' }),
204
+ invokeMode: 'attached',
205
+ },
206
+ ctx,
207
+ pubSub,
208
+ );
209
+ expect(res.success).toBe(false);
210
+ expect(res.resultCode).toBe('CUSTOM_DOMAIN_CODE');
211
+ expect(res.errorMessage).toBe('Structured domain validation rejected request');
212
+ });
213
+ });