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

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 (560) hide show
  1. package/README.md +47 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/SessionJanitor.d.ts +91 -30
  4. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  5. package/dist/agentSessions/SessionJanitor.js +311 -81
  6. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  7. package/dist/agentSessions/SessionManager.d.ts +17 -3
  8. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  9. package/dist/agentSessions/SessionManager.js +44 -10
  10. package/dist/agentSessions/SessionManager.js.map +1 -1
  11. package/dist/apiRoot.d.ts +32 -0
  12. package/dist/apiRoot.d.ts.map +1 -0
  13. package/dist/apiRoot.js +67 -0
  14. package/dist/apiRoot.js.map +1 -0
  15. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  16. package/dist/auth/AuthProviderCatalogRouter.js +27 -0
  17. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  18. package/dist/auth/LoginScreenEngine.d.ts +22 -0
  19. package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
  20. package/dist/auth/LoginScreenEngine.js +57 -0
  21. package/dist/auth/LoginScreenEngine.js.map +1 -0
  22. package/dist/auth/index.d.ts +1 -0
  23. package/dist/auth/index.d.ts.map +1 -1
  24. package/dist/auth/index.js +52 -10
  25. package/dist/auth/index.js.map +1 -1
  26. package/dist/auth/initializeProviders.d.ts +10 -0
  27. package/dist/auth/initializeProviders.d.ts.map +1 -1
  28. package/dist/auth/initializeProviders.js +37 -1
  29. package/dist/auth/initializeProviders.js.map +1 -1
  30. package/dist/auth/localDevAuth.d.ts +79 -0
  31. package/dist/auth/localDevAuth.d.ts.map +1 -0
  32. package/dist/auth/localDevAuth.js +439 -0
  33. package/dist/auth/localDevAuth.js.map +1 -0
  34. package/dist/auth/magicLink/MagicLinkKeys.d.ts +2 -2
  35. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  36. package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
  37. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  38. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  39. package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
  40. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  41. package/dist/auth/magicLink/types.d.ts +12 -0
  42. package/dist/auth/magicLink/types.d.ts.map +1 -1
  43. package/dist/auth/sessionUserClone.d.ts +1 -1
  44. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  45. package/dist/auth/sessionUserClone.js +3 -2
  46. package/dist/auth/sessionUserClone.js.map +1 -1
  47. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  48. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  49. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  50. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  51. package/dist/broadcast/index.d.ts +6 -0
  52. package/dist/broadcast/index.d.ts.map +1 -0
  53. package/dist/broadcast/index.js +6 -0
  54. package/dist/broadcast/index.js.map +1 -0
  55. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  56. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  57. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  58. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  59. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  60. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  61. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  62. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  63. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  64. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  65. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  66. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  67. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  68. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  69. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  70. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  71. package/dist/cache.d.ts +3 -2
  72. package/dist/cache.d.ts.map +1 -1
  73. package/dist/cache.js.map +1 -1
  74. package/dist/config.d.ts +632 -22
  75. package/dist/config.d.ts.map +1 -1
  76. package/dist/config.js +104 -4
  77. package/dist/config.js.map +1 -1
  78. package/dist/context.d.ts +3 -1
  79. package/dist/context.d.ts.map +1 -1
  80. package/dist/context.js +29 -8
  81. package/dist/context.js.map +1 -1
  82. package/dist/coreRoutes.d.ts +29 -0
  83. package/dist/coreRoutes.d.ts.map +1 -0
  84. package/dist/coreRoutes.js +156 -0
  85. package/dist/coreRoutes.js.map +1 -0
  86. package/dist/generated/graphql-schemas/__mj.d.ts +1016 -29
  87. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  88. package/dist/generated/graphql-schemas/__mj.js +5125 -434
  89. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  90. package/dist/generic/CacheInvalidationResolver.d.ts +85 -30
  91. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  92. package/dist/generic/CacheInvalidationResolver.js +175 -60
  93. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  94. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  95. package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
  96. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  97. package/dist/generic/PubSubManager.d.ts +10 -0
  98. package/dist/generic/PubSubManager.d.ts.map +1 -1
  99. package/dist/generic/PubSubManager.js +44 -1
  100. package/dist/generic/PubSubManager.js.map +1 -1
  101. package/dist/generic/PushStatusResolver.d.ts +39 -6
  102. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  103. package/dist/generic/PushStatusResolver.js +94 -12
  104. package/dist/generic/PushStatusResolver.js.map +1 -1
  105. package/dist/generic/ResolverBase.d.ts +168 -69
  106. package/dist/generic/ResolverBase.d.ts.map +1 -1
  107. package/dist/generic/ResolverBase.js +464 -405
  108. package/dist/generic/ResolverBase.js.map +1 -1
  109. package/dist/generic/RunViewResolver.d.ts +11 -3
  110. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  111. package/dist/generic/RunViewResolver.js +91 -13
  112. package/dist/generic/RunViewResolver.js.map +1 -1
  113. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  114. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  115. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  116. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  117. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  118. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  119. package/dist/generic/fieldSecurityTransport.js +30 -0
  120. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  121. package/dist/globalCors.d.ts +33 -0
  122. package/dist/globalCors.d.ts.map +1 -0
  123. package/dist/globalCors.js +58 -0
  124. package/dist/globalCors.js.map +1 -0
  125. package/dist/index.d.ts +14 -0
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +230 -222
  128. package/dist/index.js.map +1 -1
  129. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  130. package/dist/integration/CustomColumnPromoter.js +6 -1
  131. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  132. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  133. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  134. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  135. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  136. package/dist/multiTenancy/index.d.ts.map +1 -1
  137. package/dist/multiTenancy/index.js +22 -2
  138. package/dist/multiTenancy/index.js.map +1 -1
  139. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
  140. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
  141. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
  142. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
  143. package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
  144. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
  145. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
  146. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
  147. package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
  148. package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
  149. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  150. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  151. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  152. package/dist/realtimeSessions/index.d.ts +2 -0
  153. package/dist/realtimeSessions/index.d.ts.map +1 -1
  154. package/dist/realtimeSessions/index.js +2 -0
  155. package/dist/realtimeSessions/index.js.map +1 -1
  156. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +32 -0
  157. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
  158. package/dist/realtimeSessions/ownedRealtimeSession.js +56 -0
  159. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
  160. package/dist/realtimeSessions/sessionAccess.d.ts +91 -8
  161. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  162. package/dist/realtimeSessions/sessionAccess.js +127 -20
  163. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  164. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  165. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  166. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  167. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  168. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  169. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  170. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  171. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  172. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  173. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  174. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  175. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  176. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  177. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  178. package/dist/realtimeWidget/WidgetSessionService.js +201 -19
  179. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  180. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  181. package/dist/realtimeWidget/host-identity.js +1 -1
  182. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  183. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  184. package/dist/realtimeWidget/widgetCore.js +17 -1
  185. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  186. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  187. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  188. package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
  189. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  190. package/dist/resolvers/ActionResolver.d.ts +19 -1
  191. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  192. package/dist/resolvers/ActionResolver.js +63 -12
  193. package/dist/resolvers/ActionResolver.js.map +1 -1
  194. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  195. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  196. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  197. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  198. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  199. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  200. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  201. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  202. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  203. package/dist/resolvers/AgentSessionResolver.js +40 -17
  204. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  205. package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
  206. package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
  207. package/dist/resolvers/ArtifactFileResolver.js +9 -7
  208. package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
  209. package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
  210. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  211. package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
  212. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  213. package/dist/resolvers/DatasetResolver.d.ts +24 -3
  214. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  215. package/dist/resolvers/DatasetResolver.js +57 -8
  216. package/dist/resolvers/DatasetResolver.js.map +1 -1
  217. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  218. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  219. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  220. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  221. package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
  222. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  223. package/dist/resolvers/EntityRecordNameResolver.js +3 -2
  224. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  225. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +46 -3
  226. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  227. package/dist/resolvers/FetchEntityVectorsResolver.js +211 -50
  228. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  229. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  230. package/dist/resolvers/FileCategoryResolver.js +1 -0
  231. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  232. package/dist/resolvers/FileResolver.d.ts +87 -11
  233. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  234. package/dist/resolvers/FileResolver.js +292 -105
  235. package/dist/resolvers/FileResolver.js.map +1 -1
  236. package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
  237. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  238. package/dist/resolvers/GetDataContextDataResolver.js +117 -38
  239. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  240. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  241. package/dist/resolvers/GetDataResolver.js +6 -3
  242. package/dist/resolvers/GetDataResolver.js.map +1 -1
  243. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  244. package/dist/resolvers/IntegrationDiscoveryResolver.js +49 -9
  245. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  246. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  247. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  248. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  249. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  250. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  251. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  252. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  253. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  254. package/dist/resolvers/QueryResolver.d.ts +2 -0
  255. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  256. package/dist/resolvers/QueryResolver.js +33 -6
  257. package/dist/resolvers/QueryResolver.js.map +1 -1
  258. package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
  259. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  260. package/dist/resolvers/QuerySystemUserResolver.js +15 -6
  261. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  262. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  263. package/dist/resolvers/RSUResolver.js +12 -0
  264. package/dist/resolvers/RSUResolver.js.map +1 -1
  265. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +18 -10
  266. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  267. package/dist/resolvers/RealtimeClientSessionResolver.js +92 -54
  268. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  269. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  270. package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
  271. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  272. package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
  273. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  274. package/dist/resolvers/RunAIAgentResolver.js +241 -67
  275. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  276. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  277. package/dist/resolvers/RunTemplateResolver.js +4 -4
  278. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  279. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  280. package/dist/resolvers/RunTestResolver.js +3 -1
  281. package/dist/resolvers/RunTestResolver.js.map +1 -1
  282. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
  283. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
  284. package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
  285. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  286. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  287. package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
  288. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  289. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  290. package/dist/resolvers/SyncDataResolver.js +4 -0
  291. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  292. package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
  293. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  294. package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
  295. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  296. package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
  297. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  298. package/dist/resolvers/TestQuerySQLResolver.js +66 -13
  299. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  300. package/dist/resolvers/TransactionGroupResolver.d.ts +34 -2
  301. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  302. package/dist/resolvers/TransactionGroupResolver.js +150 -27
  303. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  304. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  305. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  306. package/dist/resolvers/UserViewResolver.js +2 -1
  307. package/dist/resolvers/UserViewResolver.js.map +1 -1
  308. package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
  309. package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
  310. package/dist/resolvers/agent-run-data-guard.js +72 -0
  311. package/dist/resolvers/agent-run-data-guard.js.map +1 -0
  312. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  313. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  314. package/dist/rest/EntityCRUDHandler.js +19 -5
  315. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  316. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  317. package/dist/rest/RESTEndpointHandler.js +8 -5
  318. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  319. package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
  320. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
  321. package/dist/rest/RealtimeRecordingHandler.js +383 -0
  322. package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
  323. package/dist/rest/ViewOperationsHandler.d.ts +9 -1
  324. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  325. package/dist/rest/ViewOperationsHandler.js +43 -17
  326. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  327. package/dist/rest/setupRESTEndpoints.d.ts +6 -0
  328. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  329. package/dist/rest/setupRESTEndpoints.js +6 -0
  330. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  331. package/dist/serverExtensionReservedRoots.d.ts +12 -10
  332. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  333. package/dist/serverExtensionReservedRoots.js +14 -17
  334. package/dist/serverExtensionReservedRoots.js.map +1 -1
  335. package/dist/serverRoleConfigUnits.d.ts +29 -0
  336. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  337. package/dist/serverRoleConfigUnits.js +33 -0
  338. package/dist/serverRoleConfigUnits.js.map +1 -0
  339. package/dist/services/MJStorageBlobStore.d.ts +8 -1
  340. package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
  341. package/dist/services/MJStorageBlobStore.js +25 -19
  342. package/dist/services/MJStorageBlobStore.js.map +1 -1
  343. package/dist/services/StartTaskGraphDispatcher.js +2 -2
  344. package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
  345. package/dist/services/TaskGraphActionRunner.d.ts +5 -3
  346. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  347. package/dist/services/TaskGraphActionRunner.js +27 -5
  348. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  349. package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
  350. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  351. package/dist/services/TaskGraphAgentRunner.js +157 -9
  352. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  353. package/dist/services/TaskGraphContinuationDeliverer.d.ts +59 -2
  354. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  355. package/dist/services/TaskGraphContinuationDeliverer.js +626 -16
  356. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  357. package/dist/sharedCache.d.ts.map +1 -1
  358. package/dist/sharedCache.js +3 -0
  359. package/dist/sharedCache.js.map +1 -1
  360. package/dist/types.d.ts +23 -1
  361. package/dist/types.d.ts.map +1 -1
  362. package/dist/types.js.map +1 -1
  363. package/package.json +99 -98
  364. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  365. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  366. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  367. package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
  368. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  369. package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
  370. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  371. package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
  372. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  373. package/src/__tests__/FetchEntityVectorsResolver.test.ts +369 -18
  374. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  375. package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
  376. package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
  377. package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
  378. package/src/__tests__/LoginScreenEngine.test.ts +86 -0
  379. package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
  380. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  381. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  382. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  383. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  384. package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
  385. package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
  386. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
  387. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
  388. package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
  389. package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
  390. package/src/__tests__/ResolverBase.clientOldValues.test.ts +243 -7
  391. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  392. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
  393. package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
  394. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
  395. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  396. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  397. package/src/__tests__/RunAIAgentResolver.branch.test.ts +69 -13
  398. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  399. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  400. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +20 -28
  401. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +264 -0
  402. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  403. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
  404. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  405. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  406. package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
  407. package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
  408. package/src/__tests__/SessionJanitor.test.ts +365 -10
  409. package/src/__tests__/SessionManager.test.ts +122 -0
  410. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
  411. package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
  412. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +468 -23
  413. package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
  414. package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
  415. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  416. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
  417. package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
  418. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  419. package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
  420. package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
  421. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  422. package/src/__tests__/agent-run-data-guard.test.ts +130 -0
  423. package/src/__tests__/apiRootBoot.test.ts +202 -0
  424. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  425. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  426. package/src/__tests__/cacheInvalidationRecordData.test.ts +109 -0
  427. package/src/__tests__/conversationRunEvents.test.ts +56 -14
  428. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  429. package/src/__tests__/globalCors.test.ts +217 -0
  430. package/src/__tests__/localDevAuth.test.ts +196 -0
  431. package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
  432. package/src/__tests__/multiTenancy.security.test.ts +51 -0
  433. package/src/__tests__/multiTenancy.test.ts +1 -1
  434. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  435. package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
  436. package/src/__tests__/pushStatusResolver.filter.test.ts +64 -1
  437. package/src/__tests__/realtimeRecordingHandler.test.ts +669 -0
  438. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  439. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  440. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  441. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +146 -7
  442. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  443. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  444. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  445. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  446. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  447. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  448. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  449. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  450. package/src/__tests__/runViewProperties.test.ts +114 -0
  451. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  452. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  453. package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
  454. package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
  455. package/src/__tests__/sessionUserClone.test.ts +5 -1
  456. package/src/__tests__/sharedCache.test.ts +5 -3
  457. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  458. package/src/__tests__/unifiedAuth.test.ts +28 -0
  459. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  460. package/src/agentSessions/SessionJanitor.ts +369 -93
  461. package/src/agentSessions/SessionManager.ts +45 -10
  462. package/src/apiRoot.ts +78 -0
  463. package/src/auth/AuthProviderCatalogRouter.ts +29 -0
  464. package/src/auth/LoginScreenEngine.ts +50 -0
  465. package/src/auth/index.ts +57 -12
  466. package/src/auth/initializeProviders.ts +43 -1
  467. package/src/auth/localDevAuth.ts +528 -0
  468. package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
  469. package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
  470. package/src/auth/magicLink/types.ts +10 -0
  471. package/src/auth/sessionUserClone.ts +3 -2
  472. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  473. package/src/broadcast/index.ts +5 -0
  474. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  475. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  476. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  477. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  478. package/src/cache.ts +2 -1
  479. package/src/config.ts +115 -5
  480. package/src/context.ts +32 -8
  481. package/src/coreRoutes.ts +181 -0
  482. package/src/generated/graphql-schemas/__mj.ts +3684 -284
  483. package/src/generic/CacheInvalidationResolver.ts +172 -60
  484. package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
  485. package/src/generic/PubSubManager.ts +54 -1
  486. package/src/generic/PushStatusResolver.ts +109 -12
  487. package/src/generic/ResolverBase.ts +540 -431
  488. package/src/generic/RunViewResolver.ts +97 -15
  489. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  490. package/src/generic/fieldSecurityTransport.ts +62 -0
  491. package/src/globalCors.ts +71 -0
  492. package/src/index.ts +239 -238
  493. package/src/integration/CustomColumnPromoter.ts +6 -1
  494. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  495. package/src/multiTenancy/index.ts +24 -2
  496. package/src/realtimeSessions/README.md +7 -3
  497. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
  498. package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
  499. package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
  500. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  501. package/src/realtimeSessions/index.ts +2 -0
  502. package/src/realtimeSessions/ownedRealtimeSession.ts +69 -0
  503. package/src/realtimeSessions/sessionAccess.ts +183 -23
  504. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  505. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  506. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  507. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  508. package/src/realtimeWidget/WidgetSessionService.ts +252 -17
  509. package/src/realtimeWidget/host-identity.ts +1 -1
  510. package/src/realtimeWidget/widgetCore.ts +30 -1
  511. package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
  512. package/src/resolvers/ActionResolver.ts +78 -15
  513. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  514. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  515. package/src/resolvers/AgentSessionResolver.ts +46 -18
  516. package/src/resolvers/ArtifactFileResolver.ts +9 -8
  517. package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
  518. package/src/resolvers/DatasetResolver.ts +70 -10
  519. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  520. package/src/resolvers/EntityRecordNameResolver.ts +3 -2
  521. package/src/resolvers/FetchEntityVectorsResolver.ts +248 -55
  522. package/src/resolvers/FileCategoryResolver.ts +1 -0
  523. package/src/resolvers/FileResolver.ts +334 -109
  524. package/src/resolvers/GetDataContextDataResolver.ts +139 -41
  525. package/src/resolvers/GetDataResolver.ts +6 -3
  526. package/src/resolvers/IntegrationDiscoveryResolver.ts +53 -9
  527. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  528. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  529. package/src/resolvers/QueryResolver.ts +31 -6
  530. package/src/resolvers/QuerySystemUserResolver.ts +15 -6
  531. package/src/resolvers/RSUResolver.ts +12 -0
  532. package/src/resolvers/RealtimeClientSessionResolver.ts +114 -66
  533. package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
  534. package/src/resolvers/RunAIAgentResolver.ts +296 -85
  535. package/src/resolvers/RunTemplateResolver.ts +6 -4
  536. package/src/resolvers/RunTestResolver.ts +3 -1
  537. package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
  538. package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
  539. package/src/resolvers/SyncDataResolver.ts +4 -0
  540. package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
  541. package/src/resolvers/TestQuerySQLResolver.ts +69 -13
  542. package/src/resolvers/TransactionGroupResolver.ts +185 -30
  543. package/src/resolvers/UserViewResolver.ts +2 -1
  544. package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
  545. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  546. package/src/resolvers/agent-run-data-guard.ts +89 -0
  547. package/src/rest/EntityCRUDHandler.ts +22 -5
  548. package/src/rest/RESTEndpointHandler.ts +8 -5
  549. package/src/rest/RealtimeRecordingHandler.ts +467 -0
  550. package/src/rest/ViewOperationsHandler.ts +52 -18
  551. package/src/rest/setupRESTEndpoints.ts +6 -0
  552. package/src/serverExtensionReservedRoots.ts +14 -17
  553. package/src/serverRoleConfigUnits.ts +48 -0
  554. package/src/services/MJStorageBlobStore.ts +31 -30
  555. package/src/services/StartTaskGraphDispatcher.ts +2 -2
  556. package/src/services/TaskGraphActionRunner.ts +25 -5
  557. package/src/services/TaskGraphAgentRunner.ts +188 -11
  558. package/src/services/TaskGraphContinuationDeliverer.ts +738 -16
  559. package/src/sharedCache.ts +3 -0
  560. package/src/types.ts +23 -1
