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

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 (664) hide show
  1. package/README.md +96 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
  4. package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
  5. package/dist/agentSessions/BridgeHostInstance.js +14 -4
  6. package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
  7. package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
  8. package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
  9. package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
  10. package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
  11. package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
  12. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  13. package/dist/agentSessions/SessionJanitor.d.ts +34 -11
  14. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
  15. package/dist/agentSessions/SessionJanitor.js +88 -44
  16. package/dist/agentSessions/SessionJanitor.js.map +1 -1
  17. package/dist/agentSessions/SessionManager.d.ts +29 -9
  18. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  19. package/dist/agentSessions/SessionManager.js +62 -16
  20. package/dist/agentSessions/SessionManager.js.map +1 -1
  21. package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
  22. package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
  23. package/dist/agentSessions/conversationBrowsers.js +118 -0
  24. package/dist/agentSessions/conversationBrowsers.js.map +1 -0
  25. package/dist/agentSessions/sessionDeadline.d.ts +43 -0
  26. package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
  27. package/dist/agentSessions/sessionDeadline.js +68 -0
  28. package/dist/agentSessions/sessionDeadline.js.map +1 -0
  29. package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
  30. package/dist/auth/APIKeyScopeAuth.js +5 -4
  31. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  32. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  33. package/dist/auth/AuthProviderCatalogRouter.js +2 -0
  34. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  35. package/dist/auth/index.d.ts.map +1 -1
  36. package/dist/auth/index.js +51 -10
  37. package/dist/auth/index.js.map +1 -1
  38. package/dist/auth/initializeProviders.d.ts +10 -0
  39. package/dist/auth/initializeProviders.d.ts.map +1 -1
  40. package/dist/auth/initializeProviders.js +37 -1
  41. package/dist/auth/initializeProviders.js.map +1 -1
  42. package/dist/auth/localDevAuth.d.ts +79 -0
  43. package/dist/auth/localDevAuth.d.ts.map +1 -0
  44. package/dist/auth/localDevAuth.js +439 -0
  45. package/dist/auth/localDevAuth.js.map +1 -0
  46. package/dist/auth/loginEmailResolution.d.ts +41 -0
  47. package/dist/auth/loginEmailResolution.d.ts.map +1 -0
  48. package/dist/auth/loginEmailResolution.js +47 -0
  49. package/dist/auth/loginEmailResolution.js.map +1 -0
  50. package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
  51. package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
  52. package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
  53. package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
  54. package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
  55. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  56. package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
  57. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  58. package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
  59. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  60. package/dist/auth/magicLink/MagicLinkService.js +221 -9
  61. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  62. package/dist/auth/magicLink/index.d.ts +1 -1
  63. package/dist/auth/magicLink/index.d.ts.map +1 -1
  64. package/dist/auth/magicLink/index.js +1 -1
  65. package/dist/auth/magicLink/index.js.map +1 -1
  66. package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
  67. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  68. package/dist/auth/magicLink/redeemLanding.js +7 -4
  69. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  70. package/dist/auth/magicLink/types.d.ts +39 -3
  71. package/dist/auth/magicLink/types.d.ts.map +1 -1
  72. package/dist/auth/magicLink/types.js +0 -4
  73. package/dist/auth/magicLink/types.js.map +1 -1
  74. package/dist/auth/newUsers.d.ts.map +1 -1
  75. package/dist/auth/newUsers.js +1 -0
  76. package/dist/auth/newUsers.js.map +1 -1
  77. package/dist/auth/sessionUserClone.d.ts +1 -1
  78. package/dist/auth/sessionUserClone.d.ts.map +1 -1
  79. package/dist/auth/sessionUserClone.js +3 -2
  80. package/dist/auth/sessionUserClone.js.map +1 -1
  81. package/dist/backgroundSweepConfigUnits.d.ts +231 -0
  82. package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
  83. package/dist/backgroundSweepConfigUnits.js +180 -0
  84. package/dist/backgroundSweepConfigUnits.js.map +1 -0
  85. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
  86. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
  87. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
  88. package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
  89. package/dist/broadcast/index.d.ts +6 -0
  90. package/dist/broadcast/index.d.ts.map +1 -0
  91. package/dist/broadcast/index.js +6 -0
  92. package/dist/broadcast/index.js.map +1 -0
  93. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
  94. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
  95. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
  96. package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
  97. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
  98. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
  99. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
  100. package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
  101. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
  102. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
  103. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
  104. package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
  105. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
  106. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
  107. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
  108. package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
  109. package/dist/cache.d.ts +3 -2
  110. package/dist/cache.d.ts.map +1 -1
  111. package/dist/cache.js.map +1 -1
  112. package/dist/config.d.ts +1402 -8
  113. package/dist/config.d.ts.map +1 -1
  114. package/dist/config.js +120 -0
  115. package/dist/config.js.map +1 -1
  116. package/dist/context.d.ts +5 -1
  117. package/dist/context.d.ts.map +1 -1
  118. package/dist/context.js +64 -12
  119. package/dist/context.js.map +1 -1
  120. package/dist/coreRoutes.d.ts +3 -1
  121. package/dist/coreRoutes.d.ts.map +1 -1
  122. package/dist/coreRoutes.js +20 -4
  123. package/dist/coreRoutes.js.map +1 -1
  124. package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
  125. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  126. package/dist/generated/graphql-schemas/__mj.js +4167 -62
  127. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  128. package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
  129. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  130. package/dist/generic/CacheInvalidationResolver.js +154 -79
  131. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  132. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
  133. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
  134. package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
  135. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
  136. package/dist/generic/PubSubManager.d.ts +10 -0
  137. package/dist/generic/PubSubManager.d.ts.map +1 -1
  138. package/dist/generic/PubSubManager.js +44 -1
  139. package/dist/generic/PubSubManager.js.map +1 -1
  140. package/dist/generic/PushStatusResolver.d.ts +39 -6
  141. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  142. package/dist/generic/PushStatusResolver.js +93 -11
  143. package/dist/generic/PushStatusResolver.js.map +1 -1
  144. package/dist/generic/ResolverBase.d.ts +114 -29
  145. package/dist/generic/ResolverBase.d.ts.map +1 -1
  146. package/dist/generic/ResolverBase.js +509 -220
  147. package/dist/generic/ResolverBase.js.map +1 -1
  148. package/dist/generic/RunViewResolver.d.ts +15 -3
  149. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  150. package/dist/generic/RunViewResolver.js +126 -20
  151. package/dist/generic/RunViewResolver.js.map +1 -1
  152. package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
  153. package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
  154. package/dist/generic/actionOutputFieldSecurity.js +47 -0
  155. package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
  156. package/dist/generic/fieldSecurityTransport.d.ts +30 -0
  157. package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
  158. package/dist/generic/fieldSecurityTransport.js +30 -0
  159. package/dist/generic/fieldSecurityTransport.js.map +1 -0
  160. package/dist/index.d.ts +4 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +262 -84
  163. package/dist/index.js.map +1 -1
  164. package/dist/integration/ConnectionPause.d.ts +121 -0
  165. package/dist/integration/ConnectionPause.d.ts.map +1 -0
  166. package/dist/integration/ConnectionPause.js +183 -0
  167. package/dist/integration/ConnectionPause.js.map +1 -0
  168. package/dist/integration/CustomColumnPromoter.d.ts +72 -6
  169. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  170. package/dist/integration/CustomColumnPromoter.js +93 -47
  171. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  172. package/dist/integration/EntityMapLifecycle.d.ts +78 -4
  173. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  174. package/dist/integration/EntityMapLifecycle.js +199 -5
  175. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  176. package/dist/integration/InactiveRowWarnings.d.ts +31 -0
  177. package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
  178. package/dist/integration/InactiveRowWarnings.js +29 -0
  179. package/dist/integration/InactiveRowWarnings.js.map +1 -1
  180. package/dist/integration/ObjectNamesByID.d.ts +28 -0
  181. package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
  182. package/dist/integration/ObjectNamesByID.js +87 -0
  183. package/dist/integration/ObjectNamesByID.js.map +1 -0
  184. package/dist/integration/PostRestartIntrospect.d.ts +26 -0
  185. package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
  186. package/dist/integration/PostRestartIntrospect.js +27 -0
  187. package/dist/integration/PostRestartIntrospect.js.map +1 -0
  188. package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
  189. package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
  190. package/dist/integration/RSUPostRestartProgress.js +323 -0
  191. package/dist/integration/RSUPostRestartProgress.js.map +1 -0
  192. package/dist/integration/RSUProgressBridge.d.ts +41 -2
  193. package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
  194. package/dist/integration/RSUProgressBridge.js +84 -1
  195. package/dist/integration/RSUProgressBridge.js.map +1 -1
  196. package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
  197. package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
  198. package/dist/integration/RunArtifactAuthorization.js +45 -0
  199. package/dist/integration/RunArtifactAuthorization.js.map +1 -0
  200. package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
  201. package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
  202. package/dist/integration/SchemaRefreshLaunch.js +3 -2
  203. package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
  204. package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
  205. package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
  206. package/dist/integration/ScopedFieldsForBuild.js +91 -0
  207. package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
  208. package/dist/integration/TargetConfigGuard.d.ts +40 -0
  209. package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
  210. package/dist/integration/TargetConfigGuard.js +40 -0
  211. package/dist/integration/TargetConfigGuard.js.map +1 -0
  212. package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
  213. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  214. package/dist/logging/variablesLoggingMiddleware.js +50 -1
  215. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  216. package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
  217. package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
  218. package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
  219. package/dist/realtimeSessions/ownedRealtimeSession.d.ts +8 -6
  220. package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
  221. package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
  222. package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
  223. package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
  224. package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
  225. package/dist/realtimeSessions/sessionAccess.js +147 -22
  226. package/dist/realtimeSessions/sessionAccess.js.map +1 -1
  227. package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
  228. package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
  229. package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
  230. package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
  231. package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
  232. package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
  233. package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
  234. package/dist/realtimeSessions/verificationWorkflow.js +1 -1
  235. package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
  236. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  237. package/dist/realtimeWidget/WidgetRouter.js +19 -3
  238. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  239. package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
  240. package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
  241. package/dist/realtimeWidget/WidgetSessionService.js +203 -19
  242. package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
  243. package/dist/realtimeWidget/host-identity.d.ts +1 -1
  244. package/dist/realtimeWidget/host-identity.js +1 -1
  245. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  246. package/dist/realtimeWidget/visitorIdentity.js +1 -0
  247. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  248. package/dist/realtimeWidget/widgetCore.d.ts +20 -1
  249. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  250. package/dist/realtimeWidget/widgetCore.js +21 -8
  251. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  252. package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
  253. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  254. package/dist/realtimeWidget/widgetGuestElevation.js +3 -1
  255. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  256. package/dist/requestOrigin.d.ts +22 -0
  257. package/dist/requestOrigin.d.ts.map +1 -0
  258. package/dist/requestOrigin.js +60 -0
  259. package/dist/requestOrigin.js.map +1 -0
  260. package/dist/resolvers/ActionResolver.d.ts +19 -1
  261. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  262. package/dist/resolvers/ActionResolver.js +63 -12
  263. package/dist/resolvers/ActionResolver.js.map +1 -1
  264. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  265. package/dist/resolvers/AdhocQueryResolver.js +1 -0
  266. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  267. package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
  268. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
  269. package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
  270. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
  271. package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
  272. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
  273. package/dist/resolvers/AgentSessionResolver.js +44 -17
  274. package/dist/resolvers/AgentSessionResolver.js.map +1 -1
  275. package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
  276. package/dist/resolvers/AutotagPipelineResolver.js +2 -1
  277. package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
  278. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
  279. package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
  280. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
  281. package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
  282. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  283. package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
  284. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  285. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +6 -0
  286. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
  287. package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
  288. package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
  289. package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
  290. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  291. package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
  292. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  293. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  294. package/dist/resolvers/FileCategoryResolver.js +1 -0
  295. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  296. package/dist/resolvers/FileResolver.d.ts +5 -0
  297. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  298. package/dist/resolvers/FileResolver.js +13 -4
  299. package/dist/resolvers/FileResolver.js.map +1 -1
  300. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  301. package/dist/resolvers/GetDataResolver.js +34 -13
  302. package/dist/resolvers/GetDataResolver.js.map +1 -1
  303. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
  304. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  305. package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
  306. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  307. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  308. package/dist/resolvers/MCPResolver.js +13 -2
  309. package/dist/resolvers/MCPResolver.js.map +1 -1
  310. package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
  311. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  312. package/dist/resolvers/MergeRecordsResolver.js +31 -3
  313. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  314. package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
  315. package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
  316. package/dist/resolvers/PipelineProgressResolver.js +5 -3
  317. package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
  318. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  319. package/dist/resolvers/QueryResolver.js +20 -6
  320. package/dist/resolvers/QueryResolver.js.map +1 -1
  321. package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
  322. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  323. package/dist/resolvers/QuerySystemUserResolver.js +184 -88
  324. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  325. package/dist/resolvers/RSUResolver.d.ts.map +1 -1
  326. package/dist/resolvers/RSUResolver.js +12 -0
  327. package/dist/resolvers/RSUResolver.js.map +1 -1
  328. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  329. package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
  330. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  331. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
  332. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  333. package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
  334. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  335. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
  336. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  337. package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
  338. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  339. package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
  340. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  341. package/dist/resolvers/RunAIAgentResolver.js +388 -125
  342. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  343. package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
  344. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  345. package/dist/resolvers/RunAIPromptResolver.js +19 -18
  346. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  347. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  348. package/dist/resolvers/RunTemplateResolver.js +7 -5
  349. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  350. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  351. package/dist/resolvers/RunTestResolver.js +3 -1
  352. package/dist/resolvers/RunTestResolver.js.map +1 -1
  353. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  354. package/dist/resolvers/SyncDataResolver.js +4 -0
  355. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  356. package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
  357. package/dist/resolvers/TestQuerySQLResolver.js +1 -0
  358. package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
  359. package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
  360. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  361. package/dist/resolvers/TransactionGroupResolver.js +60 -15
  362. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  363. package/dist/resolvers/UserViewResolver.d.ts +1 -1
  364. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  365. package/dist/resolvers/UserViewResolver.js +2 -1
  366. package/dist/resolvers/UserViewResolver.js.map +1 -1
  367. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  368. package/dist/resolvers/meetingRecordingRegistration.js +2 -0
  369. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  370. package/dist/rest/EntityCRUDHandler.d.ts +6 -0
  371. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  372. package/dist/rest/EntityCRUDHandler.js +19 -5
  373. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  374. package/dist/rest/MediaAccessKeys.d.ts.map +1 -1
  375. package/dist/rest/MediaAccessKeys.js +6 -2
  376. package/dist/rest/MediaAccessKeys.js.map +1 -1
  377. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  378. package/dist/rest/OAuthCallbackHandler.js +11 -5
  379. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  380. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  381. package/dist/rest/RESTEndpointHandler.js +8 -5
  382. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  383. package/dist/rest/RealtimeRecordingHandler.d.ts +3 -3
  384. package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
  385. package/dist/rest/RealtimeRecordingHandler.js +6 -8
  386. package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
  387. package/dist/rest/ViewOperationsHandler.d.ts +6 -0
  388. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  389. package/dist/rest/ViewOperationsHandler.js +24 -6
  390. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  391. package/dist/rest/setupRESTEndpoints.d.ts +3 -1
  392. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  393. package/dist/rest/setupRESTEndpoints.js +11 -2
  394. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  395. package/dist/serverRoleConfigUnits.d.ts +29 -0
  396. package/dist/serverRoleConfigUnits.d.ts.map +1 -0
  397. package/dist/serverRoleConfigUnits.js +33 -0
  398. package/dist/serverRoleConfigUnits.js.map +1 -0
  399. package/dist/services/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
  400. package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
  401. package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
  402. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  403. package/dist/services/TaskGraphActionRunner.js +2 -26
  404. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  405. package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
  406. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
  407. package/dist/services/TaskGraphAgentRunner.js +38 -0
  408. package/dist/services/TaskGraphAgentRunner.js.map +1 -1
  409. package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
  410. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
  411. package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
  412. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
  413. package/dist/services/WorkQueueHostService.d.ts +2 -1
  414. package/dist/services/WorkQueueHostService.d.ts.map +1 -1
  415. package/dist/services/WorkQueueHostService.js +19 -4
  416. package/dist/services/WorkQueueHostService.js.map +1 -1
  417. package/dist/services/workQueueConfig.d.ts +2 -2
  418. package/dist/services/workQueueConfig.js +5 -5
  419. package/dist/services/workQueueConfig.js.map +1 -1
  420. package/dist/sharedCache.js +1 -1
  421. package/dist/sharedCache.js.map +1 -1
  422. package/dist/types.d.ts +40 -1
  423. package/dist/types.d.ts.map +1 -1
  424. package/dist/types.js.map +1 -1
  425. package/package.json +98 -98
  426. package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
  427. package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
  428. package/src/__tests__/ActiveOperations.test.ts +68 -0
  429. package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
  430. package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
  431. package/src/__tests__/AgentSessionResolver.ownership.test.ts +150 -0
  432. package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
  433. package/src/__tests__/BatchApplyParity.test.ts +109 -0
  434. package/src/__tests__/BridgeHostInstance.test.ts +42 -0
  435. package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
  436. package/src/__tests__/ConnectionPause.test.ts +192 -0
  437. package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
  438. package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
  439. package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
  440. package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
  441. package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
  442. package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
  443. package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
  444. package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
  445. package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
  446. package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
  447. package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
  448. package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
  449. package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
  450. package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
  451. package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
  452. package/src/__tests__/MagicLinkKeys.test.ts +102 -0
  453. package/src/__tests__/MediaAccessKeys.test.ts +57 -10
  454. package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
  455. package/src/__tests__/ObjectNamesByID.test.ts +176 -0
  456. package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
  457. package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
  458. package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
  459. package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
  460. package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
  461. package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
  462. package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
  463. package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
  464. package/src/__tests__/RSUProgressBridge.test.ts +188 -5
  465. package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
  466. package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
  467. package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
  468. package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
  469. package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
  470. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
  471. package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
  472. package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
  473. package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
  474. package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
  475. package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
  476. package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
  477. package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
  478. package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
  479. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -1
  480. package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
  481. package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
  482. package/src/__tests__/RunAIAgentResolver.branch.test.ts +72 -13
  483. package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
  484. package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
  485. package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
  486. package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
  487. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
  488. package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
  489. package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
  490. package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
  491. package/src/__tests__/RunTemplateResolver.test.ts +35 -2
  492. package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
  493. package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
  494. package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
  495. package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
  496. package/src/__tests__/SessionJanitor.test.ts +195 -4
  497. package/src/__tests__/SessionManager.test.ts +164 -0
  498. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
  499. package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
  500. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
  501. package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
  502. package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
  503. package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
  504. package/src/__tests__/WidgetSessionService.test.ts +583 -4
  505. package/src/__tests__/WorkQueueHostService.test.ts +25 -7
  506. package/src/__tests__/apiRootBoot.test.ts +1 -1
  507. package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
  508. package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
  509. package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
  510. package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
  511. package/src/__tests__/contextRequestOrigin.test.ts +105 -0
  512. package/src/__tests__/conversationBrowsers.test.ts +62 -0
  513. package/src/__tests__/fieldSecurityFixtures.ts +91 -0
  514. package/src/__tests__/globalCors.test.ts +3 -3
  515. package/src/__tests__/localDevAuth.test.ts +196 -0
  516. package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
  517. package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
  518. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
  519. package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
  520. package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
  521. package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
  522. package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
  523. package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
  524. package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
  525. package/src/__tests__/realtimeSessions/sessionAccess.test.ts +224 -7
  526. package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
  527. package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
  528. package/src/__tests__/requestOrigin.test.ts +104 -0
  529. package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
  530. package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
  531. package/src/__tests__/resolverBase.fls.test.ts +146 -97
  532. package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
  533. package/src/__tests__/runParamsTimeZone.test.ts +179 -0
  534. package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
  535. package/src/__tests__/runViewProperties.test.ts +114 -0
  536. package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
  537. package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
  538. package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
  539. package/src/__tests__/sessionDeadline.test.ts +51 -0
  540. package/src/__tests__/sessionUserClone.test.ts +5 -1
  541. package/src/__tests__/sharedCache.test.ts +11 -0
  542. package/src/__tests__/startupSweepOrder.test.ts +40 -0
  543. package/src/__tests__/unifiedAuth.test.ts +101 -1
  544. package/src/__tests__/widgetGuestElevation.test.ts +2 -0
  545. package/src/agentSessions/BridgeHostInstance.ts +20 -5
  546. package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
  547. package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
  548. package/src/agentSessions/SessionJanitor.ts +95 -45
  549. package/src/agentSessions/SessionManager.ts +73 -20
  550. package/src/agentSessions/conversationBrowsers.ts +143 -0
  551. package/src/agentSessions/sessionDeadline.ts +81 -0
  552. package/src/auth/APIKeyScopeAuth.ts +5 -4
  553. package/src/auth/AuthProviderCatalogRouter.ts +3 -0
  554. package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
  555. package/src/auth/index.ts +56 -12
  556. package/src/auth/initializeProviders.ts +43 -1
  557. package/src/auth/localDevAuth.ts +528 -0
  558. package/src/auth/loginEmailResolution.ts +67 -0
  559. package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
  560. package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
  561. package/src/auth/magicLink/MagicLinkService.ts +250 -10
  562. package/src/auth/magicLink/index.ts +1 -1
  563. package/src/auth/magicLink/redeemLanding.ts +7 -4
  564. package/src/auth/magicLink/types.ts +38 -3
  565. package/src/auth/newUsers.ts +1 -0
  566. package/src/auth/sessionUserClone.ts +3 -2
  567. package/src/backgroundSweepConfigUnits.ts +213 -0
  568. package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
  569. package/src/broadcast/index.ts +5 -0
  570. package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
  571. package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
  572. package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
  573. package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
  574. package/src/cache.ts +2 -1
  575. package/src/config.ts +138 -0
  576. package/src/context.ts +71 -14
  577. package/src/coreRoutes.ts +29 -7
  578. package/src/generated/graphql-schemas/__mj.ts +4145 -1193
  579. package/src/generic/CacheInvalidationResolver.ts +135 -78
  580. package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
  581. package/src/generic/PubSubManager.ts +54 -1
  582. package/src/generic/PushStatusResolver.ts +108 -11
  583. package/src/generic/ResolverBase.ts +635 -234
  584. package/src/generic/RunViewResolver.ts +176 -64
  585. package/src/generic/actionOutputFieldSecurity.ts +75 -0
  586. package/src/generic/fieldSecurityTransport.ts +62 -0
  587. package/src/index.ts +310 -85
  588. package/src/integration/ConnectionPause.ts +222 -0
  589. package/src/integration/CustomColumnPromoter.ts +129 -54
  590. package/src/integration/EntityMapLifecycle.ts +229 -6
  591. package/src/integration/InactiveRowWarnings.ts +50 -0
  592. package/src/integration/ObjectNamesByID.ts +97 -0
  593. package/src/integration/PostRestartIntrospect.ts +49 -0
  594. package/src/integration/RSUPostRestartProgress.ts +359 -0
  595. package/src/integration/RSUProgressBridge.ts +85 -2
  596. package/src/integration/RunArtifactAuthorization.ts +65 -0
  597. package/src/integration/SchemaRefreshLaunch.ts +12 -2
  598. package/src/integration/ScopedFieldsForBuild.ts +113 -0
  599. package/src/integration/TargetConfigGuard.ts +71 -0
  600. package/src/logging/variablesLoggingMiddleware.ts +59 -3
  601. package/src/realtimeSessions/README.md +7 -3
  602. package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
  603. package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
  604. package/src/realtimeSessions/sessionAccess.ts +211 -25
  605. package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
  606. package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
  607. package/src/realtimeSessions/verificationWorkflow.ts +3 -1
  608. package/src/realtimeWidget/WidgetRouter.ts +22 -4
  609. package/src/realtimeWidget/WidgetSessionService.ts +254 -17
  610. package/src/realtimeWidget/host-identity.ts +1 -1
  611. package/src/realtimeWidget/visitorIdentity.ts +1 -0
  612. package/src/realtimeWidget/widgetCore.ts +34 -9
  613. package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
  614. package/src/requestOrigin.ts +64 -0
  615. package/src/resolvers/ActionResolver.ts +78 -15
  616. package/src/resolvers/AdhocQueryResolver.ts +1 -0
  617. package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
  618. package/src/resolvers/AgentSessionResolver.ts +50 -18
  619. package/src/resolvers/AutotagPipelineResolver.ts +2 -1
  620. package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
  621. package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
  622. package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
  623. package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
  624. package/src/resolvers/FileCategoryResolver.ts +1 -0
  625. package/src/resolvers/FileResolver.ts +14 -4
  626. package/src/resolvers/GetDataResolver.ts +35 -13
  627. package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
  628. package/src/resolvers/MCPResolver.ts +15 -2
  629. package/src/resolvers/MergeRecordsResolver.ts +23 -2
  630. package/src/resolvers/PipelineProgressResolver.ts +12 -3
  631. package/src/resolvers/QueryResolver.ts +20 -6
  632. package/src/resolvers/QuerySystemUserResolver.ts +207 -99
  633. package/src/resolvers/RSUResolver.ts +12 -0
  634. package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
  635. package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
  636. package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
  637. package/src/resolvers/RunAIAgentResolver.ts +518 -163
  638. package/src/resolvers/RunAIPromptResolver.ts +18 -18
  639. package/src/resolvers/RunTemplateResolver.ts +9 -5
  640. package/src/resolvers/RunTestResolver.ts +3 -1
  641. package/src/resolvers/SyncDataResolver.ts +4 -0
  642. package/src/resolvers/TestQuerySQLResolver.ts +1 -0
  643. package/src/resolvers/TransactionGroupResolver.ts +66 -15
  644. package/src/resolvers/UserViewResolver.ts +2 -1
  645. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
  646. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
  647. package/src/resolvers/meetingRecordingRegistration.ts +2 -0
  648. package/src/rest/EntityCRUDHandler.ts +22 -5
  649. package/src/rest/MediaAccessKeys.ts +6 -2
  650. package/src/rest/OAuthCallbackHandler.ts +13 -5
  651. package/src/rest/RESTEndpointHandler.ts +8 -5
  652. package/src/rest/RealtimeRecordingHandler.ts +9 -10
  653. package/src/rest/ViewOperationsHandler.ts +26 -7
  654. package/src/rest/setupRESTEndpoints.ts +11 -2
  655. package/src/serverRoleConfigUnits.ts +48 -0
  656. package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
  657. package/src/services/TaskGraphActionRunner.ts +2 -23
  658. package/src/services/TaskGraphAgentRunner.ts +43 -0
  659. package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
  660. package/src/services/WorkQueueHostService.ts +26 -4
  661. package/src/services/workQueueConfig.ts +5 -5
  662. package/src/sharedCache.ts +1 -1
  663. package/src/types.ts +41 -1
  664. package/src/services/TaskOrchestration-Integration.md +0 -188
