@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
@@ -2,8 +2,11 @@
2
2
  // is loaded first. Vitest does not bring it in automatically — this MUST precede the resolver import.
3
3
  import 'reflect-metadata';
4
4
 
5
- import { describe, it, expect, vi, beforeEach } from 'vitest';
6
- import type { UserInfo } from '@memberjunction/core';
5
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
6
+ import type { IMetadataProvider, UserInfo } from '@memberjunction/core';
7
+ import type { MJAIAgentSessionEntity } from '@memberjunction/core-entities';
8
+ import type { BridgeDisconnectReason } from '@memberjunction/ai-bridge-base';
9
+ import type { AgentRoomSession, StartAgentRoomSessionParams } from '@memberjunction/livekit-room-server';
7
10
 
8
11
  // Mock the server-side LiveKit services so the thin resolver is tested in isolation (no LiveKit creds).
9
12
  const h = vi.hoisted(() => ({
@@ -13,17 +16,24 @@ const h = vi.hoisted(() => ({
13
16
  Identity: identity,
14
17
  RoomName: room,
15
18
  })),
16
- startAgentRoomSession: vi.fn(async () => ({ SessionBridgeID: 'bridge-std', RoomName: 'room-std', ServerUrl: 'wss://x.livekit.cloud' })),
19
+ startAgentRoomSession: vi.fn(
20
+ async (_params: StartAgentRoomSessionParams): Promise<AgentRoomSession> => ({ SessionBridgeID: 'bridge-std', RoomName: 'room-std', ServerUrl: 'wss://x.livekit.cloud' }),
21
+ ),
17
22
  handoffDeps: { AgentStarter: undefined as undefined | ((req: Record<string, unknown>) => Promise<{ SessionBridgeID: string }>) },
18
23
  startRecording: vi.fn(async () => ({ EgressID: 'eg-1', RoomName: 'room-1', Status: 'EGRESS_ACTIVE' })),
19
24
  getRoomTurnState: vi.fn((room: string): unknown => (room === 'busy-room' ? { RoomId: room, Agents: [] } : null)),
20
25
  setTurnToolBinder: vi.fn(),
26
+ setAgentVisionResolver: vi.fn(),
27
+ setFailedStartRecorder: vi.fn(),
21
28
  getBridgeRuntime: vi.fn(),
22
29
  stopRecording: vi.fn(async () => ({ EgressID: 'eg-1', RoomName: 'room-1', Status: 'EGRESS_COMPLETE' })),
30
+ setAgentVision: vi.fn(async (): Promise<{ Success: boolean; NotInRoom?: boolean; ErrorMessage?: string }> => ({ Success: true })),
31
+ writeConsentAudit: vi.fn(async () => undefined),
23
32
  getRoomForEgress: vi.fn(async (_id: string): Promise<string | undefined> => 'room-1'),
24
- stopAgentRoomSession: vi.fn(async () => true),
25
- stopAllAgentsInRoom: vi.fn(async () => 1),
33
+ stopAgentRoomSession: vi.fn(async (_sessionBridgeID: string, _reason?: BridgeDisconnectReason): Promise<boolean> => true),
34
+ stopAllAgentsInRoom: vi.fn(async (_roomName: string, _reason?: BridgeDisconnectReason): Promise<number> => 1),
26
35
  getRoomForBridge: vi.fn((_id: string): string | undefined => 'room-1'),
36
+ sessionClosedHook: vi.fn(async () => undefined),
27
37
  }));
28
38
 
29
39
  // These two are instantiated with `new` by the resolver, so they must be constructible. They were
