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

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 (287) hide show
  1. package/README.md +20 -0
  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 +5 -1
  8. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  9. package/dist/agentSessions/SessionManager.js +13 -1
  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 +25 -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 +1 -0
  25. package/dist/auth/index.js.map +1 -1
  26. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  27. package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
  28. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  29. package/dist/config.d.ts +136 -22
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +43 -4
  32. package/dist/config.js.map +1 -1
  33. package/dist/coreRoutes.d.ts +29 -0
  34. package/dist/coreRoutes.d.ts.map +1 -0
  35. package/dist/coreRoutes.js +142 -0
  36. package/dist/coreRoutes.js.map +1 -0
  37. package/dist/generated/graphql-schemas/__mj.d.ts +369 -3
  38. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  39. package/dist/generated/graphql-schemas/__mj.js +1750 -7
  40. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  41. package/dist/generic/CacheInvalidationResolver.d.ts +43 -8
  42. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  43. package/dist/generic/CacheInvalidationResolver.js +59 -19
  44. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  45. package/dist/generic/PushStatusResolver.js +1 -1
  46. package/dist/generic/PushStatusResolver.js.map +1 -1
  47. package/dist/generic/ResolverBase.d.ts +103 -44
  48. package/dist/generic/ResolverBase.d.ts.map +1 -1
  49. package/dist/generic/ResolverBase.js +264 -305
  50. package/dist/generic/ResolverBase.js.map +1 -1
  51. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  52. package/dist/generic/RunViewResolver.js +12 -0
  53. package/dist/generic/RunViewResolver.js.map +1 -1
  54. package/dist/globalCors.d.ts +33 -0
  55. package/dist/globalCors.d.ts.map +1 -0
  56. package/dist/globalCors.js +58 -0
  57. package/dist/globalCors.js.map +1 -0
  58. package/dist/index.d.ts +11 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +112 -160
  61. package/dist/index.js.map +1 -1
  62. package/dist/multiTenancy/index.d.ts.map +1 -1
  63. package/dist/multiTenancy/index.js +22 -2
  64. package/dist/multiTenancy/index.js.map +1 -1
  65. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
  66. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
  67. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
  68. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
  69. package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
  70. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
  71. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
  72. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
  73. package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
  74. package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
  75. package/dist/realtimeSessions/index.d.ts +2 -0
  76. package/dist/realtimeSessions/index.d.ts.map +1 -1
  77. package/dist/realtimeSessions/index.js +2 -0
  78. package/dist/realtimeSessions/index.js.map +1 -1
  79. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +30 -0
  80. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
  81. package/dist/realtimeSessions/ownedRealtimeSession.js +47 -0
  82. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
  83. package/dist/realtimeSessions/sessionAccess.d.ts +6 -0
  84. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  85. package/dist/realtimeSessions/sessionAccess.js +7 -3
  86. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  87. package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
  88. package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
  89. package/dist/resolvers/ArtifactFileResolver.js +9 -7
  90. package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
  91. package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
  92. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  93. package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
  94. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  95. package/dist/resolvers/DatasetResolver.d.ts +24 -3
  96. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  97. package/dist/resolvers/DatasetResolver.js +57 -8
  98. package/dist/resolvers/DatasetResolver.js.map +1 -1
  99. package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
  100. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  101. package/dist/resolvers/EntityRecordNameResolver.js +3 -2
  102. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  103. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +18 -3
  104. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  105. package/dist/resolvers/FetchEntityVectorsResolver.js +100 -35
  106. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  107. package/dist/resolvers/FileResolver.d.ts +82 -11
  108. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  109. package/dist/resolvers/FileResolver.js +279 -101
  110. package/dist/resolvers/FileResolver.js.map +1 -1
  111. package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
  112. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  113. package/dist/resolvers/GetDataContextDataResolver.js +117 -38
  114. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  115. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  116. package/dist/resolvers/GetDataResolver.js +6 -3
  117. package/dist/resolvers/GetDataResolver.js.map +1 -1
  118. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  119. package/dist/resolvers/IntegrationDiscoveryResolver.js +4 -2
  120. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  121. package/dist/resolvers/QueryResolver.d.ts +2 -0
  122. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  123. package/dist/resolvers/QueryResolver.js +13 -0
  124. package/dist/resolvers/QueryResolver.js.map +1 -1
  125. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +2 -8
  126. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  127. package/dist/resolvers/RealtimeClientSessionResolver.js +10 -26
  128. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  129. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  130. package/dist/resolvers/RunAIAgentResolver.js +35 -6
  131. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  132. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
  133. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
  134. package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
  135. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  136. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  137. package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
  138. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  139. package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
  140. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  141. package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
  142. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  143. package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
  144. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  145. package/dist/resolvers/TestQuerySQLResolver.js +65 -13
  146. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  147. package/dist/resolvers/TransactionGroupResolver.d.ts +19 -2
  148. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  149. package/dist/resolvers/TransactionGroupResolver.js +102 -24
  150. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  151. package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
  152. package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
  153. package/dist/resolvers/agent-run-data-guard.js +72 -0
  154. package/dist/resolvers/agent-run-data-guard.js.map +1 -0
  155. package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
  156. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
  157. package/dist/rest/RealtimeRecordingHandler.js +383 -0
  158. package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
  159. package/dist/rest/ViewOperationsHandler.d.ts +3 -1
  160. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  161. package/dist/rest/ViewOperationsHandler.js +21 -12
  162. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  163. package/dist/rest/setupRESTEndpoints.d.ts +6 -0
  164. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  165. package/dist/rest/setupRESTEndpoints.js +6 -0
  166. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  167. package/dist/serverExtensionReservedRoots.d.ts +12 -10
  168. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  169. package/dist/serverExtensionReservedRoots.js +14 -17
  170. package/dist/serverExtensionReservedRoots.js.map +1 -1
  171. package/dist/services/MJStorageBlobStore.d.ts +8 -1
  172. package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
  173. package/dist/services/MJStorageBlobStore.js +25 -19
  174. package/dist/services/MJStorageBlobStore.js.map +1 -1
  175. package/dist/services/StartTaskGraphDispatcher.js +2 -2
  176. package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
  177. package/dist/services/TaskGraphActionRunner.d.ts +5 -3
  178. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  179. package/dist/services/TaskGraphActionRunner.js +27 -5
  180. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  181. package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
  182. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  183. package/dist/services/TaskGraphAgentRunner.js +157 -9
  184. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  185. package/dist/services/TaskGraphContinuationDeliverer.d.ts +54 -2
  186. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  187. package/dist/services/TaskGraphContinuationDeliverer.js +598 -15
  188. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  189. package/dist/sharedCache.d.ts.map +1 -1
  190. package/dist/sharedCache.js +3 -0
  191. package/dist/sharedCache.js.map +1 -1
  192. package/package.json +99 -98
  193. package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
  194. package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
  195. package/src/__tests__/FetchEntityVectorsResolver.test.ts +163 -15
  196. package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
  197. package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
  198. package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
  199. package/src/__tests__/LoginScreenEngine.test.ts +86 -0
  200. package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
  201. package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
  202. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
  203. package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
  204. package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
  205. package/src/__tests__/ResolverBase.clientOldValues.test.ts +209 -6
  206. package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
  207. package/src/__tests__/RunAIAgentResolver.branch.test.ts +1 -0
  208. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +5 -3
  209. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +258 -0
  210. package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
  211. package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
  212. package/src/__tests__/SessionJanitor.test.ts +365 -10
  213. package/src/__tests__/SessionManager.test.ts +27 -0
  214. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
  215. package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
  216. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +356 -22
  217. package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
  218. package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
  219. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
  220. package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
  221. package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
  222. package/src/__tests__/agent-run-data-guard.test.ts +130 -0
  223. package/src/__tests__/apiRootBoot.test.ts +202 -0
  224. package/src/__tests__/cacheInvalidationRecordData.test.ts +64 -0
  225. package/src/__tests__/conversationRunEvents.test.ts +56 -14
  226. package/src/__tests__/globalCors.test.ts +217 -0
  227. package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
  228. package/src/__tests__/multiTenancy.security.test.ts +51 -0
  229. package/src/__tests__/multiTenancy.test.ts +1 -1
  230. package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
  231. package/src/__tests__/pushStatusResolver.filter.test.ts +7 -0
  232. package/src/__tests__/realtimeRecordingHandler.test.ts +652 -0
  233. package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
  234. package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
  235. package/src/__tests__/sharedCache.test.ts +5 -3
  236. package/src/agentSessions/SessionJanitor.ts +369 -93
  237. package/src/agentSessions/SessionManager.ts +13 -1
  238. package/src/apiRoot.ts +78 -0
  239. package/src/auth/AuthProviderCatalogRouter.ts +26 -0
  240. package/src/auth/LoginScreenEngine.ts +50 -0
  241. package/src/auth/index.ts +1 -0
  242. package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
  243. package/src/config.ts +46 -5
  244. package/src/coreRoutes.ts +166 -0
  245. package/src/generated/graphql-schemas/__mj.ts +1273 -10
  246. package/src/generic/CacheInvalidationResolver.ts +73 -18
  247. package/src/generic/PushStatusResolver.ts +1 -1
  248. package/src/generic/ResolverBase.ts +304 -325
  249. package/src/generic/RunViewResolver.ts +17 -0
  250. package/src/globalCors.ts +71 -0
  251. package/src/index.ts +116 -174
  252. package/src/multiTenancy/index.ts +24 -2
  253. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
  254. package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
  255. package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
  256. package/src/realtimeSessions/index.ts +2 -0
  257. package/src/realtimeSessions/ownedRealtimeSession.ts +55 -0
  258. package/src/realtimeSessions/sessionAccess.ts +7 -3
  259. package/src/resolvers/ArtifactFileResolver.ts +9 -8
  260. package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
  261. package/src/resolvers/DatasetResolver.ts +70 -10
  262. package/src/resolvers/EntityRecordNameResolver.ts +3 -2
  263. package/src/resolvers/FetchEntityVectorsResolver.ts +121 -39
  264. package/src/resolvers/FileResolver.ts +321 -106
  265. package/src/resolvers/GetDataContextDataResolver.ts +139 -41
  266. package/src/resolvers/GetDataResolver.ts +6 -3
  267. package/src/resolvers/IntegrationDiscoveryResolver.ts +4 -2
  268. package/src/resolvers/QueryResolver.ts +11 -0
  269. package/src/resolvers/RealtimeClientSessionResolver.ts +10 -33
  270. package/src/resolvers/RunAIAgentResolver.ts +39 -4
  271. package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
  272. package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
  273. package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
  274. package/src/resolvers/TestQuerySQLResolver.ts +68 -13
  275. package/src/resolvers/TransactionGroupResolver.ts +131 -27
  276. package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
  277. package/src/resolvers/agent-run-data-guard.ts +89 -0
  278. package/src/rest/RealtimeRecordingHandler.ts +464 -0
  279. package/src/rest/ViewOperationsHandler.ts +29 -13
  280. package/src/rest/setupRESTEndpoints.ts +6 -0
  281. package/src/serverExtensionReservedRoots.ts +14 -17
  282. package/src/services/MJStorageBlobStore.ts +31 -30
  283. package/src/services/StartTaskGraphDispatcher.ts +2 -2
  284. package/src/services/TaskGraphActionRunner.ts +25 -5
  285. package/src/services/TaskGraphAgentRunner.ts +188 -11
  286. package/src/services/TaskGraphContinuationDeliverer.ts +704 -14
  287. package/src/sharedCache.ts +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globalCors.js","sourceRoot":"","sources":["../src/globalCors.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,8BAA8B,EAAE,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAWrH;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CACtC,QAAwC,EACxC,sBAAyC,EAAE;IAE3C,MAAM,WAAW,GAAG,QAAQ,EAAE,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC/C,sFAAsF;IACtF,6FAA6F;IAC7F,yFAAyF;IACzF,sFAAsF;IACtF,8FAA8F;IAC9F,mFAAmF;IACnF,MAAM,UAAU,GAAG,IAAI,CAAmB;QACtC,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACzB,8DAA8D;YAC9D,qDAAqD;YACrD,IAAI,YAAY,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1D,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACJ,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,MAAM,sBAAsB,CAAC,CAAC,CAAC;YAChE,CAAC;QACL,CAAC;QACD,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,gBAAgB,IAAI,IAAI,CAAC;QACxE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK;KACpC,CAAmB,CAAC;IACrB,OAAO,2BAA2B,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qCAAqC,CAAC,mBAAsC;IACxF,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,8BAA8B,CAAC,GAAG,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QACD,IAAI,EAAE,CAAC;IACX,CAAC,CAAC;AACN,CAAC"}
