@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
@@ -12,7 +12,7 @@
12
12
  * @module @memberjunction/server/widget
13
13
  */
14
14
 
15
- import { buildSessionClaims } from '../auth/magicLink/magicLinkCore.js';
15
+ import { BuildSessionClaims } from '../auth/magicLink/magicLinkCore.js';
16
16
  import type { MagicLinkJWTClaims } from '../auth/magicLink/types.js';
17
17
 
18
18
  /**
@@ -46,7 +46,7 @@ export interface WidgetInstanceEligibilityInput {
46
46
  * comma-separated string (tolerated). Returns an empty array for null/blank/garbage
47
47
  * — which makes the allowlist FAIL-CLOSED (no origin is allowed) by construction.
48
48
  */
49
- export function parseAllowedOrigins(allowedOrigins: string | null | undefined): string[] {
49
+ export function ParseAllowedOrigins(allowedOrigins: string | null | undefined): string[] {
50
50
  const raw = allowedOrigins?.trim();
51
51
  if (!raw) {
52
52
  return [];
@@ -64,6 +64,11 @@ export function parseAllowedOrigins(allowedOrigins: string | null | undefined):
64
64
  return list.filter((s): s is string => typeof s === 'string').map(normalizeOrigin).filter((s): s is string => !!s);
65
65
  }
66
66
 
67
+ /** @deprecated Use {@link ParseAllowedOrigins}. */
68
+ export function parseAllowedOrigins(allowedOrigins: string | null | undefined): string[] {
69
+ return ParseAllowedOrigins(allowedOrigins);
70
+ }
71
+
67
72
  /** Lowercases + trims an origin and strips a trailing slash for stable comparison. */
68
73
  function normalizeOrigin(origin: string): string {
69
74
  return origin.trim().toLowerCase().replace(/\/+$/, '');
@@ -74,7 +79,7 @@ function normalizeOrigin(origin: string): string {
74
79
  * JSON array (preferred, e.g. `["Whiteboard"]`) or a comma-separated string (tolerated). Returns an
75
80
  * empty array for null/blank/garbage — the backwards-compatible default (no channels attached).
76
81
  */
77
- export function parseEnabledChannels(enabledChannels: string | null | undefined): string[] {
82
+ export function ParseEnabledChannels(enabledChannels: string | null | undefined): string[] {
78
83
  const raw = enabledChannels?.trim();
79
84
  if (!raw) {
80
85
  return [];
@@ -89,12 +94,17 @@ export function parseEnabledChannels(enabledChannels: string | null | undefined)
89
94
  }
90
95
  }
91
96
 
97
+ /** @deprecated Use {@link ParseEnabledChannels}. */
98
+ export function parseEnabledChannels(enabledChannels: string | null | undefined): string[] {
99
+ return ParseEnabledChannels(enabledChannels);
100
+ }
101
+
92
102
  /**
93
103
  * FAIL-CLOSED origin check. The request's `Origin` header must exactly match one of
94
104
  * the widget's allowed origins (after normalization). A missing request origin, or
95
105
  * an empty allowlist, is rejected — a public mint endpoint must never accept "*".
96
106
  */
97
- export function isOriginAllowed(requestOrigin: string | null | undefined, allowedOrigins: readonly string[]): boolean {
107
+ export function IsOriginAllowed(requestOrigin: string | null | undefined, allowedOrigins: readonly string[]): boolean {
98
108
  if (!requestOrigin || allowedOrigins.length === 0) {
99
109
  return false;
100
110
  }
@@ -102,8 +112,13 @@ export function isOriginAllowed(requestOrigin: string | null | undefined, allowe
102
112
  return allowedOrigins.some((o) => o === candidate);
103
113
  }
104
114
 
115
+ /** @deprecated Use {@link IsOriginAllowed}. */
116
+ export function isOriginAllowed(requestOrigin: string | null | undefined, allowedOrigins: readonly string[]): boolean {
117
+ return IsOriginAllowed(requestOrigin, allowedOrigins);
118
+ }
119
+
105
120
  /** True when the requested modality (or the widget's default render) is enabled by the instance. */
106
- export function isModalityEnabled(widgetModality: string, requested: 'Text' | 'Voice'): boolean {
121
+ export function IsModalityEnabled(widgetModality: string, requested: 'Text' | 'Voice'): boolean {
107
122
  const m = widgetModality.trim().toLowerCase();
108
123
  if (m === 'both') {
109
124
  return true;
@@ -111,25 +126,38 @@ export function isModalityEnabled(widgetModality: string, requested: 'Text' | 'V
111
126
  return m === requested.toLowerCase();
112
127
  }
113
128
 
129
+ /** @deprecated Use {@link IsModalityEnabled}. */
130
+ export function isModalityEnabled(widgetModality: string, requested: 'Text' | 'Voice'): boolean {
131
+ return IsModalityEnabled(widgetModality, requested);
132
+ }
133
+
114
134
  /**
115
135
  * Pure eligibility check for a mint: the widget must be Active and the request's
116
136
  * origin must be on the allowlist. Returns an error code on the first failure so the
117
137
  * router can map it to a precise HTTP status. Modality is checked separately by the
118
138
  * voice path (W4) since a text mint is always permitted for an enabled widget.
119
139
  */
120
- export function evaluateWidgetMint(
140
+ export function EvaluateWidgetMint(
121
141
  widget: WidgetInstanceEligibilityInput,
122
142
  requestOrigin: string | null | undefined,
123
143
  ): { ok: boolean; errorCode?: WidgetMintErrorCode } {
124
144
  if (widget.Status.trim().toLowerCase() !== 'active') {
125
145
  return { ok: false, errorCode: 'disabled' };
126
146
  }
127
- if (!isOriginAllowed(requestOrigin, parseAllowedOrigins(widget.AllowedOrigins))) {
147
+ if (!IsOriginAllowed(requestOrigin, ParseAllowedOrigins(widget.AllowedOrigins))) {
128
148
  return { ok: false, errorCode: 'origin_not_allowed' };
129
149
  }
130
150
  return { ok: true };
131
151
  }
132
152
 
153
+ /** @deprecated Use {@link EvaluateWidgetMint}. */
154
+ export function evaluateWidgetMint(
155
+ widget: WidgetInstanceEligibilityInput,
156
+ requestOrigin: string | null | undefined,
157
+ ): { ok: boolean; errorCode?: WidgetMintErrorCode } {
158
+ return EvaluateWidgetMint(widget, requestOrigin);
159
+ }
160
+
133
161
  /**
134
162
  * Known automated-client User-Agent substrings (lowercased). A public mint endpoint is a cheap
135
163
  * target for crawlers and scripted abuse; this catches the obvious non-browser callers. It is a
@@ -148,7 +176,7 @@ const BOT_USER_AGENT_MARKERS = [
148
176
  * known automation marker. Deliberately conservative to avoid false positives on real browsers; pair
149
177
  * with the origin allowlist + rate limits, which are the hard controls.
150
178
  */
151
- export function looksLikeBot(userAgent: string | null | undefined): boolean {
179
+ export function LooksLikeBot(userAgent: string | null | undefined): boolean {
152
180
  const ua = (userAgent ?? '').trim().toLowerCase();
153
181
  if (!ua) {
154
182
  return true;
@@ -156,6 +184,11 @@ export function looksLikeBot(userAgent: string | null | undefined): boolean {
156
184
  return BOT_USER_AGENT_MARKERS.some((marker) => ua.includes(marker));
157
185
  }
158
186
 
187
+ /** @deprecated Use {@link LooksLikeBot}. */
188
+ export function looksLikeBot(userAgent: string | null | undefined): boolean {
189
+ return LooksLikeBot(userAgent);
190
+ }
191
+
159
192
  /**
160
193
  * Builds the guest-session JWT claims for a widget visitor. Reuses magic-link's
161
194
  * `buildSessionClaims` (anonymous mode → the shared Anonymous principal + claims-based
@@ -163,7 +196,7 @@ export function looksLikeBot(userAgent: string | null | undefined): boolean {
163
196
  * principal is locked to one widget instance. The role name carried here is the
164
197
  * widget's restricted guest role (D5 backstop).
165
198
  */
166
- export function buildWidgetGuestClaims(args: {
199
+ export function BuildWidgetGuestClaims(args: {
167
200
  issuer: string;
168
201
  audience: string;
169
202
  widgetId: string;
@@ -191,7 +224,7 @@ export function buildWidgetGuestClaims(args: {
191
224
  linkedRecordId?: string;
192
225
  };
193
226
  }): MagicLinkJWTClaims {
194
- const claims = buildSessionClaims({
227
+ const claims = BuildSessionClaims({
195
228
  issuer: args.issuer,
196
229
  audience: args.audience,
197
230
  // No invite row for a direct-mint guest; the opaque session id stands in as the
@@ -229,3 +262,35 @@ export function buildWidgetGuestClaims(args: {
229
262
  }
230
263
  return claims;
231
264
  }
265
+
266
+ /** @deprecated Use {@link BuildWidgetGuestClaims}. */
267
+ export function buildWidgetGuestClaims(args: {
268
+ issuer: string;
269
+ audience: string;
270
+ widgetId: string;
271
+ sessionId: string;
272
+ anonymousEmail: string;
273
+ applicationId: string;
274
+ guestRoleName: string;
275
+ nowSeconds: number;
276
+ ttlSeconds: number;
277
+ /**
278
+ * Host-asserted identity for a `host-identity` session. Its email/name are carried as
279
+ * INFORMATIONAL claims only — the principal-resolving `email`/`sub` remain the shared
280
+ * Anonymous principal, so a host can never escalate a guest into a real account.
281
+ */
282
+ hostIdentity?: { email: string; firstName?: string; lastName?: string };
283
+ /**
284
+ * Returning-visitor anchor + linked identity (RV1/RV2/RV4) carried as claims so the VOICE path
285
+ * (server-created conversation) stamps the same fields the text path stamps client-side. Set only
286
+ * when the widget remembers returning visitors. Omitted ⇒ no returning-visitor claims (default off).
287
+ */
288
+ returningVisitor?: {
289
+ visitorKey?: string;
290
+ lastConversationId?: string;
291
+ linkedEntityId?: string;
292
+ linkedRecordId?: string;
293
+ };
294
+ }): MagicLinkJWTClaims {
295
+ return BuildWidgetGuestClaims(args);
296
+ }
@@ -22,19 +22,19 @@ const WIDGET_ENTITY = 'MJ: Conversation Widget Instances';
22
22
 
23
23
  /**
24
24
  * Resolved elevation context for a widget-guest agent run. Returned only when the request is a
25
- * widget guest; the dispatch resolver runs the agent under {@link WidgetGuestRunContext.elevatedUser}
26
- * with {@link WidgetGuestRunContext.pinnedAgentId} (authoritative), keeping ownership checks under
25
+ * widget guest; the dispatch resolver runs the agent under {@link WidgetGuestRunContext.ElevatedUser}
26
+ * with {@link WidgetGuestRunContext.PinnedAgentId} (authoritative), keeping ownership checks under
27
27
  * the guest principal.
28
28
  */
29
29
  export interface WidgetGuestRunContext {
30
30
  /** The trusted server principal under which the agent run (and its run-entity writes) executes. */
31
- elevatedUser: UserInfo;
31
+ ElevatedUser: UserInfo;
32
32
  /** The widget instance the guest session is bound to (authoritative config). */
33
- widget: MJConversationWidgetInstanceEntity;
33
+ Widget: MJConversationWidgetInstanceEntity;
34
34
  /** The authoritative pinned support agent id — overrides any client-supplied agent id (D5). */
35
- pinnedAgentId: string;
35
+ PinnedAgentId: string;
36
36
  /** The guest's per-session scope id (Conversation.ExternalID), used to validate conversation ownership. */
37
- sessionScopeId?: string;
37
+ SessionScopeId?: string;
38
38
  }
39
39
 
40
40
  /**
@@ -47,7 +47,7 @@ export interface WidgetGuestRunContext {
47
47
  * Never throws: a resolution failure (no system user, widget not found, read error) returns `null`,
48
48
  * so the caller falls back to the normal (guest-principal) path rather than failing the request.
49
49
  */
50
- export async function resolveWidgetGuestRunContext(
50
+ export async function ResolveWidgetGuestRunContext(
51
51
  userPayload: UserPayload,
52
52
  provider: DatabaseProviderBase,
53
53
  ): Promise<WidgetGuestRunContext | null> {
@@ -70,13 +70,21 @@ export async function resolveWidgetGuestRunContext(
70
70
  }
71
71
 
72
72
  return {
73
- elevatedUser,
74
- widget,
75
- pinnedAgentId: widget.PinnedAgentID,
76
- sessionScopeId: guest.MagicLinkScope?.ResourceID,
73
+ ElevatedUser: elevatedUser,
74
+ Widget: widget,
75
+ PinnedAgentId: widget.PinnedAgentID,
76
+ SessionScopeId: guest.MagicLinkScope?.ResourceID,
77
77
  };
78
78
  }
79
79
 
80
+ /** @deprecated Use {@link ResolveWidgetGuestRunContext}. */
81
+ export async function resolveWidgetGuestRunContext(
82
+ userPayload: UserPayload,
83
+ provider: DatabaseProviderBase,
84
+ ): Promise<WidgetGuestRunContext | null> {
85
+ return ResolveWidgetGuestRunContext(userPayload, provider);
86
+ }
87
+
80
88
  /**
81
89
  * Returns the identity a realtime session's AI-RUN-ENTITY work (delegated tool dispatch +
82
90
  * observability run creation/append/finalize) should execute as: the trusted SYSTEM principal when
@@ -123,7 +131,7 @@ export function ResolveScopedAnonymousRunUser(contextUser: UserInfo): UserInfo {
123
131
  * preserving the guest's `sessionId` — so progress/streaming PubSub still routes to the guest's
124
132
  * live websocket, but all AI run-entity writes happen under the trusted server principal.
125
133
  */
126
- export function elevateUserPayload(userPayload: UserPayload, elevatedUser: UserInfo): UserPayload {
134
+ export function ElevateUserPayload(userPayload: UserPayload, elevatedUser: UserInfo): UserPayload {
127
135
  return {
128
136
  ...userPayload,
129
137
  email: elevatedUser.Email,
@@ -132,6 +140,11 @@ export function elevateUserPayload(userPayload: UserPayload, elevatedUser: UserI
132
140
  };
133
141
  }
134
142
 
143
+ /** @deprecated Use {@link ElevateUserPayload}. */
144
+ export function elevateUserPayload(userPayload: UserPayload, elevatedUser: UserInfo): UserPayload {
145
+ return ElevateUserPayload(userPayload, elevatedUser);
146
+ }
147
+
135
148
  /** Loads a single widget instance by id under the elevated principal (read-only). */
136
149
  async function loadWidgetById(
137
150
  widgetId: string,
@@ -7,7 +7,7 @@ import { GetReadOnlyDataSource, GetReadOnlyProvider } from '../util.js';
7
7
  import { ResolverBase } from '../generic/ResolverBase.js';
8
8
  import { IsScopeLimitedPrincipal } from '../auth/scopeLimitedPrincipal.js';
9
9
  import { RunQueryResultType } from './QueryResolver.js';
10
- import { exactTotalFromPage, resolveAdhocTotalRowCount } from './adhoc-query-helpers.js';
10
+ import { ExactTotalFromPage, ResolveAdhocTotalRowCount } from './adhoc-query-helpers.js';
11
11
  import sql from 'mssql';
12
12
 
13
13
  /**
@@ -200,7 +200,7 @@ export class AdhocQueryResolver extends ResolverBase {
200
200
  const recordset = (dataResult.recordset ?? []) as Record<string, unknown>[];
201
201
 
202
202
  // Total already known from the page alone (unpaged, or a short page)? Skip the count.
203
- const exact = exactTotalFromPage(startRow, recordset.length, maxRows);
203
+ const exact = ExactTotalFromPage(startRow, recordset.length, maxRows);
204
204
  if (exact != null || !countSQL) {
205
205
  return { recordset, totalRowCount: exact ?? recordset.length };
206
206
  }
@@ -209,7 +209,7 @@ export class AdhocQueryResolver extends ResolverBase {
209
209
  const lowerBound = startRow + recordset.length;
210
210
  try {
211
211
  const countResult = await this.runSqlWithDeadline<{ TotalRowCount: number }>(ds, countSQL, deadline);
212
- return { recordset, totalRowCount: resolveAdhocTotalRowCount(countResult.recordset, lowerBound) };
212
+ return { recordset, totalRowCount: ResolveAdhocTotalRowCount(countResult.recordset, lowerBound) };
213
213
  } catch (countErr) {
214
214
  const msg = countErr instanceof Error ? countErr.message : String(countErr);
215
215
  LogError(`Ad-hoc query row-count failed; reporting a lower-bound total (${lowerBound}). ${msg}`);
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Publishes one agent run's live status on the caller's session.
3
+ *
4
+ * `RunAIAgentResolver` uses this for every status it sends. A host whose
5
+ * `AgentTurnHandler` answers with an In-Progress reply uses the same publisher,
6
+ * on that caller's session, so the chat follows the turn: significant-step
7
+ * progress, streamed text, the partial result, and the completion. When the
8
+ * turn throws instead of returning a result, call `PublishFailure` with the
9
+ * reply row's id and the error.
10
+ */
11
+ import type { PubSubEngine } from 'type-graphql';
12
+ import type {
13
+ AgentExecutionProgressCallback,
14
+ AgentExecutionStreamingCallback,
15
+ ExecuteAgentResult,
16
+ } from '@memberjunction/ai-core-plus';
17
+ import type { UserPayload } from '../types.js';
18
+ import { PublishStatusUpdate } from '../generic/PushStatusResolver.js';
19
+
20
+ const SIGNIFICANT_STEPS = ['prompt_execution', 'action_execution', 'subagent_execution', 'decision_processing'];
21
+
22
+ /** The run fields the published messages read. Entities and test fakes both satisfy this. */
23
+ interface StatusRun {
24
+ ID?: string;
25
+ ConversationDetailID?: string;
26
+ ErrorMessage?: string;
27
+ Steps?: Array<{ StepName?: string }>;
28
+ GetAll?: () => unknown;
29
+ }
30
+
31
+ export class AgentRunStatusPublisher {
32
+ private run: StatusRun | null = null;
33
+
34
+ /**
35
+ * @param sessionId Session stamped on the message body. Defaults to the payload's session.
36
+ * The push itself is always addressed to `userPayload.sessionId`, matching the resolver.
37
+ */
38
+ constructor(
39
+ private readonly pubSub: PubSubEngine,
40
+ private readonly userPayload: UserPayload,
41
+ private readonly sessionId: string = userPayload.sessionId,
42
+ ) {}
43
+
44
+ /** Latest run observed from a progress event, including steps that are not published. */
45
+ public get AgentRun(): StatusRun | null {
46
+ return this.run;
47
+ }
48
+
49
+ /** AgentRunner's progress callback. Noise steps are kept for {@link AgentRun} and not published. */
50
+ public get OnProgress(): AgentExecutionProgressCallback {
51
+ return (progress) => {
52
+ const fromEvent = progress.metadata?.agentRun as StatusRun | undefined;
53
+ if (fromEvent) {
54
+ this.run = fromEvent;
55
+ }
56
+ if (!SIGNIFICANT_STEPS.includes(progress.step)) {
57
+ return;
58
+ }
59
+ const agentRun = fromEvent || this.run;
60
+ if (!agentRun?.ID) {
61
+ // A host that streams before the first progress event otherwise sees nothing and no reason.
62
+ console.error('❌ No agent run available for progress callback');
63
+ return;
64
+ }
65
+ this.publish('ExecutionProgress', {
66
+ sessionId: this.sessionId,
67
+ agentRunId: agentRun.ID,
68
+ type: 'progress',
69
+ agentRun: agentRun.GetAll ? agentRun.GetAll() : agentRun,
70
+ progress: {
71
+ currentStep: progress.step,
72
+ percentage: progress.percentage,
73
+ message: progress.message,
74
+ agentName: progress.metadata?.agentName,
75
+ agentType: progress.metadata?.agentType,
76
+ stepCount: progress.metadata?.stepCount,
77
+ hierarchicalStep: progress.metadata?.hierarchicalStep,
78
+ },
79
+ timestamp: new Date(),
80
+ });
81
+ };
82
+ }
83
+
84
+ /** AgentRunner's streaming callback. Publishes nothing until a progress event has carried the run. */
85
+ public get OnStreaming(): AgentExecutionStreamingCallback {
86
+ return (chunk) => {
87
+ const agentRun = this.run;
88
+ if (!agentRun?.ID) {
89
+ console.error('❌ No agent run available for streaming callback');
90
+ return;
91
+ }
92
+ this.publish('StreamingContent', {
93
+ sessionId: this.sessionId,
94
+ agentRunId: agentRun.ID,
95
+ type: 'streaming',
96
+ agentRun: agentRun.GetAll ? agentRun.GetAll() : agentRun,
97
+ streaming: {
98
+ content: chunk.content,
99
+ isPartial: !chunk.isComplete,
100
+ stepName: chunk.stepType,
101
+ agentName: chunk.modelName,
102
+ kind: chunk.kind,
103
+ },
104
+ timestamp: new Date(),
105
+ });
106
+ };
107
+ }
108
+
109
+ /**
110
+ * The partial result, then the completion. `conversationDetailId` is the reply row the
111
+ * chat should update. When omitted, the completion uses the run's own detail id.
112
+ */
113
+ public PublishFinal(result: ExecuteAgentResult, conversationDetailId?: string, resultJson?: string): void {
114
+ const agentRun = result.agentRun as StatusRun | undefined;
115
+ if (agentRun?.ID) {
116
+ let lastStep = 'Completed';
117
+ const steps = agentRun.Steps;
118
+ if (steps && steps.length > 0) {
119
+ lastStep = steps[steps.length - 1]?.StepName || 'Completed';
120
+ }
121
+ this.publish('StreamingContent', {
122
+ sessionId: this.sessionId,
123
+ agentRunId: agentRun.ID,
124
+ type: 'partial_result',
125
+ partialResult: {
126
+ currentStep: lastStep,
127
+ partialOutput: result.payload || undefined,
128
+ },
129
+ timestamp: new Date(),
130
+ });
131
+ }
132
+ this.publish('StreamingContent', {
133
+ sessionId: this.sessionId,
134
+ agentRunId: agentRun?.ID || 'unknown',
135
+ type: 'complete',
136
+ timestamp: new Date(),
137
+ conversationDetailId: conversationDetailId || agentRun?.ConversationDetailID,
138
+ success: result.success,
139
+ errorMessage: agentRun?.ErrorMessage || undefined,
140
+ result: resultJson || undefined,
141
+ });
142
+ }
143
+
144
+ /**
145
+ * Completion for a failure that has no run. The fire-and-forget path uses this when
146
+ * `executeAIAgent` rejects. A host uses it the same way: when the turn throws
147
+ * instead of returning a result, call `PublishFailure` with the reply row's id
148
+ * and the error. That completion is what tells the chat the reply finished.
149
+ */
150
+ public PublishFailure(conversationDetailId: string | undefined, errorMessage: string): void {
151
+ this.publish('StreamingContent', {
152
+ sessionId: this.sessionId,
153
+ agentRunId: 'unknown',
154
+ type: 'complete',
155
+ timestamp: new Date(),
156
+ conversationDetailId,
157
+ success: false,
158
+ errorMessage,
159
+ result: JSON.stringify({ success: false, errorMessage }),
160
+ });
161
+ }
162
+
163
+ private publish(type: 'ExecutionProgress' | 'StreamingContent', data: unknown): void {
164
+ PublishStatusUpdate(this.pubSub, {
165
+ sessionId: this.userPayload.sessionId,
166
+ ownerUserId: this.userPayload?.userRecord?.ID ?? '',
167
+ message: JSON.stringify({
168
+ resolver: 'RunAIAgentResolver',
169
+ type,
170
+ status: 'ok',
171
+ data,
172
+ }),
173
+ });
174
+ }
175
+ }
@@ -25,15 +25,15 @@ import { SessionManager, SessionAuthorizationError } from '../agentSessions/inde
25
25
  export class StartAgentSessionResult {
26
26
  /** ID of the newly created session. */
27
27
  @Field()
28
- agentSessionId: string;
28
+ agentSessionId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
29
29
 
30
30
  /** Lifecycle status of the session (always `Active` on a successful start). */
31
31
  @Field()
32
- status: string;
32
+ status: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
33
33
 
34
34
  /** ID of the conversation the session is attached to (supplied or freshly created). */
35
35
  @Field()
36
- conversationId: string;
36
+ conversationId: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
37
37
  }
38
38
 
39
39
  /**
@@ -10,22 +10,22 @@ export class Color {
10
10
 
11
11
  @Field(() => String)
12
12
  @Public()
13
- name: string;
13
+ name: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
14
14
 
15
15
  @Field(() => String)
16
16
  @Public()
17
- createdZ: string;
17
+ createdZ: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
18
18
  }
19
19
 
20
20
  @ObjectType()
21
21
  export class ColorNotification {
22
22
  @Public()
23
23
  @Field(() => String, { nullable: true })
24
- message?: string;
24
+ message?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
25
25
 
26
26
  @Public()
27
27
  @Field((_type) => Date)
28
- date!: Date;
28
+ date!: Date; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
29
29
  }
30
30
 
31
31
  export interface ColorNotificationPayload {
@@ -36,13 +36,13 @@ export interface ColorNotificationPayload {
36
36
  export class ColorResolver {
37
37
  @Subscription(() => ColorNotification, { topics: 'COLOR' })
38
38
  @Public()
39
- colorSubscription(@Root() { message }: ColorNotificationPayload): ColorNotification {
39
+ colorSubscription(@Root() { message }: ColorNotificationPayload): ColorNotification { // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
40
40
  return { message, date: new Date() };
41
41
  }
42
42
 
43
43
  @Query(() => [Color])
44
44
  @Public()
45
- async colors(@Ctx() _ctx: AppContext, @PubSub() pubSub: PubSubEngine) {
45
+ async colors(@Ctx() _ctx: AppContext, @PubSub() pubSub: PubSubEngine) { // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
46
46
  const createdZ = new Date().toISOString();
47
47
 
48
48
  pubSub.publish('COLOR', {