package/src/config.ts CHANGED
@@ -5,6 +5,7 @@ import { LogError, LogStatus, LogStatusEx } from '@memberjunction/core';
5
5
  import { mergeConfigs, parseBooleanEnv } from '@memberjunction/config';
6
6
  import { TelemetryEnabledDefault } from './telemetryConfigUnits.js';
7
7
  import { RealtimeEnabledDefault } from './realtimeConfigUnits.js';
8
+ import { ResolveServerRole, type ServerRole } from './serverRoleConfigUnits.js';
8
9
 
9
10
  const explorer = cosmiconfigSync('mj', { searchStrategy: 'global' });
10
11
 
@@ -226,10 +227,19 @@ const telemetrySchema = z.object({
226
227
  level: z.enum(['minimal', 'standard', 'verbose', 'debug']).optional().default('standard'),
227
228
  });
228
229
 
229
- const serverExtensionSchema = z.object({
230
- Enabled: z.boolean().default(true),
230
+ /**
231
+ * A host `mj.config.cjs` `serverExtensions[]` entry. Only `DriverClass` is required: an entry whose
232
+ * DriverClass an Open App package already publishes is an OVERLAY (MergeServerExtensionConfigs) and
233
+ * may set just the fields it overrides — `{ DriverClass: 'X', OwnsCORS: false }` — without repeating
234
+ * `RootPath`. `Enabled` has no schema default for the same reason: a defaulted `true` would silently
235
+ * re-enable an extension the package ships disabled. Whether the MERGED entry is complete (a valid
236
+ * `RootPath`; `Enabled` defaults to true) is validated after the merge, by prepareServerExtensionConfigs,
237
+ * which reports an incomplete host-only entry instead of mounting it.
238
+ */
239
+ export const ServerExtensionSchema = z.object({
240
+ Enabled: z.boolean().optional(),
231
241
  DriverClass: z.string(),
232
- RootPath: z.string(),
242
+ RootPath: z.string().optional(),
233
243
  Settings: z.record(z.unknown()).default({})
234
244
  }).passthrough();
235
245
 
@@ -238,6 +248,14 @@ const cacheSettingsSchema = z.object({
238
248
  maxMemoryMB: z.number().optional().default(150),
239
249
  /** Maximum percentage of total cache memory that any single entity can occupy. Default: 50. Set to 0 to disable. */
240
250
  maxPercentOfCachePerEntity: z.number().optional().default(50),
251
+ /**
252
+ * Ceiling on any ONE cache entry. 'auto' (the default) derives it from maxMemoryMB, so the
253
+ * largest entity the server caches scales with the memory the cache was given; a number is an
254
+ * explicit stricter percentage of maxMemoryMB; 0 removes the ceiling. Leave it on 'auto' unless
255
+ * a specific entry must be kept out of the cache — an entry declined by the ceiling is re-read
256
+ * from the database on every call, and the server logs which maxMemoryMB would admit it.
257
+ */
258
+ maxEntryPercentOfCache: z.union([z.number(), z.literal('auto')]).optional().default('auto'),
241
259
  /** Default TTL in seconds. 0 = no TTL, rely on event-based invalidation. Default: 0. */
242
260
  defaultTTLSeconds: z.number().optional().default(0),
243
261
  /** Interval in seconds for periodic eviction sweep. 0 = disabled. Default: 300 (5 minutes). */
@@ -299,6 +317,45 @@ const cacheSettingsSchema = z.object({
299
317
  * for it. 0 disables the turn-taking. Default: 30.
300
318
  */
301
319
  startupWarmupLeaseSeconds: z.number().int().nonnegative().optional().default(30),
320
+ /**
321
+ * Pluggable cache invalidation broadcast topology configuration.
322
+ * Defaults to `'SequencedRoleBucket'` (Topology 1 Monotonic Sequence Ring Buffer + Topology 2
323
+ * Role-Fingerprint $O(\text{Roles})$ evaluation & shaping memoizer).
324
+ */
325
+ broadcast: z
326
+ .object({
327
+ provider: z.string().optional().default('SequencedRoleBucket'),
328
+ ringBufferSize: z.number().int().positive().optional().default(5000),
329
+ excludedEntities: z.array(z.string()).optional().default([]),
330
+ azureWebPubSub: z
331
+ .object({
332
+ endpoint: z.string().optional(),
333
+ hubName: z.string().optional(),
334
+ accessKey: z.string().optional(),
335
+ tokenTtlMinutes: z.number().positive().optional(),
336
+ })
337
+ .optional(),
338
+ awsIoTCore: z
339
+ .object({
340
+ endpoint: z.string().optional(),
341
+ region: z.string().optional(),
342
+ topicPrefix: z.string().optional(),
343
+ accessKeyId: z.string().optional(),
344
+ secretAccessKey: z.string().optional(),
345
+ tokenTtlSeconds: z.number().positive().optional(),
346
+ })
347
+ .optional(),
348
+ gcpPubSub: z
349
+ .object({
350
+ projectId: z.string().optional(),
351
+ topicPrefix: z.string().optional(),
352
+ gatewayUrl: z.string().optional(),
353
+ signingSecret: z.string().optional(),
354
+ tokenTtlSeconds: z.number().positive().optional(),
355
+ })
356
+ .optional(),
357
+ })
358
+ .optional(),
302
359
  });
303
360
 
304
361
  const loggingSettingsSchema = z.object({
@@ -316,6 +373,15 @@ const loggingSettingsSchema = z.object({
316
373
  }).optional().default({}),
317
374
  });
318
375
 
376
+ const aiPromptRunsSchema = z.object({
377
+ /**
378
+ * Server default for which template inputs prompt runs store in AIPromptRun.Messages:
379
+ * 'None' (key sizes only), 'Referenced' (keys the templates read) or 'Full'.
380
+ * AIPrompt.TemplateDataCapture and AIPromptParams.TemplateDataCapture override it.
381
+ */
382
+ templateDataCapture: z.enum(['None', 'Referenced', 'Full']).optional(),
383
+ });
384
+
319
385
  const corsSchema = z.object({
320
386
  /** Allowed origins for CORS. Default ['*'] preserves backward-compatible "allow all" behavior. */
321
387
  allowedOrigins: z.array(z.string()).default(['*']),
@@ -810,11 +876,24 @@ const realtimeSchema = z.object({
810
876
  enabled: zodBooleanWithTransforms().default(true),
811
877
  /** Mid-session identity verification (off by default). */
812
878
  identityVerification: identityVerificationSchema.optional().default({}),
879
+ /**
880
+ * Seconds a client-direct call's recording waits for missing shards after its terminal signal before it
881
+ * is assembled anyway as `Partial` (gaps become silence). Defaults to 90.
882
+ */
883
+ recordingAssemblyGraceSeconds: z.coerce.number().positive().optional().default(90),
884
+ }).passthrough();
885
+
886
+ const devAuthSchema = z.object({
887
+ /** Master switch for local-only development JWT auth (`MJ_DEV_AUTH_ENABLED=true`). Forbidden when NODE_ENV=production. */
888
+ enabled: zodBooleanWithTransforms().default(false),
889
+ /** Optional default email for `/auth/dev-login` when no email is specified in the request body. */
890
+ defaultEmail: z.string().optional(),
813
891
  }).passthrough();
814
892
 
815
893
  const configInfoSchema = z.object({
816
894
  userHandling: userHandlingInfoSchema,
817
895
  magicLink: magicLinkSchema.optional().default({}),
896
+ devAuth: devAuthSchema.optional().default({}),
818
897
  widget: widgetSchema.optional().default({}),
819
898
  telephony: telephonySchema.optional().default({}),
820
899
  realtime: realtimeSchema.optional().default({}),
@@ -830,9 +909,10 @@ const configInfoSchema = z.object({
830
909
  telemetry: telemetrySchema.optional().default({}),
831
910
  queryDialects: queryDialectSchema.optional().default({}),
832
911
  multiTenancy: multiTenancySchema.optional().default({}),
833
- serverExtensions: z.array(serverExtensionSchema).optional().default([]),
912
+ serverExtensions: z.array(ServerExtensionSchema).optional().default([]),
834
913
  cacheSettings: cacheSettingsSchema.optional().default({}),
835
914
  loggingSettings: loggingSettingsSchema.optional().default({}),
915
+ aiPromptRuns: aiPromptRunsSchema.optional(),
836
916
  feedbackSettings: feedbackSettingsSchema.optional().default({}),
837
917
  cors: corsSchema.optional().default({}),
838
918
  rateLimiting: rateLimitSchema.optional().default({}),
@@ -860,6 +940,12 @@ const configInfoSchema = z.object({
860
940
  ___codeGenAPIPort: z.coerce.number().optional().default(3999),
861
941
  ___codeGenAPISubmissionDelay: z.coerce.number().optional().default(5000),
862
942
  graphqlRootPath: z.string().optional().default('/'),
943
+ /**
944
+ * Path prefix MJAPI mounts every route it serves under (core routes and server extensions), on its own
945
+ * listener. `/` unless a proxy forwards a prefix WITHOUT stripping it (e.g. CloudFront `/api/*` → MJAPI):
946
+ * then set `MJAPI_BASE_PATH=/api`. Independent of `graphqlRootPath`, which is only Apollo's path. MJ #5674.
947
+ */
948
+ apiBasePath: z.string().optional().default('/'),
863
949
  enableIntrospection: z.coerce.boolean().optional().default(false),
864
950
  websiteRunFromPackage: z.coerce.number().optional(),
865
951
  userEmailMap: z
@@ -867,8 +953,18 @@ const configInfoSchema = z.object({
867
953
  .transform((val) => z.record(z.string()).parse(JSON.parse(val)))
868
954
  .optional(),
869
955
  mjCoreSchema: z.string(),
956
+ /**
957
+ * Server execution role for horizontal scaling:
958
+ * - `'all'` (default): runs both interactive HTTP/GraphQL/WebSocket handlers and background worker loops.
959
+ * - `'api'`: runs interactive HTTP/GraphQL/WebSocket handlers only; background worker loops are skipped.
960
+ * - `'worker'`: runs background worker loops (`ScheduledJobsService`, `IntegrationSyncWorkerService`,
961
+ * `StartTaskGraphDispatcher`, `StartWorkQueueHost`, `SessionJanitor`, reconcilers).
962
+ */
963
+ serverRole: z.enum(['all', 'api', 'worker']).optional().default('all'),
870
964
  });
871
965
 
966
+ export type { ServerRole };
967
+
872
968
  export type UserHandlingInfo = z.infer<typeof userHandlingInfoSchema>;
873
969
  export type MagicLinkConfig = z.infer<typeof magicLinkSchema>;
874
970
  export type WidgetConfig = z.infer<typeof widgetSchema>;
@@ -893,9 +989,10 @@ export type { WorkQueueConfig } from './services/workQueueConfig.js';
893
989
  export type TelemetryConfig = z.infer<typeof telemetrySchema>;
894
990
  export type QueryDialectConfig = z.infer<typeof queryDialectSchema>;
895
991
  export type MultiTenancyConfig = z.infer<typeof multiTenancySchema>;
896
- export type ServerExtensionConfig = z.infer<typeof serverExtensionSchema>;
992
+ export type ServerExtensionConfig = z.infer<typeof ServerExtensionSchema>;
897
993
  export type CacheSettingsConfig = z.infer<typeof cacheSettingsSchema>;
898
994
  export type LoggingSettingsConfig = z.infer<typeof loggingSettingsSchema>;
995
+ export type AIPromptRunsConfig = z.infer<typeof aiPromptRunsSchema>;
899
996
  export type FeedbackGithubSettingsConfig = z.infer<typeof feedbackGithubSettingsSchema>;
900
997
  export type FeedbackSettingsConfig = z.infer<typeof feedbackSettingsSchema>;
901
998
  export type CorsConfig = z.infer<typeof corsSchema>;
@@ -931,11 +1028,13 @@ export const DEFAULT_SERVER_CONFIG: Partial<ConfigInfo> = {
931
1028
  // GraphQL server settings (environment-driven with defaults)
932
1029
  graphqlPort: process.env.GRAPHQL_PORT ? parseInt(process.env.GRAPHQL_PORT, 10) : 4000,
933
1030
  graphqlRootPath: process.env.GRAPHQL_ROOT_PATH ?? '/',
1031
+ apiBasePath: process.env.MJAPI_BASE_PATH ?? '/',
934
1032
  baseUrl: process.env.GRAPHQL_BASE_URL ?? 'http://localhost',
935
1033
  publicUrl: process.env.MJAPI_PUBLIC_URL,
936
1034
  enableIntrospection: process.env.ENABLE_INTROSPECTION === 'true',
937
1035
  apiKey: process.env.MJ_API_KEY,
938
1036
  websiteRunFromPackage: process.env.WEBSITE_RUN_FROM_PACKAGE ? parseInt(process.env.WEBSITE_RUN_FROM_PACKAGE, 10) : undefined,
1037
+ serverRole: ResolveServerRole(process.env.MJ_SERVER_ROLE),
939
1038
 
940
1039
  // User handling defaults
941
1040
  userHandling: {
@@ -1047,6 +1146,7 @@ export const DEFAULT_SERVER_CONFIG: Partial<ConfigInfo> = {
1047
1146
  cacheSettings: {
1048
1147
  maxMemoryMB: 150,
1049
1148
  maxPercentOfCachePerEntity: 50,
1149
+ maxEntryPercentOfCache: 'auto',
1050
1150
  defaultTTLSeconds: 0,
1051
1151
  evictionSweepIntervalSeconds: 300,
1052
1152
  verboseLogging: false,
@@ -1146,6 +1246,16 @@ export function LoadConfig() {
1146
1246
  LogError('Error parsing config file', null, JSON.stringify(configParsing.error.issues, null, 2));
1147
1247
  throw new Error('Configuration validation failed');
1148
1248
  }
1249
+
1250
+ const rawDevAuthEnv = process.env.MJ_DEV_AUTH_ENABLED?.trim().toLowerCase();
1251
+ const isDevAuthEnabled =
1252
+ rawDevAuthEnv === 'true' || rawDevAuthEnv === '1' || configParsing.data.devAuth?.enabled === true;
1253
+ if (isDevAuthEnabled && process.env.NODE_ENV?.trim().toLowerCase() === 'production') {
1254
+ throw new Error(
1255
+ '[SECURITY] Local dev auth (MJ_DEV_AUTH_ENABLED) is strictly forbidden when NODE_ENV=production. Refusing to start.'
1256
+ );
1257
+ }
1258
+
1149
1259
  return configParsing.data;
1150
1260
  }
1151
1261
 
package/src/context.ts CHANGED
@@ -21,7 +21,7 @@ import e from 'express';
21
21
  import type { RequestHandler, Request, Response, NextFunction } from 'express';
22
22
  import { DatabaseProviderBase, UserInfo, type IMetadataProvider, type MagicLinkScope, type ReturningVisitorContext, type WidgetGuestContext } from '@memberjunction/core';
23
23
  import { SQLServerDataProvider, SQLServerProviderConfigData } from '@memberjunction/sqlserver-dataprovider';
24
- import { Metadata } from '@memberjunction/core';
24
+ import { Metadata, IsValidTimeZone, TIME_ZONE_HEADER } from '@memberjunction/core';
25
25
  import { IdentityClaimEngineServer } from '@memberjunction/core-entities-server';
26
26
  import { UUIDsEqual } from '@memberjunction/global';
27
27
  import { UserCache, resolveDbPlatformFromEnv } from '@memberjunction/generic-database-provider';
@@ -204,12 +204,17 @@ async function auditLoginFailure(
204
204
  // userRecord may be a SHARED cached instance (e.g. multiple recruiters on one per-company
205
205
  // link) — mutating it would leak one session's scope to another. Non-magic-link sessions,
206
206
  // and named sessions with no resource scope, are returned untouched.
207
- function buildMagicLinkSessionUser(userRecord: UserInfo, payload: jwt.JwtPayload): UserInfo {
207
+ export function BuildMagicLinkSessionUser(userRecord: UserInfo, payload: jwt.JwtPayload): UserInfo {
208
208
  if (payload['mj_magic_link'] !== true) {
209
209
  return userRecord;
210
210
  }
211
211
  const md = Metadata.Provider; // global-provider-ok: server-side magic-link session built under the server's single default provider
212
212
  const isAnon = payload['mj_anon'] === true;
213
+ const rawSid = payload['mj_sid'];
214
+ const mjSid = typeof rawSid === 'string' ? rawSid.trim() : '';
215
+ if (isAnon && !mjSid) {
216
+ throw new AuthenticationError('Anonymous magic-link session token is missing required mj_sid claim');
217
+ }
213
218
  const scopes = payload['mj_scopes'];
214
219
 
215
220
  // Per-session resource scope (single-resource share; multi-resource union is a follow-on).
@@ -279,6 +284,7 @@ function buildMagicLinkSessionUser(userRecord: UserInfo, payload: jwt.JwtPayload
279
284
  // Mark the session so the CurrentUser field resolver serves these synthesized roles
280
285
  // (the shared Anonymous principal holds none in the DB). See UserInfo.IsMagicLinkAnonymous.
281
286
  sessionUser.IsMagicLinkAnonymous = true;
287
+ sessionUser.AnonymousVisitorID = mjSid;
282
288
  }
283
289
  return sessionUser;
284
290
  }
@@ -420,7 +426,7 @@ export const GetUserPayload = async (
420
426
  // very often the SHARED UserCache instance, and stamping it in place
421
427
  // leaks one session's row-filter bindings / acting context to every
422
428
  // concurrent session of the same user (same pattern as
423
- // buildMagicLinkSessionUser — see sessionUserClone.ts).
429
+ // BuildMagicLinkSessionUser — see sessionUserClone.ts).
424
430
  const userRecord = CloneUserForSessionContext(resolvedUser);
425
431
 
426
432
  // Row-filter bindings for this key, rebuilt PER REQUEST from the
@@ -486,7 +492,11 @@ export const GetUserPayload = async (
486
492
  throw new AuthenticationError('Missing token');
487
493
  }
488
494
 
489
- const payload = jwt.decode(token);
495
+ const cachedAuth = AuthCache.get(token);
496
+ const payload =
497
+ cachedAuth && typeof cachedAuth === 'object'
498
+ ? cachedAuth
499
+ : jwt.decode(token);
490
500
  if (!payload || typeof payload === 'string') {
491
501
  throw new AuthenticationError('Invalid token payload');
492
502
  }
@@ -498,7 +508,7 @@ export const GetUserPayload = async (
498
508
  throw new TokenExpiredError(expiryDate);
499
509
  }
500
510
 
501
- if (!AuthCache.has(token)) {
511
+ if (!cachedAuth) {
502
512
  const issuer = payload.iss;
503
513
  if (!issuer) {
504
514
  console.warn('No issuer claim on token');
@@ -513,7 +523,7 @@ export const GetUserPayload = async (
513
523
  }
514
524
 
515
525
  await verifyAsync(issuer, token);
516
- AuthCache.set(token, true);
526
+ AuthCache.set(token, payload);
517
527
  }
518
528
 
519
529
  // Use provider to extract user information
@@ -540,7 +550,7 @@ export const GetUserPayload = async (
540
550
  // Anonymous principal with an in-memory UserInfo carrying the claimed role(s), so
541
551
  // the session enforces exactly the link's granted scope (no DB accretion). No-op
542
552
  // for everything else.
543
- const sessionUser = buildMagicLinkSessionUser(userRecord, payload);
553
+ const sessionUser = BuildMagicLinkSessionUser(userRecord, payload);
544
554
 
545
555
  // Session-established audit — once per issued token (deduped), fire-and-forget so
546
556
  // it never adds latency to the request. The dedup mark is set synchronously here.
@@ -626,6 +636,15 @@ function parseRequestHostname(origin: string | undefined): string | undefined {
626
636
  }
627
637
  }
628
638
 
639
+ /**
640
+ * The caller's IANA time zone from the `x-mj-timezone` header, or undefined when the header is
641
+ * absent, repeated, or names no zone this runtime knows (callers then use UTC).
642
+ */
643
+ function readTimeZoneHeader(req: IncomingMessage): string | undefined {
644
+ const value = req.headers[TIME_ZONE_HEADER];
645
+ return typeof value === 'string' && IsValidTimeZone(value) ? value : undefined;
646
+ }
647
+
629
648
  function extractAuthInputs(req: IncomingMessage): {
630
649
  bearerToken: string;
631
650
  sessionId: string;
@@ -633,6 +652,7 @@ function extractAuthInputs(req: IncomingMessage): {
633
652
  systemApiKey: string;
634
653
  userApiKey: string;
635
654
  requestContext: RequestContext;
655
+ timeZone: string | undefined;
636
656
  } {
637
657
  const sessionIdRaw = req.headers['x-session-id'];
638
658
  const requestDomain = parseRequestHostname(req.headers.origin);
@@ -657,6 +677,7 @@ function extractAuthInputs(req: IncomingMessage): {
657
677
  systemApiKey,
658
678
  userApiKey,
659
679
  requestContext,
680
+ timeZone: readTimeZoneHeader(req),
660
681
  };
661
682
  }
662
683
 
@@ -681,7 +702,7 @@ export function CreateUnifiedAuthMiddleware(
681
702
  }
682
703
 
683
704
  try {
684
- const { bearerToken, sessionId, requestDomain, systemApiKey, userApiKey, requestContext } =
705
+ const { bearerToken, sessionId, requestDomain, systemApiKey, userApiKey, requestContext, timeZone } =
685
706
  extractAuthInputs(req);
686
707
 
687
708
  const userPayload = await GetUserPayload(
@@ -699,6 +720,9 @@ export function CreateUnifiedAuthMiddleware(
699
720
  res.status(401).json({ error: 'Invalid token' });
700
721
  return;
701
722
  }
723
+ if (timeZone) {
724
+ userPayload.TimeZone = timeZone;
725
+ }
702
726
 
703
727
  // Attach to request for downstream consumers
704
728
  req.userPayload = userPayload;
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Core HTTP routes MJServer mounts itself, every one under MJAPI's base path (`MJAPI_BASE_PATH`) via {@link ApiRoute}.
3
+ *
4
+ * Extracted from `serve()` so `__tests__/apiRootBoot.test.ts` can mount them on a bare Express app with
5
+ * `MJAPI_BASE_PATH=/api` and check every registered path. `serve()` still decides the ORDER (relative
6
+ * to compression, the auth middleware, server extensions and Apollo); these functions only mount.
7
+ *
8
+ * ALL new custom routes, webhooks and integrations belong in Server Extensions
9
+ * (guides/SERVER_EXTENSIONS_GUIDE.md), not here.
10
+ */
11
+ import cors from 'cors';
12
+ import { default as BodyParser } from 'body-parser';
13
+ import type { Application, Router } from 'express';
14
+ import { REALTIME_SDP_EXCHANGE_PATH } from '@memberjunction/ai';
15
+ import type { ServerExtensionLoader } from '@memberjunction/server-extensions-core';
16
+ import { configInfo } from './config.js';
17
+ import { ApiRoute } from './apiRoot.js';
18
+ import { CreateOAuthCallbackHandler } from './rest/OAuthCallbackHandler.js';
19
+ import { CreateSignatureWebhookHandler } from './rest/SignatureWebhookHandler.js';
20
+ import { CreateMediaStreamRouter } from './rest/MediaStreamHandler.js';
21
+ import { CreateRealtimeSdpBrokerRouter } from './rest/RealtimeSdpBrokerHandler.js';
22
+ import { CreateMagicLinkHandler, CreateMagicLinkJwksRouter, RegisterMagicLinkAuthProvider, MAGIC_LINK_MOUNT_PATH } from './auth/magicLink/index.js';
23
+ import { CreateWidgetHandler, WIDGET_MOUNT_PATH } from './realtimeWidget/index.js';
24
+ import { CreateRealtimeVerifyRouter, REALTIME_VERIFY_MOUNT_PATH, RealtimeSessionVerificationService } from './realtimeSessions/index.js';
25
+ import { CreateAuthProviderCatalogRouter, AUTH_CATALOG_MOUNT_PATH } from './auth/AuthProviderCatalogRouter.js';
26
+ import { AssertLocalDevAuthAllowed, IsLocalDevAuthEnabled, RegisterLocalDevAuthProvider } from './auth/localDevAuth.js';
27
+ import type { StartupLogger } from './logging/StartupLogger.js';
28
+
29
+ type RouteLog = Pick<StartupLogger, 'LogIf'>;
30
+
31
+ /** Routers the public mounts create that must be mounted again after the auth middleware. */
32
+ export interface CoreAuthenticatedRouters {
33
+ OAuth?: Router;
34
+ MagicLink?: Router;
35
+ Widget?: Router;
36
+ }
37
+
38
+ /** `/healthcheck` — mounted first so platform probes never meet the auth middleware. */
39
+ export function MountHealthcheckRoute(app: Application): void {
40
+ app.get(ApiRoute('/healthcheck'), cors<cors.CorsRequest>(), (_req, res) => {
41
+ res.status(200).json({ status: 'ok' });
42
+ });
43
+ }
44
+
45
+ /**
46
+ * The unauthenticated core routes (OAuth callback, eSignature webhook, media streaming, realtime SDP
47
+ * broker, magic-link, widget, realtime verify). Each verifies its own capability (signature, token,
48
+ * ticket), so they mount BEFORE the auth middleware. Returns the routers that belong after it.
49
+ */
50
+ export function MountPublicCoreRoutes(app: Application, publicUrl: string, log: RouteLog): CoreAuthenticatedRouters {
51
+ const routers: CoreAuthenticatedRouters = { OAuth: mountOAuthCallback(app, publicUrl, log) };
52
+
53
+ app.use(ApiRoute('/esignature'), cors<cors.CorsRequest>(), CreateSignatureWebhookHandler());
54
+ log.LogIf('verbose', `[eSignature] Webhook route registered at ${ApiRoute('/esignature')}/webhook/:driverKey`);
55
+
56
+ // The `?token=` query param is the capability; an <audio>/<video> element can't send Authorization headers.
57
+ app.use(ApiRoute('/media'), cors<cors.CorsRequest>(), CreateMediaStreamRouter());
58
+ log.LogIf('verbose', `[Media] Streaming route registered at ${ApiRoute('/media')}/:fileId`);
59
+
60
+ if (configInfo.realtime?.enabled) {
61
+ app.use(ApiRoute(REALTIME_SDP_EXCHANGE_PATH), cors<cors.CorsRequest>(), CreateRealtimeSdpBrokerRouter());
62
+ log.LogIf('verbose', `[Realtime] WebRTC SDP broker registered at ${ApiRoute(REALTIME_SDP_EXCHANGE_PATH)}`);
63
+ }
64
+
65
+ routers.MagicLink = mountMagicLinkPublic(app, publicUrl, log);
66
+ routers.Widget = mountWidgetPublic(app, publicUrl, log);
67
+ mountLocalDevAuthPublic(app, publicUrl, log);
68
+ mountRealtimeVerify(app, log);
69
+ return routers;
70
+ }
71
+
72
+ function mountLocalDevAuthPublic(app: Application, publicUrl: string, log: RouteLog): void {
73
+ AssertLocalDevAuthAllowed();
74
+ if (!IsLocalDevAuthEnabled()) {
75
+ return;
76
+ }
77
+ RegisterLocalDevAuthProvider(publicUrl);
78
+ if (!configInfo.magicLink?.enabled && !configInfo.widget?.enabled) {
79
+ app.use(ApiRoute(MAGIC_LINK_MOUNT_PATH), cors<cors.CorsRequest>(), CreateMagicLinkJwksRouter());
80
+ log.LogIf('verbose', `[LocalDevAuth] Published RS256 signing key at ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/jwks.json`);
81
+ }
82
+ log.LogIf('verbose', `[LocalDevAuth] Local dev auth routes enabled at ${ApiRoute(AUTH_CATALOG_MOUNT_PATH)}/dev-login (localhost only)`);
83
+ }
84
+
85
+ function mountOAuthCallback(app: Application, publicUrl: string, log: RouteLog): Router | undefined {
86
+ if (!publicUrl) {
87
+ return undefined;
88
+ }
89
+ const { callbackRouter, authenticatedRouter } = CreateOAuthCallbackHandler({
90
+ publicUrl,
91
+ successRedirectUrl: ApiRoute('/oauth/success', { absolute: true }),
92
+ errorRedirectUrl: ApiRoute('/oauth/error', { absolute: true }),
93
+ // Constrains where a caller-supplied frontendReturnUrl may point (open-redirect guard).
94
+ allowedFrontendOrigins: configInfo.cors?.allowedOrigins ?? ['*'],
95
+ });
96
+ // The callback is unauthenticated (called by the external auth server).
97
+ app.use(ApiRoute('/oauth'), cors<cors.CorsRequest>(), callbackRouter);
98
+ log.LogIf('verbose', `[OAuth] Callback route registered at ${ApiRoute('/oauth')}/callback`);
99
+ return authenticatedRouter;
100
+ }
101
+
102
+ /** Public magic-link router (JWKS + redeem). The invite-creation router is returned for after auth. */
103
+ function mountMagicLinkPublic(app: Application, publicUrl: string, log: RouteLog): Router | undefined {
104
+ if (!configInfo.magicLink?.enabled) {
105
+ return undefined;
106
+ }
107
+ const { publicRouter, authenticatedRouter } = CreateMagicLinkHandler(publicUrl, configInfo.magicLink);
108
+ RegisterMagicLinkAuthProvider(publicUrl, configInfo.magicLink);
109
+ app.use(ApiRoute(MAGIC_LINK_MOUNT_PATH), cors<cors.CorsRequest>(), publicRouter);
110
+ log.LogIf('verbose', `[MagicLink] Public routes registered at ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/redeem and ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/jwks.json`);
111
+ return authenticatedRouter;
112
+ }
113
+
114
+ /**
115
+ * Public widget guest-session mint. It reuses the magic-link RS256 key, so when magic-link itself is
116
+ * disabled the JWKS is published here — otherwise every guest token fails validation and the widget 401s.
117
+ */
118
+ function mountWidgetPublic(app: Application, publicUrl: string, log: RouteLog): Router | undefined {
119
+ if (!configInfo.widget?.enabled) {
120
+ return undefined;
121
+ }
122
+ const { publicRouter, authenticatedRouter } = CreateWidgetHandler(publicUrl, configInfo.widget);
123
+ app.use(ApiRoute(WIDGET_MOUNT_PATH), cors<cors.CorsRequest>(), publicRouter);
124
+ if (!configInfo.magicLink?.enabled) {
125
+ app.use(ApiRoute(MAGIC_LINK_MOUNT_PATH), cors<cors.CorsRequest>(), CreateMagicLinkJwksRouter());
126
+ log.LogIf('verbose', `[Widget] Published reused signing key at ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/jwks.json (magic-link flow disabled)`);
127
+ }
128
+ log.LogIf('verbose', `[Widget] Public routes registered at ${ApiRoute(WIDGET_MOUNT_PATH)}/session and ${ApiRoute(WIDGET_MOUNT_PATH)}/session/refresh`);
129
+ return authenticatedRouter;
130
+ }
131
+
132
+ /**
133
+ * Realtime identity-verification links. The emailed single-use token is the capability. Mounted only when
134
+ * verification can send mail AND protect its codes (realtime.identityVerification config).
135
+ */
136
+ function mountRealtimeVerify(app: Application, log: RouteLog): void {
137
+ const verification = RealtimeSessionVerificationService.Instance;
138
+ if (configInfo.realtime?.identityVerification?.enabled && !verification.IsEnabled) {
139
+ console.warn('[RealtimeVerify] realtime.identityVerification.enabled is true but verification is unavailable: it needs a communicationProvider and an hmacSecret of at least 16 characters.');
140
+ }
141
+ if (!verification.IsEnabled) {
142
+ return;
143
+ }
144
+ app.use(ApiRoute(REALTIME_VERIFY_MOUNT_PATH), cors<cors.CorsRequest>(), CreateRealtimeVerifyRouter());
145
+ log.LogIf('verbose', `[RealtimeVerify] Public routes registered at ${ApiRoute(REALTIME_VERIFY_MOUNT_PATH)}/:token (GET) and ${ApiRoute(REALTIME_VERIFY_MOUNT_PATH)} (POST)`);
146
+ }
147
+
148
+ /** `/health/extensions` — always mounted; an empty array when no extensions loaded. */
149
+ export function MountExtensionHealthRoute(app: Application, loader: ServerExtensionLoader): void {
150
+ app.get(ApiRoute('/health/extensions'), async (_req, res) => {
151
+ const results = await loader.HealthCheckAll();
152
+ const allHealthy = results.length === 0 || results.every((r) => r.Healthy);
153
+ res.status(allHealthy ? 200 : 503).json({ extensions: results });
154
+ });
155
+ }
156
+
157
+ /**
158
+ * Public authentication-provider catalog. The browser needs it BEFORE it holds a token; it publishes only
159
+ * the non-secret allow-list (AuthProviderEngine.GetPublicCatalog).
160
+ */
161
+ export function MountAuthCatalogRoute(app: Application, log: RouteLog): void {
162
+ app.use(ApiRoute(AUTH_CATALOG_MOUNT_PATH), cors<cors.CorsRequest>(), CreateAuthProviderCatalogRouter());
163
+ log.LogIf('verbose', `[Auth] Public provider catalog and login screen registered at ${ApiRoute(AUTH_CATALOG_MOUNT_PATH)}/providers and ${ApiRoute(AUTH_CATALOG_MOUNT_PATH)}/login-screen`);
164
+ }
165
+
166
+ /** The routers {@link MountPublicCoreRoutes} returned, mounted AFTER the unified auth middleware. */
167
+ export function MountAuthenticatedCoreRoutes(app: Application, routers: CoreAuthenticatedRouters, log: RouteLog): void {
168
+ if (routers.OAuth) {
169
+ app.use(ApiRoute('/oauth'), cors<cors.CorsRequest>(), BodyParser.json(), routers.OAuth);
170
+ log.LogIf('verbose', `[OAuth] Authenticated routes registered at ${ApiRoute('/oauth')}/status, /initiate and /exchange`);
171
+ }
172
+ if (routers.MagicLink) {
173
+ app.use(ApiRoute(MAGIC_LINK_MOUNT_PATH), cors<cors.CorsRequest>(), routers.MagicLink);
174
+ log.LogIf('verbose', `[MagicLink] Authenticated route registered at ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/create`);
175
+ }
176
+ // A verified visitor (post magic-link upgrade) promotes their anonymous trail here.
177
+ if (routers.Widget) {
178
+ app.use(ApiRoute(WIDGET_MOUNT_PATH), cors<cors.CorsRequest>(), routers.Widget);
179
+ log.LogIf('verbose', `[Widget] Authenticated route registered at ${ApiRoute(WIDGET_MOUNT_PATH)}/resolve-identity`);
180
+ }
181
+ }