package/dist/index.d.ts CHANGED
@@ -25,6 +25,7 @@ export { Int, Float, ID } from 'type-graphql';
25
25
  export { NewUserBase } from './auth/newUsers.js';
26
26
  export { CreateIsolatedProvider } from './isolatedProvider.js';
27
27
  export { configInfo, DEFAULT_SERVER_CONFIG } from './config.js';
28
+ export { ApiRoute, ApiRootPath, ConfiguredPublicUrl, JoinApiRoute, NormalizeApiRootPath, type ApiRouteOptions } from './apiRoot.js';
28
29
  export { ServerExtensionLoader, BaseServerExtension, DefaultServerExtensionServiceRegistry } from '@memberjunction/server-extensions-core';
29
30
  export type { ServerExtensionConfig, ServerExtensionPhase, ServerExtensionServiceRegistry, ServerExtensionInitContext, ExtensionInitResult, ExtensionHealthResult, LoadExtensionsOptions, } from '@memberjunction/server-extensions-core';
30
31
  export * from './directives/index.js';
@@ -107,6 +108,7 @@ export * from './resolvers/FileCategoryResolver.js';
107
108
  export * from './resolvers/FileResolver.js';
108
109
  export * from './rest/MediaAccessKeys.js';
109
110
  export * from './rest/MediaStreamHandler.js';