@@ -39,6 +49,8 @@ vi.mock('@memberjunction/livekit-room-server', () => ({
39
49
  StartAgentRoomSession: h.startAgentRoomSession,
40
50
  SetSessionFactory: vi.fn(),
41
51
  SetTurnToolBinder: h.setTurnToolBinder,
52
+ SetAgentVisionResolver: h.setAgentVisionResolver,
53
+ SetFailedStartRecorder: h.setFailedStartRecorder,
42
54
  GetRoomTurnState: h.getRoomTurnState,
43
55
  StopAgentRoomSession: h.stopAgentRoomSession,
44
56
  StopAllAgentsInRoom: h.stopAllAgentsInRoom,
@@ -68,6 +80,15 @@ vi.mock('@memberjunction/livekit-room-server', () => ({
68
80
  },
69
81
  };
70
82
  })(),
83
+ LiveKitParticipantService: class {
84
+ SetAgentVision = h.setAgentVision;
85
+ },
86
+ }));
87
+
88
+ // Mock the consent audit writer so the thin resolver is tested in isolation. Its own behavior is covered by
89
+ // agentVisionConsentAudit.test.ts.
90
+ vi.mock('../resolvers/agentVisionConsentAudit', () => ({
91
+ WriteAgentVisionConsentAudit: h.writeConsentAudit,
71
92
  }));
72
93
 
73
94
  // Mock the agent factory so importing the resolver doesn't pull the heavy @memberjunction/ai-agents graph
@@ -84,6 +105,8 @@ vi.mock('@memberjunction/ai-agents', () => ({
84
105
  RealtimeClientSessionService: class {
85
106
  FinalizeCoAgentRun = vi.fn(async () => undefined);
86
107
  },
108
+ // SessionManager.CloseSession tells the channel-plugin host a session closed.
109
+ RealtimeChannelServerHost: { Instance: { OnSessionClosed: h.sessionClosedHook } },
87
110
  }));
88
111
 
89
112
  // Mock the meeting-recording registration so the thin resolver is tested in isolation (no MJStorage /
@@ -95,9 +118,13 @@ vi.mock('../resolvers/meetingRecordingRegistration', () => ({
95
118
  get correlateRecordingStart() { return this.CorrelateRecordingStart; },
96
119
  }));
97
120
 
98
- import { RealtimeBridgeResolver, MintLiveKitClientTokenInput, LiveKitRecordingInput, StartLiveKitAgentRoomSessionInput } from '../resolvers/RealtimeBridgeResolver';
121
+ import { buildSchema, Query, Resolver } from 'type-graphql';
122
+ import type { GraphQLObjectType } from 'graphql';
123
+ import { GetRealtimeModelVoices } from '@memberjunction/ai-agents';
124
+ import { RealtimeBridgeResolver, MintLiveKitClientTokenInput, LiveKitRecordingInput, SetLiveKitAgentVisionInput, StartLiveKitAgentRoomSessionInput, RealtimeModelVoicesResult } from '../resolvers/RealtimeBridgeResolver';
99
125
  import { RoomAuthorizationService } from '@memberjunction/livekit-room-server';
100
126
  import type { AppContext } from '../types.js';
127
+ import type { SessionManager } from '../agentSessions/SessionManager.js';
101
128
 
102
129
  /** A resolver subclass that supplies a fake authenticated user (GetUserFromPayload is protected). */
103
130
  class TestableResolver extends RealtimeBridgeResolver {
@@ -107,18 +134,28 @@ class TestableResolver extends RealtimeBridgeResolver {
107
134
  }
108
135
  }
109
136
 
137
+ /** The resolver's own session manager (a private field), so a test can stand in for or watch the writes it makes. */
138
+ const sessionManagerOf = (resolver: RealtimeBridgeResolver): SessionManager =>
139
+ (resolver as unknown as { sessionManager: SessionManager }).sessionManager;
140
+
110
141
  const ctx = {} as AppContext;
111
142
 
112
143
  // The resolver module installs the binder once, as it loads. `restoreMocks` clears call history before each test,
113
144
  // so take it now rather than reading `mock.calls` inside a test.
114
145
  type TurnToolBinderFn = (session: object, handler: object) => void;
115
146
  const installedTurnToolBinder = h.setTurnToolBinder.mock.calls[0]?.[0] as TurnToolBinderFn | undefined;