@@ -233,14 +233,24 @@ afterEach(() => {
233
233
  errSpy = undefined;
234
234
  });
235
235
 
236
+ const makeTestUuid = (a: string, b: string) =>
237
+ [a.repeat(8), b.repeat(4), '4' + b.repeat(3), '8' + b.repeat(3), b.repeat(12)].join('-');
238
+ const PRIOR_1 = makeTestUuid('1', '1');
239
+ const PRIOR_2 = makeTestUuid('2', '2');
240
+ const PRIOR_A = makeTestUuid('a', 'a');
241
+ const PRIOR_B = makeTestUuid('b', 'b');
242
+ const PRIOR_GONE = makeTestUuid('9', '9');
243
+
236
244
  function makeSessionEntity(overrides: Partial<FakeSession> = {}): FakeSession {
237
245
  return {
238
246
  ID: 'session-1',
239
247
  Status: 'Active',
240
248
  ConversationID: 'conv-1',
249
+ ExternalID: 'scope-res-1',
241
250
  UserID: 'user-1',
242
251
  Config_: JSON.stringify({ targetAgentID: 'target-1' }),
243
252
  NewRecord: vi.fn(),
253
+ MarkServerAuthoredReply: vi.fn(),
244
254
  Save: vi.fn(async () => true),
245
255
  Load: vi.fn(async () => true),
246
256
  LatestResult: { CompleteMessage: '' },
@@ -374,6 +384,95 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession', () => {
374
384
  expect(JSON.parse(result.SessionConfigJson)).toEqual({ instructions: 'hi' });
375
385
  });
