@memberjunction/server 6.2.0-edge.3 → 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 (543) hide show
  1. package/README.md +20 -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 +236 -27
  15. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  16. package/dist/agentSessions/SessionJanitor.js +682 -54
  17. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  18. package/dist/agentSessions/SessionManager.d.ts +48 -3
  19. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  20. package/dist/agentSessions/SessionManager.js +112 -9
  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/apiRoot.d.ts +32 -0
  31. package/dist/apiRoot.d.ts.map +1 -0
  32. package/dist/apiRoot.js +67 -0
  33. package/dist/apiRoot.js.map +1 -0
  34. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  35. package/dist/auth/AuthProviderCatalogRouter.js +25 -0
  36. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  37. package/dist/auth/LoginScreenEngine.d.ts +22 -0
  38. package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
  39. package/dist/auth/LoginScreenEngine.js +57 -0
  40. package/dist/auth/LoginScreenEngine.js.map +1 -0
  41. package/dist/auth/actionAuthorization.d.ts +40 -0
  42. package/dist/auth/actionAuthorization.d.ts.map +1 -0
  43. package/dist/auth/actionAuthorization.js +94 -0
  44. package/dist/auth/actionAuthorization.js.map +1 -0
  45. package/dist/auth/index.d.ts +1 -0
  46. package/dist/auth/index.d.ts.map +1 -1
  47. package/dist/auth/index.js +4 -10
  48. package/dist/auth/index.js.map +1 -1
  49. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  50. package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
  51. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  52. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  53. package/dist/auth/magicLink/MagicLinkService.js +6 -3
  54. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  55. package/dist/auth/newUsers.d.ts +10 -0
  56. package/dist/auth/newUsers.d.ts.map +1 -1
  57. package/dist/auth/newUsers.js +80 -11
  58. package/dist/auth/newUsers.js.map +1 -1
  59. package/dist/config.d.ts +2514 -22
  60. package/dist/config.d.ts.map +1 -1
  61. package/dist/config.js +166 -4
  62. package/dist/config.js.map +1 -1
  63. package/dist/context.d.ts +8 -0
  64. package/dist/context.d.ts.map +1 -1
  65. package/dist/context.js +14 -11
  66. package/dist/context.js.map +1 -1
  67. package/dist/coreRoutes.d.ts +29 -0
  68. package/dist/coreRoutes.d.ts.map +1 -0
  69. package/dist/coreRoutes.js +142 -0
  70. package/dist/coreRoutes.js.map +1 -0
  71. package/dist/generated/graphql-schemas/__mj.d.ts +504 -3
  72. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  73. package/dist/generated/graphql-schemas/__mj.js +2456 -7
  74. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  75. package/dist/generic/CacheInvalidationResolver.d.ts +43 -8
  76. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  77. package/dist/generic/CacheInvalidationResolver.js +59 -19
  78. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  79. package/dist/generic/OrphanedConversationDetailReconciler.js +3 -3
  80. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  81. package/dist/generic/PushStatusResolver.js +1 -1
  82. package/dist/generic/PushStatusResolver.js.map +1 -1
  83. package/dist/generic/ResolverBase.d.ts +123 -48
  84. package/dist/generic/ResolverBase.d.ts.map +1 -1
  85. package/dist/generic/ResolverBase.js +293 -305
  86. package/dist/generic/ResolverBase.js.map +1 -1
  87. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  88. package/dist/generic/RunViewResolver.js +16 -0
  89. package/dist/generic/RunViewResolver.js.map +1 -1
  90. package/dist/globalCors.d.ts +33 -0
  91. package/dist/globalCors.d.ts.map +1 -0
  92. package/dist/globalCors.js +58 -0
  93. package/dist/globalCors.js.map +1 -0
  94. package/dist/index.d.ts +17 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +219 -278
  97. package/dist/index.js.map +1 -1
  98. package/dist/isolatedProvider.d.ts +20 -0
  99. package/dist/isolatedProvider.d.ts.map +1 -0
  100. package/dist/isolatedProvider.js +22 -0
  101. package/dist/isolatedProvider.js.map +1 -0
  102. package/dist/multiTenancy/index.d.ts.map +1 -1
  103. package/dist/multiTenancy/index.js +22 -2
  104. package/dist/multiTenancy/index.js.map +1 -1
  105. package/dist/realtimeProxy/RealtimeProxyServer.d.ts +44 -4
  106. package/dist/realtimeProxy/RealtimeProxyServer.d.ts.map +1 -1
  107. package/dist/realtimeProxy/RealtimeProxyServer.js +121 -16
  108. package/dist/realtimeProxy/RealtimeProxyServer.js.map +1 -1
  109. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts +171 -0
  110. package/dist/realtimeProxy/RealtimeRelayTunnel.d.ts.map +1 -0
  111. package/dist/realtimeProxy/RealtimeRelayTunnel.js +532 -0
  112. package/dist/realtimeProxy/RealtimeRelayTunnel.js.map +1 -0
  113. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts +148 -0
  114. package/dist/realtimeSessions/RealtimeSessionEventService.d.ts.map +1 -0
  115. package/dist/realtimeSessions/RealtimeSessionEventService.js +191 -0
  116. package/dist/realtimeSessions/RealtimeSessionEventService.js.map +1 -0
  117. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts +66 -0
  118. package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -0
  119. package/dist/realtimeSessions/RealtimeSessionVerificationService.js +139 -0
  120. package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -0
  121. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts +38 -0
  122. package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -0
  123. package/dist/realtimeSessions/RealtimeVerifyRouter.js +99 -0
  124. package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -0
  125. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
  126. package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
  127. package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
  128. package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
  129. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts +61 -0
  130. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -0
  131. package/dist/realtimeSessions/SessionVerificationPortsBase.js +149 -0
  132. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -0
  133. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts +57 -0
  134. package/dist/realtimeSessions/SlidingWindowRateLimiter.d.ts.map +1 -0
  135. package/dist/realtimeSessions/SlidingWindowRateLimiter.js +69 -0
  136. package/dist/realtimeSessions/SlidingWindowRateLimiter.js.map +1 -0
  137. package/dist/realtimeSessions/index.d.ts +19 -0
  138. package/dist/realtimeSessions/index.d.ts.map +1 -0
  139. package/dist/realtimeSessions/index.js +19 -0
  140. package/dist/realtimeSessions/index.js.map +1 -0
  141. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +30 -0
  142. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
  143. package/dist/realtimeSessions/ownedRealtimeSession.js +47 -0
  144. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
  145. package/dist/realtimeSessions/sessionAccess.d.ts +92 -0
  146. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -0
  147. package/dist/realtimeSessions/sessionAccess.js +94 -0
  148. package/dist/realtimeSessions/sessionAccess.js.map +1 -0
  149. package/dist/realtimeSessions/sessionConfigStamps.d.ts +70 -0
  150. package/dist/realtimeSessions/sessionConfigStamps.d.ts.map +1 -0
  151. package/dist/realtimeSessions/sessionConfigStamps.js +93 -0
  152. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -0
  153. package/dist/realtimeSessions/subscriptionAuthorization.d.ts +65 -0
  154. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -0
  155. package/dist/realtimeSessions/subscriptionAuthorization.js +71 -0
  156. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -0
  157. package/dist/realtimeSessions/verificationCore.d.ts +243 -0
  158. package/dist/realtimeSessions/verificationCore.d.ts.map +1 -0
  159. package/dist/realtimeSessions/verificationCore.js +356 -0
  160. package/dist/realtimeSessions/verificationCore.js.map +1 -0
  161. package/dist/realtimeSessions/verificationPages.d.ts +66 -0
  162. package/dist/realtimeSessions/verificationPages.d.ts.map +1 -0
  163. package/dist/realtimeSessions/verificationPages.js +110 -0
  164. package/dist/realtimeSessions/verificationPages.js.map +1 -0
  165. package/dist/realtimeSessions/verificationPolicy.d.ts +147 -0
  166. package/dist/realtimeSessions/verificationPolicy.d.ts.map +1 -0
  167. package/dist/realtimeSessions/verificationPolicy.js +249 -0
  168. package/dist/realtimeSessions/verificationPolicy.js.map +1 -0
  169. package/dist/realtimeSessions/verificationWorkflow.d.ts +263 -0
  170. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -0
  171. package/dist/realtimeSessions/verificationWorkflow.js +435 -0
  172. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -0
  173. package/dist/realtimeWidget/widgetGuestElevation.d.ts +20 -2
  174. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  175. package/dist/realtimeWidget/widgetGuestElevation.js +31 -2
  176. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  177. package/dist/resolvers/ActionResolver.d.ts +31 -5
  178. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  179. package/dist/resolvers/ActionResolver.js +75 -14
  180. package/dist/resolvers/ActionResolver.js.map +1 -1
  181. package/dist/resolvers/AdhocQueryResolver.d.ts +14 -1
  182. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  183. package/dist/resolvers/AdhocQueryResolver.js +21 -5
  184. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  185. package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
  186. package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
  187. package/dist/resolvers/ArtifactFileResolver.js +9 -7
  188. package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
  189. package/dist/resolvers/CacheStatsResolver.d.ts +27 -0
  190. package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -1
  191. package/dist/resolvers/CacheStatsResolver.js +113 -2
  192. package/dist/resolvers/CacheStatsResolver.js.map +1 -1
  193. package/dist/resolvers/ClientToolRequestResolver.d.ts +4 -2
  194. package/dist/resolvers/ClientToolRequestResolver.d.ts.map +1 -1
  195. package/dist/resolvers/ClientToolRequestResolver.js +28 -10
  196. package/dist/resolvers/ClientToolRequestResolver.js.map +1 -1
  197. package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
  198. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  199. package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
  200. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  201. package/dist/resolvers/DatasetResolver.d.ts +24 -3
  202. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  203. package/dist/resolvers/DatasetResolver.js +57 -8
  204. package/dist/resolvers/DatasetResolver.js.map +1 -1
  205. package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
  206. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  207. package/dist/resolvers/EntityRecordNameResolver.js +3 -2
  208. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  209. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +27 -1
  210. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  211. package/dist/resolvers/FetchEntityVectorsResolver.js +148 -2
  212. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  213. package/dist/resolvers/FileResolver.d.ts +82 -11
  214. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  215. package/dist/resolvers/FileResolver.js +279 -101
  216. package/dist/resolvers/FileResolver.js.map +1 -1
  217. package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
  218. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  219. package/dist/resolvers/GetDataContextDataResolver.js +117 -38
  220. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  221. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  222. package/dist/resolvers/GetDataResolver.js +6 -3
  223. package/dist/resolvers/GetDataResolver.js.map +1 -1
  224. package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -1
  225. package/dist/resolvers/HumanHandoffResolver.js +7 -1
  226. package/dist/resolvers/HumanHandoffResolver.js.map +1 -1
  227. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  228. package/dist/resolvers/IntegrationDiscoveryResolver.js +4 -2
  229. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  230. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  231. package/dist/resolvers/MCPResolver.js +9 -4
  232. package/dist/resolvers/MCPResolver.js.map +1 -1
  233. package/dist/resolvers/QueryResolver.d.ts +2 -0
  234. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  235. package/dist/resolvers/QueryResolver.js +13 -0
  236. package/dist/resolvers/QueryResolver.js.map +1 -1
  237. package/dist/resolvers/RealtimeBridgeResolver.d.ts +54 -2
  238. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  239. package/dist/resolvers/RealtimeBridgeResolver.js +155 -10
  240. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  241. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +157 -33
  242. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  243. package/dist/resolvers/RealtimeClientSessionResolver.js +404 -116
  244. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  245. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts +61 -0
  246. package/dist/resolvers/RealtimeSessionEventsResolver.d.ts.map +1 -0
  247. package/dist/resolvers/RealtimeSessionEventsResolver.js +130 -0
  248. package/dist/resolvers/RealtimeSessionEventsResolver.js.map +1 -0
  249. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts +85 -0
  250. package/dist/resolvers/RealtimeSessionVerificationResolver.d.ts.map +1 -0
  251. package/dist/resolvers/RealtimeSessionVerificationResolver.js +188 -0
  252. package/dist/resolvers/RealtimeSessionVerificationResolver.js.map +1 -0
  253. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +2 -0
  254. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  255. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -1
  256. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  257. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -0
  258. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  259. package/dist/resolvers/RunAIAgentResolver.js +100 -14
  260. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  261. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  262. package/dist/resolvers/RunTemplateResolver.js +12 -11
  263. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  264. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
  265. package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
  266. package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
  267. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  268. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  269. package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
  270. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  271. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  272. package/dist/resolvers/SyncDataResolver.js +6 -2
  273. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  274. package/dist/resolvers/SyncRolesUsersResolver.d.ts +2 -0
  275. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  276. package/dist/resolvers/SyncRolesUsersResolver.js +23 -6
  277. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  278. package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
  279. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  280. package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
  281. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  282. package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
  283. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  284. package/dist/resolvers/TestQuerySQLResolver.js +65 -13
  285. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  286. package/dist/resolvers/TransactionGroupResolver.d.ts +19 -2
  287. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  288. package/dist/resolvers/TransactionGroupResolver.js +102 -24
  289. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  290. package/dist/resolvers/UserAvatarResolver.d.ts +16 -0
  291. package/dist/resolvers/UserAvatarResolver.d.ts.map +1 -0
  292. package/dist/resolvers/UserAvatarResolver.js +124 -0
  293. package/dist/resolvers/UserAvatarResolver.js.map +1 -0
  294. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  295. package/dist/resolvers/UserResolver.js +2 -17
  296. package/dist/resolvers/UserResolver.js.map +1 -1
  297. package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
  298. package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
  299. package/dist/resolvers/agent-run-data-guard.js +72 -0
  300. package/dist/resolvers/agent-run-data-guard.js.map +1 -0
  301. package/dist/resolvers/agentVisionConsentAudit.d.ts +37 -0
  302. package/dist/resolvers/agentVisionConsentAudit.d.ts.map +1 -0
  303. package/dist/resolvers/agentVisionConsentAudit.js +63 -0
  304. package/dist/resolvers/agentVisionConsentAudit.js.map +1 -0
  305. package/dist/resolvers/avatarInputValidation.d.ts +40 -0
  306. package/dist/resolvers/avatarInputValidation.d.ts.map +1 -0
  307. package/dist/resolvers/avatarInputValidation.js +97 -0
  308. package/dist/resolvers/avatarInputValidation.js.map +1 -0
  309. package/dist/resolvers/currentUserRoles.d.ts +29 -0
  310. package/dist/resolvers/currentUserRoles.d.ts.map +1 -1
  311. package/dist/resolvers/currentUserRoles.js +30 -0
  312. package/dist/resolvers/currentUserRoles.js.map +1 -1
  313. package/dist/resolvers/meetings/meetingMutations.d.ts +6 -0
  314. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -1
  315. package/dist/resolvers/meetings/meetingMutations.js +21 -0
  316. package/dist/resolvers/meetings/meetingMutations.js.map +1 -1
  317. package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
  318. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
  319. package/dist/rest/RealtimeRecordingHandler.js +383 -0
  320. package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
  321. package/dist/rest/ViewOperationsHandler.d.ts +3 -1
  322. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  323. package/dist/rest/ViewOperationsHandler.js +21 -12
  324. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  325. package/dist/rest/setupRESTEndpoints.d.ts +6 -0
  326. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  327. package/dist/rest/setupRESTEndpoints.js +6 -0
  328. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  329. package/dist/serverExtensionReservedRoots.d.ts +12 -10
  330. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  331. package/dist/serverExtensionReservedRoots.js +14 -17
  332. package/dist/serverExtensionReservedRoots.js.map +1 -1
  333. package/dist/services/MJStorageBlobStore.d.ts +8 -1
  334. package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
  335. package/dist/services/MJStorageBlobStore.js +25 -19
  336. package/dist/services/MJStorageBlobStore.js.map +1 -1
  337. package/dist/services/StartTaskGraphDispatcher.js +2 -2
  338. package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
  339. package/dist/services/TaskGraphActionRunner.d.ts +5 -3
  340. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  341. package/dist/services/TaskGraphActionRunner.js +27 -5
  342. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  343. package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
  344. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  345. package/dist/services/TaskGraphAgentRunner.js +157 -9
  346. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  347. package/dist/services/TaskGraphContinuationDeliverer.d.ts +57 -4
  348. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  349. package/dist/services/TaskGraphContinuationDeliverer.js +607 -18
  350. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  351. package/dist/sharedCache.d.ts +105 -0
  352. package/dist/sharedCache.d.ts.map +1 -0
  353. package/dist/sharedCache.js +279 -0
  354. package/dist/sharedCache.js.map +1 -0
  355. package/dist/types.d.ts +6 -0
  356. package/dist/types.d.ts.map +1 -1
  357. package/dist/types.js.map +1 -1
  358. package/package.json +99 -96
  359. package/src/__tests__/ActionResolver.authorization.test.ts +353 -0
  360. package/src/__tests__/AdhocQueryResolver.sqlAuthorizer.test.ts +104 -0
  361. package/src/__tests__/BridgeHostInstance.test.ts +232 -0
  362. package/src/__tests__/ClientToolRequestResolver.test.ts +116 -0
  363. package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
  364. package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
  365. package/src/__tests__/FetchEntityVectorsResolver.test.ts +433 -0
  366. package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
  367. package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
  368. package/src/__tests__/HostInstance.test.ts +84 -0
  369. package/src/__tests__/HumanHandoffResolver.test.ts +17 -0
  370. package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
  371. package/src/__tests__/LoginScreenEngine.test.ts +86 -0
  372. package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
  373. package/src/__tests__/MeetingResolver.test.ts +75 -1
  374. package/src/__tests__/RealtimeBridgeResolver.test.ts +415 -6
  375. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +383 -0
  376. package/src/__tests__/RealtimeClientSessionResolver.test.ts +682 -58
  377. package/src/__tests__/RealtimeProxyServer.test.ts +16 -1
  378. package/src/__tests__/RealtimeRelay.test.ts +876 -0
  379. package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
  380. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +129 -0
  381. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
  382. package/src/__tests__/ResolverBase.aggregateScreen.test.ts +174 -0
  383. package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
  384. package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
  385. package/src/__tests__/ResolverBase.clientOldValues.test.ts +212 -6
  386. package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
  387. package/src/__tests__/ReturningVisitorRecap.test.ts +115 -0
  388. package/src/__tests__/RunAIAgentResolver.branch.test.ts +170 -0
  389. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +6 -4
  390. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +258 -0
  391. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +166 -0
  392. package/src/__tests__/RunTemplateResolver.test.ts +132 -0
  393. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +63 -0
  394. package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
  395. package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
  396. package/src/__tests__/SessionJanitor.test.ts +1203 -21
  397. package/src/__tests__/SessionManager.test.ts +240 -17
  398. package/src/__tests__/SessionRunIDVerifier.test.ts +251 -0
  399. package/src/__tests__/SyncRolesUsersResolver.userRoles.test.ts +97 -0
  400. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
  401. package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
  402. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +403 -22
  403. package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
  404. package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
  405. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
  406. package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
  407. package/src/__tests__/UserAvatarResolver.test.ts +255 -0
  408. package/src/__tests__/UserResolver.currentUser.test.ts +16 -1
  409. package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
  410. package/src/__tests__/actionAuthorization.test.ts +130 -0
  411. package/src/__tests__/agent-run-data-guard.test.ts +130 -0
  412. package/src/__tests__/agentVisionConsentAudit.test.ts +118 -0
  413. package/src/__tests__/apiRootBoot.test.ts +202 -0
  414. package/src/__tests__/avatarInputValidation.test.ts +160 -0
  415. package/src/__tests__/cacheInvalidationRecordData.test.ts +64 -0
  416. package/src/__tests__/conversationRunEvents.test.ts +56 -14
  417. package/src/__tests__/globalCors.test.ts +217 -0
  418. package/src/__tests__/isolatedProviderTransactions.test.ts +169 -0
  419. package/src/__tests__/magicLinkService.consume.test.ts +6 -0
  420. package/src/__tests__/magicLinkService.provisionLog.test.ts +5 -0
  421. package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
  422. package/src/__tests__/multiTenancy.security.test.ts +51 -0
  423. package/src/__tests__/multiTenancy.test.ts +1 -1
  424. package/src/__tests__/newUsers.template.test.ts +151 -0
  425. package/src/__tests__/newUsers.test.ts +74 -5
  426. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +17 -2
  427. package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
  428. package/src/__tests__/pushStatusResolver.filter.test.ts +7 -0
  429. package/src/__tests__/realtimeRecordingHandler.test.ts +652 -0
  430. package/src/__tests__/realtimeSessions/RealtimeSessionEventService.test.ts +201 -0
  431. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +215 -0
  432. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationResolver.test.ts +102 -0
  433. package/src/__tests__/realtimeSessions/RealtimeSessionVerificationService.test.ts +349 -0
  434. package/src/__tests__/realtimeSessions/RealtimeVerifyRouter.test.ts +131 -0
  435. package/src/__tests__/realtimeSessions/SlidingWindowRateLimiter.test.ts +56 -0
  436. package/src/__tests__/realtimeSessions/helpers.ts +4 -0
  437. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +129 -0
  438. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +124 -0
  439. package/src/__tests__/realtimeSessions/verificationCore.test.ts +355 -0
  440. package/src/__tests__/realtimeSessions/verificationPages.test.ts +84 -0
  441. package/src/__tests__/realtimeSessions/verificationPolicy.test.ts +226 -0
  442. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +633 -0
  443. package/src/__tests__/resolverBase.fls.test.ts +87 -4
  444. package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
  445. package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -96
  446. package/src/__tests__/sharedCache.test.ts +312 -0
  447. package/src/__tests__/widgetGuestElevation.test.ts +44 -0
  448. package/src/agentSessions/BridgeHostInstance.ts +32 -0
  449. package/src/agentSessions/HostInstance.ts +124 -28
  450. package/src/agentSessions/ReturningVisitorRecap.ts +7 -3
  451. package/src/agentSessions/SessionJanitor.ts +821 -59
  452. package/src/agentSessions/SessionManager.ts +138 -26
  453. package/src/agentSessions/SessionRunIDVerifier.ts +171 -0
  454. package/src/agentSessions/index.ts +10 -3
  455. package/src/apiRoot.ts +78 -0
  456. package/src/auth/AuthProviderCatalogRouter.ts +26 -0
  457. package/src/auth/LoginScreenEngine.ts +50 -0
  458. package/src/auth/actionAuthorization.ts +116 -0
  459. package/src/auth/index.ts +4 -8
  460. package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
  461. package/src/auth/magicLink/MagicLinkService.ts +6 -3
  462. package/src/auth/newUsers.ts +99 -11
  463. package/src/config.ts +171 -5
  464. package/src/context.ts +15 -10
  465. package/src/coreRoutes.ts +166 -0
  466. package/src/generated/graphql-schemas/__mj.ts +1815 -57
  467. package/src/generic/CacheInvalidationResolver.ts +73 -18
  468. package/src/generic/OrphanedConversationDetailReconciler.ts +3 -3
  469. package/src/generic/PushStatusResolver.ts +1 -1
  470. package/src/generic/ResolverBase.ts +335 -326
  471. package/src/generic/RunViewResolver.ts +21 -0
  472. package/src/globalCors.ts +71 -0
  473. package/src/index.ts +231 -300
  474. package/src/isolatedProvider.ts +22 -0
  475. package/src/multiTenancy/index.ts +24 -2
  476. package/src/realtimeProxy/RealtimeProxyServer.ts +148 -16
  477. package/src/realtimeProxy/RealtimeRelayTunnel.ts +645 -0
  478. package/src/realtimeSessions/README.md +179 -0
  479. package/src/realtimeSessions/RealtimeSessionEventService.ts +274 -0
  480. package/src/realtimeSessions/RealtimeSessionVerificationService.ts +168 -0
  481. package/src/realtimeSessions/RealtimeVerifyRouter.ts +109 -0
  482. package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
  483. package/src/realtimeSessions/SessionVerificationPortsBase.ts +189 -0
  484. package/src/realtimeSessions/SlidingWindowRateLimiter.ts +92 -0
  485. package/src/realtimeSessions/index.ts +18 -0
  486. package/src/realtimeSessions/ownedRealtimeSession.ts +55 -0
  487. package/src/realtimeSessions/sessionAccess.ts +145 -0
  488. package/src/realtimeSessions/sessionConfigStamps.ts +123 -0
  489. package/src/realtimeSessions/subscriptionAuthorization.ts +116 -0
  490. package/src/realtimeSessions/verificationCore.ts +502 -0
  491. package/src/realtimeSessions/verificationPages.ts +149 -0
  492. package/src/realtimeSessions/verificationPolicy.ts +321 -0
  493. package/src/realtimeSessions/verificationWorkflow.ts +702 -0
  494. package/src/realtimeWidget/widgetGuestElevation.ts +34 -2
  495. package/src/resolvers/ActionResolver.ts +84 -21
  496. package/src/resolvers/AdhocQueryResolver.ts +24 -6
  497. package/src/resolvers/ArtifactFileResolver.ts +9 -8
  498. package/src/resolvers/CacheStatsResolver.ts +89 -2
  499. package/src/resolvers/ClientToolRequestResolver.ts +25 -7
  500. package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
  501. package/src/resolvers/DatasetResolver.ts +70 -10
  502. package/src/resolvers/EntityRecordNameResolver.ts +3 -2
  503. package/src/resolvers/FetchEntityVectorsResolver.ts +179 -2
  504. package/src/resolvers/FileResolver.ts +321 -106
  505. package/src/resolvers/GetDataContextDataResolver.ts +139 -41
  506. package/src/resolvers/GetDataResolver.ts +6 -3
  507. package/src/resolvers/HumanHandoffResolver.ts +8 -0
  508. package/src/resolvers/IntegrationDiscoveryResolver.ts +4 -2
  509. package/src/resolvers/MCPResolver.ts +8 -5
  510. package/src/resolvers/QueryResolver.ts +11 -0
  511. package/src/resolvers/RealtimeBridgeResolver.ts +163 -11
  512. package/src/resolvers/RealtimeClientSessionResolver.ts +511 -129
  513. package/src/resolvers/RealtimeSessionEventsResolver.ts +133 -0
  514. package/src/resolvers/RealtimeSessionVerificationResolver.ts +174 -0
  515. package/src/resolvers/RemoteBrowserActionResolver.ts +11 -1
  516. package/src/resolvers/RunAIAgentResolver.ts +116 -14
  517. package/src/resolvers/RunTemplateResolver.ts +13 -12
  518. package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
  519. package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
  520. package/src/resolvers/SyncDataResolver.ts +6 -2
  521. package/src/resolvers/SyncRolesUsersResolver.ts +24 -6
  522. package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
  523. package/src/resolvers/TestQuerySQLResolver.ts +68 -13
  524. package/src/resolvers/TransactionGroupResolver.ts +131 -27
  525. package/src/resolvers/UserAvatarResolver.ts +111 -0
  526. package/src/resolvers/UserResolver.ts +2 -16
  527. package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
  528. package/src/resolvers/agent-run-data-guard.ts +89 -0
  529. package/src/resolvers/agentVisionConsentAudit.ts +82 -0
  530. package/src/resolvers/avatarInputValidation.ts +123 -0
  531. package/src/resolvers/currentUserRoles.ts +32 -1
  532. package/src/resolvers/meetings/meetingMutations.ts +21 -0
  533. package/src/rest/RealtimeRecordingHandler.ts +464 -0
  534. package/src/rest/ViewOperationsHandler.ts +29 -13
  535. package/src/rest/setupRESTEndpoints.ts +6 -0
  536. package/src/serverExtensionReservedRoots.ts +14 -17
  537. package/src/services/MJStorageBlobStore.ts +31 -30
  538. package/src/services/StartTaskGraphDispatcher.ts +2 -2
  539. package/src/services/TaskGraphActionRunner.ts +25 -5
  540. package/src/services/TaskGraphAgentRunner.ts +188 -11
  541. package/src/services/TaskGraphContinuationDeliverer.ts +713 -17
  542. package/src/sharedCache.ts +305 -0
  543. package/src/types.ts +7 -0