111
+ export * from './rest/RealtimeRecordingHandler.js';
110
112
  export * from './resolvers/InfoResolver.js';
111
113
  export * from './resolvers/PotentialDuplicateRecordResolver.js';
112
114
  export * from './resolvers/DuplicateEntryCheckResolver.js';
@@ -141,10 +143,19 @@ export type MJServerOptions = {
141
143
  */
142
144
  serverExtensions?: ServerExtensionConfig[];
143
145
  };
146
+ /**
147
+ * Creates the Express application MJServer serves on. `X-Powered-By` is disabled: it only
148
+ * advertises the framework to scanners. {@link Serve} disables it again on a host-supplied app.
149
+ */
144
150
  export declare const CreateApp: () => Application;
145
151
  /** @deprecated Use {@link CreateApp}. */
146
152
  export declare const createApp: () => Application;
147
153
  export declare const Serve: (resolverPaths: Array<string>, app?: Application, options?: MJServerOptions) => Promise<void>;
148
154
  /** @deprecated Use {@link Serve}. */
149
155
  export declare const serve: (resolverPaths: Array<string>, app?: Application, options?: MJServerOptions) => Promise<void>;
156
+ export { BuildSessionClaims, MagicLinkKeyManager, MagicLinkService, HashToken, GenerateRawToken } from './auth/magicLink/index.js';
157
+ export type { MagicLinkJWTClaims } from './auth/magicLink/index.js';
158
+ export { VerifyHostAssertion } from './realtimeWidget/host-identity.js';
159
+ export type { HostAssertedIdentity, HostAssertionResult } from './realtimeWidget/host-identity.js';
160
+ export { IsScopeLimitedPrincipal } from './auth/scopeLimitedPrincipal.js';
150
161
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,gBAAgB,EAAqJ,MAAM,sBAAsB,CAAC;AAUrN,OAAgB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAS/C,OAAO,kBAAkB,CAAC;AAQ1B,OAAO,EAA2I,cAAc,EAAE,MAAM,aAAa,CAAC;AAwEtL,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAA4I,MAAM,wCAAwC,CAAC;AAOhP,OAAO,EAAE,mCAAmC,EAAE,MAAM,0BAA0B,CAAC;AAE/E;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,IAAI,gBAAgB,CAE5C;AAED,yCAAyC;AACzC,wBAAgB,SAAS,IAAI,gBAAgB,CAE5C;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,cAAc,cAAc,CAAC;AAI7B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qCAAqC,EAAE,MAAM,wCAAwC,CAAC;AAC3I,YAAY,EACR,qBAAqB,EACrB,oBAAoB,EACpB,8BAA8B,EAC9B,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,wCAAwC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC9E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,YAAY,CAAC;AAC3B,OAAO,EACH,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,GACnB,MAAM,iBAAiB,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAOhD,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAChH,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAIxE;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,GAAG,IAAI,CAEvE;AAED,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,iDAAiD,CAAC;AAChE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AAGjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,oDAAoD,CAAC;AACnE,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErH,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAStC,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC5C,CAAC;AAUF,eAAO,MAAM,SAAS,QAAO,WAAwB,CAAC;AAEtD,yCAAyC;AACzC,eAAO,MAAM,SAAS,QAHO,WAGK,CAAC;AAgHnC,eAAO,MAAM,KAAK,GAAU,eAAe,KAAK,CAAC,MAAM,CAAC,EAAE,MAAK,WAAyB,EAAE,UAAU,eAAe,KAAG,OAAO,CAAC,IAAI,CA86CjI,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,KAAK,kBAj7CyB,KAAK,CAAC,MAAM,CAAC,QAAO,WAAW,YAA0B,eAAe,KAAG,OAAO,CAAC,IAAI,CAi7CxG,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,gBAAgB,EAA+J,MAAM,sBAAsB,CAAC;AAU/N,OAAgB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAS/C,OAAO,kBAAkB,CAAC;AAQ1B,OAAO,EAA2I,cAAc,EAAE,MAAM,aAAa,CAAC;AAiEtL,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAA+K,MAAM,wCAAwC,CAAC;AAUnR,OAAO,EAAE,mCAAmC,EAAE,MAAM,0BAA0B,CAAC;AAE/E;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,IAAI,gBAAgB,CAE5C;AAED,yCAAyC;AACzC,wBAAgB,SAAS,IAAI,gBAAgB,CAE5C;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,cAAc,cAAc,CAAC;AAI7B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACpI,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,qCAAqC,EAAE,MAAM,wCAAwC,CAAC;AAC3I,YAAY,EACR,qBAAqB,EACrB,oBAAoB,EACpB,8BAA8B,EAC9B,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,wCAAwC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC9E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,YAAY,CAAC;AAC3B,OAAO,EACH,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,GACnB,MAAM,iBAAiB,CAAC;AACzB,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAOhD,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACxF,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAChH,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAIxE;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,qBAAqB,GAAG,IAAI,CAEvE;AAED,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,cAAc,wCAAwC,CAAC;AACvD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,iDAAiD,CAAC;AAChE,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,0CAA0C,CAAC;AACzD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AAGjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wCAAwC,CAAC;AACvD,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qCAAqC,CAAC;AACpD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,iCAAiC,CAAC;AAChD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC;AACpD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,oDAAoD,CAAC;AACnE,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,0BAA0B,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErH,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AAStC,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACzC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC5C,CAAC;AAUF;;;GAGG;AACH,eAAO,MAAM,SAAS,QAAO,WAI5B,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,SAAS,QAPO,WAOK,CAAC;AAgHnC,eAAO,MAAM,KAAK,GAAU,eAAe,KAAK,CAAC,MAAM,CAAC,EAAE,MAAK,WAAyB,EAAE,UAAU,eAAe,KAAG,OAAO,CAAC,IAAI,CAi0CjI,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,KAAK,kBAp0CyB,KAAK,CAAC,MAAM,CAAC,QAAO,WAAW,YAA0B,eAAe,KAAG,OAAO,CAAC,IAAI,CAo0CxG,CAAC;AA6b3B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACnI,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/index.js CHANGED
@@ -41,21 +41,17 @@ import { StartupLogger } from './logging/StartupLogger.js';
41
41
  import { AuthProviderFactory } from '@memberjunction/auth-providers';