376
386
 
387
+ describe('recording consent at start (#6010)', () => {
388
+ const RECORDING_SESSION_ID = 'a1a1a1a1-0000-4000-8000-000000000001';
389
+ const STARTED_AT = '2026-10-01T00:00:00.000Z';
390
+
391
+ /** A provider that can run the ledger's proc, recording every SQL call; `failSql` makes it throw. */
392
+ function makeSqlProvider(failSql = false) {
393
+ const sqlCalls: { Sql: string; Params: unknown[] }[] = [];
394
+ const provider = {
395
+ ...(makeProvider(() => makeSessionEntity()) as object),
396
+ MJCoreSchemaName: '__mj',
397
+ Dialect: {
398
+ ProcedureCallSyntax: (schema: string, name: string, params: string[]) => `EXEC [${schema}].[${name}] ${params.join(', ')}`,
399
+ ParameterPlaceholder: (index: number) => `@p${index}`,
400
+ },
401
+ ExecuteSQL: vi.fn(async (sql: string, params: unknown[]) => {
402
+ sqlCalls.push({ Sql: sql, Params: params });
403
+ if (failSql) throw new Error('proc exploded');
404
+ return [{ RecordingStatus: null }];
405
+ }),
406
+ };
407
+ return { provider, sqlCalls };
408
+ }
409
+
410
+ async function startWithConsent(provider: unknown) {
411
+ currentProvider = provider;
412
+ const createdSession = makeSessionEntity({ ID: RECORDING_SESSION_ID });
413
+ createSessionMock.mockResolvedValue(createdSession);
414
+ prepareClientSessionMock.mockResolvedValue({
415
+ Success: true,
416
+ ClientConfig: { Provider: 'openai', Model: 'gpt-realtime', EphemeralToken: 'ek', ExpiresAt: '2026-01-01T00:00:00Z', SessionConfig: {} },
417
+ });
418
+ const result = await makeResolver().StartRealtimeClientSession(
419
+ 'target-1', makeCtx(), undefined, undefined, undefined, undefined, undefined, undefined, STARTED_AT, true,
420
+ );
421
+ return { createdSession, result };
422
+ }
423
+
424
+ /** The one stamp-proc call the start made, with its positional params. */
425
+ function onlyStamp(sqlCalls: { Sql: string; Params: unknown[] }[]): unknown[] {
426
+ const stamps = sqlCalls.filter((c) => c.Sql.includes('spStampAIAgentSessionRecordingFile'));
427
+ expect(stamps).toHaveLength(1);
428
+ return stamps[0].Params;
429
+ }
430
+
431
+ it('saves RecordingStartedAt through the entity and stamps RecordingMedia and t0 through the ledger proc', async () => {
432
+ const { provider, sqlCalls } = makeSqlProvider();
433
+ const { createdSession } = await startWithConsent(provider);
434
+
435
+ expect((createdSession.RecordingStartedAt as Date).toISOString()).toBe(STARTED_AT);
436
+ expect(createdSession.Save).toHaveBeenCalled();
437
+ const [sessionID, fileID, media, startedAt] = onlyStamp(sqlCalls);
438
+ expect([sessionID, fileID, media]).toEqual([RECORDING_SESSION_ID, null, 'Audio']);
439
+ expect((startedAt as Date).toISOString()).toBe(STARTED_AT);
440
+ expect(createdSession.RecordingMedia).toBeUndefined();
441
+ });
442
+
443
+ it('still stamps t0 through the ledger proc when the entity save fails (the janitor recovers only sessions with a t0)', async () => {
444
+ errSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined);
445
+ const { provider, sqlCalls } = makeSqlProvider();
446
+ createSessionMock.mockReset();
447
+ const failing = makeSessionEntity({
448
+ ID: RECORDING_SESSION_ID,
449
+ Save: vi.fn(async () => false),
450
+ LatestResult: { CompleteMessage: 'save refused' },
451
+ });
452
+ createSessionMock.mockResolvedValue(failing);
453
+ currentProvider = provider;
454
+ prepareClientSessionMock.mockResolvedValue({
455
+ Success: true,
456
+ ClientConfig: { Provider: 'openai', Model: 'gpt-realtime', EphemeralToken: 'ek', ExpiresAt: '2026-01-01T00:00:00Z', SessionConfig: {} },
457
+ });
458
+ await makeResolver().StartRealtimeClientSession(
459
+ 'target-1', makeCtx(), undefined, undefined, undefined, undefined, undefined, undefined, STARTED_AT, true,
460
+ );
461
+
462
+ const [, , , startedAt] = onlyStamp(sqlCalls);
463
+ expect((startedAt as Date).toISOString()).toBe(STARTED_AT);
464
+ });
465
+
466
+ it('does not fail the session start when the media stamp throws, and logs it with the session id', async () => {
467
+ errSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined);
468
+ const { provider } = makeSqlProvider(true);
469
+ const { result } = await startWithConsent(provider);
470
+
471
+ expect(result.AgentSessionId).toBe(RECORDING_SESSION_ID);
472
+ expect(errSpy?.mock.calls.some((c) => String(c[0]).includes(RECORDING_SESSION_ID) && String(c[0]).includes('proc exploded'))).toBe(true);
473
+ });
474
+ });
475
+
377
476
  it('threads preferredModelId to the prepare service and surfaces ModelName + narration template', async () => {
378
477
  hasPermissionMock.mockResolvedValue(true);
379
478
  // Explicit model selection is gated by 'Realtime: Advanced Session Controls' — grant it.
@@ -1009,6 +1108,39 @@ describe('RealtimeClientSessionResolver.RelayRealtimeTranscript', () => {
1009
1108
 
1010
1109
  await resolver.RelayRealtimeTranscript('session-1', 'assistant', 'response', makeCtx());
1011
1110
  expect(detail.Role).toBe('AI');
1111
+ // The agent's side of the transcript is the server's write: unmarked, the reply gate refuses it.
1112
+ expect(detail.MarkServerAuthoredReply).toHaveBeenCalled();
1113
+ });
1114
+
1115
+ /** A19: the agent's words come from the browser here, so they are stored only in the caller's own conversation. */
1116
+ it("does not store the agent's side in a conversation the caller doesn't own, while still mirroring to the prompt run, heartbeating, and storing their own side", async () => {
1117
+ const detail = makeSessionEntity({ ID: 'detail-shared' });
1118
+ const promptRun = makeSessionEntity({ ID: PROMPT_RUN_ID, Messages: null });
1119
+ const session = makeSessionEntity({
1120
+ ConversationID: 'conv-shared',
1121
+ Config_: JSON.stringify({ targetAgentID: 'target-1', coAgentRunID: CO_RUN_ID, promptRunID: PROMPT_RUN_ID }),
1122
+ });
1123
+ const conversation = makeSessionEntity({ ID: 'conv-shared', UserID: 'the-owner' });
1124
+ currentProvider = makeProvider(
1125
+ (name) => {
1126
+ if (name === 'MJ: Conversation Details') return detail;
1127
+ if (name === 'MJ: Conversations') return conversation;
1128
+ if (name === 'MJ: AI Prompt Runs') return promptRun;
1129
+ return session;
1130
+ },
1131
+ sessionRunLookups([CO_RUN_ID], PROMPT_RUN_ID),
1132
+ );
1133
+ const resolver = makeResolver();
1134
+
1135
+ expect(await resolver.RelayRealtimeTranscript('session-1', 'assistant', 'words the agent never said', makeCtx())).toBe(false);
1136
+ expect(await resolver.RelayRealtimeTranscript('session-1', 'assistant', 'a correction', makeCtx(), true)).toBe(false);
1137
+ expect(detail.Save).not.toHaveBeenCalled();
1138
+ expect(conversation.Load).toHaveBeenCalledWith('conv-shared');
1139
+ expect(promptRun.Save).toHaveBeenCalled();
1140
+ expect(heartbeatMock).toHaveBeenCalledTimes(2);
1141
+
1142
+ expect(await resolver.RelayRealtimeTranscript('session-1', 'user', 'my own words', makeCtx())).toBe(true);
1143
+ expect(detail.Role).toBe('User');
1012
1144
  });
1013
1145
 
1014
1146
  it("maps role case/whitespace-insensitively (' USER ' → 'User')", async () => {
@@ -1449,12 +1581,21 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1449
1581
  */
1450
1582
  function makeRestoreProvider(opts: {
1451
1583
  prior?: FakeSession;
1584
+ externalId?: string | null;
1452
1585
  rows?: Array<{ Channel: string; Config: string | null }>;
1453
1586
  runViewResult?: { Success: boolean; ErrorMessage?: string; Results?: unknown[] };
1454
1587
  }): { provider: unknown; runView: ReturnType<typeof vi.fn>; prior: FakeSession } {
1455
- const prior = opts.prior ?? makeSessionEntity({ ID: 'prior-1', UserID: 'user-1' });
1588
+ const prior = opts.prior ?? makeSessionEntity({ ID: PRIOR_1, UserID: 'user-1' });
1589
+ const conversation = makeSessionEntity({ ExternalID: opts.externalId ?? prior.ExternalID ?? 'scope-res-1' });
1456
1590
  const runView = vi.fn(async () => opts.runViewResult ?? { Success: true, Results: opts.rows ?? [] });
1457
- return { provider: { GetEntityObject: vi.fn(async () => prior), RunView: runView }, runView, prior };
1591
+ return {
1592
+ provider: {
1593
+ GetEntityObject: vi.fn(async (name?: string) => (name === 'MJ: Conversations' ? conversation : prior)),
1594
+ RunView: runView,
1595
+ },
1596
+ runView,
1597
+ prior,
1598
+ };
1458
1599
  }
1459
1600
 
1460
1601
  function setupHappyStart(): void {
@@ -1475,7 +1616,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1475
1616
  currentProvider = provider;
1476
1617
  const resolver = makeResolver();
1477
1618
 
1478
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
1619
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1479
1620
 
1480
1621
  expect(result.PriorChannelStatesJson).toBeDefined();
1481
1622
  expect(JSON.parse(result.PriorChannelStatesJson as string)).toEqual({
@@ -1484,7 +1625,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1484
1625
  });
1485
1626
  // lastSessionId still flows into the new durable session record.
1486
1627
  const createArg = createSessionMock.mock.calls[0][0] as { lastSessionID?: string };
1487
- expect(createArg.lastSessionID).toBe('prior-1');
1628
+ expect(createArg.lastSessionID).toBe(PRIOR_1);
1488
1629
  });
1489
1630
 
1490
1631
  /** RunView calls that hit the session-channel restore query (the only RunView in the start flow). */
@@ -1507,18 +1648,55 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1507
1648
  it('omits the field (no state leak, no query) when the prior session belongs to ANOTHER user', async () => {
1508
1649
  setupHappyStart();
1509
1650
  const { provider, runView } = makeRestoreProvider({
1510
- prior: makeSessionEntity({ ID: 'prior-1', UserID: 'someone-else' }),
1651
+ prior: makeSessionEntity({ ID: PRIOR_1, UserID: 'someone-else' }),
1511
1652
  rows: [{ Channel: 'Whiteboard', Config: '{"secret":true}' }],
1512
1653
  });
1513
1654
  currentProvider = provider;
1514
1655
  const resolver = makeResolver();
1515
1656
 
1516
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
1657
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1517
1658
 
1518
1659
  expect(result.PriorChannelStatesJson).toBeUndefined();
1519
1660
  expect(restoreQueryCalls(runView)).toHaveLength(0);
1520
1661
  });
1521
1662
 
1663
+ it('skips restore for a second anonymous visitor (same UserID, different AnonymousVisitorID) and allows the matching anonymous visitor', async () => {
1664
+ setupHappyStart();
1665
+ const anonGuest = (visitorId: string): UserInfo =>
1666
+ ({
1667
+ ID: 'anon-1',
1668
+ Email: 'anonymous@magic-link.local',
1669
+ IsMagicLinkAnonymous: true,
1670
+ // An unscoped multi-use invite: redemptions are told apart by mj_sid (a resource scope would be shared).
1671
+ AnonymousVisitorID: visitorId,
1672
+ }) as unknown as UserInfo;
1673
+ const makeAnonResolver = (visitorId: string): RealtimeClientSessionResolver => {
1674
+ const r = new RealtimeClientSessionResolver();
1675
+ (r as unknown as { GetUserFromPayload: () => unknown }).GetUserFromPayload = () => anonGuest(visitorId);
1676
+ return r;
1677
+ };
1678
+
1679
+ const { provider: provider2, runView: runView2 } = makeRestoreProvider({
1680
+ prior: makeSessionEntity({ ID: PRIOR_1, UserID: 'anon-1', ExternalID: 'visitor-1' }),
1681
+ externalId: 'visitor-1',
1682
+ rows: [{ Channel: 'Whiteboard', Config: '{"secret":true}' }],
1683
+ });
1684
+ currentProvider = provider2;
1685
+ const refusedResult = await makeAnonResolver('visitor-2').StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1686
+ expect(refusedResult.PriorChannelStatesJson).toBeUndefined();
1687
+ expect(restoreQueryCalls(runView2)).toHaveLength(0);
1688
+
1689
+ setupHappyStart();
1690
+ const { provider: provider1 } = makeRestoreProvider({
1691
+ prior: makeSessionEntity({ ID: PRIOR_1, UserID: 'anon-1', ExternalID: 'visitor-1' }),
1692
+ externalId: 'visitor-1',
1693
+ rows: [{ Channel: 'Whiteboard', Config: '{"items":[1]}' }],
1694
+ });
1695
+ currentProvider = provider1;
1696
+ const allowedResult = await makeAnonResolver('visitor-1').StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1697
+ expect(allowedResult.PriorChannelStatesJson).toBe(JSON.stringify({ Whiteboard: '{"items":[1]}' }));
1698
+ });
1699
+
1522
1700
  it('omits the field when the prior session does not exist', async () => {
1523
1701
  setupHappyStart();
1524
1702
  const { provider, runView } = makeRestoreProvider({
@@ -1527,7 +1705,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1527
1705
  currentProvider = provider;
1528
1706
  const resolver = makeResolver();
1529
1707
 
1530
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-gone');
1708
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_GONE);
1531
1709
 
1532
1710
  expect(result.PriorChannelStatesJson).toBeUndefined();
1533
1711
  expect(restoreQueryCalls(runView)).toHaveLength(0);
@@ -1539,7 +1717,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1539
1717
  currentProvider = provider;
1540
1718
  const resolver = makeResolver();
1541
1719
 
1542
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
1720
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1543
1721
  expect(result.PriorChannelStatesJson).toBeUndefined();
1544
1722
  });
1545
1723
 
@@ -1554,7 +1732,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1554
1732
  currentProvider = provider;
1555
1733
  const resolver = makeResolver();
1556
1734
 
1557
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
1735
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1558
1736
 
1559
1737
  expect(JSON.parse(result.PriorChannelStatesJson as string)).toEqual({ Whiteboard: '{"items":[]}' });
1560
1738
  });
@@ -1570,7 +1748,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1570
1748
  currentProvider = provider;
1571
1749
  const resolver = makeResolver();
1572
1750
 
1573
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
1751
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1574
1752
 
1575
1753
  const states = JSON.parse(result.PriorChannelStatesJson as string) as Record<string, string>;
1576
1754
  expect(Object.keys(states)).toEqual(['First']);
@@ -1582,7 +1760,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1582
1760
  currentProvider = provider;
1583
1761
  const resolver = makeResolver();
1584
1762
 
1585
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
1763
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1586
1764
 
1587
1765
  expect(result.AgentSessionId).toBe('session-restore');
1588
1766
  expect(result.PriorChannelStatesJson).toBeUndefined();
@@ -1598,7 +1776,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior cha
1598
1776
  };
1599
1777
  const resolver = makeResolver();
1600
1778
 
1601
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
1779
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
1602
1780
 
1603
1781
  expect(result.AgentSessionId).toBe('session-restore');
1604
1782
  expect(result.PriorChannelStatesJson).toBeUndefined();
@@ -2044,6 +2222,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2044
2222
  interface ChainRow {
2045
2223
  UserID: string;
2046
2224
  LastSessionID?: string | null;
2225
+ ExternalID?: string | null;
2047
2226
  }
2048
2227
 
2049
2228
  interface DetailQueryRow {
@@ -2072,7 +2251,16 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2072
2251
  return { Success: true, Results: [] }; // session-channel restore — none
2073
2252
  });
