@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
@@ -18,10 +18,11 @@ import { AgentRunner, ArtifactToolManager } from '@memberjunction/ai-agents';
18
18
  import { ConversationUtility } from '@memberjunction/ai-core-plus';
19
19
  import { AIEngine } from '@memberjunction/aiengine';
20
20
  import { ResolverBase } from '../generic/ResolverBase.js';
21
- import { startLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
21
+ import { AgentRunStatusPublisher } from './AgentRunStatusPublisher.js';
22
+ import { StartLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
22
23
  import { RequireSystemUser } from '../directives/RequireSystemUser.js';
23
24
  import { GetReadWriteProvider } from '../util.js';
24
- import { resolveWidgetGuestRunContext, elevateUserPayload } from '../realtimeWidget/widgetGuestElevation.js';
25
+ import { ResolveWidgetGuestRunContext, ElevateUserPayload } from '../realtimeWidget/widgetGuestElevation.js';
25
26
  import { SafeJSONParse, UUIDsEqual } from '@memberjunction/global';
26
27
  import { GetAttachmentService } from '@memberjunction/aiengine';
27
28
  import { NotificationEngine } from '@memberjunction/notifications';
@@ -33,6 +34,10 @@ import { NotificationEngine } from '@memberjunction/notifications';
33
34
  * pre-existing per-call MAX_INLINE_ARTIFACT_CHARS / maxInlineChars constants.
34
35
  */
35
36
  const INLINE_SIZE_CAP = 100 * 1024;
37
+ /** Progress metadata is an untyped bag. A run is an object that carries an ID field. */
38
+ function isAgentRunEntity(value) {
39
+ return typeof value === 'object' && value !== null && 'ID' in value;
40
+ }
36
41
  let AIAgentRunResult = class AIAgentRunResult {
37
42
  };
38
43
  __decorate([
@@ -277,101 +282,6 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
277
282
  }
278
283
  return agentEntity;
279
284
  }
280
- /**
281
- * Create streaming progress callback
282
- */
283
- createProgressCallback(pubSub, sessionId, userPayload, agentRunRef) {
284
- return (progress) => {
285
- // Capture the agent run into the ref as soon as any progress event carries it (even
286
- // "noise" steps), so the fire-and-forget liveness pulse can read its id/status mid-run
287
- // rather than only after RunAgentInConversation returns.
288
- if (progress.metadata?.agentRun) {
289
- agentRunRef.current = progress.metadata.agentRun;
290
- }
291
- // Only publish progress for significant steps (not initialization noise)
292
- const significantSteps = ['prompt_execution', 'action_execution', 'subagent_execution', 'decision_processing'];
293
- if (!significantSteps.includes(progress.step)) {
294
- console.log(`🔇 Skipping noise progress: ${progress.step}`);
295
- return;
296
- }
297
- // Get the agent run from the progress metadata or use the ref
298
- const agentRun = progress.metadata?.agentRun || agentRunRef.current;
299
- if (!agentRun) {
300
- console.error('❌ No agent run available for progress callback');
301
- return;
302
- }
303
- console.log('📡 Publishing progress update:', {
304
- step: progress.step,
305
- percentage: progress.percentage,
306
- message: progress.message,
307
- sessionId,
308
- agentRunId: agentRun.ID
309
- });
310
- // Publish progress updates with the full serialized agent run
311
- const progressMsg = {
312
- sessionId,
313
- agentRunId: agentRun.ID,
314
- type: 'progress',
315
- agentRun: agentRun.GetAll(), // Serialize the full agent run
316
- progress: {
317
- currentStep: progress.step,
318
- percentage: progress.percentage,
319
- message: progress.message,
320
- agentName: progress.metadata?.agentName || undefined,
321
- agentType: progress.metadata?.agentType || undefined,
322
- stepCount: progress.metadata?.stepCount || undefined,
323
- hierarchicalStep: progress.metadata?.hierarchicalStep || undefined
324
- },
325
- timestamp: new Date()
326
- };
327
- this.PublishProgressUpdate(pubSub, progressMsg, userPayload);
328
- };
329
- }
330
- PublishProgressUpdate(pubSub, data, userPayload) {
331
- this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
332
- resolver: 'RunAIAgentResolver',
333
- type: 'ExecutionProgress',
334
- status: 'ok',
335
- data,
336
- }), userPayload);
337
- }
338
- PublishStreamingUpdate(pubSub, data, userPayload) {
339
- this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
340
- resolver: 'RunAIAgentResolver',
341
- type: 'StreamingContent',
342
- status: 'ok',
343
- data,
344
- }), userPayload);
345
- }
346
- /**
347
- * Create streaming content callback
348
- */
349
- createStreamingCallback(pubSub, sessionId, userPayload, agentRunRef) {
350
- return (chunk) => {
351
- // Use the agent run from the ref
352
- const agentRun = agentRunRef.current;
353
- if (!agentRun) {
354
- console.error('❌ No agent run available for streaming callback');
355
- return;
356
- }
357
- // Publish streaming content with the full serialized agent run
358
- const streamMsg = {
359
- sessionId,
360
- agentRunId: agentRun.ID,
361
- type: 'streaming',
362
- agentRun: agentRun.GetAll(), // Include the full serialized agent run
363
- streaming: {
364
- content: chunk.content,
365
- isPartial: !chunk.isComplete,
366
- stepName: chunk.stepType,
367
- agentName: chunk.modelName,
368
- kind: chunk.kind
369
- },
370
- timestamp: new Date()
371
- };
372
- this.PublishStreamingUpdate(pubSub, streamMsg, userPayload);
373
- };
374
- }
375
285
  /**
376
286
  * Internal method that handles the core AI agent execution logic.
377
287
  * This method is called by both the regular and system user resolvers.
@@ -389,7 +299,10 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
389
299
  * The framework intersects them with the agent's accepted skills AND the user's Run permission. */
