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

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 (435) hide show
  1. package/README.md +30 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +25 -0
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -0
  5. package/dist/agentSessions/BridgeHostInstance.js +30 -0
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -0
  7. package/dist/agentSessions/HostInstance.d.ts +75 -11
  8. package/dist/agentSessions/HostInstance.d.ts.map +1 -1
  9. package/dist/agentSessions/HostInstance.js +99 -28
  10. package/dist/agentSessions/HostInstance.js.map +1 -1
  11. package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
  12. package/dist/agentSessions/ReturningVisitorRecap.js +7 -3
  13. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  14. package/dist/agentSessions/SessionJanitor.d.ts +173 -25
  15. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  16. package/dist/agentSessions/SessionJanitor.js +452 -54
  17. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  18. package/dist/agentSessions/SessionManager.d.ts +43 -2
  19. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  20. package/dist/agentSessions/SessionManager.js +99 -8
  21. package/dist/agentSessions/SessionManager.js.map +1 -1
  22. package/dist/agentSessions/SessionRunIDVerifier.d.ts +63 -0
  23. package/dist/agentSessions/SessionRunIDVerifier.d.ts.map +1 -0
  24. package/dist/agentSessions/SessionRunIDVerifier.js +129 -0
  25. package/dist/agentSessions/SessionRunIDVerifier.js.map +1 -0
  26. package/dist/agentSessions/index.d.ts +2 -0
  27. package/dist/agentSessions/index.d.ts.map +1 -1
  28. package/dist/agentSessions/index.js +10 -3
  29. package/dist/agentSessions/index.js.map +1 -1
  30. package/dist/auth/actionAuthorization.d.ts +40 -0
  31. package/dist/auth/actionAuthorization.d.ts.map +1 -0
  32. package/dist/auth/actionAuthorization.js +94 -0
  33. package/dist/auth/actionAuthorization.js.map +1 -0
  34. package/dist/auth/index.d.ts.map +1 -1
  35. package/dist/auth/index.js +3 -10
  36. package/dist/auth/index.js.map +1 -1
  37. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  38. package/dist/auth/magicLink/MagicLinkService.js +6 -3
  39. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  40. package/dist/auth/newUsers.d.ts +10 -0
  41. package/dist/auth/newUsers.d.ts.map +1 -1
  42. package/dist/auth/newUsers.js +80 -11
  43. package/dist/auth/newUsers.js.map +1 -1
  44. package/dist/config.d.ts +4567 -71
  45. package/dist/config.d.ts.map +1 -1
  46. package/dist/config.js +246 -3
  47. package/dist/config.js.map +1 -1
  48. package/dist/context.d.ts +8 -0
  49. package/dist/context.d.ts.map +1 -1
  50. package/dist/context.js +25 -34
  51. package/dist/context.js.map +1 -1
  52. package/dist/generated/graphql-schemas/__mj.d.ts +1073 -10
  53. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  54. package/dist/generated/graphql-schemas/__mj.js +9188 -3649
  55. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  56. package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
  57. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  58. package/dist/generic/ResolverBase.d.ts +62 -6
  59. package/dist/generic/ResolverBase.d.ts.map +1 -1
  60. package/dist/generic/ResolverBase.js +179 -35
  61. package/dist/generic/ResolverBase.js.map +1 -1
  62. package/dist/generic/RunViewResolver.d.ts +4 -0
  63. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  64. package/dist/generic/RunViewResolver.js +37 -1
  65. package/dist/generic/RunViewResolver.js.map +1 -1
  66. package/dist/index.d.ts +7 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +214 -159
  69. package/dist/index.js.map +1 -1
  70. package/dist/isolatedProvider.d.ts +20 -0
  71. package/dist/isolatedProvider.d.ts.map +1 -0
  72. package/dist/isolatedProvider.js +22 -0
  73. package/dist/isolatedProvider.js.map +1 -0
  74. package/dist/postgresqlCompat.d.ts +8 -0
  75. package/dist/postgresqlCompat.d.ts.map +1 -0
  76. package/dist/postgresqlCompat.js +19 -0
  77. package/dist/postgresqlCompat.js.map +1 -0
  78. package/dist/postgresqlPoolSettings.d.ts +108 -0
  79. package/dist/postgresqlPoolSettings.d.ts.map +1 -0
  80. package/dist/postgresqlPoolSettings.js +134 -0
  81. package/dist/postgresqlPoolSettings.js.map +1 -0
  82. package/dist/realtimeProxy/RealtimeProxyServer.d.ts +44 -4
  83. package/dist/realtimeProxy/RealtimeProxyServer.d.ts.map +1 -1
  84. package/dist/realtimeProxy/RealtimeProxyServer.js +121 -16
  85. package/dist/realtimeProxy/RealtimeProxyServer.js.map +1 -1
  86. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts +171 -0
  87. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts.map +1 -0
  88. package/dist/realtimeProxy/RealtimeRelayTunnel.js +532 -0
  89. package/dist/realtimeProxy/RealtimeRelayTunnel.js.map +1 -0
  90. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts +148 -0
  91. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts.map +1 -0
  92. package/dist/realtimeSessions/RealtimeSessionEventService.js +191 -0
  93. package/dist/realtimeSessions/RealtimeSessionEventService.js.map +1 -0
  94. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts +66 -0
  95. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -0
  96. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +138 -0
  97. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -0
  98. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts +38 -0
  99. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -0
  100. package/dist/realtimeSessions/RealtimeVerifyRouter.js +98 -0
  101. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -0
  102. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts +61 -0
  103. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -0
  104. package/dist/realtimeSessions/SessionVerificationPortsBase.js +149 -0
  105. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -0
  106. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts +57 -0
  107. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts.map +1 -0
  108. package/dist/realtimeSessions/SlidingWindowRateLimiter.js +69 -0
  109. package/dist/realtimeSessions/SlidingWindowRateLimiter.js.map +1 -0
  110. package/dist/realtimeSessions/index.d.ts +17 -0
  111. package/dist/realtimeSessions/index.d.ts.map +1 -0
  112. package/dist/realtimeSessions/index.js +17 -0
  113. package/dist/realtimeSessions/index.js.map +1 -0
  114. package/dist/realtimeSessions/sessionAccess.d.ts +86 -0
  115. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
  116. package/dist/realtimeSessions/sessionAccess.js +90 -0
  117. package/dist/realtimeSessions/sessionAccess.js.map +1 -0
  118. package/dist/realtimeSessions/sessionConfigStamps.d.ts +70 -0
  119. package/dist/realtimeSessions/sessionConfigStamps.d.ts.map +1 -0
  120. package/dist/realtimeSessions/sessionConfigStamps.js +93 -0
  121. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -0
  122. package/dist/realtimeSessions/subscriptionAuthorization.d.ts +65 -0
  123. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -0
  124. package/dist/realtimeSessions/subscriptionAuthorization.js +71 -0
  125. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -0
  126. package/dist/realtimeSessions/verificationCore.d.ts +243 -0
  127. package/dist/realtimeSessions/verificationCore.d.ts.map +1 -0
  128. package/dist/realtimeSessions/verificationCore.js +356 -0
  129. package/dist/realtimeSessions/verificationCore.js.map +1 -0
  130. package/dist/realtimeSessions/verificationPages.d.ts +66 -0
  131. package/dist/realtimeSessions/verificationPages.d.ts.map +1 -0
  132. package/dist/realtimeSessions/verificationPages.js +110 -0
  133. package/dist/realtimeSessions/verificationPages.js.map +1 -0
  134. package/dist/realtimeSessions/verificationPolicy.d.ts +147 -0
  135. package/dist/realtimeSessions/verificationPolicy.d.ts.map +1 -0
  136. package/dist/realtimeSessions/verificationPolicy.js +249 -0
  137. package/dist/realtimeSessions/verificationPolicy.js.map +1 -0
  138. package/dist/realtimeSessions/verificationWorkflow.d.ts +263 -0
  139. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -0
  140. package/dist/realtimeSessions/verificationWorkflow.js +435 -0
  141. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -0
  142. package/dist/realtimeWidget/widgetGuestElevation.d.ts +20 -2
  143. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  144. package/dist/realtimeWidget/widgetGuestElevation.js +31 -2
  145. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  146. package/dist/resolvers/ActionResolver.d.ts +31 -5
  147. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  148. package/dist/resolvers/ActionResolver.js +75 -14
  149. package/dist/resolvers/ActionResolver.js.map +1 -1
  150. package/dist/resolvers/AdhocQueryResolver.d.ts +35 -17
  151. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  152. package/dist/resolvers/AdhocQueryResolver.js +92 -166
  153. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  154. package/dist/resolvers/CacheStatsResolver.d.ts +27 -0
  155. package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -1
  156. package/dist/resolvers/CacheStatsResolver.js +113 -2
  157. package/dist/resolvers/CacheStatsResolver.js.map +1 -1
  158. package/dist/resolvers/ClientToolRequestResolver.d.ts +4 -2
  159. package/dist/resolvers/ClientToolRequestResolver.d.ts.map +1 -1
  160. package/dist/resolvers/ClientToolRequestResolver.js +28 -10
  161. package/dist/resolvers/ClientToolRequestResolver.js.map +1 -1
  162. package/dist/resolvers/EntityRecordNameResolver.d.ts +7 -23
  163. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  164. package/dist/resolvers/EntityRecordNameResolver.js +9 -47
  165. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  166. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +12 -1
  167. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  168. package/dist/resolvers/FetchEntityVectorsResolver.js +83 -2
  169. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  170. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  171. package/dist/resolvers/GetDataResolver.js +9 -0
  172. package/dist/resolvers/GetDataResolver.js.map +1 -1
  173. package/dist/resolvers/HumanHandoffResolver.d.ts +107 -0
  174. package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -0
  175. package/dist/resolvers/HumanHandoffResolver.js +330 -0
  176. package/dist/resolvers/HumanHandoffResolver.js.map +1 -0
  177. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  178. package/dist/resolvers/MCPResolver.js +9 -4
  179. package/dist/resolvers/MCPResolver.js.map +1 -1
  180. package/dist/resolvers/MeetingResolver.d.ts +69 -0
  181. package/dist/resolvers/MeetingResolver.d.ts.map +1 -0
  182. package/dist/resolvers/MeetingResolver.js +381 -0
  183. package/dist/resolvers/MeetingResolver.js.map +1 -0
  184. package/dist/resolvers/RealtimeBridgeResolver.d.ts +88 -3
  185. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  186. package/dist/resolvers/RealtimeBridgeResolver.js +352 -12
  187. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  188. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +156 -108
  189. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  190. package/dist/resolvers/RealtimeClientSessionResolver.js +395 -293
  191. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  192. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts +61 -0
  193. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts.map +1 -0
  194. package/dist/resolvers/RealtimeSessionEventsResolver.js +130 -0
  195. package/dist/resolvers/RealtimeSessionEventsResolver.js.map +1 -0
  196. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts +85 -0
  197. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts.map +1 -0
  198. package/dist/resolvers/RealtimeSessionVerificationResolver.js +188 -0
  199. package/dist/resolvers/RealtimeSessionVerificationResolver.js.map +1 -0
  200. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
  201. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  202. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
  203. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  204. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -0
  205. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  206. package/dist/resolvers/RunAIAgentResolver.js +68 -11
  207. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  208. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  209. package/dist/resolvers/RunTemplateResolver.js +12 -11
  210. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  211. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  212. package/dist/resolvers/SyncDataResolver.js +6 -2
  213. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  214. package/dist/resolvers/SyncRolesUsersResolver.d.ts +2 -0
  215. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  216. package/dist/resolvers/SyncRolesUsersResolver.js +23 -6
  217. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  218. package/dist/resolvers/UserAvatarResolver.d.ts +16 -0
  219. package/dist/resolvers/UserAvatarResolver.d.ts.map +1 -0
  220. package/dist/resolvers/UserAvatarResolver.js +124 -0
  221. package/dist/resolvers/UserAvatarResolver.js.map +1 -0
  222. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  223. package/dist/resolvers/UserResolver.js +2 -17
  224. package/dist/resolvers/UserResolver.js.map +1 -1
  225. package/dist/resolvers/adhocTimeout.d.ts +7 -0
  226. package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
  227. package/dist/resolvers/adhocTimeout.js +12 -0
  228. package/dist/resolvers/adhocTimeout.js.map +1 -0
  229. package/dist/resolvers/agentVisionConsentAudit.d.ts +37 -0
  230. package/dist/resolvers/agentVisionConsentAudit.d.ts.map +1 -0
  231. package/dist/resolvers/agentVisionConsentAudit.js +63 -0
  232. package/dist/resolvers/agentVisionConsentAudit.js.map +1 -0
  233. package/dist/resolvers/avatarInputValidation.d.ts +40 -0
  234. package/dist/resolvers/avatarInputValidation.d.ts.map +1 -0
  235. package/dist/resolvers/avatarInputValidation.js +97 -0
  236. package/dist/resolvers/avatarInputValidation.js.map +1 -0
  237. package/dist/resolvers/currentUserRoles.d.ts +29 -0
  238. package/dist/resolvers/currentUserRoles.d.ts.map +1 -1
  239. package/dist/resolvers/currentUserRoles.js +30 -0
  240. package/dist/resolvers/currentUserRoles.js.map +1 -1
  241. package/dist/resolvers/meetings/index.d.ts +5 -0
  242. package/dist/resolvers/meetings/index.d.ts.map +1 -0
  243. package/dist/resolvers/meetings/index.js +5 -0
  244. package/dist/resolvers/meetings/index.js.map +1 -0
  245. package/dist/resolvers/meetings/meetingHelpers.d.ts +17 -0
  246. package/dist/resolvers/meetings/meetingHelpers.d.ts.map +1 -0
  247. package/dist/resolvers/meetings/meetingHelpers.js +212 -0
  248. package/dist/resolvers/meetings/meetingHelpers.js.map +1 -0
  249. package/dist/resolvers/meetings/meetingMutations.d.ts +18 -0
  250. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -0
  251. package/dist/resolvers/meetings/meetingMutations.js +439 -0
  252. package/dist/resolvers/meetings/meetingMutations.js.map +1 -0
  253. package/dist/resolvers/meetings/meetingQueries.d.ts +7 -0
  254. package/dist/resolvers/meetings/meetingQueries.d.ts.map +1 -0
  255. package/dist/resolvers/meetings/meetingQueries.js +113 -0
  256. package/dist/resolvers/meetings/meetingQueries.js.map +1 -0
  257. package/dist/resolvers/meetings/meetingTypes.d.ts +89 -0
  258. package/dist/resolvers/meetings/meetingTypes.d.ts.map +1 -0
  259. package/dist/resolvers/meetings/meetingTypes.js +345 -0
  260. package/dist/resolvers/meetings/meetingTypes.js.map +1 -0
  261. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  262. package/dist/rest/ViewOperationsHandler.js +8 -5
  263. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  264. package/dist/services/TaskGraphActionRunner.d.ts +8 -0
  265. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  266. package/dist/services/TaskGraphActionRunner.js +27 -1
  267. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  268. package/dist/services/TaskGraphContinuationDeliverer.d.ts +4 -3
  269. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  270. package/dist/services/TaskGraphContinuationDeliverer.js +13 -7
  271. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  272. package/dist/services/WorkQueueHostService.d.ts +36 -0
  273. package/dist/services/WorkQueueHostService.d.ts.map +1 -0
  274. package/dist/services/WorkQueueHostService.js +97 -0
  275. package/dist/services/WorkQueueHostService.js.map +1 -0
  276. package/dist/services/workQueueConfig.d.ts +103 -0
  277. package/dist/services/workQueueConfig.d.ts.map +1 -0
  278. package/dist/services/workQueueConfig.js +48 -0
  279. package/dist/services/workQueueConfig.js.map +1 -0
  280. package/dist/sharedCache.d.ts +105 -0
  281. package/dist/sharedCache.d.ts.map +1 -0
  282. package/dist/sharedCache.js +276 -0
  283. package/dist/sharedCache.js.map +1 -0
  284. package/dist/types.d.ts +11 -0
  285. package/dist/types.d.ts.map +1 -1
  286. package/dist/types.js.map +1 -1
  287. package/package.json +97 -94
  288. package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
  289. package/src/__tests__/AdhocQueryResolver.bugs.test.ts +14 -35
  290. package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
  291. package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
  292. package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
  293. package/src/__tests__/BridgeHostInstance.test.ts +232 -0
  294. package/src/__tests__/ClientToolRequestResolver.test.ts +116 -0
  295. package/src/__tests__/EntityRecordNameResolver.fieldSecurity.test.ts +27 -72
  296. package/src/__tests__/FetchEntityVectorsResolver.test.ts +285 -0
  297. package/src/__tests__/HostInstance.test.ts +84 -0
  298. package/src/__tests__/HumanHandoffResolver.test.ts +250 -0
  299. package/src/__tests__/MeetingResolver.test.ts +448 -0
  300. package/src/__tests__/RealtimeBridgeResolver.test.ts +651 -4
  301. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
  302. package/src/__tests__/RealtimeClientSessionResolver.test.ts +682 -58
  303. package/src/__tests__/RealtimeProxyServer.test.ts +16 -1
  304. package/src/__tests__/RealtimeRelay.test.ts +876 -0
  305. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
  306. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +96 -0
  307. package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
  308. package/src/__tests__/ResolverBase.clientOldValues.test.ts +6 -3
  309. package/src/__tests__/ResolverBase.filterEscaping.test.ts +21 -2
  310. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +291 -0
  311. package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
  312. package/src/__tests__/RunAIAgentResolver.branch.test.ts +169 -0
  313. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +4 -4
  314. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +166 -0
  315. package/src/__tests__/RunTemplateResolver.test.ts +132 -0
  316. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +63 -0
  317. package/src/__tests__/SessionJanitor.test.ts +845 -18
  318. package/src/__tests__/SessionManager.test.ts +213 -17
  319. package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
  320. package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
  321. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +41 -0
  322. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +50 -3
  323. package/src/__tests__/UserAvatarResolver.test.ts +255 -0
  324. package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
  325. package/src/__tests__/WorkQueueHostService.test.ts +133 -0
  326. package/src/__tests__/actionAuthorization.test.ts +130 -0
  327. package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
  328. package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
  329. package/src/__tests__/avatarInputValidation.test.ts +160 -0
  330. package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
  331. package/src/__tests__/magicLinkService.consume.test.ts +6 -0
  332. package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -0
  333. package/src/__tests__/newUsers.template.test.ts +151 -0
  334. package/src/__tests__/newUsers.test.ts +74 -5
  335. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +17 -2
  336. package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
  337. package/src/__tests__/realtimeSessions/RealtimeSessionEventService.test.ts +201 -0
  338. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +215 -0
  339. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationResolver.test.ts +102 -0
  340. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationService.test.ts +349 -0
  341. package/src/__tests__/realtimeSessions/RealtimeVerifyRouter.test.ts +131 -0
  342. package/src/__tests__/realtimeSessions/SlidingWindowRateLimiter.test.ts +56 -0
  343. package/src/__tests__/realtimeSessions/helpers.ts +4 -0
  344. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +129 -0
  345. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +124 -0
  346. package/src/__tests__/realtimeSessions/verificationCore.test.ts +355 -0
  347. package/src/__tests__/realtimeSessions/verificationPages.test.ts +84 -0
  348. package/src/__tests__/realtimeSessions/verificationPolicy.test.ts +226 -0
  349. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +633 -0
  350. package/src/__tests__/resolverBase.fls.test.ts +87 -4
  351. package/src/__tests__/serverExtensionReservedRoots.test.ts +2 -0
  352. package/src/__tests__/sharedCache.test.ts +310 -0
  353. package/src/__tests__/translateBracketsToPG.test.ts +20 -0
  354. package/src/__tests__/widgetGuestElevation.test.ts +44 -0
  355. package/src/agentSessions/BridgeHostInstance.ts +32 -0
  356. package/src/agentSessions/HostInstance.ts +124 -28
  357. package/src/agentSessions/ReturningVisitorRecap.ts +7 -3
  358. package/src/agentSessions/SessionJanitor.ts +543 -57
  359. package/src/agentSessions/SessionManager.ts +125 -25
  360. package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
  361. package/src/agentSessions/index.ts +10 -3
  362. package/src/auth/actionAuthorization.ts +116 -0
  363. package/src/auth/index.ts +3 -8
  364. package/src/auth/magicLink/MagicLinkService.ts +6 -3
  365. package/src/auth/newUsers.ts +99 -11
  366. package/src/config.ts +255 -3
  367. package/src/context.ts +26 -34
  368. package/src/generated/graphql-schemas/__mj.ts +22701 -18838
  369. package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
  370. package/src/generic/ResolverBase.ts +210 -36
  371. package/src/generic/RunViewResolver.ts +37 -2
  372. package/src/index.ts +236 -170
  373. package/src/isolatedProvider.ts +22 -0
  374. package/src/postgresqlCompat.ts +21 -0
  375. package/src/postgresqlPoolSettings.ts +213 -0
  376. package/src/realtimeProxy/RealtimeProxyServer.ts +148 -16
  377. package/src/realtimeProxy/RealtimeRelayTunnel.ts +645 -0
  378. package/src/realtimeSessions/README.md +179 -0
  379. package/src/realtimeSessions/RealtimeSessionEventService.ts +274 -0
  380. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +167 -0
  381. package/src/realtimeSessions/RealtimeVerifyRouter.ts +108 -0
  382. package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
  383. package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
  384. package/src/realtimeSessions/index.ts +16 -0
  385. package/src/realtimeSessions/sessionAccess.ts +141 -0
  386. package/src/realtimeSessions/sessionConfigStamps.ts +123 -0
  387. package/src/realtimeSessions/subscriptionAuthorization.ts +116 -0
  388. package/src/realtimeSessions/verificationCore.ts +502 -0
  389. package/src/realtimeSessions/verificationPages.ts +149 -0
  390. package/src/realtimeSessions/verificationPolicy.ts +321 -0
  391. package/src/realtimeSessions/verificationWorkflow.ts +702 -0
  392. package/src/realtimeWidget/widgetGuestElevation.ts +34 -2
  393. package/src/resolvers/ActionResolver.ts +84 -21
  394. package/src/resolvers/AdhocQueryResolver.ts +105 -187
  395. package/src/resolvers/CacheStatsResolver.ts +89 -2
  396. package/src/resolvers/ClientToolRequestResolver.ts +25 -7
  397. package/src/resolvers/EntityRecordNameResolver.ts +9 -51
  398. package/src/resolvers/FetchEntityVectorsResolver.ts +97 -2
  399. package/src/resolvers/GetDataResolver.ts +10 -0
  400. package/src/resolvers/HumanHandoffResolver.ts +312 -0
  401. package/src/resolvers/MCPResolver.ts +8 -5
  402. package/src/resolvers/MeetingResolver.ts +438 -0
  403. package/src/resolvers/RealtimeBridgeResolver.ts +385 -19
  404. package/src/resolvers/RealtimeClientSessionResolver.ts +503 -344
  405. package/src/resolvers/RealtimeSessionEventsResolver.ts +133 -0
  406. package/src/resolvers/RealtimeSessionVerificationResolver.ts +174 -0
  407. package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
  408. package/src/resolvers/RunAIAgentResolver.ts +78 -11
  409. package/src/resolvers/RunTemplateResolver.ts +13 -12
  410. package/src/resolvers/SyncDataResolver.ts +6 -2
  411. package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
  412. package/src/resolvers/UserAvatarResolver.ts +111 -0
  413. package/src/resolvers/UserResolver.ts +2 -16
  414. package/src/resolvers/adhocTimeout.ts +12 -0
  415. package/src/resolvers/agentVisionConsentAudit.ts +82 -0
  416. package/src/resolvers/avatarInputValidation.ts +123 -0
  417. package/src/resolvers/currentUserRoles.ts +32 -1
  418. package/src/resolvers/meetings/index.ts +4 -0
  419. package/src/resolvers/meetings/meetingHelpers.ts +307 -0
  420. package/src/resolvers/meetings/meetingMutations.ts +556 -0
  421. package/src/resolvers/meetings/meetingQueries.ts +172 -0
  422. package/src/resolvers/meetings/meetingTypes.ts +238 -0
  423. package/src/rest/ViewOperationsHandler.ts +8 -5
  424. package/src/services/TaskGraphActionRunner.ts +29 -1
  425. package/src/services/TaskGraphContinuationDeliverer.ts +13 -7
  426. package/src/services/WorkQueueHostService.ts +129 -0
  427. package/src/services/workQueueConfig.ts +52 -0
  428. package/src/sharedCache.ts +302 -0
  429. package/src/types.ts +12 -0
  430. package/dist/resolvers/adhoc-query-helpers.d.ts +0 -33
  431. package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
  432. package/dist/resolvers/adhoc-query-helpers.js +0 -50
  433. package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
  434. package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
  435. package/src/resolvers/adhoc-query-helpers.ts +0 -67
