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

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 (459) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/agentSessions/ReturningVisitorRecap.d.ts +2 -0
  3. package/dist/agentSessions/ReturningVisitorRecap.d.ts.map +1 -1
  4. package/dist/agentSessions/ReturningVisitorRecap.js +5 -1
  5. package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
  6. package/dist/agentSessions/SessionManager.js +2 -2
  7. package/dist/agentSessions/remoteBrowserGoalEngine.d.ts +8 -0
  8. package/dist/agentSessions/remoteBrowserGoalEngine.d.ts.map +1 -1
  9. package/dist/agentSessions/remoteBrowserGoalEngine.js +21 -5
  10. package/dist/agentSessions/remoteBrowserGoalEngine.js.map +1 -1
  11. package/dist/auth/AuthProviderCatalogRouter.d.ts +2 -0
  12. package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
  13. package/dist/auth/AuthProviderCatalogRouter.js +5 -1
  14. package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
  15. package/dist/auth/index.d.ts +20 -1
  16. package/dist/auth/index.d.ts.map +1 -1
  17. package/dist/auth/index.js +20 -10
  18. package/dist/auth/index.js.map +1 -1
  19. package/dist/auth/initializeProviders.d.ts +8 -0
  20. package/dist/auth/initializeProviders.d.ts.map +1 -1
  21. package/dist/auth/initializeProviders.js +21 -5
  22. package/dist/auth/initializeProviders.js.map +1 -1
  23. package/dist/auth/magicLink/MagicLinkRouter.d.ts +9 -0
  24. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  25. package/dist/auth/magicLink/MagicLinkRouter.js +22 -10
  26. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  27. package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
  28. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  29. package/dist/auth/magicLink/MagicLinkService.js +65 -51
  30. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  31. package/dist/auth/magicLink/index.d.ts +2 -2
  32. package/dist/auth/magicLink/index.d.ts.map +1 -1
  33. package/dist/auth/magicLink/index.js +2 -2
  34. package/dist/auth/magicLink/index.js.map +1 -1
  35. package/dist/auth/magicLink/magicLinkCore.d.ts +54 -33
  36. package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
  37. package/dist/auth/magicLink/magicLinkCore.js +61 -61
  38. package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
  39. package/dist/auth/magicLink/redeemLanding.d.ts +4 -0
  40. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  41. package/dist/auth/magicLink/redeemLanding.js +12 -4
  42. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  43. package/dist/auth/magicLink/types.d.ts +4 -4
  44. package/dist/auth/principals.d.ts +2 -0
  45. package/dist/auth/principals.d.ts.map +1 -1
  46. package/dist/auth/principals.js +6 -2
  47. package/dist/auth/principals.js.map +1 -1
  48. package/dist/cache.d.ts +2 -0
  49. package/dist/cache.d.ts.map +1 -1
  50. package/dist/cache.js +3 -1
  51. package/dist/cache.js.map +1 -1
  52. package/dist/config.d.ts +346 -2
  53. package/dist/config.d.ts.map +1 -1
  54. package/dist/config.js +34 -4
  55. package/dist/config.js.map +1 -1
  56. package/dist/context.d.ts +20 -0
  57. package/dist/context.d.ts.map +1 -1
  58. package/dist/context.js +27 -19
  59. package/dist/context.js.map +1 -1
  60. package/dist/directives/Public.d.ts +2 -0
  61. package/dist/directives/Public.d.ts.map +1 -1
  62. package/dist/directives/Public.js +3 -1
  63. package/dist/directives/Public.js.map +1 -1
  64. package/dist/directives/RequireSystemUser.d.ts +2 -0
  65. package/dist/directives/RequireSystemUser.d.ts.map +1 -1
  66. package/dist/directives/RequireSystemUser.js +3 -1
  67. package/dist/directives/RequireSystemUser.js.map +1 -1
  68. package/dist/generated/graphql-schemas/__mj.d.ts +1021 -0
  69. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  70. package/dist/generated/graphql-schemas/__mj.js +7368 -2145
  71. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  72. package/dist/generic/CacheInvalidationResolver.d.ts +94 -4
  73. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  74. package/dist/generic/CacheInvalidationResolver.js +122 -3
  75. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  76. package/dist/generic/DeleteOptionsInput.d.ts +8 -1
  77. package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
  78. package/dist/generic/DeleteOptionsInput.js +1 -1
  79. package/dist/generic/DeleteOptionsInput.js.map +1 -1
  80. package/dist/generic/FireAndForgetHeartbeat.d.ts +18 -2
  81. package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
  82. package/dist/generic/FireAndForgetHeartbeat.js +24 -6
  83. package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
  84. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +31 -0
  85. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -0
  86. package/dist/generic/OrphanedConversationDetailReconciler.js +215 -0
  87. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -0
  88. package/dist/generic/PushStatusResolver.d.ts +48 -1
  89. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  90. package/dist/generic/PushStatusResolver.js +95 -4
  91. package/dist/generic/PushStatusResolver.js.map +1 -1
  92. package/dist/generic/ResolverBase.d.ts +18 -2
  93. package/dist/generic/ResolverBase.d.ts.map +1 -1
  94. package/dist/generic/ResolverBase.js +64 -55
  95. package/dist/generic/ResolverBase.js.map +1 -1
  96. package/dist/index.d.ts +9 -0
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +120 -11
  99. package/dist/index.js.map +1 -1
  100. package/dist/integration/CustomColumnPromoter.d.ts +2 -0
  101. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  102. package/dist/integration/CustomColumnPromoter.js +5 -1
  103. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  104. package/dist/integration/EntityMapLifecycle.d.ts +4 -0
  105. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  106. package/dist/integration/EntityMapLifecycle.js +10 -2
  107. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  108. package/dist/logging/NoLog.d.ts +4 -0
  109. package/dist/logging/NoLog.d.ts.map +1 -1
  110. package/dist/logging/NoLog.js +10 -2
  111. package/dist/logging/NoLog.js.map +1 -1
  112. package/dist/logging/StartupLogger.d.ts +2 -0
  113. package/dist/logging/StartupLogger.d.ts.map +1 -1
  114. package/dist/logging/StartupLogger.js +5 -1
  115. package/dist/logging/StartupLogger.js.map +1 -1
  116. package/dist/logging/bootAudit.d.ts +11 -7
  117. package/dist/logging/bootAudit.d.ts.map +1 -1
  118. package/dist/logging/bootAudit.js +15 -7
  119. package/dist/logging/bootAudit.js.map +1 -1
  120. package/dist/logging/boundaryLogPayload.d.ts +4 -0
  121. package/dist/logging/boundaryLogPayload.d.ts.map +1 -1
  122. package/dist/logging/boundaryLogPayload.js +5 -1
  123. package/dist/logging/boundaryLogPayload.js.map +1 -1
  124. package/dist/logging/secretRedactor.d.ts +2 -0
  125. package/dist/logging/secretRedactor.d.ts.map +1 -1
  126. package/dist/logging/secretRedactor.js +8 -4
  127. package/dist/logging/secretRedactor.js.map +1 -1
  128. package/dist/logging/shortenForLog.d.ts +2 -0
  129. package/dist/logging/shortenForLog.d.ts.map +1 -1
  130. package/dist/logging/shortenForLog.js +7 -3
  131. package/dist/logging/shortenForLog.js.map +1 -1
  132. package/dist/logging/variablesLoggingMiddleware.d.ts +2 -0
  133. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  134. package/dist/logging/variablesLoggingMiddleware.js +8 -6
  135. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  136. package/dist/metadataRefreshSignal.d.ts +19 -0
  137. package/dist/metadataRefreshSignal.d.ts.map +1 -0
  138. package/dist/metadataRefreshSignal.js +45 -0
  139. package/dist/metadataRefreshSignal.js.map +1 -0
  140. package/dist/middleware/MJTenantFilterMiddleware.js +4 -4
  141. package/dist/multiTenancy/index.d.ts +8 -0
  142. package/dist/multiTenancy/index.d.ts.map +1 -1
  143. package/dist/multiTenancy/index.js +21 -5
  144. package/dist/multiTenancy/index.js.map +1 -1
  145. package/dist/realtimeWidget/WidgetRouter.d.ts +5 -0
  146. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  147. package/dist/realtimeWidget/WidgetRouter.js +14 -10
  148. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  149. package/dist/realtimeWidget/WidgetSessionService.d.ts +6 -6
  150. package/dist/realtimeWidget/WidgetSessionService.js +27 -27
  151. package/dist/realtimeWidget/host-identity.d.ts +5 -1
  152. package/dist/realtimeWidget/host-identity.d.ts.map +1 -1
  153. package/dist/realtimeWidget/host-identity.js +11 -3
  154. package/dist/realtimeWidget/host-identity.js.map +1 -1
  155. package/dist/realtimeWidget/index.d.ts +2 -2
  156. package/dist/realtimeWidget/index.d.ts.map +1 -1
  157. package/dist/realtimeWidget/index.js +2 -2
  158. package/dist/realtimeWidget/index.js.map +1 -1
  159. package/dist/realtimeWidget/visitorIdentity.d.ts +21 -1
  160. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  161. package/dist/realtimeWidget/visitorIdentity.js +16 -4
  162. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  163. package/dist/realtimeWidget/widgetCore.d.ts +48 -0
  164. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  165. package/dist/realtimeWidget/widgetCore.js +38 -10
  166. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  167. package/dist/realtimeWidget/widgetGuestElevation.d.ts +10 -6
  168. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  169. package/dist/realtimeWidget/widgetGuestElevation.js +14 -6
  170. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  171. package/dist/resolvers/AdhocQueryResolver.js +3 -3
  172. package/dist/resolvers/AgentRunStatusPublisher.d.ts +55 -0
  173. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -0
  174. package/dist/resolvers/AgentRunStatusPublisher.js +141 -0
  175. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -0
  176. package/dist/resolvers/ConversationRunEventsResolver.d.ts +90 -0
  177. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -0
  178. package/dist/resolvers/ConversationRunEventsResolver.js +283 -0
  179. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -0
  180. package/dist/resolvers/DuplicateEntryCheckResolver.d.ts +98 -0
  181. package/dist/resolvers/DuplicateEntryCheckResolver.d.ts.map +1 -0
  182. package/dist/resolvers/DuplicateEntryCheckResolver.js +227 -0
  183. package/dist/resolvers/DuplicateEntryCheckResolver.js.map +1 -0
  184. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  185. package/dist/resolvers/FetchEntityVectorsResolver.js +2 -1
  186. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  187. package/dist/resolvers/FileResolver.js +3 -3
  188. package/dist/resolvers/GeoResolver.d.ts +2 -2
  189. package/dist/resolvers/GeoResolver.js +4 -4
  190. package/dist/resolvers/GetDataResolver.d.ts +14 -0
  191. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  192. package/dist/resolvers/GetDataResolver.js +43 -15
  193. package/dist/resolvers/GetDataResolver.js.map +1 -1
  194. package/dist/resolvers/IntegrationDiscoveryResolver.js +2 -2
  195. package/dist/resolvers/ListOperationsResolver.d.ts +20 -0
  196. package/dist/resolvers/ListOperationsResolver.d.ts.map +1 -1
  197. package/dist/resolvers/ListOperationsResolver.js +68 -28
  198. package/dist/resolvers/ListOperationsResolver.js.map +1 -1
  199. package/dist/resolvers/MCPResolver.d.ts +11 -1
  200. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  201. package/dist/resolvers/MCPResolver.js +7 -3
  202. package/dist/resolvers/MCPResolver.js.map +1 -1
  203. package/dist/resolvers/MergeRecordsResolver.d.ts +7 -0
  204. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  205. package/dist/resolvers/MergeRecordsResolver.js +16 -2
  206. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  207. package/dist/resolvers/RealtimeBridgeResolver.js +3 -3
  208. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +44 -6
  209. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  210. package/dist/resolvers/RealtimeClientSessionResolver.js +93 -37
  211. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  212. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -5
  213. package/dist/resolvers/RunAIAgentResolver.d.ts +8 -18
  214. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  215. package/dist/resolvers/RunAIAgentResolver.js +85 -184
  216. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  217. package/dist/resolvers/RunAIPromptResolver.d.ts +1 -1
  218. package/dist/resolvers/RunAIPromptResolver.js +2 -2
  219. package/dist/resolvers/RunDecisionResolver.d.ts +149 -0
  220. package/dist/resolvers/RunDecisionResolver.d.ts.map +1 -0
  221. package/dist/resolvers/RunDecisionResolver.js +396 -0
  222. package/dist/resolvers/RunDecisionResolver.js.map +1 -0
  223. package/dist/resolvers/RunTestResolver.js +5 -5
  224. package/dist/resolvers/SqlLoggingConfigResolver.d.ts +8 -4
  225. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  226. package/dist/resolvers/SqlLoggingConfigResolver.js +5 -5
  227. package/dist/resolvers/TaskGraphFrameResolver.d.ts +8 -1
  228. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  229. package/dist/resolvers/TaskGraphFrameResolver.js +6 -2
  230. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  231. package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
  232. package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
  233. package/dist/resolvers/VectorizeEntityResolver.js +14 -10
  234. package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
  235. package/dist/resolvers/adhoc-query-helpers.d.ts +6 -0
  236. package/dist/resolvers/adhoc-query-helpers.d.ts.map +1 -1
  237. package/dist/resolvers/adhoc-query-helpers.js +10 -2
  238. package/dist/resolvers/adhoc-query-helpers.js.map +1 -1
  239. package/dist/resolvers/artifact-routing.d.ts +8 -8
  240. package/dist/resolvers/artifact-routing.js +2 -2
  241. package/dist/resolvers/artifact-routing.js.map +1 -1
  242. package/dist/resolvers/meetingRecordingRegistration.d.ts +10 -2
  243. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  244. package/dist/resolvers/meetingRecordingRegistration.js +24 -8
  245. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  246. package/dist/resolvers/peaksSidecar.d.ts +4 -0
  247. package/dist/resolvers/peaksSidecar.d.ts.map +1 -1
  248. package/dist/resolvers/peaksSidecar.js +10 -2
  249. package/dist/resolvers/peaksSidecar.js.map +1 -1
  250. package/dist/rest/EntityCRUDHandler.d.ts +28 -0
  251. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  252. package/dist/rest/EntityCRUDHandler.js +20 -4
  253. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  254. package/dist/rest/MediaStreamHandler.d.ts +2 -0
  255. package/dist/rest/MediaStreamHandler.d.ts.map +1 -1
  256. package/dist/rest/MediaStreamHandler.js +10 -6
  257. package/dist/rest/MediaStreamHandler.js.map +1 -1
  258. package/dist/rest/OAuthCallbackHandler.d.ts +9 -0
  259. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  260. package/dist/rest/OAuthCallbackHandler.js +15 -3
  261. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  262. package/dist/rest/RESTEndpointHandler.d.ts +6 -4
  263. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  264. package/dist/rest/RESTEndpointHandler.js +15 -11
  265. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  266. package/dist/rest/RealtimeSdpBrokerHandler.d.ts +5 -1
  267. package/dist/rest/RealtimeSdpBrokerHandler.d.ts.map +1 -1
  268. package/dist/rest/RealtimeSdpBrokerHandler.js +12 -4
  269. package/dist/rest/RealtimeSdpBrokerHandler.js.map +1 -1
  270. package/dist/rest/SignatureWebhookHandler.d.ts +2 -0
  271. package/dist/rest/SignatureWebhookHandler.d.ts.map +1 -1
  272. package/dist/rest/SignatureWebhookHandler.js +5 -1
  273. package/dist/rest/SignatureWebhookHandler.js.map +1 -1
  274. package/dist/rest/UploadTokenManager.d.ts +24 -8
  275. package/dist/rest/UploadTokenManager.d.ts.map +1 -1
  276. package/dist/rest/UploadTokenManager.js +53 -21
  277. package/dist/rest/UploadTokenManager.js.map +1 -1
  278. package/dist/rest/ViewOperationsHandler.d.ts +20 -0
  279. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  280. package/dist/rest/ViewOperationsHandler.js +20 -4
  281. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  282. package/dist/rest/mediaRange.d.ts +4 -0
  283. package/dist/rest/mediaRange.d.ts.map +1 -1
  284. package/dist/rest/mediaRange.js +10 -2
  285. package/dist/rest/mediaRange.js.map +1 -1
  286. package/dist/rest/setupRESTEndpoints.d.ts +4 -0
  287. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  288. package/dist/rest/setupRESTEndpoints.js +13 -7
  289. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  290. package/dist/serverExtensionReservedRoots.d.ts +2 -0
  291. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  292. package/dist/serverExtensionReservedRoots.js +5 -1
  293. package/dist/serverExtensionReservedRoots.js.map +1 -1
  294. package/dist/services/TaskGraphActionRunner.d.ts +13 -8
  295. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  296. package/dist/services/TaskGraphActionRunner.js +16 -15
  297. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  298. package/dist/types.d.ts +2 -0
  299. package/dist/types.d.ts.map +1 -1
  300. package/dist/types.js +7 -3
  301. package/dist/types.js.map +1 -1
  302. package/dist/util.d.ts +6 -0
  303. package/dist/util.d.ts.map +1 -1
  304. package/dist/util.js +13 -5
  305. package/dist/util.js.map +1 -1
  306. package/package.json +94 -92
  307. package/src/__tests__/AgentRunStatusPublisher.test.ts +175 -0
  308. package/src/__tests__/DeleteOptionsInput.wireShape.test.ts +62 -0
  309. package/src/__tests__/DuplicateEntryCheckResolver.test.ts +300 -0
  310. package/src/__tests__/FileResolverPeaks.test.ts +13 -13
  311. package/src/__tests__/ListOperationsResolver.test.ts +17 -17
  312. package/src/__tests__/MediaStreamHandler.test.ts +28 -28
  313. package/src/__tests__/NoLog.test.ts +11 -11
  314. package/src/__tests__/PrimaryKeyAlwaysMapped.test.ts +10 -10
  315. package/src/__tests__/RESTEndpointHandler.test.ts +14 -14
  316. package/src/__tests__/RealtimeBridgeResolver.test.ts +4 -2
  317. package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
  318. package/src/__tests__/RealtimeSdpBrokerHandler.test.ts +6 -6
  319. package/src/__tests__/RefreshAdoptsNewColumns.test.ts +8 -8
  320. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +7 -1
  321. package/src/__tests__/RemoteBrowserAudioStream.test.ts +7 -1
  322. package/src/__tests__/RemoteBrowserGoalEngine.test.ts +18 -18
  323. package/src/__tests__/RemoteBrowserSnapshot.test.ts +7 -1
  324. package/src/__tests__/ResolverBase.clientOldValues.test.ts +52 -0
  325. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +398 -0
  326. package/src/__tests__/RunAIAgentResolver.streaming.test.ts +18 -27
  327. package/src/__tests__/RunDecisionResolver.test.ts +699 -0
  328. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +131 -0
  329. package/src/__tests__/TaskGraphFrameResolver.test.ts +2 -2
  330. package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
  331. package/src/__tests__/WidgetSessionService.test.ts +8 -4
  332. package/src/__tests__/adhoc-query-helpers.test.ts +21 -21
  333. package/src/__tests__/bootAudit.test.ts +11 -11
  334. package/src/__tests__/boundaryLogPayload.test.ts +6 -6
  335. package/src/__tests__/cacheInvalidationRecordData.test.ts +177 -0
  336. package/src/__tests__/conversationRunEvents.test.ts +399 -0
  337. package/src/__tests__/databaseAbstraction.test.ts +12 -6
  338. package/src/__tests__/getDataTokenRedaction.test.ts +7 -7
  339. package/src/__tests__/initializeProviders.refresh.test.ts +4 -4
  340. package/src/__tests__/magicLink.test.ts +73 -134
  341. package/src/__tests__/magicLinkService.consume.test.ts +224 -0
  342. package/src/__tests__/meetingRecordingRegistration.test.ts +12 -12
  343. package/src/__tests__/metadataRefreshSignal.test.ts +78 -0
  344. package/src/__tests__/multiTenancy.security.test.ts +40 -40
  345. package/src/__tests__/multiTenancy.test.ts +18 -18
  346. package/src/__tests__/newUsers.test.ts +24 -23
  347. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +283 -0
  348. package/src/__tests__/principals.test.ts +22 -22
  349. package/src/__tests__/pushStatusFanOut.test.ts +206 -0
  350. package/src/__tests__/pushStatusResolver.filter.test.ts +8 -8
  351. package/src/__tests__/secretRedactor.failOpen.test.ts +12 -12
  352. package/src/__tests__/secretRedactor.test.ts +12 -12
  353. package/src/__tests__/serverExtensionReservedRoots.test.ts +7 -7
  354. package/src/__tests__/subscriptionRedaction.test.ts +5 -5
  355. package/src/__tests__/unifiedAuth.test.ts +15 -9
  356. package/src/__tests__/visitorIdentity.resolve.test.ts +6 -6
  357. package/src/__tests__/widget.test.ts +45 -45
  358. package/src/__tests__/widgetGuestElevation.test.ts +7 -7
  359. package/src/__tests__/widgetHostIdentity.test.ts +14 -14
  360. package/src/agentSessions/ReturningVisitorRecap.ts +12 -1
  361. package/src/agentSessions/SessionManager.ts +2 -2
  362. package/src/agentSessions/remoteBrowserGoalEngine.ts +30 -5
  363. package/src/auth/AuthProviderCatalogRouter.ts +6 -1
  364. package/src/auth/__tests__/backward-compatibility.test.ts +4 -3
  365. package/src/auth/index.ts +43 -28
  366. package/src/auth/initializeProviders.ts +25 -5
  367. package/src/auth/magicLink/MagicLinkRouter.ts +28 -10
  368. package/src/auth/magicLink/MagicLinkService.ts +71 -52
  369. package/src/auth/magicLink/index.ts +7 -7
  370. package/src/auth/magicLink/magicLinkCore.ts +96 -64
  371. package/src/auth/magicLink/redeemLanding.ts +14 -4
  372. package/src/auth/magicLink/types.ts +54 -54
  373. package/src/auth/newUsers.ts +1 -1
  374. package/src/auth/principals.ts +11 -2
  375. package/src/cache.ts +4 -1
  376. package/src/config.ts +37 -4
  377. package/src/context.ts +37 -24
  378. package/src/directives/Public.ts +4 -1
  379. package/src/directives/RequireSystemUser.ts +4 -1
  380. package/src/generated/graphql-schemas/__mj.ts +3674 -4
  381. package/src/generic/CacheInvalidationResolver.ts +148 -4
  382. package/src/generic/DeleteOptionsInput.ts +9 -2
  383. package/src/generic/FireAndForgetHeartbeat.ts +35 -16
  384. package/src/generic/OrphanedConversationDetailReconciler.ts +267 -0
  385. package/src/generic/PushStatusResolver.ts +118 -8
  386. package/src/generic/ResolverBase.ts +65 -57
  387. package/src/generic/RunViewResolver.ts +22 -22
  388. package/src/generic/__tests__/FireAndForgetHeartbeat.test.ts +7 -7
  389. package/src/index.ts +137 -11
  390. package/src/integration/CustomColumnPromoter.ts +6 -1
  391. package/src/integration/EntityMapLifecycle.ts +20 -2
  392. package/src/logging/NoLog.ts +16 -2
  393. package/src/logging/StartupLogger.ts +6 -1
  394. package/src/logging/bootAudit.ts +26 -16
  395. package/src/logging/boundaryLogPayload.ts +8 -1
  396. package/src/logging/secretRedactor.ts +14 -9
  397. package/src/logging/shortenForLog.ts +8 -3
  398. package/src/logging/variablesLoggingMiddleware.ts +9 -6
  399. package/src/metadataRefreshSignal.ts +45 -0
  400. package/src/middleware/MJTenantFilterMiddleware.ts +4 -4
  401. package/src/multiTenancy/index.ts +29 -5
  402. package/src/realtimeWidget/WidgetRouter.ts +15 -10
  403. package/src/realtimeWidget/WidgetSessionService.ts +76 -76
  404. package/src/realtimeWidget/host-identity.ts +24 -10
  405. package/src/realtimeWidget/index.ts +3 -3
  406. package/src/realtimeWidget/visitorIdentity.ts +39 -8
  407. package/src/realtimeWidget/widgetCore.ts +75 -10
  408. package/src/realtimeWidget/widgetGuestElevation.ts +25 -12
  409. package/src/resolvers/AdhocQueryResolver.ts +3 -3
  410. package/src/resolvers/AgentRunStatusPublisher.ts +175 -0
  411. package/src/resolvers/AgentSessionResolver.ts +3 -3
  412. package/src/resolvers/ColorResolver.ts +6 -6
  413. package/src/resolvers/ComponentRegistryResolver.ts +36 -36
  414. package/src/resolvers/ConversationRunEventsResolver.ts +308 -0
  415. package/src/resolvers/DuplicateEntryCheckResolver.ts +232 -0
  416. package/src/resolvers/EntityCommunicationsResolver.ts +4 -4
  417. package/src/resolvers/ExecuteRemoteOperationResolver.ts +9 -9
  418. package/src/resolvers/FetchEntityVectorsResolver.ts +2 -1
  419. package/src/resolvers/FileResolver.ts +42 -42
  420. package/src/resolvers/GeoResolver.ts +4 -4
  421. package/src/resolvers/GetDataResolver.ts +50 -15
  422. package/src/resolvers/IntegrationDiscoveryResolver.ts +2 -2
  423. package/src/resolvers/ListOperationsResolver.ts +78 -28
  424. package/src/resolvers/MCPResolver.ts +30 -15
  425. package/src/resolvers/MergeRecordsResolver.ts +14 -2
  426. package/src/resolvers/QueryResolver.ts +13 -13
  427. package/src/resolvers/RealtimeBridgeResolver.ts +3 -3
  428. package/src/resolvers/RealtimeClientSessionResolver.ts +96 -38
  429. package/src/resolvers/RemoteBrowserActionResolver.ts +5 -5
  430. package/src/resolvers/RunAIAgentResolver.ts +134 -239
  431. package/src/resolvers/RunAIPromptResolver.ts +22 -22
  432. package/src/resolvers/RunDecisionResolver.ts +435 -0
  433. package/src/resolvers/RunTemplateResolver.ts +4 -4
  434. package/src/resolvers/RunTestResolver.ts +25 -25
  435. package/src/resolvers/SqlLoggingConfigResolver.ts +56 -56
  436. package/src/resolvers/TaskGraphFrameResolver.ts +37 -28
  437. package/src/resolvers/TelemetryResolver.ts +79 -79
  438. package/src/resolvers/VectorizeEntityResolver.ts +16 -11
  439. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +40 -38
  440. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +93 -0
  441. package/src/resolvers/__tests__/artifact-routing.test.ts +23 -23
  442. package/src/resolvers/adhoc-query-helpers.ts +19 -2
  443. package/src/resolvers/artifact-routing.ts +19 -19
  444. package/src/resolvers/meetingRecordingRegistration.ts +44 -10
  445. package/src/resolvers/peaksSidecar.ts +12 -2
  446. package/src/rest/EntityCRUDHandler.ts +24 -4
  447. package/src/rest/MediaStreamHandler.ts +11 -6
  448. package/src/rest/OAuthCallbackHandler.ts +25 -7
  449. package/src/rest/RESTEndpointHandler.ts +20 -15
  450. package/src/rest/RealtimeSdpBrokerHandler.ts +14 -4
  451. package/src/rest/SignatureWebhookHandler.ts +6 -1
  452. package/src/rest/UploadTokenManager.ts +66 -30
  453. package/src/rest/ViewOperationsHandler.ts +24 -4
  454. package/src/rest/mediaRange.ts +16 -6
  455. package/src/rest/setupRESTEndpoints.ts +24 -12
  456. package/src/serverExtensionReservedRoots.ts +6 -1
  457. package/src/services/TaskGraphActionRunner.ts +16 -15
  458. package/src/types.ts +21 -16
  459. package/src/util.ts +16 -6
