@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
@@ -10,11 +10,28 @@
10
10
  */
11
11
 
12
12
  import { BaseSingleton } from '@memberjunction/global';
13
- import { LogStatusEx } from '@memberjunction/core';
13
+ import { LogStatusEx, LogWarning } from '@memberjunction/core';
14
14
  import { createPrivateKey, createPublicKey, generateKeyPairSync, createHash, type KeyObject } from 'node:crypto';
15
15
  import jwt from 'jsonwebtoken';
16
16
  import type { MagicLinkJWTClaims } from './types.js';
17
17
 
18
+ /**
19
+ * True when the process is NOT running with `NODE_ENV=production`. This is the same
20
+ * production/local-dev line MJServer already uses to forbid local dev auth in production.
21
+ */
22
+ export function IsMagicLinkLocalDevEnvironment(env: NodeJS.ProcessEnv = process.env): boolean {
23
+ return env.NODE_ENV?.trim().toLowerCase() !== 'production';
24
+ }
25
+
26
+ /** Warning logged when a non-local-dev server falls back to an ephemeral keypair. */
27
+ export const EPHEMERAL_MAGIC_LINK_KEY_WARNING =
28
+ '[MagicLink] No rsaPrivateKey configured and NODE_ENV=production — generated an EPHEMERAL RS256 keypair. ' +
29
+ 'Magic-link session tokens signed with it will stop validating when this process restarts, and they will not ' +
30
+ 'validate on any other MJAPI instance behind the same load balancer, because each process generates its own key. ' +
31
+ 'To fix, generate one RSA private key (e.g. `openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048`) and set it ' +
32
+ 'as magicLink.rsaPrivateKey in mj.config.cjs or as MJ_MAGIC_LINK_PRIVATE_KEY (raw or base64-encoded PEM), ' +
33
+ 'using the same key on every instance.';
34
+
18
35
  /** A single JSON Web Key plus the metadata jwks-rsa needs to match it. */