@@ -40,7 +40,8 @@ export class TaskGraphContinuationDeliverer {
40
40
  this.contextUser = contextUser;
41
41
  }
42
42
  /**
43
- * Posts the roll-up as an AI-role message in the graph's conversation.
43
+ * Posts the roll-up as an AI-role message in the graph's conversation, on the fork of the
44
+ * message that started the graph (Main when that message is in Main).
44
45
  *
45
46
  * Never throws. The dispatcher calls this inside the compare-and-swap that marks a completion
46
47
  * delivered; an error escaping would either abort that guard or leave the graph looking
@@ -55,15 +56,16 @@ export class TaskGraphContinuationDeliverer {
55
56
  return;
56
57
  }
57
58
  const provider = await this.providerFactory.CreateProvider();
58
- const conversationID = await this.resolveConversationID(params.ConversationDetailID, provider);
59
- if (!conversationID) {
59
+ const origin = await this.resolveOrigin(params.ConversationDetailID, provider);
60
+ if (!origin) {
60
61
  LogError(`[TaskGraphContinuationDeliverer] Conversation detail ${params.ConversationDetailID} could not be loaded — ` +
61
62
  `"${params.WorkflowName}" has nowhere to post its outcome.`);
62
63
  return;
63
64
  }
64
65
  const detail = await provider.GetEntityObject('MJ: Conversation Details', this.contextUser);
65
66
  detail.NewRecord();
66
- detail.ConversationID = conversationID;
67
+ detail.ConversationID = origin.ConversationID;
68
+ detail.BranchID = origin.BranchID;
67
69
  detail.Role = 'AI';
68
70
  detail.Status = 'Complete';
69
71
  detail.HiddenToUser = false;
@@ -109,11 +111,15 @@ export class TaskGraphContinuationDeliverer {
109
111
  await this.PostMessage(params);
110
112
  return;
111
113
  }
114
+ // Run on the fork of the message that started the graph, as PostMessage posts into it:
115
+ // RunAgent derives the conversation from the detail, but not the fork.
116
+ const origin = params.ConversationDetailID ? await this.resolveOrigin(params.ConversationDetailID, provider) : null;
112
117
  await new AgentRunner().RunAgent({
113
118
  agent,
114
119
  conversationMessages: [{ role: ChatMessageRole.user, content: this.renderMessage(params) }],
115
120
  contextUser: this.contextUser,
116
121
  conversationDetailId: params.ConversationDetailID ?? undefined,
122
+ ConversationBranchID: origin?.BranchID ?? undefined,
117
123
  // The load-bearing value: without it the next graph this run submits restarts the
118
124
  // chain at zero and the cap never fires.
119
125
  continuationDepth: params.ReinvokeDepth + 1,
@@ -134,10 +140,10 @@ export class TaskGraphContinuationDeliverer {
134
140
  }
135
141
  }
136
142
  }
137
- /** The conversation a detail belongs to. */
138
- async resolveConversationID(conversationDetailID, provider) {
143
+ /** The conversation and fork (null is Main) of the detail that started the graph; null when it cannot be loaded. */
144
+ async resolveOrigin(conversationDetailID, provider) {
139
145
  const detail = await provider.GetEntityObject('MJ: Conversation Details', this.contextUser);
140
- return (await detail.Load(conversationDetailID)) ? detail.ConversationID : null;
146
+ return (await detail.Load(conversationDetailID)) ? { ConversationID: detail.ConversationID, BranchID: detail.BranchID ?? null } : null;
141
147
  }
142
148
  /**
143
149
  * Renders the outcome as Markdown.
@@ -1 +1 @@
1
- {"version":3,"file":"TaskGraphContinuationDeliverer.js","sourceRoot":"","sources":["../../src/services/TaskGraphContinuationDeliverer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TaskGraphContinuationDeliverer.js","sourceRoot":"","sources":["../../src/services/TaskGraphContinuationDeliverer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import sql from 'mssql';
2
+ import type { DatabaseProviderBase, IMetadataProvider, UserInfo } from '@memberjunction/core';
3
+ import { WorkQueueEngine } from '@memberjunction/work-queue-engine';
4
+ import type { WorkQueueHostConfig, WorkQueueProviderSource } from '@memberjunction/work-queue-engine';
5
+ import type { WorkQueueConfig } from './workQueueConfig.js';
6
+ export declare const WORK_QUEUE_DISABLE_ENV = "MJ_DISABLE_WORK_QUEUE_HOST";
7
+ type EnvironmentVariables = Record<string, string | undefined>;
8
+ export interface StartableWorkQueueHost {
9
+ Start(): Promise<void>;
10
+ }
11
+ /** Seams for tests; production uses DEFAULT_WORK_QUEUE_HOST_START_DEPENDENCIES. */
12
+ export interface WorkQueueHostStartDependencies {
13
+ Env: EnvironmentVariables;
14
+ FindUserByEmail(email: string): UserInfo | undefined;
15
+ ConfigureEngine(user: UserInfo, provider: DatabaseProviderBase): Promise<WorkQueueEngine>;
16
+ CreateHost(config: WorkQueueHostConfig, engine: WorkQueueEngine, user: UserInfo, provider: DatabaseProviderBase, providerSource: WorkQueueProviderSource): StartableWorkQueueHost;
17
+ }
18
+ export declare const DEFAULT_WORK_QUEUE_HOST_START_DEPENDENCIES: WorkQueueHostStartDependencies;
19
+ export declare function IsWorkQueueHostDisabledByEnv(env: EnvironmentVariables): boolean;
20
+ /**
21
+ * Host and pid for humans reading logs; the random suffix for uniqueness — containers routinely share pid 1 and
22
+ * HOSTNAME is not always exported. A restart is a new instance, so a dead process's leases simply expire.
23
+ */
24
+ export declare function CreateWorkQueueInstanceID(env?: EnvironmentVariables): string;
25
+ export declare function BuildWorkQueueHostConfig(config: WorkQueueConfig, instanceID: string): WorkQueueHostConfig;
26
+ /** A fresh SQL Server provider per delivery over the shared pool; the server provider otherwise. */
27
+ export declare class MJServerWorkQueueProviderSource implements WorkQueueProviderSource {
28
+ private readonly fallback;
29
+ private readonly factory;
30
+ constructor(pool: sql.ConnectionPool | null, fallback: IMetadataProvider);
31
+ CreateProvider(): Promise<IMetadataProvider>;
32
+ }
33
+ /** Returns the started host, or null when this instance runs no subscriptions. */
34
+ export declare function StartWorkQueueHost(config: WorkQueueConfig, provider: DatabaseProviderBase, providerSource: WorkQueueProviderSource, dependencies?: WorkQueueHostStartDependencies): Promise<StartableWorkQueueHost | null>;
35
+ export {};
36
+ //# sourceMappingURL=WorkQueueHostService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkQueueHostService.d.ts","sourceRoot":"","sources":["../../src/services/WorkQueueHostService.ts"],"names":[],"mappings":"AAMA,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAgB,eAAe,EAAiB,MAAM,mCAAmC,CAAC;AACjG,OAAO,KAAK,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAEtG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AAKnE,KAAK,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE/D,MAAM,WAAW,sBAAsB;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,mFAAmF;AACnF,MAAM,WAAW,8BAA8B;IAC3C,GAAG,EAAE,oBAAoB,CAAC;IAC1B,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACrD,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1F,UAAU,CAAC,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,cAAc,EAAE,uBAAuB,GAAG,sBAAsB,CAAC;CACrL;AAED,eAAO,MAAM,0CAA0C,EAAE,8BAUxD,CAAC;AAsBF,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAE/E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,oBAAkC,GAAG,MAAM,CAGzF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,GAAG,mBAAmB,CAUzG;AAED,oGAAoG;AACpG,qBAAa,+BAAgC,YAAW,uBAAuB;IAG9B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;gBAE9C,IAAI,EAAE,GAAG,CAAC,cAAc,GAAG,IAAI,EAAmB,QAAQ,EAAE,iBAAiB;IAIlF,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAGtD;AAED,kFAAkF;AAClF,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,oBAAoB,EAC9B,cAAc,EAAE,uBAAuB,EACvC,YAAY,GAAE,8BAA2E,GAC1F,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAkBxC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * @fileoverview Starts the durable work-queue host inside MJServer when `workQueue.enabled` is set.
3
+ * @module MJServer/services
4
+ */
5
+ import { randomBytes } from 'node:crypto';
6
+ import { hostname } from 'node:os';
7
+ import { LogError, LogStatus } from '@memberjunction/core';
8
+ import { UserCache } from '@memberjunction/generic-database-provider';
9
+ import { MJWorkLogger, WorkQueueEngine, WorkQueueHost } from '@memberjunction/work-queue-engine';
10
+ import { TaskGraphProviderFactory } from './TaskGraphProviderFactory.js';
11
+ export const WORK_QUEUE_DISABLE_ENV = 'MJ_DISABLE_WORK_QUEUE_HOST';
12
+ /** Matches the width of WorkQueueDelivery.LeaseOwner. */
13
+ const MAX_INSTANCE_ID_LENGTH = 200;
14
+ export const DEFAULT_WORK_QUEUE_HOST_START_DEPENDENCIES = {
15
+ Env: process.env,
16
+ FindUserByEmail: email => UserCache.Users.find(user => user.Email?.trim().toLowerCase() === email.trim().toLowerCase()),
17
+ ConfigureEngine: async (user, provider) => {
18
+ await WorkQueueEngine.Instance.Config(false, user, provider);
19
+ await ReportTopologyIssues(WorkQueueEngine.Instance);
20
+ return WorkQueueEngine.Instance;
21
+ },
22
+ CreateHost: (config, engine, user, provider, providerSource) => new WorkQueueHost(config, engine, user, provider, new MJWorkLogger(), { ProviderSource: providerSource }),
23
+ };
24
+ /**
25
+ * Topology rows, capability gating, driver bindings and database prerequisites (03 §11) — including SQL Server's
26
+ * READ_COMMITTED_SNAPSHOT requirement (03 §7). Problems are logged, never thrown: the planner still gates each
27
+ * subscription, and an operator can read the same list from WorkQueue.ValidateBindings.
28
+ */
29
+ async function ReportTopologyIssues(engine) {
30
+ try {
31
+ for (const issue of await engine.ValidateTopology()) {
32
+ const line = `[WorkQueue] ${issue.Severity}: ${issue.Subject} — ${issue.Message}`;
33
+ if (issue.Severity === 'Error') {
34
+ LogError(line);
35
+ }
36
+ else {
37
+ LogStatus(line);
38
+ }
39
+ }
40
+ }
41
+ catch (error) {
42
+ LogError(`[WorkQueue] Topology validation failed: ${error instanceof Error ? error.message : String(error)}`);
43
+ }
44
+ }
45
+ export function IsWorkQueueHostDisabledByEnv(env) {
46
+ return env[WORK_QUEUE_DISABLE_ENV] === '1';
47
+ }
48
+ /**
49
+ * Host and pid for humans reading logs; the random suffix for uniqueness — containers routinely share pid 1 and
50
+ * HOSTNAME is not always exported. A restart is a new instance, so a dead process's leases simply expire.
51
+ */
52
+ export function CreateWorkQueueInstanceID(env = process.env) {
53
+ const host = env.HOSTNAME ?? hostname();
54
+ return `${host}-${process.pid}-${randomBytes(4).toString('hex')}`.slice(0, MAX_INSTANCE_ID_LENGTH);
55
+ }
56
+ export function BuildWorkQueueHostConfig(config, instanceID) {
57
+ return {
58
+ InstanceID: instanceID,
59
+ Subscriptions: config.subscriptions.map(entry => ({ Name: entry.name, Concurrency: entry.concurrency })),
60
+ IdlePollMinMs: config.idlePollMinMs,
61
+ IdlePollMaxMs: config.idlePollMaxMs,
62
+ ShutdownDrainMs: config.shutdownDrainMs,
63
+ SweeperIntervalMs: config.sweeperEnabled ? config.sweeperIntervalMs : 0,
64
+ ReconcileIntervalMs: config.reconcileIntervalMs,
65
+ };
66
+ }
67
+ /** A fresh SQL Server provider per delivery over the shared pool; the server provider otherwise. */
68
+ export class MJServerWorkQueueProviderSource {
69
+ constructor(pool, fallback) {
70
+ this.fallback = fallback;
71
+ this.factory = pool ? new TaskGraphProviderFactory(pool) : null;
72
+ }
73
+ CreateProvider() {
74
+ return this.factory ? this.factory.CreateProvider() : Promise.resolve(this.fallback);
75
+ }
76
+ }
77
+ /** Returns the started host, or null when this instance runs no subscriptions. */
78
+ export async function StartWorkQueueHost(config, provider, providerSource, dependencies = DEFAULT_WORK_QUEUE_HOST_START_DEPENDENCIES) {
79
+ if (!config.enabled) {
80
+ return null;
81
+ }
82
+ if (IsWorkQueueHostDisabledByEnv(dependencies.Env)) {
83
+ LogStatus(`[WorkQueue] Host disabled by ${WORK_QUEUE_DISABLE_ENV}=1 — this process publishes but runs no subscriptions.`);
84
+ return null;
85
+ }
86
+ const user = dependencies.FindUserByEmail(config.systemUserEmail);
87
+ if (!user) {
88
+ throw new Error(`[WorkQueue] System user not found with email: ${config.systemUserEmail} — set workQueue.systemUserEmail in mj.config.cjs`);
89
+ }
90
+ const engine = await dependencies.ConfigureEngine(user, provider);
91
+ const hostConfig = BuildWorkQueueHostConfig(config, CreateWorkQueueInstanceID(dependencies.Env));
92
+ const host = dependencies.CreateHost(hostConfig, engine, user, provider, providerSource);
93
+ await host.Start();
94
+ LogStatus(`🔄 Work Queue host ${hostConfig.InstanceID}: ${hostConfig.Subscriptions.map(s => `${s.Name}×${s.Concurrency}`).join(', ')}`);
95
+ return host;
96
+ }
97
+ //# sourceMappingURL=WorkQueueHostService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkQueueHostService.js","sourceRoot":"","sources":["../../src/services/WorkQueueHostService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * @fileoverview The `workQueue` configuration section. Kept out of config.ts so it can be tested without
3
+ * config.ts's module-load database validation.
4
+ * @module MJServer/services
5
+ */
6
+ import { z } from 'zod';
7
+ export declare const WorkQueueSubscriptionEntrySchema: z.ZodObject<{
8
+ /** A subscription name, or '*' for every MJWorker subscription. */
9
+ name: z.ZodString;
10
+ /** Deliveries this instance processes concurrently for the subscription. */
11
+ concurrency: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ name?: string;
14
+ concurrency?: number;
15
+ }, {
16
+ name?: string;
17
+ concurrency?: number;
18
+ }>;
19
+ /**
20
+ * Durable work-queue host. When enabled, this process runs its share of MJWorker subscriptions. Every claim is atomic
21
+ * against shared state, so any number of instances may enable it against one database.
22
+ */
23
+ export declare const WorkQueueSchema: z.ZodEffects<z.ZodObject<{
24
+ enabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
25
+ systemUserEmail: z.ZodDefault<z.ZodOptional<z.ZodString>>;
26
+ subscriptions: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
27
+ /** A subscription name, or '*' for every MJWorker subscription. */
28
+ name: z.ZodString;
29
+ /** Deliveries this instance processes concurrently for the subscription. */
30
+ concurrency: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
31
+ }, "strip", z.ZodTypeAny, {
32
+ name?: string;
33
+ concurrency?: number;
34
+ }, {
35
+ name?: string;
36
+ concurrency?: number;
37
+ }>, "many">>>;
38
+ idlePollMinMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
39
+ idlePollMaxMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
40
+ shutdownDrainMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
41
+ sweeperEnabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
42
+ sweeperIntervalMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
43
+ reconcileIntervalMs: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ enabled?: boolean;
46
+ systemUserEmail?: string;
47
+ subscriptions?: {
48
+ name?: string;
49
+ concurrency?: number;
50
+ }[];
51
+ idlePollMinMs?: number;
52
+ idlePollMaxMs?: number;
53
+ shutdownDrainMs?: number;
54
+ sweeperEnabled?: boolean;
55
+ sweeperIntervalMs?: number;
56
+ reconcileIntervalMs?: number;
57
+ }, {
58
+ enabled?: boolean;
59
+ systemUserEmail?: string;
60
+ subscriptions?: {
61
+ name?: string;
62
+ concurrency?: number;
63
+ }[];
64
+ idlePollMinMs?: number;
65
+ idlePollMaxMs?: number;
66
+ shutdownDrainMs?: number;
67
+ sweeperEnabled?: boolean;
68
+ sweeperIntervalMs?: number;
69
+ reconcileIntervalMs?: number;
70
+ }>, {
71
+ enabled?: boolean;
72
+ systemUserEmail?: string;
73
+ subscriptions?: {
74
+ name?: string;
75
+ concurrency?: number;
76
+ }[];
77
+ idlePollMinMs?: number;
78
+ idlePollMaxMs?: number;
79
+ shutdownDrainMs?: number;
80
+ sweeperEnabled?: boolean;
81
+ sweeperIntervalMs?: number;
82
+ reconcileIntervalMs?: number;
83
+ }, {
84
+ enabled?: boolean;
85
+ systemUserEmail?: string;
86
+ subscriptions?: {
87
+ name?: string;
88
+ concurrency?: number;
89
+ }[];
90
+ idlePollMinMs?: number;
91
+ idlePollMaxMs?: number;
92
+ shutdownDrainMs?: number;
93
+ sweeperEnabled?: boolean;
94
+ sweeperIntervalMs?: number;
95
+ reconcileIntervalMs?: number;
96
+ }>;
97
+ export type WorkQueueConfig = z.infer<typeof WorkQueueSchema>;
98
+ /**
99
+ * The merge base for mj.config.cjs. Like scheduledJobs and integrationSyncWorker, the EFFECTIVE default system user
100
+ * is the placeholder: set workQueue.systemUserEmail explicitly, or StartWorkQueueHost fails fast and says so.
101
+ */
102
+ export declare const DEFAULT_WORK_QUEUE_CONFIG: WorkQueueConfig;
103
+ //# sourceMappingURL=workQueueConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workQueueConfig.d.ts","sourceRoot":"","sources":["../../src/services/workQueueConfig.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gCAAgC;IAC3C,mEAAmE;;IAEnE,4EAA4E;;;;;;;;EAE5E,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;QAV1B,mEAAmE;;QAEnE,4EAA4E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuB1E,CAAC;AAEL,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,eAUvC,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @fileoverview The `workQueue` configuration section. Kept out of config.ts so it can be tested without
3
+ * config.ts's module-load database validation.
4
+ * @module MJServer/services
5
+ */
6
+ import { z } from 'zod';
7
+ export const WorkQueueSubscriptionEntrySchema = z.object({
8
+ /** A subscription name, or '*' for every MJWorker subscription. */
9
+ name: z.string().min(1),
10
+ /** Deliveries this instance processes concurrently for the subscription. */
11
+ concurrency: z.number().int().positive().optional().default(4),
12
+ });
13
+ /**
14
+ * Durable work-queue host. When enabled, this process runs its share of MJWorker subscriptions. Every claim is atomic
15
+ * against shared state, so any number of instances may enable it against one database.
16
+ */
17
+ export const WorkQueueSchema = z
18
+ .object({
19
+ enabled: z.boolean().optional().default(false),
20
+ systemUserEmail: z.string().optional().default('system@memberjunction.org'),
21
+ subscriptions: z.array(WorkQueueSubscriptionEntrySchema).optional().default([{ name: '*', concurrency: 4 }]),
22
+ idlePollMinMs: z.number().int().positive().optional().default(250),
23
+ idlePollMaxMs: z.number().int().positive().optional().default(5000),
24
+ shutdownDrainMs: z.number().int().nonnegative().optional().default(8000),
25
+ sweeperEnabled: z.boolean().optional().default(true),
26
+ sweeperIntervalMs: z.number().int().positive().optional().default(60000),
27
+ reconcileIntervalMs: z.number().int().nonnegative().optional().default(30000),
28
+ })
29
+ .refine(config => config.idlePollMaxMs >= config.idlePollMinMs, {
30
+ message: 'workQueue.idlePollMaxMs must be >= workQueue.idlePollMinMs',
31
+ path: ['idlePollMaxMs'],
32
+ });
33
+ /**
34
+ * The merge base for mj.config.cjs. Like scheduledJobs and integrationSyncWorker, the EFFECTIVE default system user
35
+ * is the placeholder: set workQueue.systemUserEmail explicitly, or StartWorkQueueHost fails fast and says so.
36
+ */
37
+ export const DEFAULT_WORK_QUEUE_CONFIG = {
38
+ enabled: false,
39
+ systemUserEmail: 'not.set@nowhere.com',
40
+ subscriptions: [{ name: '*', concurrency: 4 }],
41
+ idlePollMinMs: 250,
42
+ idlePollMaxMs: 5000,
43
+ shutdownDrainMs: 8000,
44
+ sweeperEnabled: true,
45
+ sweeperIntervalMs: 60000,
46
+ reconcileIntervalMs: 30000,
47
+ };
48
+ //# sourceMappingURL=workQueueConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workQueueConfig.js","sourceRoot":"","sources":["../../src/services/workQueueConfig.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC,MAAM,CAAC;IACvD,mEAAmE;IACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,4EAA4E;IAC5E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAC3E,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5G,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAClE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnE,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACxE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACpD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACxE,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAC9E,CAAC;KACD,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,EAAE;IAC9D,OAAO,EAAE,4DAA4D;IACrE,IAAI,EAAE,CAAC,eAAe,CAAC;CACxB,CAAC,CAAC;AAIL;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAoB;IACxD,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,qBAAqB;IACtC,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC9C,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,IAAI;IACnB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,iBAAiB,EAAE,KAAK;IACxB,mBAAmB,EAAE,KAAK;CAC3B,CAAC"}
@@ -0,0 +1,105 @@
1
+ import type { CacheChangedEvent, LocalCacheManagerConfig, ProviderBase } from '@memberjunction/core';
2
+ import type { CacheSettingsConfig } from './config.js';
3
+ import { RedisLocalStorageProvider } from '@memberjunction/redis-provider';
4
+ import type { CachePublishMode } from '@memberjunction/redis-provider';
5
+ /**
6
+ * What an MJAPI process publishes, per category.
7
+ *
8
+ * - RunView slots carry their rows: engines on other servers apply them directly.
9
+ * - Writes without a category (the provider's metadata snapshot, ~2 MB compressed) publish a
10
+ * notice only: other servers re-check their metadata against the database and adopt the shared
11
+ * snapshot, so the value never needs to travel.
12
+ * - Everything else (dataset slots, query slots, registry) has no subscriber and publishes nothing.
13
+ * Category clears are always published.
14
+ */
15
+ export declare const MJAPI_PUBLISH_MODES: Readonly<Record<string, CachePublishMode>>;
16
+ /** Options for {@link CreateSharedCacheProvider}. */
17
+ export interface SharedCacheProviderOptions {
18
+ Url: string;
19
+ KeyPrefix: string;
20
+ DefaultTTLSeconds?: number;
21
+ EnableLogging: boolean;
22
+ }
23
+ /**
24
+ * Expiry for the shared Redis cache: `REDIS_TTL_SECONDS` when it holds a non-negative integer,
25
+ * otherwise `cacheSettings.sharedCacheTTLSeconds`, otherwise `undefined` (the provider's default).
26
+ */
27
+ export declare function ResolveSharedCacheTTLSeconds(configured: number | undefined, env?: NodeJS.ProcessEnv): number | undefined;
28
+ /**
29
+ * The shared cache the environment asks for (`REDIS_URL`, `REDIS_KEY_PREFIX`, `REDIS_TTL_SECONDS`),
30
+ * or null. Built before the database provider so metadata and startup engines use it from the
31
+ * first read.
32
+ */
33
+ export declare function CreateSharedCacheFromEnvironment(settings: CacheSettingsConfig | undefined, env?: NodeJS.ProcessEnv): RedisLocalStorageProvider | null;
34
+ /**
35
+ * The warm-up lease MJAPI hands to `StartupManager`, in milliseconds, from
36
+ * `cacheSettings.startupWarmupLeaseSeconds` (default 30).
37
+ */
38
+ export declare function WarmupLeaseMsFromSettings(settings: CacheSettingsConfig | undefined): number;
39
+ /** `LocalCacheManager` settings from `cacheSettings` in mj.config.cjs. */
40
+ export declare function CacheManagerConfigFromSettings(settings: CacheSettingsConfig | undefined): Partial<LocalCacheManagerConfig>;
41
+ /**
42
+ * Starts the periodic engine-vs-database sweep (plan Phase 3.1) at
43
+ * `cacheSettings.engineSweepIntervalSeconds` (default 300; 0 leaves it off).
44
+ * @returns The interval in milliseconds, 0 when disabled.
45
+ */
46
+ export declare function StartEngineSweeper(settings: CacheSettingsConfig | undefined): number;
47
+ /**
48
+ * Starts the periodic metadata-vs-database sweep at `cacheSettings.metadataSweepIntervalSeconds`
49
+ * (default 300; 0 leaves it off).
50
+ *
51
+ * The sweep asks the database **nothing** unless one of the entities the metadata is built from
52
+ * declares `TrustServerCacheCompletely = false` — see `ProviderBase.SweepMetadataAgainstDatabase`.
53
+ * On a stock installation no metadata entity declares it, so the timer ticks and costs nothing. It
54
+ * exists for installations that write metadata tables directly, where no event is ever raised and
55
+ * nothing else would notice.
56
+ *
57
+ * One process per interval does the work, via a shared lease: a process that refreshes writes a new
58
+ * snapshot and publishes a notice, which the others act on, so there is no value in each of them
59
+ * asking the database the same question.
60
+ *
61
+ * @returns The interval in milliseconds, 0 when disabled.
62
+ */
63
+ export declare function StartMetadataSweep(settings: CacheSettingsConfig | undefined, metadataProvider: () => ProviderBase | undefined): number;
64
+ /**
65
+ * Starts the periodic user-cache staleness check at `cacheSettings.userCacheCheckIntervalSeconds`
66
+ * (default 300; 0 leaves it off). The cache refreshes on MJ writes by itself — this covers users
67
+ * and roles changed outside MJ.
68
+ * @returns The interval in milliseconds, 0 when disabled.
69
+ */
70
+ export declare function StartUserCacheChecks(settings: CacheSettingsConfig | undefined): number;
71
+ /** Builds the Redis provider MJAPI uses as its shared cache. Pub/sub starts with {@link WireSharedCacheEvents}. */
72
+ export declare function CreateSharedCacheProvider(options: SharedCacheProviderOptions): RedisLocalStorageProvider;
73
+ /**
74
+ * Subscribes to other servers' cache events and routes them. Called before the database provider
75
+ * exists (so engines hear peers while they load); `metadataProvider` is resolved per event.
76
+ * 1. a metadata-snapshot notice → a metadata staleness check on this process's provider, and
77
+ * nothing further (a consumed notice returns here);
78
+ * 2. every other event → `LocalCacheManager.DispatchCacheChange` (engines, the user cache, and
79
+ * RunView callbacks);
80
+ * 3. RunView slot changes → an entity-level invalidation to connected browsers.
81
+ */
82
+ export declare function WireSharedCacheEvents(redis: RedisLocalStorageProvider, metadataProvider: () => ProviderBase | undefined): Promise<void>;
83
+ /** One incoming event, routed as described on {@link WireSharedCacheEvents}. */
84
+ export declare function RouteSharedCacheEvent(event: CacheChangedEvent, metadataProvider: ProviderBase | undefined): void;
85
+ /**
86
+ * Replicate push-status updates across server instances over Redis (MJ #4222).
87
+ *
88
+ * Outbound: every locally-published update is forwarded on a shared channel. Inbound: a message
89
+ * from another instance is republished onto THIS instance's local topic, where the normal
90
+ * subscription filter decides who receives it — so the identity gate (`ownerUserId` vs. the
91
+ * connection's authenticated user) still applies to a replicated message exactly as it does to a
92
+ * local one. The replica has no say in who sees what.
93
+ *
94
+ * Republishing goes straight to `PubSubManager`, never back through `publishStatusUpdate`, so an
95
+ * inbound message cannot be re-broadcast and loop. `SourceServerId` guards the remaining case: a
96
+ * publisher also receives its own message from Redis.
97
+ *
98
+ * The channel rides the same connection and subscriber as cache invalidation, and is namespaced
99
+ * with the provider's key prefix — so replicas configured with different `REDIS_KEY_PREFIX`
100
+ * values stop replicating to each other, exactly as their caches do.
101
+ *
102
+ * @param redis The shared cache provider, already built by {@link CreateSharedCacheFromEnvironment}.
103
+ */
104
+ export declare function WirePushStatusFanOut(redis: RedisLocalStorageProvider): Promise<void>;
105
+ //# sourceMappingURL=sharedCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedCache.d.ts","sourceRoot":"","sources":["../src/sharedCache.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAOvE;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAG1E,CAAC;AAEF,qDAAqD;AACrD,MAAM,WAAW,0BAA0B;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,GAAG,SAAS,CAUrI;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,yBAAyB,GAAG,IAAI,CAUlK;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAE3F;AAED,0EAA0E;AAC1E,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAQ1H;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAIpF;AAKD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,CAgBtI;AA0BD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GAAG,MAAM,CAItF;AAED,mHAAmH;AACnH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,yBAAyB,CAWxG;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7I;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAShH;AA2BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoC1F"}