@memberjunction/server 6.1.4 → 6.2.0-edge.1

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 (435) 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/exampleNewUserSubClass.js +2 -1
  16. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  17. package/dist/auth/index.d.ts +20 -1
  18. package/dist/auth/index.d.ts.map +1 -1
  19. package/dist/auth/index.js +20 -10
  20. package/dist/auth/index.js.map +1 -1
  21. package/dist/auth/initializeProviders.d.ts +8 -0
  22. package/dist/auth/initializeProviders.d.ts.map +1 -1
  23. package/dist/auth/initializeProviders.js +21 -5
  24. package/dist/auth/initializeProviders.js.map +1 -1
  25. package/dist/auth/magicLink/MagicLinkRouter.d.ts +9 -0
  26. package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
  27. package/dist/auth/magicLink/MagicLinkRouter.js +22 -10
  28. package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
  29. package/dist/auth/magicLink/MagicLinkService.d.ts +17 -15
  30. package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
  31. package/dist/auth/magicLink/MagicLinkService.js +65 -51
  32. package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
  33. package/dist/auth/magicLink/index.d.ts +2 -2
  34. package/dist/auth/magicLink/index.d.ts.map +1 -1
  35. package/dist/auth/magicLink/index.js +2 -2
  36. package/dist/auth/magicLink/index.js.map +1 -1
  37. package/dist/auth/magicLink/magicLinkCore.d.ts +54 -33
  38. package/dist/auth/magicLink/magicLinkCore.d.ts.map +1 -1
  39. package/dist/auth/magicLink/magicLinkCore.js +61 -61
  40. package/dist/auth/magicLink/magicLinkCore.js.map +1 -1
  41. package/dist/auth/magicLink/redeemLanding.d.ts +4 -0
  42. package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
  43. package/dist/auth/magicLink/redeemLanding.js +12 -4
  44. package/dist/auth/magicLink/redeemLanding.js.map +1 -1
  45. package/dist/auth/magicLink/types.d.ts +4 -4
  46. package/dist/auth/principals.d.ts +2 -0
  47. package/dist/auth/principals.d.ts.map +1 -1
  48. package/dist/auth/principals.js +6 -2
  49. package/dist/auth/principals.js.map +1 -1
  50. package/dist/cache.d.ts +2 -0
  51. package/dist/cache.d.ts.map +1 -1
  52. package/dist/cache.js +3 -1
  53. package/dist/cache.js.map +1 -1
  54. package/dist/config.d.ts +293 -2
  55. package/dist/config.d.ts.map +1 -1
  56. package/dist/config.js +11 -4
  57. package/dist/config.js.map +1 -1
  58. package/dist/context.d.ts +20 -0
  59. package/dist/context.d.ts.map +1 -1
  60. package/dist/context.js +27 -19
  61. package/dist/context.js.map +1 -1
  62. package/dist/directives/Public.d.ts +2 -0
  63. package/dist/directives/Public.d.ts.map +1 -1
  64. package/dist/directives/Public.js +3 -1
  65. package/dist/directives/Public.js.map +1 -1
  66. package/dist/directives/RequireSystemUser.d.ts +2 -0
  67. package/dist/directives/RequireSystemUser.d.ts.map +1 -1
  68. package/dist/directives/RequireSystemUser.js +3 -1
  69. package/dist/directives/RequireSystemUser.js.map +1 -1
  70. package/dist/generated/graphql-schemas/__mj.d.ts +266 -4
  71. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  72. package/dist/generated/graphql-schemas/__mj.js +1304 -0
  73. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  74. package/dist/generic/CacheInvalidationResolver.d.ts +8 -2
  75. package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
  76. package/dist/generic/CacheInvalidationResolver.js +7 -3
  77. package/dist/generic/CacheInvalidationResolver.js.map +1 -1
  78. package/dist/generic/FireAndForgetHeartbeat.d.ts +3 -1
  79. package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
  80. package/dist/generic/FireAndForgetHeartbeat.js +8 -4
  81. package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
  82. package/dist/generic/PushStatusResolver.d.ts +10 -1
  83. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  84. package/dist/generic/PushStatusResolver.js +11 -3
  85. package/dist/generic/PushStatusResolver.js.map +1 -1
  86. package/dist/generic/ResolverBase.d.ts +27 -1
  87. package/dist/generic/ResolverBase.d.ts.map +1 -1
  88. package/dist/generic/ResolverBase.js +64 -6
  89. package/dist/generic/ResolverBase.js.map +1 -1
  90. package/dist/index.d.ts +6 -0
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +29 -6
  93. package/dist/index.js.map +1 -1
  94. package/dist/integration/CustomColumnPromoter.d.ts +2 -0
  95. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
  96. package/dist/integration/CustomColumnPromoter.js +5 -1
  97. package/dist/integration/CustomColumnPromoter.js.map +1 -1
  98. package/dist/integration/EntityMapLifecycle.d.ts +4 -0
  99. package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
  100. package/dist/integration/EntityMapLifecycle.js +10 -2
  101. package/dist/integration/EntityMapLifecycle.js.map +1 -1
  102. package/dist/logging/NoLog.d.ts +4 -0
  103. package/dist/logging/NoLog.d.ts.map +1 -1
  104. package/dist/logging/NoLog.js +10 -2
  105. package/dist/logging/NoLog.js.map +1 -1
  106. package/dist/logging/StartupLogger.d.ts +2 -0
  107. package/dist/logging/StartupLogger.d.ts.map +1 -1
  108. package/dist/logging/StartupLogger.js +5 -1
  109. package/dist/logging/StartupLogger.js.map +1 -1
  110. package/dist/logging/bootAudit.d.ts +11 -7
  111. package/dist/logging/bootAudit.d.ts.map +1 -1
  112. package/dist/logging/bootAudit.js +15 -7
  113. package/dist/logging/bootAudit.js.map +1 -1
  114. package/dist/logging/boundaryLogPayload.d.ts +4 -0
  115. package/dist/logging/boundaryLogPayload.d.ts.map +1 -1
  116. package/dist/logging/boundaryLogPayload.js +5 -1
  117. package/dist/logging/boundaryLogPayload.js.map +1 -1
  118. package/dist/logging/secretRedactor.d.ts +2 -0
  119. package/dist/logging/secretRedactor.d.ts.map +1 -1
  120. package/dist/logging/secretRedactor.js +8 -4
  121. package/dist/logging/secretRedactor.js.map +1 -1
  122. package/dist/logging/shortenForLog.d.ts +2 -0
  123. package/dist/logging/shortenForLog.d.ts.map +1 -1
  124. package/dist/logging/shortenForLog.js +7 -3
  125. package/dist/logging/shortenForLog.js.map +1 -1
  126. package/dist/logging/variablesLoggingMiddleware.d.ts +2 -0
  127. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  128. package/dist/logging/variablesLoggingMiddleware.js +8 -6
  129. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  130. package/dist/metadataRefreshSignal.d.ts +19 -0
  131. package/dist/metadataRefreshSignal.d.ts.map +1 -0
  132. package/dist/metadataRefreshSignal.js +45 -0
  133. package/dist/metadataRefreshSignal.js.map +1 -0
  134. package/dist/middleware/MJTenantFilterMiddleware.js +4 -4
  135. package/dist/multiTenancy/index.d.ts +8 -0
  136. package/dist/multiTenancy/index.d.ts.map +1 -1
  137. package/dist/multiTenancy/index.js +21 -5
  138. package/dist/multiTenancy/index.js.map +1 -1
  139. package/dist/realtimeWidget/WidgetRouter.d.ts +5 -0
  140. package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
  141. package/dist/realtimeWidget/WidgetRouter.js +14 -10
  142. package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
  143. package/dist/realtimeWidget/WidgetSessionService.d.ts +6 -6
  144. package/dist/realtimeWidget/WidgetSessionService.js +27 -27
  145. package/dist/realtimeWidget/host-identity.d.ts +5 -1
  146. package/dist/realtimeWidget/host-identity.d.ts.map +1 -1
  147. package/dist/realtimeWidget/host-identity.js +11 -3
  148. package/dist/realtimeWidget/host-identity.js.map +1 -1
  149. package/dist/realtimeWidget/index.d.ts +2 -2
  150. package/dist/realtimeWidget/index.d.ts.map +1 -1
  151. package/dist/realtimeWidget/index.js +2 -2
  152. package/dist/realtimeWidget/index.js.map +1 -1
  153. package/dist/realtimeWidget/visitorIdentity.d.ts +21 -1
  154. package/dist/realtimeWidget/visitorIdentity.d.ts.map +1 -1
  155. package/dist/realtimeWidget/visitorIdentity.js +16 -4
  156. package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
  157. package/dist/realtimeWidget/widgetCore.d.ts +48 -0
  158. package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
  159. package/dist/realtimeWidget/widgetCore.js +38 -10
  160. package/dist/realtimeWidget/widgetCore.js.map +1 -1
  161. package/dist/realtimeWidget/widgetGuestElevation.d.ts +10 -6
  162. package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
  163. package/dist/realtimeWidget/widgetGuestElevation.js +14 -6
  164. package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
  165. package/dist/resolvers/AdhocQueryResolver.js +3 -3
  166. package/dist/resolvers/FetchEntityVectorsResolver.js +2 -2
  167. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  168. package/dist/resolvers/FileResolver.js +3 -3
  169. package/dist/resolvers/GeoResolver.d.ts +2 -2
  170. package/dist/resolvers/GeoResolver.js +4 -4
  171. package/dist/resolvers/GetDataResolver.d.ts +14 -0
  172. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  173. package/dist/resolvers/GetDataResolver.js +43 -15
  174. package/dist/resolvers/GetDataResolver.js.map +1 -1
  175. package/dist/resolvers/IntegrationDiscoveryResolver.js +2 -2
  176. package/dist/resolvers/ListOperationsResolver.d.ts +20 -0
  177. package/dist/resolvers/ListOperationsResolver.d.ts.map +1 -1
  178. package/dist/resolvers/ListOperationsResolver.js +68 -28
  179. package/dist/resolvers/ListOperationsResolver.js.map +1 -1
  180. package/dist/resolvers/MCPResolver.d.ts +11 -1
  181. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  182. package/dist/resolvers/MCPResolver.js +7 -3
  183. package/dist/resolvers/MCPResolver.js.map +1 -1
  184. package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
  185. package/dist/resolvers/QuerySystemUserResolver.js +2 -1
  186. package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
  187. package/dist/resolvers/RealtimeBridgeResolver.js +3 -3
  188. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +37 -0
  189. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  190. package/dist/resolvers/RealtimeClientSessionResolver.js +101 -11
  191. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  192. package/dist/resolvers/RemoteBrowserActionResolver.js +5 -5
  193. package/dist/resolvers/RunAIAgentResolver.d.ts +10 -4
  194. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  195. package/dist/resolvers/RunAIAgentResolver.js +74 -42
  196. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  197. package/dist/resolvers/RunAIPromptResolver.d.ts +1 -1
  198. package/dist/resolvers/RunAIPromptResolver.js +2 -2
  199. package/dist/resolvers/RunTestResolver.js +5 -5
  200. package/dist/resolvers/SearchEntitiesResolver.d.ts.map +1 -1
  201. package/dist/resolvers/SearchEntitiesResolver.js +3 -1
  202. package/dist/resolvers/SearchEntitiesResolver.js.map +1 -1
  203. package/dist/resolvers/SearchKnowledgeResolver.d.ts +1 -0
  204. package/dist/resolvers/SearchKnowledgeResolver.d.ts.map +1 -1
  205. package/dist/resolvers/SearchKnowledgeResolver.js +5 -0
  206. package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
  207. package/dist/resolvers/SearchKnowledgeSystemUserResolver.d.ts.map +1 -1
  208. package/dist/resolvers/SearchKnowledgeSystemUserResolver.js +1 -0
  209. package/dist/resolvers/SearchKnowledgeSystemUserResolver.js.map +1 -1
  210. package/dist/resolvers/SqlLoggingConfigResolver.d.ts +8 -4
  211. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  212. package/dist/resolvers/SqlLoggingConfigResolver.js +5 -5
  213. package/dist/resolvers/TaskGraphFrameResolver.d.ts +8 -1
  214. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
  215. package/dist/resolvers/TaskGraphFrameResolver.js +6 -2
  216. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
  217. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  218. package/dist/resolvers/TransactionGroupResolver.js +53 -4
  219. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  220. package/dist/resolvers/adhoc-query-helpers.d.ts +6 -0
  221. package/dist/resolvers/adhoc-query-helpers.d.ts.map +1 -1
  222. package/dist/resolvers/adhoc-query-helpers.js +10 -2
  223. package/dist/resolvers/adhoc-query-helpers.js.map +1 -1
  224. package/dist/resolvers/artifact-routing.d.ts +8 -8
  225. package/dist/resolvers/artifact-routing.js +2 -2
  226. package/dist/resolvers/artifact-routing.js.map +1 -1
  227. package/dist/resolvers/meetingRecordingRegistration.d.ts +10 -2
  228. package/dist/resolvers/meetingRecordingRegistration.d.ts.map +1 -1
  229. package/dist/resolvers/meetingRecordingRegistration.js +24 -8
  230. package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
  231. package/dist/resolvers/peaksSidecar.d.ts +4 -0
  232. package/dist/resolvers/peaksSidecar.d.ts.map +1 -1
  233. package/dist/resolvers/peaksSidecar.js +10 -2
  234. package/dist/resolvers/peaksSidecar.js.map +1 -1
  235. package/dist/rest/EntityCRUDHandler.d.ts +28 -0
  236. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  237. package/dist/rest/EntityCRUDHandler.js +20 -4
  238. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  239. package/dist/rest/MediaStreamHandler.d.ts +2 -0
  240. package/dist/rest/MediaStreamHandler.d.ts.map +1 -1
  241. package/dist/rest/MediaStreamHandler.js +10 -6
  242. package/dist/rest/MediaStreamHandler.js.map +1 -1
  243. package/dist/rest/OAuthCallbackHandler.d.ts +9 -0
  244. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
  245. package/dist/rest/OAuthCallbackHandler.js +15 -3
  246. package/dist/rest/OAuthCallbackHandler.js.map +1 -1
  247. package/dist/rest/RESTEndpointHandler.d.ts +6 -4
  248. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  249. package/dist/rest/RESTEndpointHandler.js +15 -11
  250. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  251. package/dist/rest/RealtimeSdpBrokerHandler.d.ts +5 -1
  252. package/dist/rest/RealtimeSdpBrokerHandler.d.ts.map +1 -1
  253. package/dist/rest/RealtimeSdpBrokerHandler.js +12 -4
  254. package/dist/rest/RealtimeSdpBrokerHandler.js.map +1 -1
  255. package/dist/rest/SignatureWebhookHandler.d.ts +2 -0
  256. package/dist/rest/SignatureWebhookHandler.d.ts.map +1 -1
  257. package/dist/rest/SignatureWebhookHandler.js +5 -1
  258. package/dist/rest/SignatureWebhookHandler.js.map +1 -1
  259. package/dist/rest/UploadTokenManager.d.ts +24 -8
  260. package/dist/rest/UploadTokenManager.d.ts.map +1 -1
  261. package/dist/rest/UploadTokenManager.js +53 -21
  262. package/dist/rest/UploadTokenManager.js.map +1 -1
  263. package/dist/rest/ViewOperationsHandler.d.ts +20 -0
  264. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  265. package/dist/rest/ViewOperationsHandler.js +20 -4
  266. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  267. package/dist/rest/mediaRange.d.ts +4 -0
  268. package/dist/rest/mediaRange.d.ts.map +1 -1
  269. package/dist/rest/mediaRange.js +10 -2
  270. package/dist/rest/mediaRange.js.map +1 -1
  271. package/dist/rest/setupRESTEndpoints.d.ts +4 -0
  272. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  273. package/dist/rest/setupRESTEndpoints.js +13 -7
  274. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  275. package/dist/serverExtensionReservedRoots.d.ts +2 -0
  276. package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
  277. package/dist/serverExtensionReservedRoots.js +5 -1
  278. package/dist/serverExtensionReservedRoots.js.map +1 -1
  279. package/dist/services/MJStorageBlobStore.d.ts +41 -0
  280. package/dist/services/MJStorageBlobStore.d.ts.map +1 -0
  281. package/dist/services/MJStorageBlobStore.js +160 -0
  282. package/dist/services/MJStorageBlobStore.js.map +1 -0
  283. package/dist/services/TaskGraphActionRunner.d.ts +13 -8
  284. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  285. package/dist/services/TaskGraphActionRunner.js +16 -15
  286. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  287. package/dist/types.d.ts +2 -0
  288. package/dist/types.d.ts.map +1 -1
  289. package/dist/types.js +7 -3
  290. package/dist/types.js.map +1 -1
  291. package/dist/util.d.ts +12 -3
  292. package/dist/util.d.ts.map +1 -1
  293. package/dist/util.js +19 -8
  294. package/dist/util.js.map +1 -1
  295. package/package.json +92 -92
  296. package/src/__tests__/FileResolverPeaks.test.ts +13 -13
  297. package/src/__tests__/ListOperationsResolver.test.ts +17 -17
  298. package/src/__tests__/MediaStreamHandler.test.ts +28 -28
  299. package/src/__tests__/NoLog.test.ts +11 -11
  300. package/src/__tests__/PrimaryKeyAlwaysMapped.test.ts +10 -10
  301. package/src/__tests__/RESTEndpointHandler.test.ts +14 -14
  302. package/src/__tests__/RealtimeBridgeResolver.test.ts +4 -2
  303. package/src/__tests__/RealtimeClientSessionResolver.test.ts +229 -0
  304. package/src/__tests__/RealtimeSdpBrokerHandler.test.ts +6 -6
  305. package/src/__tests__/RefreshAdoptsNewColumns.test.ts +8 -8
  306. package/src/__tests__/RemoteBrowserGoalEngine.test.ts +18 -18
  307. package/src/__tests__/ResolverBase.isaPromotionCreate.test.ts +412 -0
  308. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +228 -0
  309. package/src/__tests__/SearchEntitiesResolver.readOnlyFallback.test.ts +78 -0
  310. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +129 -0
  311. package/src/__tests__/TaskGraphFrameResolver.test.ts +2 -2
  312. package/src/__tests__/TransactionGroupResolver.refusals.test.ts +290 -0
  313. package/src/__tests__/WidgetSessionService.test.ts +8 -4
  314. package/src/__tests__/adhoc-query-helpers.test.ts +21 -21
  315. package/src/__tests__/bootAudit.test.ts +11 -11
  316. package/src/__tests__/boundaryLogPayload.test.ts +6 -6
  317. package/src/__tests__/databaseAbstraction.test.ts +12 -6
  318. package/src/__tests__/getDataTokenRedaction.test.ts +7 -7
  319. package/src/__tests__/initializeProviders.refresh.test.ts +4 -4
  320. package/src/__tests__/magicLink.test.ts +73 -134
  321. package/src/__tests__/magicLinkService.consume.test.ts +224 -0
  322. package/src/__tests__/meetingRecordingRegistration.test.ts +12 -12
  323. package/src/__tests__/metadataRefreshSignal.test.ts +78 -0
  324. package/src/__tests__/multiTenancy.security.test.ts +40 -40
  325. package/src/__tests__/multiTenancy.test.ts +18 -18
  326. package/src/__tests__/newUsers.test.ts +24 -23
  327. package/src/__tests__/principals.test.ts +22 -22
  328. package/src/__tests__/pushStatusResolver.filter.test.ts +8 -8
  329. package/src/__tests__/secretRedactor.failOpen.test.ts +12 -12
  330. package/src/__tests__/secretRedactor.test.ts +12 -12
  331. package/src/__tests__/serverExtensionReservedRoots.test.ts +7 -7
  332. package/src/__tests__/subscriptionRedaction.test.ts +5 -5
  333. package/src/__tests__/unifiedAuth.test.ts +15 -9
  334. package/src/__tests__/visitorIdentity.resolve.test.ts +6 -6
  335. package/src/__tests__/widget.test.ts +45 -45
  336. package/src/__tests__/widgetGuestElevation.test.ts +7 -7
  337. package/src/__tests__/widgetHostIdentity.test.ts +14 -14
  338. package/src/agentSessions/ReturningVisitorRecap.ts +12 -1
  339. package/src/agentSessions/SessionManager.ts +2 -2
  340. package/src/agentSessions/remoteBrowserGoalEngine.ts +30 -5
  341. package/src/auth/AuthProviderCatalogRouter.ts +6 -1
  342. package/src/auth/__tests__/backward-compatibility.test.ts +3 -3
  343. package/src/auth/exampleNewUserSubClass.ts +2 -2
  344. package/src/auth/index.ts +43 -28
  345. package/src/auth/initializeProviders.ts +25 -5
  346. package/src/auth/magicLink/MagicLinkRouter.ts +28 -10
  347. package/src/auth/magicLink/MagicLinkService.ts +71 -52
  348. package/src/auth/magicLink/index.ts +7 -7
  349. package/src/auth/magicLink/magicLinkCore.ts +96 -64
  350. package/src/auth/magicLink/redeemLanding.ts +14 -4
  351. package/src/auth/magicLink/types.ts +54 -54
  352. package/src/auth/newUsers.ts +1 -1
  353. package/src/auth/principals.ts +11 -2
  354. package/src/cache.ts +4 -1
  355. package/src/config.ts +14 -4
  356. package/src/context.ts +37 -24
  357. package/src/directives/Public.ts +4 -1
  358. package/src/directives/RequireSystemUser.ts +4 -1
  359. package/src/generated/graphql-schemas/__mj.ts +933 -5
  360. package/src/generic/CacheInvalidationResolver.ts +12 -4
  361. package/src/generic/FireAndForgetHeartbeat.ts +19 -14
  362. package/src/generic/PushStatusResolver.ts +21 -7
  363. package/src/generic/ResolverBase.ts +66 -5
  364. package/src/generic/RunViewResolver.ts +22 -22
  365. package/src/generic/__tests__/FireAndForgetHeartbeat.test.ts +7 -7
  366. package/src/index.ts +34 -7
  367. package/src/integration/CustomColumnPromoter.ts +6 -1
  368. package/src/integration/EntityMapLifecycle.ts +20 -2
  369. package/src/logging/NoLog.ts +16 -2
  370. package/src/logging/StartupLogger.ts +6 -1
  371. package/src/logging/bootAudit.ts +26 -16
  372. package/src/logging/boundaryLogPayload.ts +8 -1
  373. package/src/logging/secretRedactor.ts +14 -9
  374. package/src/logging/shortenForLog.ts +8 -3
  375. package/src/logging/variablesLoggingMiddleware.ts +9 -6
  376. package/src/metadataRefreshSignal.ts +45 -0
  377. package/src/middleware/MJTenantFilterMiddleware.ts +4 -4
  378. package/src/multiTenancy/index.ts +29 -5
  379. package/src/realtimeWidget/WidgetRouter.ts +15 -10
  380. package/src/realtimeWidget/WidgetSessionService.ts +76 -76
  381. package/src/realtimeWidget/host-identity.ts +24 -10
  382. package/src/realtimeWidget/index.ts +3 -3
  383. package/src/realtimeWidget/visitorIdentity.ts +39 -8
  384. package/src/realtimeWidget/widgetCore.ts +75 -10
  385. package/src/realtimeWidget/widgetGuestElevation.ts +25 -12
  386. package/src/resolvers/AdhocQueryResolver.ts +3 -3
  387. package/src/resolvers/AgentSessionResolver.ts +3 -3
  388. package/src/resolvers/ColorResolver.ts +6 -6
  389. package/src/resolvers/ComponentRegistryResolver.ts +36 -36
  390. package/src/resolvers/EntityCommunicationsResolver.ts +4 -4
  391. package/src/resolvers/ExecuteRemoteOperationResolver.ts +9 -9
  392. package/src/resolvers/FetchEntityVectorsResolver.ts +2 -2
  393. package/src/resolvers/FileResolver.ts +42 -42
  394. package/src/resolvers/GeoResolver.ts +4 -4
  395. package/src/resolvers/GetDataResolver.ts +50 -15
  396. package/src/resolvers/IntegrationDiscoveryResolver.ts +2 -2
  397. package/src/resolvers/ListOperationsResolver.ts +78 -28
  398. package/src/resolvers/MCPResolver.ts +30 -15
  399. package/src/resolvers/QueryResolver.ts +13 -13
  400. package/src/resolvers/QuerySystemUserResolver.ts +2 -1
  401. package/src/resolvers/RealtimeBridgeResolver.ts +3 -3
  402. package/src/resolvers/RealtimeClientSessionResolver.ts +126 -13
  403. package/src/resolvers/RemoteBrowserActionResolver.ts +5 -5
  404. package/src/resolvers/RunAIAgentResolver.ts +118 -76
  405. package/src/resolvers/RunAIPromptResolver.ts +22 -22
  406. package/src/resolvers/RunTemplateResolver.ts +4 -4
  407. package/src/resolvers/RunTestResolver.ts +25 -25
  408. package/src/resolvers/SearchEntitiesResolver.ts +3 -1
  409. package/src/resolvers/SearchKnowledgeResolver.ts +4 -0
  410. package/src/resolvers/SearchKnowledgeSystemUserResolver.ts +1 -0
  411. package/src/resolvers/SqlLoggingConfigResolver.ts +56 -56
  412. package/src/resolvers/TaskGraphFrameResolver.ts +37 -28
  413. package/src/resolvers/TelemetryResolver.ts +79 -79
  414. package/src/resolvers/TransactionGroupResolver.ts +57 -4
  415. package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +40 -38
  416. package/src/resolvers/__tests__/artifact-routing.test.ts +23 -23
  417. package/src/resolvers/adhoc-query-helpers.ts +19 -2
  418. package/src/resolvers/artifact-routing.ts +19 -19
  419. package/src/resolvers/meetingRecordingRegistration.ts +44 -10
  420. package/src/resolvers/peaksSidecar.ts +12 -2
  421. package/src/rest/EntityCRUDHandler.ts +24 -4
  422. package/src/rest/MediaStreamHandler.ts +11 -6
  423. package/src/rest/OAuthCallbackHandler.ts +25 -7
  424. package/src/rest/RESTEndpointHandler.ts +20 -15
  425. package/src/rest/RealtimeSdpBrokerHandler.ts +14 -4
  426. package/src/rest/SignatureWebhookHandler.ts +6 -1
  427. package/src/rest/UploadTokenManager.ts +66 -30
  428. package/src/rest/ViewOperationsHandler.ts +24 -4
  429. package/src/rest/mediaRange.ts +16 -6
  430. package/src/rest/setupRESTEndpoints.ts +24 -12
  431. package/src/serverExtensionReservedRoots.ts +6 -1
  432. package/src/services/MJStorageBlobStore.ts +209 -0
  433. package/src/services/TaskGraphActionRunner.ts +16 -15
  434. package/src/types.ts +21 -16
  435. package/src/util.ts +22 -9