@@ -9,11 +9,28 @@
9
9
  * compare-and-swap that marks a completion delivered; an escaping error would either abort that
10
10
  * guard or leave the graph looking undelivered and re-notifying on every later sweep.
11
11
  */
12
+ import 'reflect-metadata';
12
13
  import { describe, it, expect, vi, beforeEach } from 'vitest';
13
14
 
15
+ const { fromMetadataProvider, runAgent, processAgentArtifacts } = vi.hoisted(() => ({
16
+ fromMetadataProvider: vi.fn(),
17
+ runAgent: vi.fn(),
18
+ processAgentArtifacts: vi.fn(),
19
+ }));
20
+
14
21
  vi.mock('@memberjunction/core', () => ({
15
22
  LogError: vi.fn(),
16
23
  LogStatus: vi.fn(),
24
+ RunView: {
25
+ FromMetadataProvider: fromMetadataProvider,
26
+ },
27
+ }));
28
+
29
+ vi.mock('@memberjunction/generic-database-provider', () => ({
30
+ UserCache: {
31
+ Instance: { Users: [{ ID: 'owner-user-99', Email: 'owner@example.com' }] },
32
+ Users: [{ ID: 'owner-user-99', Email: 'owner@example.com' }],
33
+ },
17
34
  }));
18
35
 