@@ -4,14 +4,15 @@ import { DatabaseProviderBase, LogError, LogStatus, Metadata, RunView, UserInfo,
4
4
  import { MJConversationDetailEntity, MJConversationDetailAttachmentEntity, MJConversationDetailArtifactEntity, MJArtifactVersionEntity, MJAIAgentRequestEntity, ArtifactMetadataEngine, ConversationEngine } from '@memberjunction/core-entities';
5
5
  import { RouteArtifact } from './artifact-routing.js';
6
6
  import { AgentRunner, ArtifactToolManager } from '@memberjunction/ai-agents';
7
- import { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended, ExecuteAgentResult, ConversationUtility, AttachmentData, AgentExecutionStreamingCallback } from '@memberjunction/ai-core-plus';
7
+ import { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended, ExecuteAgentResult, ConversationUtility, AttachmentData } from '@memberjunction/ai-core-plus';
8
8
  import { AIEngine } from '@memberjunction/aiengine';
9
9
  import { ChatMessage, ChatMessageContent } from '@memberjunction/ai';
10
10
  import { ResolverBase } from '../generic/ResolverBase.js';
11
- import { startLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
11
+ import { AgentRunStatusPublisher } from './AgentRunStatusPublisher.js';
12
+ import { StartLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
12
13
  import { RequireSystemUser } from '../directives/RequireSystemUser.js';
13
14
  import { GetReadWriteProvider } from '../util.js';
14
- import { resolveWidgetGuestRunContext, elevateUserPayload } from '../realtimeWidget/widgetGuestElevation.js';
15
+ import { ResolveWidgetGuestRunContext, ElevateUserPayload } from '../realtimeWidget/widgetGuestElevation.js';
15
16
  import { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';
16
17
  import { GetAttachmentService } from '@memberjunction/aiengine';
17
18
  import { NotificationEngine } from '@memberjunction/notifications';
@@ -25,58 +26,63 @@ import { NotificationEngine } from '@memberjunction/notifications';
25
26
  */
26
27
  const INLINE_SIZE_CAP = 100 * 1024;
27
28
 
29
+ /** Progress metadata is an untyped bag. A run is an object that carries an ID field. */
30
+ function isAgentRunEntity(value: unknown): value is MJAIAgentRunEntityExtended {
31
+ return typeof value === 'object' && value !== null && 'ID' in value;
32
+ }
33
+
28
34
  @ObjectType()
29
35
  export class AIAgentRunResult {
30
36
  @Field()
31
- success: boolean;
37
+ success: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
32
38
 
33
39
  @Field({ nullable: true })
34
- errorMessage?: string;
40
+ errorMessage?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
35
41
 
36
42
  @Field({ nullable: true })
37
- executionTimeMs?: number;
43
+ executionTimeMs?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
38
44
 
39
45
  @Field()
40
- result: string; // JSON serialized ExecuteAgentResult with scalars only
46
+ result: string; // JSON serialized ExecuteAgentResult with scalars only — case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
41
47
  }
42
48
 
43
49
  @ObjectType()
44
50
  export class AgentExecutionProgress {
45
51
  @Field()
46
- currentStep: string;
52
+ currentStep: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
47
53
 
48
54
  @Field({ nullable: true })
49
- percentage?: number;
55
+ percentage?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
50
56
 
51
57
  @Field()
52
- message: string;
58
+ message: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
53
59
 
54
60
  @Field({ nullable: true })
55
- agentName?: string;
61
+ agentName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
56
62
 
57
63
  @Field({ nullable: true })
58
- agentType?: string;
64
+ agentType?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
59
65
 
60
66
  @Field({ nullable: true })
61
- stepCount?: number;
67
+ stepCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
62
68
 
63
69
  @Field({ nullable: true })
64
- hierarchicalStep?: string;
70
+ hierarchicalStep?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
65
71
  }
66
72
 
67
73
  @ObjectType()
68
74
  export class AgentStreamingContent {
69
75
  @Field()
70
- content: string;
76
+ content: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
71
77
 
72
78
  @Field()
73
- isPartial: boolean;
79
+ isPartial: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
74
80
 
75
81
  @Field({ nullable: true })
76
- stepName?: string;
82
+ stepName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
77
83
 
78
84
  @Field({ nullable: true })
79
- agentName?: string;
85
+ agentName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
80
86
 
81
87
  /**
82
88
  * Content discriminator passed through from the agent's streaming chunk (see
@@ -87,73 +93,73 @@ export class AgentStreamingContent {
87
93
  * rendered by the conversation client.
88
94
  */
89
95
  @Field({ nullable: true })
90
- kind?: string;
96
+ kind?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
91
97
  }
92
98
 
93
99
  @ObjectType()
94
100
  export class AgentExecutionStepSummary {
95
101
  @Field()
96
- stepId: string;
102
+ stepId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
97
103
 
98
104
  @Field()
99
- stepName: string;
105
+ stepName: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
100
106
 
101
107
  @Field({ nullable: true })
102
- agentName?: string;
108
+ agentName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
103
109
 
104
110
  @Field({ nullable: true })
105
- agentType?: string;
111
+ agentType?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
106
112
 
107
113
  @Field()
108
- startTime: Date;
114
+ startTime: Date; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
109
115
 
110
116
  @Field({ nullable: true })
111
- endTime?: Date;
117
+ endTime?: Date; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
112
118
 
113
119
  @Field()
114
- status: string;
120
+ status: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
115
121
 
116
122
  @Field({ nullable: true })
117
- result?: string;
123
+ result?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
118
124
  }
119
125
 
120
126
  @ObjectType()
121
127
  export class AgentPartialResult {
122
128
  @Field()
123
- currentStep: string;
129
+ currentStep: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
124
130
 
125
131
  @Field({ nullable: true })
126
- partialOutput?: string;
132
+ partialOutput?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
127
133
  }
128
134
 
129
135
  @ObjectType()
130
136
  export class AgentExecutionStreamMessage {
131
137
  @Field(() => ID)
132
- sessionId: string;
138
+ sessionId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
133
139
 
134
140
  @Field(() => ID)
135
- agentRunId: string;
141
+ agentRunId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
136
142
 
137
143
  @Field()
138
- type: 'progress' | 'streaming' | 'partial_result' | 'complete';
144
+ type: 'progress' | 'streaming' | 'partial_result' | 'complete'; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
139
145
 
140
146
  @Field({ nullable: true })
141
- progress?: AgentExecutionProgress;
147
+ progress?: AgentExecutionProgress; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
142
148
 
143
149
  @Field({ nullable: true })
144
- streaming?: AgentStreamingContent;
150
+ streaming?: AgentStreamingContent; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
145
151
 
146
152
  @Field({ nullable: true })
147
- partialResult?: AgentPartialResult;
153
+ partialResult?: AgentPartialResult; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
148
154
 
149
155
  @Field()
150
- timestamp: Date;
156
+ timestamp: Date; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
151
157
 
152
158
  // Not a GraphQL field - used internally for streaming
153
- agentRun?: any;
159
+ agentRun?: any; // case-violation-ok-legacy-back-compat: an accessor cannot be optional, so a stub would turn this into a required member
154
160
 
155
161
  // Not a GraphQL field - used for completion routing to correct conversation detail
156
- conversationDetailId?: string;
162
+ conversationDetailId?: string; // case-violation-ok-legacy-back-compat: an accessor cannot be optional, so a stub would turn this into a required member
157
163
  }
158
164
 
159
165
 
@@ -249,111 +255,6 @@ export class RunAIAgentResolver extends ResolverBase {
249
255
  return agentEntity;
250
256
  }
251
257
 
252
- /**
253
- * Create streaming progress callback
254
- */
255
- private createProgressCallback(pubSub: PubSubEngine, sessionId: string, userPayload: UserPayload, agentRunRef: { current: any }) {
256
- return (progress: any) => {
257
- // Capture the agent run into the ref as soon as any progress event carries it (even
258
- // "noise" steps), so the fire-and-forget liveness pulse can read its id/status mid-run
259
- // rather than only after RunAgentInConversation returns.
260
- if (progress.metadata?.agentRun) {
261
- agentRunRef.current = progress.metadata.agentRun;
262
- }
263
-
264
- // Only publish progress for significant steps (not initialization noise)
265
- const significantSteps = ['prompt_execution', 'action_execution', 'subagent_execution', 'decision_processing'];
266
- if (!significantSteps.includes(progress.step)) {
267
- console.log(`🔇 Skipping noise progress: ${progress.step}`);
268
- return;
269
- }
270
-
271
- // Get the agent run from the progress metadata or use the ref
272
- const agentRun = progress.metadata?.agentRun || agentRunRef.current;
273
- if (!agentRun) {
274
- console.error('❌ No agent run available for progress callback');
275
- return;
276
- }
277
-
278
- console.log('📡 Publishing progress update:', {
279
- step: progress.step,
280
- percentage: progress.percentage,
281
- message: progress.message,
282
- sessionId,
283
- agentRunId: agentRun.ID
284
- });
285
-
286
- // Publish progress updates with the full serialized agent run
287
- const progressMsg: AgentExecutionStreamMessage = {
288
- sessionId,
289
- agentRunId: agentRun.ID,
290
- type: 'progress',
291
- agentRun: agentRun.GetAll(), // Serialize the full agent run
292
- progress: {
293
- currentStep: progress.step,
294
- percentage: progress.percentage,
295
- message: progress.message,
296
- agentName: (progress.metadata as any)?.agentName || undefined,
297
- agentType: (progress.metadata as any)?.agentType || undefined,
298
- stepCount: (progress.metadata as any)?.stepCount || undefined,
299
- hierarchicalStep: (progress.metadata as any)?.hierarchicalStep || undefined
300
- },
301
- timestamp: new Date()
302
- };
303
- this.PublishProgressUpdate(pubSub, progressMsg, userPayload);
304
- };
305
- }
306
-
307
- private PublishProgressUpdate(pubSub: PubSubEngine, data: any, userPayload: UserPayload) {
308
- this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
309
- resolver: 'RunAIAgentResolver',
310
- type: 'ExecutionProgress',
311
- status: 'ok',
312
- data,
313
- }), userPayload);
314
- }
315
-
316
-
317
- private PublishStreamingUpdate(pubSub: PubSubEngine, data: any, userPayload: UserPayload) {
318
- this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
319
- resolver: 'RunAIAgentResolver',
320
- type: 'StreamingContent',
321
- status: 'ok',
322
- data,
323
- }), userPayload);
324
- }
325
-
326
- /**
327
- * Create streaming content callback
328
- */
329
- private createStreamingCallback(pubSub: PubSubEngine, sessionId: string, userPayload: UserPayload, agentRunRef: { current: MJAIAgentRunEntityExtended | null }): AgentExecutionStreamingCallback {
330
- return (chunk) => {
331
- // Use the agent run from the ref
332
- const agentRun = agentRunRef.current;
333
- if (!agentRun) {
334
- console.error('❌ No agent run available for streaming callback');
335
- return;
336
- }
337
-
338
- // Publish streaming content with the full serialized agent run
339
- const streamMsg: AgentExecutionStreamMessage = {
340
- sessionId,
341
- agentRunId: agentRun.ID,
342
- type: 'streaming',
343
- agentRun: agentRun.GetAll(), // Include the full serialized agent run
344
- streaming: {
345
- content: chunk.content,
346
- isPartial: !chunk.isComplete,
347
- stepName: chunk.stepType,
348
- agentName: chunk.modelName,
349
- kind: chunk.kind
350
- },
351
- timestamp: new Date()
352
- };
353
- this.PublishStreamingUpdate(pubSub, streamMsg, userPayload);
354
- };
355
- }
356
-
357
258
  /**
358
259
  * Internal method that handles the core AI agent execution logic.
359
260
  * This method is called by both the regular and system user resolvers.
@@ -389,7 +290,10 @@ export class RunAIAgentResolver extends ResolverBase {
389
290
  * The framework intersects them with the agent's accepted skills AND the user's Run permission. */