42
42
  import createMSSQLConfig from './orm.js';
43
43
  import { setupRESTEndpoints } from './rest/setupRESTEndpoints.js';
44
- import { createOAuthCallbackHandler } from './rest/OAuthCallbackHandler.js';
45
- import { createSignatureWebhookHandler } from './rest/SignatureWebhookHandler.js';
46
- import { createMediaStreamRouter } from './rest/MediaStreamHandler.js';
47
- import { createRealtimeSdpBrokerRouter } from './rest/RealtimeSdpBrokerHandler.js';
48
- import { REALTIME_SDP_EXCHANGE_PATH } from '@memberjunction/ai';
49
- import { createMagicLinkHandler, createMagicLinkJwksRouter, registerMagicLinkAuthProvider, MAGIC_LINK_MOUNT_PATH } from './auth/magicLink/index.js';
50
- import { createWidgetHandler, WIDGET_MOUNT_PATH } from './realtimeWidget/index.js';
51
- import { CreateRealtimeVerifyRouter, REALTIME_VERIFY_MOUNT_PATH, RealtimeSessionEventService, RealtimeSessionVerificationService, ParseReplicatedRealtimeSessionEvent, } from './realtimeSessions/index.js';
44
+ import { CreateRealtimeRecordingRouter, REALTIME_RECORDING_MOUNT_PATH } from './rest/RealtimeRecordingHandler.js';
45
+ import { LoadOwnedRealtimeSession } from './realtimeSessions/ownedRealtimeSession.js';
46
+ import { LoadSessionConversationExternalID } from './realtimeSessions/sessionAccess.js';
47
+ import { RecordingAssemblyScheduler } from './realtimeSessions/RecordingAssemblyScheduler.js';
48
+ import { RealtimeSessionEventService, ParseReplicatedRealtimeSessionEvent, } from './realtimeSessions/index.js';
52
49
  import { resolve } from 'node:path';
53
50
  import { DataSourceInfo, raiseEvent } from './types.js';
54
51
  import { ScheduledJobsService } from './services/ScheduledJobsService.js';
55
52
  import { IntegrationSyncWorkerService } from './services/IntegrationSyncWorkerService.js';
56
53
  import { LocalCacheManager, TelemetryManager, LogStatus, LogError, SetVerboseLogging } from '@memberjunction/core';
57
54
  import { validateAuthProvidersRegistered } from './auth/index.js';
58
- import { createAuthProviderCatalogRouter, AUTH_CATALOG_MOUNT_PATH } from './auth/AuthProviderCatalogRouter.js';
59
55
  import { GetAPIKeyEngine } from '@memberjunction/api-keys';
60
56
  import { ActionEngineServer } from '@memberjunction/actions';
61
57
  import { CreateAdhocSQLAuthorizer } from './resolvers/AdhocQueryResolver.js';