@@ -26,86 +26,86 @@ export const TASK_GRAPH_FRAMES_TOPIC = 'TASK_GRAPH_FRAMES';
26
26
  @ObjectType()
27
27
  export class TaskGraphFrameNotification {
28
28
  @Field(() => String)
29
- kind!: string;
29
+ kind!: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
30
30
 
31
31
  @Field(() => ID)
32
- parentTaskId!: string;
32
+ parentTaskId!: 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
  @Field(() => ID, { nullable: true })
35
- taskId?: string;
35
+ taskId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
36
36
 
37
37
  @Field(() => String, { nullable: true })
38
- taskName?: string;
38
+ taskName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
39
39
 
40
40
  @Field(() => String, { nullable: true })
41
- status?: string;
41
+ status?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
42
42
 
43
43
  @Field(() => String, { nullable: true })
44
- errorMessage?: string;
44
+ errorMessage?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
45
45
 
46
46
  @Field(() => ID, { nullable: true })
47
- assignedUserId?: string;
47
+ assignedUserId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
48
48
 
49
49
  @Field(() => Number, { nullable: true })
50
- completedCount?: number;
50
+ completedCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
51
51
 
52
52
  @Field(() => Number, { nullable: true })
53
- totalCount?: number;
53
+ totalCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
54
54
 
55
55
  // ── GateDecision ──────────────────────────────────────────────────────────
56
56
  @Field(() => ID, { nullable: true })
57
- edgeId?: string;
57
+ edgeId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
58
58
 
59
59
  @Field(() => ID, { nullable: true })
60
- dependsOnTaskId?: string;
60
+ dependsOnTaskId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
61
61
 
62
62
  /** 'satisfied' | 'notTaken' | 'held' */
63
63
  @Field(() => String, { nullable: true })
64
- verdict?: string;
64
+ verdict?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
65
65
 
66
66
  @Field(() => String, { nullable: true })
67
- conditionText?: string;
67
+ conditionText?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
68
68
 
69
69
  @Field(() => String, { nullable: true })
70
- reason?: string;
70
+ reason?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
71
71
 
72
72
  // ── ClaimChanged ──────────────────────────────────────────────────────────
73
73
  /** 'claimed' | 'heartbeat-lost' | 'reclaimed' */
74
74
  @Field(() => String, { nullable: true })
75
- claimEvent?: string;
75
+ claimEvent?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
76
76
 
77
77
  @Field(() => String, { nullable: true })
78
- claimedBy?: string;
78
+ claimedBy?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
79
79
 
80
80
  @Field(() => String, { nullable: true })
81
- claimExpiresAt?: string;
81
+ claimExpiresAt?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
82
82
 
83
83
  // ── PassCompleted ─────────────────────────────────────────────────────────
84
84
  @Field(() => Number, { nullable: true })
85
- passNumber?: number;
85
+ passNumber?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
86
86
 
87
87
  @Field(() => Number, { nullable: true })
88
- eligibleCount?: number;
88
+ eligibleCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
89
89
 
90
90
  @Field(() => Number, { nullable: true })
91
- heldCount?: number;
91
+ heldCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
92
92
 
93
93
  @Field(() => Number, { nullable: true })
94
- claimedCount?: number;
94
+ claimedCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
95
95
 
96
96
  /** The dispatcher instance's own load across every graph — not this graph's in-flight count. */
97
97
  @Field(() => Number, { nullable: true })
98
- instanceInFlightCount?: number;
98
+ instanceInFlightCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
99
99
 
100
100
  // ── NodeProgress ──────────────────────────────────────────────────────────
101
101
  @Field(() => String, { nullable: true })
102
- progressMessage?: string;
102
+ progressMessage?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
103
103
 
104
104
  @Field(() => Number, { nullable: true })
105
- progressPercent?: number;
105
+ progressPercent?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
106
106
 
107
107
  @Field(() => Date)
108
- date!: Date;
108
+ date!: Date; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
109
109
  }