390
291
  requestedSkillIDs?: string[],
391
292
  /** JSON `{ paused?: boolean }` — seeds `$.debug` on a submitted task graph at insert. */
392
- taskGraphDebug?: string
293
+ taskGraphDebug?: string,
294
+ /** History floor for a conversation run — threaded into ExecuteAgentParams.ConversationHistoryFrom,
295
+ * so the framework's own conversation reads (retrieval tools, artifacts, compaction) honour it too. */
296
+ conversationHistoryFrom?: Date
393
297
  ): Promise<AIAgentRunResult> {
394
298
  const startTime = Date.now();
395
299
  // Best-effort handle for persistInFlightAgentFailure. Populated from a
@@ -431,6 +335,11 @@ export class RunAIAgentResolver extends ResolverBase {
431
335
 
432
336
  console.log(`🚀 Starting agent execution with sessionId: ${sessionId}`);
433
337
 
338
+ // The publisher owns every status message. The resolver still copies the run into
339
+ // agentRunRef, including noise steps, for the fire-and-forget liveness pulse.
340
+ const statusPublisher = new AgentRunStatusPublisher(pubSub, userPayload, sessionId);
341
+ const publishProgress = statusPublisher.OnProgress;
342
+
434
343
  // Execute the agent in conversation context - handles conversation, artifacts, etc.
435
344
  const conversationResult = await agentRunner.RunAgentInConversation({
436
345
  agent: agentEntity,
@@ -438,14 +347,21 @@ export class RunAIAgentResolver extends ResolverBase {
438
347
  payload: payload ? SafeJSONParse(payload) : undefined,
439
348
  contextUser: currentUser,
440
349
  sessionID: sessionId,
441
- onProgress: this.createProgressCallback(pubSub, sessionId, userPayload, agentRunRef),
442
- onStreaming: this.createStreamingCallback(pubSub, sessionId, userPayload, agentRunRef),
350
+ onProgress: (progress) => {
351
+ const fromEvent = progress.metadata?.agentRun;
352
+ if (isAgentRunEntity(fromEvent)) {
353
+ agentRunRef.current = fromEvent;
354
+ }
355
+ publishProgress(progress);
356
+ },
357
+ onStreaming: statusPublisher.OnStreaming,
443
358
  lastRunId: lastRunId,
444
359
  autoPopulateLastRunPayload: autoPopulateLastRunPayload,
445
360
  configurationId: configurationId,
446
361
  planMode: planMode,
447
362
  requestedSkillIDs: requestedSkillIDs,
448
363
  taskGraphDebug: parseTaskGraphDebug(taskGraphDebug),
364
+ ConversationHistoryFrom: conversationHistoryFrom,
449
365
  data: parsedData,
450
366
  context: {
451
367
  dataSource: dataSource
@@ -522,7 +438,7 @@ export class RunAIAgentResolver extends ResolverBase {
522
438
  const returnResult = JSON.stringify(sanitizedResult);
523
439
 
524
440
  // Publish final events with enriched result data for fire-and-forget clients
525
- this.publishFinalEvents(pubSub, sessionId, userPayload, result, returnResult);
441
+ statusPublisher.PublishFinal(result, result.agentRun?.ConversationDetailID, returnResult);
526
442
 
527
443
  // Log completion
528
444
  if (result.success) {
@@ -598,7 +514,10 @@ export class RunAIAgentResolver extends ResolverBase {
598
514
  detail.Message = errorMessage;
599
515
  detail.Error = errorMessage;
600
516
  if (!(await detail.Save())) {
601
- LogError(`Failed to persist Error on conversation detail ${conversationDetailId}`);
517
+ LogError(
518
+ `Failed to persist Error on conversation detail ${conversationDetailId}: ` +
519
+ `${detail.LatestResult?.CompleteMessage?.trim() || 'no failure detail recorded'}`,
520
+ );
602
521
  }
603
522
  }
604
523
  }
@@ -607,58 +526,6 @@ export class RunAIAgentResolver extends ResolverBase {
607
526
  }
608
527
  }
609
528
 
610
- /**
611
- * Publish final streaming events (partial result and completion).
612
- * The completion event includes the full result JSON so clients using
613
- * fire-and-forget mode can receive the result via WebSocket.
614
- */
615
- private publishFinalEvents(
616
- pubSub: PubSubEngine,
617
- sessionId: string,
618
- userPayload: UserPayload,
619
- result: ExecuteAgentResult,
620
- resultJson?: string
621
- ) {
622
- if (result.agentRun) {
623
- // Get the last step from agent run
624
- let lastStep = 'Completed';
625
- if (result.agentRun?.Steps && result.agentRun.Steps.length > 0) {
626
- // Get the last step from the Steps array
627
- const lastStepEntity = result.agentRun.Steps[result.agentRun.Steps.length - 1];
628
- lastStep = lastStepEntity?.StepName || 'Completed';
629
- }
630
-
631
- // Publish partial result
632
- const partialResult: AgentPartialResult = {
633
- currentStep: lastStep,
634
- partialOutput: result.payload || undefined
635
- };
636
-
637
- const partialMsg: AgentExecutionStreamMessage = {
638
- sessionId,
639
- agentRunId: result.agentRun.ID,
640
- type: 'partial_result',
641
- partialResult,
642
- timestamp: new Date()
643
- };
644
- this.PublishStreamingUpdate(pubSub, partialMsg, userPayload);
645
- }
646
-
647
- // Publish completion with conversationDetailId for client-side routing.
648
- // Include result data so fire-and-forget clients can receive the full result via WebSocket.
649
- const completionData: Record<string, unknown> = {
650
- sessionId,
651
- agentRunId: result.agentRun?.ID || 'unknown',
652
- type: 'complete',
653
- timestamp: new Date(),
654
- conversationDetailId: result.agentRun?.ConversationDetailID,
655
- success: result.success,
656
- errorMessage: result.agentRun?.ErrorMessage || undefined,
657
- result: resultJson || undefined
658
- };
659
- this.PublishStreamingUpdate(pubSub, completionData, userPayload);
660
- }
661
-
662
529
  /**
663
530
  * Public mutation for regular users to run AI agents with authentication.
664
531
  * Supports fire-and-forget mode to avoid Azure proxy timeouts on long-running agent executions.
@@ -1017,7 +884,13 @@ export class RunAIAgentResolver extends ResolverBase {
1017
884
  @Arg('sourceArtifactVersionId', { nullable: true }) sourceArtifactVersionId?: string,
1018
885
  @Arg('fireAndForget', { nullable: true }) fireAndForget?: boolean,
1019
886
  @Arg('planMode', { nullable: true }) planMode?: boolean,
1020
- @Arg('requestedSkillIDs', () => [String], { nullable: true }) requestedSkillIDs?: string[]
887
+ @Arg('requestedSkillIDs', () => [String], { nullable: true }) requestedSkillIDs?: string[],
888
+ /** History floor: an ISO-8601 timestamp, the first moment of the conversation this run may
889
+ * read. The history is loaded from there and no summary of earlier messages is used, and the
890
+ * run's own conversation reads honour it too. Omitted (clients send it only when set, so an
891
+ * older client never does), the run reads the whole conversation as before. An unreadable
892
+ * value fails the request rather than being dropped. */
893
+ @Arg('agentHistoryFrom', { nullable: true }) agentHistoryFrom?: string
1021
894
  ): Promise<AIAgentRunResult> {
1022
895
  // Check API key scope authorization for agent execution
1023
896
  await this.CheckAPIKeyScopeAuthorization('agent:execute', agentId, userPayload);
@@ -1040,11 +913,14 @@ export class RunAIAgentResolver extends ResolverBase {
1040
913
  // Conversation OWNERSHIP is still enforced under the guest principal below: the guest loads its
1041
914
  // own ConversationDetail through the Widget Guest RLS filters, so a detail id from another
1042
915
  // session resolves to "not found" before any elevated work happens.
1043
- const widgetElevation = await resolveWidgetGuestRunContext(userPayload, p);
1044
- const effectiveAgentId = widgetElevation ? widgetElevation.pinnedAgentId : agentId;
1045
- const effectiveUserPayload = widgetElevation ? elevateUserPayload(userPayload, widgetElevation.elevatedUser) : userPayload;
916
+ const widgetElevation = await ResolveWidgetGuestRunContext(userPayload, p);
917
+ const effectiveAgentId = widgetElevation ? widgetElevation.PinnedAgentId : agentId;
918
+ const effectiveUserPayload = widgetElevation ? ElevateUserPayload(userPayload, widgetElevation.ElevatedUser) : userPayload;
1046
919
 
1047
920
  try {
921
+ // Parsed before anything loads: a floor the caller asked for must never be dropped.
922
+ const historyFrom = parseAgentHistoryFrom(agentHistoryFrom);
923
+
1048
924
  // LATENCY OPTIMIZATION (Opt #2 + #3): Load ConversationDetail once here to extract
1049
925
  // conversationId, then pass it downstream. Previously this record was loaded multiple
1050
926
  // times: once in loadConversationHistoryWithAttachments (just to get conversationId),
@@ -1067,7 +943,8 @@ export class RunAIAgentResolver extends ResolverBase {
1067
943
  p,
1068
944
  // The UI creates the agent-response placeholder row ('⏳ ...') before invoking
1069
945
  // this mutation — exclude it so the model never sees an empty assistant turn.
1070
- [conversationDetailId]
946
+ [conversationDetailId],
947
+ historyFrom
1071
948
  );
1072
949
 
1073
950
  // Convert to JSON string for the existing executeAIAgent method
@@ -1080,7 +957,9 @@ export class RunAIAgentResolver extends ResolverBase {
1080
957
  p, dataSource, effectiveAgentId, effectiveUserPayload, messagesJson, sessionId, pubSub,
1081
958
  data, payload, lastRunId, autoPopulateLastRunPayload, configurationId,
1082
959
  conversationDetailId, createArtifacts || false, createNotification || false,
1083
- sourceArtifactId, sourceArtifactVersionId, conversationId, planMode, requestedSkillIDs
960
+ sourceArtifactId, sourceArtifactVersionId, conversationId, planMode, requestedSkillIDs,
961
+ undefined, // taskGraphDebug
962
+ historyFrom
1084
963
  );
1085
964
 
1086
965
  LogStatus(`🔥 Fire-and-forget: Agent ${effectiveAgentId} execution started in background for session ${sessionId}`);
@@ -1114,7 +993,9 @@ export class RunAIAgentResolver extends ResolverBase {
1114
993
  conversationId, // LATENCY OPT #2: pass pre-resolved conversationId
1115
994
  undefined, // runRef
1116
995
  planMode,
1117
- requestedSkillIDs
996
+ requestedSkillIDs,
997
+ undefined, // taskGraphDebug
998
+ historyFrom
1118
999
  );
1119
1000
  } catch (error) {
1120
1001
  const errorMessage = (error as Error).message || 'Unknown error loading conversation history';
@@ -1334,11 +1215,13 @@ export class RunAIAgentResolver extends ResolverBase {
1334
1215
  planMode?: boolean,
1335
1216
  /** Skill IDs the user requested — threaded through to ExecuteAgentParams.requestedSkillIDs. */
1336
1217
  requestedSkillIDs?: string[],
1337
- taskGraphDebug?: string
1218
+ taskGraphDebug?: string,
1219
+ /** History floor — threaded through to ExecuteAgentParams.ConversationHistoryFrom. */
1220
+ conversationHistoryFrom?: Date
1338
1221
  ): void {
1339
1222
  // Ref the liveness pulse reads to enrich heartbeats once the run is created.
1340
1223
  const runRef: { current: MJAIAgentRunEntityExtended | null } = { current: null };
1341
- const pulse = startLivenessPulse({
1224
+ const pulse = StartLivenessPulse({
1342
1225
  pubSub,
1343
1226
  sessionId,
1344
1227
  ownerUserId: userPayload.userRecord.ID,
@@ -1353,26 +1236,18 @@ export class RunAIAgentResolver extends ResolverBase {
1353
1236
  p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub,
1354
1237
  data, payload, undefined, lastRunId, autoPopulateLastRunPayload,
1355
1238
  configurationId, conversationDetailId, createArtifacts, createNotification,
1356
- sourceArtifactId, sourceArtifactVersionId, conversationId, runRef, planMode, requestedSkillIDs, taskGraphDebug
1239
+ sourceArtifactId, sourceArtifactVersionId, conversationId, runRef, planMode, requestedSkillIDs, taskGraphDebug,
1240
+ conversationHistoryFrom
1357
1241
  ).catch((error: unknown) => {
1358
1242
  // Background execution failed unexpectedly (executeAIAgent has its own try-catch,
1359
1243
  // so this would only fire for truly unexpected errors).
1360
1244
  const errorMessage = (error instanceof Error) ? error.message : 'Unknown background execution error';
1361
1245
  LogError(`🔥 Fire-and-forget background execution failed: ${errorMessage}`, undefined, error);
1362
1246
 
1363
- // Publish error completion event so the client knows the agent failed
1364
- const errorCompletionData: Record<string, unknown> = {
1365
- sessionId,
1366
- agentRunId: 'unknown',
1367
- type: 'complete',
1368
- timestamp: new Date(),
1369
- conversationDetailId,
1370
- success: false,
1371
- errorMessage,
1372
- result: JSON.stringify({ success: false, errorMessage })
1373
- };
1374
- this.PublishStreamingUpdate(pubSub, errorCompletionData, userPayload);
1375
- }).finally(() => pulse.stop());
1247
+ // Publish error completion event so the client knows the agent failed.
1248
+ // The publisher is created inside executeAIAgent, which rejected before returning one.
1249
+ new AgentRunStatusPublisher(pubSub, userPayload, sessionId).PublishFailure(conversationDetailId, errorMessage);
1250
+ }).finally(() => pulse.Stop());
1376
1251
  }
1377
1252
 
1378
1253
  /**
@@ -1389,7 +1264,7 @@ export class RunAIAgentResolver extends ResolverBase {
1389
1264
  *
1390
1265
  * Opt #8: Switched from ResultType 'entity_object' to 'simple' with explicit Fields.
1391
1266
  * The history query only needs the window-assembly fields (ConversationWindowFields:
1392
- * ID, Sequence, Role, Message, SummaryOfEarlierConversation) from each
1267
+ * ID, Sequence, Role, Message, SummaryOfEarlierConversation, __mj_CreatedAt) from each
1393
1268
  * ConversationDetail record. Using 'entity_object' created full BaseEntity instances
1394
1269
  * with getters/setters, dirty tracking, and validation — none of which are needed for
1395
1270
  * read-only history assembly. The 'simple' result type returns plain JS objects,
@@ -1400,13 +1275,15 @@ export class RunAIAgentResolver extends ResolverBase {
1400
1275
  contextUser: UserInfo,
1401
1276
  maxMessages: number,
1402
1277
  provider: IMetadataProvider,
1403
- excludeDetailIds?: string[]
1278
+ excludeDetailIds?: string[],
1279
+ /** History floor: only rows written at or after it are loaded, and no summary is used. */
1280
+ historyFrom?: Date
1404
1281
  ): Promise<ChatMessage[]> {
1405
1282
  // Context windowing (summary boundary + raw tail, or legacy last-N when no
1406
1283
  // summary exists) shares ONE fold implementation with all other callers —
1407
1284
  // ConversationEngine.AssembleContextWindow — and the ROWS come from the
1408
1285
  // single-sourced fresh-per-request loader (same one the compaction pass uses).
1409
- // Three deliberate properties vs. the engine's cached GetAgentContextWindow:
1286
+ // Four deliberate properties vs. the engine's cached GetAgentContextWindow:
1410
1287
  // 1. Entity RLS applies (the engine path loads via a stored query with no
1411
1288
  // row-level security — wrong for guest/widget-scoped users), and the
1412
1289
  // process-global per-conversation cache — keyed by conversation, not user —
@@ -1415,10 +1292,13 @@ export class RunAIAgentResolver extends ResolverBase {
1415
1292
  // cross-server staleness (a warm cache misses rows written by other nodes).
1416
1293
  // 3. Load failure THROWS → the mutation fails, instead of silently running
1417
1294
  // the agent against zero history.
1418
- const rows = await ConversationEngine.LoadWindowRowsFresh(conversationId, contextUser, provider);
1295
+ // 4. A history floor (`historyFrom`) is applied in the query, so rows before it never
1296
+ // leave the database, and again in the assembly, which then skips the summary.
1297
+ const rows = await ConversationEngine.LoadWindowRowsFresh(conversationId, contextUser, provider, historyFrom);
1419
1298
  const window = ConversationEngine.AssembleContextWindow(rows, {
1420
1299
  maxTailMessages: maxMessages,
1421
- excludeDetailIds
1300
+ excludeDetailIds,
1301
+ historyFrom
1422
1302
  });
1423
1303
 
1424
1304
  // Batch load input artifacts for the windowed messages. Since the backfill migration
@@ -1477,20 +1357,20 @@ export class RunAIAgentResolver extends ResolverBase {
1477
1357
  const artifactType = ArtifactMetadataEngine.Instance.GetArtifactTypeByMimeType(artifactMime, ext);
1478
1358
 
1479
1359
  const decision = RouteArtifact({
1480
- typeDefault: artifactType?.DefaultDeliveryMode ?? 'ToolsOnly',
1481
- forceToolsOnly: artifactVersion.ForceToolsOnly,
1360
+ TypeDefault: artifactType?.DefaultDeliveryMode ?? 'ToolsOnly',
1361
+ ForceToolsOnly: artifactVersion.ForceToolsOnly,
1482
1362
  mimeType: artifactMime,
1483
- sizeBytes: artifactVersion.ContentSizeBytes ?? 0,
1484
- inlineSizeCap: INLINE_SIZE_CAP,
1485
- modelSupportsModality: () => true,
1486
- modelName: '<resolver>',
1487
- artifactTypeName: artifactType?.Name ?? artifactMime,
1363
+ SizeBytes: artifactVersion.ContentSizeBytes ?? 0,
1364
+ InlineSizeCap: INLINE_SIZE_CAP,
1365
+ ModelSupportsModality: () => true,
1366
+ ModelName: '<resolver>',
1367
+ ArtifactTypeName: artifactType?.Name ?? artifactMime,
1488
1368
  });
1489
1369
 
1490
1370
  if (artifactVersion.ContentMode === 'File' && artifactVersion.FileID) {
1491
1371
  if (decision.delivery !== 'inline') {
1492
- if (decision.delivery === 'tools' && decision.annotation) {
1493
- LogStatus(`[RunAIAgentResolver] ${decision.annotation}`);
1372
+ if (decision.delivery === 'tools' && decision.Annotation) {
1373
+ LogStatus(`[RunAIAgentResolver] ${decision.Annotation}`);
1494
1374
  }
1495
1375
  continue;
1496
1376
  }
@@ -1508,8 +1388,8 @@ export class RunAIAgentResolver extends ResolverBase {
1508
1388
  // Text-mode artifact (ContentMode = 'Text'). Honor the
1509
1389
  // routing decision the same way as for file-mode.
1510
1390
  if (decision.delivery !== 'inline') {
1511
- if (decision.delivery === 'tools' && decision.annotation) {
1512
- LogStatus(`[RunAIAgentResolver] ${decision.annotation}`);
1391
+ if (decision.delivery === 'tools' && decision.Annotation) {
1392
+ LogStatus(`[RunAIAgentResolver] ${decision.Annotation}`);
1513
1393
  }
1514
1394
  continue;
1515
1395
  }
@@ -1648,6 +1528,21 @@ export class RunAIAgentResolver extends ResolverBase {
1648
1528
 
1649
1529
  }
1650
1530
 
1531
+ /**
1532
+ * Reads the `agentHistoryFrom` argument of `RunAIAgentFromConversationDetail`: an ISO-8601
1533
+ * timestamp. Absent means no floor. A value that is present but not a timestamp throws — a
1534
+ * floor the caller asked for must fail the request, never be dropped, since dropping it lets
1535
+ * the run read the history it was meant to keep out.
1536
+ */
1537
+ function parseAgentHistoryFrom(raw?: string | null): Date | undefined {
1538
+ if (raw == null) return undefined;
1539
+ const parsed = new Date(raw);
1540
+ if (Number.isNaN(parsed.getTime())) {
1541
+ throw new Error(`agentHistoryFrom must be an ISO-8601 timestamp; received "${raw}"`);
1542
+ }
1543
+ return parsed;
1544
+ }
1545
+
1651
1546
  function parseTaskGraphDebug(raw?: string): { paused?: boolean } | undefined {
1652
1547
  if (!raw) return undefined;
1653
1548
  const parsed: unknown = SafeJSONParse(raw);