19
36
  vi.mock('@memberjunction/core-entities', () => ({
@@ -24,21 +41,27 @@ vi.mock('@memberjunction/core-entities', () => ({
24
41
  vi.mock('@memberjunction/ai-core-plus', () => ({ MJAIAgentEntityExtended: class {} }));
25
42
  vi.mock('@memberjunction/ai', () => ({ ChatMessageRole: { user: 'user' } }));
26
43
 
27
- const runAgent = vi.fn().mockResolvedValue({ success: true });
28
44
  vi.mock('@memberjunction/ai-agents', () => ({
29
- AgentRunner: class { RunAgent = runAgent; },
45
+ AgentRunner: class {
46
+ RunAgent = runAgent;
47
+ ProcessAgentArtifacts = processAgentArtifacts;
48
+ },
30
49
  }));
31
50
 
32
51
  import { TaskGraphContinuationDeliverer } from '../services/TaskGraphContinuationDeliverer';
33
52
  import type { TaskContinuationParams } from '@memberjunction/task-graph';
34
53
  import type { UserInfo } from '@memberjunction/core';
54
+ import type { PubSubEngine } from 'type-graphql';
35
55
 
36
56
  /** A conversation-detail row that can be loaded (the source) and saved (the reply). */
37
- function detailRow(over: Partial<{ loads: boolean; saves: boolean; conversationID: string }> = {}) {
38
- const { loads = true, saves = true, conversationID = 'conv-1' } = over;
57
+ function detailRow(over: Partial<{ loads: boolean; saves: boolean; conversationID: string; branchID: string | null }> = {}) {
58
+ const { loads = true, saves = true, conversationID = 'conv-1', branchID = null } = over;
39
59
  return {
60
+ ID: 'reply-detail-1',
40
61
  ConversationID: conversationID,
62
+ BranchID: branchID as string | null,
41
63
  Role: '', Status: '', HiddenToUser: true, Message: '',
64
+ AgentID: null as string | null,
42
65
  NewRecord: vi.fn(),
43
66
  Load: vi.fn().mockResolvedValue(loads),
44
67
  Save: vi.fn().mockResolvedValue(saves),
@@ -51,17 +74,21 @@ function harness(over: Parameters<typeof detailRow>[0] = {}) {
51
74
  const provider = {
52
75
  GetEntityObject: vi.fn().mockImplementation(async () => {
53
76
  const row = detailRow(over);
77
+ if (rows.length > 0) {
78
+ row.BranchID = 'stale';
79
+ }
54
80
  rows.push(row);
55
81
  return row;
56
82
  }),
57
83
  };
58
84
  const providerFactory = { CreateProvider: vi.fn().mockResolvedValue(provider) };
85
+ const pubSub = { publish: vi.fn().mockResolvedValue(undefined) } as unknown as PubSubEngine;
59
86
  const deliverer = new TaskGraphContinuationDeliverer(
60
87
  providerFactory as never,
61
88
  { ID: 'user-1' } as UserInfo,
89
+ pubSub,
62
90
  );
63
- // First row is the source detail (Load), second is the reply (Save).
64
- return { deliverer, providerFactory, provider, rows, reply: () => rows[1] };
91
+ return { deliverer, providerFactory, provider, rows, pubSub, reply: () => rows[1] };
65
92
  }
66
93
 
67
94
  const params = (over: Partial<TaskContinuationParams> = {}): TaskContinuationParams => ({
@@ -78,10 +105,21 @@ const params = (over: Partial<TaskContinuationParams> = {}): TaskContinuationPar
78
105
  ...over,
79
106
  });
80
107
 
81
- beforeEach(() => vi.clearAllMocks());
108
+ beforeEach(() => {
109
+ vi.clearAllMocks();
110
+ fromMetadataProvider.mockReturnValue({
111
+ RunView: vi.fn().mockResolvedValue({ Success: false, Results: [] }),
112
+ });
113
+ runAgent.mockResolvedValue({
114
+ success: true,
115
+ payload: 'Synthesized workflow outcome',
116
+ agentRun: { ID: 'cont-run-1', Message: 'Synthesized workflow outcome' },
117
+ });
118
+ processAgentArtifacts.mockResolvedValue(undefined);
119
+ });
82
120
 
83
121
  describe('posting the outcome', () => {
84
- it('writes an AI-role message into the graph\'s conversation', async () => {
122
+ it('writes an AI-role message into the graph\'s conversation and broadcasts completion via pubSub', async () => {
85
123
  const h = harness();
86
124
  await h.deliverer.PostMessage(params());
87
125
 
@@ -91,6 +129,7 @@ describe('posting the outcome', () => {
91
129
  expect(reply.Role).toBe('AI');
92
130
  expect(reply.Status).toBe('Complete');
93
131
  expect(reply.HiddenToUser).toBe(false);
132
+ expect(h.pubSub.publish).toHaveBeenCalledTimes(2);
94
133
  });
95
134
 
96
135
  it('names the workflow and carries the roll-up', async () => {
@@ -101,8 +140,6 @@ describe('posting the outcome', () => {
101
140
  });
102
141
 
103
142
  it('lists each step, not just an aggregate status', async () => {
104
- // A graph where nine of ten steps succeeded is a materially different message from one that
105
- // failed outright, and the roll-up alone cannot say which step went wrong.
106
143
  const h = harness();
107
144
  await h.deliverer.PostMessage(params({
108
145
  Tasks: [
@@ -125,13 +162,22 @@ describe('posting the outcome', () => {
125
162
  const message = h.reply().Message;
126
163
  expect(message).toContain('Step 0');
127
164
  expect(message).not.toContain('Step 49');
128
- // The count is stated rather than silently dropped — the task rows remain the full record.
129
165
  expect(message).toContain('30 more');
130
166
  });
131
167
 
168
+ it('posts into the fork of the message that started the graph', async () => {
169
+ const h = harness({ branchID: 'T1' });
170
+ await h.deliverer.PostMessage(params());
171
+ expect(h.reply().BranchID).toBe('T1');
172
+ });
173
+
174
+ it('posts into Main when that message is in Main', async () => {
175
+ const h = harness();
176
+ await h.deliverer.PostMessage(params());
177
+ expect(h.reply().BranchID).toBeNull();
178
+ });
179
+
132
180
  it('mints a fresh provider per delivery', async () => {
133
- // Deliveries run outside any request and concurrently with task execution; a shared provider
134
- // would share one transaction scope across unrelated work.
135
181
  const h = harness();
136
182
  await h.deliverer.PostMessage(params());
137
183
  expect(h.providerFactory.CreateProvider).toHaveBeenCalledTimes(1);
@@ -140,8 +186,6 @@ describe('posting the outcome', () => {
140
186
 
141
187
  describe('it never throws — the dispatcher marks delivery inside a CAS guard', () => {
142
188
  it('does nothing for a headless graph, without treating it as an error', async () => {
143
- // A graph submitted by a schedule, an entity-change trigger or an API call has no
144
- // conversation to answer. Most workflows are in this shape.
145
189
  const h = harness();
146
190
  await expect(h.deliverer.PostMessage(params({ ConversationDetailID: null }))).resolves.toBeUndefined();
147
191
  expect(h.providerFactory.CreateProvider).not.toHaveBeenCalled();
@@ -150,7 +194,7 @@ describe('it never throws — the dispatcher marks delivery inside a CAS guard',
150
194
  it('survives a conversation detail that will not load', async () => {
151
195
  const h = harness({ loads: false });
152
196
  await expect(h.deliverer.PostMessage(params())).resolves.toBeUndefined();
153
- expect(h.rows.length).toBe(1); // never got as far as building a reply
197
+ expect(h.rows.length).toBe(1);
154
198
  });
155
199
 
156
200
  it('survives a failed save', async () => {
@@ -168,7 +212,6 @@ describe('it never throws — the dispatcher marks delivery inside a CAS guard',
168
212
  });
169
213
 
170
214
  describe('Reinvoke — restarting the submitting agent', () => {
171
- /** A provider that hands out loadable agent-run and agent rows, then the reply detail. */
172
215
  function reinvokeHarness(over: { runLoads?: boolean; agentLoads?: boolean } = {}) {
173
216
  const { runLoads = true, agentLoads = true } = over;
174
217
  const rows: Array<Record<string, unknown>> = [];
@@ -191,14 +234,16 @@ describe('Reinvoke — restarting the submitting agent', () => {
191
234
  return detail;
192
235
  }),
193
236
  };
237
+ const pubSub = { publish: vi.fn().mockResolvedValue(undefined) } as unknown as PubSubEngine;
194
238
  const deliverer = new TaskGraphContinuationDeliverer(
195
239
  { CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
196
240
  { ID: 'user-1' } as UserInfo,
241
+ pubSub,
197
242
  );
198
- return { deliverer, provider, rows };
243
+ return { deliverer, provider, rows, pubSub };
199
244
  }
200
245
 
201
- it('starts the submitting agent a fresh turn carrying the outcome', async () => {
246
+ it('starts the submitting agent a fresh turn carrying the outcome, saves reply detail, processes artifacts, and publishes completion', async () => {
202
247
  const h = reinvokeHarness();
203
248
  await h.deliverer.Reinvoke(params());
204
249
 
@@ -206,11 +251,17 @@ describe('Reinvoke — restarting the submitting agent', () => {
206
251
  const call = runAgent.mock.calls[0][0];
207
252
  expect(call.agent.ID).toBe('agent-1');
208
253
  expect(call.conversationMessages[0].content).toContain('Weekly digest');
254
+ expect(call.conversationDetailId).toBe('reply-detail-1');
255
+
256
+ const reply = h.rows[3] as ReturnType<typeof detailRow>;
257
+ expect(reply.Role).toBe('AI');
258
+ expect(reply.Status).toBe('Complete');
259
+ expect(reply.Message).toBe('Synthesized workflow outcome');
260
+ expect(processAgentArtifacts).toHaveBeenCalledTimes(1);
261
+ expect(h.pubSub.publish).toHaveBeenCalledTimes(2);
209
262
  });
210
263
 
211
264
  it('stamps depth + 1 — the value that makes MAX_REINVOKE_DEPTH real', async () => {
212
- // Without this the next graph the restarted run submits begins the chain at zero again, and
213
- // the cap can never fire. It is the whole reason ContinuationDepth exists as a column.
214
265
  const h = reinvokeHarness();
215
266
  await h.deliverer.Reinvoke(params({ ReinvokeDepth: 3 }));
216
267
  expect(runAgent.mock.calls[0][0].continuationDepth).toBe(4);
@@ -223,7 +274,6 @@ describe('Reinvoke — restarting the submitting agent', () => {
223
274
  });
224
275
 
225
276
  it('falls back to posting when the graph records no submitting run', async () => {
226
- // A schedule- or trigger-started graph has no turn to continue.
227
277
  const h = reinvokeHarness();
228
278
  await h.deliverer.Reinvoke(params({ SubmittedByAgentRunID: null }));
229
279
  expect(runAgent).not.toHaveBeenCalled();
@@ -247,3 +297,334 @@ describe('Reinvoke — restarting the submitting agent', () => {
247
297
  await expect(h.deliverer.Reinvoke(params())).resolves.toBeUndefined();
248
298
  });
249
299
  });
300
+
301
+ describe('Reinvoke — on the fork of the message that started the graph', () => {
302
+ function forkHarness(originBranch: string | null) {
303
+ const provider = {
304
+ GetEntityObject: vi.fn().mockImplementation(async (name: string) => {
305
+ if (name === 'MJ: AI Agent Runs') return { AgentID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
306
+ if (name === 'MJ: AI Agents') return { ID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
307
+ return detailRow({ branchID: originBranch });
308
+ }),
309
+ };
310
+ return new TaskGraphContinuationDeliverer(
311
+ { CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
312
+ { ID: 'user-1' } as UserInfo,
313
+ );
314
+ }
315
+
316
+ it('runs the reinvoked agent on that fork, as PostMessage posts into it', async () => {
317
+ await forkHarness('T1').Reinvoke(params());
318
+
319
+ expect(runAgent).toHaveBeenCalledTimes(1);
320
+ expect(runAgent.mock.calls[0][0].ConversationBranchID).toBe('T1');
321
+ });
322
+
323
+ it('leaves the branch unset when that message is in Main', async () => {
324
+ await forkHarness(null).Reinvoke(params());
325
+
326
+ expect(runAgent).toHaveBeenCalledTimes(1);
327
+ expect(runAgent.mock.calls[0][0].ConversationBranchID).toBeUndefined();
328
+ });
329
+
330
+ it('enriches placeholder "output available (...)" task summaries with OutputPayload excerpts from MJ: Tasks', async () => {
331
+ const { RunView } = await import('@memberjunction/core');
332
+ vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
333
+ RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
334
+ if (rvParams.EntityName === 'MJ: Tasks') {
335
+ return {
336
+ Success: true,
337
+ Results: [
338
+ {
339
+ ID: 't1',
340
+ Name: 'Generate Schema Count Query',
341
+ OutputPayload: JSON.stringify({
342
+ title: 'Entity Counts by Schema',
343
+ request: 'SELECT SchemaName, COUNT(*) AS EntityCount FROM __mj.vwEntities GROUP BY SchemaName',
344
+ }),
345
+ },
346
+ ],
347
+ };
348
+ }
349
+ return { Success: false, Results: [] };
350
+ }),
351
+ } as never);
352
+
353
+ await forkHarness(null).Reinvoke(
354
+ params({
355
+ Tasks: [
356
+ { TaskID: 't1', Name: 'Generate Schema Count Query', Status: 'Complete', Summary: 'output available (180 chars)' },
357
+ ],
358
+ }),
359
+ );
360
+
361
+ expect(runAgent).toHaveBeenCalledTimes(1);
362
+ const sentContent = runAgent.mock.calls[0][0].conversationMessages[0].content as string;
363
+ expect(sentContent).toContain('Title: Entity Counts by Schema');
364
+ expect(sentContent).toContain('SELECT SchemaName, COUNT(*) AS EntityCount FROM __mj.vwEntities GROUP BY SchemaName');
365
+ });
366
+
367
+ it('updates the originating message in-place when no intervening messages were sent (IsLatest = true)', async () => {
368
+ const { RunView } = await import('@memberjunction/core');
369
+ vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
370
+ RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
371
+ if (rvParams.EntityName === 'MJ: Conversation Details') {
372
+ return {
373
+ Success: true,
374
+ Results: [{ ID: 'detail-1' }],
375
+ };
376
+ }
377
+ return { Success: false, Results: [] };
378
+ }),
379
+ } as never);
380
+
381
+ const originDetail = {
382
+ ...detailRow(),
383
+ ID: 'detail-1',
384
+ Message: "Started **Weekly digest** — 2 task(s) running. I'll follow up when it finishes.",
385
+ };
386
+ const createdDetails: Array<ReturnType<typeof detailRow>> = [];
387
+ const provider = {
388
+ GetEntityObject: vi.fn().mockImplementation(async (name: string) => {
389
+ if (name === 'MJ: AI Agent Runs') return { AgentID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
390
+ if (name === 'MJ: AI Agents') return { ID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
391
+ if (createdDetails.length === 0) {
392
+ createdDetails.push(originDetail);
393
+ return originDetail;
394
+ }
395
+ const next = detailRow();
396
+ createdDetails.push(next);
397
+ return next;
398
+ }),
399
+ };
400
+ const pubSub = { publish: vi.fn().mockResolvedValue(undefined) } as unknown as PubSubEngine;
401
+ const deliverer = new TaskGraphContinuationDeliverer(
402
+ { CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
403
+ { ID: 'user-1' } as UserInfo,
404
+ pubSub,
405
+ );
406
+
407
+ await deliverer.Reinvoke(params());
408
+
409
+ // Only the originating detail was loaded and updated in-place — no second detail row created!
410
+ expect(createdDetails.length).toBe(1);
411
+ expect(originDetail.NewRecord).not.toHaveBeenCalled();
412
+ expect(originDetail.Message).toBe('Synthesized workflow outcome');
413
+ expect(originDetail.Status).toBe('Complete');
414
+ expect(runAgent.mock.calls[0][0].conversationDetailId).toBe('detail-1');
415
+ expect(runAgent.mock.calls[0][0].inputArtifacts).toEqual([]);
416
+ expect(pubSub.publish).toHaveBeenCalledTimes(1);
417
+ });
418
+
419
+ it('creates a bottom continuation reply with ParentID = originDetailId and updates the origin message note when intervening messages exist (IsLatest = false)', async () => {
420
+ const { RunView } = await import('@memberjunction/core');
421
+ vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
422
+ RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
423
+ if (rvParams.EntityName === 'MJ: Conversation Details') {
424
+ return {
425
+ Success: true,
426
+ Results: [{ ID: 'intervening-user-msg-2' }],
427
+ };
428
+ }
429
+ return { Success: false, Results: [] };
430
+ }),
431
+ } as never);
432
+
433
+ const originDetail = {
434
+ ...detailRow(),
435
+ ID: 'detail-1',
436
+ ParentID: null as string | null,
437
+ Message: "Started **Weekly digest** — 2 task(s) running. I'll follow up when it finishes.",
438
+ };
439
+ const replyDetail = {
440
+ ...detailRow(),
441
+ ID: 'bottom-reply-3',
442
+ ParentID: null as string | null,
443
+ };
444
+ let detailCallCount = 0;
445
+ const provider = {
446
+ GetEntityObject: vi.fn().mockImplementation(async (name: string) => {
447
+ if (name === 'MJ: AI Agent Runs') return { AgentID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
448
+ if (name === 'MJ: AI Agents') return { ID: 'agent-1', Load: vi.fn().mockResolvedValue(true) };
449
+ detailCallCount++;
450
+ return detailCallCount === 1 ? originDetail : replyDetail;
451
+ }),
452
+ };
453
+ const pubSub = { publish: vi.fn().mockResolvedValue(undefined) } as unknown as PubSubEngine;
454
+ const deliverer = new TaskGraphContinuationDeliverer(
455
+ { CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
456
+ { ID: 'user-1' } as UserInfo,
457
+ pubSub,
458
+ );
459
+
460
+ await deliverer.Reinvoke(params());
461
+
462
+ expect(replyDetail.NewRecord).toHaveBeenCalledTimes(1);
463
+ expect(replyDetail.ParentID).toBe('detail-1');
464
+ expect(replyDetail.Message).toBe('Synthesized workflow outcome');
465
+ expect(originDetail.Message).toContain('*(✅ **Weekly digest** completed — synthesized results posted below.)*');
466
+ expect(originDetail.Message).not.toContain("I'll follow up when it finishes");
467
+ expect(pubSub.publish).toHaveBeenCalledTimes(2);
468
+ });
469
+
470
+ it('strips inherited upstream payload keys across DAG steps and extracts nested synthesis and report fields', async () => {
471
+ const { RunView } = await import('@memberjunction/core');
472
+ const step1Payload = {
473
+ queryName: 'Annual Order Counts',
474
+ sql: 'SELECT YEAR(OrderDate) AS OrderYear, COUNT(*) AS OrderCount FROM Orders GROUP BY YEAR(OrderDate)',
475
+ explanation: 'Counts orders grouped by year.',
476
+ };
477
+ const step2Payload = {
478
+ ...step1Payload,
479
+ synthesis: {
480
+ executiveSummary: 'Order volume grew 22% YoY between 2022 and 2025.',
481
+ keyFindings: ['2024 peak growth', 'Steady enterprise retention'],
482
+ },
483
+ };
484
+ const step3Payload = {
485
+ ...step2Payload,
486
+ report: {
487
+ name: 'Annual Order Trend Executive Report',
488
+ description: 'Board-ready HTML report covering annual order volume and YoY trajectory.',
489
+ html: '<h1>Annual Order Trend</h1><p>Executive overview of multi-year order growth.</p>',
490
+ },
491
+ };
492
+
493
+ vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
494
+ RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
495
+ if (rvParams.EntityName === 'MJ: Tasks') {
496
+ return {
497
+ Success: true,
498
+ Results: [
499
+ { ID: 't1', Name: 'Step 1: Query', OutputPayload: JSON.stringify(step1Payload) },
500
+ { ID: 't2', Name: 'Step 2: Strategy', OutputPayload: JSON.stringify(step2Payload) },
501
+ { ID: 't3', Name: 'Step 3: Report', OutputPayload: JSON.stringify(step3Payload) },
502
+ ],
503
+ };
504
+ }
505
+ return { Success: false, Results: [] };
506
+ }),
507
+ } as never);
508
+
509
+ await forkHarness(null).Reinvoke(
510
+ params({
511
+ Tasks: [
512
+ { TaskID: 't1', Name: 'Step 1: Query', Status: 'Complete', Summary: 'output available (180 chars)' },
513
+ { TaskID: 't2', Name: 'Step 2: Strategy', Status: 'Complete', Summary: 'output available (320 chars)' },
514
+ { TaskID: 't3', Name: 'Step 3: Report', Status: 'Complete', Summary: 'output available (540 chars)' },
515
+ ],
516
+ }),
517
+ );
518
+
519
+ const sentContent = runAgent.mock.calls[0][0].conversationMessages[0].content as string;
520
+ expect(sentContent).toContain('Title: Annual Order Counts');
521
+ expect(sentContent).toContain('Executive Summary: Order volume grew 22% YoY between 2022 and 2025.');
522
+ expect(sentContent).toContain('Report Title: Annual Order Trend Executive Report');
523
+ expect(sentContent).toContain('Report Summary: Board-ready HTML report covering annual order volume and YoY trajectory.');
524
+ // Step 1's SQL should only appear once (under Step 1), not duplicated under Step 2 and Step 3!
525
+ const sqlOccurrences = sentContent.split('SELECT YEAR(OrderDate) AS OrderYear').length - 1;
526
+ expect(sqlOccurrences).toBe(1);
527
+ });
528
+
529
+ it('walks up ParentRunID so a sub-agent (Workflow Planner) submission reinvokes the root conversation agent (Sage) as the conversation owner', async () => {
530
+ const subAgentRun = {
531
+ ID: 'subagent-planner-run',
532
+ AgentID: 'workflow-planner-agent-id',
533
+ ParentRunID: 'root-sage-run',
534
+ UserID: null as string | null,
535
+ Load: vi.fn().mockResolvedValue(true),
536
+ };
537
+ const rootSageRun = {
538
+ ID: 'root-sage-run',
539
+ AgentID: 'sage-agent-id',
540
+ ParentRunID: null as string | null,
541
+ UserID: 'owner-user-99',
542
+ Load: vi.fn().mockResolvedValue(true),
543
+ };
544
+ const sageAgent = {
545
+ ID: 'sage-agent-id',
546
+ Name: 'Sage',
547
+ Load: vi.fn().mockResolvedValue(true),
548
+ };
549
+ const detail = detailRow();
550
+ let runCallCount = 0;
551
+ const detailUsers: Array<UserInfo | undefined> = [];
552
+
553
+ const provider = {
554
+ GetEntityObject: vi.fn().mockImplementation(async (name: string, user?: UserInfo) => {
555
+ if (name === 'MJ: AI Agent Runs') {
556
+ runCallCount++;
557
+ return runCallCount === 1 ? subAgentRun : rootSageRun;
558
+ }
559
+ if (name === 'MJ: AI Agents') {
560
+ return sageAgent;
561
+ }
562
+ detailUsers.push(user);
563
+ return detail;
564
+ }),
565
+ };
566
+
567
+ const deliverer = new TaskGraphContinuationDeliverer(
568
+ { CreateProvider: vi.fn().mockResolvedValue(provider) } as never,
569
+ { ID: 'system-user' } as UserInfo,
570
+ );
571
+
572
+ await deliverer.Reinvoke(params({ SubmittedByAgentRunID: 'subagent-planner-run' }));
573
+
574
+ expect(subAgentRun.Load).toHaveBeenCalledWith('subagent-planner-run');
575
+ expect(rootSageRun.Load).toHaveBeenCalledWith('root-sage-run');
576
+ expect(sageAgent.Load).toHaveBeenCalledWith('sage-agent-id');
577
+ expect(runAgent).toHaveBeenCalledTimes(1);
578
+ expect(runAgent.mock.calls[0][0].agent.ID).toBe('sage-agent-id');
579
+ expect(runAgent.mock.calls[0][0].contextUser.ID).toBe('owner-user-99');
580
+ expect(detailUsers[0]?.ID).toBe('owner-user-99');
581
+ });
582
+
583
+ it('enriches Skipped steps with their unmet dependency Condition from MJ: Task Dependencies', async () => {
584
+ const { RunView } = await import('@memberjunction/core');
585
+ vi.mocked(RunView.FromMetadataProvider).mockReturnValue({
586
+ RunView: vi.fn().mockImplementation(async (rvParams: { EntityName: string }) => {
587
+ if (rvParams.EntityName === 'MJ: Tasks') {
588
+ return {
589
+ Success: true,
590
+ Results: [
591
+ { ID: 't1', Name: 'Build Query', Status: 'Complete', OutputPayload: JSON.stringify({ queryName: 'Users by Role' }) },
592
+ { ID: 't2', Name: 'Run Query', Status: 'Complete', OutputPayload: JSON.stringify({ summary: 'Built query blueprint without live execution' }) },
593
+ { ID: 't3', Name: 'Analyze Results', Status: 'Skipped', OutputPayload: null },
594
+ ],
595
+ };
596
+ }
597
+ if (rvParams.EntityName === 'MJ: Task Dependencies') {
598
+ return {
599
+ Success: true,
600
+ Results: [
601
+ {
602
+ TaskID: 't3',
603
+ DependsOnTaskID: 't2',
604
+ Condition: 'output.rowCount > 0',
605
+ },
606
+ ],
607
+ };
608
+ }
609
+ return { Success: false, Results: [] };
610
+ }),
611
+ } as never);
612
+
613
+ await forkHarness(null).Reinvoke(
614
+ params({
615
+ Tasks: [
616
+ { TaskID: 't1', Name: 'Build Query', Status: 'Complete' },
617
+ { TaskID: 't2', Name: 'Run Query', Status: 'Complete' },
618
+ { TaskID: 't3', Name: 'Analyze Results', Status: 'Skipped' },
619
+ ],
620
+ Summary: '2 of 3 steps completed (1 skipped).',
621
+ }),
622
+ );
623
+
624
+ const sentContent = runAgent.mock.calls[0][0].conversationMessages[0].content as string;
625
+ expect(sentContent).toContain('- ⏭️ **Analyze Results** — Skipped: branch condition `output.rowCount > 0` on "Run Query" evaluated to false');
626
+ expect(sentContent).toContain('briefly explaining any conditional steps that were skipped');
627
+ });
628
+ });
629
+
630
+
@@ -133,4 +133,26 @@ describe('TaskGraphFrameBroadcaster', () => {
133
133
  expect(p.CompletedCount).toBe(7);
134
134
  expect(p.TotalCount).toBe(7);
135
135
  });
136
+
137
+ it('bridges frames onto PUSH_STATUS_UPDATES_TOPIC when bridgeToPushStatus is enabled', () => {
138
+ new TaskGraphFrameBroadcaster(pubSub, true).OnFrame(
139
+ frame({ Kind: 'TaskCompleted', Status: 'Complete', CompletedCount: 1, TotalCount: 2 }),
140
+ );
141
+ expect(published).toHaveLength(2);
142
+ expect(published[0][0]).toBe(TASK_GRAPH_FRAMES_TOPIC);
143
+ expect(published[1][0]).toBe('PUSH_STATUS_UPDATES');
144
+ const pushPayload = published[1][1] as { sessionId: string; ownerUserId: string; message: string };
145
+ expect(pushPayload.sessionId).toBe('*');
146
+ expect(pushPayload.ownerUserId).toBe(OWNER);
147
+ const parsed = JSON.parse(pushPayload.message) as {
148
+ type: string;
149
+ status: string;
150
+ data: { Status: string; TaskID: string };
151
+ };
152
+ expect(parsed.type).toBe('TaskGraphFrame');
153
+ expect(parsed.status).toBe('ok');
154
+ expect(parsed.data.Status).toBe('Complete');
155
+ expect(parsed.data.TaskID).toBe('task-1');
156
+ });
136
157
  });
158
+