390
300
  requestedSkillIDs,
391
301
  /** JSON `{ paused?: boolean }` — seeds `$.debug` on a submitted task graph at insert. */
392
- taskGraphDebug) {
302
+ taskGraphDebug,
303
+ /** History floor for a conversation run — threaded into ExecuteAgentParams.ConversationHistoryFrom,
304
+ * so the framework's own conversation reads (retrieval tools, artifacts, compaction) honour it too. */
305
+ conversationHistoryFrom) {
393
306
  const startTime = Date.now();
394
307
  // Best-effort handle for persistInFlightAgentFailure. Populated from a
395
308
  // progress event carrying metadata.agentRun, or from the successful
@@ -421,6 +334,10 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
421
334
  // singleton's transaction state with concurrent requests (e.g. conversation deletes).
422
335
  const agentRunner = new AgentRunner(p);
423
336
  console.log(`🚀 Starting agent execution with sessionId: ${sessionId}`);
337
+ // The publisher owns every status message. The resolver still copies the run into
338
+ // agentRunRef, including noise steps, for the fire-and-forget liveness pulse.
339
+ const statusPublisher = new AgentRunStatusPublisher(pubSub, userPayload, sessionId);
340
+ const publishProgress = statusPublisher.OnProgress;
424
341
  // Execute the agent in conversation context - handles conversation, artifacts, etc.
425
342
  const conversationResult = await agentRunner.RunAgentInConversation({
426
343
  agent: agentEntity,
@@ -428,14 +345,21 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
428
345
  payload: payload ? SafeJSONParse(payload) : undefined,
429
346
  contextUser: currentUser,
430
347
  sessionID: sessionId,
431
- onProgress: this.createProgressCallback(pubSub, sessionId, userPayload, agentRunRef),
432
- onStreaming: this.createStreamingCallback(pubSub, sessionId, userPayload, agentRunRef),
348
+ onProgress: (progress) => {
349
+ const fromEvent = progress.metadata?.agentRun;
350
+ if (isAgentRunEntity(fromEvent)) {
351
+ agentRunRef.current = fromEvent;
352
+ }
353
+ publishProgress(progress);
354
+ },
355
+ onStreaming: statusPublisher.OnStreaming,
433
356
  lastRunId: lastRunId,
434
357
  autoPopulateLastRunPayload: autoPopulateLastRunPayload,
435
358
  configurationId: configurationId,
436
359
  planMode: planMode,
437
360
  requestedSkillIDs: requestedSkillIDs,
438
361
  taskGraphDebug: parseTaskGraphDebug(taskGraphDebug),
362
+ ConversationHistoryFrom: conversationHistoryFrom,
439
363
  data: parsedData,
440
364
  context: {
441
365
  dataSource: dataSource
@@ -488,7 +412,7 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
488
412
  const sanitizedResult = this.sanitizeAgentResult(result);
489
413
  const returnResult = JSON.stringify(sanitizedResult);
490
414
  // Publish final events with enriched result data for fire-and-forget clients
491
- this.publishFinalEvents(pubSub, sessionId, userPayload, result, returnResult);
415
+ statusPublisher.PublishFinal(result, result.agentRun?.ConversationDetailID, returnResult);
492
416
  // Log completion
493
417
  if (result.success) {
494
418
  LogStatus(`=== AI AGENT RUN COMPLETED FOR: ${agentEntity.Name} (${executionTime}ms) ===`);
@@ -550,7 +474,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
550
474
  detail.Message = errorMessage;
551
475
  detail.Error = errorMessage;
552
476
  if (!(await detail.Save())) {
553
- LogError(`Failed to persist Error on conversation detail ${conversationDetailId}`);
477
+ LogError(`Failed to persist Error on conversation detail ${conversationDetailId}: ` +
478
+ `${detail.LatestResult?.CompleteMessage?.trim() || 'no failure detail recorded'}`);
554
479
  }
555
480
  }
556
481
  }
@@ -559,48 +484,6 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
559
484
  LogError(`persistInFlightAgentFailure failed: ${persistError}`, undefined, persistError);
560
485
  }
561
486
  }
562
- /**
563
- * Publish final streaming events (partial result and completion).
564
- * The completion event includes the full result JSON so clients using
565
- * fire-and-forget mode can receive the result via WebSocket.
566
- */
567
- publishFinalEvents(pubSub, sessionId, userPayload, result, resultJson) {
568
- if (result.agentRun) {
569
- // Get the last step from agent run
570
- let lastStep = 'Completed';
571
- if (result.agentRun?.Steps && result.agentRun.Steps.length > 0) {
572
- // Get the last step from the Steps array
573
- const lastStepEntity = result.agentRun.Steps[result.agentRun.Steps.length - 1];
574
- lastStep = lastStepEntity?.StepName || 'Completed';
575
- }
576
- // Publish partial result
577
- const partialResult = {
578
- currentStep: lastStep,
579
- partialOutput: result.payload || undefined
580
- };
581
- const partialMsg = {
582
- sessionId,
583
- agentRunId: result.agentRun.ID,
584
- type: 'partial_result',
585
- partialResult,
586
- timestamp: new Date()
587
- };
588
- this.PublishStreamingUpdate(pubSub, partialMsg, userPayload);
589
- }
590
- // Publish completion with conversationDetailId for client-side routing.
591
- // Include result data so fire-and-forget clients can receive the full result via WebSocket.
592
- const completionData = {
593
- sessionId,
594
- agentRunId: result.agentRun?.ID || 'unknown',
595
- type: 'complete',
596
- timestamp: new Date(),
597
- conversationDetailId: result.agentRun?.ConversationDetailID,
598
- success: result.success,
599
- errorMessage: result.agentRun?.ErrorMessage || undefined,
600
- result: resultJson || undefined
601
- };
602
- this.PublishStreamingUpdate(pubSub, completionData, userPayload);
603
- }
604
487
  /**
605
488
  * Public mutation for regular users to run AI agents with authentication.
606
489
  * Supports fire-and-forget mode to avoid Azure proxy timeouts on long-running agent executions.
@@ -808,7 +691,7 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
808
691
  * @param agentId - The agent to execute
809
692
  * @param maxHistoryMessages - Maximum number of history messages to include (default: 20)
810
693
  */
811
- async RunAIAgentFromConversationDetail(conversationDetailId, agentId, { userPayload, providers, dataSource }, sessionId, pubSub, maxHistoryMessages, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, createArtifacts, createNotification, sourceArtifactId, sourceArtifactVersionId, fireAndForget, planMode, requestedSkillIDs) {
694
+ async RunAIAgentFromConversationDetail(conversationDetailId, agentId, { userPayload, providers, dataSource }, sessionId, pubSub, maxHistoryMessages, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, createArtifacts, createNotification, sourceArtifactId, sourceArtifactVersionId, fireAndForget, planMode, requestedSkillIDs, agentHistoryFrom) {
812
695
  // Check API key scope authorization for agent execution
813
696
  await this.CheckAPIKeyScopeAuthorization('agent:execute', agentId, userPayload);
814
697
  const p = GetReadWriteProvider(providers);
@@ -827,10 +710,12 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
827
710
  // Conversation OWNERSHIP is still enforced under the guest principal below: the guest loads its
828
711
  // own ConversationDetail through the Widget Guest RLS filters, so a detail id from another
829
712
  // session resolves to "not found" before any elevated work happens.
830
- const widgetElevation = await resolveWidgetGuestRunContext(userPayload, p);
831
- const effectiveAgentId = widgetElevation ? widgetElevation.pinnedAgentId : agentId;
832
- const effectiveUserPayload = widgetElevation ? elevateUserPayload(userPayload, widgetElevation.elevatedUser) : userPayload;
713
+ const widgetElevation = await ResolveWidgetGuestRunContext(userPayload, p);
714
+ const effectiveAgentId = widgetElevation ? widgetElevation.PinnedAgentId : agentId;
715
+ const effectiveUserPayload = widgetElevation ? ElevateUserPayload(userPayload, widgetElevation.ElevatedUser) : userPayload;
833
716
  try {
717
+ // Parsed before anything loads: a floor the caller asked for must never be dropped.
718
+ const historyFrom = parseAgentHistoryFrom(agentHistoryFrom);
834
719
  // LATENCY OPTIMIZATION (Opt #2 + #3): Load ConversationDetail once here to extract
835
720
  // conversationId, then pass it downstream. Previously this record was loaded multiple
836
721
  // times: once in loadConversationHistoryWithAttachments (just to get conversationId),
@@ -845,13 +730,14 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
845
730
  const messages = await this.loadConversationHistoryWithAttachments(conversationId, currentUser, maxHistoryMessages || 20, p,
846
731
  // The UI creates the agent-response placeholder row ('⏳ ...') before invoking
847
732
  // this mutation — exclude it so the model never sees an empty assistant turn.
848
- [conversationDetailId]);
733
+ [conversationDetailId], historyFrom);
849
734
  // Convert to JSON string for the existing executeAIAgent method
850
735
  const messagesJson = JSON.stringify(messages);
851
736
  if (fireAndForget) {
852
737
  // Fire-and-forget mode: start execution in background, return immediately.
853
738
  // The client will receive the result via WebSocket PubSub completion event.
854
- this.executeAgentInBackground(p, dataSource, effectiveAgentId, effectiveUserPayload, messagesJson, sessionId, pubSub, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, conversationId, planMode, requestedSkillIDs);
739
+ this.executeAgentInBackground(p, dataSource, effectiveAgentId, effectiveUserPayload, messagesJson, sessionId, pubSub, data, payload, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, conversationId, planMode, requestedSkillIDs, undefined, // taskGraphDebug
740
+ historyFrom);
855
741
  LogStatus(`🔥 Fire-and-forget: Agent ${effectiveAgentId} execution started in background for session ${sessionId}`);
856
742
  return {
857
743
  success: true,
@@ -862,7 +748,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
862
748
  return this.executeAIAgent(p, dataSource, effectiveAgentId, effectiveUserPayload, messagesJson, sessionId, pubSub, data, payload, undefined, // templateData
863
749
  lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts || false, createNotification || false, sourceArtifactId, sourceArtifactVersionId, conversationId, // LATENCY OPT #2: pass pre-resolved conversationId
864
750
  undefined, // runRef
865
- planMode, requestedSkillIDs);
751
+ planMode, requestedSkillIDs, undefined, // taskGraphDebug
752
+ historyFrom);
866
753
  }
867
754
  catch (error) {
868
755
  const errorMessage = error.message || 'Unknown error loading conversation history';
@@ -1028,10 +915,12 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
1028
915
  /** Per-request Plan Mode toggle — threaded through to ExecuteAgentParams.planMode. */
1029
916
  planMode,
1030
917
  /** Skill IDs the user requested — threaded through to ExecuteAgentParams.requestedSkillIDs. */
1031
- requestedSkillIDs, taskGraphDebug) {
918
+ requestedSkillIDs, taskGraphDebug,
919
+ /** History floor — threaded through to ExecuteAgentParams.ConversationHistoryFrom. */
920
+ conversationHistoryFrom) {
1032
921
  // Ref the liveness pulse reads to enrich heartbeats once the run is created.
1033
922
  const runRef = { current: null };
1034
- const pulse = startLivenessPulse({
923
+ const pulse = StartLivenessPulse({
1035
924
  pubSub,
1036
925
  sessionId,
1037
926
  ownerUserId: userPayload.userRecord.ID,
@@ -1041,24 +930,15 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
1041
930
  : undefined,
1042
931
  });
1043
932
  // Execute in background - errors are handled within, not propagated
1044
- this.executeAIAgent(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, undefined, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts, createNotification, sourceArtifactId, sourceArtifactVersionId, conversationId, runRef, planMode, requestedSkillIDs, taskGraphDebug).catch((error) => {
933
+ this.executeAIAgent(p, dataSource, agentId, userPayload, messagesJson, sessionId, pubSub, data, payload, undefined, lastRunId, autoPopulateLastRunPayload, configurationId, conversationDetailId, createArtifacts, createNotification, sourceArtifactId, sourceArtifactVersionId, conversationId, runRef, planMode, requestedSkillIDs, taskGraphDebug, conversationHistoryFrom).catch((error) => {
1045
934
  // Background execution failed unexpectedly (executeAIAgent has its own try-catch,
1046
935
  // so this would only fire for truly unexpected errors).
1047
936
  const errorMessage = (error instanceof Error) ? error.message : 'Unknown background execution error';
1048
937
  LogError(`🔥 Fire-and-forget background execution failed: ${errorMessage}`, undefined, error);
1049
- // Publish error completion event so the client knows the agent failed
1050
- const errorCompletionData = {
1051
- sessionId,
1052
- agentRunId: 'unknown',
1053
- type: 'complete',
1054
- timestamp: new Date(),
1055
- conversationDetailId,
1056
- success: false,
1057
- errorMessage,
1058
- result: JSON.stringify({ success: false, errorMessage })
1059
- };
1060
- this.PublishStreamingUpdate(pubSub, errorCompletionData, userPayload);
1061
- }).finally(() => pulse.stop());
938
+ // Publish error completion event so the client knows the agent failed.
939
+ // The publisher is created inside executeAIAgent, which rejected before returning one.
940
+ new AgentRunStatusPublisher(pubSub, userPayload, sessionId).PublishFailure(conversationDetailId, errorMessage);
941
+ }).finally(() => pulse.Stop());
1062
942
  }
1063
943
  /**
1064
944
  * Load conversation history with attachments from database.
@@ -1074,18 +954,20 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
1074
954
  *
1075
955
  * Opt #8: Switched from ResultType 'entity_object' to 'simple' with explicit Fields.
1076
956
  * The history query only needs the window-assembly fields (ConversationWindowFields:
1077
- * ID, Sequence, Role, Message, SummaryOfEarlierConversation) from each
957
+ * ID, Sequence, Role, Message, SummaryOfEarlierConversation, __mj_CreatedAt) from each
1078
958
  * ConversationDetail record. Using 'entity_object' created full BaseEntity instances
1079
959
  * with getters/setters, dirty tracking, and validation — none of which are needed for
1080
960
  * read-only history assembly. The 'simple' result type returns plain JS objects,
1081
961
  * reducing per-record overhead (~30ms total savings).
1082
962
  */
1083
- async loadConversationHistoryWithAttachments(conversationId, contextUser, maxMessages, provider, excludeDetailIds) {
963
+ async loadConversationHistoryWithAttachments(conversationId, contextUser, maxMessages, provider, excludeDetailIds,
964
+ /** History floor: only rows written at or after it are loaded, and no summary is used. */
965
+ historyFrom) {
1084
966
  // Context windowing (summary boundary + raw tail, or legacy last-N when no
1085
967
  // summary exists) shares ONE fold implementation with all other callers —
1086
968
  // ConversationEngine.AssembleContextWindow — and the ROWS come from the
1087
969
  // single-sourced fresh-per-request loader (same one the compaction pass uses).
1088
- // Three deliberate properties vs. the engine's cached GetAgentContextWindow:
970
+ // Four deliberate properties vs. the engine's cached GetAgentContextWindow:
1089
971
  // 1. Entity RLS applies (the engine path loads via a stored query with no
1090
972
  // row-level security — wrong for guest/widget-scoped users), and the
1091
973
  // process-global per-conversation cache — keyed by conversation, not user —
@@ -1094,10 +976,13 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
1094
976
  // cross-server staleness (a warm cache misses rows written by other nodes).
1095
977
  // 3. Load failure THROWS → the mutation fails, instead of silently running
1096
978
  // the agent against zero history.
1097
- const rows = await ConversationEngine.LoadWindowRowsFresh(conversationId, contextUser, provider);
979
+ // 4. A history floor (`historyFrom`) is applied in the query, so rows before it never
980
+ // leave the database, and again in the assembly, which then skips the summary.
981
+ const rows = await ConversationEngine.LoadWindowRowsFresh(conversationId, contextUser, provider, historyFrom);
1098
982
  const window = ConversationEngine.AssembleContextWindow(rows, {
1099
983
  maxTailMessages: maxMessages,
1100
- excludeDetailIds
984
+ excludeDetailIds,
985
+ historyFrom
1101
986
  });
1102
987
  // Batch load input artifacts for the windowed messages. Since the backfill migration
1103
988
  // (V202605271400__Backfill_Attachment_Artifacts) converted all legacy
@@ -1144,19 +1029,19 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
1144
1029
  const ext = fileName.includes('.') ? fileName.split('.').pop() : undefined;
1145
1030
  const artifactType = ArtifactMetadataEngine.Instance.GetArtifactTypeByMimeType(artifactMime, ext);
1146
1031
  const decision = RouteArtifact({
1147
- typeDefault: artifactType?.DefaultDeliveryMode ?? 'ToolsOnly',
1148
- forceToolsOnly: artifactVersion.ForceToolsOnly,
1032
+ TypeDefault: artifactType?.DefaultDeliveryMode ?? 'ToolsOnly',
1033
+ ForceToolsOnly: artifactVersion.ForceToolsOnly,
1149
1034
  mimeType: artifactMime,
1150
- sizeBytes: artifactVersion.ContentSizeBytes ?? 0,
1151
- inlineSizeCap: INLINE_SIZE_CAP,
1152
- modelSupportsModality: () => true,
1153
- modelName: '<resolver>',
1154
- artifactTypeName: artifactType?.Name ?? artifactMime,
1035
+ SizeBytes: artifactVersion.ContentSizeBytes ?? 0,
1036
+ InlineSizeCap: INLINE_SIZE_CAP,
1037
+ ModelSupportsModality: () => true,
1038
+ ModelName: '<resolver>',
1039
+ ArtifactTypeName: artifactType?.Name ?? artifactMime,
1155
1040
  });
1156
1041
  if (artifactVersion.ContentMode === 'File' && artifactVersion.FileID) {
1157
1042
  if (decision.delivery !== 'inline') {
1158
- if (decision.delivery === 'tools' && decision.annotation) {
1159
- LogStatus(`[RunAIAgentResolver] ${decision.annotation}`);
1043
+ if (decision.delivery === 'tools' && decision.Annotation) {
1044
+ LogStatus(`[RunAIAgentResolver] ${decision.Annotation}`);
1160
1045
  }
1161
1046
  continue;
1162
1047
  }
@@ -1175,8 +1060,8 @@ let RunAIAgentResolver = class RunAIAgentResolver extends ResolverBase {
1175
1060
  // Text-mode artifact (ContentMode = 'Text'). Honor the
1176
1061
  // routing decision the same way as for file-mode.
1177
1062
  if (decision.delivery !== 'inline') {
1178
- if (decision.delivery === 'tools' && decision.annotation) {
1179
- LogStatus(`[RunAIAgentResolver] ${decision.annotation}`);
1063
+ if (decision.delivery === 'tools' && decision.Annotation) {
1064
+ LogStatus(`[RunAIAgentResolver] ${decision.Annotation}`);
1180
1065
  }
1181
1066
  continue;
1182
1067
  }
@@ -1365,8 +1250,9 @@ __decorate([
1365
1250
  __param(15, Arg('fireAndForget', { nullable: true })),
1366
1251
  __param(16, Arg('planMode', { nullable: true })),
1367
1252
  __param(17, Arg('requestedSkillIDs', () => [String], { nullable: true })),
1253
+ __param(18, Arg('agentHistoryFrom', { nullable: true })),
1368
1254
  __metadata("design:type", Function),
1369
- __metadata("design:paramtypes", [String, String, Object, String, PubSubEngine, Number, String, String, String, Boolean, String, Boolean, Boolean, String, String, Boolean, Boolean, Array]),
1255
+ __metadata("design:paramtypes", [String, String, Object, String, PubSubEngine, Number, String, String, String, Boolean, String, Boolean, Boolean, String, String, Boolean, Boolean, Array, String]),
1370
1256
  __metadata("design:returntype", Promise)
1371
1257
  ], RunAIAgentResolver.prototype, "RunAIAgentFromConversationDetail", null);
1372
1258
  __decorate([
@@ -1395,6 +1281,21 @@ RunAIAgentResolver = __decorate([
1395
1281
  Resolver()
1396
1282
  ], RunAIAgentResolver);
1397
1283
  export { RunAIAgentResolver };
1284
+ /**
1285
+ * Reads the `agentHistoryFrom` argument of `RunAIAgentFromConversationDetail`: an ISO-8601
1286
+ * timestamp. Absent means no floor. A value that is present but not a timestamp throws — a
1287
+ * floor the caller asked for must fail the request, never be dropped, since dropping it lets
1288
+ * the run read the history it was meant to keep out.
1289
+ */
1290
+ function parseAgentHistoryFrom(raw) {
1291
+ if (raw == null)
1292
+ return undefined;
1293
+ const parsed = new Date(raw);
1294
+ if (Number.isNaN(parsed.getTime())) {
1295
+ throw new Error(`agentHistoryFrom must be an ISO-8601 timestamp; received "${raw}"`);
1296
+ }
1297
+ return parsed;
1298
+ }
1398
1299
  function parseTaskGraphDebug(raw) {
1399
1300
  if (!raw)
1400
1301
  return undefined;