@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
@@ -21,7 +21,7 @@ vi.mock('type-graphql', () => {
21
21
  return Object.fromEntries(exportNames.map((name) => [name, decoratorFactory]));
22
22
  });
23
23
 
24
- const runViewCalls: Array<{ params: RunViewParams; contextUser: UserInfo | undefined }> = [];
24
+ const runViewCalls: Array<{ params: RunViewParams; contextUser: UserInfo | undefined; provider: unknown }> = [];
25
25
  /** Each RunViews call, as the list of entity names it batched. */
26
26
  const runViewsBatches: string[][] = [];
27
27
  let runViewHandler: RunViewHandler = () => ({ Success: true, Results: [] });
@@ -29,8 +29,12 @@ let runViewHandler: RunViewHandler = () => ({ Success: true, Results: [] });
29
29
  vi.mock('@memberjunction/core', async (importOriginal) => {
30
30
  const actual = await importOriginal<typeof import('@memberjunction/core')>();
31
31
  class MockRunView {
32
+ constructor(private readonly provider?: unknown) {}
33
+ static FromMetadataProvider(provider: unknown): MockRunView {
34
+ return new MockRunView(provider);
35
+ }
32
36
  async RunView(params: RunViewParams, contextUser?: UserInfo): Promise<ViewResult> {
33
- runViewCalls.push({ params, contextUser });
37
+ runViewCalls.push({ params, contextUser, provider: this.provider });
34
38
  return runViewHandler(params, contextUser);
35
39
  }
36
40
  async RunViews(params: RunViewParams[], contextUser?: UserInfo): Promise<ViewResult[]> {
@@ -60,9 +64,13 @@ import type { AppContext } from '../types.js';
60
64
  const DOC_ID = 'DOC-1';
61
65
  const contextUser = new UserInfo();
62
66
 
67
+ /** Entity read and field-level security the external-index path checks, per test. */
68
+ const access = { canRead: true, deniedReadFields: new Set<string>() };
69
+
63
70
  const membersEntity = {
64
71
  Name: 'Members',
65
72
  PrimaryKeys: [{ Name: 'ID' }],
73
+ FirstPrimaryKey: { Name: 'ID' },
66
74
  Fields: [
67
75
  { Name: 'ID', IsNameField: false },
68
76
  { Name: 'FirstName', IsNameField: true },
@@ -70,11 +78,16 @@ const membersEntity = {
70
78
  { Name: 'Email', IsNameField: false },
71
79
  ],
72
80
  NameField: undefined,
81
+ GetUserPermisions: (user: UserInfo) => ({ CanRead: user === contextUser && access.canRead }),
82
+ GetDeniedReadFields: (user: UserInfo) => (user === contextUser ? access.deniedReadFields : new Set<string>()),
73
83
  } as unknown as EntityInfo;
74
84
 
75
85
  const orderLinesEntity = {
76
86
  Name: 'Order Lines',
77
87
  PrimaryKeys: [{ Name: 'OrderID' }, { Name: 'LineNo' }],
88
+ FirstPrimaryKey: { Name: 'OrderID' },
89
+ GetUserPermisions: (user: UserInfo) => ({ CanRead: user === contextUser && access.canRead }),
90
+ GetDeniedReadFields: () => new Set<string>(),
78
91
  Fields: [
79
92
  { Name: 'OrderID', IsNameField: false },
80
93
  { Name: 'LineNo', IsNameField: false },
@@ -143,6 +156,19 @@ function erdView(rows: Array<Record<string, string>>) {
143
156
  };
144
157
  }
145
158
 
159
+ /**
160
+ * A fake `Members` view of the rows the caller may read (row-level security already applied):
161
+ * returns the requested `Fields` of the rows named by an `ID IN ('a','b')` filter.
162
+ */
163
+ function readableMembersView(readableIDs: string[]) {
164
+ return (params: RunViewParams): ViewResult => {
165
+ const idList = /^ID IN \((.*)\)$/.exec(params.ExtraFilter ?? '');
166
+ const requested = idList ? idList[1].split(',').map((v) => v.trim().replace(/^'|'$/g, '')) : [];
167
+ const rows = requested.filter((id) => readableIDs.includes(id)).map((id) => ({ ID: id }));
168
+ return { Success: true, Results: rows.map((r) => Object.fromEntries((params.Fields ?? ['ID']).map((f) => [f, r[f as 'ID']]))) };
169
+ };
170
+ }
171
+
146
172
  /** The VectorJSON fetches: Entity Record Documents views filtered by ID. */
147
173
  function vectorFetches() {
148
174
  return callsFor('MJ: Entity Record Documents').filter((c) => c.params.ExtraFilter?.startsWith('ID IN ('));
@@ -160,6 +186,8 @@ describe('FetchEntityVectorsResolver', () => {
160
186
  beforeEach(() => {
161
187
  runViewCalls.length = 0;
162
188
  runViewsBatches.length = 0;
189
+ access.canRead = true;
190
+ access.deniedReadFields = new Set<string>();
163
191
  });
164
192
 
165
193
  afterEach(() => {
@@ -202,6 +230,21 @@ describe('FetchEntityVectorsResolver', () => {
202
230
  expect(vectorCall.params.IgnoreMaxRows).toBe(true);
203
231
  });
204
232
 
233
+ it("REGRESSION: runs every view on the request's provider", async () => {
234
+ useVectorDB(true);
235
+ routeViews('Members', {
236
+ 'MJ: Entity Record Documents': erdView(storedRows),
237
+ Members: () => ({ Success: true, Results: memberRows }),
238
+ });
239
+ const context = appContext(membersEntity);
240
+
241
+ await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, undefined, undefined, context);
242
+
243
+ const requestProvider = context.providers[0].provider;
244
+ expect(callsFor('MJ: Entity Record Documents')).toHaveLength(2);
245
+ expect(runViewCalls.every((c) => c.provider === requestProvider)).toBe(true);
246
+ });
247
+
205
248
  it('bypasses the server RunView cache for both Entity Record Documents views, so Fields is honoured', async () => {
206
249
  useVectorDB(true);
207
250
  routeViews('Members', {
@@ -413,7 +456,7 @@ describe('FetchEntityVectorsResolver', () => {
413
456
  describe('index-keyed providers (Pinecone path, unchanged)', () => {
414
457
  it('queries the provider index by name and never reads Entity Record Documents', async () => {
415
458
  const { queryIndex } = useVectorDB(false);
416
- routeViews('Members', {});
459
+ routeViews('Members', { Members: readableMembersView(['a']) });
417
460
 
418
461
  const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
419
462
 
@@ -427,7 +470,167 @@ describe('FetchEntityVectorsResolver', () => {
427
470
  expect(query.vector).toHaveLength(2);
428
471
  expect(result.Results).toEqual([{ ID: 'pc-1', Values: [0.5, 0.5], Metadata: JSON.stringify({ Entity: 'Members', RecordID: 'a' }) }]);
429
472
  expect(callsFor('MJ: Entity Record Documents')).toHaveLength(0);
473
+ });
474
+
475
+ it('removes metadata keys naming fields the caller may not read', async () => {
476
+ const { queryIndex } = useVectorDB(false);
477
+ queryIndex.mockResolvedValueOnce({
478
+ success: true,
479
+ data: { matches: [{ id: 'pc-1', values: [0.5, 0.5], metadata: { Entity: 'Members', RecordID: 'a', FirstName: 'Ada', Email: 'ada@secret.org' } }] },
480
+ });
481
+ access.deniedReadFields = new Set(['email']);
482
+ routeViews('Members', { Members: readableMembersView(['a']) });
483
+
484
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
485
+
486
+ expect(result.Success).toBe(true);
487
+ expect(JSON.parse(result.Results[0].Metadata)).toEqual({ Entity: 'Members', RecordID: 'a', FirstName: 'Ada' });
488
+ });
489
+
490
+ it('keeps every metadata key for a caller denied nothing', async () => {
491
+ const { queryIndex } = useVectorDB(false);
492
+ const metadata = { Entity: 'Members', RecordID: 'a', FirstName: 'Ada', Email: 'ada@secret.org' };
493
+ queryIndex.mockResolvedValueOnce({ success: true, data: { matches: [{ id: 'pc-1', values: [0.5, 0.5], metadata }] } });
494
+ routeViews('Members', { Members: readableMembersView(['a']) });
495
+
496
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
497
+
498
+ expect(JSON.parse(result.Results[0].Metadata)).toEqual(metadata);
499
+ });
500
+
501
+ it('refuses, without querying the index, a caller who may not read the source entity', async () => {
502
+ const { queryIndex } = useVectorDB(false);
503
+ access.canRead = false;
504
+ routeViews('Members', {});
505
+
506
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
507
+
508
+ expect(result.Success).toBe(false);
509
+ expect(result.Results).toEqual([]);
510
+ expect(result.ErrorMessage).toBe('Entity "Members" does not exist or you do not have permission to read it');
511
+ expect(queryIndex).not.toHaveBeenCalled();
512
+ });
513
+ });
514
+
515
+ describe('index-keyed providers: rows the caller cannot read', () => {
516
+ function matchesFor(recordIDs: Array<string | undefined>) {
517
+ return recordIDs.map((recordID, i) => ({
518
+ id: `pc-${i}`,
519
+ values: [i, i],
520
+ score: 1 - i / 10,
521
+ metadata: recordID === undefined ? { Entity: 'Members' } : { Entity: 'Members', RecordID: recordID },
522
+ }));
523
+ }
524
+
525
+ it('drops matches whose record the caller cannot read, keeping the order of the rest', async () => {
526
+ const { queryIndex } = useVectorDB(false);
527
+ queryIndex.mockResolvedValueOnce({ success: true, data: { matches: matchesFor(['ID|aaa', 'ID|bbb', 'ID|ccc']) } });
528
+ routeViews('Members', { Members: readableMembersView(['ccc', 'aaa']) });
529
+
530
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
531
+
532
+ expect(result.Success).toBe(true);
533
+ expect(result.Results.map((r) => r.ID)).toEqual(['pc-0', 'pc-2']);
534
+ expect(result.Results.map((r) => r.Values)).toEqual([[0, 0], [2, 2]]);
535
+ expect(result.TotalCount).toBe(2);
536
+ });
537
+
538
+ it("REGRESSION: runs every view, the key check included, on the request's provider", async () => {
539
+ const { queryIndex } = useVectorDB(false);
540
+ queryIndex.mockResolvedValueOnce({ success: true, data: { matches: matchesFor(['ID|aaa']) } });
541
+ routeViews('Members', { Members: readableMembersView(['aaa']) });
542
+ const context = appContext(membersEntity);
543
+
544
+ await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, context);
545
+
546
+ const requestProvider = context.providers[0].provider;
547
+ expect(callsFor('Members')).toHaveLength(1);
548
+ expect(runViewCalls.length).toBeGreaterThan(1);
549
+ expect(runViewCalls.every((c) => c.provider === requestProvider)).toBe(true);
550
+ });
551
+
552
+ it('checks the matched keys with a simple view of the primary key, as the caller', async () => {
553
+ const { queryIndex } = useVectorDB(false);
554
+ queryIndex.mockResolvedValueOnce({ success: true, data: { matches: matchesFor(['ID|aaa', 'bbb']) } });
555
+ routeViews('Members', { Members: readableMembersView(['aaa', 'bbb']) });
556
+
557
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
558
+
559
+ expect(result.Results.map((r) => r.ID)).toEqual(['pc-0', 'pc-1']);
560
+ const [check] = callsFor('Members');
561
+ expect(check.contextUser).toBe(contextUser);
562
+ expect(check.params.ExtraFilter).toBe("ID IN ('aaa','bbb')");
563
+ expect(check.params.Fields).toEqual(['ID']);
564
+ expect(check.params.ResultType).toBe('simple');
565
+ expect(check.params.IgnoreMaxRows).toBe(true);
566
+ });
567
+
568
+ it('drops a match with no record ID, or one naming a field that is not the primary key, without querying for it', async () => {
569
+ const { queryIndex } = useVectorDB(false);
570
+ queryIndex.mockResolvedValueOnce({ success: true, data: { matches: matchesFor([undefined, "Salary|1' OR 1=1 --", 'ID|aaa']) } });
571
+ routeViews('Members', { Members: readableMembersView(['aaa']) });
572
+
573
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
574
+
575
+ expect(result.Results.map((r) => r.ID)).toEqual(['pc-2']);
576
+ expect(callsFor('Members').map((c) => c.params.ExtraFilter)).toEqual(["ID IN ('aaa')"]);
577
+ });
578
+
579
+ it('returns no matches and runs no check when none carries a usable record ID', async () => {
580
+ const { queryIndex } = useVectorDB(false);
581
+ queryIndex.mockResolvedValueOnce({ success: true, data: { matches: matchesFor([undefined]) } });
582
+ routeViews('Members', { Members: readableMembersView([]) });
583
+
584
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
585
+
586
+ expect(result.Success).toBe(true);
587
+ expect(result.Results).toEqual([]);
430
588
  expect(callsFor('Members')).toHaveLength(0);
431
589
  });
590
+
591
+ it('checks composite keys with one clause per record, using the real key columns', async () => {
592
+ const { queryIndex } = useVectorDB(false);
593
+ queryIndex.mockResolvedValueOnce({
594
+ success: true,
595
+ data: { matches: [
596
+ { id: 'pc-a', values: [1], metadata: { Entity: 'Order Lines', RecordID: 'OrderID|o-1||LineNo|2' } },
597
+ { id: 'pc-b', values: [2], metadata: { Entity: 'Order Lines', RecordID: 'OrderID|o-2||LineNo|1' } },
598
+ ] },
599
+ });
600
+ routeViews('Order Lines', {
601
+ 'Order Lines': () => ({ Success: true, Results: [{ OrderID: 'o-2', LineNo: 1 }] }),
602
+ });
603
+
604
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(orderLinesEntity));
605
+
606
+ expect(result.Results.map((r) => r.ID)).toEqual(['pc-b']);
607
+ const [check] = callsFor('Order Lines');
608
+ expect(check.params.ExtraFilter).toBe("(OrderID='o-1' AND LineNo='2') OR (OrderID='o-2' AND LineNo='1')");
609
+ expect(check.params.Fields).toEqual(['OrderID', 'LineNo']);
610
+ });
611
+
612
+ it('splits a large key check into lists of at most 1000, sent in one RunViews batch', async () => {
613
+ const { queryIndex } = useVectorDB(false);
614
+ const ids = Array.from({ length: 1500 }, (_, i) => `id-${i}`);
615
+ queryIndex.mockResolvedValueOnce({ success: true, data: { matches: matchesFor(ids.map((id) => `ID|${id}`)) } });
616
+ routeViews('Members', { Members: readableMembersView(ids) });
617
+
618
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 1500, undefined, appContext(membersEntity));
619
+
620
+ expect(result.TotalCount).toBe(1500);
621
+ expect(callsFor('Members').map((c) => (c.params.ExtraFilter ?? '').split(',').length)).toEqual([1000, 500]);
622
+ expect(runViewsBatches).toEqual([['Members', 'Members']]);
623
+ });
624
+
625
+ it('returns an error result when the key check fails', async () => {
626
+ const { queryIndex } = useVectorDB(false);
627
+ queryIndex.mockResolvedValueOnce({ success: true, data: { matches: matchesFor(['ID|aaa']) } });
628
+ routeViews('Members', { Members: () => ({ Success: false, Results: [], ErrorMessage: 'timeout' }) });
629
+
630
+ const result = await new FetchEntityVectorsResolver().FetchEntityVectors(DOC_ID, 50, undefined, appContext(membersEntity));
631
+
632
+ expect(result.Success).toBe(false);
633
+ expect(result.Results).toEqual([]);
634
+ });
432
635
  });
433
636
  });
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Field-level security on FileResolver's own create path and responses.
3
+ *
4
+ * `CreateFile` applies its input with `NewRecord` rather than through the generated create
5
+ * resolver, so it gates the input itself: a restricted caller's key for a field it may not read,
6
+ * or a key that names no field, is refused with the same message, before any storage work. The
7
+ * `File` it returns (and `UploadStorageFile`'s) is the record just saved or reloaded, which is
8
+ * projected for the caller. The file entity here stands in with the fixture's restricted fields.
9
+ */
10
+ import 'reflect-metadata';
11
+ import { describe, it, expect, vi } from 'vitest';
12
+
13
+ const mocks = vi.hoisted(() => ({ createUploadUrl: vi.fn() }));
14
+
15
+ vi.mock('@memberjunction/server', () => {
16
+ const noopDecorator = () => () => undefined;
17
+ return {
18
+ Arg: noopDecorator, Ctx: noopDecorator, Field: noopDecorator, FieldResolver: noopDecorator, InputType: noopDecorator,
19
+ Mutation: noopDecorator, ObjectType: noopDecorator, PubSub: noopDecorator, Query: noopDecorator, Resolver: noopDecorator,
20
+ Root: noopDecorator, Int: {}, Float: {}, DeleteOptionsInput: class {},
21
+ };
22
+ });
23
+ vi.mock('../generated/generated.js', () => ({
24
+ CreateMJFileInput: class {},
25
+ UpdateMJFileInput: class {},
26
+ MJFile_: class {},
27
+ MJFileResolver: class {
28
+ protected GetUserFromPayload(userPayload: { userRecord?: object } | undefined) {
29
+ return userPayload?.userRecord;
30
+ }
31
+ },
32
+ }));
33
+ vi.mock('@memberjunction/ai-agents', () => ({ readRealtimeRecordingFile: vi.fn() }));
34
+ vi.mock('@memberjunction/graphql-dataprovider', () => ({ FieldMapper: class { MapFields(o: object) { return o; } } }));
35
+ vi.mock('../config.js', () => ({ configInfo: {} }));
36
+ vi.mock('../rest/MediaAccessKeys.js', () => ({ MediaAccessKeyManager: { Instance: {} } }));
37
+ vi.mock('../rest/UploadTokenManager.js', () => ({ UploadTokenManager: { Instance: { Consume: vi.fn() } } }));
38
+ vi.mock('@memberjunction/storage', async () => {
39
+ const actual = await vi.importActual<typeof import('@memberjunction/storage')>('@memberjunction/storage');
40
+ return { ...actual, createUploadUrl: mocks.createUploadUrl };
41
+ });
42
+
43
+ import type { PubSubEngine } from '@memberjunction/server';
44
+ import { FileResolver } from '../resolvers/FileResolver.js';
45
+ import type { AppContext } from '../types.js';
46
+ import { EmployeeEntity, FullWidthEmployeeRow, Intern, NoRecordChangesMetadata, RefusalFor, SECRET_SALARY } from './fieldSecurityFixtures.js';
47
+
48
+ function fileEntity() {
49
+ return { EntityInfo: EmployeeEntity(), CheckPermissions: vi.fn(), NewRecord: vi.fn(() => true), GetAll: () => FullWidthEmployeeRow() };
50
+ }
51
+
52
+ function contextFor(entity: ReturnType<typeof fileEntity>): AppContext {
53
+ const provider = { GetEntityObject: vi.fn(async () => entity), RunView: vi.fn(), RunViews: vi.fn() };
54
+ return { providers: [{ provider, type: 'Read-Write' }], userPayload: { userRecord: Intern() } } as unknown as AppContext;
55
+ }
56
+
57
+ describe('FileResolver.CreateFile: client input is gated for a restricted caller', () => {
58
+ it.each([
59
+ ['a denied field', 'Salary'],
60
+ ['a key that names no field', 'Bogus'],
61
+ ])('REGRESSION: refuses %s with the same message, before any storage work', async (_label, key) => {
62
+ const entity = fileEntity();
63
+ const input = { Name: 'new.pdf', [key]: 1 }; // keys of the stand-in entity
64
+ await expect(new FileResolver().CreateFile(input as never, contextFor(entity), {} as PubSubEngine))
65
+ .rejects.toThrow(RefusalFor(key));
66
+ expect(entity.NewRecord).not.toHaveBeenCalled();
67
+ expect(mocks.createUploadUrl).not.toHaveBeenCalled();
68
+ });
69
+ });
70
+
71
+ describe('FileResolver responses are projected for the caller', () => {
72
+ it('REGRESSION: the File returned never carries a denied value of a full-width record', () => {
73
+ const respond = (FileResolver.prototype as unknown as {
74
+ fileResponse(entity: ReturnType<typeof fileEntity>, user: unknown, provider: unknown): Record<string, unknown>;
75
+ }).fileResponse;
76
+
77
+ const file = respond.call(new FileResolver(), fileEntity(), Intern(), NoRecordChangesMetadata);
78
+
79
+ expect(JSON.stringify(file)).not.toContain(String(SECRET_SALARY));
80
+ expect(file).toMatchObject({ ID: 'emp-1', Name: 'Ada' });
81
+ });
82
+ });
@@ -0,0 +1,40 @@
1
+ /**
2
+ * `agentSessions.handoffOfferExpiry`: MJServer either stops the handoff offer registry's expiry sweep
3
+ * or puts it on the configured interval. The registry starts the sweep on its own when it loads.
4
+ */
5
+ import { describe, it, expect, vi, afterEach } from 'vitest';
6
+ import { HandoffOfferRegistry } from '@memberjunction/livekit-room-server';
7
+ import { ApplyHandoffOfferExpirySettings } from '../agentSessions/HandoffOfferExpiry.js';
8
+
9
+ describe('ApplyHandoffOfferExpirySettings', () => {
10
+ afterEach(() => {
11
+ HandoffOfferRegistry.Instance.StartPeriodicSweep(15_000);
12
+ HandoffOfferRegistry.Instance.StopPeriodicSweep();
13
+ vi.restoreAllMocks();
14
+ vi.useRealTimers();
15
+ });
16
+
17
+ it('disabled: stops the sweep, and nothing is read for an hour', async () => {
18
+ vi.useFakeTimers();
19
+ const registry = HandoffOfferRegistry.Instance;
20
+ registry.StartPeriodicSweep(15_000);
21
+ const sweep = vi.spyOn(registry, 'Sweep').mockResolvedValue(0);
22
+
23
+ ApplyHandoffOfferExpirySettings({ enabled: false, sweepIntervalMs: 15_000 });
24
+ await vi.advanceTimersByTimeAsync(60 * 60_000);
25
+
26
+ expect(sweep).not.toHaveBeenCalled();
27
+ expect(registry.IsPeriodicSweepScheduled).toBe(false);
28
+ });
29
+
30
+ it('enabled: runs the sweep on the configured interval', async () => {
31
+ vi.useFakeTimers();
32
+ const registry = HandoffOfferRegistry.Instance;
33
+ const sweep = vi.spyOn(registry, 'Sweep').mockResolvedValue(0);
34
+
35
+ ApplyHandoffOfferExpirySettings({ enabled: true, sweepIntervalMs: 120_000 });
36
+ await vi.advanceTimersByTimeAsync(10 * 60_000);
37
+
38
+ expect(sweep).toHaveBeenCalledTimes(5);
39
+ });
40
+ });
@@ -0,0 +1,126 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import type { IntegrationRunManifest } from '@memberjunction/integration-progress-artifacts';
3
+ import { AuthorizeRunArtifact } from '../integration/RunArtifactAuthorization.js';
4
+
5
+ /**
6
+ * Who may read a run artifact.
7
+ *
8
+ * This is a security boundary, not plumbing. A run artifact is one undivided event stream carrying
9
+ * migration descriptions, affected table names and error text; an RSU batch can span several
10
+ * connections, and there is no mechanism to serve a caller a partial view of one. So the rule is
11
+ * AND — authorized for EVERY connection the run touched — because "any one of them" would hand
12
+ * connection A's schema-change descriptions to a user who only holds rights on connection B.
13
+ *
14
+ * The per-connection check itself (a RunView under the caller's context, so the provider applies
15
+ * row-level security) is exercised elsewhere; these tests stub it to an allowlist and lock the
16
+ * COMBINING rule, which is the part that changed.
17
+ */
18
+
19
+ /**
20
+ * A per-connection check that answers from `allowed` and records what it was asked, so the tests can
21
+ * assert the short-circuit as well as the verdict. Memoization lives in the resolver's cache, so a
22
+ * shared `asked` list across calls shows exactly how many lookups the rule performed.
23
+ */
24
+ function checkFor(allowed: string[]): { canRead: (id: string) => Promise<boolean>; asked: string[] } {
25
+ const asked: string[] = [];
26
+ const seen = new Map<string, boolean>();
27
+ return {
28
+ asked,
29
+ canRead: async (companyIntegrationID: string): Promise<boolean> => {
30
+ const cached = seen.get(companyIntegrationID);
31
+ if (cached !== undefined) return cached;
32
+ asked.push(companyIntegrationID);
33
+ const verdict = allowed.includes(companyIntegrationID);
34
+ seen.set(companyIntegrationID, verdict);
35
+ return verdict;
36
+ },
37
+ };
38
+ }
39
+
40
+ function manifestOf(over: Partial<IntegrationRunManifest>): IntegrationRunManifest {
41
+ return { runID: 'r1', runKind: 'RSU', startedAt: new Date().toISOString(), ...over };
42
+ }
43
+
44
+ describe('run-artifact authorization', () => {
45
+ it('authorizes a single-connection run for a caller who holds that connection', async () => {
46
+ const { canRead } = checkFor(['CI-1']);
47
+ const result = await AuthorizeRunArtifact(
48
+ manifestOf({ companyIntegrationID: 'CI-1', companyIntegrationIDs: ['CI-1'] }),
49
+ canRead
50
+ );
51
+ expect(result.Authorized).toBe(true);
52
+ });
53
+
54
+ it('authorizes an RSU run at all — the manifest identity is what unblocks it', async () => {
55
+ // Regression guard for the original defect: an RSU manifest carried no connection, the check
56
+ // returned false on the missing field, and every RSU run answered "not authorized" to
57
+ // IntegrationGetRun and IntegrationTailRunEvents.
58
+ const { canRead } = checkFor(['CI-1']);
59
+ const withIdentity = await AuthorizeRunArtifact(manifestOf({ companyIntegrationIDs: ['CI-1'] }), canRead);
60
+ const withoutIdentity = await AuthorizeRunArtifact(manifestOf({}), canRead);
61
+ expect(withIdentity.Authorized).toBe(true);
62
+ expect(withoutIdentity.Authorized).toBe(false);
63
+ });
64
+
65
+ it('requires EVERY connection of a multi-connection batch — AND, not any', async () => {
66
+ // The leak this prevents: a user with rights only on CI-2 reading CI-1's schema-change
67
+ // descriptions out of the shared batch stream.
68
+ const { canRead } = checkFor(['CI-2']);
69
+ const result = await AuthorizeRunArtifact(manifestOf({ companyIntegrationIDs: ['CI-1', 'CI-2'] }), canRead);
70
+ expect(result.Authorized).toBe(false);
71
+ expect(result.DeniedCompanyIntegrationID).toBe('CI-1');
72
+ });
73
+
74
+ it('denies the batch even when the caller holds all but one of its connections', async () => {
75
+ const { canRead } = checkFor(['CI-1', 'CI-2']);
76
+ const result = await AuthorizeRunArtifact(manifestOf({ companyIntegrationIDs: ['CI-1', 'CI-2', 'CI-3'] }), canRead);
77
+ expect(result.Authorized).toBe(false);
78
+ expect(result.DeniedCompanyIntegrationID).toBe('CI-3');
79
+ });
80
+
81
+ it('authorizes a multi-connection batch only for a caller who holds all of them', async () => {
82
+ const { canRead } = checkFor(['CI-1', 'CI-2']);
83
+ const result = await AuthorizeRunArtifact(manifestOf({ companyIntegrationIDs: ['CI-1', 'CI-2'] }), canRead);
84
+ expect(result.Authorized).toBe(true);
85
+ });
86
+
87
+ it('stops at the first denial, so a caller cannot probe what else a run covers', async () => {
88
+ const { canRead, asked } = checkFor([]);
89
+ const result = await AuthorizeRunArtifact(manifestOf({ companyIntegrationIDs: ['CI-1', 'CI-2', 'CI-3'] }), canRead);
90
+ expect(result.DeniedCompanyIntegrationID).toBe('CI-1');
91
+ expect(asked).toEqual(['CI-1']);
92
+ });
93
+
94
+ it('denies a run with no connection identity at all, without asking anything', async () => {
95
+ // Non-tenant-scoped artifacts are not exposed through the per-company endpoints, and an
96
+ // identity-less run must not become readable as a side effect of runs gaining a set field.
97
+ const { canRead, asked } = checkFor(['CI-1']);
98
+ for (const manifest of [{}, { companyIntegrationIDs: [] }]) {
99
+ const result = await AuthorizeRunArtifact(manifestOf(manifest), canRead);
100
+ expect(result.Authorized).toBe(false);
101
+ expect(result.DeniedCompanyIntegrationID).toBeUndefined();
102
+ }
103
+ expect(asked).toEqual([]);
104
+ });
105
+
106
+ it('falls back to the singular field for runs written before the set existed', async () => {
107
+ // Every sync/discovery run carries only `companyIntegrationID`; those must keep working.
108
+ const { canRead } = checkFor(['CI-9']);
109
+ const ok = await AuthorizeRunArtifact(manifestOf({ runKind: 'SyncRun', companyIntegrationID: 'CI-9' }), canRead);
110
+ const denied = await AuthorizeRunArtifact(manifestOf({ runKind: 'SyncRun', companyIntegrationID: 'CI-8' }), canRead);
111
+ expect(ok.Authorized).toBe(true);
112
+ expect(denied.Authorized).toBe(false);
113
+ expect(denied.DeniedCompanyIntegrationID).toBe('CI-8');
114
+ });
115
+
116
+ it('prefers the set over the singular field when both are present', async () => {
117
+ // A batch that also happens to carry a singular value must still be judged on the whole set.
118
+ const { canRead } = checkFor(['CI-1']);
119
+ const result = await AuthorizeRunArtifact(
120
+ manifestOf({ companyIntegrationID: 'CI-1', companyIntegrationIDs: ['CI-1', 'CI-2'] }),
121
+ canRead
122
+ );
123
+ expect(result.Authorized).toBe(false);
124
+ expect(result.DeniedCompanyIntegrationID).toBe('CI-2');
125
+ });
126
+ });
@@ -0,0 +1,102 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { generateKeyPairSync } from 'node:crypto';
3
+
4
+ const logDoubles = vi.hoisted(() => ({
5
+ LogWarning: vi.fn(),
6
+ LogStatusEx: vi.fn(),
7
+ }));
8
+
9
+ vi.mock('@memberjunction/core', async importOriginal => {
10
+ const actual = await importOriginal<typeof import('@memberjunction/core')>();
11
+ return { ...actual, LogWarning: logDoubles.LogWarning, LogStatusEx: logDoubles.LogStatusEx };
12
+ });
13
+
14
+ import { GetGlobalObjectStore } from '@memberjunction/global';
15
+ import {
16
+ MagicLinkKeyManager,
17
+ IsMagicLinkLocalDevEnvironment,
18
+ EPHEMERAL_MAGIC_LINK_KEY_WARNING,
19
+ } from '../auth/magicLink/MagicLinkKeys.js';
20
+
21
+ /** Subclass so each test gets its own singleton slot instead of sharing the app-wide instance. */
22
+ class IsolatedKeyManager extends MagicLinkKeyManager {}
23
+
24
+ function freshManager(): IsolatedKeyManager {
25
+ const manager = new IsolatedKeyManager();
26
+ const store = GetGlobalObjectStore();
27
+ if (store) {
28
+ delete store[manager.GlobalKey];
29
+ }
30
+ return new IsolatedKeyManager();
31
+ }
32
+
33
+ describe('IsMagicLinkLocalDevEnvironment', () => {
34
+ it('treats NODE_ENV=production (any case, padded) as not local dev', () => {
35
+ expect(IsMagicLinkLocalDevEnvironment({ NODE_ENV: 'production' })).toBe(false);
36
+ expect(IsMagicLinkLocalDevEnvironment({ NODE_ENV: ' Production ' })).toBe(false);
37
+ });
38
+
39
+ it('treats unset, development and test as local dev', () => {
40
+ expect(IsMagicLinkLocalDevEnvironment({})).toBe(true);
41
+ expect(IsMagicLinkLocalDevEnvironment({ NODE_ENV: 'development' })).toBe(true);
42
+ expect(IsMagicLinkLocalDevEnvironment({ NODE_ENV: 'test' })).toBe(true);
43
+ });
44
+ });
45
+
46
+ describe('MagicLinkKeyManager ephemeral key reporting', () => {
47
+ let manager: IsolatedKeyManager;
48
+
49
+ beforeEach(() => {
50
+ logDoubles.LogWarning.mockClear();
51
+ logDoubles.LogStatusEx.mockClear();
52
+ manager = freshManager();
53
+ });
54
+
55
+ afterEach(() => {
56
+ const store = GetGlobalObjectStore();
57
+ if (store) {
58
+ delete store[manager.GlobalKey];
59
+ }
60
+ });
61
+
62
+ it('warns in the default output when no key is configured and NODE_ENV=production', () => {
63
+ manager.Initialize(undefined, { NODE_ENV: 'production' });
64
+
65
+ expect(manager.IsEphemeral).toBe(true);
66
+ expect(logDoubles.LogWarning).toHaveBeenCalledTimes(1);
67
+ expect(logDoubles.LogWarning).toHaveBeenCalledWith(EPHEMERAL_MAGIC_LINK_KEY_WARNING);
68
+ expect(logDoubles.LogStatusEx).not.toHaveBeenCalled();
69
+ });
70
+
71
+ it('the warning names the restart and multi-instance consequences and how to configure a key', () => {
72
+ expect(EPHEMERAL_MAGIC_LINK_KEY_WARNING).toContain('restarts');
73
+ expect(EPHEMERAL_MAGIC_LINK_KEY_WARNING).toContain('other MJAPI instance');
74
+ expect(EPHEMERAL_MAGIC_LINK_KEY_WARNING).toContain('magicLink.rsaPrivateKey');
75
+ expect(EPHEMERAL_MAGIC_LINK_KEY_WARNING).toContain('MJ_MAGIC_LINK_PRIVATE_KEY');
76
+ });
77
+
78
+ it('keeps the notice verbose-only in local dev', () => {
79
+ manager.Initialize(undefined, {});
80
+
81
+ expect(manager.IsEphemeral).toBe(true);
82
+ expect(logDoubles.LogWarning).not.toHaveBeenCalled();
83
+ expect(logDoubles.LogStatusEx).toHaveBeenCalledTimes(1);
84
+ expect(logDoubles.LogStatusEx.mock.calls[0][0]).toMatchObject({ verboseOnly: true });
85
+ });
86
+
87
+ it('is not ephemeral and logs nothing when a key is configured, even in production', () => {
88
+ const { privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
89
+ const pem = privateKey.export({ type: 'pkcs8', format: 'pem' }) as string;
90
+
91
+ manager.Initialize(pem, { NODE_ENV: 'production' });
92
+
93
+ expect(manager.IsEphemeral).toBe(false);
94
+ expect(logDoubles.LogWarning).not.toHaveBeenCalled();
95
+ expect(logDoubles.LogStatusEx).not.toHaveBeenCalled();
96
+ });
97
+
98
+ it('reports IsEphemeral false before initialization', () => {
99
+ expect(manager.IsEphemeral).toBe(false);
100
+ expect(manager.IsInitialized).toBe(false);
101
+ });
102
+ });