147
+ type AgentVisionResolverFn = (session: object) => boolean;
148
+ const installedAgentVisionResolver = h.setAgentVisionResolver.mock.calls[0]?.[0] as AgentVisionResolverFn | undefined;
149
+ type FailedStartRecorderFn = (session: object, error: string) => Promise<void>;
150
+ const installedFailedStartRecorder = h.setFailedStartRecorder.mock.calls[0]?.[0] as FailedStartRecorderFn | undefined;
116
151
 
117
152
  describe('RealtimeBridgeResolver', () => {
118
153
  let resolver: TestableResolver;
119
154
 
120
155
  beforeEach(() => {
121
156
  resolver = new TestableResolver();
157
+ h.setAgentVision.mockClear();
158
+ h.writeConsentAudit.mockClear();
122
159
  RoomAuthorizationService.Instance.SetAuthorizerForTesting(async () => ({ Authorized: true }));
123
160
  });
124
161
 
@@ -190,6 +227,41 @@ describe('RealtimeBridgeResolver', () => {
190
227
  });
191
228
  });
192
229
 
230
+ describe('agent vision binding', () => {
231
+ it("says an agent watches meetings exactly when its session runtime says so", () => {
232
+ const resolve = installedAgentVisionResolver!;
233
+ const session = {};
234
+ h.getBridgeRuntime.mockReturnValueOnce({ WatchesMeetingVideo: true });
235
+ expect(resolve(session)).toBe(true);
236
+ expect(h.getBridgeRuntime).toHaveBeenCalledWith(session);
237
+ h.getBridgeRuntime.mockReturnValueOnce({ WatchesMeetingVideo: false });
238
+ expect(resolve(session)).toBe(false);
239
+ });
240
+
241
+ it('says no for a session with no bridge runtime', () => {
242
+ h.getBridgeRuntime.mockReturnValueOnce(undefined);
243
+ expect(installedAgentVisionResolver!({})).toBe(false);
244
+ });
245
+ });
246
+
247
+ describe('failed start binding', () => {
248
+ it("finalizes the model session's co-agent run as failed, with the start's error", async () => {
249
+ const finalize = vi.fn(async () => undefined);
250
+ h.getBridgeRuntime.mockReturnValueOnce({ Finalize: finalize });
251
+ const session = {};
252
+
253
+ await installedFailedStartRecorder!(session, 'Failed to create AIAgentSessionBridge: denied');
254
+
255
+ expect(h.getBridgeRuntime).toHaveBeenCalledWith(session);
256
+ expect(finalize).toHaveBeenCalledWith(false, 'Failed to create AIAgentSessionBridge: denied');
257
+ });
258
+
259
+ it('does nothing for a session with no bridge runtime', async () => {
260
+ h.getBridgeRuntime.mockReturnValueOnce(undefined);
261
+ await expect(installedFailedStartRecorder!({}, 'mint failed')).resolves.toBeUndefined();
262
+ });
263
+ });
264
+
193
265
  describe('recording', () => {
194
266
  it('starts a recording and maps the result', async () => {
195
267
  const input = Object.assign(new LiveKitRecordingInput(), { RoomName: 'room-1', Layout: 'grid' });
@@ -232,6 +304,69 @@ describe('RealtimeBridgeResolver', () => {
232
304
  expect(result.ErrorMessage).toMatch(/current user/i);
233
305
  });
234
306
  });
307
+
308
+ describe('SetLiveKitAgentVision', () => {
309
+ const choose = (allow: boolean) => Object.assign(new SetLiveKitAgentVisionInput(), { RoomName: 'room-1', Allow: allow });
310
+
311
+ it("records the signed-in user's own choice, as their participant identity, and audits it", async () => {
312
+ const result = await resolver.SetLiveKitAgentVision(choose(true), ctx);
313
+ expect(result).toEqual({ Success: true });
314
+ expect(h.setAgentVision).toHaveBeenCalledWith('room-1', 'user-u1', true);
315
+ expect(h.writeConsentAudit).toHaveBeenCalledWith(
316
+ { User: resolver.user, RoomName: 'room-1', Allow: true, Applied: true, ErrorMessage: undefined },
317
+ null,
318
+ );
319
+ });
320
+
321
+ it('passes a withdrawal through as it is', async () => {
322
+ await resolver.SetLiveKitAgentVision(choose(false), ctx);
323
+ expect(h.setAgentVision).toHaveBeenCalledWith('room-1', 'user-u1', false);
324
+ });
325
+
326
+ it('says when the user is not in the room, and audits the refusal', async () => {
327
+ h.setAgentVision.mockResolvedValueOnce({ Success: false, NotInRoom: true, ErrorMessage: 'user-u1 is not in room room-1.' });
328
+ const result = await resolver.SetLiveKitAgentVision(choose(true), ctx);
329
+ expect(result).toEqual({ Success: false, ErrorMessage: 'You are not in this room.' });
330
+ expect(h.writeConsentAudit).toHaveBeenCalledWith(expect.objectContaining({ Applied: false, ErrorMessage: 'user-u1 is not in room room-1.' }), null);
331
+ });
332
+
333
+ it("passes LiveKit's other refusals on", async () => {
334
+ h.setAgentVision.mockResolvedValueOnce({ Success: false, ErrorMessage: 'LiveKit is not configured on this server.' });
335
+ const result = await resolver.SetLiveKitAgentVision(choose(true), ctx);
336
+ expect(result).toEqual({ Success: false, ErrorMessage: 'LiveKit is not configured on this server.' });
337
+ });
338
+
339
+ it('does nothing without an authenticated user', async () => {
340
+ resolver.user = undefined;
341
+ const result = await resolver.SetLiveKitAgentVision(choose(true), ctx);
342
+ expect(result.Success).toBe(false);
343
+ expect(result.ErrorMessage).toMatch(/current user/i);
344
+ expect(h.setAgentVision).not.toHaveBeenCalled();
345
+ expect(h.writeConsentAudit).not.toHaveBeenCalled();
346
+ });
347
+
348
+ it('refuses, and audits the refusal, when the user may not enter the room', async () => {
349
+ RoomAuthorizationService.Instance.SetAuthorizerForTesting(async () => ({ Authorized: false, Reason: 'User is not authorized for this room.' }));
350
+ const result = await resolver.SetLiveKitAgentVision(choose(true), ctx);
351
+ expect(result).toEqual({ Success: false, ErrorMessage: 'User is not authorized for this room.' });
352
+ expect(h.setAgentVision).not.toHaveBeenCalled();
353
+ expect(h.writeConsentAudit).toHaveBeenCalledWith(
354
+ expect.objectContaining({ Allow: true, Applied: false, ErrorMessage: 'User is not authorized for this room.' }),
355
+ null,
356
+ );
357
+ });
358
+
359
+ it('applies a withdrawal without the room check, so a cancelled meeting cannot keep an agent watching', async () => {
360
+ const authorizer = vi.fn(async () => ({ Authorized: false, Reason: 'Meeting is cancelled.' }));
361
+ RoomAuthorizationService.Instance.SetAuthorizerForTesting(authorizer);
362
+ const result = await resolver.SetLiveKitAgentVision(choose(false), ctx);
363
+ expect(result).toEqual({ Success: true });
364
+ expect(authorizer).not.toHaveBeenCalled();
365
+ expect(h.setAgentVision).toHaveBeenCalledWith('room-1', 'user-u1', false);
366
+ expect(h.writeConsentAudit).toHaveBeenCalledWith(expect.objectContaining({ Allow: false, Applied: true }), null);
367
+ });
368
+ });
369
+
235
370
  describe('StartLiveKitAgentRoomSession with handoff', () => {
236
371
  const input = (over: Partial<StartLiveKitAgentRoomSessionInput> = {}) =>
237
372
  Object.assign(new StartLiveKitAgentRoomSessionInput(), { RoomName: 'room-h', AgentID: 'co-agent', TargetAgentID: 'target-agent', AgentName: 'Sage', AgentSessionID: 'AS1', ...over });
@@ -277,6 +412,17 @@ describe('RealtimeBridgeResolver', () => {
277
412
  expect(h.startAgentRoomSession).not.toHaveBeenCalled();
278
413
  });
279
414
 
415
+ it("fails before the handoff-capable agent joins when the user's token can't be minted", async () => {
416
+ const starter = vi.fn(async () => ({ SessionBridgeID: 'bridge-h' }));
417
+ h.handoffDeps.AgentStarter = starter;
418
+ h.mintClientToken.mockRejectedValueOnce(new Error('LiveKitTokenService is not configured.'));
419
+
420
+ const result = await resolver.StartLiveKitAgentRoomSession(input({ EnableHandoff: true }), ctx);
421
+
422
+ expect(result).toMatchObject({ Success: false, ErrorMessage: 'LiveKitTokenService is not configured.', SessionBridgeID: '' });
423
+ expect(starter).not.toHaveBeenCalled();
424
+ });
425
+
280
426
  it('requires an authenticated user', async () => {
281
427
  resolver.user = undefined;
282
428
  const result = await resolver.StartLiveKitAgentRoomSession(input({ EnableHandoff: true }), ctx);
@@ -285,6 +431,230 @@ describe('RealtimeBridgeResolver', () => {
285
431
  });
286
432
  });
287
433
 
434
+ describe('the agent session it created closes when the agent leaves the room (#5356) or fails to start (#5308)', () => {
435
+ /** One `MJ: AI Agent Sessions` row in the fake database. */
436
+ interface SessionRow {
437
+ ID: string;
438
+ Status: string;
439
+ ClosedAt: Date | null;
440
+ CloseReason: string | null;
441
+ ConversationID: string | null;
442
+ Config_: string | null;
443
+ }
444
+
445
+ /** An `MJ: AI Agent Sessions` entity over the fake database: `Load` reads a row, `Save` writes it back. */
446
+ class FakeSessionEntity implements SessionRow {
447
+ public ID = '';
448
+ public Status = '';
449
+ public ClosedAt: Date | null = null;
450
+ public CloseReason: string | null = null;
451
+ public ConversationID: string | null = null;
452
+ public Config_: string | null = null;
453
+
454
+ constructor(private readonly rows: Map<string, SessionRow>) {}
455
+
456
+ public async Load(id: string): Promise<boolean> {
457
+ const row = this.rows.get(id);
458
+ if (!row) {
459
+ return false;
460
+ }
461
+ Object.assign(this, row);
462
+ return true;
463
+ }
464
+
465
+ public async Save(): Promise<boolean> {
466
+ const { ID, Status, ClosedAt, CloseReason, ConversationID, Config_ } = this;
467
+ this.rows.set(ID, { ID, Status, ClosedAt, CloseReason, ConversationID, Config_ });
468
+ return true;
469
+ }
470
+ }
471
+
472
+ /**
473
+ * Stands in for the room coordinator and the bridge engine: a stop runs the stopped agent's end-of-session hook before
474
+ * it resolves, as the engine does once the bridge row is terminal.
475
+ */
476
+ class FakeRooms {
477
+ private readonly agents = new Map<string, StartAgentRoomSessionParams>();
478
+ private seq = 0;
479
+
480
+ public readonly Start = async (params: StartAgentRoomSessionParams): Promise<AgentRoomSession> => {
481
+ const id = `bridge-${++this.seq}`;
482
+ this.agents.set(id, params);
483
+ return { SessionBridgeID: id, RoomName: params.RoomName, ServerUrl: 'wss://x.livekit.cloud' };
484
+ };
485
+
486
+ public readonly Stop = async (sessionBridgeID: string, reason: BridgeDisconnectReason = 'Explicit'): Promise<boolean> =>
487
+ this.End(sessionBridgeID, reason);
488
+
489
+ public readonly StopAll = async (roomName: string, reason: BridgeDisconnectReason = 'Explicit'): Promise<number> => {
490
+ const ids = [...this.agents].filter(([, params]) => params.RoomName === roomName).map(([id]) => id);
491
+ for (const id of ids) {
492
+ await this.End(id, reason);
493
+ }
494
+ return ids.length;
495
+ };
496
+
497
+ /** The agent's bridge ends: stopped, or on its own (everyone left, the model session was lost). */
498
+ public async End(sessionBridgeID: string, reason: BridgeDisconnectReason): Promise<boolean> {
499
+ const params = this.agents.get(sessionBridgeID);
500
+ if (!params) {
501
+ return false;
502
+ }
503
+ this.agents.delete(sessionBridgeID);
504
+ await params.Host?.OnSessionEnded?.(reason);
505
+ return true;
506
+ }
507
+
508
+ /** How many agents are in the room now. */
509
+ public AgentsIn(roomName: string): number {
510
+ return [...this.agents.values()].filter((params) => params.RoomName === roomName).length;
511
+ }
512
+ }
513
+
514
+ const sessions = new Map<string, SessionRow>();
515
+ const db = {
516
+ GetEntityObject: async (entityName: string) => {
517
+ if (entityName !== 'MJ: AI Agent Sessions') {
518
+ throw new Error(`Unexpected entity ${entityName}`);
519
+ }
520
+ return new FakeSessionEntity(sessions);
521
+ },
522
+ RunView: async () => ({ Success: true, Results: [] }), // the sessions have no channel rows to disconnect
523
+ } as unknown as IMetadataProvider;
524
+ const dbCtx = { providers: [{ type: 'Read-Write', provider: db }] } as unknown as AppContext;
525
+ let rooms: FakeRooms;
526
+
527
+ const addSession = (id: string): void => {
528
+ sessions.set(id, { ID: id, Status: 'Active', ClosedAt: null, CloseReason: null, ConversationID: null, Config_: null });
529
+ };
530
+ const start = (over: Partial<StartLiveKitAgentRoomSessionInput> = {}) =>
531
+ resolver.StartLiveKitAgentRoomSession(
532
+ Object.assign(new StartLiveKitAgentRoomSessionInput(), { RoomName: 'meet-room', AgentID: 'co-agent', TargetAgentID: 'target-agent', AgentName: 'Sage', ...over }),
533
+ dbCtx,
534
+ );
535
+
536
+ beforeEach(() => {
537
+ sessions.clear();
538
+ rooms = new FakeRooms();
539
+ h.startAgentRoomSession.mockImplementation(rooms.Start);
540
+ h.stopAgentRoomSession.mockImplementation(rooms.Stop);
541
+ h.stopAllAgentsInRoom.mockImplementation(rooms.StopAll);
542
+ let created = 0;
543
+ vi.spyOn(sessionManagerOf(resolver), 'CreateSession').mockImplementation(async () => {
544
+ const id = `AS-${++created}`;
545
+ addSession(id);
546
+ return { ID: id } as unknown as MJAIAgentSessionEntity;
547
+ });
548
+ });
549
+
550
+ afterEach(() => {
551
+ // Back to the file's defaults for the blocks that follow.
552
+ h.startAgentRoomSession.mockReset();
553
+ h.stopAgentRoomSession.mockReset();
554
+ h.stopAllAgentsInRoom.mockReset();
555
+ });
556
+
557
+ it('closes it at once when the agent is stopped, as Explicit', async () => {
558
+ const started = await start();
559
+ expect(started.Success).toBe(true);
560
+ expect(sessions.get('AS-1')?.Status).toBe('Active');
561
+
562
+ expect(await resolver.StopLiveKitAgentRoomSession(started.SessionBridgeID, dbCtx)).toBe(true);
563
+
564
+ expect(sessions.get('AS-1')).toMatchObject({ Status: 'Closed', CloseReason: 'Explicit', ClosedAt: expect.any(Date) });
565
+ });
566
+
567
+ it("closes every agent's session when the meeting is ended", async () => {
568
+ await start({ AgentName: 'Sage' });
569
+ await start({ AgentName: 'Analyst', TargetAgentID: 'other-target' });
570
+
571
+ expect(await resolver.EndLiveKitRoom('meet-room', dbCtx)).toBe(true);
572
+
573
+ expect(sessions.get('AS-1')).toMatchObject({ Status: 'Closed', CloseReason: 'Explicit' });
574
+ expect(sessions.get('AS-2')).toMatchObject({ Status: 'Closed', CloseReason: 'Explicit' });
575
+ });
576
+
577
+ it('closes it when the agent leaves on its own: everyone gone as Explicit, the model session lost as Error', async () => {
578
+ const first = await start();
579
+ const second = await start();
580
+
581
+ await rooms.End(first.SessionBridgeID, 'HostEnded');
582
+ await rooms.End(second.SessionBridgeID, 'Error');
583
+
584
+ expect(sessions.get('AS-1')).toMatchObject({ Status: 'Closed', CloseReason: 'Explicit' });
585
+ expect(sessions.get('AS-2')).toMatchObject({ Status: 'Closed', CloseReason: 'Error' });
586
+ });
587
+
588
+ it('closes it as the user who started the agent, whoever stops it', async () => {
589
+ const starter = resolver.user;
590
+ const started = await start();
591
+ const close = vi.spyOn(sessionManagerOf(resolver), 'CloseSession');
592
+ resolver.user = { ID: 'U2', Name: 'Second Participant', Email: 'second@example.com' } as unknown as UserInfo;
593
+
594
+ await resolver.StopLiveKitAgentRoomSession(started.SessionBridgeID, dbCtx);
595
+
596
+ expect(close).toHaveBeenCalledWith('AS-1', starter, db, 'Explicit');
597
+ });
598
+
599
+ it("leaves open a session the caller supplied: it is the caller's to close", async () => {
600
+ addSession('AS-supplied');
601
+ const started = await start({ AgentSessionID: 'AS-supplied' });
602
+
603
+ await resolver.StopLiveKitAgentRoomSession(started.SessionBridgeID, dbCtx);
604
+
605
+ expect(sessions.get('AS-supplied')?.Status).toBe('Active');
606
+ expect(sessionManagerOf(resolver).CreateSession).not.toHaveBeenCalled();
607
+ });
608
+
609
+ // The coordinator's start throws once it has closed any model session it opened; the agent never joined, so no
610
+ // end-of-session hook runs for it.
611
+ it.each([
612
+ ["the bot's token can't be minted", 'mint failed'],
613
+ ["the bridge doesn't start", 'Failed to create AIAgentSessionBridge: the user may not create MJ: AI Agent Session Bridges'],
614
+ ])('closes it at once, as Error, when the agent fails to start because %s', async (_why, startError) => {
615
+ h.startAgentRoomSession.mockRejectedValueOnce(new Error(startError));
616
+ const close = vi.spyOn(sessionManagerOf(resolver), 'CloseSession');
617
+
618
+ const started = await start();
619
+
620
+ expect(started).toMatchObject({ Success: false, ErrorMessage: startError });
621
+ expect(sessions.get('AS-1')).toMatchObject({ Status: 'Closed', CloseReason: 'Error', ClosedAt: expect.any(Date) });
622
+ expect(close).toHaveBeenCalledWith('AS-1', resolver.user, db, 'Error');
623
+ });
624
+
625
+ it('leaves a session the caller supplied as it was when the agent fails to start', async () => {
626
+ addSession('AS-supplied');
627
+ h.startAgentRoomSession.mockRejectedValueOnce(new Error('mint failed'));
628
+
629
+ const started = await start({ AgentSessionID: 'AS-supplied' });
630
+
631
+ expect(started.Success).toBe(false);
632
+ expect(sessions.get('AS-supplied')?.Status).toBe('Active');
633
+ });
634
+
635
+ it("returns the start's own error when closing the session fails too, leaving the session to the janitor", async () => {
636
+ h.startAgentRoomSession.mockRejectedValueOnce(new Error('mint failed'));
637
+ vi.spyOn(sessionManagerOf(resolver), 'CloseSession').mockRejectedValue(new Error('database unreachable'));
638
+
639
+ const started = await start();
640
+
641
+ expect(started).toMatchObject({ Success: false, ErrorMessage: 'mint failed' });
642
+ expect(sessions.get('AS-1')?.Status).toBe('Active');
643
+ });
644
+
645
+ // Minted after the agent joined, a token that couldn't be minted failed the start with the agent left in the room and
646
+ // its session Active, and the UI got no bridge id to stop it by.
647
+ it("starts nothing when the user's token can't be minted: no agent joins, no session is left Active", async () => {
648
+ h.mintClientToken.mockRejectedValueOnce(new Error('LiveKitTokenService is not configured.'));
649
+
650
+ const started = await start();
651
+
652
+ expect(started).toMatchObject({ Success: false, ErrorMessage: 'LiveKitTokenService is not configured.' });
653
+ expect(rooms.AgentsIn('meet-room')).toBe(0);
654
+ expect([...sessions.values()].filter((row) => row.Status === 'Active')).toEqual([]);
655
+ });
656
+ });
657
+
288
658
  describe('Per-room authorization enforcement', () => {
289
659
  beforeEach(() => {
290
660
  vi.clearAllMocks();
@@ -360,4 +730,43 @@ describe('RealtimeBridgeResolver', () => {
360
730
  expect(h.startRecording).not.toHaveBeenCalled();
361
731
  });
362
732
  });
733
+
734
+ describe('GetRealtimeModelVoices', () => {
735
+ it("types each voice's persona, avatar and preview image as nullable strings", async () => {
736
+ const schema = await buildSchema({ resolvers: [VoiceProbeResolver], validate: false });
737
+ // Read the built type rather than printing the schema (printSchema's instanceOf checks fail when type-graphql
738
+ // and the test resolve separate copies of `graphql`).
739
+ const fields = (schema.getType('RealtimeVoiceOptionResult') as GraphQLObjectType).getFields();
740
+ expect(String(fields['ID'].type)).toBe('String!');
741
+ expect(String(fields['Name'].type)).toBe('String!');
742
+ expect(String(fields['PersonaID'].type)).toBe('String');
743
+ expect(String(fields['AvatarID'].type)).toBe('String');
744
+ expect(String(fields['PreviewImageURL'].type)).toBe('String');
745
+ });
746
+
747
+ it('returns the marks the agents package resolved, unchanged', async () => {
748
+ const models = [
749
+ {
750
+ ModelID: 'm1',
751
+ ModelName: 'Live Voice Model',
752
+ Voices: [
753
+ { ID: 'Puck', Name: 'Puck', PersonaID: 'p-puck' },
754
+ { ID: 'Puck', Name: 'Avery', PersonaID: 'p-avery', AvatarID: 'Avery', PreviewImageURL: 'https://img.example.test/avery.png' },
755
+ { ID: 'Kore', Name: 'Kore' },
756
+ ],
757
+ },
758
+ ];
759
+ vi.mocked(GetRealtimeModelVoices).mockResolvedValueOnce(models);
760
+ expect(await resolver.GetRealtimeModelVoices(ctx)).toEqual(models);
761
+ });
762
+ });
363
763
  });
764
+
765
+ /** Exposes the voice-picker result type in a schema of its own, so the test reads the type the client queries. */
766
+ @Resolver()
767
+ class VoiceProbeResolver {
768
+ @Query(() => [RealtimeModelVoicesResult])
769
+ RealtimeVoices(): RealtimeModelVoicesResult[] {
770
+ return [];
771
+ }
772
+ }