19
36
  interface PublishedJWK extends JsonWebKey {
20
37
  kid: string;
@@ -34,6 +51,7 @@ export class MagicLinkKeyManager extends BaseSingleton<MagicLinkKeyManager> {
34
51
  private publicKey?: KeyObject;
35
52
  private _kid = '';
36
53
  private _initialized = false;
54
+ private _isEphemeral = false;
37
55
 
38
56
  // Public to satisfy BaseSingleton.getInstance's `this: new () => T` constraint
39
57
  // (matches the AuthProviderFactory singleton pattern).
@@ -49,6 +67,15 @@ export class MagicLinkKeyManager extends BaseSingleton<MagicLinkKeyManager> {
49
67
  return this._initialized;
50
68
  }
51
69
 
70
+ /**
71
+ * True when no private key was configured and the keypair was generated for this process
72
+ * only. Tokens signed with an ephemeral key do not survive a restart and do not validate on
73
+ * other instances. Downstream code should ask this rather than reading the raw config value.
74
+ */
75
+ public get IsEphemeral(): boolean {
76
+ return this._isEphemeral;
77
+ }
78
+
52
79
  public get Kid(): string {
53
80
  return this._kid;
54
81
  }
@@ -56,8 +83,11 @@ export class MagicLinkKeyManager extends BaseSingleton<MagicLinkKeyManager> {
56
83
  /**
57
84
  * Initializes the keypair from a provided PEM (raw or base64-encoded) or, if
58
85
  * none is supplied, generates an ephemeral 2048-bit RSA keypair. Idempotent.
86
+ *
87
+ * @param env - process environment used to decide whether the ephemeral fallback is a local-dev
88
+ * default (verbose-only notice) or a production misconfiguration (warning). Defaults to `process.env`.
59
89
  */
60
- public Initialize(privateKeyPem?: string): void {
90
+ public Initialize(privateKeyPem?: string, env: NodeJS.ProcessEnv = process.env): void {
61
91
  if (this._initialized) {
62
92
  return;
63
93
  }
@@ -69,17 +99,8 @@ export class MagicLinkKeyManager extends BaseSingleton<MagicLinkKeyManager> {
69
99
  } else {
70
100
  const { privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
71
101
  priv = privateKey;
72
- // Verbose-only: on dev boxes with no configured key this fires on EVERY boot, and the
73
- // ephemeral fallback is the designed behavior there — not a condition worth a log line in
74
- // the default startup output. Deployments that care set the key; operators diagnosing
75
- // magic-link session loss can re-run with verbose logging.
76
- LogStatusEx({
77
- message:
78
- '[MagicLink] No rsaPrivateKey configured — generated an EPHEMERAL RS256 keypair. ' +
79
- 'Outstanding magic-link sessions will be invalidated on restart. Set magicLink.rsaPrivateKey ' +
80
- '(or MJ_MAGIC_LINK_PRIVATE_KEY) for stable production keys.',
81
- verboseOnly: true
82
- });
102
+ this._isEphemeral = true;
103
+ this.reportEphemeralKey(env);
83
104
  }
84
105
 
85
106
  this.privateKeyPem = priv.export({ type: 'pkcs8', format: 'pem' }) as string;
@@ -89,14 +110,106 @@ export class MagicLinkKeyManager extends BaseSingleton<MagicLinkKeyManager> {
89
110
  }
90
111
 
91
112
  /**
92
- * Signs a set of magic-link claims and returns the compact JWT.
113
+ * Signs a set of magic-link (or local-dev) claims and returns the compact JWT.
93
114
  * `iat`/`exp` are expected to already be set on the claims.
94
115
  */
95
- public Sign(claims: MagicLinkJWTClaims): string {
116
+ public Sign<T extends object>(claims: T): string {
96
117
  this.ensureInitialized();
97
118
  return jwt.sign(claims, this.privateKeyPem, { algorithm: 'RS256', keyid: this._kid });
98
119
  }
99
120
 
121
+ /**
122
+ * Verifies a magic-link session JWT signed by this key manager (`RS256`, `mj_magic_link === true`).
123
+ * Returns `null` if invalid, expired, or forged.
124
+ */
125
+ public VerifySessionToken(
126
+ token: string,
127
+ options?: { issuer?: string; audience?: string },
128
+ ): MagicLinkJWTClaims | null {
129
+ this.ensureInitialized();
130
+ try {
131
+ const publicPem = this.publicKey!.export({ type: 'spki', format: 'pem' }) as string;
132
+ const verifyOptions: jwt.VerifyOptions = { algorithms: ['RS256'] };
133
+ if (options?.issuer) {
134
+ verifyOptions.issuer = options.issuer;
135
+ }
136
+ if (options?.audience) {
137
+ verifyOptions.audience = options.audience;
138
+ }
139
+ const decoded = jwt.verify(token, publicPem, verifyOptions);
140
+ if (!decoded || typeof decoded !== 'object') {
141
+ return null;
142
+ }
143
+ const claims = decoded as MagicLinkJWTClaims;
144
+ if (claims.mj_magic_link !== true || typeof claims.sub !== 'string') {
145
+ return null;
146
+ }
147
+ return claims;
148
+ } catch {
149
+ return null;
150
+ }
151
+ }
152
+
153
+ /**
154
+ * Signs a redirect binding JWT (`mj_purpose = 'magic-link-redirect'`) that cryptographically
155
+ * binds a validated `redirectUrl` to a specific invite's `tokenHash`.
156
+ *
157
+ * Note: Expiration is intentionally omitted from the redirect binding JWT because the database
158
+ * invite row's `ExpiresAt` (enforced atomically during `RedeemInvite`) is the authoritative,
159
+ * mutable expiration — allowing `UpdateInviteExpiry()` to extend an invite without invalidating
160
+ * an already-delivered `&rt=` parameter.
161
+ */
162
+ public SignRedirectBinding(tokenHash: string, redirectUrl: string, _expiresAtEpochSeconds?: number): string {
163
+ this.ensureInitialized();
164
+ const nowSeconds = Math.floor(Date.now() / 1000);
165
+ return jwt.sign(
166
+ {
167
+ mj_purpose: 'magic-link-redirect',
168
+ mj_th: tokenHash,
169
+ mj_redirect: redirectUrl,
170
+ iat: nowSeconds,
171
+ },
172
+ this.privateKeyPem,
173
+ { algorithm: 'RS256', keyid: this._kid },
174
+ );
175
+ }
176
+
177
+ /**
178
+ * Verifies a redirect binding JWT produced by {@link SignRedirectBinding} and ensures it matches
179
+ * `expectedTokenHash` (preventing cross-invite substitution) and carries a valid `http(s)` URL.
180
+ * Ignores JWT `exp` so bindings minted before an `UpdateInviteExpiry()` extension remain valid
181
+ * while the underlying invite row is valid. Returns the bound URL or `null`.
182
+ */
183
+ public VerifyRedirectBinding(bindingToken: string, expectedTokenHash: string): string | null {
184
+ this.ensureInitialized();
185
+ try {
186
+ const publicPem = this.publicKey!.export({ type: 'spki', format: 'pem' }) as string;
187
+ const decoded = jwt.verify(bindingToken, publicPem, {
188
+ algorithms: ['RS256'],
189
+ ignoreExpiration: true,
190
+ });
191
+ if (!decoded || typeof decoded !== 'object') {
192
+ return null;
193
+ }
194
+ const record = decoded as { mj_purpose?: string; mj_th?: string; mj_redirect?: string };
195
+ if (
196
+ record.mj_purpose !== 'magic-link-redirect' ||
197
+ record.mj_th !== expectedTokenHash ||
198
+ typeof record.mj_redirect !== 'string' ||
199
+ !record.mj_redirect
200
+ ) {
201
+ return null;
202
+ }
203
+ const parsed = new URL(record.mj_redirect);
204
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
205
+ return null;
206
+ }
207
+ return record.mj_redirect;
208
+ } catch {
209
+ return null;
210
+ }
211
+ }
212
+
100
213
  /**
101
214
  * Returns the JWKS document (public key set) for the JWKS endpoint.
102
215
  */
@@ -106,6 +219,25 @@ export class MagicLinkKeyManager extends BaseSingleton<MagicLinkKeyManager> {
106
219
  return { keys: [{ ...jwk, kid: this._kid, use: 'sig', alg: 'RS256' }] };
107
220
  }
108
221
 
222
+ /**
223
+ * Local dev (NODE_ENV not 'production'): the ephemeral fallback is the designed behavior and
224
+ * fires on every boot, so the notice stays verbose-only. Otherwise it is a data-loss-on-restart
225
+ * misconfiguration, so it is a warning in the default output.
226
+ */
227
+ private reportEphemeralKey(env: NodeJS.ProcessEnv): void {
228
+ if (!IsMagicLinkLocalDevEnvironment(env)) {
229
+ LogWarning(EPHEMERAL_MAGIC_LINK_KEY_WARNING);
230
+ return;
231
+ }
232
+ LogStatusEx({
233
+ message:
234
+ '[MagicLink] No rsaPrivateKey configured — generated an EPHEMERAL RS256 keypair. ' +
235
+ 'Outstanding magic-link sessions will be invalidated on restart. Set magicLink.rsaPrivateKey ' +
236
+ '(or MJ_MAGIC_LINK_PRIVATE_KEY) for stable production keys.',
237
+ verboseOnly: true
238
+ });
239
+ }
240
+
109
241
  private ensureInitialized(): void {
110
242
  if (!this._initialized) {
111
243
  throw new Error('MagicLinkKeyManager not initialized — call Initialize() during server startup.');
@@ -32,6 +32,7 @@ export const MAGIC_LINK_JWKS_PATH = `${MAGIC_LINK_MOUNT_PATH}/jwks.json`;
32
32
  export function CreateMagicLinkHandler(publicUrl: string, config: MagicLinkConfig): {
33
33
  publicRouter: Router;
34
34
  authenticatedRouter: Router;
35
+ service: MagicLinkService;
35
36
  } {
36
37
  // Initialize the signing keypair once.
37
38
  MagicLinkKeyManager.Instance.Initialize(config.rsaPrivateKey);
@@ -64,10 +65,27 @@ export function CreateMagicLinkHandler(publicUrl: string, config: MagicLinkConfi
64
65
  res.status(200).json(MagicLinkKeyManager.Instance.GetJWKS());
65
66
  });
66
67
 
67
- // Sends a completed redemption result: browser flow → 302 into Explorer with
68
+ // Sends a completed redemption result: browser flow → 302 into a verified per-invite
69
+ // RedirectUrl (when cryptographically bound + origin-allowed) or Explorer with
68
70
  // the session token in the URL fragment (never sent to a server, so it stays
69
71
  // out of access/proxy logs); API flow → JSON with an appropriate status.
70
- const sendRedeemResult = (res: Response, result: RedeemMagicLinkResult, wantsJson: boolean): void => {
72
+ const sendRedeemResult = (
73
+ res: Response,
74
+ result: RedeemMagicLinkResult,
75
+ wantsJson: boolean,
76
+ verifiedRedirectUrl?: string,
77
+ ): void => {
78
+ if (verifiedRedirectUrl && !wantsJson) {
79
+ const baseWithoutHash = verifiedRedirectUrl.split('#')[0];
80
+ if (result.success && result.token) {
81
+ res.redirect(302, `${baseWithoutHash}#token=${encodeURIComponent(result.token)}`);
82
+ } else {
83
+ const sep = baseWithoutHash.includes('?') ? '&' : '?';
84
+ res.redirect(302, `${baseWithoutHash}${sep}mlError=${encodeURIComponent(result.errorCode ?? 'invalid')}`);
85
+ }
86
+ return;
87
+ }
88
+
71
89
  const explorerUrl = config.explorerUrl?.replace(/\/$/, '');
72
90
  if (explorerUrl && !wantsJson) {
73
91
  if (result.success && result.token) {
@@ -102,6 +120,7 @@ export function CreateMagicLinkHandler(publicUrl: string, config: MagicLinkConfi
102
120
  // the actual redemption happens only on POST (below), gated by a user click.
103
121
  publicRouter.get('/redeem', redeemLimiter, (req: Request, res: Response) => {
104
122
  const token = typeof req.query.token === 'string' ? req.query.token : '';
123
+ const rt = typeof req.query.rt === 'string' ? req.query.rt : undefined;
105
124
  if (!token) {
106
125
  res.status(400).json({ success: false, error: 'Missing token.' });
107
126
  return;
@@ -114,16 +133,19 @@ export function CreateMagicLinkHandler(publicUrl: string, config: MagicLinkConfi
114
133
  res
115
134
  .status(200)
116
135
  .type('html')
117
- .send(BuildRedeemLandingHtml(token, ApiRoute(`${MAGIC_LINK_MOUNT_PATH}/redeem`)));
136
+ .send(BuildRedeemLandingHtml(token, ApiRoute(`${MAGIC_LINK_MOUNT_PATH}/redeem`), rt));
118
137
  });
119
138
 
120
139
  // POST /redeem performs the actual (side-effectful) redemption. Token arrives
121
140
  // from the interstitial form body, an API client's JSON body, or the query.
122
141
  publicRouter.post('/redeem', redeemLimiter, urlencoded({ extended: false }), json(), async (req: Request, res: Response) => {
123
- const body = (req.body ?? {}) as { token?: string };
142
+ const body = (req.body ?? {}) as { token?: string; rt?: string };
124
143
  const token =
125
144
  (typeof body.token === 'string' && body.token) ||
126
145
  (typeof req.query.token === 'string' ? req.query.token : '');
146
+ const rt =
147
+ (typeof body.rt === 'string' && body.rt) ||
148
+ (typeof req.query.rt === 'string' ? req.query.rt : undefined);
127
149
  const wantsJson = req.query.format === 'json' || req.is('application/json') === 'application/json';
128
150
 
129
151
  if (!token) {
@@ -131,6 +153,8 @@ export function CreateMagicLinkHandler(publicUrl: string, config: MagicLinkConfi
131
153
  return;
132
154
  }
133
155
 
156
+ const verifiedRedirectUrl = service.ResolveVerifiedRedirectUrl(token, rt);
157
+
134
158
  // Forensic context for the redemption audit trail. `req.ip` honors the app's
135
159
  // trust-proxy setting; headers are best-effort and may be absent for API clients.
136
160
  const result = await service.RedeemInvite(token, {
@@ -138,7 +162,7 @@ export function CreateMagicLinkHandler(publicUrl: string, config: MagicLinkConfi
138
162
  userAgent: req.get('user-agent') ?? undefined,
139
163
  origin: req.get('origin') ?? undefined,
140
164
  });
141
- sendRedeemResult(res, result, wantsJson);
165
+ sendRedeemResult(res, result, wantsJson, verifiedRedirectUrl);
142
166
  });
143
167
 
144
168
  // ── Authenticated (invite creation) ───────────────────────────────────────
@@ -166,6 +190,8 @@ export function CreateMagicLinkHandler(publicUrl: string, config: MagicLinkConfi
166
190
  MaxUses: body.MaxUses,
167
191
  firstName: body.firstName,
168
192
  lastName: body.lastName,
193
+ RedirectUrl: body.RedirectUrl,
194
+ SendEmail: body.SendEmail,
169
195
  },
170
196
  creatingUser,
171
197
  );
@@ -175,13 +201,14 @@ export function CreateMagicLinkHandler(publicUrl: string, config: MagicLinkConfi
175
201
  res.status(status).json(result);
176
202
  });
177
203
 
178
- return { publicRouter, authenticatedRouter };
204
+ return { publicRouter, authenticatedRouter, service };
179
205
  }
180
206
 
181
207
  /** @deprecated Use {@link CreateMagicLinkHandler}. */
182
208
  export function createMagicLinkHandler(publicUrl: string, config: MagicLinkConfig): {
183
209
  publicRouter: Router;
184
210
  authenticatedRouter: Router;
211
+ service: MagicLinkService;
185
212
  } {
186
213
  return CreateMagicLinkHandler(publicUrl, config);
187
214
  }
@@ -37,9 +37,12 @@ import { configInfo, type MagicLinkConfig } from '../../config.js';
37
37
  import { CreateIsolatedProvider } from '../../isolatedProvider.js';
38
38
  import { MagicLinkKeyManager } from './MagicLinkKeys.js';
39
39
  import { GenerateRawToken, GenerateSessionId, HashToken, EvaluateInvite, BuildSessionClaims, BuildConsumeInvitePostgresSQL, CanIssueInvites, IsRoleGrantable, MAGIC_LINK_TOKEN_PREFIX } from './magicLinkCore.js';
40
+ import type { IServerExtensionMagicLinkService } from '@memberjunction/server-extensions-core';
40
41
  import type {
41
42
  CreateMagicLinkInviteParams,
42
43
  CreateMagicLinkInviteResult,
44
+ ManageMagicLinkInviteResult,
45
+ MagicLinkJWTClaims,
43
46
  RedeemMagicLinkResult,
44
47
  RedeemAuditContext,
45
48
  } from './types.js';
@@ -75,11 +78,53 @@ interface ProvisionResult {
75
78
  error?: string;
76
79
  }
77
80
 
81
+ /**
82
+ * Validates that a candidate `redirectUrl` is a well-formed `http:` or `https:` URL whose
83
+ * origin matches at least one concrete normalized entry in `allowedOrigins`.
84
+ * Wildcard `'*'` entries are explicitly ignored/rejected so session tokens can never be
85
+ * redirected to unvalidated origins.
86
+ */
87
+ export function IsMagicLinkRedirectUrlAllowed(redirectUrl: string, allowedOrigins: readonly string[]): boolean {
88
+ const trimmed = redirectUrl.trim();
89
+ if (!trimmed) {
90
+ return false;
91
+ }
92
+ let parsed: URL;
93
+ try {
94
+ parsed = new URL(trimmed);
95
+ } catch {
96
+ return false;
97
+ }
98
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
99
+ return false;
100
+ }
101
+ const normalizedTargetOrigin = parsed.origin.toLowerCase();
102
+ for (const rawAllowed of allowedOrigins) {
103
+ const candidate = (rawAllowed ?? '').trim();
104
+ if (!candidate || candidate === '*') {
105
+ continue;
106
+ }
107
+ try {
108
+ const allowedUrl = new URL(candidate);
109
+ if (allowedUrl.origin.toLowerCase() === normalizedTargetOrigin) {
110
+ return true;
111
+ }
112
+ } catch {
113
+ if (candidate.replace(/\/$/, '').toLowerCase() === normalizedTargetOrigin) {
114
+ return true;
115
+ }
116
+ }
117
+ }
118
+ return false;
119
+ }
120
+
78
121
  /**
79
122
  * Magic-link service. One instance per server, constructed with the resolved
80
- * public URL and the validated config.
123
+ * public URL and the validated config. Implements {@link IServerExtensionMagicLinkService}
124
+ * so `BaseServerExtension` implementations can mint, revoke, extend, and verify invites
125
+ * via `context.services.GetMagicLinkService?.()`.
81
126
  */
82
- export class MagicLinkService {
127
+ export class MagicLinkService implements IServerExtensionMagicLinkService {
83
128
  constructor(
84
129
  private readonly publicUrl: string,
85
130
  private readonly config: MagicLinkConfig,
@@ -87,7 +132,7 @@ export class MagicLinkService {
87
132
 
88
133
  /**
89
134
  * Creates a single-use, app-scoped invite, persists its hashed token, and
90
- * (when a communication provider is configured) emails the link.
135
+ * (when a communication provider is configured and `params.SendEmail !== false`) emails the link.
91
136
  *
92
137
  * @param params invite parameters
93
138
  * @param creatingUser the authenticated internal user issuing the invite
@@ -110,6 +155,15 @@ export class MagicLinkService {
110
155
  return { success: false, errorCode: 'forbidden', error: 'Not authorized to issue magic-link invites.' };
111
156
  }
112
157
 
158
+ const validatedRedirectUrl = params.RedirectUrl?.trim() ? params.RedirectUrl.trim() : undefined;
159
+ if (validatedRedirectUrl && !IsMagicLinkRedirectUrlAllowed(validatedRedirectUrl, this.allowedRedirectOrigins())) {
160
+ return {
161
+ success: false,
162
+ errorCode: 'invalid_redirect_url',
163
+ error: `RedirectUrl '${validatedRedirectUrl}' is not permitted by the server's allowed frontend origins.`,
164
+ };
165
+ }
166
+
113
167
  const roleId = params.RoleId ?? this.resolveRestrictedRoleId(md);
114
168
  if (!roleId) {
115
169
  return { success: false, error: `Restricted role '${this.config.restrictedRoleName}' not found and no roleId supplied.` };
@@ -136,12 +190,13 @@ export class MagicLinkService {
136
190
  }
137
191
 
138
192
  const rawToken = GenerateRawToken();
193
+ const tokenHash = HashToken(rawToken);
139
194
  const expiresInHours = params.ExpiresInHours ?? this.config.defaultExpiresInHours;
140
195
  const expiresAt = new Date(Date.now() + expiresInHours * 3600 * 1000);
141
196
 
142
197
  const invite = await md.GetEntityObject<MJMagicLinkInviteEntity>(INVITE_ENTITY, creatingUser);
143
198
  invite.NewRecord();
144
- invite.TokenHash = HashToken(rawToken);
199
+ invite.TokenHash = tokenHash;
145
200
  invite.Email = params.email;
146
201
  invite.ApplicationID = params.ApplicationId;
147
202
  invite.RoleID = roleId;
@@ -161,10 +216,22 @@ export class MagicLinkService {
161
216
  // multi-scope reads. Best-effort so a child-row hiccup never fails issuance.
162
217
  await this.writeInviteScopeChildRows(invite.ID, params.ApplicationId, roleId, creatingUser, md);
163
218
 
164
- const redemptionUrl = this.buildRedemptionUrl(rawToken);
219
+ let redirectBindingToken: string | undefined;
220
+ if (validatedRedirectUrl) {
221
+ if (!MagicLinkKeyManager.Instance.IsInitialized) {
222
+ MagicLinkKeyManager.Instance.Initialize(this.config.rsaPrivateKey);
223
+ }
224
+ redirectBindingToken = MagicLinkKeyManager.Instance.SignRedirectBinding(
225
+ tokenHash,
226
+ validatedRedirectUrl,
227
+ Math.floor(expiresAt.getTime() / 1000),
228
+ );
229
+ }
230
+
231
+ const redemptionUrl = this.buildRedemptionUrl(rawToken, redirectBindingToken);
165
232
 
166
233
  let emailSent = false;
167
- if (this.config.communicationProvider) {
234
+ if (params.SendEmail !== false && this.config.communicationProvider) {
168
235
  emailSent = await this.sendInviteEmail(params.email, redemptionUrl, app.Name, creatingUser);
169
236
  }
170
237
 
@@ -172,7 +239,7 @@ export class MagicLinkService {
172
239
  success: true,
173
240
  inviteId: invite.ID,
174
241
  redemptionUrl,
175
- // Surface the raw token only when we couldn't deliver it ourselves.
242
+ // Surface the raw token only when we couldn't (or were asked not to) deliver it ourselves.
176
243
  rawToken: emailSent ? undefined : rawToken,
177
244
  emailSent,
178
245
  expiresAt: expiresAt.toISOString(),
@@ -183,6 +250,158 @@ export class MagicLinkService {
183
250
  }
184
251
  }
185
252
 
253
+ /**
254
+ * Revokes an existing invite so subsequent redemptions fail with `'revoked'`.
255
+ * Requires the acting user to hold invite-issuance authority (`CanIssueInvites`).
256
+ */
257
+ public async RevokeInvite(
258
+ inviteId: string,
259
+ actingUser: UserInfo,
260
+ provider?: IMetadataProvider,
261
+ ): Promise<ManageMagicLinkInviteResult> {
262
+ try {
263
+ const callerRoleNames = (actingUser.UserRoles ?? []).map((r) => r.Role).filter((n): n is string => !!n);
264
+ if (!CanIssueInvites(actingUser.Type, callerRoleNames, this.config.inviteIssuerRoleNames)) {
265
+ return { success: false, errorCode: 'forbidden', error: 'Not authorized to revoke magic-link invites.' };
266
+ }
267
+ if (!inviteId?.trim()) {
268
+ return { success: false, errorCode: 'not_found', error: 'Invite ID is required.' };
269
+ }
270
+
271
+ const md = provider ?? Metadata.Provider;
272
+ const invite = await md.GetEntityObject<MJMagicLinkInviteEntity>(INVITE_ENTITY, actingUser);
273
+ const loaded = await invite.Load(inviteId.trim());
274
+ if (!loaded) {
275
+ return { success: false, errorCode: 'not_found', error: `Invite '${inviteId}' not found.` };
276
+ }
277
+
278
+ if (invite.Status === 'Revoked') {
279
+ return {
280
+ success: true,
281
+ inviteId: invite.ID,
282
+ status: invite.Status,
283
+ expiresAt: invite.ExpiresAt.toISOString(),
284
+ };
285
+ }
286
+
287
+ invite.Status = 'Revoked';
288
+ if (!(await invite.Save())) {
289
+ return {
290
+ success: false,
291
+ errorCode: 'server_error',
292
+ error: `Failed to revoke invite: ${invite.LatestResult?.CompleteMessage ?? 'unknown error'}`,
293
+ };
294
+ }
295
+
296
+ return {
297
+ success: true,
298
+ inviteId: invite.ID,
299
+ status: invite.Status,
300
+ expiresAt: invite.ExpiresAt.toISOString(),
301
+ };
302
+ } catch (e) {
303
+ LogError(e);
304
+ return { success: false, errorCode: 'server_error', error: e instanceof Error ? e.message : String(e) };
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Updates the expiration timestamp of an existing non-revoked, non-consumed invite.
310
+ * Requires the acting user to hold invite-issuance authority (`CanIssueInvites`).
311
+ */
312
+ public async UpdateInviteExpiry(
313
+ inviteId: string,
314
+ expiresAt: Date,
315
+ actingUser: UserInfo,
316
+ provider?: IMetadataProvider,
317
+ ): Promise<ManageMagicLinkInviteResult> {
318
+ try {
319
+ const callerRoleNames = (actingUser.UserRoles ?? []).map((r) => r.Role).filter((n): n is string => !!n);
320
+ if (!CanIssueInvites(actingUser.Type, callerRoleNames, this.config.inviteIssuerRoleNames)) {
321
+ return { success: false, errorCode: 'forbidden', error: 'Not authorized to update magic-link invites.' };
322
+ }
323
+ if (!(expiresAt instanceof Date) || Number.isNaN(expiresAt.getTime())) {
324
+ return { success: false, errorCode: 'invalid_expiry', error: 'expiresAt must be a valid Date.' };
325
+ }
326
+ if (!inviteId?.trim()) {
327
+ return { success: false, errorCode: 'not_found', error: 'Invite ID is required.' };
328
+ }
329
+
330
+ const md = provider ?? Metadata.Provider;
331
+ const invite = await md.GetEntityObject<MJMagicLinkInviteEntity>(INVITE_ENTITY, actingUser);
332
+ const loaded = await invite.Load(inviteId.trim());
333
+ if (!loaded) {
334
+ return { success: false, errorCode: 'not_found', error: `Invite '${inviteId}' not found.` };
335
+ }
336
+
337
+ if (invite.Status === 'Revoked' || invite.Status === 'Consumed') {
338
+ return {
339
+ success: false,
340
+ errorCode: 'invalid_state',
341
+ error: `Cannot update expiry on invite '${invite.ID}' because its status is '${invite.Status}'.`,
342
+ };
343
+ }
344
+
345
+ const nowMs = Date.now();
346
+ invite.ExpiresAt = expiresAt;
347
+ if (invite.Status === 'Expired' && expiresAt.getTime() > nowMs && invite.UseCount < invite.MaxUses) {
348
+ invite.Status = 'Active';
349
+ } else if (invite.Status === 'Active' && expiresAt.getTime() <= nowMs) {
350
+ invite.Status = 'Expired';
351
+ }
352
+
353
+ if (!(await invite.Save())) {
354
+ return {
355
+ success: false,
356
+ errorCode: 'server_error',
357
+ error: `Failed to update invite expiry: ${invite.LatestResult?.CompleteMessage ?? 'unknown error'}`,
358
+ };
359
+ }
360
+
361
+ return {
362
+ success: true,
363
+ inviteId: invite.ID,
364
+ status: invite.Status,
365
+ expiresAt: invite.ExpiresAt.toISOString(),
366
+ };
367
+ } catch (e) {
368
+ LogError(e);
369
+ return { success: false, errorCode: 'server_error', error: e instanceof Error ? e.message : String(e) };
370
+ }
371
+ }
372
+
373
+ /**
374
+ * Verifies a magic-link session JWT against this service's configured issuer and audience.
375
+ */
376
+ public VerifySessionToken(token: string): MagicLinkJWTClaims | null {
377
+ if (!token || !MagicLinkKeyManager.Instance.IsInitialized) {
378
+ return null;
379
+ }
380
+ return MagicLinkKeyManager.Instance.VerifySessionToken(token, {
381
+ issuer: this.publicUrl,
382
+ audience: this.config.audience,
383
+ });
384
+ }
385
+
386
+ /**
387
+ * Verifies a signed redirect binding (`rt`) against the raw invite token's hash AND the host's
388
+ * allowed frontend origins. Returns the verified redirect URL, or `undefined` if absent/invalid.
389
+ */
390
+ public ResolveVerifiedRedirectUrl(rawToken: string, redirectBindingToken: string | undefined): string | undefined {
391
+ if (!rawToken || !redirectBindingToken || !MagicLinkKeyManager.Instance.IsInitialized) {
392
+ return undefined;
393
+ }
394
+ const tokenHash = HashToken(rawToken);
395
+ const boundUrl = MagicLinkKeyManager.Instance.VerifyRedirectBinding(redirectBindingToken, tokenHash);
396
+ if (!boundUrl) {
397
+ return undefined;
398
+ }
399
+ if (!IsMagicLinkRedirectUrlAllowed(boundUrl, this.allowedRedirectOrigins())) {
400
+ return undefined;
401
+ }
402
+ return boundUrl;
403
+ }
404
+
186
405
  /**
187
406
  * Redeems a raw token: validates the invite, atomically consumes one use,
188
407
  * provisions/links the user with the restricted role + app, and mints a
@@ -420,10 +639,31 @@ export class MagicLinkService {
420
639
  return role?.ID;
421
640
  }
422
641
 
423
- /** Builds the shareable redemption URL. */
424
- private buildRedemptionUrl(rawToken: string): string {
642
+ /** Builds the shareable redemption URL (including `&rt=...` when a per-invite RedirectUrl was signed). */
643
+ private buildRedemptionUrl(rawToken: string, redirectBindingToken?: string): string {
425
644
  const base = this.publicUrl.replace(/\/$/, '');
426
- return `${base}/magic-link/redeem?token=${encodeURIComponent(rawToken)}`;
645
+ const rtParam = redirectBindingToken ? `&rt=${encodeURIComponent(redirectBindingToken)}` : '';
646
+ return `${base}/magic-link/redeem?token=${encodeURIComponent(rawToken)}${rtParam}`;
647
+ }
648
+
649
+ /**
650
+ * Collects concrete frontend origins a caller-supplied per-invite `RedirectUrl` is permitted
651
+ * to target (`explorerUrl`, `magicLink.allowedRedirectOrigins`, and non-wildcard `cors.allowedOrigins`).
652
+ */
653
+ private allowedRedirectOrigins(): string[] {
654
+ const origins: string[] = [];
655
+ const candidates: readonly (string | undefined)[] = [
656
+ this.config.explorerUrl ?? configInfo.magicLink?.explorerUrl,
657
+ ...(this.config.allowedRedirectOrigins ?? configInfo.magicLink?.allowedRedirectOrigins ?? []),
658
+ ...(configInfo.cors?.allowedOrigins ?? []),
659
+ ];
660
+ for (const raw of candidates) {
661
+ const trimmed = raw?.trim();
662
+ if (trimmed && trimmed !== '*') {
663
+ origins.push(trimmed);
664
+ }
665
+ }
666
+ return origins;
427
667
  }
428
668
 
429
669
  /**
@@ -8,7 +8,7 @@ export {
8
8
  type InviteEvaluationInput,
9
9
  } from './magicLinkCore.js';
10
10
  export { MagicLinkKeyManager } from './MagicLinkKeys.js';
11
- export { MagicLinkService } from './MagicLinkService.js';
11
+ export { MagicLinkService, IsMagicLinkRedirectUrlAllowed } from './MagicLinkService.js';
12
12
  export {
13
13
  CreateMagicLinkHandler, createMagicLinkHandler,
14
14
  CreateMagicLinkJwksRouter, createMagicLinkJwksRouter,