2074
2253
  const provider = {
2075
- GetEntityObject: vi.fn(async () => {
2254
+ GetEntityObject: vi.fn(async (entityName?: string) => {
2255
+ if (entityName === 'MJ: Conversations') {
2256
+ const conv = makeSessionEntity();
2257
+ conv.Load = vi.fn(async (convId: string) => {
2258
+ const row = opts.chain[convId];
2259
+ conv.ExternalID = row?.ExternalID ?? 'scope-res-1';
2260
+ return true;
2261
+ });
2262
+ return conv;
2263
+ }
2076
2264
  const entity = makeSessionEntity();
2077
2265
  entity.Load = vi.fn(async (id: string) => {
2078
2266
  const row = opts.chain[id];
@@ -2080,6 +2268,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2080
2268
  return false;
2081
2269
  }
2082
2270
  entity.ID = id;
2271
+ entity.ConversationID = id;
2083
2272
  entity.UserID = row.UserID;
2084
2273
  entity.LastSessionID = row.LastSessionID ?? null;
2085
2274
  return true;
@@ -2108,13 +2297,13 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2108
2297
  it('threads the prior leg\'s role-tagged transcript into PrepareClientSession.PriorTranscript', async () => {
2109
2298
  setupHappyStart();
2110
2299
  const { provider } = makeHydrationProvider({
2111
- chain: { 'prior-1': { UserID: 'user-1' } },
2300
+ chain: { [PRIOR_1]: { UserID: 'user-1' } },
2112
2301
  detailRows: [turn('User', 'hello there'), turn('AI', 'hi! how can I help?')],
2113
2302
  });
2114
2303
  currentProvider = provider;
2115
2304
  const resolver = makeResolver();
2116
2305
 
2117
- await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
2306
+ await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2118
2307
 
2119
2308
  expect(prepTranscriptArg()).toBe('User: hello there\nAssistant: hi! how can I help?');
2120
2309
  });
@@ -2123,23 +2312,23 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2123
2312
  setupHappyStart();
2124
2313
  const { provider, runView } = makeHydrationProvider({
2125
2314
  chain: {
2126
- 'prior-2': { UserID: 'user-1', LastSessionID: 'prior-1' },
2127
- 'prior-1': { UserID: 'user-1' },
2315
+ [PRIOR_2]: { UserID: 'user-1', LastSessionID: PRIOR_1 },
2316
+ [PRIOR_1]: { UserID: 'user-1' },
2128
2317
  },
2129
2318
  detailRows: [turn('User', 'first leg'), turn('AI', 'second leg')],
2130
2319
  });
2131
2320
  currentProvider = provider;
2132
2321
  const resolver = makeResolver();
2133
2322
 
2134
- await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-2');
2323
+ await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_2);
2135
2324
 
2136
2325
  const detailCall = runView.mock.calls.find(
2137
2326
  (c) => (c[0] as { EntityName: string }).EntityName === 'MJ: Conversation Details',
2138
2327
  );
2139
2328
  expect(detailCall).toBeDefined();
2140
2329
  const filter = (detailCall![0] as { ExtraFilter: string }).ExtraFilter;
2141
- expect(filter).toContain("'prior-2'");
2142
- expect(filter).toContain("'prior-1'");
2330
+ expect(filter).toContain(`'${PRIOR_2}'`);
2331
+ expect(filter).toContain(`'${PRIOR_1}'`);
2143
2332
  expect(prepTranscriptArg()).toBe('User: first leg\nAssistant: second leg');
2144
2333
  });
2145
2334
 
@@ -2147,15 +2336,15 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2147
2336
  setupHappyStart();
2148
2337
  const { provider } = makeHydrationProvider({
2149
2338
  chain: {
2150
- 'prior-a': { UserID: 'user-1', LastSessionID: 'prior-b' },
2151
- 'prior-b': { UserID: 'user-1', LastSessionID: 'prior-a' },
2339
+ [PRIOR_A]: { UserID: 'user-1', LastSessionID: PRIOR_B },
2340
+ [PRIOR_B]: { UserID: 'user-1', LastSessionID: PRIOR_A },
2152
2341
  },
2153
2342
  detailRows: [turn('User', 'looped once')],
2154
2343
  });
2155
2344
  currentProvider = provider;
2156
2345
  const resolver = makeResolver();
2157
2346
 
2158
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-a');
2347
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_A);
2159
2348
 
2160
2349
  expect(result.AgentSessionId).toBe('session-new');
2161
2350
  expect(prepTranscriptArg()).toBe('User: looped once');
@@ -2164,11 +2353,11 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2164
2353
  it('keeps only the NEWEST 30 turns (oldest dropped)', async () => {
2165
2354
  setupHappyStart();
2166
2355
  const rows = Array.from({ length: 35 }, (_, i) => turn('User', `turn ${i}`, `d-${i}`));
2167
- const { provider } = makeHydrationProvider({ chain: { 'prior-1': { UserID: 'user-1' } }, detailRows: rows });
2356
+ const { provider } = makeHydrationProvider({ chain: { [PRIOR_1]: { UserID: 'user-1' } }, detailRows: rows });
2168
2357
  currentProvider = provider;
2169
2358
  const resolver = makeResolver();
2170
2359
 
2171
- await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
2360
+ await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2172
2361
 
2173
2362
  const lines = (prepTranscriptArg() ?? '').split('\n');
2174
2363
  expect(lines).toHaveLength(30);
@@ -2180,11 +2369,11 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2180
2369
  setupHappyStart();
2181
2370
  // 10 turns of 1000 chars each — only the newest ~7 fit the 8000-char budget.
2182
2371
  const rows = Array.from({ length: 10 }, (_, i) => turn('User', `${i}`.padEnd(1000, 'x'), `d-${i}`));
2183
- const { provider } = makeHydrationProvider({ chain: { 'prior-1': { UserID: 'user-1' } }, detailRows: rows });
2372
+ const { provider } = makeHydrationProvider({ chain: { [PRIOR_1]: { UserID: 'user-1' } }, detailRows: rows });
2184
2373
  currentProvider = provider;
2185
2374
  const resolver = makeResolver();
2186
2375
 
2187
- await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
2376
+ await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2188
2377
 
2189
2378
  const transcript = prepTranscriptArg() ?? '';
2190
2379
  expect(transcript.length).toBeLessThanOrEqual(8000);
@@ -2197,7 +2386,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2197
2386
  it('skips hidden, error-role, and empty rows', async () => {
2198
2387
  setupHappyStart();
2199
2388
  const { provider } = makeHydrationProvider({
2200
- chain: { 'prior-1': { UserID: 'user-1' } },
2389
+ chain: { [PRIOR_1]: { UserID: 'user-1' } },
2201
2390
  detailRows: [
2202
2391
  { ID: 'd-1', Role: 'Error', Message: 'boom', HiddenToUser: false },
2203
2392
  { ID: 'd-2', Role: 'AI', Message: 'secret', HiddenToUser: true },
@@ -2209,7 +2398,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2209
2398
  currentProvider = provider;
2210
2399
  const resolver = makeResolver();
2211
2400
 
2212
- await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
2401
+ await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2213
2402
 
2214
2403
  expect(prepTranscriptArg()).toBe('User: visible');
2215
2404
  });
@@ -2228,50 +2417,85 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2228
2417
  it('omits PriorTranscript (no leak) when the prior session belongs to ANOTHER user', async () => {
2229
2418
  setupHappyStart();
2230
2419
  const { provider } = makeHydrationProvider({
2231
- chain: { 'prior-1': { UserID: 'someone-else' } },
2420
+ chain: { [PRIOR_1]: { UserID: 'someone-else' } },
2232
2421
  detailRows: [turn('User', 'their words')],
2233
2422
  });
2234
2423
  currentProvider = provider;
2235
2424
  const resolver = makeResolver();
2236
2425
 
2237
- await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
2426
+ await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2238
2427
 
2239
2428
  expect(prepTranscriptArg()).toBeUndefined();
2240
2429
  });
2241
2430
 
2431
+ it('skips prior legs owned by a different anonymous visitor (same UserID, different AnonymousVisitorID) and allows the matching visitor', async () => {
2432
+ setupHappyStart();
2433
+ const anonGuest = (visitorId: string): UserInfo =>
2434
+ ({
2435
+ ID: 'anon-1',
2436
+ Email: 'anonymous@magic-link.local',
2437
+ IsMagicLinkAnonymous: true,
2438
+ // An unscoped multi-use invite: redemptions are told apart by mj_sid (a resource scope would be shared).
2439
+ AnonymousVisitorID: visitorId,
2440
+ }) as unknown as UserInfo;
2441
+ const makeAnonResolver = (visitorId: string): RealtimeClientSessionResolver => {
2442
+ const r = new RealtimeClientSessionResolver();
2443
+ (r as unknown as { GetUserFromPayload: () => unknown }).GetUserFromPayload = () => anonGuest(visitorId);
2444
+ return r;
2445
+ };
2446
+
2447
+ const { provider: provider2 } = makeHydrationProvider({
2448
+ chain: { [PRIOR_1]: { UserID: 'anon-1', ExternalID: 'visitor-1' } },
2449
+ detailRows: [turn('User', 'visitor 1 secret')],
2450
+ });
2451
+ currentProvider = provider2;
2452
+ await makeAnonResolver('visitor-2').StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2453
+ expect(prepTranscriptArg()).toBeUndefined();
2454
+
2455
+ prepareClientSessionMock.mockClear();
2456
+ setupHappyStart();
2457
+ const { provider: provider1 } = makeHydrationProvider({
2458
+ chain: { [PRIOR_1]: { UserID: 'anon-1', ExternalID: 'visitor-1' } },
2459
+ detailRows: [turn('User', 'visitor 1 secret')],
2460
+ });
2461
+ currentProvider = provider1;
2462
+ await makeAnonResolver('visitor-1').StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2463
+ expect(prepTranscriptArg()).toBe('User: visitor 1 secret');
2464
+ });
2465
+
2242
2466
  it('stops the chain walk at the first UNOWNED deeper leg but keeps the owned legs', async () => {
2243
2467
  setupHappyStart();
2244
2468
  const { provider, runView } = makeHydrationProvider({
2245
2469
  chain: {
2246
- 'prior-2': { UserID: 'user-1', LastSessionID: 'prior-1' },
2247
- 'prior-1': { UserID: 'someone-else' },
2470
+ [PRIOR_2]: { UserID: 'user-1', LastSessionID: PRIOR_1 },
2471
+ [PRIOR_1]: { UserID: 'someone-else' },
2248
2472
  },
2249
2473
  detailRows: [turn('User', 'owned leg only')],
2250
2474
  });
2251
2475
  currentProvider = provider;
2252
2476
  const resolver = makeResolver();
2253
2477
 
2254
- await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-2');
2478
+ await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_2);
2255
2479
 
2256
2480
  const detailCall = runView.mock.calls.find(
2257
2481
  (c) => (c[0] as { EntityName: string }).EntityName === 'MJ: Conversation Details',
2258
2482
  );
2259
2483
  const filter = (detailCall![0] as { ExtraFilter: string }).ExtraFilter;
2260
- expect(filter).toContain("'prior-2'");
2261
- expect(filter).not.toContain("'prior-1'");
2484
+ expect(filter).toContain(`'${PRIOR_2}'`);
2485
+ expect(filter).not.toContain(`'${PRIOR_1}'`);
2262
2486
  expect(prepTranscriptArg()).toBe('User: owned leg only');
2263
2487
  });
2264
2488
 
2265
2489
  it('tolerates a failed details query (start succeeds, no hydration)', async () => {
2266
2490
  setupHappyStart();
2267
2491
  const { provider } = makeHydrationProvider({
2268
- chain: { 'prior-1': { UserID: 'user-1' } },
2492
+ chain: { [PRIOR_1]: { UserID: 'user-1' } },
2269
2493
  detailQueryFails: true,
2270
2494
  });
2271
2495
  currentProvider = provider;
2272
2496
  const resolver = makeResolver();
2273
2497
 
2274
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
2498
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2275
2499
 
2276
2500
  expect(result.AgentSessionId).toBe('session-new');
2277
2501
  expect(prepTranscriptArg()).toBeUndefined();
@@ -2287,7 +2511,7 @@ describe('RealtimeClientSessionResolver.StartRealtimeClientSession — prior-tra
2287
2511
  };
2288
2512
  const resolver = makeResolver();
2289
2513
 
2290
- const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, 'prior-1');
2514
+ const result = await resolver.StartRealtimeClientSession('target-1', makeCtx(), undefined, PRIOR_1);
2291
2515
 
2292
2516
  expect(result.AgentSessionId).toBe('session-new');
2293
2517
  expect(prepTranscriptArg()).toBeUndefined();
@@ -2471,6 +2695,28 @@ describe('RealtimeClientSessionResolver.RelayRealtimeUsage', () => {
2471
2695
  expect(promptRun.Save).not.toHaveBeenCalled();
2472
2696
  });
2473
2697
 
2698
+ it('logs a missing co-agent promptRunID once per session, not once per relay', async () => {
2699
+ errSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined);
2700
+ const missingRunLines = (): string[] =>
2701
+ (errSpy?.mock.calls ?? []).map((c) => c.map(String).join(' ')).filter((m) => m.includes('has no co-agent promptRunID'));
2702
+ const resolver = makeResolver();
2703
+
2704
+ for (const sessionID of ['session-no-run-a', 'session-no-run-b']) {
2705
+ const { provider } = makeUsageProvider({
2706
+ session: makeSessionEntity({ ID: sessionID, Config_: JSON.stringify({ targetAgentID: 'target-1' }) }),
2707
+ });
2708
+ currentProvider = provider;
2709
+ for (let i = 0; i < 3; i++) {
2710
+ await expect(resolver.RelayRealtimeUsage(sessionID, 10, 5, makeCtx())).resolves.toBe(false);
2711
+ }
2712
+ }
2713
+
2714
+ const lines = missingRunLines();
2715
+ expect(lines).toHaveLength(2);
2716
+ expect(lines[0]).toContain('session-no-run-a');
2717
+ expect(lines[1]).toContain('session-no-run-b');
2718
+ });
2719
+
2474
2720
  it('returns false (tolerant, no throw) when the session config is missing/malformed', async () => {
2475
2721
  const { provider } = makeUsageProvider({ session: makeSessionEntity({ Config_: '{broken json' }) });
2476
2722
  currentProvider = provider;
@@ -3106,6 +3352,7 @@ describe('RealtimeClientSessionResolver — delegated runs get the browser sessi
3106
3352
  ID: 'anon-1',
3107
3353
  Email: 'anonymous@magic-link.local',
3108
3354
  IsMagicLinkAnonymous: true,
3355
+ AnonymousVisitorID: 'scope-res-1',
3109
3356
  MagicLinkScope: { ResourceID: 'scope-res-1' },
3110
3357
  } as UserInfo;
3111
3358
  /** A resolver whose caller is a scoped anonymous magic-link visitor. */
@@ -3157,6 +3404,7 @@ describe('RealtimeClientSessionResolver — scoped-anonymous elevation (issue #3
3157
3404
  ID: 'anon-1',
3158
3405
  Email: 'anonymous@magic-link.local',
3159
3406
  IsMagicLinkAnonymous: true,
3407
+ AnonymousVisitorID: 'scope-res-1',
3160
3408
  MagicLinkScope: { ResourceID: 'scope-res-1' },
3161
3409
  };
3162
3410
  const SYSTEM_USER = { ID: 'system-1', Email: 'system@system.org' } as UserInfo;
@@ -3369,6 +3617,33 @@ describe('RealtimeClientSessionResolver — scoped-anonymous elevation (issue #3
3369
3617
  expect(getEntityObjectSpy()).not.toHaveBeenCalledWith('MJ: Conversation Details', SYSTEM_USER);
3370
3618
  });
3371
3619
 
3620
+ it("does not write a hidden tool-turn Conversation Detail in a conversation the caller doesn't own, while still mirroring to the prompt run", async () => {
3621
+ const session = makeSessionEntity({
3622
+ UserID: 'anon-1',
3623
+ ConversationID: 'conv-shared',
3624
+ Config_: JSON.stringify({ targetAgentID: 'target-1', coAgentRunID: CO_RUN_ID, promptRunID: PROMPT_RUN_ID }),
3625
+ });
3626
+ const conversation = makeSessionEntity({ ID: 'conv-shared', UserID: 'someone-else' });
3627
+ const promptRun = makeSessionEntity({ ID: PROMPT_RUN_ID, Messages: null });
3628
+ const detail = makeSessionEntity({ ID: 'detail-shared-tool' });
3629
+ currentProvider = {
3630
+ GetEntityObject: vi.fn(async (name: string) => {
3631
+ if (name === 'MJ: AI Prompt Runs') return promptRun;
3632
+ if (name === 'MJ: Conversations') return conversation;
3633
+ if (name === 'MJ: Conversation Details') return detail;
3634
+ return session;
3635
+ }),
3636
+ ...sessionRunLookups([CO_RUN_ID], PROMPT_RUN_ID),
3637
+ };
3638
+ const resolver = makeAnonResolver();
3639
+
3640
+ const ok = await resolver.RelayRealtimeToolTurn('session-1', 'browser_navigate', makeCtx(), '{"url":"x"}');
3641
+
3642
+ expect(ok).toBe(true);
3643
+ expect(promptRun.Save).toHaveBeenCalled();
3644
+ expect(detail.Save).not.toHaveBeenCalled();
3645
+ });
3646
+
3372
3647
  it('prepares the session with observability under the SYSTEM user while UserID stays the visitor', async () => {
3373
3648
  hasPermissionMock.mockResolvedValue(true);
3374
3649
  currentProvider = makeProvider(() => makeSessionEntity({ UserID: 'anon-1' }));
@@ -3507,6 +3782,24 @@ describe('RealtimeClientSessionResolver — scoped-anonymous elevation (issue #3
3507
3782
  expect(deleteSegmentsMock).not.toHaveBeenCalled();
3508
3783
  });
3509
3784
 
3785
+ it('reports a file that uploaded but was not stamped on the session as a failure and keeps the shards', async () => {
3786
+ // The store returns the uploaded file id together with the stamp failure (#6010): the session does not
3787
+ // point at the file, so the crash-recovery shards are the only copy the janitor can still recover.
3788
+ currentProvider = makeRecordingProvider();
3789
+ storeRecordingMock.mockResolvedValue({
3790
+ FileID: 'file-unstamped',
3791
+ ErrorMessage: 'file file-unstamped uploaded and linked, but not stamped on session session-1: proc missing',
3792
+ });
3793
+ const resolver = makeAnonResolver();
3794
+
3795
+ const result = await resolver.UploadRealtimeRecording('session-1', AUDIO_B64, 'audio/wav', makeCtx(), 1000, true);
3796
+
3797
+ expect(result.Success).toBe(false);
3798
+ expect(result.FileID).toBe('file-unstamped');
3799
+ expect(result.ErrorMessage).toContain('not stamped on session session-1');
3800
+ expect(deleteSegmentsMock).not.toHaveBeenCalled();
3801
+ });
3802
+
3510
3803
  it('falls back to the generic message only when no layer supplied a reason', async () => {
3511
3804
  currentProvider = makeRecordingProvider();
3512
3805
  storeRecordingMock.mockResolvedValue({ FileID: null, ErrorMessage: null });
@@ -3728,6 +4021,7 @@ describe('RealtimeClientSessionResolver — colleague authorization (allowedAgen
3728
4021
  ID: 'anon-1',
3729
4022
  Email: 'anonymous@magic-link.local',
3730
4023
  IsMagicLinkAnonymous: true,
4024
+ AnonymousVisitorID: 'scope-res-1',
3731
4025
  MagicLinkScope: { ResourceID: 'scope-res-1' },
3732
4026
  };
3733
4027
  currentProvider = makeProvider(() => makeMultiTargetSession('anon-1'));
@@ -3842,7 +4136,10 @@ describe('RealtimeClientSessionResolver — conversation-history hydration', ()
3842
4136
  return { Success: true, Results: [] };
3843
4137
  });
3844
4138
  const provider = {
3845
- GetEntityObject: vi.fn(async () => {
4139
+ GetEntityObject: vi.fn(async (entityName: string) => {
4140
+ if (entityName === 'MJ: Conversations') {
4141
+ return makeSessionEntity();
4142
+ }
3846
4143
  const entity = makeSessionEntity();
3847
4144
  entity.Load = vi.fn(async (id: string) => {
3848
4145
  const r = opts.chain?.[id];
@@ -3996,17 +4293,18 @@ describe('RealtimeClientSessionResolver — conversation-history hydration', ()
3996
4293
  it('DROPS turns the resumed transcript already framed, so the prompt carries one account of them', async () => {
3997
4294
  // The whole reason the leg ids travel with the prior transcript. A voice turn is an ordinary
3998
4295
  // Conversation Detail, so without this the resumed leg arrives twice in one prompt.
4296
+ const prior1 = '00000000-0000-0000-0000-000000000501';
3999
4297
  const { provider } = makeProvider({
4000
- chain: { 'prior-1': { UserID: 'user-1' } },
4298
+ chain: { [prior1]: { UserID: 'user-1' } },
4001
4299
  legRows: [{ ID: 'l-1', Role: 'User', Message: 'said on the last call', HiddenToUser: false }],
4002
4300
  historyRows: [
4003
- row('User', 'said on the last call', { AgentSessionID: 'prior-1' }),
4301
+ row('User', 'said on the last call', { AgentSessionID: prior1 }),
4004
4302
  row('User', 'typed afterwards'),
4005
4303
  ],
4006
4304
  });
4007
4305
  currentProvider = provider;
4008
4306
 
4009
- await makeResolver().StartRealtimeClientSession('target-1', makeCtx(), 'conv-1', 'prior-1');
4307
+ await makeResolver().StartRealtimeClientSession('target-1', makeCtx(), 'conv-1', prior1);
4010
4308
 
4011
4309
  expect(historyArg().map((m) => m.content)).toEqual(['typed afterwards']);
4012
4310
  const prior = (prepareClientSessionMock.mock.calls[0][0] as { PriorTranscript?: string }).PriorTranscript;
@@ -4016,14 +4314,16 @@ describe('RealtimeClientSessionResolver — conversation-history hydration', ()
4016
4314
  it('matches covered session ids case-insensitively', async () => {
4017
4315
  // SQL Server returns uppercase ids and PostgreSQL lowercase; a case-sensitive compare would
4018
4316
  // double-inject the resumed leg on one of the two.
4317
+ const prior1Lower = '00000000-0000-0000-0000-000000000501';
4318
+ const prior1Upper = prior1Lower.toUpperCase();
4019
4319
  const { provider } = makeProvider({
4020
- chain: { 'PRIOR-1': { UserID: 'user-1' } },
4320
+ chain: { [prior1Upper]: { UserID: 'user-1' } },
4021
4321
  legRows: [{ ID: 'l-1', Role: 'User', Message: 'said on the last call', HiddenToUser: false }],
4022
- historyRows: [row('User', 'said on the last call', { AgentSessionID: 'prior-1' })],
4322
+ historyRows: [row('User', 'said on the last call', { AgentSessionID: prior1Lower })],
4023
4323
  });
4024
4324
  currentProvider = provider;
4025
4325
 
4026
- await makeResolver().StartRealtimeClientSession('target-1', makeCtx(), 'conv-1', 'PRIOR-1');
4326
+ await makeResolver().StartRealtimeClientSession('target-1', makeCtx(), 'conv-1', prior1Upper);
4027
4327
 
4028
4328
  expect(historyArg()).toEqual([]);
4029
4329
  });