110
110
 
111
111
  /**
@@ -137,7 +137,7 @@ export interface TaskGraphFrameFilterContext {
137
137
  * another user's workflow — including its per-step error messages. **Fails closed** — a missing
138
138
  * identity on either side never matches.
139
139
  */
140
- export function taskGraphFrameFilter(data: {
140
+ export function TaskGraphFrameFilter(data: {
141
141
  payload: TaskGraphFramePayload;
142
142
  args: TaskGraphFrameArgs;
143
143
  context: TaskGraphFrameFilterContext | undefined;
@@ -156,6 +156,15 @@ export function taskGraphFrameFilter(data: {
156
156
  return UUIDsEqual(payload.ownerUserId, connectionUserId);
157
157
  }
158
158
 
159
+ /** @deprecated Use {@link TaskGraphFrameFilter}. */
160
+ export function taskGraphFrameFilter(data: {
161
+ payload: TaskGraphFramePayload;
162
+ args: TaskGraphFrameArgs;
163
+ context: TaskGraphFrameFilterContext | undefined;
164
+ }): boolean {
165
+ return TaskGraphFrameFilter(data);
166
+ }
167
+
159
168
  /**
160
169
  * MJServer's `TaskGraphObserver` — turns dispatcher frames into a PubSub publish.
161
170
  *
@@ -189,9 +198,9 @@ export class TaskGraphFrameResolver {
189
198
  @Subscription(() => TaskGraphFrameNotification, {
190
199
  topics: TASK_GRAPH_FRAMES_TOPIC,
191
200
  filter: (data: ResolverFilterData<TaskGraphFramePayload, TaskGraphFrameArgs, TaskGraphFrameFilterContext>) =>
192
- taskGraphFrameFilter(data),
201
+ TaskGraphFrameFilter(data),
193
202
  })
194
- taskGraphFrames(
203
+ taskGraphFrames( // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
195
204
  @Root() payload: TaskGraphFramePayload,
196
205
  @Arg('parentTaskId', () => ID) parentTaskId: string
197
206
  ): TaskGraphFrameNotification {
@@ -13,58 +13,58 @@ import {
13
13
  @ObjectType()
14
14
  export class MemorySnapshotGQL {
15
15
  @Field(() => Float)
16
- heapUsed: number;
16
+ heapUsed: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
17
17
 
18
18
  @Field(() => Float)
19
- heapTotal: number;
19
+ heapTotal: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
20
20
 
21
21
  @Field(() => Float)
22
- timestamp: number;
22
+ timestamp: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
23
23
  }
24
24
 
25
25
  @ObjectType()
26
26
  export class TelemetryEventGQL {
27
27
  @Field(() => String)
28
- id: string;
28
+ id: 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
  @Field(() => String)
31
- category: string;
31
+ category: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
32
32
 
33
33
  @Field(() => String)
34
- operation: string;
34
+ operation: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
35
35
 
36
36
  @Field(() => String)
37
- fingerprint: string;
37
+ fingerprint: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
38
38
 
39
39
  @Field(() => Float)
40
- startTime: number;
40
+ startTime: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
41
41
 
42
42
  @Field(() => Float, { nullable: true })
43
- endTime?: number;
43
+ endTime?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
44
44
 
45
45
  @Field(() => Float, { nullable: true })
46
- elapsedMs?: number;
46
+ elapsedMs?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
47
47
 
48
48
  @Field(() => String, { nullable: true })
49
- userId?: string;
49
+ userId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
50
50
 
51
51
  @Field(() => String)
52
- params: string; // JSON stringified
52
+ params: string; // JSON stringified — case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
53
53
 
54
54
  @Field(() => [String], { nullable: true })
55
- tags?: string[];
55
+ tags?: string[]; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
56
56
 
57
57
  @Field(() => String, { nullable: true })
58
- stackTrace?: string;
58
+ stackTrace?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
59
59
 
60
60
  @Field(() => MemorySnapshotGQL, { nullable: true })
61
- memoryBefore?: MemorySnapshotGQL;
61
+ memoryBefore?: MemorySnapshotGQL; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
62
62
 
63
63
  @Field(() => MemorySnapshotGQL, { nullable: true })
64
- memoryAfter?: MemorySnapshotGQL;
64
+ memoryAfter?: MemorySnapshotGQL; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
65
65
 
66
66
  @Field(() => String, { nullable: true })
67
- parentEventId?: string;
67
+ parentEventId?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
68
68
  }
69
69
 
70
70
  // ============================================================================
@@ -74,52 +74,52 @@ export class TelemetryEventGQL {
74
74
  @ObjectType()
75
75
  export class CallerLocationGQL {
76
76
  @Field(() => String)
77
- location: string;
77
+ location: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
78
78
 
79
79
  @Field(() => Int)
80
- count: number;
80
+ count: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
81
81
  }
82
82
 
83
83
  @ObjectType()
84
84
  export class TelemetryPatternGQL {
85
85
  @Field(() => String)
86
- fingerprint: string;
86
+ fingerprint: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
87
87
 
88
88
  @Field(() => String)
89
- category: string;
89
+ category: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
90
90
 
91
91
  @Field(() => String)
92
- operation: string;
92
+ operation: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
93
93
 
94
94
  @Field(() => String)
95
- sampleParams: string; // JSON stringified
95
+ sampleParams: string; // JSON stringified — case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
96
96
 
97
97
  @Field(() => Int)
98
- count: number;
98
+ count: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
99
99
 
100
100
  @Field(() => Float)
101
- totalElapsedMs: number;
101
+ totalElapsedMs: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
102
102
 
103
103
  @Field(() => Float)
104
- avgElapsedMs: number;
104
+ avgElapsedMs: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
105
105
 
106
106
  @Field(() => Float)
107
- minElapsedMs: number;
107
+ minElapsedMs: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
108
108
 
109
109
  @Field(() => Float)
110
- maxElapsedMs: number;
110
+ maxElapsedMs: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
111
111
 
112
112
  @Field(() => [CallerLocationGQL])
113
- callerLocations: CallerLocationGQL[];
113
+ callerLocations: CallerLocationGQL[]; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
114
114
 
115
115
  @Field(() => Float)
116
- firstSeen: number;
116
+ firstSeen: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
117
117
 
118
118
  @Field(() => Float)
119
- lastSeen: number;
119
+ lastSeen: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
120
120
 
121
121
  @Field(() => Float)
122
- windowStartTime: number;
122
+ windowStartTime: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
123
123
  }
124
124
 
125
125
  // ============================================================================
@@ -129,37 +129,37 @@ export class TelemetryPatternGQL {
129
129
  @ObjectType()
130
130
  export class TelemetryInsightGQL {
131
131
  @Field(() => String)
132
- id: string;
132
+ id: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
133
133
 
134
134
  @Field(() => String)
135
- severity: string;
135
+ severity: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
136
136
 
137
137
  @Field(() => String)
138
- analyzerName: string;
138
+ analyzerName: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
139
139
 
140
140
  @Field(() => String)
141
- category: string;
141
+ category: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
142
142
 
143
143
  @Field(() => String)
144
- title: string;
144
+ title: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
145
145
 
146
146
  @Field(() => String)
147
- message: string;
147
+ message: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
148
148
 
149
149
  @Field(() => String)
150
- suggestion: string;
150
+ suggestion: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
151
151
 
152
152
  @Field(() => [String])
153
- relatedEventIds: string[];
153
+ relatedEventIds: string[]; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
154
154
 
155
155
  @Field(() => String, { nullable: true })
156
- entityName?: string;
156
+ entityName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
157
157
 
158
158
  @Field(() => String, { nullable: true })
159
- metadata?: string; // JSON stringified
159
+ metadata?: string; // JSON stringified — case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
160
160
 
161
161
  @Field(() => Float)
162
- timestamp: number;
162
+ timestamp: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
163
163
  }
164
164
 
165
165
  // ============================================================================
@@ -169,31 +169,31 @@ export class TelemetryInsightGQL {
169
169
  @ObjectType()
170
170
  export class CategoryStatsGQL {
171
171
  @Field(() => String)
172
- category: string;
172
+ category: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
173
173
 
174
174
  @Field(() => Int)
175
- events: number;
175
+ events: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
176
176
 
177
177
  @Field(() => Float)
178
- avgMs: number;
178
+ avgMs: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
179
179
  }
180
180
 
181
181
  @ObjectType()
182
182
  export class TelemetryStatsGQL {
183
183
  @Field(() => Int)
184
- totalEvents: number;
184
+ totalEvents: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
185
185
 
186
186
  @Field(() => Int)
187
- totalPatterns: number;
187
+ totalPatterns: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
188
188
 
189
189
  @Field(() => Int)
190
- totalInsights: number;
190
+ totalInsights: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
191
191
 
192
192
  @Field(() => Int)
193
- activeEvents: number;
193
+ activeEvents: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
194
194
 
195
195
  @Field(() => [CategoryStatsGQL])
196
- byCategory: CategoryStatsGQL[];
196
+ byCategory: CategoryStatsGQL[]; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
197
197
  }
198
198
 
199
199
  // ============================================================================
@@ -203,64 +203,64 @@ export class TelemetryStatsGQL {
203
203
  @ObjectType()
204
204
  export class CategoryOverrideGQL {
205
205
  @Field(() => String)
206
- category: string;
206
+ category: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
207
207
 
208
208
  @Field(() => Boolean)
209
- enabled: boolean;
209
+ enabled: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
210
210
 
211
211
  @Field(() => String, { nullable: true })
212
- level?: string;
212
+ level?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
213
213
  }
214
214
 
215
215
  @ObjectType()
216
216
  export class AutoTrimSettingsGQL {
217
217
  @Field(() => Boolean)
218
- enabled: boolean;
218
+ enabled: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
219
219
 
220
220
  @Field(() => Int, { nullable: true })
221
- maxEvents?: number;
221
+ maxEvents?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
222
222
 
223
223
  @Field(() => Int, { nullable: true })
224
- maxAgeMs?: number;
224
+ maxAgeMs?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
225
225
  }
226
226
 
227
227
  @ObjectType()
228
228
  export class DuplicateDetectionSettingsGQL {
229
229
  @Field(() => Boolean)
230
- enabled: boolean;
230
+ enabled: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
231
231
 
232
232
  @Field(() => Int)
233
- windowMs: number;
233
+ windowMs: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
234
234
  }
235
235
 
236
236
  @ObjectType()
237
237
  export class AnalyzerSettingsGQL {
238
238
  @Field(() => Boolean)
239
- enabled: boolean;
239
+ enabled: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
240
240
 
241
241
  @Field(() => Int)
242
- dedupeWindowMs: number;
242
+ dedupeWindowMs: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
243
243
  }
244
244
 
245
245
  @ObjectType()
246
246
  export class TelemetrySettingsGQL {
247
247
  @Field(() => Boolean)
248
- enabled: boolean;
248
+ enabled: boolean; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
249
249
 
250
250
  @Field(() => String)
251
- level: string;
251
+ level: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
252
252
 
253
253
  @Field(() => [CategoryOverrideGQL])
254
- categoryOverrides: CategoryOverrideGQL[];
254
+ categoryOverrides: CategoryOverrideGQL[]; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
255
255
 
256
256
  @Field(() => AutoTrimSettingsGQL)
257
- autoTrim: AutoTrimSettingsGQL;
257
+ autoTrim: AutoTrimSettingsGQL; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
258
258
 
259
259
  @Field(() => DuplicateDetectionSettingsGQL)
260
- duplicateDetection: DuplicateDetectionSettingsGQL;
260
+ duplicateDetection: DuplicateDetectionSettingsGQL; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
261
261
 
262
262
  @Field(() => AnalyzerSettingsGQL)
263
- analyzers: AnalyzerSettingsGQL;
263
+ analyzers: AnalyzerSettingsGQL; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
264
264
  }
265
265
 
266
266
  // ============================================================================
@@ -270,46 +270,46 @@ export class TelemetrySettingsGQL {
270
270
  @InputType()
271
271
  export class TelemetryEventFilterInput {
272
272
  @Field(() => String, { nullable: true })
273
- category?: string;
273
+ category?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
274
274
 
275
275
  @Field(() => String, { nullable: true })
276
- operation?: string;
276
+ operation?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
277
277
 
278
278
  @Field(() => Float, { nullable: true })
279
- minElapsedMs?: number;
279
+ minElapsedMs?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
280
280
 
281
281
  @Field(() => Float, { nullable: true })
282
- since?: number;
282
+ since?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
283
283
 
284
284
  @Field(() => Int, { nullable: true })
285
- limit?: number;
285
+ limit?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
286
286
  }
287
287
 
288
288
  @InputType()
289
289
  export class TelemetryPatternFilterInput {
290
290
  @Field(() => String, { nullable: true })
291
- category?: string;
291
+ category?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
292
292
 
293
293
  @Field(() => Int, { nullable: true })
294
- minCount?: number;
294
+ minCount?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
295
295
 
296
296
  @Field(() => String, { nullable: true })
297
- sortBy?: string;
297
+ sortBy?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
298
298
  }
299
299
 
300
300
  @InputType()
301
301
  export class TelemetryInsightFilterInput {
302
302
  @Field(() => String, { nullable: true })
303
- severity?: string;
303
+ severity?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
304
304
 
305
305
  @Field(() => String, { nullable: true })
306
- category?: string;
306
+ category?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
307
307
 
308
308
  @Field(() => String, { nullable: true })
309
- entityName?: string;
309
+ entityName?: string; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
310
310
 
311
311
  @Field(() => Int, { nullable: true })
312
- limit?: number;
312
+ limit?: number; // case-violation-ok-legacy-back-compat: the property name is the GraphQL schema field name — renaming it breaks every client query
313
313
  }
314
314
 
315
315
  // ============================================================================
@@ -78,6 +78,19 @@ export class TransactionOutputType {
78
78
 
79
79
 
80
80
 
81
+ /**
82
+ * Renders one refused transaction-group item for the server log, naming the position, entity and
83
+ * operation so an operator can tie the refusal back to the row the client sent.
84
+ *
85
+ * `CompleteMessage` rather than `Message` because a refusal can report itself through any of
86
+ * `Message`, `Error` or the `Errors` array — a validation failure populates only the last of the
87
+ * three, so reading `Message` alone logs an empty reason for exactly the case that matters most.
88
+ */
89
+ function describeRefusedItem(index: number, item: TransactionItemInputType, entity: BaseEntity): string {
90
+ const reason = entity.LatestResult?.CompleteMessage?.trim();
91
+ return ` [${index}] ${item.OperationType} '${item.EntityName}': ${reason || 'refused without a reported reason'}`;
92
+ }
93
+
81
94
  export class TransactionResolver extends ResolverBase {
82
95
  /**
83
96
  * Maps a TransactionGroup item's operation type onto the SAME API-key scope path the singular
@@ -123,8 +136,14 @@ export class TransactionResolver extends ResolverBase {
123
136
  const tg = await md.CreateTransactionGroup();
124
137
  const entityObjects: BaseEntity[] = [];
125
138
  const objectValues: any[] = [];
139
+ // #4309: Save()/Delete() report a LOGICAL refusal by returning false — they do not throw —
140
+ // and a refused row is never enrolled, because TransactionGroup.AddTransaction() is reached
141
+ // only from inside ProviderToUse.Save()/Delete(). Discarding that boolean let a group whose
142
+ // rows were all refused arrive at Submit() empty, take its legitimate "nothing to do"
143
+ // branch, and report success for writes that never happened.
144
+ const refusals: string[] = [];
126
145
 
127
- for (const item of group.Items) {
146
+ for (const [index, item] of group.Items.entries()) {
128
147
  // instantiate a new entity object for the item
129
148
  const entity = await md.GetEntityObject(item.EntityName, context.userPayload.userRecord);
130
149
  entityObjects.push(entity); // save for later for mapping variables if needed
@@ -147,17 +166,51 @@ export class TransactionResolver extends ResolverBase {
147
166
  objectValues.push(itemValues);
148
167
  entity.SetMany(itemValues, true);
149
168
  entity.TransactionGroup = tg;
150
- await entity.Save();
169
+ if (!await entity.Save()) {
170
+ refusals.push(describeRefusedItem(index, item, entity));
171
+ }
151
172
  break;
152
173
  case "Delete":
153
174
  await entity.InnerLoad(pkey);
154
- objectValues.push(entity.GetDataObject());
175
+ // AWAITED: GetDataObject() is async, and pushing the un-awaited Promise put
176
+ // one into `objectValues` — which is `any[]`, so neither tsc nor a
177
+ // floating-promise lint could see it. PrepareReturnValue's Delete branch
178
+ // then stringified that Promise, and JSON.stringify(Promise) is "{}", so
179
+ // EVERY Delete in a transaction group reported an empty payload, successful
180
+ // ones included. Worse than losing the payload: GraphQLDataProvider's Delete
181
+ // transaction callback validates the commit with
182
+ // `pk.Value !== results[pk.FieldName]`, so "{}" made every key mismatch and
183
+ // reported 'Transaction failed to commit' for a delete that DID commit.
184
+ // Awaiting costs nothing here — DataObjectParams defaults
185
+ // includeRelatedEntityData to false, which guards the method's only awaited
186
+ // work, so with no params this is GetAll() plus a filter loop.
187
+ objectValues.push(await entity.GetDataObject());
155
188
  entity.TransactionGroup = tg;
156
- await entity.Delete();
189
+ if (!await entity.Delete()) {
190
+ refusals.push(describeRefusedItem(index, item, entity));
191
+ }
157
192
  break;
158
193
  }
159
194
  }
160
195
 
196
+ // A refused row never enrolled, so submitting now would commit only the SURVIVORS and
197
+ // still report unqualified success. Nothing has been written at this point — enrolment
198
+ // is deferral, and the provider does not touch the database until Submit() — so
199
+ // returning here leaves the database exactly as we found it.
200
+ //
201
+ // The predicate is the RETURN VALUE, not whether the group ended up empty: a row that
202
+ // is not dirty also fails to enrol and correctly returns true, and an empty group
203
+ // legitimately means "nothing to do" for a caller that enrolled nothing. That is also
204
+ // why this belongs here rather than in TransactionGroupBase.Submit() — this is the only
205
+ // layer that still knows which row was refused and why.
206
+ if (refusals.length > 0) {
207
+ LogError(
208
+ `TransactionResolver::ExecuteTransactionGroup --- ${refusals.length} of ${group.Items.length} ` +
209
+ `item(s) were refused, so the group was not submitted:\n${refusals.join('\n')}`
210
+ );
211
+ return await this.PrepareReturnValue(false, entityObjects, objectValues, group);
212
+ }
213
+
161
214
  // now, we need to set the variables
162
215
  if (group.Variables && group.Variables.length > 0) {
163
216
  for (const networkVar of group.Variables) {