@@ -67,7 +63,7 @@ import { RoomHandoffEngine } from '@memberjunction/livekit-room-server';
67
63
  import { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
68
64
  import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResolver.js';
69
65
  import { RegisterRSUProgressBridge } from './integration/RSUProgressBridge.js';
70
- import { ClientToolRequestManager, AgentRunWatchdog } from '@memberjunction/ai-agents';
66
+ import { ClientToolRequestManager, AgentRunWatchdog, SqlRealtimeRecordingLedger } from '@memberjunction/ai-agents';
71
67
  import { BindBridgeEngineHostInstance, SessionJanitor, SetHostInstancePort, StartBridgeOrphanReconciliation } from './agentSessions/index.js';
72
68
  import { StartTaskGraphDispatcher } from './services/StartTaskGraphDispatcher.js';
73
69
  import { MJServerWorkQueueProviderSource, StartWorkQueueHost } from './services/WorkQueueHostService.js';
@@ -76,8 +72,11 @@ import { MJStorageBlobStore } from './services/MJStorageBlobStore.js';
76
72
  import { CACHE_INVALIDATION_TOPIC, MayBroadcastRecordData, ConfigureRecordDataBroadcast } from './generic/CacheInvalidationResolver.js';
77
73
  import { ConnectorFactory, IntegrationEngine } from '@memberjunction/integration-engine';
78
74
  import { CronExpressionHelper } from '@memberjunction/scheduling-engine';
79
- import { ServerExtensionLoader, mergeServerExtensionConfigs, prepareServerExtensionConfigs, describeServerExtensionMount, InstallMediaUpgradeDispatcher, IsGraphQLWsPath } from '@memberjunction/server-extensions-core';
80
- import { coreReservedServerExtensionRoots } from './serverExtensionReservedRoots.js';
75
+ import { ServerExtensionLoader, mergeServerExtensionConfigs, prepareServerExtensionConfigs, describeServerExtensionMount, InstallMediaUpgradeDispatcher, IsGraphQLWsPath, GetCorsOwningServerExtensionRoots } from '@memberjunction/server-extensions-core';
76
+ import { CreateExtensionOwnedPreflightFallback, CreateGlobalCorsMiddleware } from './globalCors.js';
77
+ import { CoreReservedServerExtensionRoots } from './serverExtensionReservedRoots.js';
78
+ import { ApiRoute, ApiRootPath, ConfiguredPublicUrl } from './apiRoot.js';
79
+ import { MountHealthcheckRoute, MountPublicCoreRoutes, MountExtensionHealthRoute, MountAuthCatalogRoute, MountAuthenticatedCoreRoutes } from './coreRoutes.js';
81
80
  import { MetadataCacheRefreshIntervalSeconds } from './providerConfigUnits.js';
82
81
  import { CreateMetadataRefreshSignalHandler, METADATA_REFRESH_SIGNAL } from './metadataRefreshSignal.js';
83
82
  const cacheRefreshInterval = configInfo.databaseSettings.metadataCacheRefreshInterval;
@@ -110,6 +109,7 @@ export { Int, Float, ID } from 'type-graphql';
110
109
  export { NewUserBase } from './auth/newUsers.js';
111
110
  export { CreateIsolatedProvider } from './isolatedProvider.js';
112
111
  export { configInfo, DEFAULT_SERVER_CONFIG } from './config.js';
112
+ export { ApiRoute, ApiRootPath, ConfiguredPublicUrl, JoinApiRoute, NormalizeApiRootPath } from './apiRoot.js';
113
113
  export { ServerExtensionLoader, BaseServerExtension, DefaultServerExtensionServiceRegistry } from '@memberjunction/server-extensions-core';
114
114
  export * from './directives/index.js';
115
115
  export { NoLog, hasNoLogParameter, getNoLogFields } from './logging/NoLog.js';
@@ -199,6 +199,7 @@ export * from './resolvers/FileCategoryResolver.js';
199
199
  export * from './resolvers/FileResolver.js';
200
200
  export * from './rest/MediaAccessKeys.js';
201
201
  export * from './rest/MediaStreamHandler.js';
202
+ export * from './rest/RealtimeRecordingHandler.js';
202
203
  export * from './resolvers/InfoResolver.js';
203
204
  export * from './resolvers/PotentialDuplicateRecordResolver.js';
204
205
  export * from './resolvers/DuplicateEntryCheckResolver.js';
@@ -232,7 +233,15 @@ const localPath = (p) => {
232
233
  const resolvedPath = resolve(dirname, p);
233
234
  return resolvedPath;
234
235
  };
235
- export const CreateApp = () => express();
236
+ /**
237
+ * Creates the Express application MJServer serves on. `X-Powered-By` is disabled: it only
238
+ * advertises the framework to scanners. {@link Serve} disables it again on a host-supplied app.
239
+ */
240
+ export const CreateApp = () => {
241
+ const app = express();
242
+ app.disable('x-powered-by');
243
+ return app;
244
+ };
236
245
  /** @deprecated Use {@link CreateApp}. */
237
246
  export const createApp = CreateApp;
238
247
  /**
@@ -707,6 +716,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
707
716
  if (sharedCache) {
708
717
  await LocalCacheManager.Instance.SetStorageProvider(sharedCache);
709
718
  }
719
+ // The derived per-entry ceiling, so the boot log says what the largest cacheable entry actually is.
720
+ startupLog.LogIf('verbose', `LocalCacheManager: largest cacheable entry ${Math.floor(LocalCacheManager.Instance.MaxEntrySizeBytes / 1024 / 1024)} MB (maxEntryPercentOfCache: ${configInfo.cacheSettings?.maxEntryPercentOfCache ?? 'auto'})`);
710
721
  const engineSweepMs = StartEngineSweeper(configInfo.cacheSettings);
711
722
  startupLog.LogIf('verbose', engineSweepMs > 0 ? `Engine/database sweep every ${engineSweepMs / 1000}s` : 'Engine/database sweep disabled');
712
723
  const userCacheCheckMs = StartUserCacheChecks(configInfo.cacheSettings);
@@ -1074,6 +1085,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1074
1085
  const apolloServer = buildApolloServer({ schema }, { httpServer, serverCleanup }, mwApolloPlugins.length > 0 ? mwApolloPlugins : undefined);
1075
1086
  await apolloServer.start();
1076
1087
  // Fix #8: Add compression for better throughput performance
1088
+ // Never advertise the framework (`X-Powered-By: Express`) — the host may have passed its own app.
1089
+ app.disable('x-powered-by');
1077
1090
  app.use(compression({
1078
1091
  // Don't compress responses smaller than 1KB
1079
1092
  threshold: 1024,
@@ -1093,102 +1106,21 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1093
1106
  // High compression level (good balance between CPU and compression ratio)
1094
1107
  level: 6
1095
1108
  }));
1096
- // Health check endpoint - registered before auth middleware so cloud
1097
- // platform probes (Azure App Service, AWS ALB, k8s, etc.) don't
1098
- // generate noisy auth errors in the logs. CORS is enabled so browser-based
1099
- // clients (e.g. MJExplorer's connectivity poller) can read the response.
1100
- app.get('/healthcheck', cors(), (_req, res) => {
1101
- res.status(200).json({ status: 'ok' });
1102
- });
1109
+ // Health check — before every middleware contribution and the auth middleware, so cloud platform
1110
+ // probes never generate auth noise. Every core route mounts under MJAPI_BASE_PATH (see apiRoot.ts).
1111
+ MountHealthcheckRoute(app);
1103
1112
  // Apply middleware-contributed pre-auth handlers (after compression, before routes)
1104
1113
  for (const mw of mwPreAuth) {
1105
1114
  app.use(mw);
1106
1115
  }
1107
- // ─── OAuth callback routes (unauthenticated, registered BEFORE auth) ─────
1108
- const oauthPublicUrl = configInfo.publicUrl || `${configInfo.baseUrl}:${configInfo.graphqlPort}${configInfo.graphqlRootPath || ''}`;
1116
+ // ─── Public core routes (unauthenticated, registered BEFORE auth) ─────
1117
+ // OAuth callback, eSignature, media, realtime SDP broker, magic-link, widget, realtime verify — see
1118
+ // coreRoutes.ts. New custom routes belong in Server Extensions, never in serve().
1119
+ // oauthPublicUrl is the configured public URL, derived as it always was; it is also the magic-link JWT
1120
+ // issuer, so it stays untrimmed. Outward links use ApiRoute(…, { absolute: true }) instead.
1121
+ const oauthPublicUrl = ConfiguredPublicUrl();
1109
1122
  startupLog.LogIf('verbose', `[OAuth] publicUrl: ${oauthPublicUrl}`);
1110
- let oauthAuthenticatedRouter;
1111
- if (oauthPublicUrl) {
1112
- const { callbackRouter, authenticatedRouter } = createOAuthCallbackHandler({
1113
- publicUrl: oauthPublicUrl,
1114
- successRedirectUrl: `${oauthPublicUrl}/oauth/success`,
1115
- errorRedirectUrl: `${oauthPublicUrl}/oauth/error`,
1116
- // Constrains where a caller-supplied frontendReturnUrl may point (open-redirect guard).
1117
- allowedFrontendOrigins: configInfo.cors?.allowedOrigins ?? ['*']
1118
- });
1119
- oauthAuthenticatedRouter = authenticatedRouter;
1120
- const oauthCors = cors();
1121
- // OAuth callback is unauthenticated (called by external auth server)
1122
- app.use('/oauth', oauthCors, callbackRouter);
1123
- startupLog.LogIf('verbose', '[OAuth] Callback route registered at /oauth/callback');
1124
- }
1125
- // ─── Core HTTP Routes (Static Core Infrastructure) ─────────────────────────
1126
- // IMPORTANT ARCHITECTURAL NOTE:
1127
- // The route mounts below are strictly reserved for core framework infrastructure (OAuth, eSignature,
1128
- // media streaming, realtime WebRTC broker, magic-link, widgets).
1129
- // ALL new custom routes, external webhooks, vendor adapters, and application integrations MUST be
1130
- // implemented as Server Extensions (subclasses of BaseServerExtension in @memberjunction/server-extensions-core)
1131
- // mounted via ServerExtensionLoader — NEVER hardcoded as ad-hoc app.use() in serve().
1132
- // See guides/SERVER_EXTENSIONS_GUIDE.md for complete patterns and best practices.
1133
- // ─── eSignature webhook (unauthenticated, registered BEFORE auth) ─────
1134
- // Called by external signature providers (DocuSign Connect, etc.) without an MJ bearer token.
1135
- // The provider DRIVER verifies the payload signature/HMAC; MJ auth does not apply here.
1136
- app.use('/esignature', cors(), createSignatureWebhookHandler());
1137
- startupLog.LogIf('verbose', '[eSignature] Webhook route registered at /esignature/webhook/:driverKey');
1138
- // ─── Authenticated media streaming (token-gated, registered BEFORE auth) ─────
1139
- // The `?token=` query param (minted by CreateMediaAccessToken after a per-user permission
1140
- // check) is the capability — the route verifies it itself, so it does NOT use the MJ bearer
1141
- // auth middleware (an <audio>/<video> element can't send Authorization headers).
1142
- app.use('/media', cors(), createMediaStreamRouter());
1143
- startupLog.LogIf('verbose', '[Media] Streaming route registered at /media/:fileId');
1144
- // ─── Realtime WebRTC SDP broker (ticket-gated, registered BEFORE auth) ───────
1145
- if (configInfo.realtime?.enabled) {
1146
- app.use(REALTIME_SDP_EXCHANGE_PATH, cors(), createRealtimeSdpBrokerRouter());
1147
- startupLog.LogIf('verbose', `[Realtime] WebRTC SDP broker registered at ${REALTIME_SDP_EXCHANGE_PATH}`);
1148
- }
1149
- // ─── Magic-link routes (MJ-issued, app-scoped external access) ───────────
1150
- // Public router (JWKS + redeem) mounts BEFORE the auth middleware; the
1151
- // authenticated invite-creation router mounts AFTER it (see below).
1152
- let widgetAuthenticatedRouter;
1153
- let magicLinkAuthenticatedRouter;
1154
- if (configInfo.magicLink?.enabled) {
1155
- const { publicRouter, authenticatedRouter } = createMagicLinkHandler(oauthPublicUrl, configInfo.magicLink);
1156
- magicLinkAuthenticatedRouter = authenticatedRouter;
1157
- registerMagicLinkAuthProvider(oauthPublicUrl, configInfo.magicLink);
1158
- app.use(MAGIC_LINK_MOUNT_PATH, cors(), publicRouter);
1159
- startupLog.LogIf('verbose', `[MagicLink] Public routes registered at ${MAGIC_LINK_MOUNT_PATH}/redeem and ${MAGIC_LINK_MOUNT_PATH}/jwks.json`);
1160
- }
1161
- // ─── Public web widget: guest-session mint (PUBLIC, before auth mw) ───────
1162
- // Visitors hold no MJ JWT yet, so POST /widget/session is public. It reuses the
1163
- // magic-link RS256 key + `magic-link` auth provider (ensured idempotently inside
1164
- // createWidgetHandler), so it stands on its own even if magicLink.enabled is false.
1165
- if (configInfo.widget?.enabled) {
1166
- const { publicRouter: widgetRouter, authenticatedRouter: widgetAuthRouter } = createWidgetHandler(oauthPublicUrl, configInfo.widget);
1167
- widgetAuthenticatedRouter = widgetAuthRouter;
1168
- app.use(WIDGET_MOUNT_PATH, cors(), widgetRouter);
1169
- // The widget reuses the magic-link RS256 key + auth provider to validate guest
1170
- // tokens, which validates by fetching the JWKS at MAGIC_LINK_MOUNT_PATH/jwks.json.
1171
- // When magic-link itself is disabled its public router (which serves JWKS) never
1172
- // mounts, so publish the key here — otherwise every guest token fails validation
1173
- // (the auth middleware can't fetch the public key) and the widget 401s.
1174
- if (!configInfo.magicLink?.enabled) {
1175
- app.use(MAGIC_LINK_MOUNT_PATH, cors(), createMagicLinkJwksRouter());
1176
- startupLog.LogIf('verbose', `[Widget] Published reused signing key at ${MAGIC_LINK_MOUNT_PATH}/jwks.json (magic-link flow disabled)`);
1177
- }
1178
- startupLog.LogIf('verbose', `[Widget] Public routes registered at ${WIDGET_MOUNT_PATH}/session and ${WIDGET_MOUNT_PATH}/session/refresh`);
1179
- }
1180
- // ─── Realtime identity verification: PUBLIC verify-link routes (before auth mw) ───
1181
- // The person opening the emailed link holds no MJ token — the single-use token is the capability.
1182
- // GET only renders a confirm button; the POST redeems (mail scanners GET every link). Mounted only
1183
- // when verification is enabled AND able to send mail AND able to protect its codes (see
1184
- // realtime.identityVerification config: communicationProvider + hmacSecret).
1185
- if (configInfo.realtime?.identityVerification?.enabled && !RealtimeSessionVerificationService.Instance.IsEnabled) {
1186
- console.warn('[RealtimeVerify] realtime.identityVerification.enabled is true but verification is unavailable: it needs a communicationProvider and an hmacSecret of at least 16 characters.');
1187
- }
1188
- if (RealtimeSessionVerificationService.Instance.IsEnabled) {
1189
- app.use(REALTIME_VERIFY_MOUNT_PATH, cors(), CreateRealtimeVerifyRouter());
1190
- startupLog.LogIf('verbose', `[RealtimeVerify] Public routes registered at ${REALTIME_VERIFY_MOUNT_PATH}/:token (GET) and ${REALTIME_VERIFY_MOUNT_PATH} (POST)`);
1191
- }
1123
+ const coreAuthenticatedRouters = MountPublicCoreRoutes(app, oauthPublicUrl, startupLog);
1192
1124
  // ─── Server extensions loader & shared service registry ───────────────────
1193
1125
  const extensionLoader = new ServerExtensionLoader();
1194
1126
  _currentExtensionLoader = extensionLoader;
@@ -1255,13 +1187,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1255
1187
  const mergedHostExtensions = mergeServerExtensionConfigs(telephonyExtensionConfigs, rawHostExtensions);
1256
1188
  // Open App packages publish their extensions; host mj.config.cjs overlays by DriverClass
1257
1189
  // (and remains the only source for host-only extensions such as Slack/Teams).
1258
- // extraReservedRoots is derived from the mounts registered above plus graphqlRootPath
1259
- // so a new pre-auth app.use(...) in serve() must also be added to
1260
- // coreReservedServerExtensionRoots() — otherwise an Open App can claim it.
1190
+ // Every RootPath is relative to MJAPI_BASE_PATH: apiRootPath composes the real mount path, and
1191
+ // extraReservedRoots (also relative) must list every core mount in coreRoutes.ts, otherwise an
1192
+ // Open App can claim it.
1261
1193
  const extensionConfigs = prepareServerExtensionConfigs(mergeServerExtensionConfigs(options?.serverExtensions ?? [], mergedHostExtensions), {
1262
1194
  onInvalid: (message) => LogError(message),
1263
1195
  onOverlap: (message) => LogStatus(message),
1264
- extraReservedRoots: coreReservedServerExtensionRoots(graphqlRootPath),
1196
+ extraReservedRoots: CoreReservedServerExtensionRoots(),
1197
+ apiRootPath: ApiRootPath(),
1265
1198
  });
1266
1199
  for (const cfg of extensionConfigs) {
1267
1200
  LogStatus(`Server extension ${describeServerExtensionMount(cfg)}`);
@@ -1270,28 +1203,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1270
1203
  // Without this, the browser blocks 401 responses from the auth middleware
1271
1204
  // because they lack Access-Control-Allow-Origin headers, preventing the
1272
1205
  // client from reading the error code and triggering token refresh.
1273
- const corsAllowed = configInfo.cors?.allowedOrigins ?? ['*'];
1274
- const corsWildcard = corsAllowed.includes('*');
1275
- // SECURITY: never combine credentials with a wildcard/reflect-any-origin policy. When
1276
- // allowedOrigins is ['*'] the origin callback reflects the caller's Origin, and pairing that
1277
- // with Access-Control-Allow-Credentials: true lets any site a signed-in user visits make
1278
- // credentialed cross-origin reads. MJ's primary auth is a Bearer token (not auto-sent
1279
- // cross-origin), so dropping credentials under the wildcard default is safe; deployments that
1280
- // genuinely need credentialed CORS must configure an explicit allowedOrigins list.
1281
- app.use(cors({
1282
- origin: (origin, callback) => {
1283
- // Allow all origins when ['*'] (default/backward-compatible),
1284
- // or when no Origin header (server-to-server calls).
1285
- if (corsWildcard || !origin || corsAllowed.includes(origin)) {
1286
- callback(null, true);
1287
- }
1288
- else {
1289
- callback(new Error(`Origin ${origin} not allowed by CORS`));
1290
- }
1291
- },
1292
- credentials: corsWildcard ? false : (configInfo.cors?.allowCredentials ?? true),
1293
- maxAge: configInfo.cors?.maxAge ?? 86400,
1294
- }));
1206
+ // Extensions that declare `OwnsCORS: true` (ServerExtensionConfig) are exempt: the global
1207
+ // middleware skips their RootPaths so it neither reflects an origin onto their responses nor
1208
+ // answers their preflights — the extension's own OPTIONS handling and origin policy run instead.
1209
+ const corsOwnedExtensionRoots = GetCorsOwningServerExtensionRoots(extensionConfigs);
1210
+ if (corsOwnedExtensionRoots.length > 0) {
1211
+ LogStatus(`Global CORS skips extension-owned roots: ${corsOwnedExtensionRoots.join(', ')}`);
1212
+ }
1213
+ app.use(CreateGlobalCorsMiddleware(configInfo.cors, corsOwnedExtensionRoots));
1295
1214
  // ─── Pre-auth server extensions (before auth — extensions handle their own auth) ─────
1296
1215
  // Slack uses HMAC signature verification, Teams uses Bot Framework JWT validation.
1297
1216
  // These must be registered before the unified auth middleware so webhook
@@ -1301,21 +1220,11 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1301
1220
  phase: 'pre-auth',
1302
1221
  httpServer,
1303
1222
  publicUrl: oauthPublicUrl,
1223
+ apiRootPath: ApiRootPath(),
1304
1224
  });
1305
1225
  }
1306
- // Extension health endpoint (always available, returns empty array if no extensions)
1307
- app.get('/health/extensions', async (_req, res) => {
1308
- const results = await extensionLoader.HealthCheckAll();
1309
- const allHealthy = results.length === 0 || results.every(r => r.Healthy);
1310
- res.status(allHealthy ? 200 : 503).json({ extensions: results });
1311
- });
1312
- // ─── Public authentication-provider catalog (PUBLIC, before auth mw) ──────
1313
- // The browser needs the provider list BEFORE it holds a token, so this is necessarily
1314
- // unauthenticated and must mount ahead of the auth middleware. It publishes only the
1315
- // non-secret allow-list (see AuthProviderEngine.GetPublicCatalog) — the same values a
1316
- // single-provider SPA already compiled into its bundle.
1317
- app.use(AUTH_CATALOG_MOUNT_PATH, cors(), createAuthProviderCatalogRouter());
1318
- startupLog.LogIf('verbose', `[Auth] Public provider catalog registered at ${AUTH_CATALOG_MOUNT_PATH}/providers`);
1226
+ MountExtensionHealthRoute(app, extensionLoader);
1227
+ MountAuthCatalogRoute(app, startupLog);
1319
1228
  // ─── Unified auth middleware (replaces both REST authMiddleware and contextFunction auth) ─────
1320
1229
  app.use(CreateUnifiedAuthMiddleware(dataSources));
1321
1230
  // ─── Post-auth middleware from BaseServerMiddleware plugins ─────
@@ -1325,23 +1234,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1325
1234
  for (const mw of mwPostAuth) {
1326
1235
  app.use(mw);
1327
1236
  }
1328
- // ─── OAuth authenticated routes (auth already handled by unified middleware) ─────
1329
- if (oauthAuthenticatedRouter) {
1330
- const oauthCors = cors();
1331
- app.use('/oauth', oauthCors, BodyParser.json(), oauthAuthenticatedRouter);
1332
- startupLog.LogIf('verbose', '[OAuth] Authenticated routes registered at /oauth/status, /oauth/initiate, and /oauth/exchange');
1333
- }
1334
- // ─── Magic-link authenticated route (invite creation) ─────────────────────
1335
- if (magicLinkAuthenticatedRouter) {
1336
- app.use(MAGIC_LINK_MOUNT_PATH, cors(), magicLinkAuthenticatedRouter);
1337
- startupLog.LogIf('verbose', `[MagicLink] Authenticated route registered at ${MAGIC_LINK_MOUNT_PATH}/create`);
1338
- }
1339
- // ─── Widget authenticated route (RV4 resolve-identity) ────────────────────
1340
- // Mounts after the unified auth middleware so a verified visitor (post magic-link upgrade) can
1341
- // promote their anonymous returning-visitor trail to the verified record.
1342
- if (widgetAuthenticatedRouter) {
1343
- app.use(WIDGET_MOUNT_PATH, cors(), widgetAuthenticatedRouter);
1344
- startupLog.LogIf('verbose', `[Widget] Authenticated route registered at ${WIDGET_MOUNT_PATH}/resolve-identity`);
1237
+ // ─── Authenticated core routes: OAuth status/initiate/exchange, magic-link create, widget resolve-identity ─────
1238
+ MountAuthenticatedCoreRoutes(app, coreAuthenticatedRouters, startupLog);
1239
+ // ─── Realtime recording shards + terminal signal (authenticated, owner-gated) ─────
1240
+ // The browser uploads a client-direct call's recording as Opus shards and a keepalive terminal request;
1241
+ // assembly runs off the request path on the scheduler. Needs a SQL provider: the ledger calls procs.
1242
+ if (configInfo.realtime?.enabled) {
1243
+ if (mountRealtimeRecordingRoutes(app)) {
1244
+ startupLog.LogIf('verbose', `[Realtime] Recording routes registered at ${ApiRoute(REALTIME_RECORDING_MOUNT_PATH)}/:agentSessionId/shard/:index and /end`);
1245
+ }
1345
1246
  }
1346
1247
  // ─── Post-auth server extensions ──────────────────────────────────────────
1347
1248
  // Extensions declaring Phase: 'post-auth' mount after the unified auth middleware
@@ -1351,14 +1252,22 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1351
1252
  phase: 'post-auth',
1352
1253
  httpServer,
1353
1254
  publicUrl: oauthPublicUrl,
1255
+ apiRootPath: ApiRootPath(),
1354
1256
  });
1355
1257
  }
1258
+ // Every extension has now had its chance at the request: a preflight under an extension-owned
1259
+ // root that none of them answered is refused here, instead of falling through to the GraphQL
1260
+ // mount's cors(), which would approve it for every origin.
1261
+ if (corsOwnedExtensionRoots.length > 0) {
1262
+ app.use(CreateExtensionOwnedPreflightFallback(corsOwnedExtensionRoots));
1263
+ }
1356
1264
  // ─── Cross-extension lifecycle hook: OnAllExtensionsMounted ───────────────
1357
1265
  // Called after all extensions across both pre-auth and post-auth phases are mounted.
1358
1266
  // Extensions can wire themselves to services registered by other extensions or core.
1359
1267
  await extensionLoader.NotifyAllExtensionsMounted({
1360
1268
  httpServer,
1361
1269
  publicUrl: oauthPublicUrl,
1270
+ apiRootPath: ApiRootPath(),
1362
1271
  });
1363
1272
  // Install the single path-routing WebSocket-upgrade dispatcher AFTER all extensions across both
1364
1273
  // pre-auth and post-auth phases have mounted and registered their media WSS routes. ws 8.x has each
@@ -1986,4 +1895,47 @@ function createMSSQLCompatPool(pgPool) {
1986
1895
  };
1987
1896
  return wrapper;
1988
1897
  }
1898
+ // Defined below serve() on purpose: serverExtensionReservedRoots.test.ts treats every app.use() that appears
1899
+ // textually before the unified auth middleware as a pre-auth mount, and these routes are mounted post-auth.
1900
+ /**
1901
+ * Mounts the realtime recording shard/terminal routes (post-auth) and starts the assembly scheduler they
1902
+ * hand work to. Skipped, with a warning, when the server's provider is not a SQL provider (the ledger calls
1903
+ * stored procedures). Without a system user the routes still store shards, and the janitor assembles them.
1904
+ * Returns whether the routes were mounted.
1905
+ */
1906
+ function mountRealtimeRecordingRoutes(app) {
1907
+ const provider = Metadata.Provider; // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet; the ledger's procs run as the server's SQL login either way
1908
+ if (!(provider instanceof DatabaseProviderBase)) {
1909
+ console.warn('[Realtime] Recording routes not mounted: the server provider is not a DatabaseProviderBase');
1910
+ return false;
1911
+ }
1912
+ const graceMs = () => configInfo.realtime.recordingAssemblyGraceSeconds * 1000;
1913
+ const systemUser = UserCache.Instance.GetSystemUser();
1914
+ if (systemUser) {
1915
+ RecordingAssemblyScheduler.Instance.Start({ Provider: provider, SystemUser: systemUser, GraceMs: graceMs });
1916
+ }
1917
+ else {
1918
+ LogError('[Realtime] Recording assembly scheduler not started: no system user; the session janitor assembles recordings instead');
1919
+ }
1920
+ app.use(ApiRoute(REALTIME_RECORDING_MOUNT_PATH), cors(), CreateRealtimeRecordingRouter({
1921
+ ResolveCaller: req => {
1922
+ const user = req.userPayload?.userRecord;
1923
+ return user ? { ContextUser: user, Provider: provider } : null;
1924
+ },
1925
+ LoadOwnedSession: LoadOwnedRealtimeSession,
1926
+ LoadConversationExternalID: LoadSessionConversationExternalID,
1927
+ CreateLedger: (ledgerProvider, contextUser) => new SqlRealtimeRecordingLedger(ledgerProvider, contextUser),
1928
+ Scheduler: RecordingAssemblyScheduler.Instance,
1929
+ GraceMs: graceMs,
1930
+ SystemUser: () => UserCache.Instance.GetSystemUser() ?? null,
1931
+ }));
1932
+ return true;
1933
+ }
1934
+ // Public-edge building blocks for Open Apps that run their own pre-auth edge and mint
1935
+ // scope-limited guest sessions (e.g. a ballot edge: verify a credential, then mint a short-lived
1936
+ // session scoped to one resource). They are the same pieces WidgetSessionService uses; a generic
1937
+ // public-widget session mint remains the long-term replacement.
1938
+ export { BuildSessionClaims, MagicLinkKeyManager, MagicLinkService, HashToken, GenerateRawToken } from './auth/magicLink/index.js';
1939
+ export { VerifyHostAssertion } from './realtimeWidget/host-identity.js';
1940
+ export { IsScopeLimitedPrincipal } from './auth/scopeLimitedPrincipal.js';
1989
1941
  //# sourceMappingURL=index.js.map